Files
stack/agents/sage/work/window-plan/first-chief-session.md
jason.woltjeandClaude Opus 5.5 9056fe5ad6 agents: window plan check 2 reads the bundle manifest file
The launch line's manifest field is a path, so l.manifest.typed threw a
TypeError in the 2026-10-15 window. Mos caught it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-15 10:49:36 -05:00

6.7 KiB

Combined window for rows 119, 122 (and 120 if approved first)

Sage, 2026-10-15. Draft for Mos to take to Jason with the row 122 approval. NEW below is the full commit id of the pushed tree that carries the landed rows. OLD is the copy live today: c2525dd33579a8fb3659e54379d09bde392d6f61.

Paths used throughout:

  • Business file: ~/.config/mosaic-dev/businesses/mosaic-stack.json
  • Backup: ~/.config/mosaic-dev/businesses/mosaic-stack.json.pre-119-122. The loader reads only businesses/<id>.json, so the backup is never loaded.
  • Launch log: <dataRoot>/launches/mosaic-stack.jsonl

The re-pin follows docs/TOOLS.md "later update", steps 2 to 6, with NEW.

Two rules hold for the whole window (Filbert, row 122 round 2, comment 28542):

  • Jason keeps the step 3 backup and restores it if the conversion refuses or the window stops before the re-pin.
  • No bus or Console restart and no launch between Jason's step 4 edit and the re-pin's step 8 start. The old host can't read the new schema, and the new role files refuse launch.by pm.

Steps in order

# Who Step
0 Mos Before the window: scripts/stack-copy.sh copy NEW from the canonical checkout and note the full id. Save the current bus and Console unit files and status output, as TOOLS.md step 1 says.
1 Jason, then Mos PM-idle check. Jason, in his own shell (the human guard refuses it from an agent run): mosaic agents --business mosaic-stack. The pm must not be working. waiting is acceptable, because open decisions are stored and survive the restart: Jason notes their ids here for step 9. If the pm is working, wait or reschedule. Mos: mosaic launches list shows the pm run still running. Nobody talks to the PM until step 9 passes.
2 Mos Stop the Console, then the bus: systemctl --user stop mosaic-webui.service then systemctl --user stop [email protected].
3 Jason Backup: cp -p ~/.config/mosaic-dev/businesses/mosaic-stack.json ~/.config/mosaic-dev/businesses/mosaic-stack.json.pre-119-122. -p keeps mode 600.
4 Jason Apply the row 119 entry by hand, per agents/rocko/work/queue-122/r2/MIGRATION.md step 1: instances chief (chief-of-staff) and assistant (holder mos), and launch.by "chief". Keep the old launch.max until step 5. Names are Jason's call.
5 Jason Run the print-only conversion from the NEW copy, per MIGRATION.md step 2: cd ~/.local/share/mosaic-stack/copies/NEW, then the scripts/mosaic limits migrate --file ... --models /mnt/storage/src/mosaic-stack/agents/rocko/work/queue-122/r2/migration-map.json --roles-dir roles > CONVERTED command there, with CONVERTED a new path. Review it and install it by hand (MIGRATION.md step 3). A refusal leaves both inputs unchanged: stop and go to rollback.
6 Mos Install the bus unit on NEW: /mnt/storage/src/mosaic-stack/scripts/bus-service.sh install --copy NEW --pm --claude /home/jwoltje/.local/bin/claude.
7 Mos Install the Console on NEW with its current flags, run from the canonical checkout: /mnt/storage/src/mosaic-stack/scripts/webui-service.sh install --copy NEW --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --send. There is no --checkout flag; with --copy the script adds --checkout for the checkout it runs from. Then /mnt/storage/src/mosaic-stack/scripts/stack-copy.sh wrapper NEW.
8 Mos Start the bus: systemctl --user start [email protected]. This is the first chief session, see below. Start the Console only after step 9 passes.
9 Mos, Jason Mos runs checks 1 to 3 below. Jason confirms with mosaic agents --business mosaic-stack that any decision ids noted at step 1 are still open. Pass: start the Console, read stack-copy.sh check, both status commands and /healthz. Fail: rollback.

The first chief session

The bus host starts it at step 8, not a person typing a launch. The unit runs scripts/mosaic bus start %i --pm from the pinned copy. With --pm, launchPm() in packages/cli/src/launcher.mjs launches the instance named by launch.by with launchedBy set to the business's human and no caller capability. After step 4, launch.by is chief, so the bus launches chief as Jason. Mos holds the go for the start (decision 109). No seat runs it.

Checks, within a minute of the start:

  1. The newest "event":"launch" line in the launch log shows "instance":"chief", launchedBy equal to the business file's human, and the harness and model chief maps to (claude-code, the opus model).

  2. The typed list in that run's bundle manifest contains "mcp__mosaic__launch". The launch line's manifest field is the path of that file (<dataRoot>/launches/mosaic-stack/<run>/bundle/manifest.json, from bundle.files.manifest in launcher.mjs), not an inline object. resolve.mjs strips role.launch from any instance that isn't launch.by or whose role isn't within-role, and the bundle lists only tools that survive. Present means the running chief holds role.launch.

    node -e 'const fs=require("fs");const l=fs.readFileSync(process.argv[1],"utf8").trim().split("\n").map(JSON.parse).filter(r=>r.event==="launch").pop();const m=JSON.parse(fs.readFileSync(l.manifest,"utf8"));console.log(l.instance,l.launchedBy,l.harness,l.model,m.typed.includes("mcp__mosaic__launch"))' <dataRoot>/launches/mosaic-stack.jsonl
    

    Correction 2026-10-15: the first version read l.manifest.typed and threw a TypeError in the window. Mos read the file by hand and got true.

    Pass prints chief <human> claude-code <opus model> true.

  3. mosaic launches list shows one running chief run with that run id.

Until check 2 passes, no coder or reviewer starts. Only a running chief can launch them (agents/researcher/work/queue-119/build.md, "After that window").

Stop conditions, any one means rollback with no hand launch:

  • The newest line for this start is "event":"refused", or journalctl --user -u mosaic-bus@mosaic-stack --since "<UTC stamp> UTC" shows PM launch refused: <CODE>.
  • The bus fails to start, which means the business file or limits failed validation.
  • Check 2 prints false.

Rollback

The old host must not read the migrated file, so the file and the copy go back together, with the bus stopped.

  1. Mos, only if the bus is running: systemctl --user stop [email protected].
  2. Jason: cp -p ~/.config/mosaic-dev/businesses/mosaic-stack.json.pre-119-122 ~/.config/mosaic-dev/businesses/mosaic-stack.json
  3. Mos: repeat steps 6 to 8 with OLD in place of NEW (c2525dd33579a8fb3659e54379d09bde392d6f61), then start the Console. The old host launches the pm as today; mosaic launches list must show it.

Nothing prunes copies, so OLD stays on disk.