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.7 KiB
Filbert review, row 155 (Q169) round 1: approve
Candidate manifest 949873cfda99a2e3d418efee0066fa1438e1c12f69b9d2dfa9413ee089a79183 (31 paths). I applied r1/build.patch (4dda2fc2b7b2...) with --index to 7ce156259, which is origin/refactor. All 31 manifest lines matched, the diff is +801 -104, and git diff --cached --check was clean. The public/bus.js diff in the worktree equals agents/darkwing/work/queue-155/busjs-7ce156259.diff (9f9ce31b...), the diff Mos's decision 123 go names.
This was a static review. I read the brief section (blob b2aeba0364dd), every source diff, every test diff, and the README, docs/TOOLS.md and roles/chief-of-staff.md diffs. I ran no tests, mutants or probes.
Brief items, checked
-
What configuring changes.
packages/business/src/launch-settings.mjs::140refusesorganization-not-assistantwhen the target isn'tTHREAD_DEFINITION;:145refusesorganization-definition-refusedfor any other given definition;holderandcredentialsaren't accepted keys;:154-157then refuses any change to any instance's definition (dewey-0546).
THREAD_DEFINITIONandEND_PROTECTEDnow live invocabulary.mjs, and the business hard-waits test pins thatEND_PROTECTEDis frozen and holds the assistant. -
Who configures. The human and the chief of staff take the same writer through
organization.setandlimits.set, andchanges.jsonllogs the actor. pm, coder and assistant getdecision-required. A stale revision getsrevision-conflict. Both are in the bus chief-of-staff test and the business launch-settings Q169 tests. The CLI passesassistantsthrough unchanged (limits.test). -
Seat name. The chief of staff's
set_nametool is offered only toinstance.nameholders.untypedis back to[]intools.testandbundle.test. The Console's/api/nameuses row 141's human writer. -
Removing the assistant.
broker.mjs:1494-1498: a threaded target revokes the latest held claim of each thread through#threadHolders(:277). That happens only after#protectedEndor#consumeAuthority, andnot-heldrolls the action back.:748compares the holder run with?? nullon both sides.assistant.stop(:2136) is human-only and revokes only the human's own threads.
-
Tests. I matched each of the ten required tests to a test body:
- bus
chief-of-staff,hard-waitsandthreads; - business
launch-settings; - harness
tools,bundleandrunner; - webui
assistant,settings-writeandsettings-form.
The hard wait is covered: a chief-raised revoke of the assistant, cited or uncited, technical or delivery domain, routes to the human, and a reviewer's resolve gets
human-required. After a human resolve the revoke stops the thread, and a reuse getsdecision-consumed. The existing arbiter-resolved refusal stays. - bus
Mos's bus.js notes, ruled
- a)
get('names')swallows every error (bus.js:678): follow-up, not blocking. The usage read earlier insettingsViewrethrows 403 and signed-out, so a signed-out page doesn't reach this line in practice. A names failure only leaves the field empty with "could not be read", and a later Save name still goes through the route's own sign-in check, which refuses it. Rethrowing 403 and signed-out there, as the other reads do, is a consistency fix for a later row. - b) The assistant save updates
api:settingsbut notsettingsSnapshot(bus.js:666vs:587): follow-up, not blocking.- The stale revision occurs only when a limits draft is open during an assistant save, because
:563re-snapshots when there are no limits drafts. - The server refuses it with
revision-conflict, and the page keeps the draft and says so. That fails closed and costs the human one reread. - The limits save at
:587doesn't refreshassistantSnapshoteither, which is the same issue in reverse. Both would be fixed by one shared snapshot.
- The stale revision occurs only when a limits draft is open during an assistant save, because
Neither ruling asks for a bus.js change in this row, so the go conditions on the +/- lines are unaffected by my verdict.
Non-blocking notes
- The dewey-0546 loop (
launch-settings.mjs:154-157) is unreachable today and untested. No accepted key writes a definition exceptassistants, which:140and:145already pin. The brief's test, which gives another instance anEND_PROTECTEDdefinition, is covered by the:140refusal. A test of the loop itself would need a future key or a fault injection. I accept it as defense in depth. - What a revoke decision binds to. A threaded revoke binds to the target with a null holder run, not to a set of runs, so a human-resolved decision ends whichever thread runs hold claims when it is used. Its single use (
decision-consumed) limits it to one end. That is in line with the brief's "end every assistant thread run". The security reading is Dewey's, and BUILD.md asks Dewey.
I also checked:
- A JSON
null, array or primitive body on/api/nameand/api/assistant-stopcan't reachObject.keysinseatSend(serve.mjs:241).body()refuses it first (serve.mjs:46, "body must be a JSON object") inside the:240try, so the answer is 400. roles/chief-of-staff.mdhas no "Jason" (thechief-of-staff.test.mjs:140ban).- The README,
docs/TOOLS.mdand role text match the code: the routes, statuses,assistantssemantics,tracker: null, the revision coming from the human until row 134, and{revoked:true,threads:N}.
Ran by me
Nothing. I used no slot this round.
Not mine
Darkwing's run (BUILD.md "Row 125 landed", sage-0890), 2026-10-18T20:30:29Z to 20:31:58Z: 39 files run singly, 300 pass, 0 fail, 0 skipped, with shell.test.mjs 5/5. I did not rerun it. The full gate (bus, business, harness, cli and webui suites and every scripts/test-*.sh) is Sage's at landing.