Unclaimed files left in the canonical checkout. Inventory: canonical-cleanup-inventory.md (commit-as-evidence groups). detect-secrets scan clean on 2026-11-02: hits are sha256 pins, git object ids, test sentinels already in tracked tests and unit-file lines.
4.8 KiB
Row 132 round 1 review (Filbert): approve
Candidate: manifest sha256 ba644f8d97cfa88175fe0157d9f77523cee7e5821ddbd676b29aae46fa73cf07 (8 paths), base b6a588cd2, packet agents/researcher/work/queue-132/ in 8a73f713c.
Rebuild: a fresh worktree at 8a73f713c (current refactor) with row132.patch applied. Every manifest hash matched and git diff --check was clean. The added lines have no dash, curly-quote or control characters. The packet manifest checks. No commit from b6a588cd2 to 8a73f713c touches a manifest path, packages/harness, packages/bus/src or packages/business/src.
Sage's points
- The bus change. Confirmed. The only change under packages/bus is broker.mjs:99,
const ORGANIZATION_KEYStoexport const ORGANIZATION_KEYS, with the same four keys. No bus behaviour changes. - The 3d window check. Confirmed. bundle.test.mjs:85 builds the chief's bundle for pi and for claude-code. It checks that
typedlists end_run and change_organization (with themcp__mosaic__prefix for claude-code), thatuntypedis[], and that the prompt has no "Actions you hold that have no bus tool yet" line. - The revision-read gap. Not judged here; it's row 134.
What I checked and found correct
- end_run. It uses verb
role.revokeand actionrole.end, takesroleandreason(both required), and has nodecisionproperty.additionalPropertiesis false. The reason bounds (1 to 500) match the broker'stext()check. The broker refusesdecisionwithreason(invalid-request), consumesrole.end, then givesrole-end-refusedfor the caller's own run or the assistant's. "Goes into the log" is true: the reason is in theaction.allowedbody and in therole_claimsrow. - change_organization. It uses verb
organization.setand actionorganization.change. The properties are exactly ORGANIZATION_KEYS, and onlyrevisionis required. The revision pattern^[a-f0-9]{64}$matches launch-settings.mjs. An unknown key is refused before the writer, and the runner test shows the writer never sees it. - One key list. The harness keeps its own frozen copy so the tool server doesn't load the broker. tools.test.mjs imports both lists and fails if they differ, which the brief allows. Mutants m15 and m16 cover each direction.
- Grants are the offer. pm, coder, reviewer and the assistant get neither tool. A chief with only
role.endgets only end_run, and one with onlyorganization.changegets only change_organization.untypedActionsfor the chief is[]again (tools.test.mjs:41). - Through the runner. runner.test.mjs sends six tool calls to a live chief runner over the bus. The reply bodies are
revoked,role-end-refusedtwice (own run and the assistant), the new revision,invalid-requestfor an unknown key, andrevision-conflictfor a stale revision. The test also checks the stored revoke reason and the exact writer arguments, includingchief-of-staff.chiefas the writer. - Bundle text. The stop line depends on whether end_run is in the tool list. The chief's line names end_run, says the reason is required and 1 to 500 characters, says it can't end its own run or the assistant's, and says to raise a role.revoke decision for anything the broker refuses. pm and coder still get today's line, byte for byte.
Notes (non-blocking)
- The change_organization description says "Send only the keys you change; each replaces what the file holds for it." That's true for
limitsandmodels.instancesmerges per instance in launch-settings.mjsset(). Theinstancesproperty description ("for the instances that change") fits the merge, so a model reading both gets it right. A follow-up could say "limits and models replace; instances merge per instance". - The schema doesn't require at least one change key. A revision-only call goes to the writer, which refuses it with
invalid-request, so it fails closed.
What I ran and what I took from receipts
I ran, as single files with TMPDIR set and Docker disabled, all with 0 fail and 0 skipped:
| Test file | Result |
|---|---|
| harness tools | 16/16 |
| harness bundle | 11/11 |
| harness runner | 23/23 |
| bus chief-of-staff | 13/13 |
| bus broker | 16/16 |
| business chief-of-staff | 10/10 |
I also reapplied three of Researcher's mutant patches, one at a time, and ran the matching single file:
| Mutant | Result |
|---|---|
| m22 runner drops args | runner 2 fail |
| m17 bundle text unchanged | bundle 1 fail |
| m15 harness key dropped | tools 2 fail |
The tree matched the manifest again afterwards.
From Researcher's receipts, not rerun by me:
- the other 25 mutants (all 28
.rcfiles are 1, and the 3 controls are 0); - the targeted gate from 18:01:54Z to 18:03:33Z: business 92, bus 191, plugins 21, tasks 97, cli 195, webui 112, harness 90, seat 132, test-land-work 84/0.
I took no slot. The landing gate is still Sage's.