oficina / meet Public

plan: programme for slices 2 to 6

Order, ownership, models, gates and the coordination rules the slice
plans inherit, written against the overnight programme on suite 5.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P6JGj6G5cLrt2Frm8yywgK
Paul Campbell pushed by paul@keymail.dev 3c105b50bac55197dba2840429e4078054b0ea86 parent 5fdddcf
1 file changed, +92 −0
  • docs/superpowers/plans/2026-09-09-meet-slices-2-6-programme.md +92 −0

CI passed — run details

diff --git a/docs/superpowers/plans/2026-09-09-meet-slices-2-6-programme.md b/docs/superpowers/plans/2026-09-09-meet-slices-2-6-programme.md
new file mode 100644
index 0000000..7941e7f
--- /dev/null
+++ b/docs/superpowers/plans/2026-09-09-meet-slices-2-6-programme.md
@@ -0,0 +1,92 @@
+# Meet slices 2 to 6: programme plan
+
+Written 2026-09-09 after slice 1 merged (cae60ed) and went live at
+`meet.bds.oncarlos.com` (fd626d6). This is the plan for the remaining
+five slices of spec revision 8 §12, run by subagents, alongside the
+Codex-orchestrated overnight programme on `oficina/suite` discussion 5.
+Each slice still gets its own implementation plan in the slice-1 shape
+(verbatim code per task); this document decides order, ownership,
+models, gates and the coordination rules the slice plans inherit.
+
+## 1. What is fixed by others, and what Meet must not touch
+
+| Item | Where decided | Meet's stance |
+|---|---|---|
+| Queue item 12 is Meet's, owned by this session | suite #5 | Post a checkpoint on suite #5 at every slice merge and every deploy. |
+| Platform relay is live (`CARLOS_RELAY`, contract rev 6) | platform #112, spec §5.2 | Slice 3 consumes it. Enabling needs a current `carlos` binary (installed v0.17.0 lacks `relay`; platform main is built at `/tmp/oficina-carlos-current/carlos`, rebuild if absent). |
+| No SFU; mesh cap of four stays | platform #112 | Slice 2 enforces the cap; spec §5.7 waits. |
+| Estilo: theme on `fix/rastrillo-023-theme` (rastrillo 0.23 pin), save-status primitive; no sign-in, error or empty-state primitive exists | estilo #1, #2, suite #5 audit | Adopt the theme in slice 6 only once a merged, tagged release exists (Fable's standing condition). Never claim sign-in, error or empty-state primitives. Meet **is** the first builder of the chat panel (slice 4) and must meet Estilo's gates at first landing: attribute grammar, twelve locales, stated script-off behaviour, 24px targets, 320px reflow, contrast arithmetic. |
+| Home assertions, shared sign-in, team-aware entry | home #10, suite #5 | Slice 6 adopts nothing from the home; the lone shape ships. Do not widen sign-in callbacks. |
+| Agents as principals | suite #4, unruled | Slice 5 builds Slides-shaped instance tokens and cites #4; adopt the home's shape when ruled. |
+| Copy review | suite #5 (Paul's steering) | Waived for this round. Slice plans still catalogue strings in `docs/superpowers/copy/` so a later pass is one sitting. |
+| Open-source acknowledgements, reusable Estilo presentation | plan line 284 | Slice 6 adds Meet's acknowledgements page from the runtime module inventory; Meet does not build the presentation. |
+| Continuous staged deploys with a notification per verified deploy | plan line 285 | Every slice from 2 on deploys a canary and posts the notification (§5). |
+| Outsider addresses in `persons.email` and `sessions.subject` (Codex C1-1) | `oficina/meet` review record 2026-09-09 | Suite-wide shape; filed on suite #5 as a question for Paul, not fixed in any slice here. |
+| Trusted client address from the edge | spec §3.2 residue | Filed on carlos/platform with slice 1; no Meet change. |
+
+## 2. Order and dependencies
+
+1. **Slice 2, holding screen and room, direct connectivity** (spec §12 item 2). Largest slice: the hub with participations, cap, limits, resume with roster reconciliation, replay ring, pair generations, terminal `replaced`, the tick; the stream and `hello`; every message in §4.3 except `chat` and `share`; removal and takeover confirm pages; `room.js` with perfect negotiation and the §4.6 queue; `devices.js`; the `AGENTS.md` scriptless exception. Establishes the Playwright gate. Nothing else can start before it merges, except slice 5.
+2. **Slice 5, drive surface** (spec §8) can run **in parallel with slice 2** on its own branch: `agents` table, the five operations, per-request reach, the badge. It touches `store.go`, `app.go` routes and a new `api.go`; slice 2 touches the hub, stream and room. Merge order: whichever is reviewed first; the second rebases.
+3. **Slice 3, relay** (spec §5.2, §5.3): `CARLOS_RELAY` parsing and the startup refusal, minting with the vector test, `/ice`, renewal state machine under shortened timers. Depends on slice 2's `room.js` (renewal drives ICE restart). Verified against the live relay by enabling it on the canary.
+4. **Slice 4, chat and screen share** (spec §6, §5.4): `chat.js` built as an Estilo-grade primitive, `chat` and `share` with recipient rules, display-media transceivers, stop ends the track. Depends on slice 2.
+5. **Slice 6, deploy** (spec §7.3, §9, §10): domain already attached and live; this slice is PRODUCT.md, the README with the floor and relay paragraphs first, `AGENTS.md`'s final notes, the acknowledgements page, the `Consumed suite rulings` commit for suite Appendix A.6, the Estilo theme pin if a tagged release exists, and the production promotion with its notification.
+
+Slices 2, 3 and 4 are strictly sequential. Slice 5 overlaps slice 2. Slice 6 closes.
+
+## 3. Per-slice mechanics
+
+Every slice runs the same loop, unchanged from slice 1:
+
+1. **Worktree and branch** under `/home/paulca/amadan.net/oficina/meet/.claude/worktrees/slice-N`, branch `slice/N-<name>`, pushed at once, described with `amadan branch describe`, a branch discussion on `oficina/meet` opened before the plan, tasks mirrored with `amadan task add`.
+2. **Plan** with the writing-plans skill: verbatim code per task, a Global Constraints block copied from the spec, interfaces per task. The controller runs a pre-flight scan and ledgers rulings.
+3. **Execution** with subagent-driven development: one implementer per task, one task review, fix rounds capped at five, then a whole-branch review, one fix wave, one scoped re-review.
+4. **Independent Codex review** of the merged code (GPT-6 via `codex exec -s read-only`, detached with `setsid`, outside the sandbox), findings committed under `docs/superpowers/reviews/`, one fix wave, a second Codex round until accept.
+5. **Gates**: `make ci` on every task; `make browser` (Playwright) green on every slice from 2; remote CI green on the tip; spec §13 gates for the slice present by name in the slice's tests.
+6. **Canary**: `carlos canary --app meet --account oficina releases/meet-linux-arm64` from the slice branch (channel `canary/slice-N`, host `slice-N.meet.bds.oncarlos.com`), a browser walk on the canary URL recorded on the branch discussion, then fast-forward main and `carlos deploy` to the edge channel, then the notification (§5).
+7. **Checkpoint** on suite #5: slice, tip, what is live, what is next.
+
+## 4. Subagents and models
+
+| Role | Model | Why |
+|---|---|---|
+| Controller (plan, dispatch, rulings, hub record) | this session, Fable 5.1 | Holds the spec and the cross-task context. |
+| Implementers, transcription tasks with complete code in the brief | Sonnet | Slice 1 showed one fix round per eight tasks at this tier. |
+| Implementers, WebRTC client code (`room.js`, `devices.js`, `chat.js`) and the hub | Opus | Design judgment: perfect negotiation, resume reconciliation, generations. Slice 1 had no client code; these are the risky tasks. |
+| Task reviewers | Sonnet; Opus for the hub, stream, `/signal` and any auth change | Security-sensitive diffs get the stronger reviewer, as slice 1 did for tasks 6 and 7. |
+| Whole-branch review | Opus (Fable when its quota allows) | The spec review pattern. |
+| Independent spec and code review | Codex, GPT-6 (the box's default) | Six rounds found 52 spec defects and one deploy blocker in code; keep it. |
+| Mechanical or bulk work when Claude quota is tight (fixture generation, locale files for the chat primitive, test-table expansion, the acknowledgements inventory) | Codex with `-m gpt-5` | Cheaper and out-of-band; read-only review of its output by a Sonnet reviewer before commit. Never for the hub, auth, or the signalling client. |
+
+Quota: Fable's weekly review quota for Codex's jobs resets 2026-09-10 19:05 UTC; this session's own limit reset at 08:20 Dublin today. If a Claude tier is refused mid-slice, the controller records it in the ledger and either waits or substitutes the next tier down for implementers only, never for reviews.
+
+## 5. Deployment notification
+
+Posted on the `oficina/meet` slice discussion and mirrored on suite #5, in this form, after `/api/version` on the host reports the tip:
+
+```
+Deployed: meet <tip> to <URL> (preview | production)
+What changed: <one paragraph>
+What to inspect: <three bullets: the pages or flows that changed>
+Rollback: carlos deploy --app meet --account oficina --version <previous>
+```
+
+A queued promotion is never announced as live.
+
+## 6. Slice 2 in detail, because it is next
+
+**Scope** (spec §2.4, §2.5, §3.3, §3.4, §3.5, §4.1 to §4.6, §5.1, §9, §12 item 2, §13 slice-2 lines):
+
+- Hub (`internal/meet/hub/`): rooms, participations bound to session and peer, kind re-derived on tick and on request, the cap at every admission, limits (§4.4), replay ring with `seq` and `last`, pair generations and `reset`/`pair`, resume branched on admission, `boot` id, 404/409/410 answers, the fifteen-second tick, `lost` reasons.
+- Stream and signal (`stream.go`, `signal.go`): SSE with heartbeat and TTL, `hello {peer, boot}`, `POST /m/{sqid}/signal` with the §2.5 contract per type, `roster` with the waiting queue for members, `knock`, `knock-gone`, `full`, `ended`.
+- Pages: the holding screen's scripted half (`devices.js`), the room (`room.js`: perfect negotiation, outbound queue, generations, reconciliation, terminal handling), removal and takeover confirm pages and POSTs, `AGENTS.md`'s exception.
+- Tests: the §13 slice-2 Go gates (peer binding, cross-room refusal, sixteen-participation and unjoined-timeout limits, waiting-guest isolation, roster contents, guest-first arrival, promotion under the cap, cap at join and admit with concurrency, resume with roster and replay, `gap`, terminal `replaced` with the notice undelivered, same-boot and different-boot 404, stale `gen` 409, `reset` convergence, admit after expiry refused, member dropped on tick, captured-log test for join, admit, offer, candidate, refusal, error) and the Playwright gates (devices enumerate and preview; two isolated contexts complete a call with fake media and a non-zero frame count; guest knocks and is admitted having seen no `peer`; stream TTL shortened to seconds keeps the call up; member removed mid-call dropped on tick; resume after a peer leaves closes the departed connection; restart closes connections before rejoin; second tab refused with 409, takeover confirmed, first shows the link; cross-site navigation ends nothing; scriptless pages render their paragraph).
+- Estimated tasks: nine to eleven, three of them Opus-tier (hub core, `room.js`, resume and generations).
+
+**Playwright** copied from Calendar: `make browser` runs `npm install --no-save playwright` then `go test -tags browser ./internal/meettest/`; a private `package.json` pins `playwright 1.62.1`; the Go test listens on `127.0.0.1:0`, signs two contexts in over HTTP, and runs `node test/browser/call.mjs <origin> <cookie…>` with Chromium launched with `--use-fake-device-for-media-stream --use-fake-ui-for-media-stream`. Not in `make ci`; run by the controller before every task review that touches a page, and by remote CI only if the runner has node (check the runner first; if not, it is a controller gate and recorded as such on the branch).
+
+## 7. Open items carried
+
+- Codex code round 1 fix wave (branch `fix/codex-code-r1`) merges before slice 2 starts; its round 2 runs against main.
+- Suite question for Paul, to file with the fix wave: whether `persons.email` and the session subject should be sealed suite-wide (Codex C1-1); Meet follows the ruling when it comes.
+- The stale `carlos` CLI: use `/tmp/oficina-carlos-current/carlos` for `apps build-probe` and `relay enable`, or rebuild it from platform main into `$TMPDIR`; set the build probe on `meet` before slice 2's canary.