Skip to content
← Notes
September 19, 2026

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= and say?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

#UnitWhereDone when
1Jev event line to stdout and to the playground (RTVI server message) with p, intent, msbotnumbers visible in the events panel
2tbase targets --json, status --json, brief <id> --json (rungs included)Swift, Core Codablesbot's list_agents returns ids and goals
3Stage state + one Jev call (addressed + intent) + target confirmation by goalbot"invite the next agent" makes the app speak; "tell it to run the tests" sends to the stage agent
4rung and say deep-link verbs, speak-only, DeepLinkTestsSwift"what's the recommended next step" is answered in the agent's voice
5Manager mode: menu item, ManagerProcess on stdio (ACPProcessTransport pattern), orb + state label, earcons on requestSwift, app layertoggle on, speak, orb reacts, toggle off kills the child
6Rehearse in the room with a headset; tune threshold and min-words from the log; record a backupvenueproof of M1
7Push branch, README, design record updated, submitfork6:00

How it gets into the real app

  • Branch manager-mode on 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-base after 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/rulings in 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.