# 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:** the catalogue refactor (`.logs/planning/catalogue-refactor-plan-2026-09-16.md`; streams K0 to K7 under `.logs/planning/streams/`) runs on `claude/table-layout-db-structure-1d5bc2` in its worktree. K0 to K5 and K7 are done: the branch sits on master `10920b2`, every concept has one word (`c1d2e3f4a5b6`), the decisions ledger, proposals store, attribute registry and places are built (`d2e3f4a5b6c7`, not deployed), and the review loads a proposals file and approves it at `/review` (CHANEL rehearsal replayed onto a second copy, 0 parked). `/products/` shows product lines (`LINE_PAGES=false` restores the variant pages). Staging runs 0.49.0; production is at 0.35.0, waiting on the launch path (K7).
- **Accepted scope:** the launch quote Adam approved on 2026-09-03; the lines are on `/quote`.
- **Deadline:** soft launch Monday 2026-09-21 (moved from 18 Sep, Adam agreed), before Cannes (2026-09-27).
- **Live version:** 0.50.1
- **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 shops`), 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:** merge `claude/review-golive` (Stream K12, green and ready: `.logs/handoff.md` top entry), migrate staging to `k12a1b2c3d4e`, run `backfill stuck_runs` and `backfill prune_lines`, settle the Dubai item on the running list, then the sweep (`app.cli sweep plan`), then `/review-pass` per `main/docs/REVIEW-PASS.md` until `app.cli pass status` prints done; that catalogue is the launch catalogue. The production push (`deploy/production.sh --replace-db`, rehearsed 17 Sep) follows it. Rian: answer the `decide` items on the running list.

## 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.
