---
description: Stream R (R2): discussions on the Interaction Standard (threads, mentions, the bell, decisions, attachments, mail) plus the page consolidation, issues that resolve and archive, a place for rian to talk to Claude, and a staging refresh that keeps Adam's comments
---

You are running **Stream R, phase R2** (discussions) of the Duty Free Professor build, autonomously
on Fable. Start with `pwd`; it must be `/srv/apps/dutyfreeprofessor`, or stop. R1 must be deployed on this host, and `L10` being `done` in `import/progress.json` does not
prove it (R1 never deploys): with `P=$(docker port dutyfreeprofessor-app 8000 | head -1)`,
`curl -s -o /dev/null -w '%{http_code}' http://$P/` prints `302` and `curl -s http://$P/api/products`
answers 401 with `NOT_SIGNED_IN` (members mode; a pre-R1 host answers 200 to both), and
`docker exec dutyfreeprofessor-app python -m app.cli accounts owner-check` succeeds (a pre-R1
image has no `accounts` command); otherwise stop and say so.

Read first: `.logs/planning/streams/OVERNIGHT-RULES.md` (binding), `.logs/planning/streams/AWAY-PLAN.md`
sections 2 and 3 (the standing rules while rian is away, and the assumptions you proceed under),
`.logs/planning/accounts-2026-09.md` §8 and §4 (the design), `.logs/planning/streams/R-accounts.md`
(its R2 section is your task list, Owns and Must not touch), `agents.md`, `brief.md`,
`main/docs/ACCOUNTS.md`, `main/docs/CLIENT-SURFACES.md`, the two newest handoff entries, the
running list, then the extraction source: `/srv/apps/caddie/.logs/planning/04-interaction-standard.md`,
`/srv/apps/caddie/main/app/services/interaction.py`, the models and routes it names, and
`/srv/apps/caddie/packs/caddie-ui/README.md` with `packs/stamp-caddie-ui.sh`. Read; never edit
caddie.

Work the tasks in the brief's order: **T7, T1, T2, T3, T4, T8, T9, T10, T5, T6**. T7 first,
because a staging refresh that loses Adam's comments is not recoverable and every later task
writes to the tables a refresh replaces. T1 begins with the one move commit (the discussion
classes out of `models/catalog.py` into `models/discussion.py`), before anything else, because
Stream M owns `models/catalog.py` from its M2 onward. T8 writes its proposal into the brief and
commits it before any route moves. One commit per landed task prefixed `R:`, `plan-set.py` for
status, the overnight rules throughout. **Streams M and G are in the same tree at the same
time:** their columns are under R2 Must not touch; a need in their files is an issue on the
running list (`items.py add --kind issue --owner M|G --by "Stream R2"`), never an edit. The mail
task's compose change is a security review written into your handoff and a request on the
running list for Stream W's W3, never a silent edit. Never deploy, never register a BW client,
never write a token or a link into a log, never touch production. Done when the ten tasks are
`done` or `blocked` with a reason, `check.sh` and `docs-check.sh --strict` are green, the handoff
names what rian runs after the deploy, and `/checkpoint` has run. Eight-hour cap.

```
/goal Stream R phase R2 is complete: every one of the task ids T7, T1, T2, T3, T4, T8, T9, T10, T5, T6 in import/progress.json has status done, or blocked with a note saying why; main/check.sh printed "checks passed" and docs-check --strict printed "0 fail" on the final tree; every landed change has its own "R:" commit; the registers were regenerated by items.py export; a handoff entry for this session is at the top of .logs/handoff.md and /checkpoint has run; any rehearsal database, local server and main/static symlink are gone. Or stop after 200 turns.
```
