# dfp-bot — brief

<!-- The genesis document: what this is, why it exists, who it's for, and what
     "done" looks like. Write-once-read-always. Keep it thin — it is always
     loaded. Detailed how-it-works goes in .logs/planning/ or docs. -->

**What:** the identity page of `DutyFreeProfessorBot`, the reader that collects duty-free prices for
the Duty Free Professor app. One static page at `https://bot.dutyfreeprofessor.com`: who operates it,
the exact user-agent string, how it behaves, how to limit or block it, and the contact address.
**Why:** the address rides in every request the reader sends and lands in every retailer's log, so
it must resolve to a real page and never move. It is its own project, not part of the app, so it
stays up when the app is redeployed, moved or down.
**Who:** retailers' webmasters and security teams; anyone who looks the reader up.
**Status:** created 2026-09-05 on mosiah; production of the app moves to a droplet, this page can stay.

## Where everything is
| Role | Lives in |
|---|---|
| Build plan, milestones, gates | `.logs/planning/` |
| Session handoff (what next) | `.logs/handoff.md` |
| Project constitution | `agents.md` |
| Human reference material | `notes/` |

## Stack
Static HTML + inline CSS, no scripts, served by the gateway's nginx template from `public/`; Caddy in
front. Chosen so nothing here can break or need a build. The page is PUBLIC by decision
(`srv-gw id-gate --site bot.dutyfreeprofessor.com --mode public`); never gate it.

## Not doing
No forms, no analytics, no scripts, no links into the app's internal pages. Not an alias of the app.

## Known gaps
`bot@dutyfreeprofessor.com` must exist as a mailbox or a forward (Cloudflare Email Routing on the zone)
for the contact line to be true; the DNS record (`bot` CNAME `mosiah.riverway.ca`) is added by hand
because the zone is not in the gateway's Cloudflare account.
