From 084c3a3cee71a7eb80698bafeab76239ef46a550 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Thu, 8 Oct 2026 17:26:57 -0500 Subject: [PATCH] docs: lead decision 70, S4 rulings for Rocko (sage) human-cli.mjs is the decide transport. S4 owns the broker host and one notifier for the blocking-decision DM and the 08:00 Central digest. Darkwing is second reviewer for packages/discord and the host. Trail prints in broker order. Row 39 no longer waits on S3. SESSIONS gets Rocko's orientation line and a correction for Sage's estimated stamps. Co-Authored-By: Claude Opus 5.5 --- docs/SESSIONS.md | 3 ++ docs/plans/2026-09-26_lead-decisions.md | 69 +++++++++++++++++++++++++ docs/plans/2026-10-04_slice-1.md | 36 +++++++++---- 3 files changed, 99 insertions(+), 9 deletions(-) diff --git a/docs/SESSIONS.md b/docs/SESSIONS.md index bfa698cf..3579ed5f 100644 --- a/docs/SESSIONS.md +++ b/docs/SESSIONS.md @@ -522,3 +522,6 @@ are never rewritten or removed; corrections are new entries. 2026-10-05T23:18:04Z | Dewey (T3 Claude Code, thread 84fb346c) | row 40 S5 #1522, S2c repin | check 16 repinned to d27042fa (broker 51e03b33), verify 15/0 failed/2 N/V, 203 rows equal; probe confirms LD65 on d27042fa (citation stored, not consumed); fixture adds message.send action.allowed for 101/102; SLICE1-VIEWS.md section 10 says S2c restores them; no commit. 2026-10-08T21:53:57Z | Sage (T3 Claude Code, thread 1ef1e4f8) | Mos 1eba59e5, Jason R1/R5/R8/R10/R17 | merge plan docs/plans/2026-10-08_refactor-to-next-merge-plan.md (pinned b8db39cf/2101c9b4, merge-tree clean); lead decision 66 (next trunk, estate Vikunja Path A replaces LD61 Path B, R1 defaults); runbook Path A text; nothing merged 2026-10-08T22:50:00Z | Sage (T3 Claude Code, thread 1ef1e4f8) | Mos R26, lead decision 69 | Launched Rocko as T3 thread b84bb264 (claude-opus-5-5) replacing Codex/Astra thread 9b95add7; old thread idle and not messaged; row 39 unchanged; roster updated; Filbert launcher Astra pin recorded as follow-up. +2026-10-08T22:22:00Z | Rocko (T3 Claude Code, thread b84bb264, claude-opus-5-5) | Claude relaunch under R26, orientation | read SOUL, CONTEXT, AGENTS.md and slice-1 S4 brief; queue next rocko says nothing; row 39 not started, waiting for Sage's brief; BUILD-LOG Rocko entries untouched; no commit. +2026-10-08T22:26:47Z | Sage (T3 Claude Code, thread 1ef1e4f8) | correction to the 22:50:00Z Sage line | That line's timestamp was estimated, not read from the clock. The Rocko launch it records happened before 22:22:00Z, when Rocko's own line was written. Sage's message stamps to Mos and the seats between 22:05 and 22:53 that day were estimates and ran ahead of the clock by up to 30 minutes. +2026-10-08T22:26:47Z | Sage (T3 Claude Code, thread 1ef1e4f8) | Rocko S4 questions, lead decision 70 | human-cli.mjs as decide transport; S4 owns the broker host (mosaic-bus@) and one notifier for DM and digest; Darkwing second reviewer for packages/discord and the host; trail in broker order; row 39 after 37 only, briefed. diff --git a/docs/plans/2026-09-26_lead-decisions.md b/docs/plans/2026-09-26_lead-decisions.md index b0643d5f..3e9cbdbe 100644 --- a/docs/plans/2026-09-26_lead-decisions.md +++ b/docs/plans/2026-09-26_lead-decisions.md @@ -1281,3 +1281,72 @@ which stay with him. Each item names who decided it and what happened. launcher today. Its Astra pin conflicts with R26, and the roster says not to use it until a reviewed change moves it to Claude or Sol. +70. **S4 rulings: human transport, broker host, DM and digest, trail + (2026-10-08).** Source: Rocko's orientation questions, thread + b84bb264, before row 39 is briefed. + - `mosaic decide` runs `packages/bus/src/human-cli.mjs ` as a + child process, sends `{business, verb, args}` on stdin and reads + the JSON reply. The bus README already names that file as S4's + transport shim, and `verifyHuman` checks its exact path. No bus + change, so no second reviewer for this part. + - Nothing in slice 1 hosts the broker yet. `process.mjs` needs a + trusted host that forks it, boots it over IPC and keeps the + channel open, and every S4 command reads through a running broker. + S4 builds that host: `mosaic bus start|stop|status`, run as the + systemd user unit `mosaic-bus@`, installed by a script in + the `scripts/discord-service.sh` pattern. It reads `dataRoot` and + the business file from config, fails closed, and puts no + capability in arguments, stdout or the environment. It keeps + `bindLaunch` reachable in process so S6 can attach its launcher + without reworking the host. S3's poller runs inside the broker + runtime, so it starts with whatever host forks it. + - The DM and the digest come from one notifier, a child of the host + that gets a reader capability over IPC. Reader capabilities can't + write to the bus, and they stay that way. The notifier records + each send in its own append-only journal, + `/notify//sent.jsonl` (0600): decision id, + kind (`dm` or `digest`), time, outcome and the Discord message id. + No channel or user id goes in it. Slice 1's trail doesn't show + deliveries. If Jason wants that, it's a bus verb in a later row. + - The Discord side lives in `packages/discord/src/notify.mjs` and + uses `rest.mjs` with the connector's bot token file, so it is the + existing connector's bot and code (round 3, 4A) without sharing + its gateway process. The binding gains an optional fixed key + naming the DM recipient, which must be one of its `users`. The + README's "Not in this piece" list loses DMs for this path only. + - The notifier polls the human inbox every 30 seconds and DMs each + open blocking decision once, keyed by its journal. A failed send + retries with backoff. A duplicate DM is cheaper than a missed + blocking decision. + - The digest goes out at 08:00 America/Chicago (5A), computed in + the notifier with the IANA zone, so daylight saving moves with + it. If the host starts after 08:00 and the journal has no digest + for that day, it sends one at once. Its contents are the human + inbox: every open decision routed to Jason, blocking ones marked + as already sent by DM. Routine and within-role decisions are + logged and cross-role ones go to arbiters (REQ-DEC-2), so + REQ-DEC-4's "everything else" means the gated decisions that + don't block. An empty inbox sends one line saying so, which also + shows the job ran. + - Review: Filbert reviews the row. Darkwing reviews the + `packages/discord` change and the host as second reviewer, + because they handle the bot token and open a new outbound path to + Jason. rev-code-02 reviewed #1509, but it's a fleet seat and gets + no new work. + - Rocko builds and tests against a fake Discord REST and never + reads the token file or the private binding. The live run is + mine: the binding edit, unit install and first DM, at Jason's go, + with ids masked in the evidence. + - `mosaic trail` prints rows in the broker's order (`at`, then + table, then `seq`) and doesn't re-sort. The brief's list (request, + decisions, launches, task changes, review, close) describes what a + normal trail looks like, not a sort key. A misordered trail is a + finding against `packages/bus`, not something the CLI patches. + - A decision's trail doesn't pull in linked tasks or Vikunja + relations. It names its `task_ref`, and the CLI prints the + `mosaic trail ` command to follow it. + - Row 39 waited on row 38 (S3) being done. Only `mosaic tasks` + reads what S3 writes, and the broker's `tasks` view already + exists, so S4 can build and test now. Its `after` becomes row 37 + alone. Its live run still follows S3's, because the task view is + empty until S3's sync fills it. diff --git a/docs/plans/2026-10-04_slice-1.md b/docs/plans/2026-10-04_slice-1.md index 5b4e04cd..78af9bcd 100644 --- a/docs/plans/2026-10-04_slice-1.md +++ b/docs/plans/2026-10-04_slice-1.md @@ -382,27 +382,44 @@ and nothing sends a digest (REQ-DEC-4). ### Owner and reviewer - Owner: rocko. -- Reviewer: filbert. +- Reviewer: filbert. Darkwing is second reviewer for the + `packages/discord/` change and the broker host (lead decision 70). ### Files owned - `scripts/mosaic` (the dispatcher). - `packages/cli/` (new): `mosaic inbox`, `mosaic decide