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.
3.8 KiB
Filbert (048f3c63), row 119 (#1613) round 1 review. Request: comment 28521. Candidate manifest sha256 8ebb56b55d274c36f8e6e4d617c37e260bbc2a11fa3b05de6299df34e54ac388 (agents/researcher/work/queue-119/candidate-manifest.sha256, packet commit 58643299e), base c6570f142.
Verdict: changes (one finding, below).
What I ran
- Rebuilt in my own worktree: base
c6570f142plusrow119.patch. All 22 manifest hashes match,git diff --checkis clean, no candidate path drifted betweenc6570f142and HEAD, and the added lines carry no smart quotes, dashes or control characters. - Single test files in that worktree: business
assistant7/7,chief-of-staff10/10,role13/13,resolve10/10; harnesstools13/13. I didn't run the full suites or the mutants. The gate and mutant figures come from Researcher's packet.
Finding (blocking)
F1. roles/assistant.md lets the assistant relay rulings to any role. The third duty reads: "Relay each ruling the user gives verbatim to the role it concerns." That sends messages to roles other than the chief of staff, which contradicts:
- REQ-ASSIST-1: the assistant "passes work for the organization to the chief of staff. It doesn't direct other agents";
- REQ-ASSIST-2 and the brief's next step (#1614): the assistant may send only to the user and the chief of staff.
The line is carried over word for word from the old chief-of-staff.md (base lines 15-16, "Relay each ruling Jason gives verbatim to the role it concerns"). The broker limit lands in row 120, so for now the contract is the only thing holding the assistant to the chief of staff.
Fix: relay each ruling verbatim to the chief of staff, saying whose ruling it is and which role it concerns. A pin in assistant.test.mjs would stop it coming back, for example asserting that the contract names no message recipient other than chief-of-staff and the user. m12 currently catches only the "direct other agents" wording.
Decision 137 check: grep -rlF assistant.md packages/*/tests scripts/test-*.sh returns packages/business/tests/assistant.test.mjs. The contract is read by a test, so this isn't doc-only.
Checked and fine
- Mutant survivors m2c, m2d, m2e. Researcher's reasoning holds. At
packages/business/src/resolve.mjs:74launchis set only whenbusiness.launch.by === instanceand the role holdsrole.launch. Lines 76-77 striprole.launchfrom every other instance.broker.mjs:305gatesrole.launchunlesslaunch.by === s.role. A PM role file that regainsrole.launchtherefore resolves exactly as before in the harness tools, harness bundle and webui reads tests. The role file itself is pinned by m2a and m2b (rc 1 inmutants/), so the survivors are a non-launcher edit with no effective change. - Role JSON. The assistant holds
message.sendonly, with read-only tools, no credentials and no crossRole action. The chief of staff gainsrole.launch(decision 139) and the PM drops it (REQ-LAUNCH-1). The chief's contract claim of a brokerlaunchtool matchespackages/harness/src/tools.mjs:95, which adds the tool only when the resolved record has a launch block. - Org file.
build.mdgives thechiefandassistantentries and thelaunch.bychange as instructions for Jason, and no candidate file touches~/.config/mosaic-dev/businesses/(decision 144). The one-window landing order is correct. Once re-pinned, a file still naminglaunch.by: "pm"fails to load becausepm.jsonno longer holdsrole.launch. Before the re-pin, the pinned chief role can't be named as the launcher. chief-of-staff.mdandpm.mdmatch REQ-COS-1 and decision 140: no user-facing duty, and the PM asks the chief for sessions. README and example follow.
Researcher's noted follow-up (scripts/test-task.sh shipped-roles loop) is fine left out of this row.