agents: Dewey row 139 round 2, Mos's REQ-ROLE-2 sentences (#1633)

PRD 1.6 REQ-ROLE-2 gains Mos's two sentences (sage-0545): the chief ends
the assistant with no decision, and any revoke of it is a hard wait.
Checked against broker.mjs; the code already does both. New candidate:
patch a5f21ead, manifest a4c5657f. Both PRD-reading tests pass; repro OK.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-16 14:16:13 -05:00
co-authored by Claude Opus 5.5
parent 9e1ec7bf2f
commit c83ee5d82b
6 changed files with 90 additions and 16 deletions
+41 -2
View File
@@ -12,8 +12,13 @@ superseded by Q169.
Round 2 follows Jason's ruling Q169 (sage-0528), which replaces Mos's sage-0523 ruling that the
first round 2 build followed. See "Round 2" below. Round 1's gate and mutant outputs stay in gate/
and mutants/. Round 2's are in r2/. Round 1's candidate is build.patch and
candidate-manifest.sha256 at commit 62f354746. The ones at the packet root are round 2's.
PRD-1.6.md holds the 1.6 text for Sage to send to Mos.
candidate-manifest.sha256 at commit 62f354746. The ones at the packet root are round 2's, with
Mos's REQ-ROLE-2 sentences (sage-0545): build.patch sha256
a5f21ead8195382fbf21da0ee8f66b794329c4b7f8737fa942ccd6c219524e3f, candidate-manifest.sha256
sha256 a4c5657ff69ef0665285e4c2095858346f2d325d454c6fa99edd999633dcd0f0. The round 2 candidate
before those sentences (patch 7a29d911…, manifest 7a1fcae1…) is at commit c740f56ee and differs
only in docs/prd/mosaic-stack.md. PRD-1.6.md holds the 1.6 text. Mos accepted it with the added
sentences, and readings 1 to 4 (sage-0545). See "PRD sentence (sage-0545)" below.
Base: 5661bd233bbe3e1f03a64a76ad7edcd9f6e41e89 (base.txt, origin/refactor after row 135). The
candidate is build.patch on that base. candidate-manifest.sha256 lists every changed path with its
@@ -209,6 +214,40 @@ It's stale, and row 155 owns the fix (sage-0539).
- **The harness raise_decision description** (packages/harness/src/tools.mjs:195) doesn't mention
that a spec citation changes the route. Harness text isn't in row 139's files.
## PRD sentence (sage-0545)
Mos approved the 1.6 text with two sentences added to REQ-ROLE-2 after "the chief of staff is the
only agent that removes it.": "The chief of staff removes it by ending its runs, and that end needs
no decision. A revoke of the assistant, the chief's included, is a hard wait under REQ-WAIT-1."
They went in verbatim, because the candidate's broker.mjs already does both:
- **The chief's end needs no decision.** A `role.revoke` with `reason` (line 1168) consumes
`role.end` (line 1171). `role.end` is in ROUTED (line 55), so it isn't in HARD_WAITS or GATED
(lines 62-63), and `#hardWait` only adds `role.revoke` (line 494). For a chief granted `role.end`
within-role (REQ-COS-1), #checkAuthority returns with no decision (line 659). `#protectedEnd`
(line 1173) passes for the chief's definition (line 502). Past that, the end refuses `not-held`
until row 155.
- **The chief's revoke is a hard wait.** `#hardWait` (line 494) reads the target's definition, not
the raiser, so `#classification` returns `gated` for anyone's raise (line 508). Line 1232 keeps
a hard wait from the arbiter, cited or not, and line 1233 routes it to the human.
- **A nuance, not a mismatch.** In #checkAuthority (line 681), `#protectedEnd` passes the chief
whatever recorded the resolution. A revoke decision the chief raised while the target's
definition wasn't protected, and an arbiter resolved, would pass the protection for the chief
after the definition changed. Another role's would be refused (Q169 test 2). Changing a
definition is configuration, which is row 155's.
- **Not tested directly.** No test raises a revoke of the assistant as the chief. Q169 tests 2 and
5 raise it as coder, lead and boss, and the path has no raiser check to differ on. Sage scoped
this round to the PRD (sage-0545), so no test was added.
Reruns on the edited candidate, each file singly, 2026-10-16T19:15:11Z, outputs in r2/prd/:
- packages/bus/tests/requirements.test.mjs: 3 pass, 0 fail.
- packages/tasks/tests/requirements.test.mjs: 3 pass, 0 fail.
- The candidate's new tests (both hard-waits files) don't read docs/prd/mosaic-stack.md, so there
was nothing else to rerun. A grep of packages/*/tests and scripts/test-*.sh found only those two.
repro.sh on the new patch, in a fresh worktree at base.txt: DIGESTS_OK. The worktree was removed.
## Gate, round 2 (Q169)
Run under Sage's slot (sage-0533, sage-0539; the slot was Dewey's from 19:06Z), from the worktree at the
+15 -5
View File
@@ -1,8 +1,10 @@
# PRD version 1.6 text, row 139 (#1633), for Mos
Written by Dewey for Sage to send to Mos (sage-0528, sage-0539). It records Jason's ruling Q169.
The candidate (manifest 7a1fcae1…, base 5661bd233) carries this text in docs/prd/mosaic-stack.md.
Row 139 doesn't move to in-review until Mos answers on it.
The candidate (manifest a4c5657f…, base 5661bd233) carries this text in docs/prd/mosaic-stack.md.
Mos answered in sage-0545: readings 1 to 4 are accepted, and the text is approved with the two
REQ-ROLE-2 sentences Mos added (below). The version Mos checked was sha256 e5226044…, before that
addition.
Q169, verbatim: "The only agent that should be able to remove the assistant role is the chief of
staff. The COS and the user should have the ability to (re)configure the assistant role and seat
@@ -26,9 +28,17 @@ after the Q167 sentence and before "It is never edited in place":
**REQ-ROLE-2.** These sentences are added after "and the revoke cites it.":
> The assistant is the exception here too (version 1.6, Q169): the chief of staff is the only
> agent that removes it. Anyone else's revoke of the assistant must cite a decision the human
> resolved through the CLI. A decision an arbiter resolved doesn't count, and that revoke is
> refused.
> agent that removes it. The chief of staff removes it by ending its runs, and that end needs no
> decision. A revoke of the assistant, the chief's included, is a hard wait under REQ-WAIT-1.
> Anyone else's revoke of the assistant must cite a decision the human resolved through the CLI.
> A decision an arbiter resolved doesn't count, and that revoke is refused.
>
> The second and third sentences are Mos's addition (sage-0545), checked against broker.mjs: a
> chief's `role.revoke` with a reason consumes `role.end` (line 1171), which is routed, not a hard
> wait (lines 55, 62-63), and within-role for the chief, so it returns with no decision (line 659),
> and `#protectedEnd` exempts the chief (line 502, called at 1173). A raise to revoke the assistant
> is classified `gated` by `#hardWait` (lines 494, 508) whoever raises it, `#hardWait` doesn't read
> the raiser, and line 1232 keeps it from the arbiter, so it goes to the human (line 1233).
**REQ-ROLE-4.** These sentences are added after "Jason's may be named Mos.":
+11 -8
View File
@@ -1,5 +1,5 @@
diff --git a/docs/prd/mosaic-stack.md b/docs/prd/mosaic-stack.md
index bb4ddcd20..48c6ed79d 100644
index bb4ddcd20..794a39bbb 100644
--- a/docs/prd/mosaic-stack.md
+++ b/docs/prd/mosaic-stack.md
@@ -1,6 +1,6 @@
@@ -27,20 +27,23 @@ index bb4ddcd20..48c6ed79d 100644
- Version 1.5 source, Jason's words relayed by Mos on 2026-10-15:
- Q167: "Me having to approve every decision within the Stack is not
working for me. I gave a directive, I want it to be done." and "Use
@@ -175,7 +181,11 @@ parent requirement is refused.
@@ -175,7 +181,14 @@ parent requirement is refused.
claim takes a lock and logs it, and releasing the role or ending the run
frees it. The chief of staff may end another role's run, and that act is
logged with its reason. Anyone else who revokes a stuck holder needs a
- resolved decision, and the revoke cites it.
+ resolved decision, and the revoke cites it. The assistant is the
+ exception here too (version 1.6, Q169): the chief of staff is the only
+ agent that removes it. Anyone else's revoke of the assistant must cite
+ a decision the human resolved through the CLI. A decision an arbiter
+ resolved doesn't count, and that revoke is refused.
+ agent that removes it. The chief of staff removes it by ending its
+ runs, and that end needs no decision. A revoke of the assistant, the
+ chief's included, is a hard wait under REQ-WAIT-1. Anyone else's revoke
+ of the assistant must cite a decision the human resolved through the
+ CLI. A decision an arbiter resolved doesn't count, and that revoke is
+ refused.
- **REQ-ROLE-3.** An organization file declares the role instances,
the arbiters and the credential references. The user and the chief of
staff write it. The chief of staff's writes go through a broker verb
@@ -193,7 +203,11 @@ parent requirement is refused.
@@ -193,7 +206,11 @@ parent requirement is refused.
The schema can also declare CEO, CFO and the other C-suite roles. The
assistant's name is set in the organization file. Jason's may be named
@@ -53,7 +56,7 @@ index bb4ddcd20..48c6ed79d 100644
Added in version 1.5 (Q167):
@@ -342,6 +356,9 @@ Added in version 1.5 (Q167).
@@ -342,6 +359,9 @@ Added in version 1.5 (Q167).
exactly these actions. `git.merge.protected`, `policy.change`,
`prd.approve` and `role.revoke` leave those lists and route by
REQ-DEC-2. REQ-ROLE-2 still requires a resolved decision for a revoke.
@@ -63,7 +66,7 @@ index bb4ddcd20..48c6ed79d 100644
- **REQ-WAIT-2.** No role file may grant a hard-wait action, at any
class, and the validator refuses a file that does. A change to the
hard-waits list, or a grant of a hard-wait action to a role, is itself
@@ -859,6 +876,26 @@ only hard waits in his inbox.
@@ -859,6 +879,26 @@ only hard waits in his inbox.
made with git outside the Console is a later row.
- REQ-LAND-1's refusal of a gated merge decision is pinned in rows 137
and 139. Row 139 carries it, or row 137 if 139 lands first.
@@ -1,4 +1,4 @@
5f150904571ab63bf7a0a86c3a6f0ac465634044fdb766fbdefb0889a6371c52 docs/prd/mosaic-stack.md
a173b6d92f0eaace16a11a37aa383640235948bf02e473c0364a13ed92077ff2 docs/prd/mosaic-stack.md
c42d44227fcae7398bfc3773f726c0fddb978bad68bf274b6bc8092ebb338337 packages/bus/README.md
ba4c455a858786c0d16a38dd11acb3ab37cf0ea3e6f77f4e1326f1898b1471a2 packages/bus/src/broker.mjs
56a719657be0cf7fe1c9da52a60ce151af6ef59ccce5c64d761e4d49a6af911e packages/bus/tests/chief-of-staff.test.mjs
@@ -0,0 +1,11 @@
✔ requirements returns the committed list to a holding role session, and no one else (96.261378ms)
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (68.428264ms)
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (68.827439ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 293.962341
@@ -0,0 +1,11 @@
✔ the list holds the PRD's requirement ids, in its order, at its version (1.240958ms)
✔ the committed list loads frozen (0.610572ms)
✔ the schema refuses any other shape (2.23219ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 48.266464