Files

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

  1. Mechanism A, a read verb. organization.revision takes no arguments. keys(args, []) at packages/bus/src/broker.mjs:1235 refuses any key with invalid-request before the file is read. The verb goes through the same #checkAuthority(s, "organization.change") as organization.set (:1249-1252). The result is { revision } built from the human's limits read (:1256), so limits, models, instances and tokens never reach the caller. #secretCheck still runs on it (:1273).
  2. The read spends no grant: #consumeAuthority runs only if (role && !revisionRead) (:1272). The runtime's limits callback ignores the actor, so the read writes no receipt.
  3. A session without the grant gets nothing: #agent refuses the human (agent-required), a reader (read-only), a tester (tester-refused) and a non-holder. #authorityFor refuses any role whose file doesn't list the action within-role (decision-required). The test at packages/bus/tests/chief-of-staff.test.mjs:325 covers pm, coder, assistant, human, reader and tester, and asserts that the file was never read and nothing was allowed.
  4. Tests for both cases: :293 (revision alone, two calls logged with the chief's actor, no action.allowed before or between writes, the grant still spent once per organization.set, keyed args refused before any read, a writer failure passes on as outcome-unknown), and :414 (the real writer: read equals the file's sha256 and the human's limits revision, the file and changes.jsonl untouched, organization.set with it lands, a human change makes it stale with revision-conflict, and a second read lands the change). Mutant receipts M1-M5 cover each broker check.
  5. Out of scope held: limits, limits.set, plugins, instances and routes stay human-only (:325 asserts human-required for the chief on all four reads). organization.set keys and refusals are unchanged. No roles/*.json, migration or schema path is in the manifest.

Sage's items

  1. The three owned sentences are fixed and nothing else in those files changed. roles/chief-of-staff.md:39-40 reads "Read the revision with organization_revision before each change." docs/TOOLS.md:688-689 names the tool. The third owned location, packages/business/README.md:419-421, is fixed too. Business chief-of-staff.test.mjs:138 reads the contract only for main (agent|point of interaction), Jason and never talk to the user, and the edit touches none of these.
  2. packages/harness/src/tools.mjs:176 describes the read accurately: 64 hex, nothing else from the file, send it as change_organization's revision, re-read on revision-conflict, and reading spends no grant. The tool is offered under the same organization.change grant and takes an empty, closed object. change_organization at :177 now points at it. tools.test.mjs asserts the verb, the action, the empty schema, additionalProperties: false, the order before change_organization and the absence of "human gave it". runner.test.mjs shows the tool reaches the broker and answers only the revision (c x64 from a limits reply that also carries limits and tokens), and that an unknown key is invalid-request.
  3. Cross-role limitation: the packages/bus/README.md:196 row says a role whose only classification is cross-role gets decision-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.set has the same limit, because decision isn't one of its keys either.
  4. No roles/*.json change 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-881 still 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:826 reads 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:196 refusal list names decision-required only for the cross-role case. A role that doesn't list organization.change at all (pm, coder, assistant) also gets decision-required, as the :325 test asserts. "Needs organization.change" implies this, but the code isn't named.
  • No test has a role holding organization.change cross-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 is organization.revision; limits is the writer callback's verb underneath. The test is right; only the wording is loose.