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.
5.9 KiB
Filbert: row 134 round 1, approve.
Candidate: manifest digest 8977d90723db6745eef85b72658129f393036d8aa7390b8d49697b0939a7ad60 (11 paths), row134.patch sha256 843fdee91ccc220715e2e8d681fb888b71d8d8eda66c8eb1a61475d0d923aa24. I applied the patch with --index to d58c9c5cd in my own worktree, and the manifest matched 11/11 with a name set equal to the cached diff (+181 -35). HEAD ed045ac84 has no change on any manifest path since d58c9c5cd, and git apply --cached --check is clean on HEAD.
This was a static review. I ran no tests or mutants. The suite counts (singles 133/0, node 697/0, scripts 422/0, mutants M1-M7 killed) come from Researcher's BUILD.md and Sage's message, not from a run of mine.
Brief checks
- Mechanism A, a read verb.
organization.revisiontakes no arguments.keys(args, [])atpackages/bus/src/broker.mjs:1235refuses any key withinvalid-requestbefore the file is read. The verb goes through the same#checkAuthority(s, "organization.change")asorganization.set(:1249-1252). The result is{ revision }built from the human'slimitsread (:1256), so limits, models, instances and tokens never reach the caller.#secretCheckstill runs on it (:1273). - The read spends no grant:
#consumeAuthorityruns onlyif (role && !revisionRead)(:1272). The runtime'slimitscallback ignores the actor, so the read writes no receipt. - A session without the grant gets nothing:
#agentrefuses the human (agent-required), a reader (read-only), a tester (tester-refused) and a non-holder.#authorityForrefuses any role whose file doesn't list the action within-role (decision-required). The test atpackages/bus/tests/chief-of-staff.test.mjs:325covers pm, coder, assistant, human, reader and tester, and asserts that the file was never read and nothing was allowed. - Tests for both cases: :293 (revision alone, two calls logged with the chief's actor, no
action.allowedbefore or between writes, the grant still spent once perorganization.set, keyed args refused before any read, a writer failure passes on asoutcome-unknown), and :414 (the real writer: read equals the file's sha256 and the human'slimitsrevision, the file andchanges.jsonluntouched,organization.setwith it lands, a human change makes it stale withrevision-conflict, and a second read lands the change). Mutant receipts M1-M5 cover each broker check. - Out of scope held:
limits,limits.set,plugins,instancesandroutesstay human-only (:325 assertshuman-requiredfor the chief on all four reads).organization.setkeys and refusals are unchanged. Noroles/*.json, migration or schema path is in the manifest.
Sage's items
- The three owned sentences are fixed and nothing else in those files changed.
roles/chief-of-staff.md:39-40reads "Read the revision withorganization_revisionbefore each change."docs/TOOLS.md:688-689names the tool. The third owned location,packages/business/README.md:419-421, is fixed too. Businesschief-of-staff.test.mjs:138reads the contract only formain (agent|point of interaction),Jasonandnever talk to the user, and the edit touches none of these. packages/harness/src/tools.mjs:176describes the read accurately: 64 hex, nothing else from the file, send it aschange_organization's revision, re-read onrevision-conflict, and reading spends no grant. The tool is offered under the sameorganization.changegrant and takes an empty, closed object.change_organizationat :177 now points at it.tools.test.mjsasserts the verb, the action, the empty schema,additionalProperties: false, the order beforechange_organizationand the absence of "human gave it".runner.test.mjsshows the tool reaches the broker and answers only the revision (cx64 from alimitsreply that also carries limits and tokens), and that an unknown key isinvalid-request.- Cross-role limitation: the
packages/bus/README.md:196row says a role whose only classification is cross-role getsdecision-required, and that no shipped role is cross-role. That matches#authorityFor: the read takes no arguments, so it can never present a decision.organization.sethas the same limit, becausedecisionisn't one of its keys either. - No
roles/*.jsonchange and no schema change. Confirmed.
Hash pins: three test files hold a 64-hex string and name a manifest file. packages/bus/tests/thread-migration.test.mjs:11 only imports ../src/broker.mjs, and packages/discord/tests/setspark.test.mjs:14 imports discord's own tools.mjs. The third, packages/queue/tests/fixtures/queue-marked.md, matched the grep by name only. None pins a manifest file's hash. No test reads docs/TOOLS.md or the bus, harness or business READMEs.
Notes (non-blocking)
- Follow-up for Sage, outside the brief's owned files:
packages/cli/README.md:880-881still says "until row 134 gives it a read, the revision comes from the human." The brief limits the owned stale sentences to three files, so Researcher couldn't fix this one in this row. It becomes false once the row lands.packages/cli/tests/host.test.mjs:826reads that README, but only for a unit file name, so a one-line fix needs no test change. A brief amendment or a small doc row would cover it. - The
packages/bus/README.md:196refusal list namesdecision-requiredonly for the cross-role case. A role that doesn't listorganization.changeat all (pm, coder, assistant) also getsdecision-required, as the :325 test asserts. "Needsorganization.change" implies this, but the code isn't named. - No test has a role holding
organization.changecross-role. The BUILD.md and README text state the limitation and no shipped role has it, so I'm not asking for one. - The BUILD.md runner row says the tool "reaches the broker as
limits". The broker verb isorganization.revision;limitsis the writer callback's verb underneath. The test is right; only the wording is loose.