docs: decision 144 (decision 104's hold closed, Jason edits the business file); row 65 brief gains the harness plug-in scope (Q156) and waits on row 131

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-14 18:50:46 -05:00
co-authored by Claude Opus 5.5
parent ecf4ce6249
commit 419eae3a25
2 changed files with 81 additions and 8 deletions
+18
View File
@@ -3264,3 +3264,21 @@ which stay with him. Each item names who decided it and what happened.
- 7. Row 87 decides whether the service manager becomes a kind.
The build plan records the order, and the queue runs row 65 before
64 and 66.
144. **Decision 104's hold is closed: Jason edits the business file
himself (2026-10-14, Mos in sage-0197).** Mos closed Q135 at
2026-10-14T18:32Z, in their STATE entry for Q152 and their DECISIONS
reading of Q152: "This settles the last part of Q135". The rule comes
from Q133, confirmed as Q140 (PRD REQ-ROLE-3): "We need the human and
the Chief of Staff to be able to edit the Business file(s)". The
chief-of-staff parts of Q135 were stale or moved into PRD 1.2, and
`bus.tester` was Vikunja #284, which Jason set and which is live on
copy c2525dd33.
- C-suite launches wait until Jason adds an instance to
`launch.instances` himself, or until the chief-of-staff rows land
(rows 119, 122 and 123). Nobody else edits the live business file.
- Rows that need a business-file entry at landing (row 65's
`plugins.harness` and `routing`, for one) send Jason the exact
entry through Mos, and the live check runs after he adds it.
- Nothing goes to Jason for this. My 2026-10-14 PM standup listed it
under Needs Jason; Mos's reply corrects that.
@@ -12,8 +12,9 @@ is after rows 55, 42 and 49.
Q156 (2026-10-14, lead decision 143) changed the order: row 65 runs
first, then 64, then 66. Row 65 is where the harnesses become plug-in
modules (PRD 1.3 REQ-PLUG-2), so 64 and 66 add their files to those
modules. Sage adds the harness-kind scope to row 65's brief before the
row starts.
modules. Row 65's brief carries the harness-kind scope (added
2026-10-14), and the row now waits on row 131, which ships the plug-in
loader.
Two decisions shape the set. Q84 is its own row, not part of the skills
row: the ms-unslop skill is guidance the model reads, and the hook is a
@@ -141,6 +142,14 @@ the system config has no `execution.adapter`, so a managed launch there
refuses today with `unsupported-harness`. The row 41 recorded run used a
test business with `claude-code` and `claude-sonnet-5-5`.
The harness names are hard-coded too, which PRD 1.3 REQ-PLUG-2 says
this row converts (Q156). The pair `pi` and `claude-code` is a list in
`packages/harness/src/bundle.mjs:20` and a check in
`packages/bus/src/broker.mjs:197`. `packages/seat/src/session.mjs:39`
maps each to its adapter script, `packages/seat/src/sandbox.mjs:104`
adds the Claude Code mounts, and `packages/cli/src/launcher.mjs:171` and
`:209` branch on `claude-code` for the credential and version checks.
### Owner and reviewer
- Owner: Sage.
@@ -156,14 +165,41 @@ test business with `claude-code` and `claude-sonnet-5-5`.
- `packages/cli/src/launcher.mjs` and its tests
- `adapters/pi/adapter.sh`, `adapters/claude/adapter.sh`,
`adapters/README.md`
- the `harness` entry in `packages/plugins/src/kinds.mjs`,
`packages/plugins/harness/pi/` and `packages/plugins/harness/claude-code/`,
their tests, and the harness section of `packages/plugins/README.md`
- `packages/bus/src/broker.mjs` (the harness check only) and
`packages/seat/src/sandbox.mjs` (the Claude Code mounts only), with
their tests
- test business fixtures that set `harness`, `model` or `thinking`
- `agents/sage/work/queue-<row>/`
### What ships
- Harnesses as plug-in modules (PRD 1.3 REQ-PLUG-1, REQ-PLUG-2; Q156).
Row 131's loader and kind registry are in place first.
- A `harness` entry in `packages/plugins/src/kinds.mjs` at interface
version 1. The organization file switches on a list,
`plugins.harness`, through the write path from row 122.
- Two modules, `packages/plugins/harness/pi/` and
`packages/plugins/harness/claude-code/`. Each `index.mjs` exports
the adapter script it runs (a path under `adapters/`, which stay
where they are), a preflight (binary present, version, credential
status), its sandbox mounts, its bundle notes and gate timeout, and
how it passes `thinking`. Rows 64 and 66 add their skills and
unslop exports to these modules.
- Core reaches a harness only through the loader. The five places
listed under Problem read the module instead, and none of them
names `pi` or `claude-code` after this row. The broker's
`invalid-harness` check accepts a harness that is switched on.
- A routing entry or fallback that names a harness not switched on
refuses the business file at load with `harness-off`. The loader's
own refusals (bad name, missing directory, symlink, load failure,
missing export, other version) refuse the launch and name the
module.
- A top-level `routing` table in the business file, keyed by role
instance name (the keys of `roles`). Each entry has `harness`
(`pi` or `claude-code`), `model`, `family` (a key of
(a harness module that is switched on), `model`, `family` (a key of
`LAUNCH_CEILING`), `thinking` (the existing six levels), and
`fallback`: null, or an object with the same four keys. Unknown keys
refuse. A `launch.instances` or `launch.by` name with no entry refuses
@@ -205,7 +241,16 @@ test business with `claude-code` and `claude-sonnet-5-5`.
one never is; the cap counts by entry family, so a model name holding
`opus` launched under a `sonnet` entry counts as sonnet; thinking
reaches the Pi and Claude Code fake adapters as the recorded flag.
- Gate suites: `node --test 'packages/business/tests/*.test.mjs'`,
- Harness tests: a route to a harness that isn't switched on refuses
with `harness-off`; a fixture harness module switched on in a test
organization file launches a fake session with no core file changed;
a grep test that no file under `packages/*/src` outside
`packages/plugins` names `pi` or `claude-code` as a harness, with the
exceptions under Out of scope listed in the test. One mutant per
refusal, and one that puts a harness name back in core.
- Gate suites: `node --test 'packages/plugins/tests/*.test.mjs'`,
`node --test 'packages/bus/tests/*.test.mjs'`,
`node --test 'packages/business/tests/*.test.mjs'`,
`node --test 'packages/harness/tests/*.test.mjs'`,
`node --test 'packages/seat/tests/*.test.mjs'`,
`node --test 'packages/cli/tests/*.test.mjs'`, and every
@@ -218,13 +263,23 @@ comes with CLIProxyAPI. Model switching in a running session and the
console UI for it (row 29, parked). `scripts/run-task.sh` worker model
selection.
The tool-policy gate stays in core: `packages/harness/src/gate.mjs` and
`claude-gate.mjs` enforce the session's tool policy, and a module
mustn't be able to change that boundary (PRD REQ-PLUG-1). Pi started
directly by `packages/conversation` and the Discord CLI converts when a
row changes those engines (Q156 item 2). No model provider kind; row
122 names providers as data, and the kind waits on row 127.
### Gate
Darkwing and Dewey approve on the issue, naming the candidate manifest.
The suites above pass on a gate rerun in a clean worktree. At landing,
Sage writes the first table into `mosaic-stack.json` and starts one
managed coder session, attaching the manifest that shows the entry used,
the family counted and the thinking flag passed.
The suites above pass on a gate rerun in a clean worktree. Jason edits
the business file himself (decision 144), so at landing Sage sends him,
through Mos, the exact `plugins.harness` and `routing` entries for
`mosaic-stack.json`. Once he has added them, Sage starts one managed
coder session, attaching the manifest that shows the module loaded, the
entry used, the family counted and the thinking flag passed. The
modules go live only through a re-pin on Mos's go (decision 109).
## Managed sessions run the unslop check on both harnesses