Process · 19 Sep 2026 · 15:00
Manager mode, done properly
You said the whole thing, including the UI, and that it should hold up day to day even if it takes until tomorrow or the day after. This is the order of work, what each milestone must prove, and how it gets back into the real app.
Rulings taken from what you said at 14:55
- The Swift app is what you see, speak to, and are spoken to from. The bot is a stdio child the app spawns and paints from. Its ears and mouth are Gradium in the cloud; the mic and speakers are the Mac's.
- Rungs and custom answers are spoken in the agent's voice. The manager speaks only confirmations and its own bookkeeping. Two speak-only deep-link verbs make that possible:
rung?session=&n=andsay?session=&text=. Only rungs that exist for that turn are offered. - Jev probabilities show in the playground events panel today for debugging, and in the app's state label from then on.
- Turn start: whatever works. Two-word start is the current setting because it stopped the room cancelling answers. It stays until a measurement in the venue says otherwise.
- No confirmation earcon. Confirmation is a spoken question. Earcons stay for sent and for "heard you, nothing to do".
Three milestones, each with a proof
M1 · tonight, on stage
Stage state and one-call Jev intent in the bot. tbase --json reads. rung and say verbs. Manager mode in the app: menu toggle, orb, state label, earcons on request, child process on stdio. Playground shows Jev numbers.
Proof: the four beats, twice in a row in the room, zero false speaks across a 60 s think-aloud, and every "Tranquility, …" answered.
M2 · tomorrow, hardened
Tests: Codable shapes for the JSON flags, DeepLink cases for the two verbs, ManagerEvent parsing, stage transitions. A drill that pipes synthetic events into Manager mode. Rulings written into docs/rulings. README section. Crash and relaunch of the child handled (the exit-reason pattern).
Proof: scripts/test.sh green above baseline, a full day of your own use with the log kept.
M3 · the days after
Decide the runtime: keep the Python child and package uv with the app, or port the brain to Core (Gradium STT as a LiveTranscriptionProvider, Jev via URLSession, a tool loop) behind the same event contract. Teach designed on its own. Recent-context summaries drawn from the hub.
Proof: the ruling exists and one of the two paths is merged upstream.
The order of work today
| # | Unit | Where | Done when |
|---|---|---|---|
| 1 | Jev event line to stdout and to the playground (RTVI server message) with p, intent, ms | bot | numbers visible in the events panel |
| 2 | tbase targets --json, status --json, brief <id> --json (rungs included) | Swift, Core Codables | bot's list_agents returns ids and goals |
| 3 | Stage state + one Jev call (addressed + intent) + target confirmation by goal | bot | "invite the next agent" makes the app speak; "tell it to run the tests" sends to the stage agent |
| 4 | rung and say deep-link verbs, speak-only, DeepLinkTests | Swift | "what's the recommended next step" is answered in the agent's voice |
| 5 | Manager mode: menu item, ManagerProcess on stdio (ACPProcessTransport pattern), orb + state label, earcons on request | Swift, app layer | toggle on, speak, orb reacts, toggle off kills the child |
| 6 | Rehearse in the room with a headset; tune threshold and min-words from the log; record a backup | venue | proof of M1 |
| 7 | Push branch, README, design record updated, submit | fork | 6:00 |
How it gets into the real app
- Branch
manager-modeon the public fork, one commit per unit above, each with its measurement in the message. The fork stays public; the judges read the commits. - PR to the fork's main tonight for the submission. PR upstream to
robertnowell/tranquility-baseafter M2, once tests are green above baseline, through the normal auto-merge and Sparkle release. Nothing in Prod moves today. - Work in a worktree of the fork, never the main checkout. Same rule as always; the app you are running today keeps running.
- Every ruling above becomes a file in
docs/rulingsin M2, so it does not expire in a page.
What I will not do without asking
- Touch Recorder, HotkeyMonitor, SpeechChain, or the spool. The manager gets its own files.
- Change the app's summariser or prompts.
- Merge anything upstream.
Starting with unit 1 and 2 now. Architecture: manager mode. Design record: hands-free manager design.