---
description: Stream G2: the airport page finished (the guide as data on the place, the template reworked in three browser passes with real placeholders, Heathrow approved, then the eighteen populated from Adam's airport profiles)
---

You are running **Stream G2** of the Duty Free Professor build, with rian reachable in the
session. Start by running `pwd`; it must be `/srv/apps/dutyfreeprofessor`, or stop.

Read first, in this order: your brief `.logs/planning/streams/G2-airport-pages.md` in full
(its section 1 dates every source and says which wins; its Mission block is rian's ask,
verbatim), `.logs/planning/streams/OVERNIGHT-RULES.md` (binding, except that rian is present),
`agents.md`, `brief.md`, `main/docs/ARCHITECTURE.md`, `main/docs/DATA-MODEL.md` (places),
`/srv/projects/standards/README.md` then `react.md` and `frontend.md`, the top three entries of
`.logs/handoff.md`, `python3 main/scripts/items.py list`, and then the code the brief names in
section 3: `main/web/src/lib/airportTemplate.ts`, `pages/AirportPage.tsx`,
`components/AirportGuide.tsx`, `components/MissingPart.tsx`, `app/services/airport_guides.py`,
`app/services/places.py`, and the airport functions of `app/services/seo.py`. Then the source
material in `notes/initial airport page context and docs/`: the nineteen 16 Sep profiles
(`Word_Docs/*.docx`, and at least one of the `PDFs/` so you see the shape they intend), Adam's
13 Sep markdown beside them, and `notes/Duty_Free_Professor_Airport_Guide_Heathrow (1).md`.

Then work the brief's tasks in order, G8 to G16, one at a time, each verified and committed and
recorded on `/plan` with `main/scripts/plan-set.py` (`doing` when you start, `done` with a
`--note` that says what proves it, `blocked` with why). G8 opens with one question to rian (has
Adam edited either document since 16 Sep); ask it and continue with the schema while he answers.

**Adam wrote the profiles, and they are input rather than convention** (brief section 2.0). Carry
every fact he wrote, store it faithfully in his own seven section kinds, and credit it. Then decide
for yourself what the page shows and where, because rian told Adam he would incorporate the concepts
as best he can and still make the best page he can. Merging or dropping one of Adam's kinds on the
page is expected; say so with the reason, and never edit the stored document to suit the layout.

**The browser is part of the work.** G10, G11 and G12 each look at the page in Chrome (the
`mcp__claude-in-chrome__*` tools on staging after rian deploys, at desktop and at 390px; take
screenshots at `scale: 0.6` and fall back to `get_page_text` if a capture times out) and save a
screenshot set under `.logs/verification/airport-page-<date>/` before fixing anything. Between
checkpoints, build and test locally (`main/check.sh`, the local API on `dfp-devdb`); a checkpoint
is you saying "green and ready to deploy to staging" with the after-deploy commands, and rian
running the deploy. Before G10's first change and again in G12's third round, re-read the
Mission block and list which of its asks the page still fails.

Delegate mechanical work to a cheaper model (the markdown split in G13, CSS passes, fixture
trimming) and verify the diff yourself; never delegate the voice pass over Adam's text, the
shops-to-retailer mapping, the placeholder designs, or anything a shopper reads. No migration,
no network, never deploy, never touch production, never move an address.

The one outcome that matters: Heathrow on staging is the airport template rian and Adam can
approve, with the useful facts and numbers first, the long content one click away, and
placeholders that look like the parts they stand for; the guide is data on the place with one
import command; and the other eighteen airports are converted from Adam's profiles, imported on a
staging copy, and green and ready for the deploy that publishes them to staging.

## Goal, and exactly when you are done

**You are done when ALL of the following are true**, and not before:
1. Every one of these task ids in `import/progress.json` is `done`, or is `blocked` with a
   note saying why: **G8, G9, G10, G11, G12, G13, G14, G15, G16**. (Check with
   `python3 -c "import json;d=json.load(open('import/progress.json'));print({t['id']:t['status'] for s in d['streams'] for t in s['tasks'] if t['id'] in ['G8','G9','G10','G11','G12','G13','G14','G15','G16']})"`.)
2. `../.venv-dev/bin/pytest tests -q` passes and `main/check.sh` prints "checks passed" on the
   current tree.
3. Every finished task has its own commit prefixed `G2:` (`git log --oneline | grep "^[0-9a-f]* G2:"`).
4. A handoff entry for this session exists at the top of `.logs/handoff.md` (≤25 lines: what
   landed and how it was verified, the page heights before and after with the view off, the
   after-deploy commands in order, which of Adam's section kinds the page kept, merged or dropped
   and why, which airports need an accuracy pass, what is blocked and why, what rian must do), and
   `/checkpoint` has been run.
5. The template approval is on the running list as a `decide` blocking G14, with the assumption
   you proceeded under; the accuracy pass Adam's own caveat asks for is a `do`; anything else only
   rian can decide is a `decide` with `--blocks` and `--weight`.
6. Any rehearsal database, local server and `main/static` symlink are gone.

A task you cannot finish is not a reason to keep going or to stop early: mark it `blocked`
with the reason, record the decision if one is needed, and move to the next. If all tasks
are done or blocked, finish steps 2 to 6 and stop. If eight hours have passed, mark every
unfinished task `blocked` with the note "eight-hour cap; resume with /stream-g2", write the
handoff, run `/checkpoint`, and stop.

## The goal line (rian pastes this after the first turn ends)
Start the session with `/stream-g2`. When that first turn ends, paste this one line:

```
/goal Stream G2 of the Duty Free Professor build is complete: in import/progress.json every one of the task ids G8, G9, G10, G11, G12, G13, G14, G15, G16 has status done, or blocked with a note saying why; main/check.sh has printed "checks passed" on the final tree; every finished task has its own commit prefixed "G2:"; a handoff entry for this session is at the top of .logs/handoff.md naming the page heights, the after-deploy commands, which of Adam's section kinds the page kept or merged, and the airports needing an accuracy pass, and /checkpoint has been run; the template approval decide and the accuracy-pass do are on the running list; no migration was written, no network collection ran and nothing was deployed by the session. Or stop after 150 turns.
```
