gander: publish completed row 196 gate and merge review manifest

This commit is contained in:
jason.woltje committed 2026-10-21 15:05:06 -05:00
1 parent 05e940117f
commit 93f3332b28
36 files changed
+10000 -59

No files matched your search

+4
View File
@@ -111,3 +111,7 @@ changes are planned before the batch. M1-M29 remain prepared and unexecuted.
2026-10-21 fourth-run preflight, sage-2113: no predicted test reds. The prior editor rebuild skip may remain because shared esbuild is 0.28.1 while the test requires 0.28.2. Legacy case1/case2 tester-port consumers remain follow-up scope per mos-1198; their contract tests use stand-ins. The fourth run covers WebUI and CLI whole, eight union files and every scripts/test-*.sh. No product edit or dependency install.
2026-10-21 fourth-run stop, sage-2113/2120 at 91e3696ef: WebUI whole passed 304/0 with one existing editor skip in 112.142839 seconds. CLI did not start: busy preflight detected Sage queue add sage-2122a (PID 2054449) and refused, 1.612991 seconds. No extra files or shell tests started. No rerun; simultaneous report gander-0052 to Sage and Mos returned the slot. Sweep found zero gate leftovers and eight pre-existing harness helpers. Product tracked tree clean. Records: r5/gate/.
2026-10-21 mos-1200 correction: the fourth-run CLI busy refusal means the guard worked and is not counted as a stop. Earlier entries and raw logs retain the driver wording. WebUI 304/0, bus 622/0 and 30 mutant kills stand while product blobs match; only CLI whole, eight union files and ten shell scripts remain. Sage chooses the candidate and grants resumption. No test or rebase starts before that decision.
2026-10-21 sage-2124 continuation completed on 05e940117: CLI whole 735/0; eight union files 166/0; ten scripts/test-*.sh 429/0. Combined with carried bus/WebUI: 2256 pass, 0 fail, 1 editor skip; 30/30 mutants killed. Counts/times are script-summed in r5/resume/summary.json. Sweep gate leftovers 0, eight pre-existing helpers remain. Slot returned gander-0056. MANIFEST.md, CANDIDATE.sha256 and PRODUCT-FILES.json freeze immutable 05e940117 for Duckworth. No live activation or merge authorized.
@@ -0,0 +1,39 @@
4f5e1f7cb21d86cced206e25abac032d75c7e3ba683d6f80f42001d5b4211e05 docs/TOOLS.md
10c996d323ac46d45548f7748d40b246de93f8c5eacae9f951c6eeb5dcc62697 packages/bus/README.md
60720461a7994011a9a30594715eb2c992be699cd61c656e77cbd609ad05328e packages/bus/fixtures/peer-client.mjs
0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079 packages/bus/src/human.mjs
d5d98a9133a1b449acc48143fd559d890a470c6ea210b30b9b70e491e6cd855a packages/bus/src/interpreter.mjs
29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7 packages/bus/src/peercred.mjs
d1536a8f472fa5b3773adb10555529ed049ad63b647c0b44c00ce5f25ce09f85 packages/bus/src/peercred.py
32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd packages/bus/src/principal.mjs
f060bb55bb3abbc9f5d776ce7728a8e49356a6c5307bca8411e6163f0e044e83 packages/bus/src/runtime.mjs
7be306c830aa98763b34b329995b40e9df443483fe20fcd69100a3acb6311bd6 packages/bus/src/server.mjs
e99133c3c957a1e856e404343721add2430e4a0d8c75452517aef04942af56ab packages/bus/tests/channel-proof.test.mjs
d19779b97e80ed3d62f58d0e798df46c23f45fa02b14fb4ac7a2ff4690a734e2 packages/bus/tests/interpreter.test.mjs
a39af877a2d9143cc8d0584af0d603ca7ab651db8787e5816579762f17295887 packages/bus/tests/peer-transport.test.mjs
2c4c0bed41e546ce94535d8c4547b1cf5552a181183525dd1d52e2af1d64ccb6 packages/bus/tests/peercred.test.mjs
cefbc0688d823c69196d94bb71467884acd639070721286d7e8e4e986c8240c1 packages/bus/tests/principal.test.mjs
95c7acdb47f753d1e129adaa90b5937318d8d006ca47be9d92729fdae013776f packages/cli/README.md
4bd7bdf0898844684ebf9444b110d2c5b6fa874b2681183e54f1f62f97823192 packages/cli/src/tester-http.mjs
a7cb20db2941b3b3abb09bcaa55eac92a1d420cf4ec79c6f83e4bb3235e04a2b packages/cli/tests/stack-release-fixture.mjs
2a5a896831c1bab2ae239c90651592c95d6d08c151df518a5f6cdae65bded3ef packages/cli/tests/stack-release.test.mjs
fbaa36e64129aee324341364bde831c379c098b97932cceadb7fcaa7909d4b20 packages/cli/tests/tester-http.test.mjs
04b7c1165c4fa73137a72e8373d70fd7d96a5897b5511170e6d41908a7667e96 packages/webui/README.md
934ab2f9b6bde72aafe7814758550c283eb25a4f3a23b284021b13718d67178f packages/webui/src/bus.mjs
2c7f791e53b4bce8dc23aa974a8fe4c5d7b59204331a3d8ac398a31e530517a2 packages/webui/src/cli.mjs
da624f188c69e016ff82e1d1dcae1c579e68a57f0f25d773bb5d8bca56b80ee1 packages/webui/src/serve.mjs
1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16 packages/webui/src/tester-socket.mjs
2f3ea92cbe1ca115301ee1e3b8fc55a206842606237446b700881ee57a1b18cb packages/webui/tests/browser.mjs
f505b5fc635aa699556c237a92401b495943e45e25ebfadab945d64477e3e86e packages/webui/tests/library-cli.test.mjs
edef361c4654ec010809c12c87c00197ec6e6b8337863068c4ffa144e291e300 packages/webui/tests/proof-cli.test.mjs
5f34d699a1bce6f46f286def1a93fdd4d863d06bec6839677fae1041be7153dd packages/webui/tests/proof.test.mjs
6457debc3d233a24643be00e4876e1129db664da2fbf5cc7168f3e371c46f313 packages/webui/tests/service.test.mjs
3c1d2481eff2271c1c83f7ec2e9d616ac22600d032af23afc47f919c58f1b9ba packages/webui/tests/sso.test.mjs
9215ff92df774ba1e83819b87f758b53c8f3d19c2824c916490165914f1cb9e8 packages/webui/tests/tester-browser-fixture.mjs
89ffc5cbed1630a523080e8561d3678c1f781fb657199a5cd6cdb8189f082c73 packages/webui/tests/tester-browser.test.mjs
23219434713fbd283a1e5cb1a373ed9d19d0963e171636dbf39bed3d60cd1316 packages/webui/tests/tester-cli.test.mjs
7d4f3a59d21675807b1bfb92d40b7378134df450590bc6d42fa4103ab1343348 packages/webui/tests/tester-fixture.mjs
7f0fc2daead11048cb86e0a74b6a223314785b1740a2927461d012b876a69f18 packages/webui/tests/tester-listener.test.mjs
c01a942da1ad66a08a4e7c92d3c7e64f517530acfe5517f1e9895767d5ea3c0b packages/webui/tests/tester-socket.test.mjs
b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2 scripts/stack-release.sh
6e7069cca9f7aef84c17f15611f2d7e0d09083a363c23da8dbd14d3ed29f0f40 scripts/webui-service.sh
+99 -29
View File
@@ -1,12 +1,40 @@
# Row 196 review manifest
# Row 196 merge-scoped review manifest
Status: draft, not an acceptance claim. Candidate product files are uncommitted.
Base: 4d26003f731a6eec439df6a48cacc3ef482a59c8. Design r3 approved by
duckworth-0009/0015 and sage-1371. No merge, deployment or live re-pin requested.
Current path hashes are in PRODUCT-FILES.json, marked as an uncommitted draft.
Final candidate commit, exact changed-file hashes and gate totals follow after
the renewed suite slot. Sage owns that slot and the final gate. Duckworth reviews
this manifest before Sage's gate.
Candidate: **05e940117**, on e54e05463, branch gander/row196-r5. Its product/test bytes equal 91e3696ef; the difference is records only. No rebase after Sage's sage-2124 choice. Approved design r3 is 4d26003f7 (duckworth-0009/0015, sage-1371). This packet requests Duckworth's manifest review before Sage's gate, not merge, deployment or a live re-pin.
`CANDIDATE.sha256` freezes the changed product, tests, fixtures and operator docs from e54e05463 to 05e940117. `PRODUCT-FILES.json` gives baseline and candidate SHA256 for each path. All hashes come from immutable Git blobs, not a dirty tree. Final record commits change agents/gander/work/queue-196 only and do not alter the frozen candidate. Row252 design/notes carried in history are separate and contain no row252 product code.
## Acceptance evidence
Golden totals: **2256 pass, 0 fail, 1 editor skip**. Mutants: **30/30 killed**. No test rerun followed the completed grant. Gate tracked tree clean; only the expected node_modules symlink is untracked. Sweep: **0 gate leftovers**, eight pre-existing harness helpers retained. Slot returned in gander-0056 at 20:02:08Z.
Bus whole ran on r4 f8a59e6aa; WebUI whole ran on 91e3696ef; remaining files ran on 05e940117. All 595 product blobs match r4, and candidate/test bytes match 91e3696ef. `r5/resume/product-equality.json` extends the SHA proof to the frozen tip. Carry was expressly accepted by mos-1198/1200 and sage-2113/2124.
| Step | Pass | Fail | Skip | Wall seconds |
|---|---:|---:|---:|---:|
| bus | 622 | 0 | 0 | 36.272237 |
| webui | 304 | 0 | 1 | 112.142839 |
| cli | 735 | 0 | 0 | 574.436202 |
| packages_business_tests_business.test.mjs | 19 | 0 | 0 | 1.523933 |
| packages_business_tests_cli.test.mjs | 10 | 0 | 0 | 3.466997 |
| packages_business_tests_instance-settings.test.mjs | 13 | 0 | 0 | 1.905684 |
| packages_business_tests_library-projects-protected.test.mjs | 4 | 0 | 0 | 1.477437 |
| packages_business_tests_resolve.test.mjs | 11 | 0 | 0 | 1.446584 |
| packages_library_tests_mirror.test.mjs | 16 | 0 | 0 | 7.333578 |
| packages_project_tests_project.test.mjs | 15 | 0 | 0 | 1.726089 |
| packages_seat_tests_checkout.test.mjs | 78 | 0 | 0 | 6.367270 |
| test-auth.sh | 15 | 0 | 0 | 1.906329 |
| test-conductor.sh | 17 | 0 | 0 | 6.837641 |
| test-config.sh | 31 | 0 | 0 | 3.154425 |
| test-discord.sh | 78 | 0 | 0 | 8.776728 |
| test-extension-package.sh | 18 | 0 | 0 | 3.012857 |
| test-foundation.sh | 44 | 0 | 0 | 39.708726 |
| test-land-work.sh | 86 | 0 | 0 | 12.623263 |
| test-queue.sh | 28 | 0 | 0 | 23.443742 |
| test-release.sh | 14 | 0 | 0 | 12.168674 |
| test-task.sh | 98 | 0 | 0 | 36.783798 |
Raw results: r4/gate/whole-results.json (bus), r5/gate/whole-results.json (WebUI), r5/resume/whole-results.json (remainder). Full logs are adjacent. Exact totals: r5/resume/summary.json.
## Review items
@@ -27,9 +55,12 @@ this manifest before Sage's gate.
| Path preflight before stop | Activation checks the final Unix pathname byte length and any existing parent directory's type, owner and mode before stopping units. The row196 release case reproduces a too-long path reaching service stops, then verifies length and unsafe-parent refusals leave start/stop calls unchanged. Evidence: `evidence/release-path-red.txt` and `evidence/release-path-green.txt`. | M29 removes the preflight |
| Browser fixture migration | Test-only CDP interception fulfills synthetic-origin requests from the scratch Unix listener. No TCP listener or product relay. `tester-browser.test.mjs` is 2/2 after the fixture repair, accepted in sage-1409. Evidence: `evidence/tester-browser-focused.txt`. | Product transport removal is covered by M1; browser fixture itself is tested by its two cases. |
All package paths above are under `packages/`. Mutants are prepared in
`mutants.mjs` but none have run as of this draft. Their kill and restoration
receipts must be attached before acceptance. M25-M29 supplement design M1-M24.
All package paths above are under `packages/`. All 30 mutants are killed, including the distinct M28b SSO insertion mutant. The exact accepted-source table and target hashes are in `r4/gate/consolidated-kills.json`; `r5/resume/RESULTS.md` lists every kill. Original failed/survivor runs remain preserved. No outer timeout was used as an accepted kill in the renewed runs.
Additional review items:
- SSO/socket argument order: the whole stack-release file checks pointer and generated unit order without --send. r4 SSO RED fails with the SSO clause removed, GREEN passes after restoration; M28b kills that exact change. M28 targets only proof insertion. Unique-target guard statically accepts all 30 definitions before mutation starts.
- Row215 callback fixture: r5 changes only `--tester-port`, `7444` to `--tester-socket` in library-cli.test.mjs. The test name and every assertion match e54e05463 byte for byte. Its existing loader captures library.file/library.status from both listener callback pairs. Whole WebUI now passes the case. `r5/assertions-unchanged.json` proves the narrow diff; Duckworth's hunk check passed per sage-2120.
## Separate row164 proof baseline update
@@ -43,8 +74,7 @@ Only two baselines in `packages/bus/tests/channel-proof.test.mjs` change.
The human-cli and CLI transport hashes stay fixed. Literal shim path recovery,
forged-proof refusal and the channel plug-in proof-caller import ban remain tested.
Focused evidence: `evidence/channel-proof.txt`. These hashes must be checked again
against the final candidate before review.
Focused evidence: `evidence/channel-proof.txt`. Both candidate hashes were checked against immutable 05e940117 and match the table.
## Consumer inventory and window
@@ -60,23 +90,63 @@ The 7331 development control board is inventory only. Its reads, /api/reply
writes and reachability remain the separate boundary described in DESIGN.md.
Row 190b remains on hold; this work does not isolate hostile same-uid processes.
## Gate history and remaining evidence
Remaining legacy installer/acceptance consumers are explicitly outside r5: scripts/case2-unit.sh and scripts/case1-accept.sh. `r5/TESTER-PORT-AUDIT.md` and tester-port-occurrences.json inventory every source/test/generator occurrence, including deliberate old-copy and negative cases. They are input to Sage's follow-up chained after 196. Their stand-in contract tests passing does not prove those legacy units can start the new tester.
Run 1: bus 463 pass, one byte-baseline failure. Run 2: bus 464 pass; WebUI
stopped at its second fixture migration failure, with 269 observed top-level
passes and no final summary. CLI and mutants did not start. Sage received clear
in gander-0023. No timing failures were attributed to Launchpad's T56 overlap.
The two browser failures were repaired and verified in a single file.
## Gate history and controls
sage-1416 delays the renewed slot until Launchpad, Darkwing, Rocko and row 192
finish. No suite or mutant batch starts before Sage's go. Remaining: final
bus/WebUI/CLI suites, M1-M29 receipts, final changed-file hashes,
verified candidate commit/push, Duckworth
manifest review and Sage's gate. No approval is implied by this draft.
Raw records are preserved under r2/, r3/, r4/ and r5/. r2 stop 1 fixed runtime SyntaxError classification in the driver, separate from --check syntax preflight, and recorded GNU timeout process-group cleanup. Stop 2 exposed non-unique M28 targeting; the SSO product test and exact M28b guard followed. M5's old/new mutated bytes matched; M25's differed and it reran. r3 was withdrawn only because row215 landed, not counted as a stop. r4 refreshed changed-target M13/M17/M22; all other target hashes matched accepted runs. r4 WebUI then failed on the legacy library CLI activation, stop 3. Mos approved the sole test flag repair in r5.
The first r5 segment passed WebUI but its CLI busy check refused Sage's queue write. mos-1200 ruled that the refusal is not a stop: the guard worked. sage-2124 resumed only unstarted scope, now all green. No fifth full run occurred. All original wording/logs and corrections remain in BUILD.md and records.
Each start was gated by the canonical busy check with only current-driver ancestor PIDs excluded, &&, pipefail and tee. TMPDIR paths were made by mktemp under /mnt/storage/scratch/tmp. Whole files ran, including the eight-file union from row215. The editor rebuild skip reflects shared esbuild 0.28.1 versus required 0.28.2; no dependency install was performed. test-queue prints a deliberate canonical-only verify/render skip in a scratch checkout. No real uid, live units, live ports or real provider was exercised.
## Merge reasoning for the ten conflicted files
| File | Resolution and reason |
|---|---|
| BUILD-LOG.md | Retain upstream append-only phases followed by row196 entries. No historical entry removed or rewritten. |
| docs/TOOLS.md | Combine socket/legacy tester flags with upstream --sso and --no-send usage. Keep new operator modes. |
| packages/bus/src/runtime.mjs | Keep upstream host executor imports, run-directory sweep, grant reconciliation and host API. Add interpreter receipt and peer reader before listen, shared verifier and per-request binds. No second verifier. |
| packages/bus/src/server.mjs | Keep upstream HOST_VERBS/HOSTS_VERBS and host argument. Merge user proof and peer checks, with idempotent transient-cap release on host async completion too, avoiding duplicate disconnect. |
| packages/cli/tests/stack-release.test.mjs | Keep upstream extracted fixture import and all new upstream tests, append the whole row196 case outside upstream's closing block. Move row196 optional long data-root parameter into stack-release-fixture.mjs, where mk now lives. |
| packages/webui/src/cli.mjs | Retain SSO parsing, startup, summary and shutdown; replace only tester TCP with private Unix transport. Preserve testerNoSignIn when SSO is on. |
| packages/webui/src/serve.mjs | Retain SSO session/Host checks and signer. Add socket-only tester transport and fixed logical origin. Tester refuses authorization, session/login cookies and provider headers; it never uses the SSO signer. |
| packages/webui/tests/proof-cli.test.mjs | Retain upstream lane imports while moving the tester assertion to Unix HTTP. Close the fixture's socket before spawning the same-root CLI. No product relay. |
| scripts/stack-release.sh | Retain external-unit protocol, instance flags, SSO transformation, no-send and grant/config checks. Run socket migration on BASE_CONSOLE after sso_base. Preserve interpreter gate after external start-floor calculation. New socket flag participates in proof/SSO insertion and rollback carry, avoiding ordering and TCP-fallback regressions. External callers cannot use the new render-changing flag. |
| scripts/webui-service.sh | Retain instance selection, PORT_SET and SSO flag/status handling; add socket support checks and mode conflict. Status regex recognizes either legacy tester port or socket after send. |
Follow-through outside the conflict blocks: migrate the new SSO tester fixture to
Unix HTTP while retaining every sign-in refusal; adapt M15 to BASE_CONSOLE; retain
approved DESIGN.md/PLAN.md, absent on the new base. No tests before Sage's clear.
The two reviewed row164 file hashes remain unchanged by this rebase.
## Every conflicted hunk
1. BUILD-LOG.md append hunk: retained both row215 build entries, then row196
append-only entries. No historical entry removed or rewritten. The raw
conflict and resolved context are in conflicts.diff and the candidate.
2. packages/bus/src/server.mjs import hunk: retained row215's LIBRARY_VERBS
alongside HOST_VERBS, HOSTS_VERBS and PROJECT_FILE_VERBS, then retained row196
inspectInterpreter and createPeerReader imports. Library requests keep their
awaited branch; every proof still passes kernel-peer verification and every
transient cap still uses the idempotent release closure.
## Automatically merged overlaps inspected
- runtime.mjs keeps library ensureMirror before socket readiness, library service
callbacks and filtering of library mappings out of code-project root scanning,
alongside row196 interpreter receipt, reader and principal binding.
- server.mjs retains LIBRARY_VERBS in the async request branch and release() on
its finalizer, so one-request Console proofs are neither lost nor leaked.
- webui CLI keeps libraryFile/libraryStatus handlers on both main and tester
handler objects, alongside SSO lifecycle and Unix tester startup. The bus's
library authorization remains authoritative; no tester privilege is added.
- stack-release fixture includes packages/library/src in its copy closure while
retaining row196 optional long-path dataName for refusal tests.
- stack-release test rehearsal closure includes packages/library/src while all
proof/socket and SSO/socket tests are retained. The SSO test patch is unchanged.
Node 24 focused reruns after the shutdown change are complete: peercred 5/5 and
principal 4/4. Node 26 peer-transport now passes 4/4, including client-visible
refusal codes. Full logs are in evidence/.
## Refused caller behavior and static review
@@ -98,9 +168,9 @@ Static review covered peer reader and shutdown, runtime startup and failure
cleanup, principal/walk dispatch, tester bind/close, Console spawn, Unix client,
release conversion/recovery/preflight, unit rendering and test fixture changes.
It found the shutdown, proof ordering and preflight defects recorded above.
Each has a focused test and prepared mutant. An unrelated change to legacy
Each has a focused test and a killed mutant. An unrelated change to legacy
tester-port-invalid text was also removed to preserve the existing contract.
No further implementation changes are planned before the authorized batch.
The authorized golden files are complete. No live activation or uid window was run.
## Limits carried to acceptance
+46 -30
View File
@@ -1,16 +1,17 @@
{
"status": "uncommitted draft; regenerate after final tests",
"base": "4d26003f731a6eec439df6a48cacc3ef482a59c8",
"status": "verified immutable candidate",
"base": "e54e05463",
"candidate": "05e940117",
"files": [
{
"path": "docs/TOOLS.md",
"baselineSha256": "5bd1bc697cd56e57b00e60c0e80be72cd1043a55a6d2fc0b9e2ccdd0c5cf9802",
"candidateSha256": "7eba3f1ac2e5a159c9c764f1c3e4f6fdfaf06d2904cdc36338723d5ddd9044c8"
"baselineSha256": "17528973e2ed9748f5b0a9218feb5b2ae9789c13998e29e448b5775aae3c561d",
"candidateSha256": "4f5e1f7cb21d86cced206e25abac032d75c7e3ba683d6f80f42001d5b4211e05"
},
{
"path": "packages/bus/README.md",
"baselineSha256": "4377cc32aed37fa1bb645c0bbc3340eed4ec01740e67327449949474e35d3fdb",
"candidateSha256": "becff52b647f28079d2756b26a7e46e28f14b695f57b2dede779e7cb43af3d96"
"baselineSha256": "30db0bea82f6f9c2000b68797c461d1fb26726c4f983e6e984b36014c9865d15",
"candidateSha256": "10c996d323ac46d45548f7748d40b246de93f8c5eacae9f951c6eeb5dcc62697"
},
{
"path": "packages/bus/fixtures/peer-client.mjs",
@@ -44,13 +45,13 @@
},
{
"path": "packages/bus/src/runtime.mjs",
"baselineSha256": "fe70f4b6568fbfec85e58d34f3cb8c3624daba65487d73ad24e981f2121cb27a",
"candidateSha256": "e001bdba127fc6e7a6e95ef1864e661b2842f3c797169ab0a6ccaa5e2cd7da00"
"baselineSha256": "c759e665514a5bcad40536bc9f979837187fe6523462b3c0a0687182885c3ac6",
"candidateSha256": "f060bb55bb3abbc9f5d776ce7728a8e49356a6c5307bca8411e6163f0e044e83"
},
{
"path": "packages/bus/src/server.mjs",
"baselineSha256": "8a1b8eac60a5885bbfd36f939b63443de303ed298bf9e1ff653a5a7bcbae76d2",
"candidateSha256": "a5788c0a0b2b78de5eb2111a47c475e100cbb0e2eca4b601e7f027cac2c56d7e"
"baselineSha256": "207c7a76752c753ef7380f18f9ce1a4f23e8fa35142973b6358aaf0c45f44899",
"candidateSha256": "7be306c830aa98763b34b329995b40e9df443483fe20fcd69100a3acb6311bd6"
},
{
"path": "packages/bus/tests/channel-proof.test.mjs",
@@ -79,18 +80,23 @@
},
{
"path": "packages/cli/README.md",
"baselineSha256": "2c9f8fe7143aa80e59826ab53bd046de2b5e0a8f3e81fe4e3df77726bb54d50b",
"candidateSha256": "23f4c767a67b358025f0d035d2a676e14e335478c480bc44a5c303066c40709c"
"baselineSha256": "66ad221829e3b710106379070e5decd3b6e7bfe352175c02fba1463bd18801e0",
"candidateSha256": "95c7acdb47f753d1e129adaa90b5937318d8d006ca47be9d92729fdae013776f"
},
{
"path": "packages/cli/src/tester-http.mjs",
"baselineSha256": null,
"candidateSha256": "4bd7bdf0898844684ebf9444b110d2c5b6fa874b2681183e54f1f62f97823192"
},
{
"path": "packages/cli/tests/stack-release-fixture.mjs",
"baselineSha256": "86a3c15446d4c119206097c754cd15f5bef7b7e93c9f16e9d8696ec8c475eea9",
"candidateSha256": "a7cb20db2941b3b3abb09bcaa55eac92a1d420cf4ec79c6f83e4bb3235e04a2b"
},
{
"path": "packages/cli/tests/stack-release.test.mjs",
"baselineSha256": "b01ff656962c6fdb5bc3554cfbb13645b7f25adae5f6cd9608af8de6d6091c6c",
"candidateSha256": "4c92b7cc7c4b942a1bbb9a9e24c7c1ef10e23d3f9d166bee98ed1b7f6b8de4b0"
"baselineSha256": "46cc95a6e75a89b907cdd5e9bd03853e1d1f75f1ced81084d968c5476466822e",
"candidateSha256": "2a5a896831c1bab2ae239c90651592c95d6d08c151df518a5f6cdae65bded3ef"
},
{
"path": "packages/cli/tests/tester-http.test.mjs",
@@ -99,8 +105,8 @@
},
{
"path": "packages/webui/README.md",
"baselineSha256": "78c7b60d23cf20863a1cb66e16af2f9363d08acc79c5b4a344cd8af4fbe5bd44",
"candidateSha256": "8bf41140a0c013a3d77757b66e442d46c278cf8eb0f54ac26b4e477e8265279b"
"baselineSha256": "68e5db18de89d59357171f3393c9803043f00d6388999a1e44a312365fe2fde5",
"candidateSha256": "04b7c1165c4fa73137a72e8373d70fd7d96a5897b5511170e6d41908a7667e96"
},
{
"path": "packages/webui/src/bus.mjs",
@@ -109,13 +115,13 @@
},
{
"path": "packages/webui/src/cli.mjs",
"baselineSha256": "4f988333ec6af225a023323dda85a159b81a77f408a8dd7bff798fe9a1f4b24b",
"candidateSha256": "fbe9db9352300fb969aa889e40323c61b1a51d01f63434964be0a8c530240e50"
"baselineSha256": "e98fd2fe4e621d5b4fa1ed95c4d4585469e7ab7a11dd379dc541dddb1b1a1f02",
"candidateSha256": "2c7f791e53b4bce8dc23aa974a8fe4c5d7b59204331a3d8ac398a31e530517a2"
},
{
"path": "packages/webui/src/serve.mjs",
"baselineSha256": "ba7d3e35b225cb4e17a4d2530a0f34d0a3734641e3982229a38207a36b3cd433",
"candidateSha256": "894bdb260af418bef7ca9dac5dd19541ca898d6f946ed12fa832bc3475234709"
"baselineSha256": "333d474b1c7e753938aedc639c08f9db0e787faf56aa8068d013fd304a0b3b7e",
"candidateSha256": "da624f188c69e016ff82e1d1dcae1c579e68a57f0f25d773bb5d8bca56b80ee1"
},
{
"path": "packages/webui/src/tester-socket.mjs",
@@ -127,10 +133,15 @@
"baselineSha256": "1e70a0175f1d660f6b71449a1423ece83fbe8332108960fa9aff6f7a5e48022a",
"candidateSha256": "2f3ea92cbe1ca115301ee1e3b8fc55a206842606237446b700881ee57a1b18cb"
},
{
"path": "packages/webui/tests/library-cli.test.mjs",
"baselineSha256": "1983912b76f01f8e6d0c564e3bbcd763c0b2c44044988b192ef827446f98556c",
"candidateSha256": "f505b5fc635aa699556c237a92401b495943e45e25ebfadab945d64477e3e86e"
},
{
"path": "packages/webui/tests/proof-cli.test.mjs",
"baselineSha256": "c23975b140ed977f3b98dbbec5de289e9f930cc42089193c4aa7c106338a68ba",
"candidateSha256": "105cf4936db0498d0c0025698c7ee33ddce9530b43f6c829b77afdbcb3075207"
"baselineSha256": "a1aff7eec4e2f90533bacaf14e2fdeaba3a6a8a87aae700ec6d68e3bd536af73",
"candidateSha256": "edef361c4654ec010809c12c87c00197ec6e6b8337863068c4ffa144e291e300"
},
{
"path": "packages/webui/tests/proof.test.mjs",
@@ -139,8 +150,13 @@
},
{
"path": "packages/webui/tests/service.test.mjs",
"baselineSha256": "424be2837a18a41eab56b0deb576e35b460ac16b8c371762ad44896ffc3aad7d",
"candidateSha256": "2304ced2473c25b0369b4bb9b1433c1be3ee9ab8a6f75c971487abcd48cb1d1b"
"baselineSha256": "845313239547ddbc478090b29f96385f0b8853e5087c572393be328e7075f578",
"candidateSha256": "6457debc3d233a24643be00e4876e1129db664da2fbf5cc7168f3e371c46f313"
},
{
"path": "packages/webui/tests/sso.test.mjs",
"baselineSha256": "67f93deb65b14dc213615e5e674fb908a2d13b253c8c0e4b8c0cd5476157a06a",
"candidateSha256": "3c1d2481eff2271c1c83f7ec2e9d616ac22600d032af23afc47f919c58f1b9ba"
},
{
"path": "packages/webui/tests/tester-browser-fixture.mjs",
@@ -154,8 +170,8 @@
},
{
"path": "packages/webui/tests/tester-cli.test.mjs",
"baselineSha256": "dd74517b336e1670a5910481920ba875ffb004d52d8c6bee7cc5efc81e43215d",
"candidateSha256": "a5c6c95dbda75dce37d38d3ce4761d3ad576babd9304a046e9a62b1b5dc2fdfd"
"baselineSha256": "8bf4491f7982399b4162cfbe36d0b68888e99ceb2cbaefefc2361732dd95e0c8",
"candidateSha256": "23219434713fbd283a1e5cb1a373ed9d19d0963e171636dbf39bed3d60cd1316"
},
{
"path": "packages/webui/tests/tester-fixture.mjs",
@@ -174,13 +190,13 @@
},
{
"path": "scripts/stack-release.sh",
"baselineSha256": "5bb3ac40102ce515f1acdcbc5670feb161ce40a193e94e2f8b104ebf98eddc38",
"candidateSha256": "59b39d63feb77f22abb4b7152c18feff53715cf3a10dde6374c69615329868c7"
"baselineSha256": "1896d6518a502d340dfe30d402102b8c5cd5d8520757387b018b636755eb5d36",
"candidateSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
},
{
"path": "scripts/webui-service.sh",
"baselineSha256": "d514caf757c03e5d02ef39b19359669bd2476dca1877f5d237c65bd62c33d2bf",
"candidateSha256": "67cc347231d4410acf0fd845bde58aeabf099d1d6cf3e36efda4db66c5438c10"
"baselineSha256": "39f2b8e4384978538337d85d740a3eaf68b28529c0e7cfdaca105b9177ed678a",
"candidateSha256": "6e7069cca9f7aef84c17f15611f2d7e0d09083a363c23da8dbd14d3ed29f0f40"
}
]
}
+2
View File
@@ -28,3 +28,5 @@ sage-2096 ended at stop 3: whole bus 622/0/0 in 36.272 s; whole WebUI 303/1/1 in
mos-1198 approves fourth run after Gizmoduck 250 r2 with Sage grant, r5 only activation flag change and BUILD note, exact name/assertions retained. New branch r5 a415de022 is one commit on retained r4; wider unpublished draft preserved on gander/row196-r5-draft. All 595 product blobs match r4 by SHA256. r5/TESTER-PORT-AUDIT.md lists scripts and tests, including case2-unit/case1-accept for Sage's chained follow-up. Sent gander-0049/50. No tests since stop3. mos-1199 requires all queue196 records committed/pushed before fourth grant, no product or node_modules changes. Next message gander-0051.
Fourth run sage-2113/2120 at 91e3696ef: WebUI whole 304/0/1 in 112.143 s. CLI mandatory busy preflight refused on Sage queue add sage-2122a PID 2054449, so no CLI, extras or shells started. Driver stopped; no rerun. gander-0052 simultaneously reported Sage and Mos and returned slot. Sweep gate leftovers 0, eight pre-existing harness helpers. r5/gate/RESULTS.md and raw logs retain evidence. Await Mos ruling and Sage grant; no fifth run.
Run 4 complete, sage-2124 on 05e940117: 1330/0 continuation, 2256/0/1 combined golden, 30 kills. Slot returned 20:02:08Z in gander-0056, sweep gate leftovers 0. Final manifest and SHA files prepared from immutable candidate for Duckworth merge-scoped review; no product edit, rebase, merge or activation. Queue writes batched under sage-2127 after Sage queue-commit, then hold for Megavolt.
@@ -0,0 +1,66 @@
# Run 4 completed
Candidate 05e940117; no rebase. Continuation grant sage-2124. CLI, all eight union files and all ten shell scripts ran whole, with busy &&, pipefail, tee and scratch TMPDIR.
| Step | Pass | Fail | Skip | Wall seconds |
|---|---:|---:|---:|---:|
| bus | 622 | 0 | 0 | 36.272237 |
| webui | 304 | 0 | 1 | 112.142839 |
| cli | 735 | 0 | 0 | 574.436202 |
| packages_business_tests_business.test.mjs | 19 | 0 | 0 | 1.523933 |
| packages_business_tests_cli.test.mjs | 10 | 0 | 0 | 3.466997 |
| packages_business_tests_instance-settings.test.mjs | 13 | 0 | 0 | 1.905684 |
| packages_business_tests_library-projects-protected.test.mjs | 4 | 0 | 0 | 1.477437 |
| packages_business_tests_resolve.test.mjs | 11 | 0 | 0 | 1.446584 |
| packages_library_tests_mirror.test.mjs | 16 | 0 | 0 | 7.333578 |
| packages_project_tests_project.test.mjs | 15 | 0 | 0 | 1.726089 |
| packages_seat_tests_checkout.test.mjs | 78 | 0 | 0 | 6.367270 |
| test-auth.sh | 15 | 0 | 0 | 1.906329 |
| test-conductor.sh | 17 | 0 | 0 | 6.837641 |
| test-config.sh | 31 | 0 | 0 | 3.154425 |
| test-discord.sh | 78 | 0 | 0 | 8.776728 |
| test-extension-package.sh | 18 | 0 | 0 | 3.012857 |
| test-foundation.sh | 44 | 0 | 0 | 39.708726 |
| test-land-work.sh | 86 | 0 | 0 | 12.623263 |
| test-queue.sh | 28 | 0 | 0 | 23.443742 |
| test-release.sh | 14 | 0 | 0 | 12.168674 |
| test-task.sh | 98 | 0 | 0 | 36.783798 |
Continuation: 1330 pass, 0 fail, 0 skip. Combined golden: 2256 pass, 0 fail, 1 skip. Counts and wall times are summed from the raw JSON/log summaries by finalize.py. One Node editor skip is carried from WebUI. test-queue also explicitly skips canonical-only verify/render checks in this scratch checkout; shell pass/fail totals do not count those skips. No new tests ran while producing this report.
Zero gate leftovers. Eight pre-existing harness helpers remain, all previously accepted as outside the gate. Slot returned in gander-0056 at 20:02:08Z.
| Mutant | Killed | Target | Accepted evidence |
|---|---|---|---|
| M1 | yes | packages/webui/src/serve.mjs | r2/mutants |
| M2 | yes | packages/webui/src/tester-socket.mjs | r2/mutants |
| M3 | yes | packages/webui/src/serve.mjs | r2/mutants |
| M4 | yes | packages/bus/src/principal.mjs | r2/mutants |
| M5 | yes | packages/bus/src/peercred.mjs | r2/mutants |
| M6 | yes | packages/bus/src/principal.mjs | r2/mutants |
| M7 | yes | packages/webui/src/tester-socket.mjs | r2/mutants |
| M8 | yes | packages/bus/src/human.mjs | r2/mutants |
| M9 | yes | packages/bus/src/human.mjs | r2/mutants |
| M10 | yes | packages/bus/src/principal.mjs | r2/mutants |
| M11 | yes | packages/bus/src/principal.mjs | r2/mutants |
| M12 | yes | packages/bus/src/human.mjs | r2/mutants |
| M13 | yes | packages/bus/src/server.mjs | r4/gate/killers |
| M14 | yes | packages/bus/src/principal.mjs | r2/mutants |
| M15 | yes | scripts/stack-release.sh | r2/mutants |
| M16 | yes | scripts/stack-release.sh | r2/mutants |
| M17 | yes | packages/bus/src/broker.mjs | r4/gate/killers |
| M18 | yes | packages/bus/src/principal.mjs | r2/mutants |
| M19 | yes | packages/cli/src/tester-http.mjs | r2/mutants |
| M20 | yes | packages/bus/src/peercred.mjs | r2/mutants |
| M21 | yes | packages/bus/src/interpreter.mjs | r2/mutants |
| M22 | yes | packages/bus/src/server.mjs | r4/gate/killers |
| M23 | yes | packages/bus/src/interpreter.mjs | r2/run2/killers |
| M24 | yes | packages/webui/src/tester-socket.mjs | r2/run2/killers |
| M25 | yes | packages/bus/src/interpreter.mjs | r3/gate/killers |
| M26 | yes | packages/bus/src/peercred.mjs | r2/run2/killers |
| M27 | yes | packages/bus/src/peercred.mjs | r2/run2/killers |
| M28 | yes | scripts/stack-release.sh | r3/gate/killers |
| M28b | yes | scripts/stack-release.sh | r3/gate/killers |
| M29 | yes | scripts/stack-release.sh | r3/gate/killers |
All 595 product blobs match r4. Mutant target restoration hashes and clean-tree checks are in their original result records; carry uses target SHA equality per sage-2096 and full product equality per mos-1198. Raw failed/survivor runs remain as historical evidence and are not relabeled.
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,38 @@
START cli 50 whole file(s)
END cli {"code":0,"signal":null,"pass":735,"fail":0,"skip":0,"wallSeconds":574.4362024449999,"stopped":false}
START packages_business_tests_business.test.mjs 1 whole file(s)
END packages_business_tests_business.test.mjs {"code":0,"signal":null,"pass":19,"fail":0,"skip":0,"wallSeconds":1.5239333430000115,"stopped":false}
START packages_business_tests_cli.test.mjs 1 whole file(s)
END packages_business_tests_cli.test.mjs {"code":0,"signal":null,"pass":10,"fail":0,"skip":0,"wallSeconds":3.4669965549999615,"stopped":false}
START packages_business_tests_instance-settings.test.mjs 1 whole file(s)
END packages_business_tests_instance-settings.test.mjs {"code":0,"signal":null,"pass":13,"fail":0,"skip":0,"wallSeconds":1.905683660000097,"stopped":false}
START packages_business_tests_library-projects-protected.test.mjs 1 whole file(s)
END packages_business_tests_library-projects-protected.test.mjs {"code":0,"signal":null,"pass":4,"fail":0,"skip":0,"wallSeconds":1.4774370280000149,"stopped":false}
START packages_business_tests_resolve.test.mjs 1 whole file(s)
END packages_business_tests_resolve.test.mjs {"code":0,"signal":null,"pass":11,"fail":0,"skip":0,"wallSeconds":1.4465837360000005,"stopped":false}
START packages_library_tests_mirror.test.mjs 1 whole file(s)
END packages_library_tests_mirror.test.mjs {"code":0,"signal":null,"pass":16,"fail":0,"skip":0,"wallSeconds":7.3335777119999985,"stopped":false}
START packages_project_tests_project.test.mjs 1 whole file(s)
END packages_project_tests_project.test.mjs {"code":0,"signal":null,"pass":15,"fail":0,"skip":0,"wallSeconds":1.7260885409999174,"stopped":false}
START packages_seat_tests_checkout.test.mjs 1 whole file(s)
END packages_seat_tests_checkout.test.mjs {"code":0,"signal":null,"pass":78,"fail":0,"skip":0,"wallSeconds":6.367270185999922,"stopped":false}
START test-auth.sh 1 whole file(s)
END test-auth.sh {"code":0,"signal":null,"pass":15,"fail":0,"skip":0,"wallSeconds":1.9063287659999915,"stopped":false}
START test-conductor.sh 1 whole file(s)
END test-conductor.sh {"code":0,"signal":null,"pass":17,"fail":0,"skip":0,"wallSeconds":6.837640707000042,"stopped":false}
START test-config.sh 1 whole file(s)
END test-config.sh {"code":0,"signal":null,"pass":31,"fail":0,"skip":0,"wallSeconds":3.1544246460000287,"stopped":false}
START test-discord.sh 1 whole file(s)
END test-discord.sh {"code":0,"signal":null,"pass":78,"fail":0,"skip":0,"wallSeconds":8.776727847000002,"stopped":false}
START test-extension-package.sh 1 whole file(s)
END test-extension-package.sh {"code":0,"signal":null,"pass":18,"fail":0,"skip":0,"wallSeconds":3.01285702399991,"stopped":false}
START test-foundation.sh 1 whole file(s)
END test-foundation.sh {"code":0,"signal":null,"pass":44,"fail":0,"skip":0,"wallSeconds":39.70872647900006,"stopped":false}
START test-land-work.sh 1 whole file(s)
END test-land-work.sh {"code":0,"signal":null,"pass":86,"fail":0,"skip":0,"wallSeconds":12.623263413000037,"stopped":false}
START test-queue.sh 1 whole file(s)
END test-queue.sh {"code":0,"signal":null,"pass":28,"fail":0,"skip":0,"wallSeconds":23.443742031000088,"stopped":false}
START test-release.sh 1 whole file(s)
END test-release.sh {"code":0,"signal":null,"pass":14,"fail":0,"skip":0,"wallSeconds":12.168674453999964,"stopped":false}
START test-task.sh 1 whole file(s)
END test-task.sh {"code":0,"signal":null,"pass":98,"fail":0,"skip":0,"wallSeconds":36.783798266,"stopped":false}
@@ -0,0 +1,78 @@
# One-shot record generator run after the gate, using the prior draft manifest.
import json,hashlib,subprocess
from pathlib import Path
root=Path('agents/gander/work/queue-196');out=root/'r5/resume';candidate='05e940117';base='e54e05463'
def git(*a):return subprocess.check_output(['git',*a],stderr=subprocess.DEVNULL)
def sha(b):return hashlib.sha256(b).hexdigest()
files=git('diff','--name-only',base,candidate,'--','packages','scripts','docs/TOOLS.md').decode().splitlines()
rows=[]
for f in files:
try:old=sha(git('show',base+':'+f))
except subprocess.CalledProcessError:old=None
rows.append(dict(path=f,baselineSha256=old,candidateSha256=sha(git('show',candidate+':'+f))))
(root/'PRODUCT-FILES.json').write_text(json.dumps(dict(status='verified immutable candidate',base=base,candidate=candidate,files=rows),indent=2)+'\n')
(root/'CANDIDATE.sha256').write_text(''.join(f"{r['candidateSha256']} {r['path']}\n" for r in rows))
# Extend the complete r4/r5 product equality record to this immutable gate tip.
prior=json.loads((root/'r5/product-shas.json').read_text());matches=[]
for r in prior['files']:
h=sha(git('show',candidate+':'+r['path']))
assert h==r['r4Sha256'],r['path']
matches.append(dict(path=r['path'],sha256=h))
(out/'product-equality.json').write_text(json.dumps(dict(r4=prior['r4'],candidate=candidate,count=len(matches),changed=[],files=matches),indent=2)+'\n')
res=json.loads((out/'whole-results.json').read_text());web=json.loads((root/'r5/gate/whole-results.json').read_text())[0];bus=json.loads((root/'r4/gate/whole-results.json').read_text())[0]
assert len(res)==19 and all(r['complete'] and r['code']==0 and r['fail']==0 for r in res)
kills=json.loads((root/'r4/gate/consolidated-kills.json').read_text());assert len(kills['rows'])==30 and all(x['killed'] for x in kills['rows'])
sweep=json.loads((out/'process-sweep.json').read_text());assert sweep['gateLeftoverCount']==0
allres=[bus,web,*res]
def totals(rs):return dict(passCount=sum(x['pass'] for x in rs),failCount=sum(x['fail'] for x in rs),skipCount=sum(x['skip'] for x in rs),wallSeconds=sum(x['wallSeconds'] for x in rs))
summary=dict(candidate=candidate,base=base,grants=['sage-2096','sage-2113','sage-2120','sage-2124'],continuation=totals(res),cli=totals(res[:1]),eightFiles=totals(res[1:9]),shellScripts=totals(res[9:]),golden=totals(allres),mutants=dict(killed=30,total=30,source='r4/gate/consolidated-kills.json'),sweep=sweep)
(out/'summary.json').write_text(json.dumps(summary,indent=2)+'\n')
table='| Step | Pass | Fail | Skip | Wall seconds |\n|---|---:|---:|---:|---:|\n'
for r in allres:table+=f"| {r['name']} | {r['pass']} | {r['fail']} | {r['skip']} | {r['wallSeconds']:.6f} |\n"
kt='| Mutant | Killed | Target | Accepted evidence |\n|---|---|---|---|\n'
for r in kills['rows']:kt+=f"| {r['id']} | yes | {r['targetFile']} | {r['evidenceFolder']} |\n"
(out/'RESULTS.md').write_text('# Run 4 completed\n\nCandidate '+candidate+'; no rebase. Continuation grant sage-2124. CLI, all eight union files and all ten shell scripts ran whole, with busy &&, pipefail, tee and scratch TMPDIR.\n\n'+table+'\nContinuation: 1330 pass, 0 fail, 0 skip. Combined golden: 2256 pass, 0 fail, 1 skip. Counts and wall times are summed from the raw JSON/log summaries by finalize.py. One Node editor skip is carried from WebUI. test-queue also explicitly skips canonical-only verify/render checks in this scratch checkout; shell pass/fail totals do not count those skips. No new tests ran while producing this report.\n\nZero gate leftovers. Eight pre-existing harness helpers remain, all previously accepted as outside the gate. Slot returned in gander-0056 at 20:02:08Z.\n\n'+kt+'\nAll 595 product blobs match r4. Mutant target restoration hashes and clean-tree checks are in their original result records; carry uses target SHA equality per sage-2096 and full product equality per mos-1198. Raw failed/survivor runs remain as historical evidence and are not relabeled.\n')
old=(root/'MANIFEST.md').read_text();items=old[old.index('## Review items'):old.index('## Separate row164 proof baseline update')]
items=items[:items.index('All package paths')]+'''All package paths above are under `packages/`. All 30 mutants are killed, including the distinct M28b SSO insertion mutant. The exact accepted-source table and target hashes are in `r4/gate/consolidated-kills.json`; `r5/resume/RESULTS.md` lists every kill. Original failed/survivor runs remain preserved. No outer timeout was used as an accepted kill in the renewed runs.
Additional review items:
- SSO/socket argument order: the whole stack-release file checks pointer and generated unit order without --send. r4 SSO RED fails with the SSO clause removed, GREEN passes after restoration; M28b kills that exact change. M28 targets only proof insertion. Unique-target guard statically accepts all 30 definitions before mutation starts.
- Row215 callback fixture: r5 changes only `--tester-port`, `7444` to `--tester-socket` in library-cli.test.mjs. The test name and every assertion match e54e05463 byte for byte. Its existing loader captures library.file/library.status from both listener callback pairs. Whole WebUI now passes the case. `r5/assertions-unchanged.json` proves the narrow diff; Duckworth's hunk check passed per sage-2120.
'''
repin=old[old.index('## Separate row164 proof baseline update'):old.index('## Gate history and remaining evidence')]
repin=repin.replace('These hashes must be checked again\nagainst the final candidate before review.','Both candidate hashes were checked against immutable 05e940117 and match the table.')
repin+='''Remaining legacy installer/acceptance consumers are explicitly outside r5: scripts/case2-unit.sh and scripts/case1-accept.sh. `r5/TESTER-PORT-AUDIT.md` and tester-port-occurrences.json inventory every source/test/generator occurrence, including deliberate old-copy and negative cases. They are input to Sage's follow-up chained after 196. Their stand-in contract tests passing does not prove those legacy units can start the new tester.
'''
refused=old[old.index('## Refused caller behavior and static review'):]
refused=refused.replace('Each has a focused test and prepared mutant.','Each has a focused test and a killed mutant.').replace('No further implementation changes are planned before the authorized batch.','The authorized golden files are complete. No live activation or uid window was run.')
r2=(root/'r2/REBASE.md').read_text();merge=r2[r2.index('## Merge reasoning for the ten conflicted files'):r2.index('## First r2 slot')]
r4=(root/'r4/REBASE.md').read_text();merge+='\n'+r4[r4.index('## Every conflicted hunk'):r4.index('Mutated paths now')]
header='''# Row 196 merge-scoped review manifest
Candidate: **05e940117**, on e54e05463, branch gander/row196-r5. Its product/test bytes equal 91e3696ef; the difference is records only. No rebase after Sage's sage-2124 choice. Approved design r3 is 4d26003f7 (duckworth-0009/0015, sage-1371). This packet requests Duckworth's manifest review before Sage's gate, not merge, deployment or a live re-pin.
`CANDIDATE.sha256` freezes the changed product, tests, fixtures and operator docs from e54e05463 to 05e940117. `PRODUCT-FILES.json` gives baseline and candidate SHA256 for each path. All hashes come from immutable Git blobs, not a dirty tree. Final record commits change agents/gander/work/queue-196 only and do not alter the frozen candidate. Row252 design/notes carried in history are separate and contain no row252 product code.
## Acceptance evidence
Golden totals: **2256 pass, 0 fail, 1 editor skip**. Mutants: **30/30 killed**. No test rerun followed the completed grant. Gate tracked tree clean; only the expected node_modules symlink is untracked. Sweep: **0 gate leftovers**, eight pre-existing harness helpers retained. Slot returned in gander-0056 at 20:02:08Z.
Bus whole ran on r4 f8a59e6aa; WebUI whole ran on 91e3696ef; remaining files ran on 05e940117. All 595 product blobs match r4, and candidate/test bytes match 91e3696ef. `r5/resume/product-equality.json` extends the SHA proof to the frozen tip. Carry was expressly accepted by mos-1198/1200 and sage-2113/2124.
'''
gates='''## Gate history and controls
Raw records are preserved under r2/, r3/, r4/ and r5/. r2 stop 1 fixed runtime SyntaxError classification in the driver, separate from --check syntax preflight, and recorded GNU timeout process-group cleanup. Stop 2 exposed non-unique M28 targeting; the SSO product test and exact M28b guard followed. M5's old/new mutated bytes matched; M25's differed and it reran. r3 was withdrawn only because row215 landed, not counted as a stop. r4 refreshed changed-target M13/M17/M22; all other target hashes matched accepted runs. r4 WebUI then failed on the legacy library CLI activation, stop 3. Mos approved the sole test flag repair in r5.
The first r5 segment passed WebUI but its CLI busy check refused Sage's queue write. mos-1200 ruled that the refusal is not a stop: the guard worked. sage-2124 resumed only unstarted scope, now all green. No fifth full run occurred. All original wording/logs and corrections remain in BUILD.md and records.
Each start was gated by the canonical busy check with only current-driver ancestor PIDs excluded, &&, pipefail and tee. TMPDIR paths were made by mktemp under /mnt/storage/scratch/tmp. Whole files ran, including the eight-file union from row215. The editor rebuild skip reflects shared esbuild 0.28.1 versus required 0.28.2; no dependency install was performed. test-queue prints a deliberate canonical-only verify/render skip in a scratch checkout. No real uid, live units, live ports or real provider was exercised.
'''
(root/'MANIFEST.md').write_text(header+table+'\nRaw results: r4/gate/whole-results.json (bus), r5/gate/whole-results.json (WebUI), r5/resume/whole-results.json (remainder). Full logs are adjacent. Exact totals: r5/resume/summary.json.\n\n'+items+repin+gates+merge+'\n'+refused)
with (root/'BUILD.md').open('a') as f:f.write('\n2026-10-21 sage-2124 continuation completed on 05e940117: CLI whole 735/0; eight union files 166/0; ten scripts/test-*.sh 429/0. Combined with carried bus/WebUI: 2256 pass, 0 fail, 1 editor skip; 30/30 mutants killed. Counts/times are script-summed in r5/resume/summary.json. Sweep gate leftovers 0, eight pre-existing helpers remain. Slot returned gander-0056. MANIFEST.md, CANDIDATE.sha256 and PRODUCT-FILES.json freeze immutable 05e940117 for Duckworth. No live activation or merge authorized.\n')
with (root/'PROGRESS.md').open('a') as f:f.write('\nRun 4 complete, sage-2124 on 05e940117: 1330/0 continuation, 2256/0/1 combined golden, 30 kills. Slot returned 20:02:08Z in gander-0056, sweep gate leftovers 0. Final manifest and SHA files prepared from immutable candidate for Duckworth merge-scoped review; no product edit, rebase, merge or activation. Queue writes batched under sage-2127 after Sage queue-commit, then hold for Megavolt.\n')
print(json.dumps(summary,indent=2)[:1700]);print('candidate manifest',len(rows),'paths',sha((root/'CANDIDATE.sha256').read_bytes()))
@@ -0,0 +1,133 @@
{
"count": 21,
"passCount": 2256,
"failCount": 0,
"logs": [
{
"log": "r4/gate/bus.log",
"sha256": "2c6dfc63cf0251fdb40baa9bdcf19068f6cfb3c54c1fed175fb4126e31638f00",
"passCount": 622,
"failCount": 0
},
{
"log": "r5/gate/webui.log",
"sha256": "182939517813cb10027d14cd1b0236daecfe65bf13117e586a7891ea023634c2",
"passCount": 304,
"failCount": 0
},
{
"log": "r5/resume/cli.log",
"sha256": "1771a5a5de7e811689be432ed13d3f0f68e1109f720ac18d3ed0619982c75549",
"passCount": 735,
"failCount": 0
},
{
"log": "r5/resume/packages_business_tests_business.test.mjs.log",
"sha256": "8d870ce6f0f994d91f19c81534aed9680029ba1a7c8003b56fc543966a82c9f8",
"passCount": 19,
"failCount": 0
},
{
"log": "r5/resume/packages_business_tests_cli.test.mjs.log",
"sha256": "06d3c248b298909d2316810da5fe5ab0f08c7bf9eb1ae65554519fcff8d85804",
"passCount": 10,
"failCount": 0
},
{
"log": "r5/resume/packages_business_tests_instance-settings.test.mjs.log",
"sha256": "c9d9e4f49bda11737e55d5f9a270e6e679719a0502cea80a43cc7ed863666fe0",
"passCount": 13,
"failCount": 0
},
{
"log": "r5/resume/packages_business_tests_library-projects-protected.test.mjs.log",
"sha256": "c69e4665c8ac1e6e79a83455818ed3dde517ac85236ef58df9f8f04088ca6c5d",
"passCount": 4,
"failCount": 0
},
{
"log": "r5/resume/packages_business_tests_resolve.test.mjs.log",
"sha256": "ea2820110fbc799d9743168e6f06cd1b30d949063ac112659351e7c01e736a62",
"passCount": 11,
"failCount": 0
},
{
"log": "r5/resume/packages_library_tests_mirror.test.mjs.log",
"sha256": "d8670a189ffcbfd7f118a1188d713a2585884b25adc8622b5bda899804a413f8",
"passCount": 16,
"failCount": 0
},
{
"log": "r5/resume/packages_project_tests_project.test.mjs.log",
"sha256": "ac5946ac5e32bd7a591a6de9e99a904c6233e5355ea733e3be71150eeb4fefab",
"passCount": 15,
"failCount": 0
},
{
"log": "r5/resume/packages_seat_tests_checkout.test.mjs.log",
"sha256": "a6175a856b86d4fcd67484ba776dd8055d35ce1df383f8f0951f2c15b4fa464f",
"passCount": 78,
"failCount": 0
},
{
"log": "r5/resume/test-auth.sh.log",
"sha256": "f3784a0f42d8d6b7947bbfcad6038cee8ba0bf81067addfebd3ae2094bf1f916",
"passCount": 15,
"failCount": 0
},
{
"log": "r5/resume/test-conductor.sh.log",
"sha256": "6e6dd7b3c192a4b4af949b98662c3de99bb53cf74b5882dc4b4d655b40548e8a",
"passCount": 17,
"failCount": 0
},
{
"log": "r5/resume/test-config.sh.log",
"sha256": "2e41f642485407cea7d4d3b1dc180bda27d944c8af9af5d80ab1bdc0f5b54d5c",
"passCount": 31,
"failCount": 0
},
{
"log": "r5/resume/test-discord.sh.log",
"sha256": "6c9c61092fc049545464959009fad551caaabdaa6b4433ea6812e28a49137824",
"passCount": 78,
"failCount": 0
},
{
"log": "r5/resume/test-extension-package.sh.log",
"sha256": "78e6425e3c1458c4f0e5c68f3e64432717494d1d3ddfa3086602238c3a222f05",
"passCount": 18,
"failCount": 0
},
{
"log": "r5/resume/test-foundation.sh.log",
"sha256": "26fd7d925f0cd5cbf4477ab7354eaf950cb096718046a5c8a12f123415b7463e",
"passCount": 44,
"failCount": 0
},
{
"log": "r5/resume/test-land-work.sh.log",
"sha256": "9b32bc54922584b4da25b51301fbc350e9073096cda93b366155664570e35d11",
"passCount": 86,
"failCount": 0
},
{
"log": "r5/resume/test-queue.sh.log",
"sha256": "20050cb4ebf0dc7217351fd6f1484fae68f30e56123513c63c5fc81dbf10f70d",
"passCount": 28,
"failCount": 0
},
{
"log": "r5/resume/test-release.sh.log",
"sha256": "bc4352fe2bc362875a7b12dd7126f1f8290e2411b6c7801b23a3fd75c98adb82",
"passCount": 14,
"failCount": 0
},
{
"log": "r5/resume/test-task.sh.log",
"sha256": "a7120694673b68261333445289755d748fe2b7bb6f4c9d5f4241cbc7b9aa1405",
"passCount": 98,
"failCount": 0
}
]
}
@@ -0,0 +1,125 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: C2-04: library mappings load without roots, remain frozen, and retain mapping refusals
ok 1 - C2-04: library mappings load without roots, remain frozen, and retain mapping refusals
---
duration_ms: 8.987372
type: 'test'
...
# Subtest: C2-04: an otherwise valid publish grant cannot name a library repo
ok 2 - C2-04: an otherwise valid publish grant cannot name a library repo
---
duration_ms: 1.86676
type: 'test'
...
# Subtest: config directory and file path follow MOSAIC_CONFIG
ok 3 - config directory and file path follow MOSAIC_CONFIG
---
duration_ms: 0.192309
type: 'test'
...
# Subtest: the fixture business validates and comes back frozen
ok 4 - the fixture business validates and comes back frozen
---
duration_ms: 0.871925
type: 'test'
...
# Subtest: two instances may share a definition
ok 5 - two instances may share a definition
---
duration_ms: 0.830918
type: 'test'
...
# Subtest: top-level refusals
ok 6 - top-level refusals
---
duration_ms: 2.701948
type: 'test'
...
# Subtest: arbiters and projects
ok 7 - arbiters and projects
---
duration_ms: 4.113307
type: 'test'
...
# Subtest: role instances
ok 8 - role instances
---
duration_ms: 1.99159
type: 'test'
...
# Subtest: Vikunja bots
ok 9 - Vikunja bots
---
duration_ms: 4.890541
type: 'test'
...
# Subtest: a role without Vikunja takes no tracker block
ok 10 - a role without Vikunja takes no tracker block
---
duration_ms: 2.101637
type: 'test'
...
# Subtest: credential references match the definition's services
ok 11 - credential references match the definition's services
---
duration_ms: 2.300185
type: 'test'
...
# Subtest: launch
ok 12 - launch
---
duration_ms: 7.246556
type: 'test'
...
# Subtest: REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses
ok 13 - REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses
---
duration_ms: 3.957414
type: 'test'
...
# Subtest: loadBusiness: file checks
ok 14 - loadBusiness: file checks
---
duration_ms: 1.667648
type: 'test'
...
# Subtest: loadBusiness: not a regular file
ok 15 - loadBusiness: not a regular file
---
duration_ms: 40.067804
type: 'test'
...
# Subtest: loading writes nothing
ok 16 - loading writes nothing
---
duration_ms: 1.285413
type: 'test'
...
# Subtest: names that are Object.prototype properties don't count as declared
ok 17 - names that are Object.prototype properties don't count as declared
---
duration_ms: 2.806511
type: 'test'
...
# Subtest: the shipped example refuses as written and validates once filled in
ok 18 - the shipped example refuses as written and validates once filled in
---
duration_ms: 0.771432
type: 'test'
...
# Subtest: persona vars: agent layer, creative definition only, both or neither
ok 19 - persona vars: agent layer, creative definition only, both or neither
---
duration_ms: 7.891607
type: 'test'
...
1..19
# tests 19
# suites 0
# pass 19
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 151.353795
@@ -0,0 +1,71 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: C2-04: business validate and resolve skip a library before code projects and credential checks
ok 1 - C2-04: business validate and resolve skip a library before code projects and credential checks
---
duration_ms: 191.87287
type: 'test'
...
# Subtest: usage errors exit 4
ok 2 - usage errors exit 4
---
duration_ms: 268.990052
type: 'test'
...
# Subtest: validate: a good business exits 0 and prints instance digests
ok 3 - validate: a good business exits 0 and prints instance digests
---
duration_ms: 65.127852
type: 'test'
...
# Subtest: validate: project files
ok 4 - validate: project files
---
duration_ms: 309.214757
type: 'test'
...
# Subtest: validate: missing files and a broken system config
ok 5 - validate: missing files and a broken system config
---
duration_ms: 252.410805
type: 'test'
...
# Subtest: validate: credential reference problems exit 2 and name each one
ok 6 - validate: credential reference problems exit 2 and name each one
---
duration_ms: 66.348923
type: 'test'
...
# Subtest: validate: a token file inside the repository is refused
ok 7 - validate: a token file inside the repository is refused
---
duration_ms: 68.501715
type: 'test'
...
# Subtest: validate: role definitions come from MOSAIC_ROLES_DIR
ok 8 - validate: role definitions come from MOSAIC_ROLES_DIR
---
duration_ms: 185.324228
type: 'test'
...
# Subtest: resolve: prints one instance's record
ok 9 - resolve: prints one instance's record
---
duration_ms: 256.11754
type: 'test'
...
# Subtest: resolve: refusals
ok 10 - resolve: refusals
---
duration_ms: 370.158353
type: 'test'
...
1..10
# tests 10
# suites 0
# pass 10
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 2087.019533
@@ -0,0 +1,89 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: C2-04: instance settings skip a library while checking a later code project
ok 1 - C2-04: instance settings skip a library while checking a later code project
---
duration_ms: 24.315172
type: 'test'
...
# Subtest: row 165 read lists each instance and the definitions add accepts
ok 2 - row 165 read lists each instance and the definitions add accepts
---
duration_ms: 2.5
type: 'test'
...
# Subtest: row 165 add: two instances join, validate exits 0, the log names the human, and the bus restart is reported
ok 3 - row 165 add: two instances join, validate exits 0, the log names the human, and the bus restart is reported
---
duration_ms: 79.317083
type: 'test'
...
# Subtest: row 165 change: definition, vars and launch membership log before and after; only a definition change asks for a restart
ok 4 - row 165 change: definition, vars and launch membership log before and after; only a definition change asks for a restart
---
duration_ms: 95.585844
type: 'test'
...
# Subtest: row 165 refuses each validation failure and leaves the file's bytes alone
ok 5 - row 165 refuses each validation failure and leaves the file's bytes alone
---
duration_ms: 30.991803
type: 'test'
...
# Subtest: row 165 refuses an added instance whose definition declares credentials, and says why
ok 6 - row 165 refuses an added instance whose definition declares credentials, and says why
---
duration_ms: 3.496391
type: 'test'
...
# Subtest: row 165 refuses a definition change to or from one that declares credentials
ok 7 - row 165 refuses a definition change to or from one that declares credentials
---
duration_ms: 4.758936
type: 'test'
...
# Subtest: row 165 a vars or launch change on an instance with its binding succeeds and keeps the binding
ok 8 - row 165 a vars or launch change on an instance with its binding succeeds and keeps the binding
---
duration_ms: 69.17592
type: 'test'
...
# Subtest: row 165 refuses an END_PROTECTED definition and every change to a protected instance
ok 9 - row 165 refuses an END_PROTECTED definition and every change to a protected instance
---
duration_ms: 8.070069
type: 'test'
...
# Subtest: row 165 refuses while a project file doesn't resolve, as validate would
ok 10 - row 165 refuses while a project file doesn't resolve, as validate would
---
duration_ms: 14.626067
type: 'test'
...
# Subtest: row 165 refuses a stale revision and leaves the file's bytes alone
ok 11 - row 165 refuses a stale revision and leaves the file's bytes alone
---
duration_ms: 10.074757
type: 'test'
...
# Subtest: row 65 an instance write refuses harness-off, thinking-unsupported, an unknown model and a partial fallback
ok 12 - row 65 an instance write refuses harness-off, thinking-unsupported, an unknown model and a partial fallback
---
duration_ms: 31.631331
type: 'test'
...
# Subtest: row 213 a creative instance is the human's: add, vars and definition changes, persona digest only
ok 13 - row 213 a creative instance is the human's: add, vars and definition changes, persona digest only
---
duration_ms: 82.378542
type: 'test'
...
1..13
# tests 13
# suites 0
# pass 13
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 526.666112
@@ -0,0 +1,35 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: C2-04 M9: changed playground and hybrid entries leave business and changes.jsonl byte-identical
ok 1 - C2-04 M9: changed playground and hybrid entries leave business and changes.jsonl byte-identical
---
duration_ms: 19.914117
type: 'test'
...
# Subtest: C2-04 M9: code projects, additions, deletions and array changes are protected too
ok 2 - C2-04 M9: code projects, additions, deletions and array changes are protected too
---
duration_ms: 14.897569
type: 'test'
...
# Subtest: C2-04 M9: canonical key order is allowed and a non-project setter still records its change
ok 3 - C2-04 M9: canonical key order is allowed and a non-project setter still records its change
---
duration_ms: 12.192914
type: 'test'
...
# Subtest: C2-04 M9: a serialization hook cannot change projects after the canonical comparison
ok 4 - C2-04 M9: a serialization hook cannot change projects after the canonical comparison
---
duration_ms: 10.025512
type: 'test'
...
1..4
# tests 4
# suites 0
# pass 4
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 105.158418
@@ -0,0 +1,77 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: C2-04: a library first in projects does not hide a later project layer
ok 1 - C2-04: a library first in projects does not hide a later project layer
---
duration_ms: 6.343507
type: 'test'
...
# Subtest: systemVars flattens the validated config
ok 2 - systemVars flattens the validated config
---
duration_ms: 0.816406
type: 'test'
...
# Subtest: precedence: system, business, project, project role, agent
ok 3 - precedence: system, business, project, project role, agent
---
duration_ms: 1.514437
type: 'test'
...
# Subtest: limits narrow the definition and never widen it
ok 4 - limits narrow the definition and never widen it
---
duration_ms: 1.864065
type: 'test'
...
# Subtest: role.launch stays within-role only for the instance the launch block names
ok 5 - role.launch stays within-role only for the instance the launch block names
---
duration_ms: 4.147353
type: 'test'
...
# Subtest: limits.authority without role.launch leaves the launcher with no launch block
ok 6 - limits.authority without role.launch leaves the launcher with no launch block
---
duration_ms: 1.770761
type: 'test'
...
# Subtest: limits.authority narrows cross-role actions too
ok 7 - limits.authority narrows cross-role actions too
---
duration_ms: 0.811109
type: 'test'
...
# Subtest: classify
ok 8 - classify
---
duration_ms: 0.816881
type: 'test'
...
# Subtest: the record carries what the broker and launcher need
ok 9 - the record carries what the broker and launcher need
---
duration_ms: 0.775312
type: 'test'
...
# Subtest: digest: key order doesn't matter, any value change does
ok 10 - digest: key order doesn't matter, any value change does
---
duration_ms: 5.532201
type: 'test'
...
# Subtest: refusals
ok 11 - refusals
---
duration_ms: 1.72647
type: 'test'
...
1..11
# tests 11
# suites 0
# pass 11
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 78.827289
@@ -0,0 +1,107 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: C2-04 mirror: exact default path, bare without checkout or remote, and idempotent initialization
ok 1 - C2-04 mirror: exact default path, bare without checkout or remote, and idempotent initialization
---
duration_ms: 35.743741
type: 'test'
...
# Subtest: C2-04 mirror: simultaneous creators publish one intact mirror and leave no staging paths
ok 2 - C2-04 mirror: simultaneous creators publish one intact mirror and leave no staging paths
---
duration_ms: 27.980754
type: 'test'
...
# Subtest: C2-04 mirror: skipped publication accepts both coreutils statuses without removing the winner
ok 3 - C2-04 mirror: skipped publication accepts both coreutils statuses without removing the winner
---
duration_ms: 103.960919
type: 'test'
...
# Subtest: C2-04 mirror: preserve occupied directories and reject symlink ancestors and code overlaps
ok 4 - C2-04 mirror: preserve occupied directories and reject symlink ancestors and code overlaps
---
duration_ms: 11.591223
type: 'test'
...
# Subtest: C2-04 mirror: existing metadata accepts only bare Git plus state and the precreated lock
ok 5 - C2-04 mirror: existing metadata accepts only bare Git plus state and the precreated lock
---
duration_ms: 19.961648
type: 'test'
...
# Subtest: C2-04 state: missing state is empty only while the served ref is absent
ok 6 - C2-04 state: missing state is empty only while the served ref is absent
---
duration_ms: 33.378126
type: 'test'
...
# Subtest: C2-04 state: valid problems and sync metadata return no content and change no state bytes
ok 7 - C2-04 state: valid problems and sync metadata return no content and change no state bytes
---
duration_ms: 34.786283
type: 'test'
...
# Subtest: C2-04 state: strict keys, types, times, branch, commit and fixed R messages fail closed
ok 8 - C2-04 state: strict keys, types, times, branch, commit and fixed R messages fail closed
---
duration_ms: 93.715761
type: 'test'
...
# Subtest: C2-04 state: symlink, hardlink, non-private state and missing lock refuse without replacement
ok 9 - C2-04 state: symlink, hardlink, non-private state and missing lock refuse without replacement
---
duration_ms: 27.845883
type: 'test'
...
# Subtest: C2-04 file: served commit, not HEAD or a caller commit, owns the exact returned text
ok 10 - C2-04 file: served commit, not HEAD or a caller commit, owns the exact returned text
---
duration_ms: 69.928541
type: 'test'
...
# Subtest: C2-04 file: R1, R2 and R7 exclusions and never-synced mirrors cannot return file bodies
ok 11 - C2-04 file: R1, R2 and R7 exclusions and never-synced mirrors cannot return file bodies
---
duration_ms: 77.347289
type: 'test'
...
# Subtest: C2-04 lock: a first-sync and fast-forward reader wait for a consistent pair across processes
ok 12 - C2-04 lock: a first-sync and fast-forward reader wait for a consistent pair across processes
---
duration_ms: 234.02448
type: 'test'
...
# Subtest: C2-04 lock: same-process waits, timeout code, callback expiry and throw release
ok 13 - C2-04 lock: same-process waits, timeout code, callback expiry and throw release
---
duration_ms: 5027.888576
type: 'test'
...
# Subtest: C2-04 lock: owner death releases the kernel lock without replacing its file
ok 14 - C2-04 lock: owner death releases the kernel lock without replacing its file
---
duration_ms: 56.020414
type: 'test'
...
# Subtest: C2-04 lock: a missing flock binary becomes a handled refusal
ok 15 - C2-04 lock: a missing flock binary becomes a handled refusal
---
duration_ms: 45.111099
type: 'test'
...
# Subtest: C2-04 lock: an unawaited scoped read drains before the lock is released
ok 16 - C2-04 lock: an unawaited scoped read drains before the lock is released
---
duration_ms: 19.75204
type: 'test'
...
1..16
# tests 16
# suites 0
# pass 16
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 5967.136936
@@ -0,0 +1,101 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: C2-04: record APIs refuse a library before creating a repository
ok 1 - C2-04: record APIs refuse a library before creating a repository
---
duration_ms: 2.193211
type: 'test'
...
# Subtest: init creates a checked versioned layout, valid templates and human-authored local history
ok 2 - init creates a checked versioned layout, valid templates and human-authored local history
---
duration_ms: 26.317903
type: 'test'
...
# Subtest: init honors repo, refuses a non-empty directory and an undeclared project without touching files
ok 3 - init honors repo, refuses a non-empty directory and an undeclared project without touching files
---
duration_ms: 13.687062
type: 'test'
...
# Subtest: check reports every bad record, filename mismatch and unknown top-level path
ok 4 - check reports every bad record, filename mismatch and unknown top-level path
---
duration_ms: 12.516997
type: 'test'
...
# Subtest: one writer commits validated docs, requirements and decisions with the bound agent author
ok 5 - one writer commits validated docs, requirements and decisions with the bound agent author
---
duration_ms: 67.9394
type: 'test'
...
# Subtest: writer refuses spec paths, bad schemas, mismatched IDs and invalid actor metadata before changing history
ok 6 - writer refuses spec paths, bad schemas, mismatched IDs and invalid actor metadata before changing history
---
duration_ms: 14.541243
type: 'test'
...
# Subtest: writer refuses human pending edits and remotes instead of absorbing or contacting them
ok 7 - writer refuses human pending edits and remotes instead of absorbing or contacting them
---
duration_ms: 18.237978
type: 'test'
...
# Subtest: links, repo/code overlap, identity mismatch and a busy writer refuse safely
ok 8 - links, repo/code overlap, identity mismatch and a busy writer refuse safely
---
duration_ms: 17.262524
type: 'test'
...
# Subtest: schemas remain package-owned and reject invalid nested data and dates
ok 9 - schemas remain package-owned and reject invalid nested data and dates
---
duration_ms: 0.301662
type: 'test'
...
# Subtest: git commit failure restores only the attempted record and leaves human history unchanged
ok 10 - git commit failure restores only the attempted record and leaves human history unchanged
---
duration_ms: 36.026953
type: 'test'
...
# Subtest: git hooks and ambient git identity cannot alter the record writer or execute outside actions
ok 11 - git hooks and ambient git identity cannot alter the record writer or execute outside actions
---
duration_ms: 25.122439
type: 'test'
...
# Subtest: project-local schemas cannot weaken checks; invalid UTF-8 and linked git directories refuse
ok 12 - project-local schemas cannot weaken checks; invalid UTF-8 and linked git directories refuse
---
duration_ms: 13.631895
type: 'test'
...
# Subtest: schema constraints and layout omissions are reported independently
ok 13 - schema constraints and layout omissions are reported independently
---
duration_ms: 12.587996
type: 'test'
...
# Subtest: unsupported schema keywords, malformed contexts, ignored local config and nonempty markers refuse
ok 14 - unsupported schema keywords, malformed contexts, ignored local config and nonempty markers refuse
---
duration_ms: 17.967969
type: 'test'
...
# Subtest: a linked git directory is refused before a writer lock can touch its target
ok 15 - a linked git directory is refused before a writer lock can touch its target
---
duration_ms: 29.881672
type: 'test'
...
1..15
# tests 15
# suites 0
# pass 15
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 359.888609
@@ -0,0 +1,484 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: C2-04: ensureCheckouts skips a library before a real clone and leaves no books path
ok 1 - C2-04: ensureCheckouts skips a library before a real clone and leaves no books path
---
duration_ms: 24.068567
type: 'test'
...
# Subtest: a first launch clones the root at its branch, with the root's path as origin
ok 2 - a first launch clones the root at its branch, with the root's path as origin
---
duration_ms: 25.139644
type: 'test'
...
# Subtest: the clone is not at its place until git clone has finished
ok 3 - the clone is not at its place until git clone has finished
---
duration_ms: 19.80187
type: 'test'
...
# Subtest: a later launch fast-forwards a clean clone after a commit to the root, then finds it current
ok 4 - a later launch fast-forwards a clean clone after a commit to the root, then finds it current
---
duration_ms: 58.38953
type: 'test'
...
# Subtest: a clone ahead of the root keeps its commits and counts as current
ok 5 - a clone ahead of the root keeps its commits and counts as current
---
duration_ms: 36.944929
type: 'test'
...
# Subtest: a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
# Subtest: a modified file
ok 1 - a modified file
---
duration_ms: 43.555328
type: 'test'
...
# Subtest: an untracked file
ok 2 - an untracked file
---
duration_ms: 43.578014
type: 'test'
...
# Subtest: a staged file
ok 3 - a staged file
---
duration_ms: 45.552387
type: 'test'
...
# Subtest: another branch
ok 4 - another branch
---
duration_ms: 44.474285
type: 'test'
...
# Subtest: a detached HEAD
ok 5 - a detached HEAD
---
duration_ms: 44.267784
type: 'test'
...
1..5
ok 6 - a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
---
duration_ms: 222.531732
type: 'test'
...
# Subtest: a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward
ok 7 - a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward
---
duration_ms: 44.429656
type: 'test'
...
# Subtest: a clone kept before the branch check, or for a failed status, gets no fetch
# Subtest: not-a-clone
ok 1 - not-a-clone
---
duration_ms: 24.010304
type: 'test'
...
# Subtest: hooks-present
ok 2 - hooks-present
---
duration_ms: 26.456728
type: 'test'
...
# Subtest: submodule
ok 3 - submodule
---
duration_ms: 32.132655
type: 'test'
...
# Subtest: config-changed
ok 4 - config-changed
---
duration_ms: 28.788333
type: 'test'
...
# Subtest: root-unreadable
ok 5 - root-unreadable
---
duration_ms: 28.582855
type: 'test'
...
# Subtest: root-detached
ok 6 - root-detached
---
duration_ms: 34.831424
type: 'test'
...
# Subtest: status-failed, on the root's branch and clean
ok 7 - status-failed, on the root's branch and clean
---
duration_ms: 36.358179
type: 'test'
...
# Subtest: status-failed, dirty
ok 8 - status-failed, dirty
---
duration_ms: 35.738098
type: 'test'
...
1..8
ok 8 - a clone kept before the branch check, or for a failed status, gets no fetch
---
duration_ms: 248.188865
type: 'test'
...
# Subtest: a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was
ok 9 - a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was
---
duration_ms: 39.060792
type: 'test'
...
# Subtest: every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0
ok 10 - every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0
---
duration_ms: 47.577956
type: 'test'
...
# Subtest: a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge
ok 11 - a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge
---
duration_ms: 83.407385
type: 'test'
...
# Subtest: a clone with user.name or user.email in its config is kept, and git runs nothing in it
# Subtest: user.name
ok 1 - user.name
---
duration_ms: 26.589624
type: 'test'
...
# Subtest: user.email
ok 2 - user.email
---
duration_ms: 27.077458
type: 'test'
...
1..2
ok 12 - a clone with user.name or user.email in its config is kept, and git runs nothing in it
---
duration_ms: 54.174344
type: 'test'
...
# Subtest: a commit git can't read after the fast-forward is null
ok 13 - a commit git can't read after the fast-forward is null
---
duration_ms: 48.313761
type: 'test'
...
# Subtest: a new clone whose commit can't be read refuses the launch and leaves nothing behind
ok 14 - a new clone whose commit can't be read refuses the launch and leaves nothing behind
---
duration_ms: 19.718599
type: 'test'
...
# Subtest: a clone the session rigged is kept, and git runs nothing and writes nothing outside it
# Subtest: core.fsmonitor
ok 1 - core.fsmonitor
---
duration_ms: 34.825263
type: 'test'
...
# Subtest: core.hooksPath
ok 2 - core.hooksPath
---
duration_ms: 34.607853
type: 'test'
...
# Subtest: a hook file
ok 3 - a hook file
---
duration_ms: 32.415233
type: 'test'
...
# Subtest: include.path
ok 4 - include.path
---
duration_ms: 34.452538
type: 'test'
...
# Subtest: includeIf
ok 5 - includeIf
---
duration_ms: 34.951755
type: 'test'
...
# Subtest: a filter driver
ok 6 - a filter driver
---
duration_ms: 34.506288
type: 'test'
...
# Subtest: origin moved
ok 7 - origin moved
---
duration_ms: 35.061517
type: 'test'
...
# Subtest: a second origin url
ok 8 - a second origin url
---
duration_ms: 34.578313
type: 'test'
...
# Subtest: the origin url twice, both the root
ok 9 - the origin url twice, both the root
---
duration_ms: 35.890336
type: 'test'
...
# Subtest: an ext:: origin
ok 10 - an ext:: origin
---
duration_ms: 34.545512
type: 'test'
...
# Subtest: a branch tracking another remote
ok 11 - a branch tracking another remote
---
duration_ms: 34.622665
type: 'test'
...
# Subtest: a branch merging a tag
ok 12 - a branch merging a tag
---
duration_ms: 34.554134
type: 'test'
...
# Subtest: a fetch line onto local branches
ok 13 - a fetch line onto local branches
---
duration_ms: 35.21518
type: 'test'
...
# Subtest: no origin
ok 14 - no origin
---
duration_ms: 34.582413
type: 'test'
...
# Subtest: a config file over the size cap
ok 15 - a config file over the size cap
---
duration_ms: 32.02243
type: 'test'
...
# Subtest: config a symlink to /dev/zero
ok 16 - config a symlink to /dev/zero
---
duration_ms: 32.106204
type: 'test'
...
# Subtest: the clone a symlink to the bait
ok 17 - the clone a symlink to the bait
---
duration_ms: 31.61815
type: 'test'
...
# Subtest: the clone a file
ok 18 - the clone a file
---
duration_ms: 30.444422
type: 'test'
...
# Subtest: the clone a plain directory
ok 19 - the clone a plain directory
---
duration_ms: 30.626095
type: 'test'
...
# Subtest: .git a gitdir: file
ok 20 - .git a gitdir: file
---
duration_ms: 31.790964
type: 'test'
...
# Subtest: .git a symlink
ok 21 - .git a symlink
---
duration_ms: 30.620095
type: 'test'
...
# Subtest: .git/logs a symlink
ok 22 - .git/logs a symlink
---
duration_ms: 29.999273
type: 'test'
...
# Subtest: .git/refs/heads a symlink
ok 23 - .git/refs/heads a symlink
---
duration_ms: 31.098678
type: 'test'
...
# Subtest: .git/objects a symlink
ok 24 - .git/objects a symlink
---
duration_ms: 32.203924
type: 'test'
...
# Subtest: a reflog hard-linked to a file outside
ok 25 - a reflog hard-linked to a file outside
---
duration_ms: 33.125147
type: 'test'
...
# Subtest: HEAD a fifo
ok 26 - HEAD a fifo
---
duration_ms: 32.942152
type: 'test'
...
# Subtest: a commondir file
ok 27 - a commondir file
---
duration_ms: 31.209577
type: 'test'
...
# Subtest: an alternates file
ok 28 - an alternates file
---
duration_ms: 32.143247
type: 'test'
...
# Subtest: a gitlink staged, no .gitmodules
ok 29 - a gitlink staged, no .gitmodules
---
duration_ms: 45.242744
type: 'test'
...
# Subtest: a gitlink and .gitmodules staged
ok 30 - a gitlink and .gitmodules staged
---
duration_ms: 47.077745
type: 'test'
...
# Subtest: a gitlink to a repository with its own gitlink
ok 31 - a gitlink to a repository with its own gitlink
---
duration_ms: 53.338551
type: 'test'
...
# Subtest: a gitlink and .gitmodules committed
ok 32 - a gitlink and .gitmodules committed
---
duration_ms: 49.285771
type: 'test'
...
# Subtest: a gitlink and submodule.active in config
ok 33 - a gitlink and submodule.active in config
---
duration_ms: 45.987254
type: 'test'
...
# Subtest: a .git/modules with no gitlink
ok 34 - a .git/modules with no gitlink
---
duration_ms: 34.372858
type: 'test'
...
1..34
ok 15 - a clone the session rigged is kept, and git runs nothing and writes nothing outside it
---
duration_ms: 1206.505705
type: 'test'
...
# Subtest: a root that can't be cloned refuses with the project id and leaves nothing behind
# Subtest: missing
ok 1 - missing
---
duration_ms: 10.616926
type: 'test'
...
# Subtest: not a repository
ok 2 - not a repository
---
duration_ms: 10.454092
type: 'test'
...
# Subtest: a plain directory inside another repository
ok 3 - a plain directory inside another repository
---
duration_ms: 15.181602
type: 'test'
...
# Subtest: unreadable
ok 4 - unreadable
---
duration_ms: 10.347787
type: 'test'
...
# Subtest: on no branch
ok 5 - on no branch
---
duration_ms: 12.120322
type: 'test'
...
# Subtest: missing an object
ok 6 - missing an object
---
duration_ms: 15.582791
type: 'test'
...
1..6
ok 16 - a root that can't be cloned refuses with the project id and leaves nothing behind
---
duration_ms: 75.11175
type: 'test'
...
# Subtest: a clone whose root is on no branch, or gone, is kept and named
ok 17 - a clone whose root is on no branch, or gone, is kept and named
---
duration_ms: 28.730422
type: 'test'
...
# Subtest: no credential or forge remote of the root reaches a clone
ok 18 - no credential or forge remote of the root reaches a clone
---
duration_ms: 47.937295
type: 'test'
...
# Subtest: every project in the business file gets its own clone at its own branch
ok 19 - every project in the business file gets its own clone at its own branch
---
duration_ms: 35.86504
type: 'test'
...
# Subtest: a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace
ok 20 - a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace
---
duration_ms: 514.16756
type: 'test'
...
# Subtest: a clone that ignores SIGTERM gets SIGKILL once the grace period is over
ok 21 - a clone that ignores SIGTERM gets SIGKILL once the grace period is over
---
duration_ms: 1021.952973
type: 'test'
...
# Subtest: a timeout signals git's process group, so a process git started dies with it
ok 22 - a timeout signals git's process group, so a process git started dies with it
---
duration_ms: 514.861548
type: 'test'
...
# Subtest: once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too
ok 23 - once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too
---
duration_ms: 515.353281
type: 'test'
...
1..23
# tests 78
# suites 0
# pass 78
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 4984.06869
@@ -0,0 +1,60 @@
{
"scope": [
"/mnt/storage/scratch/tmp/g196-tree-tn651z",
"/mnt/storage/scratch/tmp/gS1z",
"/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196"
],
"rawCount": 8,
"preexistingCount": 8,
"gateLeftoverCount": 0,
"processes": [
{
"pid": 748279,
"name": "npm exec @playw",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748302,
"name": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748306,
"name": "npm exec @model",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748314,
"name": "npm exec chrome",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748494,
"name": "chrome-devtools",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748496,
"name": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748506,
"name": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748547,
"name": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
}
]
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,105 @@
{
"candidate": "05e940117",
"base": "e54e05463",
"grants": [
"sage-2096",
"sage-2113",
"sage-2120",
"sage-2124"
],
"continuation": {
"passCount": 1330,
"failCount": 0,
"skipCount": 0,
"wallSeconds": 748.099956839
},
"cli": {
"passCount": 735,
"failCount": 0,
"skipCount": 0,
"wallSeconds": 574.4362024449999
},
"eightFiles": {
"passCount": 166,
"failCount": 0,
"skipCount": 0,
"wallSeconds": 25.247570760999924
},
"shellScripts": {
"passCount": 429,
"failCount": 0,
"skipCount": 0,
"wallSeconds": 148.41618363300012
},
"golden": {
"passCount": 2256,
"failCount": 0,
"skipCount": 1,
"wallSeconds": 896.5150328459999
},
"mutants": {
"killed": 30,
"total": 30,
"source": "r4/gate/consolidated-kills.json"
},
"sweep": {
"scope": [
"/mnt/storage/scratch/tmp/g196-tree-tn651z",
"/mnt/storage/scratch/tmp/gS1z",
"/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196"
],
"rawCount": 8,
"preexistingCount": 8,
"gateLeftoverCount": 0,
"processes": [
{
"pid": 748279,
"name": "npm exec @playw",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748302,
"name": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748306,
"name": "npm exec @model",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748314,
"name": "npm exec chrome",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748494,
"name": "chrome-devtools",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748496,
"name": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748506,
"name": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
},
{
"pid": 748547,
"name": "node-MainThread",
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
"preexisting": true
}
]
}
}
@@ -0,0 +1,22 @@
import os,json,datetime
from pathlib import Path
out=Path(__file__).parent
roots=[Path('/mnt/storage/scratch/tmp/g196-tree-tn651z'),Path((out/'tmpdir.txt').read_text().strip()),Path('/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196')]
old={x['pid']:x for x in json.loads((out/'../../r4/gate/categorized-sweep.json').read_text())['preexistingHarnessHelpers']}
anc=set();pid=os.getpid()
while pid>1 and pid not in anc:
anc.add(pid)
try:pid=int(Path(f'/proc/{pid}/stat').read_text().rsplit(')',1)[1].split()[1])
except (OSError,ValueError):break
rows=[]
for p in Path('/proc').iterdir():
if not p.name.isdigit() or int(p.name) in anc:continue
try:
cwd=Path(os.readlink(p/'cwd'));name=(p/'comm').read_text().strip()
if not any(cwd==r or r in cwd.parents for r in roots):continue
if not any(n in name.lower() for n in ['node','tee','npm','chrome','fifo','python','bash','sh']):continue
rows.append(dict(pid=int(p.name),name=name,cwd=str(cwd),preexisting=int(p.name) in old))
except (OSError,ValueError):continue
result=dict(scope=list(map(str,roots)),rawCount=len(rows),preexistingCount=sum(r['preexisting'] for r in rows),gateLeftoverCount=sum(not r['preexisting'] for r in rows),processes=rows)
(out/'process-sweep.json').write_text(json.dumps(result,indent=2)+'\n')
print(json.dumps(result))
@@ -0,0 +1,18 @@
CLEAR (current driver ancestors excluded)
OK status with missing harness credential exits 3 and still lists accounts
OK status reports harness credential (read-only) + mosaic accounts
OK api key material never reaches output
OK oauth token material never reaches output
OK unparseable credential file exits 2
OK symlinked credential file exits 4
OK env-side credential names reported
OK env var values never reach output
OK accounts without an accounts dir reports none and creates nothing
OK accounts lists files and marks the active one
OK loose account perms flagged in listing
OK agent --auth with missing account file refuses (exit 4)
OK agent --auth with non-0600 account file refuses
OK agent --auth with invalid account name refuses
OK auth.sh without valid config refuses
selftest: 15 passed, 0 failed
@@ -0,0 +1,24 @@
CLEAR (current driver ancestors excluded)
On branch gander/row196-r5
Your branch is up to date with 'origin/gander/row196-r5'.
nothing to commit, working tree clean
OK dry-run: allowed change, exit 0, nothing committed (exit 0)
OK dry-run committed nothing
OK apply: allowed change exits 0 (exit 0)
OK apply: attribution in commit subject
OK apply: target tree clean after commit
OK disallowed path refused (exit 1)
OK disallowed path: target untouched
OK syntax gate refused broken .mjs (exit 1)
OK syntax gate: target untouched
OK suite failure refused (exit 1)
OK suite failure: target reverted to clean
OK disabled policy refused (exit 2)
OK disabled policy: target untouched
OK failed run refused (exit 1)
OK failed run: target untouched
OK missing run exits 4 (exit 4)
OK invalid policy exits 2 (exit 2)
selftest: 17 passed, 0 failed
@@ -0,0 +1,34 @@
CLEAR (current driver ancestors excluded)
OK absent adapter defaults to pi
OK adapter mock validates (exit 0)
OK unsupported adapter exits 2 (exit 2)
OK env exports adapter
OK bootstrap creates default when absent (exit 0)
OK bootstrap wrote config file
OK bootstrap is idempotent on existing config (exit 0)
OK bootstrap did not rewrite existing config
OK validate missing config exits 3 (exit 3)
OK malformed JSON exits 2 (exit 2)
OK unsupported configVersion exits 2 (exit 2)
OK unknown top-level key exits 2 (exit 2)
OK unknown execution key exits 2 (exit 2)
OK unsupported backend exits 2 (exit 2)
OK unsupported environment exits 2 (exit 2)
OK relative dataRoot exits 2 (exit 2)
OK non-canonical dataRoot exits 2 (exit 2)
OK filesystem root dataRoot exits 2 (exit 2)
OK home directory dataRoot exits 2 (exit 2)
OK dataRoot containing config dir exits 2 (exit 2)
OK control character in provider exits 2 (exit 2)
OK symlinked config file exits 2 (exit 2)
OK env exports resolve correctly
OK valid console.sso loads and is in the output
OK console.sso HS256 alg exits 2 naming the path (exit 2)
OK console.sso alg none exits 2 naming the path (exit 2)
OK console.sso missing slot field exits 2 naming the path (exit 2)
OK console.sso slot name outside the pattern exits 2 naming the path (exit 2)
OK unknown key under console exits 2 naming the path (exit 2)
OK config without console loads with unchanged output
OK failed validation modified nothing
selftest: 31 passed, 0 failed
@@ -0,0 +1,83 @@
CLEAR (current driver ancestors excluded)
toolchain: node v26.8.1
OK syntax: packages/discord/src/approvals.mjs
OK syntax: packages/discord/src/authorize.mjs
OK syntax: packages/discord/src/binding.mjs
OK syntax: packages/discord/src/cli.mjs
OK syntax: packages/discord/src/connector.mjs
OK syntax: packages/discord/src/context.mjs
OK syntax: packages/discord/src/engine-pi.mjs
OK syntax: packages/discord/src/errors.mjs
OK syntax: packages/discord/src/gateway.mjs
OK syntax: packages/discord/src/git.mjs
OK syntax: packages/discord/src/journal.mjs
OK syntax: packages/discord/src/notify.mjs
OK syntax: packages/discord/src/rest.mjs
OK syntax: packages/discord/src/setspark.mjs
OK syntax: packages/discord/src/tools.mjs
OK syntax: packages/discord/src/web.mjs
OK syntax: packages/discord/bin/git-credential.mjs
OK syntax: packages/discord/extension/tools.mjs
OK syntax: packages/discord/tests/approvals.test.mjs
OK syntax: packages/discord/tests/authorize.test.mjs
OK syntax: packages/discord/tests/binding.test.mjs
OK syntax: packages/discord/tests/connector.test.mjs
OK syntax: packages/discord/tests/context.test.mjs
OK syntax: packages/discord/tests/copy-service.test.mjs
OK syntax: packages/discord/tests/engine.test.mjs
OK syntax: packages/discord/tests/fake-pi.mjs
OK syntax: packages/discord/tests/gateway.test.mjs
OK syntax: packages/discord/tests/git.test.mjs
OK syntax: packages/discord/tests/helpers.mjs
OK syntax: packages/discord/tests/journal.test.mjs
OK syntax: packages/discord/tests/notify.test.mjs
OK syntax: packages/discord/tests/offline-check.test.mjs
OK syntax: packages/discord/tests/recover.test.mjs
OK syntax: packages/discord/tests/rest.test.mjs
OK syntax: packages/discord/tests/setspark.test.mjs
OK syntax: packages/discord/tests/tools.test.mjs
OK syntax: packages/discord/tests/web.test.mjs
OK syntax: packages/discord/fixtures/claim-worker.mjs
OK syntax: packages/discord/fixtures/legacy-owner-worker.mjs
OK syntax: scripts/discord.sh
OK syntax: scripts/discord-service.sh
OK packages/discord declares no dependencies
OK no bot-token-shaped string in packages/discord
OK fixture binding uses placeholder ids only
OK fixture binding validates
OK real pi with the extension exposes exactly list_dir, read_file, search and no built-in tool
OK real pi with a writable root exposes exactly the three reads plus write_file and edit_file, and writes nothing at start
OK real pi with a web key exposes the three reads plus web_fetch and web_search, and no write tool without a writable root
OK real pi with a git root exposes the reads, writes and the four git verbs, commits nothing at start, and never shows the token
OK real pi with protocol vault adds reserve_id to the git verbs
OK real pi with a setspark key exposes the reads and the eight record verbs, no counters, and never shows the key
OK real pi refuses a git key on a read-only root (fail closed)
OK real pi with the pilot flags (--no-tools) exposes no tool at all
OK real pi exits non-zero without MOSAIC_DISCORD_TOOLS: no session, no tools (fail closed)
OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT
OK node --test packages/discord/tests/ (ℹ pass 183)
OK scripts/discord.sh --help exits 0
OK scripts/discord.sh check without a binding exits 4
OK scripts/discord.sh recover without a binding exits 4
OK scripts/discord.sh reload without a binding exits 4
OK scripts/discord-service.sh without a command exits 4
OK service unit renders with the repository path, a supervised run as the main process, exit 3 never retried, and reload as SIGHUP
OK service install writes the rendered unit (0644) and leaves no temp file
OK service install a second time reports unchanged
OK systemd-analyze verify accepts the rendered unit
OK service uninstall removes the unit file
OK service install with an unknown flag exits 4
OK service install with USER unset finishes and names the account for lingering
OK pinned render runs copy CLI with copy cwd/repo and no checkout executable
OK pinned install writes the rendered unit in a temporary unit directory
OK pinned install refuses short prerequisite and writes no unit
OK pinned install refuses missing prerequisite and writes no unit
OK pinned install refuses cli prerequisite and writes no unit
OK pinned install refuses pi prerequisite and writes no unit
OK status names the copy from fake systemctl effective cwd
OK checkout install explicitly recommends --copy
OK wrapper check --offline passes local fixture and makes no network call
OK wrapper run --offline refuses usage
discord suite: 78 passed, 0 failed
@@ -0,0 +1,22 @@
CLEAR (current driver ancestors excluded)
OK initial ordinary-file install
OK installed tree matches canonical source
OK installed tree has no symlinks
OK check detects installation drift
OK sync refuses to overwrite installation drift
OK check detects an extra destination file
OK check detects an extra destination directory
OK check rejects a destination symlink
OK sync accepts a canonical source update
OK updated installation matches canonical source
scripts/test-extension-package.sh: line 14: 2492582 Killed "$@" > /dev/null 2>&1
OK forced interruption kills the replacing process
OK next invocation recovers old consistent installation
OK interrupted replacement rolled back
OK sync succeeds after interruption recovery
OK unlocked stale lock file does not block
OK active lock refuses a concurrent sync
OK source symlink fails closed
OK nested second entrypoint fails closed
extension package selftest: 18 passed, 0 failed
@@ -0,0 +1,54 @@
CLEAR (current driver ancestors excluded)
toolchain: node v26.8.1, python 3.12.8, jsonschema 4.26.0
OK syntax: scripts/foundation-inspect.mjs
OK syntax: scripts/foundation/strict-json.mjs
OK syntax: scripts/foundation/canonical.mjs
OK syntax: scripts/foundation/resolve.mjs
OK syntax: scripts/foundation/validate-record.mjs
OK syntax: scripts/foundation/fixtures/build-fixtures.mjs
OK syntax: scripts/foundation/canonical.test.mjs
OK syntax: scripts/foundation/cli.test.mjs
OK syntax: scripts/foundation/fixtures.test.mjs
OK syntax: scripts/foundation/resolve.test.mjs
OK syntax: scripts/foundation/strict-json.test.mjs
OK syntax: scripts/foundation/verify-schema.py (ast only; no bytecode written)
OK fixture generator runs
OK checked-in fixtures/bundles equal a fresh generation
OK checked-in fixtures/raw equal a fresh generation
OK checked-in fixtures/index.json equal a fresh generation
OK checked-in demo bundles equal a fresh generation
OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT
OK node --test scripts/foundation/ (ℹ pass 80)
OK differential schema oracle: PASS: differential schema oracle (finite corpus; compatibility evidence, not equivalence proof)
platform witness: strftime('%Y') for year 999 -> '999' (pinned checker refuses years 0001..0999)
node v26.8.1; corpus 1568 records (38 pinned fixtures, 478 unique bundle records, 1052 typeCase/mutation/lexical cases)
schema column: agree-valid 540, agree-invalid 991, DISAGREEMENTS 0; strict-only (parser-bound) cases: 27; unsupported-kind records not schema-assessed by the inspector: 10
profile column (schema-valid records only): profile-valid 510, profile-invalid 30
profile refusals asserted: 30 schema-agreed-valid records refused only by the strict typed-string profile (rule profile-pattern-mismatch), 12 declared by name; 73 named probes verified against declared schema/profile columns
OK oracle: zero schema-column disagreements with the pinned checker
OK oracle: strict-only profile refusals are counted and asserted
OK demo: permitted read preview exits 0 (exit 0)
OK demo: permitted file.change preview exits 0 (exit 0)
OK demo: assignment.change proposal is unresolved (exit 3) (exit 3)
OK demo: revoked registration is refused (exit 3) (exit 3)
OK demo: message is not authority (exit 3) (exit 3)
OK usage: no arguments exits 2 (exit 2)
OK io: missing file exits 4 (exit 4)
OK io: directory exits 4 (exit 4)
OK io: symlink exits 4 (O_NOFOLLOW) (exit 4)
OK bound: oversize fixture exits 2 (exit 2)
OK profile: one final LF in a typed selection id is refused before admission (exit 2) (exit 2)
OK profile: two final LFs fail the schema pattern itself (exit 2) (exit 2)
OK profile: escaped newlines in free-form text stay allowed (exit 0) (exit 0)
OK profile refusal is invalid-request/profile-pattern-mismatch with selection and operation withheld, value not echoed
OK text output starts with the disclaimer
OK json output is valid JSON with result allowed and exactly the charter §7 fields
OK json golden matches byte-for-byte
OK sandboxed bundle run (env -i, PATH=/nonexistent) produced the unresolved proposal
OK sandbox inventory (path/type/size/mode/uid/gid/inode/mtime/sha256) unchanged by runs
OK canary never printed (bundle run and credential-file run)
OK a non-bundle JSON file is refused at the shape gate, not read into output
OK no field of the non-bundle file is echoed
selftest: 44 passed, 0 failed
@@ -0,0 +1,89 @@
CLEAR (current driver ancestors excluded)
OK args: exit 2, target-branch
OK args: exit 2, target-branch
OK args: exit 4
OK args: exit 4
OK args: exit 4
OK --base next refuses before the config is read (got 2)
OK a missing system config exits 3 (got 3)
OK nobus: exit 3
OK schema-table: exit 2, bus-schema
OK schema-meta: exit 2, bus-schema
OK openBus opens the database read-only
OK other-business: exit 2, decision-not-found
OK no-raise: exit 2, decision-not-found
OK not-a-merge: exit 2, not-a-merge
OK open: exit 2, not-resolved
OK withdrawn: exit 2, not-resolved
OK by-agent: exit 2, not-human
OK via-webui: exit 2, not-human
OK no-answer: exit 2, not-human
OK answer-role: exit 2, not-human
OK answer-run: exit 2, not-human
OK answer-choice: exit 2, not-human
OK two-answers: exit 2, not-human
OK arbiter-cross: exit 2, not-human
OK arbiter-cited: exit 2, not-human
OK chose-no: exit 2, not-merge-option
OK two-refs: exit 2, work-ref
OK bad-ref: exit 2, work-ref
OK task-ref-disagrees: exit 2, work-ref
OK raise-task-disagrees: exit 2, work-ref
OK target-main: exit 2, target-branch
OK superseded-question: exit 2, superseded
OK superseded-task: exit 2, superseded
OK superseded-by: exit 2, superseded
OK no-verdict: exit 2, no-verdict
OK changes-later: exit 2, not-approved
OK short-commit: exit 2, not-approved
OK wrong-task-body: exit 2, not-approved
OK args: exit 2, decision-not-found
OK earlier-merge: exit 0
OK ref-moved: exit 2, ref-moved
OK root-top: exit 2, root-file
OK root-newdir: exit 2, root-file
OK root-src: exit 2, root-file
OK unrelated: exit 2, base-conflict
OK empty: exit 2, base-conflict
OK an empty reviewed diff says so
OK dirty-changed: exit 2, checkout-dirty
OK dirty-staged: exit 2, checkout-dirty
OK dirty-untracked: exit 2, checkout-dirty
OK conflict: exit 2, base-conflict
OK a refusal after the worktree is added leaves no worktree or scratch
OK cleanup looks for the worktree's Docker network
OK dirty-during: exit 2, checkout-dirty
OK a reviewed path dirtied during the gate moves no ref
OK drift: exit 2, patch-drift
OK patch-drift leaves no worktree or scratch
OK gate-pkg: exit 2, gate-failed
OK gate-failed names the failing step's log, and it exists
OK gate-failed leaves no worktree or scratch
OK gate-script: exit 2, gate-failed
OK a failing scripts/test-*.sh fails the gate
OK a failed gate moves no ref
OK nomods: exit 4
OK a target without node_modules leaves no worktree or scratch
OK moved: exit 2, base-moved
OK base-moved keeps the base where it moved to
OK dry: exit 0
OK --dry-run writes no ref
OK --dry-run prints the commit with --subject and --attribution
OK --dry-run runs the gate
OK --dry-run leaves no worktree or scratch
OK land: exit 0
OK the landing is one commit on the old base
OK its diff is the reviewed diff by patch-id
OK its tree is the dry run's
OK the message has the option's subject, the citations and the attribution last
OK it prints the line for the PM
OK the checked-out base has the reviewed paths and keeps the unrelated edit
OK only refs/heads/refactor exists in the target
OK the work ref is unchanged
OK the bus database is unchanged
OK the gate ran each package suite but queue, and each scripts/test-*.sh
OK the landing leaves no worktree or scratch
OK the target's node_modules is still there, with its contents
OK the worktree's Docker network is removed
---
land-work selftests: 86 passed, 0 failed
@@ -0,0 +1,37 @@
CLEAR (current driver ancestors excluded)
toolchain: node v26.8.1, git version 2.55.0
OK syntax: packages/queue/src/cli.mjs
OK syntax: packages/queue/src/errors.mjs
OK syntax: packages/queue/src/io.mjs
OK syntax: packages/queue/src/lock.mjs
OK syntax: packages/queue/src/queue.mjs
OK syntax: packages/queue/src/review.mjs
OK syntax: packages/queue/src/store.mjs
OK syntax: packages/queue/tests/commit.test.mjs
OK syntax: packages/queue/tests/data.test.mjs
OK syntax: packages/queue/tests/dispatch.test.mjs
OK syntax: packages/queue/tests/gate-owner.test.mjs
OK syntax: packages/queue/tests/helpers.mjs
OK syntax: packages/queue/tests/lock.test.mjs
OK syntax: packages/queue/tests/migration.test.mjs
OK syntax: packages/queue/tests/review.test.mjs
OK syntax: packages/queue/tests/store.test.mjs
OK syntax: packages/queue/tests/write.test.mjs
OK syntax: packages/queue/tests/fixtures/fake-gitea.mjs
OK syntax: packages/queue/tests/fixtures/kill-at.mjs
OK syntax: packages/queue/tests/fixtures/lock-child.mjs
OK syntax: packages/queue/tests/fixtures/mosaic-pre-a2.sh
OK syntax: scripts/queue-commit.sh
OK syntax: scripts/git-hooks/pre-commit
OK syntax: scripts/mosaic
OK queue-commit.sh, the guard and scripts/mosaic are executable
OK packages/queue declares no dependencies
ℹ tests 156
ℹ pass 156
ℹ fail 0
OK node --test packages/queue/tests/
OK scripts/mosaic queue help
skip queue verify and render --check: this checkout (/mnt/storage/scratch/tmp/g196-tree-tn651z) is not the queue's canonical root (/mnt/storage/src/mosaic-stack)
queue suite: 28 passed, 0 failed
@@ -0,0 +1,17 @@
CLEAR (current driver ancestors excluded)
OK valid RELEASE resolves (exit 0)
OK invalid RELEASE exits 1 (exit 1)
OK missing RELEASE exits 1 (exit 1)
OK valid RELEASE leaves image tag consistent with version
OK status safe on empty state (exit 0)
OK status created no pointer
OK fault-injected activation refuses (exit 1)
OK refused activation wrote no pointer
OK refusal logged exactly once with valid fields
OK healthy activation succeeds (exit 0)
OK pointer written with valid fields
OK repeat activation succeeds (log grows) (exit 0)
OK log is append-only across activations
OK rollback without previous refuses (exit 1)
selftest: 14 passed, 0 failed
@@ -0,0 +1,102 @@
CLEAR (current driver ancestors excluded)
OK valid task validates (exit 0)
OK unknown task key exits 2 (exit 2)
OK unsupported taskVersion exits 2 (exit 2)
OK invalid task id exits 2 (exit 2)
OK empty prompt exits 2 (exit 2)
OK NUL in expectExact exits 2 (exit 2)
OK out-of-range timeout exits 2 (exit 2)
OK missing mission file exits 4 (exit 4)
OK task with valid mission validates (exit 0)
OK invalid mission exits 2 (exit 2)
OK validate missing task exits 4 (exit 4)
OK validation does not modify the task file
OK prune dry-run exits 0 (exit 0)
OK dry-run deleted nothing
OK prune --keep=2 --yes removes oldest (exit 0)
OK kept exactly 2 newest runs
OK newest run kept, oldest pruned
OK append-only receipt written (3 entries)
OK sessions/workspaces untouched by prune
OK prune with invalid keep exits 4 (exit 4)
OK mock adapter: gate passes on matching mock response (exit 0)
OK mock adapter: expect-mismatch recorded (exit 1)
OK mismatch reason recorded
OK unknown adapter fails closed (exit 1)
OK mission task runs via mock adapter (exit 0)
OK mission section injected into generated prompt
OK retry of mission run succeeds (exit 0)
OK retriedFrom lineage recorded
OK mission section present after retry (relative path resolved)
OK retry of missing run exits 4 (exit 4)
OK skill install bundled ms-tools (exit 0)
OK installed to skills-available
OK double install refuses (exit 1)
OK activate enables skill (exit 0)
OK enabled dir populated
OK uninstall while enabled refuses (exit 1)
OK deactivate moves back to available (exit 0)
OK uninstall removes from available (exit 0)
OK seat with enabled skill launches
OK skill path delivered to adapter
OK shipped researcher contract resolves (ceiling + network)
OK resolve-role refuses a non-role document (conductor policy) (exit 2)
OK resolve-role refuses name/filename mismatch (exit 2)
OK resolve-role refuses unknown network declaration (exit 2)
OK resolve-role refuses duplicate role tool (exit 2)
OK resolve-role refuses unsupported tool (exit 2)
OK resolve-role refuses missing contract file (exit 4)
OK version 1 role prints no contract line
OK shipped version 2 roles resolve with their contracts (pm, cto, coder, reviewer)
OK resolve-role accepts a minimal version 2 role (exit 0)
OK resolve-role refuses an action outside the vocabulary (exit 2)
OK resolve-role refuses a gated-only action in a role file (exit 2)
OK resolve-role refuses a Vikunja verb no role may hold (exit 2)
OK resolve-role refuses a version 2 role whose contract is missing (exit 2)
OK resolve-role refuses a contract that is a symbolic link (exit 2)
OK seat launches under role ceiling
OK role ceiling narrows seat tools (read,write,bash -> read,bash)
OK narrowing recorded loudly
OK missing role contract refuses launch (exit 2)
OK missing-contract refusal names the role
OK empty ceiling intersection -> tool-free seat
OK tool-free outcome recorded loudly
OK overridden agents dir without seat definition refuses (exit 4)
OK seat-resolution refusal names the seat
OK policy: mission only -> mission tools
OK policy: task only -> task tools
OK policy: both -> intersection (task narrowed)
OK policy: empty intersection -> tool-free
OK invalid mission capabilities rejected (exit 2)
mosaic-task: unsupported mission tool: "sudo" (supported: read, write, edit, bash, grep, find, ls)
OK task run with user layer present (exit 0)
OK user context dispatched into generated prompt
OK workspace+tools task runs via mock (exit 0)
OK workspace path + tools delivered to adapter
OK persistent workspace created on host
OK plain task still runs (no workspace/tools) (exit 0)
OK workspace var present but empty when absent
OK tools empty when absent
OK unknown tool exits 2 (exit 2)
OK workspace traversal exits 2 (exit 2)
OK live hello task succeeds with exact marker
OK result.json written in run dir
OK result.json contents are correct
OK wrong expectExact fails with exit 1 (reason: expect-mismatch)
OK each run gets a distinct run dir (no clobber)
OK list shows both runs
OK fork base: teach succeeds (exit 0)
OK fork child recalls ancestor context (exit 0)
OK forked child recalled ancestor code word
OK ancestor session untouched by fork
OK child session dir has its own branch file
OK onboard without name exits 4 (non-interactive) (exit 4)
OK onboard --name renders profile (exit 0)
OK profile written
OK canon structure: required filled, optional placeholdered
OK canon sections present
OK user recall run succeeds
OK recalled user name (response: Jason)
OK no agent identity on headless run
selftest: 98 passed, 0 failed
@@ -0,0 +1 @@
/mnt/storage/scratch/tmp/gS1z
@@ -0,0 +1,328 @@
[
{
"name": "cli",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"--test-concurrency=2",
"packages/cli/tests/app.test.mjs",
"packages/cli/tests/boot-status.test.mjs",
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case1-hostcheck.test.mjs",
"packages/cli/tests/case2-persona-import.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"packages/cli/tests/channel-cli.test.mjs",
"packages/cli/tests/channel-recovery.test.mjs",
"packages/cli/tests/cli.test.mjs",
"packages/cli/tests/config.test.mjs",
"packages/cli/tests/credentials.test.mjs",
"packages/cli/tests/follow.test.mjs",
"packages/cli/tests/format.test.mjs",
"packages/cli/tests/gate-lane-fixtures.test.mjs",
"packages/cli/tests/gate-lane-image.test.mjs",
"packages/cli/tests/gate-lane-state.test.mjs",
"packages/cli/tests/gate-lane.test.mjs",
"packages/cli/tests/git-socket.test.mjs",
"packages/cli/tests/host.test.mjs",
"packages/cli/tests/hosts.test.mjs",
"packages/cli/tests/instances.test.mjs",
"packages/cli/tests/launch-account.test.mjs",
"packages/cli/tests/launch-limit-checks.test.mjs",
"packages/cli/tests/launch-limits.test.mjs",
"packages/cli/tests/launch-routes.test.mjs",
"packages/cli/tests/launcher.test.mjs",
"packages/cli/tests/limits-tokens.test.mjs",
"packages/cli/tests/limits.test.mjs",
"packages/cli/tests/mark-read.test.mjs",
"packages/cli/tests/names.test.mjs",
"packages/cli/tests/notifier.test.mjs",
"packages/cli/tests/other-tree.test.mjs",
"packages/cli/tests/project-name-repo.test.mjs",
"packages/cli/tests/project.test.mjs",
"packages/cli/tests/publish-socket.test.mjs",
"packages/cli/tests/stack-copy.test.mjs",
"packages/cli/tests/stack-instances.test.mjs",
"packages/cli/tests/stack-release-external.test.mjs",
"packages/cli/tests/stack-release.test.mjs",
"packages/cli/tests/stack-upgrade.test.mjs",
"packages/cli/tests/tester-http.test.mjs",
"packages/cli/tests/tester-reads.test.mjs",
"packages/cli/tests/tester-threads.test.mjs",
"packages/cli/tests/tester.test.mjs",
"packages/cli/tests/thread-cli.test.mjs",
"packages/cli/tests/thread-launch.test.mjs",
"packages/cli/tests/trackers-boot.test.mjs",
"packages/cli/tests/transport.test.mjs",
"packages/cli/tests/usage.test.mjs",
"packages/cli/tests/verbs.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/cli/tests/app.test.mjs",
"packages/cli/tests/boot-status.test.mjs",
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case1-hostcheck.test.mjs",
"packages/cli/tests/case2-persona-import.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"packages/cli/tests/channel-cli.test.mjs",
"packages/cli/tests/channel-recovery.test.mjs",
"packages/cli/tests/cli.test.mjs",
"packages/cli/tests/config.test.mjs",
"packages/cli/tests/credentials.test.mjs",
"packages/cli/tests/follow.test.mjs",
"packages/cli/tests/format.test.mjs",
"packages/cli/tests/gate-lane-fixtures.test.mjs",
"packages/cli/tests/gate-lane-image.test.mjs",
"packages/cli/tests/gate-lane-state.test.mjs",
"packages/cli/tests/gate-lane.test.mjs",
"packages/cli/tests/git-socket.test.mjs",
"packages/cli/tests/host.test.mjs",
"packages/cli/tests/hosts.test.mjs",
"packages/cli/tests/instances.test.mjs",
"packages/cli/tests/launch-account.test.mjs",
"packages/cli/tests/launch-limit-checks.test.mjs",
"packages/cli/tests/launch-limits.test.mjs",
"packages/cli/tests/launch-routes.test.mjs",
"packages/cli/tests/launcher.test.mjs",
"packages/cli/tests/limits-tokens.test.mjs",
"packages/cli/tests/limits.test.mjs",
"packages/cli/tests/mark-read.test.mjs",
"packages/cli/tests/names.test.mjs",
"packages/cli/tests/notifier.test.mjs",
"packages/cli/tests/other-tree.test.mjs",
"packages/cli/tests/project-name-repo.test.mjs",
"packages/cli/tests/project.test.mjs",
"packages/cli/tests/publish-socket.test.mjs",
"packages/cli/tests/stack-copy.test.mjs",
"packages/cli/tests/stack-instances.test.mjs",
"packages/cli/tests/stack-release-external.test.mjs",
"packages/cli/tests/stack-release.test.mjs",
"packages/cli/tests/stack-upgrade.test.mjs",
"packages/cli/tests/tester-http.test.mjs",
"packages/cli/tests/tester-reads.test.mjs",
"packages/cli/tests/tester-threads.test.mjs",
"packages/cli/tests/tester.test.mjs",
"packages/cli/tests/thread-cli.test.mjs",
"packages/cli/tests/thread-launch.test.mjs",
"packages/cli/tests/trackers-boot.test.mjs",
"packages/cli/tests/transport.test.mjs",
"packages/cli/tests/usage.test.mjs",
"packages/cli/tests/verbs.test.mjs"
]
},
{
"name": "packages_business_tests_business.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/business/tests/business.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/business/tests/business.test.mjs"
]
},
{
"name": "packages_business_tests_cli.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/business/tests/cli.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/business/tests/cli.test.mjs"
]
},
{
"name": "packages_business_tests_instance-settings.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/business/tests/instance-settings.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/business/tests/instance-settings.test.mjs"
]
},
{
"name": "packages_business_tests_library-projects-protected.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/business/tests/library-projects-protected.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/business/tests/library-projects-protected.test.mjs"
]
},
{
"name": "packages_business_tests_resolve.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/business/tests/resolve.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/business/tests/resolve.test.mjs"
]
},
{
"name": "packages_library_tests_mirror.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/library/tests/mirror.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/library/tests/mirror.test.mjs"
]
},
{
"name": "packages_project_tests_project.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/project/tests/project.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/project/tests/project.test.mjs"
]
},
{
"name": "packages_seat_tests_checkout.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/seat/tests/checkout.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/seat/tests/checkout.test.mjs"
]
},
{
"name": "test-auth.sh",
"command": "bash",
"args": [
"scripts/test-auth.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-auth.sh"
]
},
{
"name": "test-conductor.sh",
"command": "bash",
"args": [
"scripts/test-conductor.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-conductor.sh"
]
},
{
"name": "test-config.sh",
"command": "bash",
"args": [
"scripts/test-config.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-config.sh"
]
},
{
"name": "test-discord.sh",
"command": "bash",
"args": [
"scripts/test-discord.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-discord.sh"
]
},
{
"name": "test-extension-package.sh",
"command": "bash",
"args": [
"scripts/test-extension-package.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-extension-package.sh"
]
},
{
"name": "test-foundation.sh",
"command": "bash",
"args": [
"scripts/test-foundation.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-foundation.sh"
]
},
{
"name": "test-land-work.sh",
"command": "bash",
"args": [
"scripts/test-land-work.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-land-work.sh"
]
},
{
"name": "test-queue.sh",
"command": "bash",
"args": [
"scripts/test-queue.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-queue.sh"
]
},
{
"name": "test-release.sh",
"command": "bash",
"args": [
"scripts/test-release.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-release.sh"
]
},
{
"name": "test-task.sh",
"command": "bash",
"args": [
"scripts/test-task.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-task.sh"
]
}
]
@@ -0,0 +1,518 @@
[
{
"name": "cli",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"--test-concurrency=2",
"packages/cli/tests/app.test.mjs",
"packages/cli/tests/boot-status.test.mjs",
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case1-hostcheck.test.mjs",
"packages/cli/tests/case2-persona-import.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"packages/cli/tests/channel-cli.test.mjs",
"packages/cli/tests/channel-recovery.test.mjs",
"packages/cli/tests/cli.test.mjs",
"packages/cli/tests/config.test.mjs",
"packages/cli/tests/credentials.test.mjs",
"packages/cli/tests/follow.test.mjs",
"packages/cli/tests/format.test.mjs",
"packages/cli/tests/gate-lane-fixtures.test.mjs",
"packages/cli/tests/gate-lane-image.test.mjs",
"packages/cli/tests/gate-lane-state.test.mjs",
"packages/cli/tests/gate-lane.test.mjs",
"packages/cli/tests/git-socket.test.mjs",
"packages/cli/tests/host.test.mjs",
"packages/cli/tests/hosts.test.mjs",
"packages/cli/tests/instances.test.mjs",
"packages/cli/tests/launch-account.test.mjs",
"packages/cli/tests/launch-limit-checks.test.mjs",
"packages/cli/tests/launch-limits.test.mjs",
"packages/cli/tests/launch-routes.test.mjs",
"packages/cli/tests/launcher.test.mjs",
"packages/cli/tests/limits-tokens.test.mjs",
"packages/cli/tests/limits.test.mjs",
"packages/cli/tests/mark-read.test.mjs",
"packages/cli/tests/names.test.mjs",
"packages/cli/tests/notifier.test.mjs",
"packages/cli/tests/other-tree.test.mjs",
"packages/cli/tests/project-name-repo.test.mjs",
"packages/cli/tests/project.test.mjs",
"packages/cli/tests/publish-socket.test.mjs",
"packages/cli/tests/stack-copy.test.mjs",
"packages/cli/tests/stack-instances.test.mjs",
"packages/cli/tests/stack-release-external.test.mjs",
"packages/cli/tests/stack-release.test.mjs",
"packages/cli/tests/stack-upgrade.test.mjs",
"packages/cli/tests/tester-http.test.mjs",
"packages/cli/tests/tester-reads.test.mjs",
"packages/cli/tests/tester-threads.test.mjs",
"packages/cli/tests/tester.test.mjs",
"packages/cli/tests/thread-cli.test.mjs",
"packages/cli/tests/thread-launch.test.mjs",
"packages/cli/tests/trackers-boot.test.mjs",
"packages/cli/tests/transport.test.mjs",
"packages/cli/tests/usage.test.mjs",
"packages/cli/tests/verbs.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/cli/tests/app.test.mjs",
"packages/cli/tests/boot-status.test.mjs",
"packages/cli/tests/case1-accept.test.mjs",
"packages/cli/tests/case1-hostcheck.test.mjs",
"packages/cli/tests/case2-persona-import.test.mjs",
"packages/cli/tests/case2-unit.test.mjs",
"packages/cli/tests/channel-cli.test.mjs",
"packages/cli/tests/channel-recovery.test.mjs",
"packages/cli/tests/cli.test.mjs",
"packages/cli/tests/config.test.mjs",
"packages/cli/tests/credentials.test.mjs",
"packages/cli/tests/follow.test.mjs",
"packages/cli/tests/format.test.mjs",
"packages/cli/tests/gate-lane-fixtures.test.mjs",
"packages/cli/tests/gate-lane-image.test.mjs",
"packages/cli/tests/gate-lane-state.test.mjs",
"packages/cli/tests/gate-lane.test.mjs",
"packages/cli/tests/git-socket.test.mjs",
"packages/cli/tests/host.test.mjs",
"packages/cli/tests/hosts.test.mjs",
"packages/cli/tests/instances.test.mjs",
"packages/cli/tests/launch-account.test.mjs",
"packages/cli/tests/launch-limit-checks.test.mjs",
"packages/cli/tests/launch-limits.test.mjs",
"packages/cli/tests/launch-routes.test.mjs",
"packages/cli/tests/launcher.test.mjs",
"packages/cli/tests/limits-tokens.test.mjs",
"packages/cli/tests/limits.test.mjs",
"packages/cli/tests/mark-read.test.mjs",
"packages/cli/tests/names.test.mjs",
"packages/cli/tests/notifier.test.mjs",
"packages/cli/tests/other-tree.test.mjs",
"packages/cli/tests/project-name-repo.test.mjs",
"packages/cli/tests/project.test.mjs",
"packages/cli/tests/publish-socket.test.mjs",
"packages/cli/tests/stack-copy.test.mjs",
"packages/cli/tests/stack-instances.test.mjs",
"packages/cli/tests/stack-release-external.test.mjs",
"packages/cli/tests/stack-release.test.mjs",
"packages/cli/tests/stack-upgrade.test.mjs",
"packages/cli/tests/tester-http.test.mjs",
"packages/cli/tests/tester-reads.test.mjs",
"packages/cli/tests/tester-threads.test.mjs",
"packages/cli/tests/tester.test.mjs",
"packages/cli/tests/thread-cli.test.mjs",
"packages/cli/tests/thread-launch.test.mjs",
"packages/cli/tests/trackers-boot.test.mjs",
"packages/cli/tests/transport.test.mjs",
"packages/cli/tests/usage.test.mjs",
"packages/cli/tests/verbs.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/cli.log",
"code": 0,
"signal": null,
"wallSeconds": 574.4362024449999,
"pass": 735,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_business_tests_business.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/business/tests/business.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/business/tests/business.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/packages_business_tests_business.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.5239333430000115,
"pass": 19,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_business_tests_cli.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/business/tests/cli.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/business/tests/cli.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/packages_business_tests_cli.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 3.4669965549999615,
"pass": 10,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_business_tests_instance-settings.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/business/tests/instance-settings.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/business/tests/instance-settings.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/packages_business_tests_instance-settings.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.905683660000097,
"pass": 13,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_business_tests_library-projects-protected.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/business/tests/library-projects-protected.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/business/tests/library-projects-protected.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/packages_business_tests_library-projects-protected.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.4774370280000149,
"pass": 4,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_business_tests_resolve.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/business/tests/resolve.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/business/tests/resolve.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/packages_business_tests_resolve.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.4465837360000005,
"pass": 11,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_library_tests_mirror.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/library/tests/mirror.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/library/tests/mirror.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/packages_library_tests_mirror.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 7.3335777119999985,
"pass": 16,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_project_tests_project.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/project/tests/project.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/project/tests/project.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/packages_project_tests_project.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.7260885409999174,
"pass": 15,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_seat_tests_checkout.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/seat/tests/checkout.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/seat/tests/checkout.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/packages_seat_tests_checkout.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 6.367270185999922,
"pass": 78,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "test-auth.sh",
"command": "bash",
"args": [
"scripts/test-auth.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-auth.sh"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/test-auth.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 1.9063287659999915,
"pass": 15,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "test-conductor.sh",
"command": "bash",
"args": [
"scripts/test-conductor.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-conductor.sh"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/test-conductor.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 6.837640707000042,
"pass": 17,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "test-config.sh",
"command": "bash",
"args": [
"scripts/test-config.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-config.sh"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/test-config.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 3.1544246460000287,
"pass": 31,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "test-discord.sh",
"command": "bash",
"args": [
"scripts/test-discord.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-discord.sh"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/test-discord.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 8.776727847000002,
"pass": 78,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "test-extension-package.sh",
"command": "bash",
"args": [
"scripts/test-extension-package.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-extension-package.sh"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/test-extension-package.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 3.01285702399991,
"pass": 18,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "test-foundation.sh",
"command": "bash",
"args": [
"scripts/test-foundation.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-foundation.sh"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/test-foundation.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 39.70872647900006,
"pass": 44,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "test-land-work.sh",
"command": "bash",
"args": [
"scripts/test-land-work.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-land-work.sh"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/test-land-work.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 12.623263413000037,
"pass": 86,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "test-queue.sh",
"command": "bash",
"args": [
"scripts/test-queue.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-queue.sh"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/test-queue.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 23.443742031000088,
"pass": 28,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "test-release.sh",
"command": "bash",
"args": [
"scripts/test-release.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-release.sh"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/test-release.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 12.168674453999964,
"pass": 14,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "test-task.sh",
"command": "bash",
"args": [
"scripts/test-task.sh"
],
"kind": "shell",
"wholeFiles": [
"scripts/test-task.sh"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r5/resume/test-task.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 36.783798266,
"pass": 98,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
}
]
@@ -0,0 +1,23 @@
import {spawn} from 'node:child_process';import {readFileSync,writeFileSync,readdirSync} from 'node:fs';import {join} from 'node:path';import {performance} from 'node:perf_hooks';
const root='/mnt/storage/scratch/tmp/g196-tree-tn651z',out=new URL('.',import.meta.url).pathname;
const jobs=[];
for(const pkg of ['cli']){const files=readdirSync(join(root,'packages',pkg,'tests')).filter(n=>n.endsWith('.test.mjs')).sort().map(n=>`packages/${pkg}/tests/${n}`);jobs.push({name:pkg,command:process.execPath,args:['--test','--test-reporter=tap','--test-concurrency=2',...files],kind:'node',wholeFiles:files});}
const extras=JSON.parse(readFileSync(new URL('../../r4/whole-test-union.json',import.meta.url),'utf8')).extraOutsideWholePackageSuites;
for(const file of extras)jobs.push({name:file.replaceAll('/','_'),command:process.execPath,args:['--test','--test-reporter=tap',file],kind:'node',wholeFiles:[file]});
for(const file of readdirSync(join(root,'scripts')).filter(n=>/^test-.*\.sh$/.test(n)).sort())jobs.push({name:file,command:'bash',args:['scripts/'+file],kind:'shell',wholeFiles:['scripts/'+file]});
writeFileSync(out+'whole-plan.json',JSON.stringify(jobs,null,2)+'\n');
const results=[];
for(const job of jobs){
const log=out+job.name+'.log',start=performance.now();let text='',buffer='',failures=0,stopped=false;
console.log('START '+job.name+' '+job.wholeFiles.length+' whole file(s)');
const child=spawn('bash',['-c','set -o pipefail; { python3 "$G196_BUSY" && "$@"; } 2>&1 | tee "$G196_LOG"','--',job.command,...job.args],{cwd:root,env:{...process.env,G196_LOG:log},stdio:['ignore','pipe','pipe'],detached:true});
const consume=data=>{const part=String(data);text+=part;buffer+=part;const lines=buffer.split('\n');buffer=lines.pop();for(const raw of lines){const line=raw.replace(/\x1b\[[0-9;]*m/g,'');if(/^\s*not ok \d/.test(line)||/^FAIL(?:\s|:)/.test(line)){failures++;if(failures>=2&&!stopped){stopped=true;process.kill(-child.pid,'SIGTERM');}}}};
child.stdout.on('data',consume);child.stderr.on('data',consume);
const status=await new Promise(resolve=>child.on('close',(code,signal)=>resolve({code,signal})));
const summary=key=>{const matches=[...text.matchAll(new RegExp('^# '+key+' (\\d+)','gm'))];return matches.length?Number(matches.at(-1)[1]):null;};
const shell=[...text.matchAll(/(\d+) passed,\s*(\d+) failed/g)].at(-1);
const result={...job,log,...status,wallSeconds:(performance.now()-start)/1000,pass:job.kind==='node'?summary('pass'):shell?Number(shell[1]):null,fail:job.kind==='node'?summary('fail'):shell?Number(shell[2]):null,skip:job.kind==='node'?summary('skipped'):0,observedFailures:failures,stopped,complete:!stopped};
results.push(result);writeFileSync(out+'whole-results.json',JSON.stringify(results,null,2)+'\n');
console.log('END '+job.name+' '+JSON.stringify({code:status.code,signal:status.signal,pass:result.pass,fail:result.fail,skip:result.skip,wallSeconds:result.wallSeconds,stopped}));
if(status.code!==0||failures||result.pass===null){process.exitCode=1;console.log('STOP '+job.name);break;}
}