oficina / meet Public

Clone
git clone https://amadan.net/oficina/meet

Plain git — no account needed to clone.

Download

Download this file

1# Meet slices 2 to 6: programme plan
2
3Written 2026-09-09 after slice 1 merged (cae60ed) and went live at
4`meet.bds.oncarlos.com` (fd626d6). This is the plan for the remaining
5five slices of spec revision 8 §12, run by subagents, alongside the
6Codex-orchestrated overnight programme on `oficina/suite` discussion 5.
7Each slice still gets its own implementation plan in the slice-1 shape
8(verbatim code per task); this document decides order, ownership,
9models, gates and the coordination rules the slice plans inherit.
10
11## 1. What is fixed by others, and what Meet must not touch
12
13| Item | Where decided | Meet's stance |
14|---|---|---|
15| 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. |
16| 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). |
17| No SFU; mesh cap of four stays | platform #112 | Slice 2 enforces the cap; spec §5.7 waits. |
18| 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. |
19| 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. |
20| Agents as principals | suite #4, unruled | Slice 5 builds Slides-shaped instance tokens and cites #4; adopt the home's shape when ruled. |
21| 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. |
22| 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. |
23| 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). |
24| 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. |
25| Trusted client address from the edge | spec §3.2 residue | Filed on carlos/platform with slice 1; no Meet change. |
26
27## 2. Order and dependencies
28
291. **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.
302. **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.
313. **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.
324. **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.
335. **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.
34
35Slices 2, 3 and 4 are strictly sequential. Slice 5 overlaps slice 2. Slice 6 closes.
36
37## 3. Per-slice mechanics
38
39Every slice runs the same loop, unchanged from slice 1:
40
411. **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`.
422. **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.
433. **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.
444. **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.
455. **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.
466. **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).
477. **Checkpoint** on suite #5: slice, tip, what is live, what is next.
48
49## 4. Subagents and models
50
51| Role | Model | Why |
52|---|---|---|
53| Controller (plan, dispatch, rulings, hub record) | this session, Fable 5.1 | Holds the spec and the cross-task context. |
54| Implementers, transcription tasks with complete code in the brief | Sonnet | Slice 1 showed one fix round per eight tasks at this tier. |
55| 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. |
56| 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. |
57| Whole-branch review | Opus (Fable when its quota allows) | The spec review pattern. |
58| 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. |
59| 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. |
60
61Quota: 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.
62
63## 5. Deployment notification
64
65Posted on the `oficina/meet` slice discussion and mirrored on suite #5, in this form, after `/api/version` on the host reports the tip:
66
67```
68Deployed: meet <tip> to <URL> (preview | production)
69What changed: <one paragraph>
70What to inspect: <three bullets: the pages or flows that changed>
71Rollback: carlos deploy --app meet --account oficina --version <previous>
72```
73
74A queued promotion is never announced as live.
75
76## 6. Slice 2 in detail, because it is next
77
78**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):
79
80- Hub (`internal/calls/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.
81- 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`.
82- 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.
83- 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).
84- Estimated tasks: nine to eleven, three of them Opus-tier (hub core, `room.js`, resume and generations).
85
86**Playwright** copied from Calendar: `make browser` runs `npm install --no-save playwright` then `go test -tags browser ./internal/callstest/`; 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).
87
88## 7. Open items carried
89
90- Codex code round 1 fix wave (branch `fix/codex-code-r1`) merges before slice 2 starts; its round 2 runs against main.
91- 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.
92- 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.
93