# dutyfreeprofessor — brief

> Project genesis: what this is, who it is for, why it exists. Tier 1, always loaded; kept
> under forty lines. The NOW block is the only part that changes, and `/checkpoint` rewrites it.

## NOW
<!-- rewritten by /checkpoint -->
- **Phase:** Stream L (the quantity model, the decided layer, the listed columns, the giant Listings table, the merge desk) is green and ready on master as of 2026-09-15 with migration `b3c4d5e6f7a8`, not yet deployed; staging is at 0.48.0 and production at 0.35.0, waiting on the readiness lane (`.logs/planning/build-plan-2026-09.md` §7, `streams/AWAY-PLAN.md`).
- **Accepted scope:** the launch quote Adam approved on 2026-09-03; the lines are on `/quote`.
- **Deadline:** soft launch 2026-09-18, one week before Cannes (2026-09-27).
- **Live version:** 0.49.0
- **Public airports:** the nineteen (ATH BCN BOG CDG DUB DXB EZE HKG ICN JFK LHR MAD MEX PTY SAL SIN YUL YYZ ZRH; `python -m app.cli locations`), switched on 2026-09-11 behind the sign-in; KEF, SYD and the two catalogues stay hidden.
- **Crawl window on production (11 Sep):** while `.logs/runs/window-2026-09-11-night-refresh.md` is open, NO production deploy and NO schema migration; staging work is free. `deploy/production.sh` refuses while a collection runs.
- **Next milestone:** rian deploys the Stream L chain to staging and runs the after-deploy block in `main/docs/RUNBOOK.md` (Migrations, under `b3c4d5e6f7a8`), opens `/collectors` Listings with every column on and the Merge Desk, then the Extime recrawl window on bwlive (`.logs/runs/window-2026-09-15-extime-fragments.md`); then `/stream-r3` and the readiness lane (W) per `.logs/planning/streams/AWAY-PLAN.md`; on go-live day, E7's second pass.

## What
**Duty Free Professor (DFP)**: a duty-free price comparison site for travellers. Collectors
read airport retailers' public listing pages and store timestamped price observations;
the site compares them across the shopper's chosen airports and badges products with
competition medals from Adam's award network. Legal posture and collector rules:
`main/docs/COLLECTORS.md`. Decisions: build plan §9. Open questions and issues: the running list (`main/scripts/items.py list`; `/plan` → Issues and to-dos).

## Who
- Owner and builder: rian. Client: Adam Levy, who also owns the competition multisite
  (`/srv/apps/apnetwork/`) and the Professor publishing network on WordPress.
- Reviewer for site structure and SEO: Mark (comments on `/structure`).

## Why
The AI-first custom-app work rian wants to be doing, with a differentiator nobody else
has: a decade of Adam's competition data (winners, medals) to join onto live prices. The
long game is folding the publishing and competition networks into this app ecosystem.

## Domain and stack
- Dev: <https://dutyfreeprofessor.demoing.info> (shared-password gate). Production host: build plan §10.
- React SPA + FastAPI + Postgres (`/srv/projects/standards/react.md`). One Python process
  serves the API and the built SPA; collectors are plain Python behind a swappable fetch
  port. Dev loop and deploy: `main/docs/RUNBOOK.md`.

## Not doing
- WordPress theme redesigns or new WordPress features for Adam's networks (support only).
- Anything that logs in to a retailer, accepts its terms, or rehosts its imagery or copy.
