docs: preserve row 219 mos-1429 short-run evidence

This commit is contained in:
Rocko committed 2026-10-23 03:43:53 -05:00
1 parent 7e70de9e68
commit b899095e48
15 files changed
+674 -1

No files matched your search

+15
View File
@@ -5,3 +5,18 @@ and new direct broker bindLaunch regression. See root BUILD.md and the
assertion-preservation JSON/diff. Red-first evidence awaits Sage CLEAR.
No product changes; root and this round list16 paths. T24 is new; T01 now
targets the direct creative bind refusal. 24 mutants in the full run.
## Short slot receipt, sage-3302
2026-10-23 08:41:20Z-08:41:45Z, HEAD 7e70de9e6, manifest
451d3fcbeb6a41c3a505600898ba2025985f44d8391e2cd823ab84f1d4b50621.
Detached bfa421b6c reds: sage-1908 thread-required at bindLaunch;
project-runtime ERR_ASSERTION on exact singular/plural import pin.
Whole green files: grant-executor 42/0/0, project-runtime 3/0/0,
threads 20/0/0, total 65/0/0, no cancellations or skips.
T24 assertion-killed. Its exact failure was "Expected values to be strictly
equal", actual 'decision-required', expected 'host-creative-role', code
ERR_ASSERTION. Removing the creative guard reaches the later decision-required
fence; this is a code-mismatch kill, not proof that host.run executed.
All 16 hashes restored, cwd node/chromium sweep empty. Raw TAP and per-stage
exit/duration/counts are in short-run/. No unexpected red and no retry.
@@ -1,4 +1,4 @@
5d6dae09c07f34332cc939a58610cb0659e1be36400304e0d3eef479bbcdc0d0 BUILD.md
cc98e830b5f8d0a34149e602775f154642e3f5e09cd42427e9deb49c84663fca BUILD.md
2ce65e27aeb4cc563dbe179efbf5a120d6ac48f597e477c3648e58d28d829082 SHORT-RUN-PLAN.md
5209e39f588a709962baae627fa0e66a3bf6ed7d6fe66ca3ec4dce16850ddc47 approved-tests.diff
b05b00cd9f352219b88772e78c055c329fddf5e6b3ad4d4b1067e81ab235e418 assertion-preservation.json
@@ -6,3 +6,16 @@ d7e1b464a314c7b079385f0a14a53189fe839d72d7666729026ffcb9d16a0faa base.txt
deb5e2ff721c3b5adc1390c4aaef2d8aaf4f792edbd4e6b2d4766421222c406a build.patch
451d3fcbeb6a41c3a505600898ba2025985f44d8391e2cd823ab84f1d4b50621 candidate-manifest.sha256
5222c9f6d7c1da26f5b9447626ba8e005a7ab36006183ed36df40190b9133fb4 changed-paths.txt
0cd14e6b9ea80f71ede6757e8430052246bb1f5c96c165133b1fa9b467d05262 short-run/T24-receipt.txt
0cd14e6b9ea80f71ede6757e8430052246bb1f5c96c165133b1fa9b467d05262 short-run/T24.tap
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945 short-run/cwd-sweep-final.json
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945 short-run/cwd-sweep.json
37c331032ac90730c9a3cabae0c467fb0dd5c1991cda5ff98b0fc5d1a553e7b4 short-run/green-grant-executor.tap
d47f011e509107304b01c7f9037af7dfe1d06a45959309d21066c9755a3353b5 short-run/green-project-runtime.tap
f52f3afbd058dd2c6dcf84ed1f3eb69bd4040df599c6f80b30fc60e7837de85b short-run/green-threads.tap
b85b47bbd1cea535817b3077f109be91c703fbaacee4a1fd8d1d6f08acf24c8c short-run/head.json
fdc8c9854f7dbed2d7ebb3da403dac0c88bc2ae6596fb1fa0d9fc5f865f244a0 short-run/red-grant.tap
3033a3f85b738ff2a4c06e90973348fadfa6fc7c16c8192f6c4407bccffdb587 short-run/red-pin.tap
1294cda16078dc1800b800fcf4d4410c89bce9687bd510068d22c3b1eed32c16 short-run/restored.json
72675fa1a56c9e567bea82b4f6897ee3766472b8545f69b3b9e3909532a24500 short-run/results.jsonl
835ab90ef7f52aca6260e13017795cc4102c6dd3267f5ce6d5ca0684aa606029 short-run/runner.py
@@ -0,0 +1,38 @@
TAP version 13
# Subtest: sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
not ok 1 - sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
---
duration_ms: 541.339182
type: 'test'
location: '/mnt/storage/scratch/rocko-r219/packages/bus/tests/grant-executor.test.mjs:1046:1'
failureType: 'testCodeFailure'
error: |-
Expected values to be strictly equal:
+ actual - expected
+ 'decision-required'
- 'host-creative-role'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: 'host-creative-role'
actual: 'decision-required'
operator: 'strictEqual'
stack: |-
Object.<anonymous> (file:///mnt/storage/scratch/rocko-r219/packages/bus/tests/grant-executor.test.mjs:703:103)
expectedException (node:assert:547:17)
expectsError (node:assert:672:21)
strict.rejects (node:assert:738:3)
async TestContext.<anonymous> (file:///mnt/storage/scratch/rocko-r219/packages/bus/tests/grant-executor.test.mjs:1057:3)
async Test.run (node:internal/test_runner/test:1409:7)
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 619.444691
@@ -0,0 +1,38 @@
TAP version 13
# Subtest: sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
not ok 1 - sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
---
duration_ms: 541.339182
type: 'test'
location: '/mnt/storage/scratch/rocko-r219/packages/bus/tests/grant-executor.test.mjs:1046:1'
failureType: 'testCodeFailure'
error: |-
Expected values to be strictly equal:
+ actual - expected
+ 'decision-required'
- 'host-creative-role'
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected: 'host-creative-role'
actual: 'decision-required'
operator: 'strictEqual'
stack: |-
Object.<anonymous> (file:///mnt/storage/scratch/rocko-r219/packages/bus/tests/grant-executor.test.mjs:703:103)
expectedException (node:assert:547:17)
expectsError (node:assert:672:21)
strict.rejects (node:assert:738:3)
async TestContext.<anonymous> (file:///mnt/storage/scratch/rocko-r219/packages/bus/tests/grant-executor.test.mjs:1057:3)
async Test.run (node:internal/test_runner/test:1409:7)
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 619.444691
@@ -0,0 +1 @@
[]
@@ -0,0 +1 @@
[]
@@ -0,0 +1,262 @@
TAP version 13
# Subtest: row 280: an occupied TCP port is attempted, refused, and retried with our sshd
ok 1 - row 280: an occupied TCP port is attempted, refused, and retried with our sshd
---
duration_ms: 84.725551
type: 'test'
...
# Subtest: row 280: every injected picker sample is unprivileged and outside the ephemeral range
ok 2 - row 280: every injected picker sample is unprivileged and outside the ephemeral range
---
duration_ms: 0.343983
type: 'test'
...
# Subtest: G7: an Approve installs the tagged line, logs in with the new key, and writes the key file, record and grant.applied
ok 3 - G7: an Approve installs the tagged line, logs in with the new key, and writes the key file, record and grant.applied
---
duration_ms: 657.889711
type: 'test'
...
# Subtest: G7: a commands change on a live grant updates the record in one transaction and keeps the key and line
ok 4 - G7: a commands change on a live grant updates the record in one transaction and keeps the key and line
---
duration_ms: 531.188801
type: 'test'
...
# Subtest: G8: a failure at install or verify removes the line and leaves no record, key file or reference
ok 5 - G8: a failure at install or verify removes the line and leaves no record, key file or reference
---
duration_ms: 1502.744543
type: 'test'
...
# Subtest: G8: a failed remove adds hostLineLeft and tells the human to sweep
ok 6 - G8: a failed remove adds hostLineLeft and tells the human to sweep
---
duration_ms: 645.757376
type: 'test'
...
# Subtest: G8: a failure in step 5 before commit unlinks the key file, drops the reference and removes the line
ok 7 - G8: a failure in step 5 before commit unlinks the key file, drops the reference and removes the line
---
duration_ms: 632.923531
type: 'test'
...
# Subtest: G8: a store fault in the commit transaction ends host-failed with no record, key file, reference or line
ok 8 - G8: a store fault in the commit transaction ends host-failed with no record, key file, reference or line
---
duration_ms: 648.03379
type: 'test'
...
# Subtest: G8: a failed step 1 check spends the decision and runs nothing remote
ok 9 - G8: a failed step 1 check spends the decision and runs nothing remote
---
duration_ms: 82.428566
type: 'test'
...
# Subtest: G9: a registry, definition or commands change between raise and Approve ends decision-mismatch before any remote step
ok 10 - G9: a registry, definition or commands change between raise and Approve ends decision-mismatch before any remote step
---
duration_ms: 519.400918
type: 'test'
...
# Subtest: G9: an agent no longer a role or no longer declaring host ends with its code, spent
ok 11 - G9: an agent no longer a role or no longer declaring host ends with its code, spent
---
duration_ms: 69.103063
type: 'test'
...
# Subtest: G10: a second start refuses decision-consumed, and an unresolved or agent-resolved decision not-authorized, writing nothing
ok 12 - G10: a second start refuses decision-consumed, and an unresolved or agent-resolved decision not-authorized, writing nothing
---
duration_ms: 511.259562
type: 'test'
...
# Subtest: G15: no event, message or decision holds the private key
ok 13 - G15: no event, message or decision holds the private key
---
duration_ms: 490.757332
type: 'test'
...
# Subtest: G23: a revoke during install ends grant.failed revoked with no key file, no grant and no line
ok 14 - G23: a revoke during install ends grant.failed revoked with no key file, no grant and no line
---
duration_ms: 526.257653
type: 'test'
...
# Subtest: G23 (row 249): an add that writes after an abort's remove leaves hostLineLeft until the sweep
ok 15 - G23 (row 249): an add that writes after an abort's remove leaves hostLineLeft until the sweep
---
duration_ms: 871.678557
type: 'test'
...
# Subtest: G23 (row 249): an add that writes after a timed-out install's remove leaves hostLineLeft until the sweep
ok 16 - G23 (row 249): an add that writes after a timed-out install's remove leaves hostLineLeft until the sweep
---
duration_ms: 864.787135
type: 'test'
...
# Subtest: G23: a revoke recorded after the raise and before the start ends step 1 revoked, and a held slot ends host-busy
ok 17 - G23: a revoke recorded after the raise and before the start ends step 1 revoked, and a held slot ends host-busy
---
duration_ms: 523.685406
type: 'test'
...
# Subtest: G24: names at 64 characters with . and _ give distinct tags of the fixed length
ok 18 - G24: names at 64 characters with . and _ give distinct tags of the fixed length
---
duration_ms: 0.44828
type: 'test'
...
# Subtest: G11: a restart after install removes the line, then ends interrupted with the tag, holding the slot until then
ok 19 - G11: a restart after install removes the line, then ends interrupted with the tag, holding the slot until then
---
duration_ms: 217.311491
type: 'test'
...
# Subtest: G11: a restart after a new key's commit, with the key file written, ends with no key file, record, reference or line
ok 20 - G11: a restart after a new key's commit, with the key file written, ends with no key file, record, reference or line
---
duration_ms: 213.431823
type: 'test'
...
# Subtest: G11: a restart after a commands change's commit leaves the record as it was and asks nothing of the host
ok 21 - G11: a restart after a commands change's commit leaves the record as it was and asks nothing of the host
---
duration_ms: 514.743857
type: 'test'
...
# Subtest: G11 (B2): a restart before step 1, spent or not yet spent, ends interrupted and nothing runs later
ok 22 - G11 (B2): a restart before step 1, spent or not yet spent, ends interrupted and nothing runs later
---
duration_ms: 67.778309
type: 'test'
...
# Subtest: G11: a remote undo that fails ends interrupted with hostLineLeft and the sweep hint
ok 23 - G11: a remote undo that fails ends interrupted with hostLineLeft and the sweep hint
---
duration_ms: 283.505936
type: 'test'
...
# Subtest: G11: a restart leaves a finished grant alone, and the reconcile adds nothing for it
ok 24 - G11: a restart leaves a finished grant alone, and the reconcile adds nothing for it
---
duration_ms: 532.803771
type: 'test'
...
# Subtest: N1 (G27): the start sweep unlinks host.<id> files with no record in loaded businesses only, and refuses a store dir that is not private
ok 25 - N1 (G27): the start sweep unlinks host.<id> files with no record in loaded businesses only, and refuses a store dir that is not private
---
duration_ms: 10.401722
type: 'test'
...
# Subtest: G12: the human's hosts.revoke deletes the record, the key file, the reference and the line, with a closed marker
ok 26 - G12: the human's hosts.revoke deletes the record, the key file, the reference and the line, with a closed marker
---
duration_ms: 680.673474
type: 'test'
...
# Subtest: G12 (N4): a revoke with no record still removes the computed tag's line, with granted false; bad args refuse
ok 27 - G12 (N4): a revoke with no record still removes the computed tag's line, with granted false; bad args refuse
---
duration_ms: 210.775767
type: 'test'
...
# Subtest: G13: a revoke during install aborts the executor, which ends revoked, and the line goes
ok 28 - G13: a revoke during install aborts the executor, which ends revoked, and the line goes
---
duration_ms: 539.460127
type: 'test'
...
# Subtest: G26: the human, the assistant and the tester revoke; the chief and a pm refuse; sweep is the human's or the tester's
ok 29 - G26: the human, the assistant and the tester revoke; the chief and a pm refuse; sweep is the human's or the tester's
---
duration_ms: 509.503577
type: 'test'
...
# Subtest: row 281 T8: a tester hosts.revoke refuses tester-dev-only once bus.tester is off, and a human revoke writes no job records
ok 30 - row 281 T8: a tester hosts.revoke refuses tester-dev-only once bus.tester is off, and a human revoke writes no job records
---
duration_ms: 651.604822
type: 'test'
...
# Subtest: G27: a restart after step 1 sweeps the key file and runs step 3 once the bus is up; status shows the revoke until then
ok 31 - G27: a restart after step 1 sweeps the key file and runs step 3 once the bus is up; status shows the revoke until then
---
duration_ms: 660.602104
type: 'test'
...
# Subtest: G27: after step 2 with the host down, the restart closes the marker with hostLineLeft; a marker without a revoke id is not reopened
ok 32 - G27: after step 2 with the host down, the restart closes the marker with hostLineLeft; a marker without a revoke id is not reopened
---
duration_ms: 960.616547
type: 'test'
...
# Subtest: G27: a key file a revoke could not unlink is reported left and goes at the next start
ok 33 - G27: a key file a revoke could not unlink is reported left and goes at the next start
---
duration_ms: 659.246715
type: 'test'
...
# Subtest: G28: a commands change, then a revoke, then a restart leave no record, key, reference or line
ok 34 - G28: a commands change, then a revoke, then a restart leave no record, key, reference or line
---
duration_ms: 679.404671
type: 'test'
...
# Subtest: G24 (B4): hosts.sweep removes only this business's recorded tags no live grant holds, and records what it left
ok 35 - G24 (B4): hosts.sweep removes only this business's recorded tags no live grant holds, and records what it left
---
duration_ms: 957.711463
type: 'test'
...
# Subtest: G12: the local steps finish before the host step, so a host that hangs leaves the agent no access
ok 36 - G12: the local steps finish before the host step, so a host that hangs leaves the agent no access
---
duration_ms: 707.712192
type: 'test'
...
# Subtest: G23 (X5): a revoke right after the spend reaches the executor's claim, so the grant ends revoked
ok 37 - G23 (X5): a revoke right after the spend reaches the executor's claim, so the grant ends revoked
---
duration_ms: 213.272659
type: 'test'
...
# Subtest: G23 (X5): a revoke that lands as verify returns ends revoked with no record, key file or line
ok 38 - G23 (X5): a revoke that lands as verify returns ends revoked with no record, key file or line
---
duration_ms: 650.086388
type: 'test'
...
# Subtest: G13: a revoke whose host remove fails still drops the record and key, and reports the line left for a sweep
ok 39 - G13: a revoke whose host remove fails still drops the record and key, and reports the line left for a sweep
---
duration_ms: 656.97494
type: 'test'
...
# Subtest: G22: enroll, check, grant, host.run, a commands change the next host.run uses, and a revoke that kills a run in flight
ok 40 - G22: enroll, check, grant, host.run, a commands change the next host.run uses, and a revoke that kills a run in flight
---
duration_ms: 1161.98276
type: 'test'
...
# Subtest: mos-1163: a grant whose agent became a creative role after the raise ends host-creative-role at step 1, spent, with nothing remote
ok 41 - mos-1163: a grant whose agent became a creative role after the raise ends host-creative-role at step 1, spent, with nothing remote
---
duration_ms: 64.270391
type: 'test'
...
# Subtest: sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
ok 42 - sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
---
duration_ms: 513.54277
type: 'test'
...
1..42
# tests 42
# suites 0
# pass 42
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 21560.094474
@@ -0,0 +1,28 @@
TAP version 13
# Subtest: Broker keeps the sandbox client import closure: only the listed imports, no lazy project import
ok 1 - Broker keeps the sandbox client import closure: only the listed imports, no lazy project import
---
duration_ms: 2.134902
type: 'test'
...
# Subtest: without a trusted project adapter all three async paths refuse project-not-configured
ok 2 - without a trusted project adapter all three async paths refuse project-not-configured
---
duration_ms: 40.098809
type: 'test'
...
# Subtest: real startBroker injects the project adapter for socket reads and bound-author record writes
ok 3 - real startBroker injects the project adapter for socket reads and bound-author record writes
---
duration_ms: 195.816084
type: 'test'
...
1..3
# tests 3
# suites 0
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 346.858932
@@ -0,0 +1,130 @@
TAP version 13
# Subtest: REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger
ok 1 - REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger
---
duration_ms: 37.881537
type: 'test'
...
# Subtest: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker
ok 2 - REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker
---
duration_ms: 66.86806
type: 'test'
...
# Subtest: REQ-MSG-1: a message to or from the assistant names its thread, or is refused
ok 3 - REQ-MSG-1: a message to or from the assistant names its thread, or is refused
---
duration_ms: 31.783414
type: 'test'
...
# Subtest: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work
ok 4 - REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work
---
duration_ms: 612.146473
type: 'test'
...
# Subtest: REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance
ok 5 - REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance
---
duration_ms: 25.313669
type: 'test'
...
# Subtest: REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder
ok 6 - REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder
---
duration_ms: 29.786654
type: 'test'
...
# Subtest: REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it
ok 7 - REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it
---
duration_ms: 32.078895
type: 'test'
...
# Subtest: REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder
ok 8 - REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder
---
duration_ms: 36.18567
type: 'test'
...
# Subtest: REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder
ok 9 - REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder
---
duration_ms: 30.574839
type: 'test'
...
# Subtest: REQ-ROLE-2 REQ-THREAD-1 Q169: a role.revoke the human approved ends every thread run of the assistant
ok 10 - REQ-ROLE-2 REQ-THREAD-1 Q169: a role.revoke the human approved ends every thread run of the assistant
---
duration_ms: 28.11449
type: 'test'
...
# Subtest: Q169 REQ-USER-2: assistant.stop ends the human's own assistant thread runs, and only the human's
ok 11 - Q169 REQ-USER-2: assistant.stop ends the human's own assistant thread runs, and only the human's
---
duration_ms: 40.031837
type: 'test'
...
# Subtest: REQ-USER-2: the human verbs refuse another owner's thread
ok 12 - REQ-USER-2: the human verbs refuse another owner's thread
---
duration_ms: 28.629823
type: 'test'
...
# Subtest: REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one
ok 13 - REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one
---
duration_ms: 23.227988
type: 'test'
...
# Subtest: REQ-ORG-2: projects and threads are named once, and the repo names a business project
ok 14 - REQ-ORG-2: projects and threads are named once, and the repo names a business project
---
duration_ms: 24.842387
type: 'test'
...
# Subtest: REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing
ok 15 - REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing
---
duration_ms: 90.053907
type: 'test'
...
# Subtest: project.create refuses a repository name without its matching repo before any write
ok 16 - project.create refuses a repository name without its matching repo before any write
---
duration_ms: 16.171096
type: 'test'
...
# Subtest: project.create keeps unrelated names with and without a repository
ok 17 - project.create keeps unrelated names with and without a repository
---
duration_ms: 12.013106
type: 'test'
...
# Subtest: C2-09a: explicit creative instances bind independent threads, default sessions and holders
ok 18 - C2-09a: explicit creative instances bind independent threads, default sessions and holders
---
duration_ms: 48.182262
type: 'test'
...
# Subtest: C2-09a: explicit missing, non-thread and malformed selectors create no thread or session
ok 19 - C2-09a: explicit missing, non-thread and malformed selectors create no thread or session
---
duration_ms: 21.103961
type: 'test'
...
# Subtest: C2-09a: creative bindLaunch without a thread refuses thread-required
ok 20 - C2-09a: creative bindLaunch without a thread refuses thread-required
---
duration_ms: 10.557239
type: 'test'
...
1..20
# tests 20
# suites 0
# pass 20
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 1330.269155
@@ -0,0 +1 @@
{"head": "7e70de9e68ba48d761a45894d037239b5d576a38", "red": "bfa421b6cd9b2b54d8da119e73b004aeafe606c3", "manifest": "451d3fcbeb6a41c3a505600898ba2025985f44d8391e2cd823ab84f1d4b50621", "start": "2026-10-23T08:41:20.461140+00:00"}
@@ -0,0 +1,26 @@
TAP version 13
# Subtest: sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
not ok 1 - sage-1908: once the agent of an applied grant is a creative role, host.run refuses host-creative-role, runs nothing remote and keeps the record
---
duration_ms: 526.66272
type: 'test'
location: '/mnt/storage/scratch/rocko-r219-red-mos1429/packages/bus/tests/grant-executor.test.mjs:1046:1'
failureType: 'testCodeFailure'
error: 'thread-required'
code: 'thread-required'
stack: |-
fail (file:///mnt/storage/scratch/rocko-r219-red-mos1429/packages/bus/src/broker.mjs:209:9)
Broker.bindLaunch (file:///mnt/storage/scratch/rocko-r219-red-mos1429/packages/bus/src/broker.mjs:1258:40)
TestContext.<anonymous> (file:///mnt/storage/scratch/rocko-r219-red-mos1429/packages/bus/tests/grant-executor.test.mjs:1050:24)
async Test.run (node:internal/test_runner/test:1409:7)
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 610.366811
@@ -0,0 +1,58 @@
TAP version 13
# Subtest: Broker keeps the sandbox client import closure: only the listed imports, no lazy project import
not ok 1 - Broker keeps the sandbox client import closure: only the listed imports, no lazy project import
---
duration_ms: 2.490892
type: 'test'
location: '/mnt/storage/scratch/rocko-r219-red-mos1429/packages/bus/tests/project-runtime.test.mjs:12:1'
failureType: 'testCodeFailure'
error: |-
Expected values to be strictly deep-equal:
+ actual - expected
[
"import { randomUUID, randomBytes, createHash } from 'node:crypto';",
"import { isAbsolute, dirname } from 'node:path';",
"import { initializeControl, processingStatus } from '../../processing-control/src/state.mjs';",
"import { NAME as HARNESS_NAME } from '../../plugins/src/kinds.mjs';",
"import { loadRequirements } from '../../tasks/src/requirements.mjs';",
"import { MERGE, LandingRefusal, readLanding } from './landing.mjs';",
+ "import { ID_PATTERN, THREAD_DEFINITIONS, END_PROTECTED, forkProblem, forkUrl, credentialKind, validArgv, commandAllowed, HOST_ID, CREATIVE_DEFINITIONS, unhireableAction, giteaName, parseGiteaUrl, covers } from '../../business/src/vocabulary.mjs';"
- "import { ID_PATTERN, THREAD_DEFINITION, END_PROTECTED, forkProblem, forkUrl, credentialKind, validArgv, commandAllowed, HOST_ID, CREATIVE_DEFINITIONS, unhireableAction, giteaName, parseGiteaUrl, covers } from '../../business/src/vocabulary.mjs';"
]
code: 'ERR_ASSERTION'
name: 'AssertionError'
expected:
0: "import { randomUUID, randomBytes, createHash } from 'node:crypto';"
1: "import { isAbsolute, dirname } from 'node:path';"
2: "import { initializeControl, processingStatus } from '../../processing-control/src/state.mjs';"
3: "import { NAME as HARNESS_NAME } from '../../plugins/src/kinds.mjs';"
4: "import { loadRequirements } from '../../tasks/src/requirements.mjs';"
5: "import { MERGE, LandingRefusal, readLanding } from './landing.mjs';"
6: "import { ID_PATTERN, THREAD_DEFINITION, END_PROTECTED, forkProblem, forkUrl, credentialKind, validArgv, commandAllowed, HOST_ID, CREATIVE_DEFINITIONS, unhireableAction, giteaName, parseGiteaUrl, covers } from '../../business/src/vocabulary.mjs';"
actual:
0: "import { randomUUID, randomBytes, createHash } from 'node:crypto';"
1: "import { isAbsolute, dirname } from 'node:path';"
2: "import { initializeControl, processingStatus } from '../../processing-control/src/state.mjs';"
3: "import { NAME as HARNESS_NAME } from '../../plugins/src/kinds.mjs';"
4: "import { loadRequirements } from '../../tasks/src/requirements.mjs';"
5: "import { MERGE, LandingRefusal, readLanding } from './landing.mjs';"
6: "import { ID_PATTERN, THREAD_DEFINITIONS, END_PROTECTED, forkProblem, forkUrl, credentialKind, validArgv, commandAllowed, HOST_ID, CREATIVE_DEFINITIONS, unhireableAction, giteaName, parseGiteaUrl, covers } from '../../business/src/vocabulary.mjs';"
operator: 'deepStrictEqual'
stack: |-
TestContext.<anonymous> (file:///mnt/storage/scratch/rocko-r219-red-mos1429/packages/bus/tests/project-runtime.test.mjs:14:10)
Test.runInAsyncScope (node:async_hooks:226:14)
Test.run (node:internal/test_runner/test:1402:25)
Test.start (node:internal/test_runner/test:1262:17)
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
...
1..1
# tests 1
# suites 0
# pass 0
# fail 1
# cancelled 0
# skipped 0
# todo 0
# duration_ms 119.366042
@@ -0,0 +1 @@
{"paths": 16, "drift": [], "head": "7e70de9e68ba48d761a45894d037239b5d576a38", "end": "2026-10-23T08:41:45.374077+00:00"}
@@ -0,0 +1,6 @@
{"label": "red-grant", "start": "2026-10-23T08:41:20.461387+00:00", "end": "2026-10-23T08:41:21.126907+00:00", "seconds": 0.666, "exit": 1, "counts": {"tests": 1, "pass": 0, "fail": 1, "cancelled": 0, "skipped": 0}, "skips": [], "log": "agents/rocko/work/queue-219/r4/short-run/red-grant.tap"}
{"label": "red-pin", "start": "2026-10-23T08:41:21.130846+00:00", "end": "2026-10-23T08:41:21.295380+00:00", "seconds": 0.165, "exit": 1, "counts": {"tests": 1, "pass": 0, "fail": 1, "cancelled": 0, "skipped": 0}, "skips": [], "log": "agents/rocko/work/queue-219/r4/short-run/red-pin.tap"}
{"label": "green-grant-executor", "start": "2026-10-23T08:41:21.299531+00:00", "end": "2026-10-23T08:41:42.908967+00:00", "seconds": 21.609, "exit": 0, "counts": {"tests": 42, "pass": 42, "fail": 0, "cancelled": 0, "skipped": 0}, "skips": [], "log": "agents/rocko/work/queue-219/r4/short-run/green-grant-executor.tap"}
{"label": "green-project-runtime", "start": "2026-10-23T08:41:42.913276+00:00", "end": "2026-10-23T08:41:43.327996+00:00", "seconds": 0.415, "exit": 0, "counts": {"tests": 3, "pass": 3, "fail": 0, "cancelled": 0, "skipped": 0}, "skips": [], "log": "agents/rocko/work/queue-219/r4/short-run/green-project-runtime.tap"}
{"label": "green-threads", "start": "2026-10-23T08:41:43.331886+00:00", "end": "2026-10-23T08:41:44.698643+00:00", "seconds": 1.367, "exit": 0, "counts": {"tests": 20, "pass": 20, "fail": 0, "cancelled": 0, "skipped": 0}, "skips": [], "log": "agents/rocko/work/queue-219/r4/short-run/green-threads.tap"}
{"label": "T24", "start": "2026-10-23T08:41:44.704293+00:00", "end": "2026-10-23T08:41:45.369841+00:00", "seconds": 0.666, "exit": 1, "counts": {"tests": 1, "pass": 0, "fail": 1, "cancelled": 0, "skipped": 0}, "skips": [], "log": "agents/rocko/work/queue-219/r4/short-run/T24.tap"}
@@ -0,0 +1,55 @@
from pathlib import Path
import os,subprocess,signal,tempfile,json,re,time,hashlib,shlex
from datetime import datetime,timezone
ROOT=Path('/mnt/storage/scratch/rocko-r219'); RED=Path('/mnt/storage/scratch/rocko-r219-red-mos1429')
P=ROOT/'agents/rocko/work/queue-219';OUT=P/'r4/short-run';OUT.mkdir(exist_ok=True)
HEAD='7e70de9e68ba48d761a45894d037239b5d576a38';OLD='bfa421b6cd9b2b54d8da119e73b004aeafe606c3'
def stamp():return datetime.now(timezone.utc).isoformat()
def verify():
assert subprocess.check_output(['git','rev-parse','HEAD'],cwd=ROOT,text=True).strip()==HEAD
assert subprocess.check_output(['git','rev-parse','HEAD'],cwd=RED,text=True).strip()==OLD
for line in (P/'candidate-manifest.sha256').read_text().splitlines():
sha,path=line.split(' ',1);assert hashlib.sha256((ROOT/path).read_bytes()).hexdigest()==sha,path
def execute(label,root,file,pattern=None):
args=['node','--test','--test-reporter=tap']
if pattern:args+=['--test-name-pattern',pattern]
args+=[file]
env=os.environ.copy();env.update(TMPDIR=tempfile.mkdtemp(prefix='r',dir='/mnt/storage/scratch/tmp'),DOCKER_HOST='unix:///mnt/storage/scratch/rocko-r219-dead.sock',NO_COLOR='1')
env.pop('MOSAIC_GITEA_CREDENTIAL_FILE',None);env.pop('MOSAIC_LIVE_PROVIDER',None)
log=OUT/(label+'.tap');start=stamp();begin=time.monotonic()
cmd=shlex.join(['timeout','-k','10','300',*args])+' | tee '+shlex.quote(str(log))
child=subprocess.Popen(['bash','-o','pipefail','-c',cmd],cwd=root,env=env,stdout=subprocess.DEVNULL,stderr=subprocess.STDOUT,start_new_session=True)
try:rc=child.wait(timeout=315)
except subprocess.TimeoutExpired:
os.killpg(child.pid,signal.SIGKILL);child.wait();rc=124
finally:
try:os.killpg(child.pid,signal.SIGTERM)
except ProcessLookupError:pass
text=log.read_text(errors='replace');counts={k:int(m[-1]) if (m:=re.findall(r'^# '+k+r' (\d+)\s*$',text,re.M)) else None for k in ['tests','pass','fail','cancelled','skipped']}
row=dict(label=label,start=start,end=stamp(),seconds=round(time.monotonic()-begin,3),exit=rc,counts=counts,skips=[x for x in text.splitlines() if re.search(r'^skip\b|# SKIP\b',x,re.I)],log=str(log.relative_to(ROOT)))
with (OUT/'results.jsonl').open('a') as f:f.write(json.dumps(row)+'\n')
print(json.dumps(row),flush=True)
assert rc not in (124,137,-9) and 'SyntaxError:' not in text, 'timeout/syntax '+label
return row,text
def green(label,file):
verify();r,t=execute(label,ROOT,file)
assert r['exit']==0 and r['counts']['fail']==0 and r['counts']['cancelled']==0 and not re.search(r'^\s*not ok\b',t,re.M),'unexpected red '+label
verify();(OUT/'head.json').write_text(json.dumps(dict(head=HEAD,red=OLD,manifest=hashlib.sha256((P/'candidate-manifest.sha256').read_bytes()).hexdigest(),start=stamp())))
pattern='sage-1908: once the agent of an applied grant is a creative role'
r,t=execute('red-grant',RED,'packages/bus/tests/grant-executor.test.mjs',pattern)
assert r['exit']!=0 and r['counts']['fail']==1 and "code: 'thread-required'" in t and 'bindLaunch' in t,'wrong grant red'
verify();r,t=execute('red-pin',RED,'packages/bus/tests/project-runtime.test.mjs','Broker keeps the sandbox client import closure')
assert r['exit']!=0 and r['counts']['fail']==1 and 'ERR_ASSERTION' in t and 'THREAD_DEFINITION' in t,'wrong pin red'
for name in ['grant-executor','project-runtime','threads']:green('green-'+name,'packages/bus/tests/'+name+'.test.mjs')
verify();s=next(x for x in json.loads((P/'mutants.json').read_text()) if x['id']=='T24');path=ROOT/s['file'];saved=path.read_bytes()
try:
text=path.read_text();assert text.count(s['old'])==1;path.write_text(text.replace(s['old'],s['new'],1))
r,t=execute('T24',ROOT,s['test'],s['pattern'])
assert r['exit']!=0 and r['counts']['fail']==1 and 'ERR_ASSERTION' in t and re.search(r'^\s*not ok \d+ - '+re.escape(pattern),t,re.M),'T24 invalid or survivor'
(OUT/'T24-receipt.txt').write_text(t)
finally:path.write_bytes(saved)
verify();(OUT/'restored.json').write_text(json.dumps(dict(paths=16,drift=[],head=HEAD,end=stamp())))
print('SHORT_RUN_GREEN',stamp(),flush=True)