agents: researcher row 119 round 2 packet (#1613): assistant relays rulings to the chief of staff only, pinned

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
2026-10-14 19:45:46 -05:00
co-authored by Claude Sonnet 5.5
parent bc31acf830
commit f529cf485c
5 changed files with 91 additions and 11 deletions
+20
View File
@@ -141,3 +141,23 @@ rest. This ships what decision 139 chose; it is not a defect in the row.
`row119.patch`, `candidate-manifest.sha256` (the 22 post-patch candidate files), `mutants.sh`,
`mutants-run.txt`, `mutants/` (per-mutant output, return code, patch), `suites/` (suite output),
`packet-manifest.sha256` (digests of the packet files themselves).
## Round 2 (Filbert round 1, comment 28522, rev 1233)
F1 (blocking): `roles/assistant.md` duty 3 told the assistant to relay rulings "to the role it concerns", which
sends to roles other than the chief of staff and contradicts REQ-ASSIST-1 and REQ-ASSIST-2. The line was copied
from `chief-of-staff.md`. Fixed on the same base (c6570f142): the assistant relays each ruling verbatim to the
chief of staff, naming whose ruling it is and which role it concerns, and doesn't send it to that role itself.
Pin: `packages/business/tests/assistant.test.mjs`, "the contract passes work to the chief of staff and directs no
one", now asserts the new duty wording, "Don't send it to that role yourself", and `doesNotMatch`
`/to the role it concerns/`.
Changed since round 1: `roles/assistant.md` and `packages/business/tests/assistant.test.mjs` only. The other 20
candidate files are byte-identical. `row119.patch` and `candidate-manifest.sha256` are rebuilt; the patch applies
to c6570f142 by `git apply --cached --check`, and no commit since touches a candidate path.
Run: assistant 7/7, role 13/13, chief-of-staff 10/10 (`suites/round2-business-files.txt`, single files, no slot).
The round 1 suite outputs and `mutants-run.txt` still describe the other 20 files. I ran no new mutant for the new
pin; the round 1 mutant m12 (assistant contract directs agents) still fails on its own check. A mutant for the new
pin needs the slot and Sage's go.
@@ -1,6 +1,6 @@
0fe45e5c62e73dc84674e6ed8c3354ad489b6c6ece540042ff246a0abb3da9e3 packages/business/examples/mosaic-stack.example.json
f5bcb448a5d27c2da425536ad0487bb24c63dd6d8ec169a944fc67d25effa00f packages/business/README.md
0c4d1e87fe76911cb9252320ac5efc98394cb3d5a8403fd4ab2be6d57adf9c56 packages/business/tests/assistant.test.mjs
fb636f59d0ebd757d86158d1618b6ecfdd4d6da1cd08cba791dc100a130a7913 packages/business/tests/assistant.test.mjs
907074699b67f61ada185123547c65da75ddde591bc6c703cc0dcb14dbb3af7c packages/business/tests/business.test.mjs
e308edbf5e15e6a55fc0ce6eb8b1ccadb3f0c3071146b59a5139bf8ddb231b6f packages/business/tests/chief-of-staff.test.mjs
653ae43cfe894dcf486cad6963bcde0d33c811642d4ebd927d727f95983f2dfa packages/business/tests/cli.test.mjs
@@ -15,7 +15,7 @@ cd88d390187fba8dcb7acd0ef05c56306dcb8d60eb7f4f635520f2bad19be83c packages/harne
8f92328d54ec790ae2aca7c04b5c768e146120152a46fa01bab3007591106101 packages/harness/tests/tools.test.mjs
2d9f2a3ce4865087fe7b865f48dbc71564fc0efd26e7834aeab05ed796fcc98c packages/webui/tests/reads.test.mjs
35b6465f280999ebac881d941cb6e5cc618e68e6bf55bfccecf27ea1c961c992 roles/assistant.json
f97fe0b24d8873ace1aa65140336085bf012ad794acf03087053fad4a0c7bd02 roles/assistant.md
550f4b462c7e0a0f01a9a98b6849a85adcdaed1d081a5b6b9be4791e067d31d4 roles/assistant.md
28e394bba7a4991c5f7edd41d40499ec35cbcd56bd72d412f3c69a45b0ed0284 roles/chief-of-staff.json
f0238afad94190fc0dfbbf7fa97d283df0091dfe17f0be38c5b638d635700744 roles/chief-of-staff.md
a74cbd80054356658cb6517654a016d2111bdbba15a606f982a5aabe1c34dc5d roles/pm.json
@@ -1,5 +1,5 @@
32a67dc1d5d2ea3f9f7e3ed01dee56bb77163067b7bb8f7123f76b6b77e2a2ff build.md
8ebb56b55d274c36f8e6e4d617c37e260bbc2a11fa3b05de6299df34e54ac388 candidate-manifest.sha256
59dc28ed1123eb1f0d45d2793cf32cdeb069a809f8f1153eb217422e141edd73 build.md
f77c4917d7345391dc915309c96aac6ec75e37bd8d21252057d26ce9dec404a2 candidate-manifest.sha256
20214fa69ceb5da7f6a64efe5812edce9b6e2a0836a06bb06d347f7475f34cae mutants/control-assistant.out
9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa mutants/control-assistant.rc
f8e268ac9f2bb5dae8ec881fc322d8e0e455bbc8558f1d0d30822622a6db4c9d mutants/control-bundle.out
@@ -93,12 +93,13 @@ ec968e1ca36ccf21548290c58fb540509ca5b4ab44f5e54a32785cbbc5d99a8e mutants/m9b-va
4355a46b19d348dc2f57c046f8ef63d4538ebb936000f3c9ee954a27460dd865 mutants/m9c-validator-accepts-any-launcher.rc
8a8524db550f433863b4a5f12647f0866033bd5d185281dbb49481e869d2bec9 mutants-run.txt
83c3b1712a75b4e3114b879fde51b2752ecc3622b1c37ea1cc4218a601bf352c mutants.sh
b73a0976771b5226d90bb368fe93d90ef384a55eca95273874ec9ea0dd3ffce7 row119.patch
1fba164c6fb41ce7dadcb6c72aec1dda108401ebdf5f21c8a13f7ee2dc4d28d8 row119.patch
ddacea45cc85d6125e016a6aa4abd18d17554f492ce27359cc0eed8ad51b82fc suites/business.txt
2b1e99a388cc96da2555a514a37007f9d6e6113928f4f2f02539a30600762c59 suites/bus.txt
0d6cea57f7f2e75989801d3700990f488286c18ab968884b015c11966376934e suites/cli.txt
045179f68e5f83457251e17b3ea0376a36323e93e82e74b3779b70fbf6ca093d suites/conversation.txt
a2f2020f2a4747bd1c47dab32a9ab70e9c0bd62c31de78c9f871f26f026693d5 suites/harness.txt
0f8e00940039e10fcb65b4657a8e47e1af2e796435d278bb0700f9c09aba04f9 suites/round2-business-files.txt
39e022f7a0fdeada20a6054f2543c3b97c454fcae6df6f36d55963aa2d30ff06 suites/seat.txt
460f6c61ee69a2dca490d4a10788c83508a2c731f0fe15d0bac1e86658ca25a0 suites/tasks.txt
ccea37f4ffde1f160dcd1a1864988083a645d974e892065c956b338d0f8c853a suites/test-task.txt
+11 -6
View File
@@ -91,10 +91,10 @@ index 702e8eb14..fd955602a 100644
"reviewer"
diff --git a/packages/business/tests/assistant.test.mjs b/packages/business/tests/assistant.test.mjs
new file mode 100644
index 000000000..463be0952
index 000000000..aaa809c44
--- /dev/null
+++ b/packages/business/tests/assistant.test.mjs
@@ -0,0 +1,116 @@
@@ -0,0 +1,120 @@
+// The assistant role (REQ-ASSIST-1, row 119). The role file is policy: it
+// holds message.send within role and nothing else, no credentials, and tools
+// as read-only as the chief of staff's. A widened file fails here.
@@ -210,6 +210,10 @@ index 000000000..463be0952
+ assert.match(text, /don't direct\s+other agents/);
+ assert.match(text, /create or assign\s+tasks/);
+ assert.match(text, /launch\s+sessions/);
+ // Round 1 F1: rulings go to the chief of staff, never to the role they concern (REQ-ASSIST-1, REQ-ASSIST-2).
+ assert.match(text, /Relay each ruling the user gives verbatim to the chief\s+of\s+staff,\s+naming\s+whose\s+ruling\s+it\s+is\s+and\s+which\s+role\s+it\s+concerns/);
+ assert.match(text, /Don't\s+send\s+it\s+to\s+that\s+role\s+yourself/);
+ assert.doesNotMatch(text, /to\s+the\s+role\s+it\s+concerns/);
+});
diff --git a/packages/business/tests/business.test.mjs b/packages/business/tests/business.test.mjs
index ec3ccc651..96ba7fda8 100644
@@ -1143,10 +1147,10 @@ index 000000000..286b879f0
+}
diff --git a/roles/assistant.md b/roles/assistant.md
new file mode 100644
index 000000000..9c47636ea
index 000000000..a7f81671f
--- /dev/null
+++ b/roles/assistant.md
@@ -0,0 +1,44 @@
@@ -0,0 +1,45 @@
+# Role contract: assistant (assistant)
+
+You hold the `assistant` role for one user in one business. You are the
@@ -1162,8 +1166,9 @@ index 000000000..9c47636ea
+- Send each request for the business to the chief of staff as a message,
+ addressed to the `chief-of-staff` role. Keep the user's words as they
+ gave them, and name the request each message carries.
+- Relay each ruling the user gives verbatim to the role it concerns.
+ Don't summarize it, paraphrase it or add to it. Say whose ruling it is.
+- Relay each ruling the user gives verbatim to the chief of staff,
+ naming whose ruling it is and which role it concerns. Don't summarize
+ it, paraphrase it or add to it. Don't send it to that role yourself.
+- Report to the user what the chief of staff answers, and every refusal
+ with its exact text.
+
@@ -0,0 +1,54 @@
✔ the role file loads and resolves through loadBusiness (5.775273ms)
✔ the shipped file is exactly the approved list (0.769843ms)
✔ the assistant's authority is message.send within role and nothing else (1.85945ms)
✔ a business grant through limits does not widen the role (1.496159ms)
✔ a launch block whose by is the assistant is refused (1.470344ms)
✔ the instance takes no credential references and no tracker (2.04997ms)
✔ the contract passes work to the chief of staff and directs no one (0.896154ms)
ℹ tests 7
ℹ suites 0
ℹ pass 7
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 88.126197
✔ the four shipped version 2 roles load (2.657839ms)
✔ shipped role scopes match addendum B section 2 and the SR runbook (0.828081ms)
✔ shipped authority follows the note's table (0.483429ms)
✔ every role file in roles/ loads through the validator, and a v2 contract exists (0.520707ms)
✔ version 1 files keep loading with no authority (1.10221ms)
✔ the conductor policy isn't a role (0.295293ms)
✔ a missing role file is exit 4, a symbolic link too (0.40055ms)
✔ version 2 refusals (1.251648ms)
✔ authority: closed vocabulary, no gated-only action, no overlap (2.028094ms)
✔ credentials: Gitea scopes (0.860453ms)
✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (0.89409ms)
✔ credentials: services (0.473602ms)
✔ contract: a non-empty regular Markdown file beside the role file (0.582728ms)
ℹ tests 13
ℹ suites 0
ℹ pass 13
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 78.145495
✔ the role file loads and resolves through loadBusiness (5.964507ms)
✔ the shipped file is exactly the approved list (0.2378ms)
✔ the resolved record matches the approved list, so a widened file fails (1.687923ms)
✔ the chief of staff holds role.launch and message.send; every other action is gated (1.469309ms)
✔ the pm does not hold role.launch (1.364643ms)
✔ a business grant of a gated action through limits does not widen the role (1.285306ms)
✔ a limit that drops role.launch leaves the chief of staff with no launch block (1.409754ms)
✔ a launch block whose by is the pm instance is refused (1.301559ms)
✔ the contract names no duty to talk to the human and the pm contract no launch (0.325418ms)
✔ the instance takes no credential references and no tracker (1.950155ms)
ℹ tests 10
ℹ suites 0
ℹ pass 10
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 84.183511