---
description: "Stream AW7: the quality pass (the full run and docs-check strict, the unauthenticated sweep as a script, nine pages at 1440 and 390, accessibility of the new components, the heaviest pages timed and the bundle measured, one dated report, I1 marked on /plan); runs last, after deploy D4, only if time remains; fixes only what is small"
---

You are running **Stream AW7** of the Duty Free Professor away run of 19 to 20 September 2026, as
an autonomous session. The brief is the work list; this command is how you run it. You fix only
what is small and safe (one rule, one attribute, one test, one paragraph, in one file); everything
larger becomes a running-list item carrying the evidence. You never deploy.

**Start by checking your ground.** `pwd` must be
`/srv/apps/dutyfreeprofessor/.claude/worktrees/collectors-live-page-plan-8951e2` on branch
`claude/collectors-live-page-plan-8951e2`; `git log --oneline -1` must show `05941b4` or later, and
`git log --oneline -40` should show the other streams' commits (`AW1:` to `AW6:`) already landed.
`.venv-dev` and `main/web/node_modules` are symlinks in this worktree; `main/check.sh` runs from
`main/`. `curl -s https://dutyfreeprofessor.demoing.info/api/health` prints the version D4
deployed; write it at the top of your report. If any of this is wrong, stop and say so.

Read first, in this order: your brief `.logs/planning/streams/AW7-quality-pass.md`, the away plan
`.logs/planning/streams/AWAY-2026-09-19.md` (sections 1, 2 and 7 bind you),
`.logs/planning/streams/OVERNIGHT-RULES.md`, `agents.md`, `brief.md`, the top three entries of
`.logs/handoff.md`, then the docs the tasks need: `main/app/services/access.py` (the module
docstring and the class sets), `main/tests/test_route_inventory.py`, `main/docs/SEO.md` ("What
renders server-side, and how to verify it"), `main/docs/QUALITY.md`, `main/docs/VOCABULARY.md`,
`main/tests/test_tokens_contrast.py`, and `/srv/projects/standards/frontend.md`. Read the AW4 and
AW5 briefs (`AW4-live-page.md`, `AW5-launch-surface.md`) for what the live page, the badge and the
article centre are, then the components themselves.

Register the tasks on `/plan` first, one line each:
`python3 main/scripts/plan-set.py AW7.1 todo "Stream AW7" --add --stream AW7 --stream-title "The quality pass" --title "<the task's heading>"`
for AW7.1 to AW7.5, then mark each `doing` when you start it and `done` with `--note "<what proves
it>"` when it is verified. Work the tasks in order, one at a time, each finished to the
verified-and-committed standard: `main/check.sh` prints "checks passed" before every commit; one
task, one commit, subject prefixed `AW7:`, body saying what it found or what it prevents. A bug you
fix becomes a test in `main/tests/` written as the real page or route that failed, with what it cost
in the docstring. The report grows as you go at `.logs/verification/quality-pass-<date>.md`; every
finding has its evidence and either the commit that fixed it or the running-list id that carries it.

**Hard boundaries.** Never deploy; never run a collection, a crawl or a robots.txt read; the only
network you use is HTTPS reads of staging and your own local server. Never write to staging's or
production's database (`pg_dump` is the one read you take). Never edit `access.py`,
`open_routes.json`, `seo.py`, the collectors, the ledger, a migration, a backfill, the vendored
kits, `.env`, `.app.env`, `.bw-auth.env`, the standards, or the main checkout's dirty paths. No
credential is ever printed: the throwaway owner on your local copy gets its password from a shell
variable and its cookie from a login POST, and the copy is dropped when you finish. A GET never
writes. An internal route answering 200 without a session is a `critical` decide item and a
Telegram line at once, never a fix.

When you are blocked on something only rian can decide, do not stop: add it to the running list
(`python3 main/scripts/items.py add --kind decide --by "Stream AW7" --blocks I1 --weight
blocking|costly|info --title ... --detail ... --option ... --assumption ...`) with the assumption you
are proceeding under and what you would redo, then carry on with what does not depend on it. A
finding too large to fix here is `items.py add --kind issue --owner <the stream that built it>
--by "Stream AW7"` with the page, width, selector or number in `--detail`.

Tell rian as you go with `srv-gw notify --from "AW7" "<one line>"`: on start
(`"AW7 starting: 5 tasks, the quality pass on <version>"`), on each task done with the count
(`"AW7.2 done (2/5): nine pages at two widths, N breaks, M fixed"`), on blocked or needing him, and
at hand-back (`"AW7 done: 5/5, report at .logs/verification/..., I1 marked"`). Never a secret, never
a URL with a token. If the command fails, note it in the handoff and carry on.

If a task turns out to need more than about three hours, split it, record the split on `/plan` with
a note, and keep the part that lands. If time is short, AW7.1 and AW7.5 are the minimum: the sweep
and the report with I1 marked. When the brief is done, prepend the handoff entry (25 lines at most:
what landed, what was verified, the open issues by id, what rian must look at himself), run the
project `/checkpoint`, and stop. The orchestrator deploys if you fixed anything; you do not.

```
/goal Stream AW7 is complete: every task AW7.1 to AW7.5 is done on /plan, 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 "AW7:"; main/scripts/route-sweep.py exists, has a test, and its run against staging is in the report; the report at .logs/verification/quality-pass-<date>.md holds the sweep, layout, accessibility and performance tables with every finding fixed or filed by id; I1 is marked done on /plan with the report's path; the handoff entry is written; nothing was deployed, no database but the local copy was written, no collection and no robots.txt read was made, no credential was printed. Or stop after 120 turns.
```
