gander: publish r6 gate and review evidence

This commit is contained in:
jason.woltje committed 2026-10-21 15:47:40 -05:00
1 parent ca1052ea61
commit ec1e7fad82
55 files changed
+15695 -192

No files matched your search

+2
View File
@@ -123,3 +123,5 @@ N1 documented/deferred to R3: user-cli.mjs and authenticateUser wiring are absen
Row222 integration checked on the rebased source: --send library.sync uses the existing call/busCaller, exact HUMAN_CLI child with fresh human nonce, server SO_PEERCRED and runtime verifyPrincipal before owner-cap library dispatch. The internal library sync timer is bus-local, not another caller identity mechanism. r6/REBASE.md records this path, both preserved rebases and the full whole-file union. Rebased final base is f48725cfc, branch gander/row196-r6-prd19. No product code edit for B1/B2. Full golden results await the granted gate; r5 golden results are not carried.
2026-10-21 r6 busy hold: all three bases passed (tester14/0, activation6/0, rehearsal3/0). Before M17 test, guard detected our own sibling tee mutant-driver.log (PID2931286), so no mutant test ran. Raw killed=false is an invalid preflight outcome, not a survivor. Target restored SHA/Git clean. No full golden step started. Sweep0 gate leftovers, eight pre-existing helpers. Returned slot and reported Sage/Mos together in gander-0064; no retry pending ruling. Proposed outer log rename controller.log, no guard change. Full records r6/HOLD.md and logs.
2026-10-21 r6 gate complete under sage-2145 on527b9a1e6: bus627/0, WebUI304/0/1, CLI744/0, twelve extra whole files230/0, ten shell scripts429/0. Fresh golden total2334/0/1, 929.581986 summed seconds. Nine required reruns killed, no timeout, clean SHA/Git restoration; 29 original target blobs match and carry, 38 total. First M17 busy refusal stays not-run under mos-1205, raw records preserved. Sweep0 gate leftovers/eight pre-existing helpers. Slot returned Sage/Mos in gander-0066. Final immutable39-path manifest regenerated against f48725cfc; full recount/kill evidence in r6/. No queue write while Morgana slot runs.
@@ -1,4 +1,4 @@
4f5e1f7cb21d86cced206e25abac032d75c7e3ba683d6f80f42001d5b4211e05 docs/TOOLS.md
0ad63c4f7a6cdd5b2587a0969fe7a95539cf1e4601f51fb33cc4df94a718b2b5 docs/TOOLS.md
10c996d323ac46d45548f7748d40b246de93f8c5eacae9f951c6eeb5dcc62697 packages/bus/README.md
60720461a7994011a9a30594715eb2c992be699cd61c656e77cbd609ad05328e packages/bus/fixtures/peer-client.mjs
0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079 packages/bus/src/human.mjs
@@ -6,7 +6,7 @@ d5d98a9133a1b449acc48143fd559d890a470c6ea210b30b9b70e491e6cd855a packages/bus/s
29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7 packages/bus/src/peercred.mjs
d1536a8f472fa5b3773adb10555529ed049ad63b647c0b44c00ce5f25ce09f85 packages/bus/src/peercred.py
32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd packages/bus/src/principal.mjs
f060bb55bb3abbc9f5d776ce7728a8e49356a6c5307bca8411e6163f0e044e83 packages/bus/src/runtime.mjs
190a4f56c44131f8a2325bc9c4a822556de432d1afd2e75ffe3168a171320bed 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
@@ -16,11 +16,11 @@ cefbc0688d823c69196d94bb71467884acd639070721286d7e8e4e986c8240c1 packages/bus/t
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
414d39e37d8e332761a6120ab728f67538e36082bf1f609eec7747bebdb434d4 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
63dc2af0ff0c8f7c624268a78ffeede1593182a38d657a53e597338edf09226e packages/webui/src/cli.mjs
da624f188c69e016ff82e1d1dcae1c579e68a57f0f25d773bb5d8bca56b80ee1 packages/webui/src/serve.mjs
1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16 packages/webui/src/tester-socket.mjs
2f3ea92cbe1ca115301ee1e3b8fc55a206842606237446b700881ee57a1b18cb packages/webui/tests/browser.mjs
+69 -176
View File
@@ -1,191 +1,84 @@
# Row 196 merge-scoped review manifest
# Row196 r6 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.
Frozen tested candidate: **527b9a1e6cb1e85758e94eeb5d17c542413ceeb3**, based on **f48725cfc**, branch **gander/row196-r6-prd19**. CANDIDATE.sha256 freezes 39 changed source/test/fixture/doc paths; PRODUCT-FILES.json contains baseline and candidate hashes, read directly from Git blobs. Record-only commits after the candidate alter none of those paths.
`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.
This is the merge-scoped round authorized in duckworth-0096 and sage-2142. Duckworth's full round1 was CHANGES, #1694 comment30145, REVIEW-m1.md at659dd4e49. Everything outside B1/B2 stood approved. This round covers B1/B2 tests and their new checks, plus row222 integration in bus/runtime.mjs and webui/cli.mjs. It does not recast round1 as a prior build approval.
## Acceptance evidence
## B1: activation interpreter 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.
`row196 interpreter activation checks receipt, identity, plan and startup log` uses scratch copy verifier stand-ins and real release-script control flow. It checks:
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.
- A successful plan prints the expected interpreter JSON, the started activation log carries the exact same JSON string, and the receipt verifier receives the scratch bus directory, expected identity and fresh start floor.
- A refusing receipt fails the interpreter-receipt gate, retains/restores the exact previous pointer and writes gate-failed/rollback-ok with no success entry. A started bus is required to check a receipt; this case therefore has start calls, as clarified in duckworth-0097.
- A changed inspect identity between preflight and gate refuses even when the stand-in receipt verifier would return true.
- Missing verifier and unsafe inspect refuse interpreter-unsafe in both plan and activation before any start or stop, preserving the pointer.
M30 removes the receipt block; M31 removes expected-identity comparison; M32 removes missing-verifier refusal; M33 removes unsafe-inspect refusal; M34 removes the started-log identity; M35 removes plan identity. All six are killed. Focused base 6/0 and whole CLI 744/0 include this coverage. Stub identities are fixture metadata, not evidence of a real root-owned Python activation.
## B2: rehearsal transport and scratch root
`row196 rehearsal selects socket only for marked copies and uses scratch dataRoot` captures the stand-in Console argv and its parsed MOSAIC_CONFIG dataRoot. The marked copy receives exactly --tester-socket, no TCP flag. The legacy copy gets no tester flag. Both receive `<rehearsal>/data`, not the live root, and live/backup evidence stays byte-identical. The existing stand-in Console remains a synthetic test listener.
M36 empties the marked-copy socket flags; M37 gives the legacy copy a socket flag. Both are killed. Focused base 3/0 and whole CLI include this coverage. The original callback test's name/assertions remain unchanged; r5's activation-only repair is retained.
## Row222 merge and review notes
Both rebases were conflict-free. Initial 222-only branch gander/row196-r6 remains at2a989d466. The later branch rebases onto f48725cfc under sage-2142; r6/range-diff-prd19.txt and patch-id files preserve the exact comparison. The first source patch changes only Console startServer context retaining librarySync; the other ten commits compare equal. r6/review-delta.diff contains the runtime/Console merge and B1/B2/doc changes against the previously reviewed r5 candidate.
Under --send, Console librarySync uses the existing call/busCaller, exact HUMAN_CLI child and fresh MOSAIC_BUS_CLI_NONCE. server.mjs obtains SO_PEERCRED, runtime authenticateHuman calls verifyPrincipal, then library.sync dispatches under the owner cap with awaited release. The bus-local sync timer calls the library implementation internally; it creates no new external authentication route. Runtime keeps interpreter validation/receipt, peer reader, shared principal binding, sync timer lifecycle and cleanup. Fresh bus/library-sync tests and whole WebUI/CLI passed. No product code was changed for B1/B2.
- N1 documented/deferred to R3: user-cli.mjs and authenticateUser wiring remain absent by design, so user envelopes refuse. R3 must add and test both.
- N2 deferred to a later row: dead testerNoSignIn arguments/comments remain; no product cleanup is mixed into the test changes.
- N3 documented without code change: direct serve without peerReader needs safe system Python even for cap-only calls; runtime passes a peerReader, and the fallback fails closed.
- N4 fixed in docs/TOOLS.md: rehearsal's longer socket path may fail closed even after the live activation preflight passes.
BUILD-LOG.md's four row196 phase lines stay outside the manifest, to land as Sage's separate append-only doc commit under gander-0060. Row252 DESIGN.md/BUILD-NOTES.md land with252. Remaining legacy tester-port producer/acceptance scripts are row253, per r5/TESTER-PORT-AUDIT.md; this gate does not claim those live callers have migrated.
## Fresh gate and carries
**2334 pass, 0 fail, 1 existing editor-build skip. 38/38 checks killed: nine fresh and 29 carried by exact target SHA equality.** No golden result carries from r5. M17 reran because row222 changed broker.mjs; no old definition targets runtime.mjs or webui/cli.mjs. Original raw failures and the preflight not-run outcome are preserved, not relabeled.
Each start used busy &&, pipefail and tee, with TMPDIR from mktemp under /mnt/storage/scratch/tmp. The self-named outer tee refusal was classified not a stop by mos-1205; only its log name changed. Both guards remain unchanged. Harness command names were checked against the detector before resumption. Fresh base times are recorded; no fresh timeout occurred.
The whole-file union retains the eight row215 extras and adds conversation/cohort, library/mapping, library/sync and tasks/requirements touched by the new base. All twelve ran whole, as did bus, WebUI, CLI and all ten shell scripts. Raw logs/whole-results.json are in r6/; log-recount.json independently verifies every summary and records log hashes. consolidated-kills.json records each accepted source and target hash. r6/RESULTS.md lists all timings and every kill.
Final sweep: **0 gate leftovers**, eight pre-existing harness helpers retained. Gate tracked tree clean; only linked node_modules is untracked. Slot returned to Sage and Mos in gander-0066. No merge, deployment, live activation, actual second-uid probe or real provider test was performed.
| 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 |
| bus | 627 | 0 | 0 | 35.875042 |
| webui | 304 | 0 | 1 | 111.034072 |
| cli | 744 | 0 | 0 | 587.827141 |
| packages_business_tests_business.test.mjs | 19 | 0 | 0 | 1.485772 |
| packages_business_tests_cli.test.mjs | 10 | 0 | 0 | 3.404195 |
| packages_business_tests_instance-settings.test.mjs | 13 | 0 | 0 | 1.870804 |
| packages_business_tests_library-projects-protected.test.mjs | 4 | 0 | 0 | 1.470974 |
| packages_business_tests_resolve.test.mjs | 11 | 0 | 0 | 1.436755 |
| packages_conversation_tests_cohort.test.mjs | 38 | 0 | 0 | 27.922147 |
| packages_library_tests_mapping.test.mjs | 8 | 0 | 0 | 1.413677 |
| packages_library_tests_mirror.test.mjs | 16 | 0 | 0 | 7.354534 |
| packages_library_tests_sync.test.mjs | 15 | 0 | 0 | 2.932405 |
| packages_project_tests_project.test.mjs | 15 | 0 | 0 | 1.768720 |
| packages_seat_tests_checkout.test.mjs | 78 | 0 | 0 | 6.295986 |
| packages_tasks_tests_requirements.test.mjs | 3 | 0 | 0 | 1.398276 |
| test-auth.sh | 15 | 0 | 0 | 1.908123 |
| test-conductor.sh | 17 | 0 | 0 | 8.057174 |
| test-config.sh | 31 | 0 | 0 | 3.167892 |
| test-discord.sh | 78 | 0 | 0 | 8.613371 |
| test-extension-package.sh | 18 | 0 | 0 | 2.651510 |
| test-foundation.sh | 44 | 0 | 0 | 39.145345 |
| test-land-work.sh | 86 | 0 | 0 | 12.047738 |
| test-queue.sh | 28 | 0 | 0 | 21.795575 |
| test-release.sh | 14 | 0 | 0 | 10.876534 |
| test-task.sh | 98 | 0 | 0 | 27.828225 |
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.
## Preserved boundary and provenance limits
## Review items
The approved design r3 and round1 hold the private tester listener, one verifier, kernel-peer proof, path-bound human walk, Console direct-parent user rule and separate nonce kinds. bus.tester remains Jason's switch. No browser relay or control-board change is included. The 7331 tooling boundary stays inventory only. Explicit human refusal is human-required and helper refusal peercred-required; abrupt close without a response remains outcome-unknown.
| Item | Change and acceptance evidence | Mutants |
|---|---|---|
| Kernel peer proof | `bus/src/peercred.py` obtains SO_PEERCRED from inherited fd 3. `peercred.mjs` owns the accepted Socket in each connection closure, bounds helpers and validates all three safe integers. `peercred.test.mjs` overlaps eight distinct callers plus a copier and checks traffic after helper exit. | M4, M5, M20 |
| Interpreter trust | `bus/src/interpreter.mjs` resolves fixed system Python, checks root ownership, safe ancestors, ELF and version, and refuses home paths or shims. Startup appends actual identity; activation compares the fresh receipt. `interpreter.test.mjs` covers safe replacement and unchanged older receipt. | M21, M23 |
| Startup FIFO refusal | Receipt opens include O_NONBLOCK before fstat, avoiding an indefinite FIFO open. `interpreter.test.mjs`, `non-regular startup receipt refuses promptly without waiting on a FIFO peer`, was RED by timeout, then GREEN. Evidence: `evidence/interpreter-fifo-red.txt`, `evidence/interpreter-green.txt`. No live receipt was used. | M25 removes O_NONBLOCK |
| Missing helper refusal | Reader construction refuses missing, symlink or non-regular peer helper before opening the broker socket. `peercred.test.mjs`, `missing or non-regular peer helper refuses at construction before opening the bus`, was RED, then GREEN. Evidence: `evidence/peer-helper-red.txt`, `evidence/peercred-green.txt`. | M26 removes helper preflight |
| Helper shutdown | Reader close kills and awaits helper close events; server close awaits it. `peercred.test.mjs`, `shutdown waits for killed helper close before returning`, was RED, then GREEN. Evidence: `evidence/peer-shutdown-red.txt`, `evidence/peercred-green.txt`. | M27 returns without waiting |
| Shared principal | `bus/src/principal.mjs` checks kernel uid/PID, retains the human walk, separates nonce kinds and requires the exact same-tree Console serve direct parent for users. `principal.test.mjs` supplies process-table refusals. User id is provenance only; R3 owns mapping, grants and user dispatch. | M6, M8-M12, M14, M18 |
| Request lifetime | `bus/src/server.mjs` runs the helper only for proof envelopes and releases transient caps for sync/async success, refusal, timeout and close. `peer-transport.test.mjs` tests cleanup and fails if a cap request invokes the helper. | M13, M22 |
| Private tester ingress | `webui/src/tester-socket.mjs` owns 0700 console directory and 0600 socket; `serve.mjs` preserves tester policy and refuses sign-in headers/cookies. `tester-socket.test.mjs` covers unsafe paths, origin/Host, instance separation and HTTP access. | M1-M3, M7, M19 |
| Owned inode cleanup | sage-1382 selects temporary bind, rename to final, conditional final dev/ino cleanup. `tester-socket.test.mjs` asserts temporary name absent after bind/close and replacement final inode survives close. Scratch proof and remaining same-uid race are in BUILD.md. | M24 binds final directly |
| Tester policy | `bus.tester` remains Jason's switch. Existing `tester.test.mjs` verifies refusals. No user widening, new browser relay or control-board change. | M17 |
| Consumer migration | WebUI CLI, service rendering, release plan/activation/rehearsal and CLI Unix HTTP helper carry explicit --tester-socket. Inherited TCP on a new target refuses before stop without explicit conversion. Unsupported rollback disables tester and reports it. Focused service/release/tester HTTP files cover these paths. | M15, M16 |
| Proof pair ordering | Conversion plus an explicit proof pair keeps pointer and unit argv in the same order: preview, proof pair, tester socket. The focused row196 release test was RED with the old insertion scan, then GREEN after including --tester-socket in its stop list. The proof-file no-read check also passes. Evidence: `evidence/release-proof-order-red.txt` and `evidence/release-proof-order-green.txt`. | M28 omits socket from the insertion boundary |
| 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. |
Row164's intentional re-pins remain human.mjs 0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079 and webui bus.mjs 934ab2f9b6bde72aafe7814758550c283eb25a4f3a23b284021b13718d67178f. The human file adds the distinct user nonce/parameterized walk; webui bus adds spawn nonce and peer-error mapping. Both pins match the immutable r6 blobs; human-cli and transport pins are unchanged.
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
Duckworth should review this hunk separately, as requested in sage-1409.
Only two baselines in `packages/bus/tests/channel-proof.test.mjs` change.
| File | Previous sha256 | Candidate sha256 | Why |
|---|---|---|---|
| `packages/bus/src/human.mjs` | `b995fc5cff3af8ade4c990d0e3bebf9d83829e00f034ebc9c3dcfd05f252b573` | `0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079` | Read the distinct user nonce and parameterize the existing path-bound human walk for the shared verifier. |
| `packages/webui/src/bus.mjs` | `76a1b57858c4aa41071746713a196299264851c18322a6f9869d553f0362d421` | `934ab2f9b6bde72aafe7814758550c283eb25a4f3a23b284021b13718d67178f` | Supply the initial owner CLI nonce at spawn and map peercred-required to HTTP refusal. |
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`. Both candidate hashes were checked against immutable 05e940117 and match the table.
## Consumer inventory and window
Tester tools use `packages/cli/src/tester-http.mjs` and the selected instance's
console/tester.sock. WebUI tester test fixtures and browser fixtures use scratch
Unix sockets. The stack-release gate and rehearsal carry --tester-socket and
compare the bus startup interpreter receipt. Package READMEs and docs/TOOLS.md
show the Unix path and explicit migration. Direct browser access is lost by
Mos's accepted ruling mos-1015; a future SSO relay needs its own row. Name that
loss to Jason in the authorized window. No candidate is live from this work.
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.
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.
## 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.
## 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.
## Refused caller behavior and static review
The verifier path is changed by this row. A completed proof refusal returns an
explicit protocol error before closing the connection: `human-required` for a
rejected human proof and `peercred-required` for helper failure. The real Client
receives those codes in `peer-transport.test.mjs`, without broker dispatch. No
client code is changed. Abrupt close, transport error or timeout without a valid
response still reports `outcome-unknown`; this row does not convert that case.
Quackerjack's reported failed-proof close was not reproduced against this branch's
base. A scratch comparison loads HEAD's server and the candidate with the same
refusing authenticator and unchanged Client. Both return `human-required`.
Evidence: `evidence/refusal-baseline-comparison.txt`. This comparison does not
claim to reproduce Quackerjack's exact process ancestry or instance. The manifest
therefore claims the explicit codes only for the paths verified here.
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 a killed mutant. An unrelated change to legacy
tester-port-invalid text was also removed to preserve the existing contract.
The authorized golden files are complete. No live activation or uid window was run.
## Limits carried to acceptance
No real second uid or live instance is exercised. Foreign uid metadata is a
stand-in. The authorized window still owns real uid-denial and consumer audit.
Python is a new bus-host dependency; the worker Containerfile is unchanged.
Restarts validate the current interpreter and append a receipt; old receipts
are preserved. Interpreter changes use the next reviewed copy and preserve
the already-active refusal.
Hostile same-uid processes can read or alter same-uid state, detach or interfere
with pathname checks and Console provenance. Separate uids narrow cross-instance
reach, not reach within one instance. R3 must source the proof id only from
claims verified for that request's live session and reread grants per request.
P19 333 must retain this text unchanged:
Hostile same-uid processes remain a residual for readable state, process metadata and pathname races. Separate uids narrow cross-instance reach, not reach within one instance. R3 owns verified-session claim mapping, user wiring and live grants. P19 333 keeps the approved text unchanged:
The Console provenance option trusts verified code and process metadata, not an independent
bus-side OIDC exchange. That trade must be approved, not hidden behind the phrase zero trust.
@@ -1,12 +1,12 @@
{
"status": "verified immutable candidate",
"base": "e54e05463",
"candidate": "05e940117",
"status": "verified immutable r6 candidate",
"base": "f48725cfc",
"candidate": "527b9a1e6cb1e85758e94eeb5d17c542413ceeb3",
"files": [
{
"path": "docs/TOOLS.md",
"baselineSha256": "17528973e2ed9748f5b0a9218feb5b2ae9789c13998e29e448b5775aae3c561d",
"candidateSha256": "4f5e1f7cb21d86cced206e25abac032d75c7e3ba683d6f80f42001d5b4211e05"
"candidateSha256": "0ad63c4f7a6cdd5b2587a0969fe7a95539cf1e4601f51fb33cc4df94a718b2b5"
},
{
"path": "packages/bus/README.md",
@@ -45,8 +45,8 @@
},
{
"path": "packages/bus/src/runtime.mjs",
"baselineSha256": "c759e665514a5bcad40536bc9f979837187fe6523462b3c0a0687182885c3ac6",
"candidateSha256": "f060bb55bb3abbc9f5d776ce7728a8e49356a6c5307bca8411e6163f0e044e83"
"baselineSha256": "07394509d9828519fe13112f02cd3907df1113e822d3051be3661af8edaee0ec",
"candidateSha256": "190a4f56c44131f8a2325bc9c4a822556de432d1afd2e75ffe3168a171320bed"
},
{
"path": "packages/bus/src/server.mjs",
@@ -96,7 +96,7 @@
{
"path": "packages/cli/tests/stack-release.test.mjs",
"baselineSha256": "46cc95a6e75a89b907cdd5e9bd03853e1d1f75f1ced81084d968c5476466822e",
"candidateSha256": "2a5a896831c1bab2ae239c90651592c95d6d08c151df518a5f6cdae65bded3ef"
"candidateSha256": "414d39e37d8e332761a6120ab728f67538e36082bf1f609eec7747bebdb434d4"
},
{
"path": "packages/cli/tests/tester-http.test.mjs",
@@ -115,8 +115,8 @@
},
{
"path": "packages/webui/src/cli.mjs",
"baselineSha256": "e98fd2fe4e621d5b4fa1ed95c4d4585469e7ab7a11dd379dc541dddb1b1a1f02",
"candidateSha256": "2c7f791e53b4bce8dc23aa974a8fe4c5d7b59204331a3d8ac398a31e530517a2"
"baselineSha256": "5c7e99b7d506d12bb369769b04c0d515bf3252329ad76e61478c3d92a7b4a802",
"candidateSha256": "63dc2af0ff0c8f7c624268a78ffeede1593182a38d657a53e597338edf09226e"
},
{
"path": "packages/webui/src/serve.mjs",
+2
View File
@@ -34,3 +34,5 @@ Run 4 complete, sage-2124 on 05e940117: 1330/0 continuation, 2256/0/1 combined g
Manifest published at 93f3332b2; row196 in-review round1 candidate digest d9fefc49ab1affb02d68b35b658772da4e82c724255611a7fe1d59b48b62006c, rev2968. Review transport failed at rev2969 due unset own-token credential file. Sent Duckworth gander-0058 and Sage gander-0059; Sage posts as jarvis. All queue writes done; hold them until Megavolt returns. Await Duckworth merge-scoped verdict, then Sage gate. No PR/merge/activation started.
R6 candidate527b9a1e6 on f48725cfc, branch gander/row196-r6-prd19; initial222 rebase preserved on gander/row196-r6. Focused9/9 and granted bases23/0 pass. Gate held before M17 test because own outer tee mutant-driver.log matched busy detector; no mutant/golden test ran. Target restored clean. gander-0064 to Sage/Mos returned slot, sweep0 gate leftovers/eight pre-existing helpers. Await ruling before retry. No queue writes. r6/HOLD.md records diagnosis; proposed change only outer log name, no code/guard edit.
R6 complete on527b9a1e6, based f48725cfc: fresh2334/0/1, 38 kills (nine fresh, 29 exact-target carries), no timeouts. Slot returned gander-0066, sweep0/eight pre-existing helpers. New manifest/hash files freeze the candidate. Duckworth next reviews B1/B2 and row222 integration under0096; full first review outside B1/B2 stands. Await round2 queue coordination from Sage; no writes during Morgana244 slot. No PR/merge/live activation.
+2
View File
@@ -5,3 +5,5 @@ Candidate 527b9a1e6 on f48725cfc; grant sage-2142. The three base invocations pa
M17 did not run its test. Its raw result is killed=false/status1, not a real survivor. The mutated broker restored to its original SHA256 and git status was empty. No new mutant test, full package suite, extra file or shell suite started. No product or test changed.
Sweep: zero gate leftovers; eight pre-existing harness helpers remain. Slot returned and simultaneous report sent to Sage/Mos as gander-0064. No retry pending ruling. Proposed launch correction: rename only the outer tee log to controller.log. Keep busy.py and the canonical guard unchanged. Preserve original records.
mos-1205 / sage-2145: busy refusal is not a counted stop. M17 is not run, neither a survivor nor a kill. Raw M17 output/results copied unchanged to first-attempt/. Rename only the outer log to controller.log; both busy guards remain unchanged. Resume the same candidate 527b9a1e6; 23 passing bases carry.
@@ -0,0 +1,78 @@
# R6 gate results
All golden results are fresh on 527b9a1e6cb1e85758e94eeb5d17c542413ceeb3. Bases 23/0 carry from the same candidate under sage-2145. The earlier M17 busy refusal is not run per mos-1205; unchanged raw output is in first-attempt/.
| Step | Pass | Fail | Skip | Wall seconds |
|---|---:|---:|---:|---:|
| bus | 627 | 0 | 0 | 35.875042 |
| webui | 304 | 0 | 1 | 111.034072 |
| cli | 744 | 0 | 0 | 587.827141 |
| packages_business_tests_business.test.mjs | 19 | 0 | 0 | 1.485772 |
| packages_business_tests_cli.test.mjs | 10 | 0 | 0 | 3.404195 |
| packages_business_tests_instance-settings.test.mjs | 13 | 0 | 0 | 1.870804 |
| packages_business_tests_library-projects-protected.test.mjs | 4 | 0 | 0 | 1.470974 |
| packages_business_tests_resolve.test.mjs | 11 | 0 | 0 | 1.436755 |
| packages_conversation_tests_cohort.test.mjs | 38 | 0 | 0 | 27.922147 |
| packages_library_tests_mapping.test.mjs | 8 | 0 | 0 | 1.413677 |
| packages_library_tests_mirror.test.mjs | 16 | 0 | 0 | 7.354534 |
| packages_library_tests_sync.test.mjs | 15 | 0 | 0 | 2.932405 |
| packages_project_tests_project.test.mjs | 15 | 0 | 0 | 1.768720 |
| packages_seat_tests_checkout.test.mjs | 78 | 0 | 0 | 6.295986 |
| packages_tasks_tests_requirements.test.mjs | 3 | 0 | 0 | 1.398276 |
| test-auth.sh | 15 | 0 | 0 | 1.908123 |
| test-conductor.sh | 17 | 0 | 0 | 8.057174 |
| test-config.sh | 31 | 0 | 0 | 3.167892 |
| test-discord.sh | 78 | 0 | 0 | 8.613371 |
| test-extension-package.sh | 18 | 0 | 0 | 2.651510 |
| test-foundation.sh | 44 | 0 | 0 | 39.145345 |
| test-land-work.sh | 86 | 0 | 0 | 12.047738 |
| test-queue.sh | 28 | 0 | 0 | 21.795575 |
| test-release.sh | 14 | 0 | 0 | 10.876534 |
| test-task.sh | 98 | 0 | 0 | 27.828225 |
Golden totals: 2334 pass, 0 fail, 1 editor skip; summed wall 929.581986 seconds. Shell queue tests additionally print canonical-only verification/render skips because this is a scratch checkout. No dependency install.
| ID | Result | Source | Target |
|---|---|---|---|
| M1 | killed, carried | r2/mutants | packages/webui/src/serve.mjs |
| M2 | killed, carried | r2/mutants | packages/webui/src/tester-socket.mjs |
| M3 | killed, carried | r2/mutants | packages/webui/src/serve.mjs |
| M4 | killed, carried | r2/mutants | packages/bus/src/principal.mjs |
| M5 | killed, carried | r2/mutants | packages/bus/src/peercred.mjs |
| M6 | killed, carried | r2/mutants | packages/bus/src/principal.mjs |
| M7 | killed, carried | r2/mutants | packages/webui/src/tester-socket.mjs |
| M8 | killed, carried | r2/mutants | packages/bus/src/human.mjs |
| M9 | killed, carried | r2/mutants | packages/bus/src/human.mjs |
| M10 | killed, carried | r2/mutants | packages/bus/src/principal.mjs |
| M11 | killed, carried | r2/mutants | packages/bus/src/principal.mjs |
| M12 | killed, carried | r2/mutants | packages/bus/src/human.mjs |
| M13 | killed, carried | r4/gate/killers | packages/bus/src/server.mjs |
| M14 | killed, carried | r2/mutants | packages/bus/src/principal.mjs |
| M15 | killed, carried | r2/mutants | scripts/stack-release.sh |
| M16 | killed, carried | r2/mutants | scripts/stack-release.sh |
| M17 | killed, fresh | r6/killers | packages/bus/src/broker.mjs |
| M18 | killed, carried | r2/mutants | packages/bus/src/principal.mjs |
| M19 | killed, carried | r2/mutants | packages/cli/src/tester-http.mjs |
| M20 | killed, carried | r2/mutants | packages/bus/src/peercred.mjs |
| M21 | killed, carried | r2/mutants | packages/bus/src/interpreter.mjs |
| M22 | killed, carried | r4/gate/killers | packages/bus/src/server.mjs |
| M23 | killed, carried | r2/run2/killers | packages/bus/src/interpreter.mjs |
| M24 | killed, carried | r2/run2/killers | packages/webui/src/tester-socket.mjs |
| M25 | killed, carried | r3/gate/killers | packages/bus/src/interpreter.mjs |
| M26 | killed, carried | r2/run2/killers | packages/bus/src/peercred.mjs |
| M27 | killed, carried | r2/run2/killers | packages/bus/src/peercred.mjs |
| M28 | killed, carried | r3/gate/killers | scripts/stack-release.sh |
| M28b | killed, carried | r3/gate/killers | scripts/stack-release.sh |
| M29 | killed, carried | r3/gate/killers | scripts/stack-release.sh |
| M30 | killed, fresh | r6/killers | scripts/stack-release.sh |
| M31 | killed, fresh | r6/killers | scripts/stack-release.sh |
| M32 | killed, fresh | r6/killers | scripts/stack-release.sh |
| M33 | killed, fresh | r6/killers | scripts/stack-release.sh |
| M34 | killed, fresh | r6/killers | scripts/stack-release.sh |
| M35 | killed, fresh | r6/killers | scripts/stack-release.sh |
| M36 | killed, fresh | r6/killers | scripts/stack-release.sh |
| M37 | killed, fresh | r6/killers | scripts/stack-release.sh |
Nine fresh kills, 29 SHA-verified carries, 38 total. No fresh timeout. Each fresh target restored byte-identically with empty Git status. The 29 carried target hashes also match the immutable r6 blobs. Zero gate leftovers, eight pre-existing harness helpers retained. Slot returned in gander-0066. Both busy guards unchanged; launch-preflight.json checks harness names.
Raw M17 TAP diagnostics retain two whitespace-only output lines. They are preserved byte-for-byte; code/docs/JSON whitespace checks exclude raw .log and .txt evidence.
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,330 @@
{
"candidate": "527b9a1e6cb1e85758e94eeb5d17c542413ceeb3",
"killed": 38,
"fresh": 9,
"carried": 29,
"rows": [
{
"id": "M1",
"killed": true,
"carried": true,
"targetFile": "packages/webui/src/serve.mjs",
"targetSha256": "da624f188c69e016ff82e1d1dcae1c579e68a57f0f25d773bb5d8bca56b80ee1",
"source": "r2/mutants"
},
{
"id": "M2",
"killed": true,
"carried": true,
"targetFile": "packages/webui/src/tester-socket.mjs",
"targetSha256": "1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16",
"source": "r2/mutants"
},
{
"id": "M3",
"killed": true,
"carried": true,
"targetFile": "packages/webui/src/serve.mjs",
"targetSha256": "da624f188c69e016ff82e1d1dcae1c579e68a57f0f25d773bb5d8bca56b80ee1",
"source": "r2/mutants"
},
{
"id": "M4",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/principal.mjs",
"targetSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd",
"source": "r2/mutants"
},
{
"id": "M5",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/peercred.mjs",
"targetSha256": "29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7",
"source": "r2/mutants"
},
{
"id": "M6",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/principal.mjs",
"targetSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd",
"source": "r2/mutants"
},
{
"id": "M7",
"killed": true,
"carried": true,
"targetFile": "packages/webui/src/tester-socket.mjs",
"targetSha256": "1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16",
"source": "r2/mutants"
},
{
"id": "M8",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/human.mjs",
"targetSha256": "0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079",
"source": "r2/mutants"
},
{
"id": "M9",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/human.mjs",
"targetSha256": "0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079",
"source": "r2/mutants"
},
{
"id": "M10",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/principal.mjs",
"targetSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd",
"source": "r2/mutants"
},
{
"id": "M11",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/principal.mjs",
"targetSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd",
"source": "r2/mutants"
},
{
"id": "M12",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/human.mjs",
"targetSha256": "0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079",
"source": "r2/mutants"
},
{
"id": "M13",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/server.mjs",
"targetSha256": "7be306c830aa98763b34b329995b40e9df443483fe20fcd69100a3acb6311bd6",
"source": "r4/gate/killers"
},
{
"id": "M14",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/principal.mjs",
"targetSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd",
"source": "r2/mutants"
},
{
"id": "M15",
"killed": true,
"carried": true,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r2/mutants"
},
{
"id": "M16",
"killed": true,
"carried": true,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r2/mutants"
},
{
"id": "M17",
"killed": true,
"carried": false,
"targetFile": "packages/bus/src/broker.mjs",
"targetSha256": "c2f2f558aae5768d3f5fe2ecc113760cc4027d868bb74627a6702c6babd96db2",
"source": "r6/killers",
"wallSeconds": 2.728,
"baseWallSeconds": 2.725494864
},
{
"id": "M18",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/principal.mjs",
"targetSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd",
"source": "r2/mutants"
},
{
"id": "M19",
"killed": true,
"carried": true,
"targetFile": "packages/cli/src/tester-http.mjs",
"targetSha256": "4bd7bdf0898844684ebf9444b110d2c5b6fa874b2681183e54f1f62f97823192",
"source": "r2/mutants"
},
{
"id": "M20",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/peercred.mjs",
"targetSha256": "29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7",
"source": "r2/mutants"
},
{
"id": "M21",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/interpreter.mjs",
"targetSha256": "d5d98a9133a1b449acc48143fd559d890a470c6ea210b30b9b70e491e6cd855a",
"source": "r2/mutants"
},
{
"id": "M22",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/server.mjs",
"targetSha256": "7be306c830aa98763b34b329995b40e9df443483fe20fcd69100a3acb6311bd6",
"source": "r4/gate/killers"
},
{
"id": "M23",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/interpreter.mjs",
"targetSha256": "d5d98a9133a1b449acc48143fd559d890a470c6ea210b30b9b70e491e6cd855a",
"source": "r2/run2/killers"
},
{
"id": "M24",
"killed": true,
"carried": true,
"targetFile": "packages/webui/src/tester-socket.mjs",
"targetSha256": "1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16",
"source": "r2/run2/killers"
},
{
"id": "M25",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/interpreter.mjs",
"targetSha256": "d5d98a9133a1b449acc48143fd559d890a470c6ea210b30b9b70e491e6cd855a",
"source": "r3/gate/killers"
},
{
"id": "M26",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/peercred.mjs",
"targetSha256": "29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7",
"source": "r2/run2/killers"
},
{
"id": "M27",
"killed": true,
"carried": true,
"targetFile": "packages/bus/src/peercred.mjs",
"targetSha256": "29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7",
"source": "r2/run2/killers"
},
{
"id": "M28",
"killed": true,
"carried": true,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r3/gate/killers"
},
{
"id": "M28b",
"killed": true,
"carried": true,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r3/gate/killers"
},
{
"id": "M29",
"killed": true,
"carried": true,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r3/gate/killers"
},
{
"id": "M30",
"killed": true,
"carried": false,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r6/killers",
"wallSeconds": 10.226,
"baseWallSeconds": 13.037174619
},
{
"id": "M31",
"killed": true,
"carried": false,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r6/killers",
"wallSeconds": 11.644,
"baseWallSeconds": 13.037174619
},
{
"id": "M32",
"killed": true,
"carried": false,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r6/killers",
"wallSeconds": 12.902,
"baseWallSeconds": 13.037174619
},
{
"id": "M33",
"killed": true,
"carried": false,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r6/killers",
"wallSeconds": 12.069,
"baseWallSeconds": 13.037174619
},
{
"id": "M34",
"killed": true,
"carried": false,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r6/killers",
"wallSeconds": 12.854,
"baseWallSeconds": 13.037174619
},
{
"id": "M35",
"killed": true,
"carried": false,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r6/killers",
"wallSeconds": 11.586,
"baseWallSeconds": 13.037174619
},
{
"id": "M36",
"killed": true,
"carried": false,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r6/killers",
"wallSeconds": 8.629,
"baseWallSeconds": 9.069833057000002
},
{
"id": "M37",
"killed": true,
"carried": false,
"targetFile": "scripts/stack-release.sh",
"targetSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2",
"source": "r6/killers",
"wallSeconds": 7.91,
"baseWallSeconds": 9.069833057000002
}
]
}
@@ -0,0 +1,9 @@
M17 KILLED base=2.725494864s timeout=false
M30 KILLED base=13.037174619s timeout=false
M31 KILLED base=13.037174619s timeout=false
M32 KILLED base=13.037174619s timeout=false
M33 KILLED base=13.037174619s timeout=false
M34 KILLED base=13.037174619s timeout=false
M35 KILLED base=13.037174619s timeout=false
M36 KILLED base=9.069833057000002s timeout=false
M37 KILLED base=9.069833057000002s timeout=false
+154
View File
@@ -0,0 +1,154 @@
import hashlib
import json
import re
import subprocess
from pathlib import Path
root = Path('agents/gander/work/queue-196')
out = root / 'r6'
candidate = '527b9a1e6cb1e85758e94eeb5d17c542413ceeb3'
base = 'f48725cfc'
def git(*args):
return subprocess.check_output(['git', *args], stderr=subprocess.DEVNULL)
def sha(value):
return hashlib.sha256(value).hexdigest()
files = git('diff', '--name-only', base, candidate, '--', 'packages', 'scripts', 'docs/TOOLS.md').decode().splitlines()
entries = []
for file in files:
try:
before = sha(git('show', base + ':' + file))
except subprocess.CalledProcessError:
before = None
entries.append(dict(path=file, baselineSha256=before, candidateSha256=sha(git('show', candidate + ':' + file))))
assert len(entries) == 39
(root / 'PRODUCT-FILES.json').write_text(json.dumps(dict(status='verified immutable r6 candidate', base=base, candidate=candidate, files=entries), indent=2) + '\n')
manifest = ''.join(f"{e['candidateSha256']} {e['path']}\n" for e in entries)
(root / 'CANDIDATE.sha256').write_text(manifest)
results = json.loads((out / 'whole-results.json').read_text())
assert len(results) == 25
recounts = []
for result in results:
assert result['complete'] and result['code'] == 0 and result['fail'] == 0
log = out / (result['name'] + '.log')
text = log.read_text()
if result['kind'] == 'node':
actual = [int(re.findall(r'^# ' + key + r' (\d+)$', text, re.M)[-1]) for key in ['pass', 'fail', 'skipped']]
assert actual == [result['pass'], result['fail'], result['skip']]
else:
assert tuple(map(int, re.findall(r'(\d+) passed,\s*(\d+) failed', text)[-1])) == (result['pass'], result['fail'])
recounts.append(dict(log=log.name, sha256=sha(log.read_bytes()), passCount=result['pass'], failCount=result['fail']))
(out / 'log-recount.json').write_text(json.dumps(recounts, indent=2) + '\n')
old = json.loads((root / 'r4/gate/consolidated-kills.json').read_text())['rows']
fresh = json.loads((out / 'killers/results.json').read_text())
specs = {s['id']: s for s in json.loads((out / 'uniqueness.json').read_text())}
kills = []
for item in old:
if item['id'] == 'M17':
continue
file = item['targetFile']
assert sha(git('show', candidate + ':' + file)) == item['restoredSha256']
kills.append(dict(id=item['id'], killed=True, carried=True, targetFile=file, targetSha256=item['restoredSha256'], source=item['evidenceFolder']))
for item in fresh:
assert item['killed'] and not item['timedOut'] and item['restoredGitStatus'] == '' and item['syntaxStatus'] == 0
file = specs[item['id']]['file']
assert sha(git('show', candidate + ':' + file)) == item['restoredSha256']
kills.append(dict(id=item['id'], killed=True, carried=False, targetFile=file, targetSha256=item['restoredSha256'], source='r6/killers', wallSeconds=item['wallSeconds'], baseWallSeconds=item['baseWallSeconds']))
assert len(kills) == len({x['id'] for x in kills}) == 38
kills.sort(key=lambda x: (int(x['id'][1:].rstrip('b')), x['id'].endswith('b')))
(out / 'consolidated-kills.json').write_text(json.dumps(dict(candidate=candidate, killed=38, fresh=9, carried=29, rows=kills), indent=2) + '\n')
def totals(rows):
return dict(passCount=sum(x['pass'] for x in rows), failCount=sum(x['fail'] for x in rows), skipCount=sum(x['skip'] for x in rows), wallSeconds=sum(x['wallSeconds'] for x in rows))
sweep = json.loads((out / 'process-sweep.json').read_text())
assert sweep['gateLeftoverCount'] == 0
summary = dict(candidate=candidate, base=base, grants=['sage-2142', 'sage-2145'], golden=totals(results), extraFiles=totals(results[3:15]), shellScripts=totals(results[15:]), killed=38, freshKills=9, carriedKills=29, freshKillWallSeconds=sum(x['wallSeconds'] for x in fresh), sweep=sweep)
assert summary['golden']['passCount'] == 2334
(out / 'summary.json').write_text(json.dumps(summary, indent=2) + '\n')
table = '| Step | Pass | Fail | Skip | Wall seconds |\n|---|---:|---:|---:|---:|\n'
for result in results:
table += f"| {result['name']} | {result['pass']} | {result['fail']} | {result['skip']} | {result['wallSeconds']:.6f} |\n"
kill_table = '| ID | Result | Source | Target |\n|---|---|---|---|\n'
for item in kills:
kill_table += f"| {item['id']} | killed, {'carried' if item['carried'] else 'fresh'} | {item['source']} | {item['targetFile']} |\n"
(out / 'RESULTS.md').write_text('# R6 gate results\n\nAll golden results are fresh on ' + candidate + '. Bases 23/0 carry from the same candidate under sage-2145. The earlier M17 busy refusal is not run per mos-1205; unchanged raw output is in first-attempt/.\n\n' + table + '\nGolden totals: 2334 pass, 0 fail, 1 editor skip; summed wall 929.581986 seconds. Shell queue tests additionally print canonical-only verification/render skips because this is a scratch checkout. No dependency install.\n\n' + kill_table + '\nNine fresh kills, 29 SHA-verified carries, 38 total. No fresh timeout. Each fresh target restored byte-identically with empty Git status. The 29 carried target hashes also match the immutable r6 blobs. Zero gate leftovers, eight pre-existing harness helpers retained. Slot returned in gander-0066. Both busy guards unchanged; launch-preflight.json checks harness names.\n')
review = '''# Row196 r6 review manifest
Frozen tested candidate: **527b9a1e6cb1e85758e94eeb5d17c542413ceeb3**, based on **f48725cfc**, branch **gander/row196-r6-prd19**. CANDIDATE.sha256 freezes 39 changed source/test/fixture/doc paths; PRODUCT-FILES.json contains baseline and candidate hashes, read directly from Git blobs. Record-only commits after the candidate alter none of those paths.
This is the merge-scoped round authorized in duckworth-0096 and sage-2142. Duckworth's full round1 was CHANGES, #1694 comment30145, REVIEW-m1.md at659dd4e49. Everything outside B1/B2 stood approved. This round covers B1/B2 tests and their new checks, plus row222 integration in bus/runtime.mjs and webui/cli.mjs. It does not recast round1 as a prior build approval.
## B1: activation interpreter evidence
`row196 interpreter activation checks receipt, identity, plan and startup log` uses scratch copy verifier stand-ins and real release-script control flow. It checks:
- A successful plan prints the expected interpreter JSON, the started activation log carries the exact same JSON string, and the receipt verifier receives the scratch bus directory, expected identity and fresh start floor.
- A refusing receipt fails the interpreter-receipt gate, retains/restores the exact previous pointer and writes gate-failed/rollback-ok with no success entry. A started bus is required to check a receipt; this case therefore has start calls, as clarified in duckworth-0097.
- A changed inspect identity between preflight and gate refuses even when the stand-in receipt verifier would return true.
- Missing verifier and unsafe inspect refuse interpreter-unsafe in both plan and activation before any start or stop, preserving the pointer.
M30 removes the receipt block; M31 removes expected-identity comparison; M32 removes missing-verifier refusal; M33 removes unsafe-inspect refusal; M34 removes the started-log identity; M35 removes plan identity. All six are killed. Focused base 6/0 and whole CLI 744/0 include this coverage. Stub identities are fixture metadata, not evidence of a real root-owned Python activation.
## B2: rehearsal transport and scratch root
`row196 rehearsal selects socket only for marked copies and uses scratch dataRoot` captures the stand-in Console argv and its parsed MOSAIC_CONFIG dataRoot. The marked copy receives exactly --tester-socket, no TCP flag. The legacy copy gets no tester flag. Both receive `<rehearsal>/data`, not the live root, and live/backup evidence stays byte-identical. The existing stand-in Console remains a synthetic test listener.
M36 empties the marked-copy socket flags; M37 gives the legacy copy a socket flag. Both are killed. Focused base 3/0 and whole CLI include this coverage. The original callback test's name/assertions remain unchanged; r5's activation-only repair is retained.
## Row222 merge and review notes
Both rebases were conflict-free. Initial 222-only branch gander/row196-r6 remains at2a989d466. The later branch rebases onto f48725cfc under sage-2142; r6/range-diff-prd19.txt and patch-id files preserve the exact comparison. The first source patch changes only Console startServer context retaining librarySync; the other ten commits compare equal. r6/review-delta.diff contains the runtime/Console merge and B1/B2/doc changes against the previously reviewed r5 candidate.
Under --send, Console librarySync uses the existing call/busCaller, exact HUMAN_CLI child and fresh MOSAIC_BUS_CLI_NONCE. server.mjs obtains SO_PEERCRED, runtime authenticateHuman calls verifyPrincipal, then library.sync dispatches under the owner cap with awaited release. The bus-local sync timer calls the library implementation internally; it creates no new external authentication route. Runtime keeps interpreter validation/receipt, peer reader, shared principal binding, sync timer lifecycle and cleanup. Fresh bus/library-sync tests and whole WebUI/CLI passed. No product code was changed for B1/B2.
- N1 documented/deferred to R3: user-cli.mjs and authenticateUser wiring remain absent by design, so user envelopes refuse. R3 must add and test both.
- N2 deferred to a later row: dead testerNoSignIn arguments/comments remain; no product cleanup is mixed into the test changes.
- N3 documented without code change: direct serve without peerReader needs safe system Python even for cap-only calls; runtime passes a peerReader, and the fallback fails closed.
- N4 fixed in docs/TOOLS.md: rehearsal's longer socket path may fail closed even after the live activation preflight passes.
BUILD-LOG.md's four row196 phase lines stay outside the manifest, to land as Sage's separate append-only doc commit under gander-0060. Row252 DESIGN.md/BUILD-NOTES.md land with252. Remaining legacy tester-port producer/acceptance scripts are row253, per r5/TESTER-PORT-AUDIT.md; this gate does not claim those live callers have migrated.
## Fresh gate and carries
**2334 pass, 0 fail, 1 existing editor-build skip. 38/38 checks killed: nine fresh and 29 carried by exact target SHA equality.** No golden result carries from r5. M17 reran because row222 changed broker.mjs; no old definition targets runtime.mjs or webui/cli.mjs. Original raw failures and the preflight not-run outcome are preserved, not relabeled.
Each start used busy &&, pipefail and tee, with TMPDIR from mktemp under /mnt/storage/scratch/tmp. The self-named outer tee refusal was classified not a stop by mos-1205; only its log name changed. Both guards remain unchanged. Harness command names were checked against the detector before resumption. Fresh base times are recorded; no fresh timeout occurred.
The whole-file union retains the eight row215 extras and adds conversation/cohort, library/mapping, library/sync and tasks/requirements touched by the new base. All twelve ran whole, as did bus, WebUI, CLI and all ten shell scripts. Raw logs/whole-results.json are in r6/; log-recount.json independently verifies every summary and records log hashes. consolidated-kills.json records each accepted source and target hash. r6/RESULTS.md lists all timings and every kill.
Final sweep: **0 gate leftovers**, eight pre-existing harness helpers retained. Gate tracked tree clean; only linked node_modules is untracked. Slot returned to Sage and Mos in gander-0066. No merge, deployment, live activation, actual second-uid probe or real provider test was performed.
'''
review += table
review += '''
## Preserved boundary and provenance limits
The approved design r3 and round1 hold the private tester listener, one verifier, kernel-peer proof, path-bound human walk, Console direct-parent user rule and separate nonce kinds. bus.tester remains Jason's switch. No browser relay or control-board change is included. The 7331 tooling boundary stays inventory only. Explicit human refusal is human-required and helper refusal peercred-required; abrupt close without a response remains outcome-unknown.
Row164's intentional re-pins remain human.mjs 0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079 and webui bus.mjs 934ab2f9b6bde72aafe7814758550c283eb25a4f3a23b284021b13718d67178f. The human file adds the distinct user nonce/parameterized walk; webui bus adds spawn nonce and peer-error mapping. Both pins match the immutable r6 blobs; human-cli and transport pins are unchanged.
Hostile same-uid processes remain a residual for readable state, process metadata and pathname races. Separate uids narrow cross-instance reach, not reach within one instance. R3 owns verified-session claim mapping, user wiring and live grants. P19 333 keeps the approved text unchanged:
The Console provenance option trusts verified code and process metadata, not an independent
bus-side OIDC exchange. That trade must be approved, not hidden behind the phrase zero trust.
'''
assert sha(git('show', candidate + ':packages/bus/src/human.mjs')) == '0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079'
assert sha(git('show', candidate + ':packages/webui/src/bus.mjs')) == '934ab2f9b6bde72aafe7814758550c283eb25a4f3a23b284021b13718d67178f'
(root / 'MANIFEST.md').write_text(review)
(out / 'review-delta.diff').write_bytes(git('diff', 'c21465992', candidate, '--', 'packages/bus/src/runtime.mjs', 'packages/webui/src/cli.mjs', 'packages/cli/tests/stack-release.test.mjs', 'docs/TOOLS.md'))
with (root / 'BUILD.md').open('a') as file:
file.write('\n2026-10-21 r6 gate complete under sage-2145 on527b9a1e6: bus627/0, WebUI304/0/1, CLI744/0, twelve extra whole files230/0, ten shell scripts429/0. Fresh golden total2334/0/1, 929.581986 summed seconds. Nine required reruns killed, no timeout, clean SHA/Git restoration; 29 original target blobs match and carry, 38 total. First M17 busy refusal stays not-run under mos-1205, raw records preserved. Sweep0 gate leftovers/eight pre-existing helpers. Slot returned Sage/Mos in gander-0066. Final immutable39-path manifest regenerated against f48725cfc; full recount/kill evidence in r6/. No queue write while Morgana slot runs.\n')
with (root / 'PROGRESS.md').open('a') as file:
file.write('\nR6 complete on527b9a1e6, based f48725cfc: fresh2334/0/1, 38 kills (nine fresh, 29 exact-target carries), no timeouts. Slot returned gander-0066, sweep0/eight pre-existing helpers. New manifest/hash files freeze the candidate. Duckworth next reviews B1/B2 and row222 integration under0096; full first review outside B1/B2 stands. Await round2 queue coordination from Sage; no writes during Morgana244 slot. No PR/merge/live activation.\n')
print(json.dumps(dict(golden=summary['golden'], killed=38, entries=len(entries), manifestDigest=sha(manifest.encode())), indent=2))
@@ -0,0 +1 @@
mos-1205: M17 was not run. The busy preflight refused our own sibling tee log name. This raw killed=false result is neither survivor nor kill. Original output is unchanged. The 23 passing base checks carry under sage-2145.
@@ -0,0 +1 @@
BUSY 2931286: tee agents/gander/work/queue-196/r6/mutant-driver.log
@@ -0,0 +1,26 @@
[
{
"id": "M17",
"description": "tester switch ignored",
"test": "packages/bus/tests/tester.test.mjs",
"args": [
"--test",
"packages/bus/tests/tester.test.mjs"
],
"status": 1,
"signal": null,
"killed": false,
"timedOut": false,
"wallSeconds": 1.368,
"baseWallSeconds": 2.725494864,
"baseArgs": [
"packages/bus/tests/tester.test.mjs"
],
"restoredGitStatus": "",
"timeoutSeconds": 60,
"timeoutKillAfterSeconds": 2,
"processGroupTimeout": true,
"syntaxStatus": 0,
"restoredSha256": "c2f2f558aae5768d3f5fe2ecc113760cc4027d868bb74627a6702c6babd96db2"
}
]
@@ -1 +1,67 @@
BUSY 2931286: tee agents/gander/work/queue-196/r6/mutant-driver.log
CLEAR (current driver ancestors excluded)
✖ the tester binds only when the business sets bus.tester to exactly true (14.466765ms)
✔ a business may not name a role tester, so the tester address is never a role (16.772112ms)
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (34.982558ms)
✔ a tester message is from tester, needs no prefix, and writes no human.input or authority (14.345235ms)
✔ a tester message to a role no run holds refuses tester-target-not-running and stores nothing (9.3972ms)
✔ a tester message is refused while the run is only launched, and routes once it claims (12.705931ms)
✔ a human message to a role no run holds still waits and tells launch.by (11.168167ms)
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (19.4019ms)
✔ the tester reads the human views a reader reads (22.477716ms)
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.176446ms)
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.362237ms)
✔ testerNonce reads only the tester's variable and gives null on any read error (0.190297ms)
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (95.297136ms)
✖ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (929.616309ms)
ℹ tests 14
ℹ suites 0
ℹ pass 12
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1276.659619
✖ failing tests:
test at packages/bus/tests/tester.test.mjs:44:1
✖ the tester binds only when the business sets bus.tester to exactly true (14.466765ms)
AssertionError [ERR_ASSERTION]: Missing expected exception: null
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/bus/tests/tester.test.mjs:47:12)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.start (node:internal/test_runner/test:1262:17)
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: undefined,
expected: { code: 'tester-off' },
operator: 'throws',
diff: 'simple'
}
test at packages/bus/tests/tester.test.mjs:427:1
✖ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (929.616309ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
+ err: '',
+ out: '[]',
+ status: 0
- err: 'tester-off',
- out: '',
- status: 2
}
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/bus/tests/tester.test.mjs:448:10)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: { status: 0, out: '[]', err: '' },
expected: { status: 2, out: '', err: 'tester-off' },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,93 @@
CLEAR (current driver ancestors excluded)
▶ row196 interpreter activation checks receipt, identity, plan and startup log
✖ plan and started log preserve the same interpreter JSON (2169.679865ms)
✖ interpreter-receipt-refuse fails at the gate and restores the pointer (2057.018002ms)
✖ interpreter-drift fails at the gate and restores the pointer (1970.478384ms)
✔ missing-verifier refuses before any start or stop (1006.743258ms)
✔ interpreter-unsafe refuses before any start or stop (1009.558065ms)
✖ row196 interpreter activation checks receipt, identity, plan and startup log (8215.461107ms)
ℹ tests 6
ℹ suites 0
ℹ pass 2
ℹ fail 4
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 8867.50853
✖ failing tests:
test at packages/cli/tests/stack-release.test.mjs:2347:10
✖ plan and started log preserve the same interpreter JSON (2169.679865ms)
AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
assert.ok(verified.length>0)
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2355:10)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2347:2)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: false,
expected: true,
operator: '==',
diff: 'simple'
}
test at packages/cli/tests/stack-release.test.mjs:2357:83
✖ interpreter-receipt-refuse fails at the gate and restores the pointer (2057.018002ms)
AssertionError [ERR_ASSERTION]: stack-release: interpreter: {"path":"/usr/bin/python3","sha256":"fixture-root-owned-ELF"}
stack-release: captured the rollback set: /mnt/storage/scratch/tmp/gc58/sr-ewXipV/data/state/stack-rollback/20261021T202626Z-454342cd0fc0
stack-release: stopped both units
stack-release: stopped store schema: 3g
stack-release: backup: /mnt/storage/scratch/tmp/gc58/sr-ewXipV/data/backups/stack/20261021T202626Z-454342cd0fc0
stack-release: installed 454342cd0fc093d1499f4020ed0c4d97d8c64456
stack-release: gate passed on 454342cd0fc093d1499f4020ed0c4d97d8c64456
stack-release: activate ok: 454342cd0fc093d1499f4020ed0c4d97d8c64456 is live for acme
0 !== 1
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2360:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2357:75)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: 0,
expected: 1,
operator: 'strictEqual',
diff: 'simple'
}
test at packages/cli/tests/stack-release.test.mjs:2357:83
✖ interpreter-drift fails at the gate and restores the pointer (1970.478384ms)
AssertionError [ERR_ASSERTION]: stack-release: interpreter: {"path":"/usr/bin/python3","sha256":"fixture-root-owned-ELF"}
stack-release: captured the rollback set: /mnt/storage/scratch/tmp/gc58/sr-YRwbW0/data/state/stack-rollback/20261021T202628Z-454342cd0fc0
stack-release: stopped both units
stack-release: stopped store schema: 3g
stack-release: backup: /mnt/storage/scratch/tmp/gc58/sr-YRwbW0/data/backups/stack/20261021T202628Z-454342cd0fc0
stack-release: installed 454342cd0fc093d1499f4020ed0c4d97d8c64456
stack-release: gate passed on 454342cd0fc093d1499f4020ed0c4d97d8c64456
stack-release: activate ok: 454342cd0fc093d1499f4020ed0c4d97d8c64456 is live for acme
0 !== 1
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2360:10)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2357:75)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: 0,
expected: 1,
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,45 @@
CLEAR (current driver ancestors excluded)
▶ row196 interpreter activation checks receipt, identity, plan and startup log
✔ plan and started log preserve the same interpreter JSON (2403.997056ms)
✔ interpreter-receipt-refuse fails at the gate and restores the pointer (3277.935028ms)
✖ interpreter-drift fails at the gate and restores the pointer (1875.965856ms)
✔ missing-verifier refuses before any start or stop (1007.506582ms)
✔ interpreter-unsafe refuses before any start or stop (1151.149921ms)
✖ row196 interpreter activation checks receipt, identity, plan and startup log (9719.160881ms)
ℹ tests 6
ℹ suites 0
ℹ pass 4
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 10267.237554
✖ failing tests:
test at packages/cli/tests/stack-release.test.mjs:2357:83
✖ interpreter-drift fails at the gate and restores the pointer (1875.965856ms)
AssertionError [ERR_ASSERTION]: stack-release: interpreter: {"path":"/usr/bin/python3","sha256":"fixture-root-owned-ELF"}
stack-release: captured the rollback set: /mnt/storage/scratch/tmp/gc58/sr-T6r9pj/data/state/stack-rollback/20261021T202639Z-7a797568d494
stack-release: stopped both units
stack-release: stopped store schema: 3g
stack-release: backup: /mnt/storage/scratch/tmp/gc58/sr-T6r9pj/data/backups/stack/20261021T202639Z-7a797568d494
stack-release: installed 7a797568d49423f133aa285d0c1fa6a06a490442
stack-release: gate passed on 7a797568d49423f133aa285d0c1fa6a06a490442
stack-release: activate ok: 7a797568d49423f133aa285d0c1fa6a06a490442 is live for acme
0 !== 1
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2360:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2357:75)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: 0,
expected: 1,
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,51 @@
CLEAR (current driver ancestors excluded)
▶ row196 interpreter activation checks receipt, identity, plan and startup log
✔ plan and started log preserve the same interpreter JSON (2243.994423ms)
✔ interpreter-receipt-refuse fails at the gate and restores the pointer (3354.546492ms)
✔ interpreter-drift fails at the gate and restores the pointer (3267.092758ms)
✖ missing-verifier refuses before any start or stop (823.224697ms)
✔ interpreter-unsafe refuses before any start or stop (1118.436597ms)
✖ row196 interpreter activation checks receipt, identity, plan and startup log (10809.673518ms)
ℹ tests 6
ℹ suites 0
ℹ pass 4
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 11534.67585
✖ failing tests:
test at packages/cli/tests/stack-release.test.mjs:2365:74
✖ missing-verifier refuses before any start or stop (823.224697ms)
AssertionError [ERR_ASSERTION]: plan: activate for acme
from: cacc2386ac7cefc35fea037c5e6a3047bfbe7611
to: f9a2b5eac33c82adda629dd0cdc94efab450a4c1
store schema: 3g (read from the store the running bus holds)
target schema: 3g
migration: none; the store is at the target's version
backup: the run backs up the stopped store to /mnt/storage/scratch/tmp/gc58/sr-2VxZBX/data/backups/stack/<activation>/ before any migration
commits: the run adds 1 (newest first, at most 200):
f9a2b5e row 903: C1
bus: scripts/bus-service.sh install --copy f9a2b5eac33c82adda629dd0cdc94efab450a4c1 --copies /mnt/storage/scratch/tmp/gc58/stack-release-8hLy3O/copies --claude /mnt/storage/scratch/tmp/gc58/sr-2VxZBX/claude-bin/claude
proof: off
send: off
Console: scripts/webui-service.sh install --copy f9a2b5eac33c82adda629dd0cdc94efab450a4c1 --copies /mnt/storage/scratch/tmp/gc58/stack-release-8hLy3O/copies --port 39321 --business acme --tester-socket
CLI: scripts/stack-copy.sh wrapper f9a2b5eac33c82adda629dd0cdc94efab450a4c1 --copies /mnt/storage/scratch/tmp/gc58/stack-release-8hLy3O/copies --bin /mnt/storage/scratch/tmp/gc58/sr-2VxZBX/bin
0 !== 3
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2371:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2365:66)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: 0,
expected: 3,
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,52 @@
CLEAR (current driver ancestors excluded)
▶ row196 interpreter activation checks receipt, identity, plan and startup log
✔ plan and started log preserve the same interpreter JSON (2291.81403ms)
✔ interpreter-receipt-refuse fails at the gate and restores the pointer (2218.385802ms)
✔ interpreter-drift fails at the gate and restores the pointer (3370.11504ms)
✔ missing-verifier refuses before any start or stop (1148.17829ms)
✖ interpreter-unsafe refuses before any start or stop (820.916577ms)
✖ row196 interpreter activation checks receipt, identity, plan and startup log (9851.908618ms)
ℹ tests 6
ℹ suites 0
ℹ pass 4
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 10519.037677
✖ failing tests:
test at packages/cli/tests/stack-release.test.mjs:2365:74
✖ interpreter-unsafe refuses before any start or stop (820.916577ms)
AssertionError [ERR_ASSERTION]: plan: activate for acme
from: b46e174312f7696d49c48a7fd3bb5be21353b6af
to: dbbe95ffe66ccb1e658d3ca7314da8bbfdab93a4
store schema: 3g (read from the store the running bus holds)
target schema: 3g
migration: none; the store is at the target's version
backup: the run backs up the stopped store to /mnt/storage/scratch/tmp/gc58/sr-XRv4sk/data/backups/stack/<activation>/ before any migration
commits: the run adds 1 (newest first, at most 200):
dbbe95f row 903: C1
bus: scripts/bus-service.sh install --copy dbbe95ffe66ccb1e658d3ca7314da8bbfdab93a4 --copies /mnt/storage/scratch/tmp/gc58/stack-release-UQjple/copies --claude /mnt/storage/scratch/tmp/gc58/sr-XRv4sk/claude-bin/claude
proof: off
send: off
Console: scripts/webui-service.sh install --copy dbbe95ffe66ccb1e658d3ca7314da8bbfdab93a4 --copies /mnt/storage/scratch/tmp/gc58/stack-release-UQjple/copies --port 35703 --business acme --tester-socket
CLI: scripts/stack-copy.sh wrapper dbbe95ffe66ccb1e658d3ca7314da8bbfdab93a4 --copies /mnt/storage/scratch/tmp/gc58/stack-release-UQjple/copies --bin /mnt/storage/scratch/tmp/gc58/sr-XRv4sk/bin
0 !== 3
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2371:12)
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
at async Test.run (node:internal/test_runner/test:1409:7)
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2365:66)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: 0,
expected: 3,
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,39 @@
CLEAR (current driver ancestors excluded)
▶ row196 interpreter activation checks receipt, identity, plan and startup log
✖ plan and started log preserve the same interpreter JSON (2139.114828ms)
✔ interpreter-receipt-refuse fails at the gate and restores the pointer (3324.041026ms)
✔ interpreter-drift fails at the gate and restores the pointer (3275.346481ms)
✔ missing-verifier refuses before any start or stop (987.916479ms)
✔ interpreter-unsafe refuses before any start or stop (1061.230928ms)
✖ row196 interpreter activation checks receipt, identity, plan and startup log (10789.471423ms)
ℹ tests 6
ℹ suites 0
ℹ pass 4
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 11502.061182
✖ failing tests:
test at packages/cli/tests/stack-release.test.mjs:2347:10
✖ plan and started log preserve the same interpreter JSON (2139.114828ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ undefined
- '{"path":"/usr/bin/python3","sha256":"fixture-root-owned-ELF"}'
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2353:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2347:2)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: undefined,
expected: '{"path":"/usr/bin/python3","sha256":"fixture-root-owned-ELF"}',
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,48 @@
CLEAR (current driver ancestors excluded)
▶ row196 interpreter activation checks receipt, identity, plan and startup log
✖ plan and started log preserve the same interpreter JSON (860.184347ms)
✔ interpreter-receipt-refuse fails at the gate and restores the pointer (3305.553414ms)
✔ interpreter-drift fails at the gate and restores the pointer (3286.003733ms)
✔ missing-verifier refuses before any start or stop (992.325977ms)
✔ interpreter-unsafe refuses before any start or stop (1034.321025ms)
✖ row196 interpreter activation checks receipt, identity, plan and startup log (9480.200982ms)
ℹ tests 6
ℹ suites 0
ℹ pass 4
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 10193.225262
✖ failing tests:
test at packages/cli/tests/stack-release.test.mjs:2347:10
✖ plan and started log preserve the same interpreter JSON (860.184347ms)
AssertionError [ERR_ASSERTION]: plan: activate for acme
from: ca18054696409039950d5c7a1d43bc56d9d59d67
to: 695b42063641608b78e385c1c9b1a4cda2fbef19
store schema: 3g (read from the store the running bus holds)
target schema: 3g
migration: none; the store is at the target's version
backup: the run backs up the stopped store to /mnt/storage/scratch/tmp/gc58/sr-03HAwl/data/backups/stack/<activation>/ before any migration
commits: the run adds 1 (newest first, at most 200):
695b420 row 903: C1
bus: scripts/bus-service.sh install --copy 695b42063641608b78e385c1c9b1a4cda2fbef19 --copies /mnt/storage/scratch/tmp/gc58/stack-release-BmTV5E/copies --claude /mnt/storage/scratch/tmp/gc58/sr-03HAwl/claude-bin/claude
proof: off
send: off
Console: scripts/webui-service.sh install --copy 695b42063641608b78e385c1c9b1a4cda2fbef19 --copies /mnt/storage/scratch/tmp/gc58/stack-release-BmTV5E/copies --port 43633 --business acme --tester-socket
CLI: scripts/stack-copy.sh wrapper 695b42063641608b78e385c1c9b1a4cda2fbef19 --copies /mnt/storage/scratch/tmp/gc58/stack-release-BmTV5E/copies --bin /mnt/storage/scratch/tmp/gc58/sr-03HAwl/bin
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2350:59)
at async Test.run (node:internal/test_runner/test:1409:7)
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2347:2)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: null,
expected: true,
operator: '==',
diff: 'simple'
}
@@ -0,0 +1,42 @@
CLEAR (current driver ancestors excluded)
▶ row196 rehearsal selects socket only for marked copies and uses scratch dataRoot
✖ socket copy (3432.784699ms)
✔ legacy copy (3433.816123ms)
✖ row196 rehearsal selects socket only for marked copies and uses scratch dataRoot (6867.844517ms)
ℹ tests 3
ℹ suites 0
ℹ pass 1
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 7248.58625
✖ failing tests:
test at packages/cli/tests/stack-release.test.mjs:2382:43
✖ socket copy (3432.784699ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
[
'serve',
'--port',
'45437',
'--business',
'acme',
- '--tester-socket'
]
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2387:36)
at async Test.run (node:internal/test_runner/test:1409:7)
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2382:35)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: [ 'serve', '--port', '45437', '--business', 'acme' ],
expected: [ 'serve', '--port', '45437', '--business', 'acme', '--tester-socket' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,42 @@
CLEAR (current driver ancestors excluded)
▶ row196 rehearsal selects socket only for marked copies and uses scratch dataRoot
✔ socket copy (3444.656429ms)
✖ legacy copy (2419.695725ms)
✖ row196 rehearsal selects socket only for marked copies and uses scratch dataRoot (5866.008463ms)
ℹ tests 3
ℹ suites 0
ℹ pass 1
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6546.507553
✖ failing tests:
test at packages/cli/tests/stack-release.test.mjs:2382:43
✖ legacy copy (2419.695725ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
[
'serve',
'--port',
'34821',
'--business',
'acme',
+ '--tester-socket'
]
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2387:36)
at async Test.run (node:internal/test_runner/test:1409:7)
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gc58/g196-mut-NRmndP/packages/cli/tests/stack-release.test.mjs:2382:35)
at async Test.run (node:internal/test_runner/test:1409:7)
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: [ 'serve', '--port', '34821', '--business', 'acme', '--tester-socket' ],
expected: [ 'serve', '--port', '34821', '--business', 'acme' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -9,9 +9,9 @@
],
"status": 1,
"signal": null,
"killed": false,
"killed": true,
"timedOut": false,
"wallSeconds": 1.368,
"wallSeconds": 2.728,
"baseWallSeconds": 2.725494864,
"baseArgs": [
"packages/bus/tests/tester.test.mjs"
@@ -22,5 +22,237 @@
"processGroupTimeout": true,
"syntaxStatus": 0,
"restoredSha256": "c2f2f558aae5768d3f5fe2ecc113760cc4027d868bb74627a6702c6babd96db2"
},
{
"id": "M30",
"description": "gate skips interpreter receipt",
"test": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"args": [
"--test",
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"status": 1,
"signal": null,
"killed": true,
"timedOut": false,
"wallSeconds": 10.226,
"baseWallSeconds": 13.037174619,
"baseArgs": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"restoredGitStatus": "",
"timeoutSeconds": 60,
"timeoutKillAfterSeconds": 2,
"processGroupTimeout": true,
"syntaxStatus": 0,
"restoredSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
},
{
"id": "M31",
"description": "gate ignores changed interpreter",
"test": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"args": [
"--test",
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"status": 1,
"signal": null,
"killed": true,
"timedOut": false,
"wallSeconds": 11.644,
"baseWallSeconds": 13.037174619,
"baseArgs": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"restoredGitStatus": "",
"timeoutSeconds": 60,
"timeoutKillAfterSeconds": 2,
"processGroupTimeout": true,
"syntaxStatus": 0,
"restoredSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
},
{
"id": "M32",
"description": "marked target without verifier accepted",
"test": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"args": [
"--test",
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"status": 1,
"signal": null,
"killed": true,
"timedOut": false,
"wallSeconds": 12.902,
"baseWallSeconds": 13.037174619,
"baseArgs": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"restoredGitStatus": "",
"timeoutSeconds": 60,
"timeoutKillAfterSeconds": 2,
"processGroupTimeout": true,
"syntaxStatus": 0,
"restoredSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
},
{
"id": "M33",
"description": "unsafe interpreter inspection not refused",
"test": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"args": [
"--test",
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"status": 1,
"signal": null,
"killed": true,
"timedOut": false,
"wallSeconds": 12.069,
"baseWallSeconds": 13.037174619,
"baseArgs": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"restoredGitStatus": "",
"timeoutSeconds": 60,
"timeoutKillAfterSeconds": 2,
"processGroupTimeout": true,
"syntaxStatus": 0,
"restoredSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
},
{
"id": "M34",
"description": "started log omits interpreter identity",
"test": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"args": [
"--test",
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"status": 1,
"signal": null,
"killed": true,
"timedOut": false,
"wallSeconds": 12.854,
"baseWallSeconds": 13.037174619,
"baseArgs": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"restoredGitStatus": "",
"timeoutSeconds": 60,
"timeoutKillAfterSeconds": 2,
"processGroupTimeout": true,
"syntaxStatus": 0,
"restoredSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
},
{
"id": "M35",
"description": "plan omits interpreter identity",
"test": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"args": [
"--test",
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"status": 1,
"signal": null,
"killed": true,
"timedOut": false,
"wallSeconds": 11.586,
"baseWallSeconds": 13.037174619,
"baseArgs": [
"--test-name-pattern=row196 interpreter activation",
"packages/cli/tests/stack-release.test.mjs"
],
"restoredGitStatus": "",
"timeoutSeconds": 60,
"timeoutKillAfterSeconds": 2,
"processGroupTimeout": true,
"syntaxStatus": 0,
"restoredSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
},
{
"id": "M36",
"description": "marked rehearsal omits tester socket",
"test": [
"--test-name-pattern=row196 rehearsal selects",
"packages/cli/tests/stack-release.test.mjs"
],
"args": [
"--test",
"--test-name-pattern=row196 rehearsal selects",
"packages/cli/tests/stack-release.test.mjs"
],
"status": 1,
"signal": null,
"killed": true,
"timedOut": false,
"wallSeconds": 8.629,
"baseWallSeconds": 9.069833057000002,
"baseArgs": [
"--test-name-pattern=row196 rehearsal selects",
"packages/cli/tests/stack-release.test.mjs"
],
"restoredGitStatus": "",
"timeoutSeconds": 60,
"timeoutKillAfterSeconds": 2,
"processGroupTimeout": true,
"syntaxStatus": 0,
"restoredSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
},
{
"id": "M37",
"description": "legacy rehearsal receives tester socket",
"test": [
"--test-name-pattern=row196 rehearsal selects",
"packages/cli/tests/stack-release.test.mjs"
],
"args": [
"--test",
"--test-name-pattern=row196 rehearsal selects",
"packages/cli/tests/stack-release.test.mjs"
],
"status": 1,
"signal": null,
"killed": true,
"timedOut": false,
"wallSeconds": 7.91,
"baseWallSeconds": 9.069833057000002,
"baseArgs": [
"--test-name-pattern=row196 rehearsal selects",
"packages/cli/tests/stack-release.test.mjs"
],
"restoredGitStatus": "",
"timeoutSeconds": 60,
"timeoutKillAfterSeconds": 2,
"processGroupTimeout": true,
"syntaxStatus": 0,
"restoredSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
}
]
@@ -0,0 +1,13 @@
{
"rule": "mos-1205",
"plannedHarnessCommands": [
"node agents/gander/work/queue-196/r6/driver.mjs",
"tee agents/gander/work/queue-196/r6/controller.log",
"node agents/gander/work/queue-196/r6/whole.mjs",
"tee agents/gander/work/queue-196/r6/whole-driver.log",
"python3 agents/gander/work/queue-196/r2/busy.py"
],
"detectorPattern": "node --test|gate\\.sh|mutant|scripts/test-[a-z-]+\\.sh|docker compose",
"matches": [],
"exception": "Actual test commands are the guarded work, not harness names; the busy check runs before each."
}
@@ -0,0 +1,152 @@
[
{
"log": "bus.log",
"sha256": "c9afc6dcab8de422596fac3605c80258f34419734286e3a8d8fbbfe20a1543c9",
"passCount": 627,
"failCount": 0
},
{
"log": "webui.log",
"sha256": "fa7158b98d2bd65bd636e15c5098ddc68ce0d3525ee1303e4aa63d87839f0fc4",
"passCount": 304,
"failCount": 0
},
{
"log": "cli.log",
"sha256": "bd053cadfa1670e32df8f77c468b5b1b0933e115d034b234b5db0e332d3c8d2a",
"passCount": 744,
"failCount": 0
},
{
"log": "packages_business_tests_business.test.mjs.log",
"sha256": "4aedaadf2b187b153016200b42dd4e3eca522085590a13ca2e73bd293d5cd0a1",
"passCount": 19,
"failCount": 0
},
{
"log": "packages_business_tests_cli.test.mjs.log",
"sha256": "778cfb46be37ebea6cb0e78b958da13b1437b24462d5ceb0c79b338ead559314",
"passCount": 10,
"failCount": 0
},
{
"log": "packages_business_tests_instance-settings.test.mjs.log",
"sha256": "2d515649254568dd3ab9829a5d171f0e116ec8ccdb261043211f8defd218e3f0",
"passCount": 13,
"failCount": 0
},
{
"log": "packages_business_tests_library-projects-protected.test.mjs.log",
"sha256": "889534a28d834638ef14b7a198446169075fda012e689e6e2321fedfa032f354",
"passCount": 4,
"failCount": 0
},
{
"log": "packages_business_tests_resolve.test.mjs.log",
"sha256": "61014061483e594017c8cfcb14d731c74b25204b2f5442caf62a5e12018f018d",
"passCount": 11,
"failCount": 0
},
{
"log": "packages_conversation_tests_cohort.test.mjs.log",
"sha256": "593cb1d6f429fce3faf86917bbe407d22b5485ca402868a657bd566461c1f7f1",
"passCount": 38,
"failCount": 0
},
{
"log": "packages_library_tests_mapping.test.mjs.log",
"sha256": "d7960efe6440f2df8c5ed1ea1fd4a65f14582cdf75b9ff5413f4a06af0bbfaf4",
"passCount": 8,
"failCount": 0
},
{
"log": "packages_library_tests_mirror.test.mjs.log",
"sha256": "fdd430fc2812f079cb3a8e778ff5a9346e68ec1ffbc036e509be2f6fca65b6ab",
"passCount": 16,
"failCount": 0
},
{
"log": "packages_library_tests_sync.test.mjs.log",
"sha256": "81e379d4d1fdfe0f4b95bb30bc6e2222d05f487ad208e6b73f8086af91560c3c",
"passCount": 15,
"failCount": 0
},
{
"log": "packages_project_tests_project.test.mjs.log",
"sha256": "8dabef450d1305bc314099f5186fe85de0aa150cc80a7a8354ce949d6d66190c",
"passCount": 15,
"failCount": 0
},
{
"log": "packages_seat_tests_checkout.test.mjs.log",
"sha256": "61a985e3cf34804e4fc93fcb87cffd914113fc8534659ac42546f967aef39011",
"passCount": 78,
"failCount": 0
},
{
"log": "packages_tasks_tests_requirements.test.mjs.log",
"sha256": "df60eec5575c300ffa30ac294e3a3878baef26ec7fa810d431ac5227a2c9ff8c",
"passCount": 3,
"failCount": 0
},
{
"log": "test-auth.sh.log",
"sha256": "f3784a0f42d8d6b7947bbfcad6038cee8ba0bf81067addfebd3ae2094bf1f916",
"passCount": 15,
"failCount": 0
},
{
"log": "test-conductor.sh.log",
"sha256": "ae77d53f738ba07574d86ee60a116a3bc8c4a2f5a1a0e68c258ae1d254dceaa8",
"passCount": 17,
"failCount": 0
},
{
"log": "test-config.sh.log",
"sha256": "2e41f642485407cea7d4d3b1dc180bda27d944c8af9af5d80ab1bdc0f5b54d5c",
"passCount": 31,
"failCount": 0
},
{
"log": "test-discord.sh.log",
"sha256": "6c9c61092fc049545464959009fad551caaabdaa6b4433ea6812e28a49137824",
"passCount": 78,
"failCount": 0
},
{
"log": "test-extension-package.sh.log",
"sha256": "fc08fe9aa23a3f98b987c97cff0fd6a0a01c984f47c909cb7215aca0a330742f",
"passCount": 18,
"failCount": 0
},
{
"log": "test-foundation.sh.log",
"sha256": "26fd7d925f0cd5cbf4477ab7354eaf950cb096718046a5c8a12f123415b7463e",
"passCount": 44,
"failCount": 0
},
{
"log": "test-land-work.sh.log",
"sha256": "9b32bc54922584b4da25b51301fbc350e9073096cda93b366155664570e35d11",
"passCount": 86,
"failCount": 0
},
{
"log": "test-queue.sh.log",
"sha256": "20050cb4ebf0dc7217351fd6f1484fae68f30e56123513c63c5fc81dbf10f70d",
"passCount": 28,
"failCount": 0
},
{
"log": "test-release.sh.log",
"sha256": "bc4352fe2bc362875a7b12dd7126f1f8290e2411b6c7801b23a3fd75c98adb82",
"passCount": 14,
"failCount": 0
},
{
"log": "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.870442
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.846932
type: 'test'
...
# Subtest: config directory and file path follow MOSAIC_CONFIG
ok 3 - config directory and file path follow MOSAIC_CONFIG
---
duration_ms: 0.19008
type: 'test'
...
# Subtest: the fixture business validates and comes back frozen
ok 4 - the fixture business validates and comes back frozen
---
duration_ms: 0.851464
type: 'test'
...
# Subtest: two instances may share a definition
ok 5 - two instances may share a definition
---
duration_ms: 0.827129
type: 'test'
...
# Subtest: top-level refusals
ok 6 - top-level refusals
---
duration_ms: 2.727813
type: 'test'
...
# Subtest: arbiters and projects
ok 7 - arbiters and projects
---
duration_ms: 4.149021
type: 'test'
...
# Subtest: role instances
ok 8 - role instances
---
duration_ms: 2.000452
type: 'test'
...
# Subtest: Vikunja bots
ok 9 - Vikunja bots
---
duration_ms: 4.943635
type: 'test'
...
# Subtest: a role without Vikunja takes no tracker block
ok 10 - a role without Vikunja takes no tracker block
---
duration_ms: 2.116489
type: 'test'
...
# Subtest: credential references match the definition's services
ok 11 - credential references match the definition's services
---
duration_ms: 2.278015
type: 'test'
...
# Subtest: launch
ok 12 - launch
---
duration_ms: 7.368251
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: 4.049663
type: 'test'
...
# Subtest: loadBusiness: file checks
ok 14 - loadBusiness: file checks
---
duration_ms: 1.60597
type: 'test'
...
# Subtest: loadBusiness: not a regular file
ok 15 - loadBusiness: not a regular file
---
duration_ms: 35.707706
type: 'test'
...
# Subtest: loading writes nothing
ok 16 - loading writes nothing
---
duration_ms: 1.43616
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: 3.17666
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.762966
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.975551
type: 'test'
...
1..19
# tests 19
# suites 0
# pass 19
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 144.095078
@@ -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: 201.188943
type: 'test'
...
# Subtest: usage errors exit 4
ok 2 - usage errors exit 4
---
duration_ms: 273.320414
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.538522
type: 'test'
...
# Subtest: validate: project files
ok 4 - validate: project files
---
duration_ms: 304.575888
type: 'test'
...
# Subtest: validate: missing files and a broken system config
ok 5 - validate: missing files and a broken system config
---
duration_ms: 225.60216
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: 62.836479
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: 58.076823
type: 'test'
...
# Subtest: validate: role definitions come from MOSAIC_ROLES_DIR
ok 8 - validate: role definitions come from MOSAIC_ROLES_DIR
---
duration_ms: 184.308893
type: 'test'
...
# Subtest: resolve: prints one instance's record
ok 9 - resolve: prints one instance's record
---
duration_ms: 256.557599
type: 'test'
...
# Subtest: resolve: refusals
ok 10 - resolve: refusals
---
duration_ms: 366.009839
type: 'test'
...
1..10
# tests 10
# suites 0
# pass 10
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 2050.815869
@@ -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: 22.918547
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.354854
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: 78.79041
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: 102.487938
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.963009
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.334124
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.813461
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: 74.230016
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: 7.901554
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.250789
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: 9.880603
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: 28.683613
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: 86.051914
type: 'test'
...
1..13
# tests 13
# suites 0
# pass 13
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 524.20916
@@ -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: 21.288952
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: 16.912996
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.868863
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: 9.580097
type: 'test'
...
1..4
# tests 4
# suites 0
# pass 4
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 110.497631
@@ -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.313222
type: 'test'
...
# Subtest: systemVars flattens the validated config
ok 2 - systemVars flattens the validated config
---
duration_ms: 0.805222
type: 'test'
...
# Subtest: precedence: system, business, project, project role, agent
ok 3 - precedence: system, business, project, project role, agent
---
duration_ms: 1.494024
type: 'test'
...
# Subtest: limits narrow the definition and never widen it
ok 4 - limits narrow the definition and never widen it
---
duration_ms: 1.945071
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.180347
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.702949
type: 'test'
...
# Subtest: limits.authority narrows cross-role actions too
ok 7 - limits.authority narrows cross-role actions too
---
duration_ms: 0.820386
type: 'test'
...
# Subtest: classify
ok 8 - classify
---
duration_ms: 0.801215
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.781209
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.549039
type: 'test'
...
# Subtest: refusals
ok 11 - refusals
---
duration_ms: 1.693452
type: 'test'
...
1..11
# tests 11
# suites 0
# pass 11
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 77.681952
@@ -0,0 +1,239 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: K1: force stop kills a tool child that called setsid; stopped with a verified proof
ok 1 - K1: force stop kills a tool child that called setsid; stopped with a verified proof
---
duration_ms: 288.206845
type: 'test'
...
# Subtest: K2: K1 on the process-group fallback ends uncertain, never stopped
ok 2 - K2: K1 on the process-group fallback ends uncertain, never stopped
---
duration_ms: 139.927744
type: 'test'
...
# Subtest: K3: SIGTERM acknowledged while a member lives: stopping until the kill phase, never stopped from TERM
ok 3 - K3: SIGTERM acknowledged while a member lives: stopping until the kill phase, never stopped from TERM
---
duration_ms: 259.032971
type: 'test'
...
# Subtest: K4: two engines; force stop one; the other survives by independent observation
ok 4 - K4: two engines; force stop one; the other survives by independent observation
---
duration_ms: 2278.767534
type: 'test'
...
# Subtest: K5: a stop during a tool call leaves the effect uncertain, and it is shown
ok 5 - K5: a stop during a tool call leaves the effect uncertain, and it is shown
---
duration_ms: 167.058316
type: 'test'
...
# Subtest: K12: a member forking in a loop: the freeze stops it, enumeration is complete, populated 0 after cgroup.kill
ok 6 - K12: a member forking in a loop: the freeze stops it, enumeration is complete, populated 0 after cgroup.kill
---
duration_ms: 282.961673
type: 'test'
...
# Subtest: K13: a member writing its pid into another cgroup is refused by the namespace; the kill is complete
ok 7 - K13: a member writing its pid into another cgroup is refused by the namespace; the kill is complete
---
duration_ms: 180.038983
type: 'test'
...
# Subtest: K15: the shim gone, engine/cgroup.events unreadable, or the engine cgroup missing: evidence unavailable, not empty; uncertain
ok 8 - K15: the shim gone, engine/cgroup.events unreadable, or the engine cgroup missing: evidence unavailable, not empty; uncertain
---
duration_ms: 4402.615163
type: 'test'
...
# Subtest: K10: controller killed between the TERM and kill phases: restart checks the invocation ID and re-runs from TERM for the same stop
ok 9 - K10: controller killed between the TERM and kill phases: restart checks the invocation ID and re-runs from TERM for the same stop
---
duration_ms: 434.218177
type: 'test'
...
# Subtest: K11: controller killed after the confirmation is recorded, before TERM: restart checks the invocation ID and re-runs from TERM for the same stop
ok 10 - K11: controller killed after the confirmation is recorded, before TERM: restart checks the invocation ID and re-runs from TERM for the same stop
---
duration_ms: 357.52084
type: 'test'
...
# Subtest: K14: a unit with the recorded name but another invocation ID: evidence unavailable, no signals, uncertain
ok 11 - K14: a unit with the recorded name but another invocation ID: evidence unavailable, no signals, uncertain
---
duration_ms: 258.750766
type: 'test'
...
# Subtest: K6: recover without proof, without confirmation, or with changed pins is refused
ok 12 - K6: recover without proof, without confirmation, or with changed pins is refused
---
duration_ms: 67.240978
type: 'test'
...
# Subtest: K7: recover after proof, then launch: new claim and execution, generation +1, same leaf; the cancelled prompt is not replayed
ok 13 - K7: recover after proof, then launch: new claim and execution, generation +1, same leaf; the cancelled prompt is not replayed
---
duration_ms: 34.073532
type: 'test'
...
# Subtest: K8: an engine that loads another leaf on resume is refused before admission; it stays claimed until a proven stop
ok 14 - K8: an engine that loads another leaf on resume is refused before admission; it stays claimed until a proven stop
---
duration_ms: 41.375708
type: 'test'
...
# Subtest: K9: an interrupt that never settles stays uncertain; force stop stays available; takeover is refused while fenced
ok 15 - K9: an interrupt that never settles stays uncertain; force stop stays available; takeover is refused while fenced
---
duration_ms: 3030.046206
type: 'test'
...
# Subtest: K16: a claim from another machine ID refuses foreign-host; no boot proof is issued
ok 16 - K16: a claim from another machine ID refuses foreign-host; no boot proof is issued
---
duration_ms: 5.74953
type: 'test'
...
# Subtest: K17: two launcher calls with one eligibility record: one launch, the other refuses, no second engine
ok 17 - K17: two launcher calls with one eligibility record: one launch, the other refuses, no second engine
---
duration_ms: 31.225696
type: 'test'
...
# Subtest: K18: the leaf changes after eligibility: launch refused; the reservation stays until released with proof
ok 18 - K18: the leaf changes after eligibility: launch refused; the reservation stays until released with proof
---
duration_ms: 26.698378
type: 'test'
...
# Subtest: K19: a scope launched with only the engine environment still reaches the user manager; the engine sees no other names
ok 19 - K19: a scope launched with only the engine environment still reaches the user manager; the engine sees no other names
---
duration_ms: 60.801031
type: 'test'
...
# Subtest: R1: after a proven force stop the controller releases the scope; the shim and the unit are gone
ok 20 - R1: after a proven force stop the controller releases the scope; the shim and the unit are gone
---
duration_ms: 181.918312
type: 'test'
...
# Subtest: R2: close releases the scope of a binding proven stopped, once, when the stop's own release hasn't run
ok 21 - R2: close releases the scope of a binding proven stopped, once, when the stop's own release hasn't run
---
duration_ms: 289.956918
type: 'test'
...
# Subtest: R3: no release after an unavailable stop or an unverified proof: the scope and its shim stay as evidence
ok 22 - R3: no release after an unavailable stop or an unverified proof: the scope and its shim stay as evidence
---
duration_ms: 719.873525
type: 'test'
...
# Subtest: R13: a release with engine/cgroup.events unreadable answers the read's reason; the controller records it unavailable and the scope stays
ok 23 - R13: a release with engine/cgroup.events unreadable answers the read's reason; the controller records it unavailable and the scope stays
---
duration_ms: 201.276816
type: 'test'
...
# Subtest: E1: a natural engine exit with no member left: an engine-exit stop, stopped on a proof naming the engine, and the scope released
ok 24 - E1: a natural engine exit with no member left: an engine-exit stop, stopped on a proof naming the engine, and the scope released
---
duration_ms: 189.149086
type: 'test'
...
# Subtest: E2: an engine exit with a tool child alive: the stop ends uncertain and nothing is released; a force stop then ends it
ok 25 - E2: an engine exit with a tool child alive: the stop ends uncertain and nothing is released; a force stop then ends it
---
duration_ms: 2260.310692
type: 'test'
...
# Subtest: E3: an engine exit and a force stop take one escalation slot, in either order
ok 26 - E3: an engine exit and a force stop take one escalation slot, in either order
---
duration_ms: 633.083521
type: 'test'
...
# Subtest: E4: a shim that doesn't answer: the engine-exit stop misses its deadline, ends uncertain and frees the slot
ok 27 - E4: a shim that doesn't answer: the engine-exit stop misses its deadline, ends uncertain and frees the slot
---
duration_ms: 695.36687
type: 'test'
...
# Subtest: E5: an engine exit after a force stop ended uncertain starts no engine-exit stop; the force stop stays current
ok 28 - E5: an engine exit after a force stop ended uncertain starts no engine-exit stop; the force stop stays current
---
duration_ms: 2440.489741
type: 'test'
...
# Subtest: E6: the engine-exit observation refuses a reaped process that isn't the recorded engine: another PID or start ticks
ok 29 - E6: the engine-exit observation refuses a reaped process that isn't the recorded engine: another PID or start ticks
---
duration_ms: 185.351632
type: 'test'
...
# Subtest: R5: the harness finds a running shim and reaps it, and never signals a shim outside a mosaic-chat- scope (Filbert N1 and N2 on \#1533)
ok 30 - R5: the harness finds a running shim and reaps it, and never signals a shim outside a mosaic-chat- scope (Filbert N1 and N2 on \#1533)
---
duration_ms: 390.786795
type: 'test'
...
# Subtest: R6: releaseCohort releases nothing while the engine runs, for another invocation ID, or for a cohort without a scope
ok 31 - R6: releaseCohort releases nothing while the engine runs, for another invocation ID, or for a cohort without a scope
---
duration_ms: 132.434668
type: 'test'
...
# Subtest: R7: controller killed after the claim is stopped, before the release: the restart releases the scope
ok 32 - R7: controller killed after the claim is stopped, before the release: the restart releases the scope
---
duration_ms: 2327.533525
type: 'test'
...
# Subtest: R8: controller killed between the two keys' stopped revisions: the restart releases the scope
ok 33 - R8: controller killed between the two keys' stopped revisions: the restart releases the scope
---
duration_ms: 227.431262
type: 'test'
...
# Subtest: R9: a release that ended unavailable is tried again on a confirmed recover, not a refused one
ok 34 - R9: a release that ended unavailable is tried again on a confirmed recover, not a refused one
---
duration_ms: 211.531385
type: 'test'
...
# Subtest: R10: close releases and signals nothing for a stopped binding whose proof no longer verifies (Filbert N3 on \#1536)
ok 35 - R10: close releases and signals nothing for a stopped binding whose proof no longer verifies (Filbert N3 on \#1536)
---
duration_ms: 181.635024
type: 'test'
...
# Subtest: R11: close({ killEngine: true }) after a proven stop sends no signal to the recorded engine PID; a restart releases nothing more
ok 36 - R11: close({ killEngine: true }) after a proven stop sends no signal to the recorded engine PID; a restart releases nothing more
---
duration_ms: 2281.133465
type: 'test'
...
# Subtest: R12: a restart onto a claim stopped on a boot proof releases nothing, though its scope is listed
ok 37 - R12: a restart onto a claim stopped on a boot proof releases nothing, though its scope is listed
---
duration_ms: 156.439211
type: 'test'
...
# Subtest: no shim from this file's tests is left running for the after hook
ok 38 - no shim from this file's tests is left running for the after hook
---
duration_ms: 4.490343
type: 'test'
...
1..38
# tests 38
# suites 0
# pass 38
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 26568.630392
@@ -0,0 +1,59 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: the fixture mapping checks and comes back frozen
ok 1 - the fixture mapping checks and comes back frozen
---
duration_ms: 1.268876
type: 'test'
...
# Subtest: a playground prefix outside its universe books refuses library-playground-outside-book
ok 2 - a playground prefix outside its universe books refuses library-playground-outside-book
---
duration_ms: 0.457629
type: 'test'
...
# Subtest: no playground prefix holds another, and no book folder holds another
ok 3 - no playground prefix holds another, and no book folder holds another
---
duration_ms: 0.291932
type: 'test'
...
# Subtest: shape refusals: kind, remote, branch, unknown keys, types, manuscript, folder names
ok 4 - shape refusals: kind, remote, branch, unknown keys, types, manuscript, folder names
---
duration_ms: 0.68926
type: 'test'
...
# Subtest: C2-03a sage-2021: user is optional, kept when given, and must be a plain account name
ok 5 - C2-03a sage-2021: user is optional, kept when given, and must be a plain account name
---
duration_ms: 0.515561
type: 'test'
...
# Subtest: a hybrid universe is a shape the query code can take (1.4), with sources that must exist
ok 6 - a hybrid universe is a shape the query code can take (1.4), with sources that must exist
---
duration_ms: 0.848344
type: 'test'
...
# Subtest: a caller-supplied fail receives the code, as business file loading will pass it (C2-04)
ok 7 - a caller-supplied fail receives the code, as business file loading will pass it (C2-04)
---
duration_ms: 0.196865
type: 'test'
...
# Subtest: scope comes from the path alone (design 1.2)
ok 8 - scope comes from the path alone (design 1.2)
---
duration_ms: 0.374116
type: 'test'
...
1..8
# tests 8
# suites 0
# pass 8
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 57.127125
@@ -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: 36.805095
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.602572
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: 108.383419
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.813673
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: 20.408573
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: 35.273492
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: 35.735583
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: 96.475604
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: 28.514608
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: 72.139146
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.871471
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: 235.691933
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.569097
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: 52.134391
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.804177
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: 20.107632
type: 'test'
...
1..16
# tests 16
# suites 0
# pass 16
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 5982.723057
@@ -0,0 +1,101 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: C2-03a argv: the fixed sequence, one https allow, no other protocol key
ok 1 - C2-03a argv: the fixed sequence, one https allow, no other protocol key
---
duration_ms: 1.328893
type: 'test'
...
# Subtest: C2-03a argv: only an https URL with a plain host, no userinfo, and a plain user
ok 2 - C2-03a argv: only an https URL with a plain host, no userinfo, and a plain user
---
duration_ms: 0.522933
type: 'test'
...
# Subtest: C2-03a helper: answers only the exact prompts for the configured host and user (dewey-0765)
ok 3 - C2-03a helper: answers only the exact prompts for the configured host and user (dewey-0765)
---
duration_ms: 24.309935
type: 'test'
...
# Subtest: C2-03a first sync: served is the fetched tip, HEAD is served, the survey reads it, and the token stays in the slot
ok 4 - C2-03a first sync: served is the fetched tip, HEAD is served, the survey reads it, and the token stays in the slot
---
duration_ms: 110.176795
type: 'test'
...
# Subtest: C2-03a fast-forward: served moves, problems are rebuilt, and a repeat changes only lastFetch
ok 5 - C2-03a fast-forward: served moves, problems are rebuilt, and a repeat changes only lastFetch
---
duration_ms: 166.577458
type: 'test'
...
# Subtest: C2-03a Filbert N2: a read that took served before a sync still finds its objects after served moves
ok 6 - C2-03a Filbert N2: a read that took served before a sync still finds its objects after served moves
---
duration_ms: 157.258165
type: 'test'
...
# Subtest: C2-03a overlap: a reader during a sync sees the old pair or the new one, never a mix
ok 7 - C2-03a overlap: a reader during a sync sees the old pair or the new one, never a mix
---
duration_ms: 144.97294
type: 'test'
...
# Subtest: C2-03a diverged: a non-fast-forward keeps serving and holds until a human accepts the tip
ok 8 - C2-03a diverged: a non-fast-forward keeps serving and holds until a human accepts the tip
---
duration_ms: 325.460624
type: 'test'
...
# Subtest: C2-03a accept starts the record over, so a changed branch gets a fresh state
ok 9 - C2-03a accept starts the record over, so a changed branch gets a fresh state
---
duration_ms: 133.703571
type: 'test'
...
# Subtest: C2-03a fetch failure: a wrong token keeps serving and records the error, lastFetch unchanged
ok 10 - C2-03a fetch failure: a wrong token keeps serving and records the error, lastFetch unchanged
---
duration_ms: 158.705028
type: 'test'
...
# Subtest: C2-03a a failed first fetch records the error with nothing served
ok 11 - C2-03a a failed first fetch records the error with nothing served
---
duration_ms: 48.184093
type: 'test'
...
# Subtest: C2-03a a 302 to another host fails the fetch and the other host sees nothing
ok 12 - C2-03a a 302 to another host fails the fetch and the other host sees nothing
---
duration_ms: 51.944784
type: 'test'
...
# Subtest: C2-03a the slot: missing or unsafe refuses before git, and sync never opens it
ok 13 - C2-03a the slot: missing or unsafe refuses before git, and sync never opens it
---
duration_ms: 48.305197
type: 'test'
...
# Subtest: C2-03a sage-2021: an entry with no user refuses library-remote-invalid and runs no git
ok 14 - C2-03a sage-2021: an entry with no user refuses library-remote-invalid and runs no git
---
duration_ms: 25.388489
type: 'test'
...
# Subtest: C2-03a one sync per mirror: an overlapping call refuses library-sync-busy
ok 15 - C2-03a one sync per mirror: an overlapping call refuses library-sync-busy
---
duration_ms: 103.103788
type: 'test'
...
1..15
# tests 15
# suites 0
# pass 15
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 1572.152166
@@ -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.400096
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: 31.584414
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: 14.87188
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: 14.057397
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: 75.024978
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: 16.371409
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: 21.552438
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: 20.948619
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.332673
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: 39.691887
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: 28.050743
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: 15.268934
type: 'test'
...
# Subtest: schema constraints and layout omissions are reported independently
ok 13 - schema constraints and layout omissions are reported independently
---
duration_ms: 14.682588
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: 19.775944
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: 31.634174
type: 'test'
...
1..15
# tests 15
# suites 0
# pass 15
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 397.853794
@@ -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: 23.609136
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: 24.822563
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.548097
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.948353
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.268206
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: 42.400999
type: 'test'
...
# Subtest: an untracked file
ok 2 - an untracked file
---
duration_ms: 41.926991
type: 'test'
...
# Subtest: a staged file
ok 3 - a staged file
---
duration_ms: 43.125616
type: 'test'
...
# Subtest: another branch
ok 4 - another branch
---
duration_ms: 41.533983
type: 'test'
...
# Subtest: a detached HEAD
ok 5 - a detached HEAD
---
duration_ms: 41.444249
type: 'test'
...
1..5
ok 6 - a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
---
duration_ms: 211.448733
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: 42.18825
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: 22.683158
type: 'test'
...
# Subtest: hooks-present
ok 2 - hooks-present
---
duration_ms: 23.981508
type: 'test'
...
# Subtest: submodule
ok 3 - submodule
---
duration_ms: 30.53337
type: 'test'
...
# Subtest: config-changed
ok 4 - config-changed
---
duration_ms: 26.640251
type: 'test'
...
# Subtest: root-unreadable
ok 5 - root-unreadable
---
duration_ms: 27.500439
type: 'test'
...
# Subtest: root-detached
ok 6 - root-detached
---
duration_ms: 33.008497
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: 35.833988
type: 'test'
...
# Subtest: status-failed, dirty
ok 8 - status-failed, dirty
---
duration_ms: 35.355029
type: 'test'
...
1..8
ok 8 - a clone kept before the branch check, or for a failed status, gets no fetch
---
duration_ms: 236.696451
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: 38.040461
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: 44.631792
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: 72.986702
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.565102
type: 'test'
...
# Subtest: user.email
ok 2 - user.email
---
duration_ms: 24.993242
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: 52.056377
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: 45.87623
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: 18.748369
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: 33.313017
type: 'test'
...
# Subtest: core.hooksPath
ok 2 - core.hooksPath
---
duration_ms: 32.93676
type: 'test'
...
# Subtest: a hook file
ok 3 - a hook file
---
duration_ms: 31.04788
type: 'test'
...
# Subtest: include.path
ok 4 - include.path
---
duration_ms: 33.504449
type: 'test'
...
# Subtest: includeIf
ok 5 - includeIf
---
duration_ms: 33.654346
type: 'test'
...
# Subtest: a filter driver
ok 6 - a filter driver
---
duration_ms: 33.330113
type: 'test'
...
# Subtest: origin moved
ok 7 - origin moved
---
duration_ms: 34.410462
type: 'test'
...
# Subtest: a second origin url
ok 8 - a second origin url
---
duration_ms: 34.553407
type: 'test'
...
# Subtest: the origin url twice, both the root
ok 9 - the origin url twice, both the root
---
duration_ms: 35.318303
type: 'test'
...
# Subtest: an ext:: origin
ok 10 - an ext:: origin
---
duration_ms: 33.409597
type: 'test'
...
# Subtest: a branch tracking another remote
ok 11 - a branch tracking another remote
---
duration_ms: 34.618175
type: 'test'
...
# Subtest: a branch merging a tag
ok 12 - a branch merging a tag
---
duration_ms: 33.339997
type: 'test'
...
# Subtest: a fetch line onto local branches
ok 13 - a fetch line onto local branches
---
duration_ms: 35.163076
type: 'test'
...
# Subtest: no origin
ok 14 - no origin
---
duration_ms: 33.941229
type: 'test'
...
# Subtest: a config file over the size cap
ok 15 - a config file over the size cap
---
duration_ms: 30.995104
type: 'test'
...
# Subtest: config a symlink to /dev/zero
ok 16 - config a symlink to /dev/zero
---
duration_ms: 31.658744
type: 'test'
...
# Subtest: the clone a symlink to the bait
ok 17 - the clone a symlink to the bait
---
duration_ms: 30.912781
type: 'test'
...
# Subtest: the clone a file
ok 18 - the clone a file
---
duration_ms: 31.046906
type: 'test'
...
# Subtest: the clone a plain directory
ok 19 - the clone a plain directory
---
duration_ms: 30.916155
type: 'test'
...
# Subtest: .git a gitdir: file
ok 20 - .git a gitdir: file
---
duration_ms: 30.867709
type: 'test'
...
# Subtest: .git a symlink
ok 21 - .git a symlink
---
duration_ms: 31.284739
type: 'test'
...
# Subtest: .git/logs a symlink
ok 22 - .git/logs a symlink
---
duration_ms: 31.847197
type: 'test'
...
# Subtest: .git/refs/heads a symlink
ok 23 - .git/refs/heads a symlink
---
duration_ms: 32.21906
type: 'test'
...
# Subtest: .git/objects a symlink
ok 24 - .git/objects a symlink
---
duration_ms: 31.052488
type: 'test'
...
# Subtest: a reflog hard-linked to a file outside
ok 25 - a reflog hard-linked to a file outside
---
duration_ms: 30.48705
type: 'test'
...
# Subtest: HEAD a fifo
ok 26 - HEAD a fifo
---
duration_ms: 32.030662
type: 'test'
...
# Subtest: a commondir file
ok 27 - a commondir file
---
duration_ms: 30.738046
type: 'test'
...
# Subtest: an alternates file
ok 28 - an alternates file
---
duration_ms: 31.106713
type: 'test'
...
# Subtest: a gitlink staged, no .gitmodules
ok 29 - a gitlink staged, no .gitmodules
---
duration_ms: 43.802453
type: 'test'
...
# Subtest: a gitlink and .gitmodules staged
ok 30 - a gitlink and .gitmodules staged
---
duration_ms: 44.925948
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: 52.114966
type: 'test'
...
# Subtest: a gitlink and .gitmodules committed
ok 32 - a gitlink and .gitmodules committed
---
duration_ms: 49.751122
type: 'test'
...
# Subtest: a gitlink and submodule.active in config
ok 33 - a gitlink and submodule.active in config
---
duration_ms: 46.619808
type: 'test'
...
# Subtest: a .git/modules with no gitlink
ok 34 - a .git/modules with no gitlink
---
duration_ms: 33.989714
type: 'test'
...
1..34
ok 15 - a clone the session rigged is kept, and git runs nothing and writes nothing outside it
---
duration_ms: 1185.111516
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.568539
type: 'test'
...
# Subtest: not a repository
ok 2 - not a repository
---
duration_ms: 10.400231
type: 'test'
...
# Subtest: a plain directory inside another repository
ok 3 - a plain directory inside another repository
---
duration_ms: 14.889395
type: 'test'
...
# Subtest: unreadable
ok 4 - unreadable
---
duration_ms: 10.423977
type: 'test'
...
# Subtest: on no branch
ok 5 - on no branch
---
duration_ms: 11.969341
type: 'test'
...
# Subtest: missing an object
ok 6 - missing an object
---
duration_ms: 15.470809
type: 'test'
...
1..6
ok 16 - a root that can't be cloned refuses with the project id and leaves nothing behind
---
duration_ms: 74.528087
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: 29.345477
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: 49.376968
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.609196
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.133533
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: 1020.14481
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: 515.385221
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: 516.1265
type: 'test'
...
1..23
# tests 78
# suites 0
# pass 78
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 4916.867654
@@ -0,0 +1,29 @@
CLEAR (current driver ancestors excluded)
TAP version 13
# Subtest: the list holds the PRD's requirement ids, in its order, at its version
ok 1 - the list holds the PRD's requirement ids, in its order, at its version
---
duration_ms: 1.203852
type: 'test'
...
# Subtest: the committed list loads frozen
ok 2 - the committed list loads frozen
---
duration_ms: 0.604752
type: 'test'
...
# Subtest: the schema refuses any other shape
ok 3 - the schema refuses any other shape
---
duration_ms: 2.24629
type: 'test'
...
1..3
# tests 3
# suites 0
# pass 3
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 44.87926
@@ -0,0 +1,218 @@
diff --git a/docs/TOOLS.md b/docs/TOOLS.md
index a4443e29d..0f75a6c42 100644
--- a/docs/TOOLS.md
+++ b/docs/TOOLS.md
@@ -693,6 +693,12 @@ backup's checks it prints `BACKUP_STORE <activation id> schema <version>`.
it never picks another port. `--timeout` (default 60 seconds) bounds the
gate and each stop.
+A copy marked for the private tester receives `--tester-socket` during rehearsal;
+a legacy copy receives no tester flag. The socket is under the rehearsal's
+scratch dataRoot, at `data/console/tester.sock`. That path is longer than the live
+one. A long dataRoot can pass activation's pathname preflight and still make the
+rehearsal Console refuse its socket path; the rehearsal then fails closed.
+
Before it makes anything, it checks the pointer, the copy (present,
reachable from refactor, a readable schema, a bus host with `--no-launch`),
the port and the backup's `SHA256SUMS`. Then it makes
diff --git a/packages/bus/src/runtime.mjs b/packages/bus/src/runtime.mjs
index 0abb2ee4f..18f401ec5 100644
--- a/packages/bus/src/runtime.mjs
+++ b/packages/bus/src/runtime.mjs
@@ -82,8 +82,16 @@ export async function startBroker({
// Row 199: the tests' scratch CA for publish's git (`-c http.sslCAInfo=...`). process.mjs drops
// it from the boot config, so only an in-process caller sets it.
publishTls = [],
+ // C2-03a: the tests' stand-in for syncCommand, a shorter timer and a scratch config dir for the
+ // slot, { command, intervalMs, configDir }. A boot config is JSON and can't carry a function, so
+ // a librarySync without one is refused.
+ librarySync = null,
}) {
- let store, credentials, server, adapter;
+ if (librarySync !== null && (typeof librarySync?.command !== 'function'
+ || (Object.hasOwn(librarySync, 'intervalMs') && !(Number.isSafeInteger(librarySync.intervalMs) && librarySync.intervalMs > 0))
+ || (Object.hasOwn(librarySync, 'configDir') && typeof librarySync.configDir !== 'string')))
+ throw new BusError('invalid-host-request');
+ let store, credentials, server, adapter, syncTimer = null, syncPass = null;
try {
const references = {};
for (const [business, b] of Object.entries(businesses)) {
@@ -135,6 +143,13 @@ export async function startBroker({
for (const business of Object.values(businesses))
for (const [project, entry] of Object.entries(business.projects ?? {}))
if (entry.kind === 'library') await libraryModule.ensureMirror({ business, project, dataRoot });
+ // C2-03a: the slot is <configDir>/secrets/<business>/library-gitea (design 10 step 4). Sync only
+ // checks that it is there; the askpass helper reads it.
+ const slotDir = librarySync?.configDir ?? organization?.dir ?? null;
+ const syncOptions = business => ({
+ slot: slotDir ? join(slotDir, 'secrets', business.id, libraryModule.SLOT) : null,
+ ...(librarySync ? { command: librarySync.command } : {}),
+ });
const broker = new Broker({
hostGrant: runRoot ? hostGrant({ configDir: organization.dir, runRoot }) : null,
// Row 235 (#1741, r6 X4, X5): the grant executor's claim, register and issue, never use().
@@ -146,6 +161,7 @@ export async function startBroker({
library: {
readFile: context => libraryModule.readLibraryFile({ ...context, dataRoot }),
status: context => libraryModule.libraryStatus({ ...context, dataRoot }),
+ sync: (context, { accept }) => libraryModule.sync({ ...context, dataRoot }, { ...syncOptions(context.business), accept }),
LibraryError: libraryModule.LibraryError,
},
project: {
@@ -341,6 +357,30 @@ export async function startBroker({
.filter((c) => c.instance === business + '/' + role)
.map(({ service, date, state }) => ({ service, date, state }));
}
+ // C2-03a: each library entry with a sync user fetches once at start, then every 60 s. A pass
+ // still running skips the tick. Only codes are logged, never git's output.
+ const timed = Object.values(businesses).flatMap(business => Object.entries(business.projects ?? {})
+ .filter(([, entry]) => entry.kind === 'library' && Object.hasOwn(entry, 'user')).map(([project]) => ({ business, project })));
+ const syncLog = entry => process.stderr.write(`library: ${JSON.stringify(entry)}\n`);
+ const syncAll = async () => {
+ for (const { business, project } of timed) {
+ try {
+ const { code } = await libraryModule.sync({ business, project, dataRoot }, syncOptions(business));
+ if (code !== null) syncLog({ event: 'library-sync-held', business: business.id, project, code });
+ } catch (e) {
+ if (e?.code === 'library-sync-busy') continue;
+ syncLog({ event: 'library-sync-refused', business: business.id, project,
+ code: e instanceof libraryModule.LibraryError ? e.code : 'library-sync-failed' });
+ }
+ }
+ };
+ const tick = () => { if (!syncPass) syncPass = syncAll().finally(() => { syncPass = null; }); };
+ if (timed.length) {
+ tick();
+ syncTimer = setInterval(tick, librarySync?.intervalMs ?? libraryModule.SYNC_INTERVAL_MS);
+ syncTimer.unref();
+ }
+ const stopSync = async () => { clearInterval(syncTimer); syncTimer = null; await syncPass; };
return {
broker,
credentials,
@@ -374,6 +414,7 @@ export async function startBroker({
launches: bound,
readers: readCaps,
async close() {
+ await stopSync();
await server.close();
await adapter?.close?.();
store.close();
diff --git a/packages/cli/tests/stack-release.test.mjs b/packages/cli/tests/stack-release.test.mjs
index acc5d4b86..625995e65 100644
--- a/packages/cli/tests/stack-release.test.mjs
+++ b/packages/cli/tests/stack-release.test.mjs
@@ -1744,6 +1744,7 @@ function rConsole(){
const id=path.basename(path.resolve(import.meta.dirname,'..','..','..')),home=process.env.HOME,a=process.argv.slice(2);
const fault=(n)=>fs.existsSync(path.join(home,'faults',n));
fs.appendFileSync(path.join(home,'console-args.log'),`${a.join(' ')}\n`);
+ fs.appendFileSync(path.join(home,'console-context.jsonl'),JSON.stringify({argv:a,dataRoot:JSON.parse(fs.readFileSync(process.env.MOSAIC_CONFIG,'utf8')).dataRoot})+'\n');
if(a[0]!=='serve'){console.error('fixture Console: refused');process.exit(1)}
const s=http.createServer((q,r)=>{r.writeHead(q.url==='/healthz'&&!fault(`healthz-${id}`)?200:500);r.end()});
s.listen(Number(a[a.indexOf('--port')+1]),'127.0.0.1',()=>console.log(`Mosaic Console: http://127.0.0.1:${s.address().port}/\nBoard: fixture`));
@@ -2319,3 +2320,74 @@ test('row196 SSO socket conversion pins pointer and unit argv order without send
const status=await prun(e,'status','acme');assert.equal(status.code,0,status.out+status.err);assert.match(status.out,/unit flags: match the pointer/);
await noLeak(e);
});
+
+// T10 activation: exercise the shell caller as well as interpreter.mjs itself.
+test('row196 interpreter activation checks receipt, identity, plan and startup log',async t=>{
+ const cli=join(COPIES,C1,'packages/webui/src/cli.mjs'),old=readFileSync(cli,'utf8');
+ const module=join(COPIES,C1,'packages/bus/src/interpreter.mjs');
+ const identity={path:'/usr/bin/python3',sha256:'fixture-root-owned-ELF'};
+ const source=`import fs from 'node:fs';import {join} from 'node:path';
+ const root=process.env.HOME,sd=process.env.SD_STATE;
+ const fault=n=>fs.existsSync(join(sd,'faults',n));
+ export function inspectInterpreter(){
+ if(fault('interpreter-unsafe'))throw Error('unsafe interpreter');
+ const seen=join(root,'interpreter-inspected'),changed=fault('interpreter-drift')&&fs.existsSync(seen);
+ fs.writeFileSync(seen,'inspected');
+ return {...${JSON.stringify(identity)},...(changed?{sha256:'replacement-ELF'}:{})};
+ }
+ export function verifyInterpreterReceipt(directory,expected,since){
+ fs.appendFileSync(join(root,'interpreter-verified.jsonl'),JSON.stringify({directory,expected,since})+'\\n');
+ if(fault('interpreter-receipt-refuse'))throw Error('receipt does not match started bus');
+ return true;
+ }
+ `;
+ const putModule=()=>{chmodSync(dirname(module),0o755);writeFileSync(module,source);chmodSync(module,0o444);chmodSync(dirname(module),0o555);};
+ chmodSync(cli,0o644);writeFileSync(cli,old+'\n// MOSAIC_TESTER_SOCKET_V1\n');chmodSync(cli,0o444);putModule();
+ t.after(()=>{chmodSync(cli,0o644);writeFileSync(cli,old);chmodSync(cli,0o444);chmodSync(dirname(module),0o755);rmSync(module,{force:true});chmodSync(dirname(module),0o555);});
+ await t.test('plan and started log preserve the same interpreter JSON',async t=>{
+ const e=await mk(t);await seed(e);
+ const plan=await run(e,'activate',C1,'acme','--tester-socket','--plan');assert.equal(plan.code,0,plan.out+plan.err);
+ const line=/^interpreter: (.+)$/m.exec(plan.out);assert.ok(line,plan.out);assert.deepEqual(JSON.parse(line[1]),identity);
+ const r=await run(e,'activate',C1,'acme','--tester-socket');assert.equal(r.code,0,r.out+r.err);
+ const started=logLines(e).find(x=>x.op==='activate'&&x.result==='started');assert.ok(started);
+ assert.equal(started.interpreter,line[1]);assert.deepEqual(JSON.parse(started.interpreter),identity);
+ const verified=lines(join(e.env.HOME,'interpreter-verified.jsonl')).map(JSON.parse);
+ assert.ok(verified.length>0);assert.equal(verified[0].directory,join(e.data,'bus'));assert.deepEqual(verified[0].expected,identity);assert.ok(Number(verified[0].since)>0);
+ });
+ for(const scenario of ['interpreter-receipt-refuse','interpreter-drift'])await t.test(scenario+' fails at the gate and restores the pointer',async t=>{
+ const e=await mk(t);await seed(e);const before=readFileSync(e.pointer,'utf8'),n=calls(e).length,logs=logLines(e).length;fault(e,scenario);
+ const r=await run(e,'activate',C1,'acme','--tester-socket','--timeout','1');
+ assert.equal(r.code,1,r.out+r.err);assert.match(r.out+r.err,/interpreter-receipt/);assert.equal(readFileSync(e.pointer,'utf8'),before);
+ assert.ok(startsStops(e,n).some(x=>x.startsWith('start ')),startsStops(e,n).join('\n'));
+ const added=logLines(e).slice(logs);assert.ok(added.some(x=>x.result==='gate-failed'&&x.code==='interpreter-receipt'&&x.rollback==='ok'),JSON.stringify(added));
+ assert.equal(added.some(x=>x.result==='ok'),false,JSON.stringify(added));
+ });
+ for(const scenario of ['missing-verifier','interpreter-unsafe'])await t.test(scenario+' refuses before any start or stop',async t=>{
+ const e=await mk(t);await seed(e);const before=readFileSync(e.pointer,'utf8'),n=calls(e).length;
+ if(scenario==='missing-verifier'){chmodSync(dirname(module),0o755);rmSync(module);chmodSync(dirname(module),0o555);}else fault(e,scenario);
+ try{
+ for(const flags of [['--plan'],[]]){
+ const r=await run(e,'activate',C1,'acme','--tester-socket',...flags);
+ assert.equal(r.code,3,r.out+r.err);assert.match(r.out+r.err,/interpreter-unsafe/);
+ assert.equal(readFileSync(e.pointer,'utf8'),before);assert.deepEqual(startsStops(e,n),[]);
+ }
+ }finally{if(scenario==='missing-verifier')putModule();}
+ });
+});
+
+test('row196 rehearsal selects socket only for marked copies and uses scratch dataRoot',async t=>{
+ const file=join(RCOPIES,B,'packages/webui/src/cli.mjs'),old=readFileSync(file,'utf8');
+ const put=text=>{chmodSync(file,0o644);writeFileSync(file,text);chmodSync(file,0o444);};
+ t.after(()=>put(old));
+ for(const marked of [true,false])await t.test(marked?'socket copy':'legacy copy',async t=>{
+ put(old+(marked?'\n// MOSAIC_TESTER_SOCKET_V1\n':''));
+ const e=await rmk(t),before=untouched(e),port=await freePort();
+ const r=await rehearse(e,B,'--backup',e.act,'--port',port,'--timeout','10');assert.equal(r.code,0,r.out+r.err);
+ const contexts=lines(rh(e,'console-context.jsonl')).map(JSON.parse);assert.equal(contexts.length,1);
+ const context=contexts[0];assert.deepEqual(context.argv,['serve','--port',port,'--business','acme',...(marked?['--tester-socket']:[])]);
+ assert.equal(context.argv.includes('--tester-socket'),marked);assert.equal(context.argv.includes('--tester-port'),false);
+ assert.equal(context.dataRoot,join(r.dir,'data'));assert.notEqual(context.dataRoot,e.data);
+ assert.equal(JSON.parse(readFileSync(join(r.dir,'config/config.json'),'utf8')).dataRoot,context.dataRoot);
+ assert.equal(untouched(e),before);
+ });
+});
diff --git a/packages/webui/src/cli.mjs b/packages/webui/src/cli.mjs
index 9feb5ac87..e12bc7a28 100644
--- a/packages/webui/src/cli.mjs
+++ b/packages/webui/src/cli.mjs
@@ -64,7 +64,7 @@ try {
// the system config, Business can't resolve authority and Settings has
// no notifier. A refusal printed here names no path (redactor).
// --send without a bus refuses to start rather than serve a composer that can't send.
- let bus = null, send = null, settingsWrite = null, projectFiles = null, projectFile = null, libraryFile = null, libraryStatus = null, projectSave = null, chat = null, nameWrite = null, assistantStop = null, instancesWrite = null, routesWrite = null, busLine, system = null;
+ let bus = null, send = null, settingsWrite = null, projectFiles = null, projectFile = null, libraryFile = null, libraryStatus = null, librarySync = null, projectSave = null, chat = null, nameWrite = null, assistantStop = null, instancesWrite = null, routesWrite = null, busLine, system = null;
try {
system = loadSystem();
const { dataRoot } = system;
@@ -78,7 +78,7 @@ try {
projectFiles = args => call('project.files', args);
projectFile = args => call('project.file', args);
libraryFile = args => call('library.file', args); libraryStatus = args => call('library.status', args);
- if (sendOn) {send = args => call('message.send', args);settingsWrite=args=>call('limits.set',args);projectSave=args=>call('project.file.save',args);nameWrite=args=>call('name.set',args);assistantStop=args=>call('assistant.stop',args);instancesWrite=args=>call('instances.set',args);routesWrite=args=>call('routes.set',args);}
+ if (sendOn) {send = args => call('message.send', args);librarySync=args=>call('library.sync',args);settingsWrite=args=>call('limits.set',args);projectSave=args=>call('project.file.save',args);nameWrite=args=>call('name.set',args);assistantStop=args=>call('assistant.stop',args);instancesWrite=args=>call('instances.set',args);routesWrite=args=>call('routes.set',args);}
busLine = `Bus: ${options.business ?? 'the running bus host\'s business'}`;
} catch (err) {
const why = redactor({ configDir: configDir() })(err.message);
@@ -98,7 +98,7 @@ try {
}
let server;
try {
- server = await startServer({ board: options.board, port: options.port, bus, reads, preview: options.preview, sso, proof, send, settingsWrite, projectFiles, projectFile, libraryFile, libraryStatus, projectSave, chat, nameWrite, assistantStop, instancesWrite, routesWrite });
+ server = await startServer({ board: options.board, port: options.port, bus, reads, preview: options.preview, sso, proof, send, settingsWrite, projectFiles, projectFile, libraryFile, libraryStatus, librarySync, projectSave, chat, nameWrite, assistantStop, instancesWrite, routesWrite });
} catch (err) { sso?.close(); throw err; }
let testerServer = null;
if (testerSocket) {
@@ -0,0 +1,90 @@
{
"candidate": "527b9a1e6cb1e85758e94eeb5d17c542413ceeb3",
"base": "f48725cfc",
"grants": [
"sage-2142",
"sage-2145"
],
"golden": {
"passCount": 2334,
"failCount": 0,
"skipCount": 1,
"wallSeconds": 929.581986448
},
"extraFiles": {
"passCount": 230,
"failCount": 0,
"skipCount": 0,
"wallSeconds": 58.75424581699993
},
"shellScripts": {
"passCount": 429,
"failCount": 0,
"skipCount": 0,
"wallSeconds": 136.091485826
},
"killed": 38,
"freshKills": 9,
"carriedKills": 29,
"freshKillWallSeconds": 90.548,
"sweep": {
"scope": [
"/mnt/storage/scratch/tmp/g196-tree-tn651z",
"/mnt/storage/scratch/tmp/gc58",
"/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,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,56 @@
CLEAR (current driver ancestors excluded)
Note: switching to '527b9a1e6cb1e85758e94eeb5d17c542413ceeb3'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
Not currently on any branch.
nothing to commit, working tree clean
Note: switching to '527b9a1e6cb1e85758e94eeb5d17c542413ceeb3'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
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: 3532604 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
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,50 @@
START bus 81 whole file(s)
END bus {"code":0,"signal":null,"pass":627,"fail":0,"skip":0,"wallSeconds":35.87504165,"stopped":false}
START webui 50 whole file(s)
END webui {"code":0,"signal":null,"pass":304,"fail":0,"skip":1,"wallSeconds":111.03407226800002,"stopped":false}
START cli 50 whole file(s)
END cli {"code":0,"signal":null,"pass":744,"fail":0,"skip":0,"wallSeconds":587.827140887,"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.4857721460000612,"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.404195076999953,"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.8708043269999326,"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.4709744530000026,"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.4367549480000743,"stopped":false}
START packages_conversation_tests_cohort.test.mjs 1 whole file(s)
END packages_conversation_tests_cohort.test.mjs {"code":0,"signal":null,"pass":38,"fail":0,"skip":0,"wallSeconds":27.922146513000015,"stopped":false}
START packages_library_tests_mapping.test.mjs 1 whole file(s)
END packages_library_tests_mapping.test.mjs {"code":0,"signal":null,"pass":8,"fail":0,"skip":0,"wallSeconds":1.4136770970000652,"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.354534180999966,"stopped":false}
START packages_library_tests_sync.test.mjs 1 whole file(s)
END packages_library_tests_sync.test.mjs {"code":0,"signal":null,"pass":15,"fail":0,"skip":0,"wallSeconds":2.932404891999904,"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.7687200799999991,"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.295986329999985,"stopped":false}
START packages_tasks_tests_requirements.test.mjs 1 whole file(s)
END packages_tasks_tests_requirements.test.mjs {"code":0,"signal":null,"pass":3,"fail":0,"skip":0,"wallSeconds":1.3982757729999722,"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.9081228229999543,"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":8.057173820000026,"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.1678915339999367,"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.613370803000056,"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":2.6515103489999894,"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.145344808000026,"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.047738473000004,"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":21.795574542999965,"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":10.876533943000016,"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":27.828224730000017,"stopped":false}
@@ -0,0 +1,666 @@
[
{
"name": "bus",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"--test-concurrency=2",
"packages/bus/tests/account-migration.test.mjs",
"packages/bus/tests/agents.test.mjs",
"packages/bus/tests/approval-binding.test.mjs",
"packages/bus/tests/broker.test.mjs",
"packages/bus/tests/business.test.mjs",
"packages/bus/tests/channel-proof.test.mjs",
"packages/bus/tests/chief-of-staff.test.mjs",
"packages/bus/tests/comment-cursors.test.mjs",
"packages/bus/tests/comment-migration.test.mjs",
"packages/bus/tests/creative.test.mjs",
"packages/bus/tests/credential-claim.test.mjs",
"packages/bus/tests/credential-status.test.mjs",
"packages/bus/tests/credential-store.test.mjs",
"packages/bus/tests/credential-verbs.test.mjs",
"packages/bus/tests/credentials.test.mjs",
"packages/bus/tests/csuite-messaging.test.mjs",
"packages/bus/tests/daily-quota-runtime.test.mjs",
"packages/bus/tests/decision-close.test.mjs",
"packages/bus/tests/decision-route.test.mjs",
"packages/bus/tests/decisions.test.mjs",
"packages/bus/tests/end-launch.test.mjs",
"packages/bus/tests/grant-enroll.test.mjs",
"packages/bus/tests/grant-executor.test.mjs",
"packages/bus/tests/grant-host.test.mjs",
"packages/bus/tests/grant-migration.test.mjs",
"packages/bus/tests/hard-waits.test.mjs",
"packages/bus/tests/host-run.test.mjs",
"packages/bus/tests/host-tools.test.mjs",
"packages/bus/tests/human.test.mjs",
"packages/bus/tests/instances-verb.test.mjs",
"packages/bus/tests/interpreter.test.mjs",
"packages/bus/tests/land.test.mjs",
"packages/bus/tests/launch-notice.test.mjs",
"packages/bus/tests/library-sync.test.mjs",
"packages/bus/tests/library.test.mjs",
"packages/bus/tests/limit-checks.test.mjs",
"packages/bus/tests/limit-stop.test.mjs",
"packages/bus/tests/limits-runtime.test.mjs",
"packages/bus/tests/limits.test.mjs",
"packages/bus/tests/message-citation.test.mjs",
"packages/bus/tests/messages.test.mjs",
"packages/bus/tests/messaging.test.mjs",
"packages/bus/tests/name-migration.test.mjs",
"packages/bus/tests/names.test.mjs",
"packages/bus/tests/peer-transport.test.mjs",
"packages/bus/tests/peercred.test.mjs",
"packages/bus/tests/plugins-verb.test.mjs",
"packages/bus/tests/principal.test.mjs",
"packages/bus/tests/process.test.mjs",
"packages/bus/tests/project-await.test.mjs",
"packages/bus/tests/project-files.test.mjs",
"packages/bus/tests/project-runtime.test.mjs",
"packages/bus/tests/publish.test.mjs",
"packages/bus/tests/replies.test.mjs",
"packages/bus/tests/requirements.test.mjs",
"packages/bus/tests/review.test.mjs",
"packages/bus/tests/routes-verb.test.mjs",
"packages/bus/tests/schema.test.mjs",
"packages/bus/tests/single-use.test.mjs",
"packages/bus/tests/spec-migration.test.mjs",
"packages/bus/tests/spec-review.test.mjs",
"packages/bus/tests/spec-socket.test.mjs",
"packages/bus/tests/spec.test.mjs",
"packages/bus/tests/staff-request.test.mjs",
"packages/bus/tests/state.test.mjs",
"packages/bus/tests/store.test.mjs",
"packages/bus/tests/task-page.test.mjs",
"packages/bus/tests/task-read.test.mjs",
"packages/bus/tests/tasks.test.mjs",
"packages/bus/tests/tester-threads.test.mjs",
"packages/bus/tests/tester-writes.test.mjs",
"packages/bus/tests/tester.test.mjs",
"packages/bus/tests/thread-migration.test.mjs",
"packages/bus/tests/threads.test.mjs",
"packages/bus/tests/transport.test.mjs",
"packages/bus/tests/usage-broker.test.mjs",
"packages/bus/tests/usage-migration.test.mjs",
"packages/bus/tests/usage-runtime.test.mjs",
"packages/bus/tests/usage.test.mjs",
"packages/bus/tests/web.test.mjs",
"packages/bus/tests/workflow-roles.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/bus/tests/account-migration.test.mjs",
"packages/bus/tests/agents.test.mjs",
"packages/bus/tests/approval-binding.test.mjs",
"packages/bus/tests/broker.test.mjs",
"packages/bus/tests/business.test.mjs",
"packages/bus/tests/channel-proof.test.mjs",
"packages/bus/tests/chief-of-staff.test.mjs",
"packages/bus/tests/comment-cursors.test.mjs",
"packages/bus/tests/comment-migration.test.mjs",
"packages/bus/tests/creative.test.mjs",
"packages/bus/tests/credential-claim.test.mjs",
"packages/bus/tests/credential-status.test.mjs",
"packages/bus/tests/credential-store.test.mjs",
"packages/bus/tests/credential-verbs.test.mjs",
"packages/bus/tests/credentials.test.mjs",
"packages/bus/tests/csuite-messaging.test.mjs",
"packages/bus/tests/daily-quota-runtime.test.mjs",
"packages/bus/tests/decision-close.test.mjs",
"packages/bus/tests/decision-route.test.mjs",
"packages/bus/tests/decisions.test.mjs",
"packages/bus/tests/end-launch.test.mjs",
"packages/bus/tests/grant-enroll.test.mjs",
"packages/bus/tests/grant-executor.test.mjs",
"packages/bus/tests/grant-host.test.mjs",
"packages/bus/tests/grant-migration.test.mjs",
"packages/bus/tests/hard-waits.test.mjs",
"packages/bus/tests/host-run.test.mjs",
"packages/bus/tests/host-tools.test.mjs",
"packages/bus/tests/human.test.mjs",
"packages/bus/tests/instances-verb.test.mjs",
"packages/bus/tests/interpreter.test.mjs",
"packages/bus/tests/land.test.mjs",
"packages/bus/tests/launch-notice.test.mjs",
"packages/bus/tests/library-sync.test.mjs",
"packages/bus/tests/library.test.mjs",
"packages/bus/tests/limit-checks.test.mjs",
"packages/bus/tests/limit-stop.test.mjs",
"packages/bus/tests/limits-runtime.test.mjs",
"packages/bus/tests/limits.test.mjs",
"packages/bus/tests/message-citation.test.mjs",
"packages/bus/tests/messages.test.mjs",
"packages/bus/tests/messaging.test.mjs",
"packages/bus/tests/name-migration.test.mjs",
"packages/bus/tests/names.test.mjs",
"packages/bus/tests/peer-transport.test.mjs",
"packages/bus/tests/peercred.test.mjs",
"packages/bus/tests/plugins-verb.test.mjs",
"packages/bus/tests/principal.test.mjs",
"packages/bus/tests/process.test.mjs",
"packages/bus/tests/project-await.test.mjs",
"packages/bus/tests/project-files.test.mjs",
"packages/bus/tests/project-runtime.test.mjs",
"packages/bus/tests/publish.test.mjs",
"packages/bus/tests/replies.test.mjs",
"packages/bus/tests/requirements.test.mjs",
"packages/bus/tests/review.test.mjs",
"packages/bus/tests/routes-verb.test.mjs",
"packages/bus/tests/schema.test.mjs",
"packages/bus/tests/single-use.test.mjs",
"packages/bus/tests/spec-migration.test.mjs",
"packages/bus/tests/spec-review.test.mjs",
"packages/bus/tests/spec-socket.test.mjs",
"packages/bus/tests/spec.test.mjs",
"packages/bus/tests/staff-request.test.mjs",
"packages/bus/tests/state.test.mjs",
"packages/bus/tests/store.test.mjs",
"packages/bus/tests/task-page.test.mjs",
"packages/bus/tests/task-read.test.mjs",
"packages/bus/tests/tasks.test.mjs",
"packages/bus/tests/tester-threads.test.mjs",
"packages/bus/tests/tester-writes.test.mjs",
"packages/bus/tests/tester.test.mjs",
"packages/bus/tests/thread-migration.test.mjs",
"packages/bus/tests/threads.test.mjs",
"packages/bus/tests/transport.test.mjs",
"packages/bus/tests/usage-broker.test.mjs",
"packages/bus/tests/usage-migration.test.mjs",
"packages/bus/tests/usage-runtime.test.mjs",
"packages/bus/tests/usage.test.mjs",
"packages/bus/tests/web.test.mjs",
"packages/bus/tests/workflow-roles.test.mjs"
]
},
{
"name": "webui",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"--test-concurrency=2",
"packages/webui/tests/assistant.test.mjs",
"packages/webui/tests/board-held.test.mjs",
"packages/webui/tests/browser-edge.test.mjs",
"packages/webui/tests/browser.test.mjs",
"packages/webui/tests/bus-browser.test.mjs",
"packages/webui/tests/bus.test.mjs",
"packages/webui/tests/channel-chat.test.mjs",
"packages/webui/tests/chat-browser.test.mjs",
"packages/webui/tests/chat.test.mjs",
"packages/webui/tests/conversation.test.mjs",
"packages/webui/tests/discord.test.mjs",
"packages/webui/tests/docs-browser.test.mjs",
"packages/webui/tests/editor-browser.test.mjs",
"packages/webui/tests/editor-provenance.test.mjs",
"packages/webui/tests/editor.test.mjs",
"packages/webui/tests/history-return-flow.test.mjs",
"packages/webui/tests/instances-browser.test.mjs",
"packages/webui/tests/instances.test.mjs",
"packages/webui/tests/library-cli.test.mjs",
"packages/webui/tests/limits-browser.test.mjs",
"packages/webui/tests/limits-route.test.mjs",
"packages/webui/tests/markdown-preview.test.mjs",
"packages/webui/tests/messages.test.mjs",
"packages/webui/tests/pinned-copy.test.mjs",
"packages/webui/tests/preview.test.mjs",
"packages/webui/tests/project-file.test.mjs",
"packages/webui/tests/project-name-repo.test.mjs",
"packages/webui/tests/proof-cli.test.mjs",
"packages/webui/tests/proof.test.mjs",
"packages/webui/tests/reads.test.mjs",
"packages/webui/tests/relaunch.test.mjs",
"packages/webui/tests/return-flow.test.mjs",
"packages/webui/tests/routes-browser.test.mjs",
"packages/webui/tests/routes.test.mjs",
"packages/webui/tests/send-browser.test.mjs",
"packages/webui/tests/send.test.mjs",
"packages/webui/tests/serve.test.mjs",
"packages/webui/tests/service.test.mjs",
"packages/webui/tests/settings-form.test.mjs",
"packages/webui/tests/settings-write.test.mjs",
"packages/webui/tests/shell.test.mjs",
"packages/webui/tests/sso-browser.test.mjs",
"packages/webui/tests/sso.test.mjs",
"packages/webui/tests/tester-browser.test.mjs",
"packages/webui/tests/tester-cli.test.mjs",
"packages/webui/tests/tester-listener.test.mjs",
"packages/webui/tests/tester-socket.test.mjs",
"packages/webui/tests/usage-browser.test.mjs",
"packages/webui/tests/usage.test.mjs",
"packages/webui/tests/views.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/webui/tests/assistant.test.mjs",
"packages/webui/tests/board-held.test.mjs",
"packages/webui/tests/browser-edge.test.mjs",
"packages/webui/tests/browser.test.mjs",
"packages/webui/tests/bus-browser.test.mjs",
"packages/webui/tests/bus.test.mjs",
"packages/webui/tests/channel-chat.test.mjs",
"packages/webui/tests/chat-browser.test.mjs",
"packages/webui/tests/chat.test.mjs",
"packages/webui/tests/conversation.test.mjs",
"packages/webui/tests/discord.test.mjs",
"packages/webui/tests/docs-browser.test.mjs",
"packages/webui/tests/editor-browser.test.mjs",
"packages/webui/tests/editor-provenance.test.mjs",
"packages/webui/tests/editor.test.mjs",
"packages/webui/tests/history-return-flow.test.mjs",
"packages/webui/tests/instances-browser.test.mjs",
"packages/webui/tests/instances.test.mjs",
"packages/webui/tests/library-cli.test.mjs",
"packages/webui/tests/limits-browser.test.mjs",
"packages/webui/tests/limits-route.test.mjs",
"packages/webui/tests/markdown-preview.test.mjs",
"packages/webui/tests/messages.test.mjs",
"packages/webui/tests/pinned-copy.test.mjs",
"packages/webui/tests/preview.test.mjs",
"packages/webui/tests/project-file.test.mjs",
"packages/webui/tests/project-name-repo.test.mjs",
"packages/webui/tests/proof-cli.test.mjs",
"packages/webui/tests/proof.test.mjs",
"packages/webui/tests/reads.test.mjs",
"packages/webui/tests/relaunch.test.mjs",
"packages/webui/tests/return-flow.test.mjs",
"packages/webui/tests/routes-browser.test.mjs",
"packages/webui/tests/routes.test.mjs",
"packages/webui/tests/send-browser.test.mjs",
"packages/webui/tests/send.test.mjs",
"packages/webui/tests/serve.test.mjs",
"packages/webui/tests/service.test.mjs",
"packages/webui/tests/settings-form.test.mjs",
"packages/webui/tests/settings-write.test.mjs",
"packages/webui/tests/shell.test.mjs",
"packages/webui/tests/sso-browser.test.mjs",
"packages/webui/tests/sso.test.mjs",
"packages/webui/tests/tester-browser.test.mjs",
"packages/webui/tests/tester-cli.test.mjs",
"packages/webui/tests/tester-listener.test.mjs",
"packages/webui/tests/tester-socket.test.mjs",
"packages/webui/tests/usage-browser.test.mjs",
"packages/webui/tests/usage.test.mjs",
"packages/webui/tests/views.test.mjs"
]
},
{
"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_conversation_tests_cohort.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/conversation/tests/cohort.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/conversation/tests/cohort.test.mjs"
]
},
{
"name": "packages_library_tests_mapping.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/library/tests/mapping.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/library/tests/mapping.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_library_tests_sync.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/library/tests/sync.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/library/tests/sync.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": "packages_tasks_tests_requirements.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/tasks/tests/requirements.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/tasks/tests/requirements.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,916 @@
[
{
"name": "bus",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"--test-concurrency=2",
"packages/bus/tests/account-migration.test.mjs",
"packages/bus/tests/agents.test.mjs",
"packages/bus/tests/approval-binding.test.mjs",
"packages/bus/tests/broker.test.mjs",
"packages/bus/tests/business.test.mjs",
"packages/bus/tests/channel-proof.test.mjs",
"packages/bus/tests/chief-of-staff.test.mjs",
"packages/bus/tests/comment-cursors.test.mjs",
"packages/bus/tests/comment-migration.test.mjs",
"packages/bus/tests/creative.test.mjs",
"packages/bus/tests/credential-claim.test.mjs",
"packages/bus/tests/credential-status.test.mjs",
"packages/bus/tests/credential-store.test.mjs",
"packages/bus/tests/credential-verbs.test.mjs",
"packages/bus/tests/credentials.test.mjs",
"packages/bus/tests/csuite-messaging.test.mjs",
"packages/bus/tests/daily-quota-runtime.test.mjs",
"packages/bus/tests/decision-close.test.mjs",
"packages/bus/tests/decision-route.test.mjs",
"packages/bus/tests/decisions.test.mjs",
"packages/bus/tests/end-launch.test.mjs",
"packages/bus/tests/grant-enroll.test.mjs",
"packages/bus/tests/grant-executor.test.mjs",
"packages/bus/tests/grant-host.test.mjs",
"packages/bus/tests/grant-migration.test.mjs",
"packages/bus/tests/hard-waits.test.mjs",
"packages/bus/tests/host-run.test.mjs",
"packages/bus/tests/host-tools.test.mjs",
"packages/bus/tests/human.test.mjs",
"packages/bus/tests/instances-verb.test.mjs",
"packages/bus/tests/interpreter.test.mjs",
"packages/bus/tests/land.test.mjs",
"packages/bus/tests/launch-notice.test.mjs",
"packages/bus/tests/library-sync.test.mjs",
"packages/bus/tests/library.test.mjs",
"packages/bus/tests/limit-checks.test.mjs",
"packages/bus/tests/limit-stop.test.mjs",
"packages/bus/tests/limits-runtime.test.mjs",
"packages/bus/tests/limits.test.mjs",
"packages/bus/tests/message-citation.test.mjs",
"packages/bus/tests/messages.test.mjs",
"packages/bus/tests/messaging.test.mjs",
"packages/bus/tests/name-migration.test.mjs",
"packages/bus/tests/names.test.mjs",
"packages/bus/tests/peer-transport.test.mjs",
"packages/bus/tests/peercred.test.mjs",
"packages/bus/tests/plugins-verb.test.mjs",
"packages/bus/tests/principal.test.mjs",
"packages/bus/tests/process.test.mjs",
"packages/bus/tests/project-await.test.mjs",
"packages/bus/tests/project-files.test.mjs",
"packages/bus/tests/project-runtime.test.mjs",
"packages/bus/tests/publish.test.mjs",
"packages/bus/tests/replies.test.mjs",
"packages/bus/tests/requirements.test.mjs",
"packages/bus/tests/review.test.mjs",
"packages/bus/tests/routes-verb.test.mjs",
"packages/bus/tests/schema.test.mjs",
"packages/bus/tests/single-use.test.mjs",
"packages/bus/tests/spec-migration.test.mjs",
"packages/bus/tests/spec-review.test.mjs",
"packages/bus/tests/spec-socket.test.mjs",
"packages/bus/tests/spec.test.mjs",
"packages/bus/tests/staff-request.test.mjs",
"packages/bus/tests/state.test.mjs",
"packages/bus/tests/store.test.mjs",
"packages/bus/tests/task-page.test.mjs",
"packages/bus/tests/task-read.test.mjs",
"packages/bus/tests/tasks.test.mjs",
"packages/bus/tests/tester-threads.test.mjs",
"packages/bus/tests/tester-writes.test.mjs",
"packages/bus/tests/tester.test.mjs",
"packages/bus/tests/thread-migration.test.mjs",
"packages/bus/tests/threads.test.mjs",
"packages/bus/tests/transport.test.mjs",
"packages/bus/tests/usage-broker.test.mjs",
"packages/bus/tests/usage-migration.test.mjs",
"packages/bus/tests/usage-runtime.test.mjs",
"packages/bus/tests/usage.test.mjs",
"packages/bus/tests/web.test.mjs",
"packages/bus/tests/workflow-roles.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/bus/tests/account-migration.test.mjs",
"packages/bus/tests/agents.test.mjs",
"packages/bus/tests/approval-binding.test.mjs",
"packages/bus/tests/broker.test.mjs",
"packages/bus/tests/business.test.mjs",
"packages/bus/tests/channel-proof.test.mjs",
"packages/bus/tests/chief-of-staff.test.mjs",
"packages/bus/tests/comment-cursors.test.mjs",
"packages/bus/tests/comment-migration.test.mjs",
"packages/bus/tests/creative.test.mjs",
"packages/bus/tests/credential-claim.test.mjs",
"packages/bus/tests/credential-status.test.mjs",
"packages/bus/tests/credential-store.test.mjs",
"packages/bus/tests/credential-verbs.test.mjs",
"packages/bus/tests/credentials.test.mjs",
"packages/bus/tests/csuite-messaging.test.mjs",
"packages/bus/tests/daily-quota-runtime.test.mjs",
"packages/bus/tests/decision-close.test.mjs",
"packages/bus/tests/decision-route.test.mjs",
"packages/bus/tests/decisions.test.mjs",
"packages/bus/tests/end-launch.test.mjs",
"packages/bus/tests/grant-enroll.test.mjs",
"packages/bus/tests/grant-executor.test.mjs",
"packages/bus/tests/grant-host.test.mjs",
"packages/bus/tests/grant-migration.test.mjs",
"packages/bus/tests/hard-waits.test.mjs",
"packages/bus/tests/host-run.test.mjs",
"packages/bus/tests/host-tools.test.mjs",
"packages/bus/tests/human.test.mjs",
"packages/bus/tests/instances-verb.test.mjs",
"packages/bus/tests/interpreter.test.mjs",
"packages/bus/tests/land.test.mjs",
"packages/bus/tests/launch-notice.test.mjs",
"packages/bus/tests/library-sync.test.mjs",
"packages/bus/tests/library.test.mjs",
"packages/bus/tests/limit-checks.test.mjs",
"packages/bus/tests/limit-stop.test.mjs",
"packages/bus/tests/limits-runtime.test.mjs",
"packages/bus/tests/limits.test.mjs",
"packages/bus/tests/message-citation.test.mjs",
"packages/bus/tests/messages.test.mjs",
"packages/bus/tests/messaging.test.mjs",
"packages/bus/tests/name-migration.test.mjs",
"packages/bus/tests/names.test.mjs",
"packages/bus/tests/peer-transport.test.mjs",
"packages/bus/tests/peercred.test.mjs",
"packages/bus/tests/plugins-verb.test.mjs",
"packages/bus/tests/principal.test.mjs",
"packages/bus/tests/process.test.mjs",
"packages/bus/tests/project-await.test.mjs",
"packages/bus/tests/project-files.test.mjs",
"packages/bus/tests/project-runtime.test.mjs",
"packages/bus/tests/publish.test.mjs",
"packages/bus/tests/replies.test.mjs",
"packages/bus/tests/requirements.test.mjs",
"packages/bus/tests/review.test.mjs",
"packages/bus/tests/routes-verb.test.mjs",
"packages/bus/tests/schema.test.mjs",
"packages/bus/tests/single-use.test.mjs",
"packages/bus/tests/spec-migration.test.mjs",
"packages/bus/tests/spec-review.test.mjs",
"packages/bus/tests/spec-socket.test.mjs",
"packages/bus/tests/spec.test.mjs",
"packages/bus/tests/staff-request.test.mjs",
"packages/bus/tests/state.test.mjs",
"packages/bus/tests/store.test.mjs",
"packages/bus/tests/task-page.test.mjs",
"packages/bus/tests/task-read.test.mjs",
"packages/bus/tests/tasks.test.mjs",
"packages/bus/tests/tester-threads.test.mjs",
"packages/bus/tests/tester-writes.test.mjs",
"packages/bus/tests/tester.test.mjs",
"packages/bus/tests/thread-migration.test.mjs",
"packages/bus/tests/threads.test.mjs",
"packages/bus/tests/transport.test.mjs",
"packages/bus/tests/usage-broker.test.mjs",
"packages/bus/tests/usage-migration.test.mjs",
"packages/bus/tests/usage-runtime.test.mjs",
"packages/bus/tests/usage.test.mjs",
"packages/bus/tests/web.test.mjs",
"packages/bus/tests/workflow-roles.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r6/bus.log",
"code": 0,
"signal": null,
"wallSeconds": 35.87504165,
"pass": 627,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "webui",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"--test-concurrency=2",
"packages/webui/tests/assistant.test.mjs",
"packages/webui/tests/board-held.test.mjs",
"packages/webui/tests/browser-edge.test.mjs",
"packages/webui/tests/browser.test.mjs",
"packages/webui/tests/bus-browser.test.mjs",
"packages/webui/tests/bus.test.mjs",
"packages/webui/tests/channel-chat.test.mjs",
"packages/webui/tests/chat-browser.test.mjs",
"packages/webui/tests/chat.test.mjs",
"packages/webui/tests/conversation.test.mjs",
"packages/webui/tests/discord.test.mjs",
"packages/webui/tests/docs-browser.test.mjs",
"packages/webui/tests/editor-browser.test.mjs",
"packages/webui/tests/editor-provenance.test.mjs",
"packages/webui/tests/editor.test.mjs",
"packages/webui/tests/history-return-flow.test.mjs",
"packages/webui/tests/instances-browser.test.mjs",
"packages/webui/tests/instances.test.mjs",
"packages/webui/tests/library-cli.test.mjs",
"packages/webui/tests/limits-browser.test.mjs",
"packages/webui/tests/limits-route.test.mjs",
"packages/webui/tests/markdown-preview.test.mjs",
"packages/webui/tests/messages.test.mjs",
"packages/webui/tests/pinned-copy.test.mjs",
"packages/webui/tests/preview.test.mjs",
"packages/webui/tests/project-file.test.mjs",
"packages/webui/tests/project-name-repo.test.mjs",
"packages/webui/tests/proof-cli.test.mjs",
"packages/webui/tests/proof.test.mjs",
"packages/webui/tests/reads.test.mjs",
"packages/webui/tests/relaunch.test.mjs",
"packages/webui/tests/return-flow.test.mjs",
"packages/webui/tests/routes-browser.test.mjs",
"packages/webui/tests/routes.test.mjs",
"packages/webui/tests/send-browser.test.mjs",
"packages/webui/tests/send.test.mjs",
"packages/webui/tests/serve.test.mjs",
"packages/webui/tests/service.test.mjs",
"packages/webui/tests/settings-form.test.mjs",
"packages/webui/tests/settings-write.test.mjs",
"packages/webui/tests/shell.test.mjs",
"packages/webui/tests/sso-browser.test.mjs",
"packages/webui/tests/sso.test.mjs",
"packages/webui/tests/tester-browser.test.mjs",
"packages/webui/tests/tester-cli.test.mjs",
"packages/webui/tests/tester-listener.test.mjs",
"packages/webui/tests/tester-socket.test.mjs",
"packages/webui/tests/usage-browser.test.mjs",
"packages/webui/tests/usage.test.mjs",
"packages/webui/tests/views.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/webui/tests/assistant.test.mjs",
"packages/webui/tests/board-held.test.mjs",
"packages/webui/tests/browser-edge.test.mjs",
"packages/webui/tests/browser.test.mjs",
"packages/webui/tests/bus-browser.test.mjs",
"packages/webui/tests/bus.test.mjs",
"packages/webui/tests/channel-chat.test.mjs",
"packages/webui/tests/chat-browser.test.mjs",
"packages/webui/tests/chat.test.mjs",
"packages/webui/tests/conversation.test.mjs",
"packages/webui/tests/discord.test.mjs",
"packages/webui/tests/docs-browser.test.mjs",
"packages/webui/tests/editor-browser.test.mjs",
"packages/webui/tests/editor-provenance.test.mjs",
"packages/webui/tests/editor.test.mjs",
"packages/webui/tests/history-return-flow.test.mjs",
"packages/webui/tests/instances-browser.test.mjs",
"packages/webui/tests/instances.test.mjs",
"packages/webui/tests/library-cli.test.mjs",
"packages/webui/tests/limits-browser.test.mjs",
"packages/webui/tests/limits-route.test.mjs",
"packages/webui/tests/markdown-preview.test.mjs",
"packages/webui/tests/messages.test.mjs",
"packages/webui/tests/pinned-copy.test.mjs",
"packages/webui/tests/preview.test.mjs",
"packages/webui/tests/project-file.test.mjs",
"packages/webui/tests/project-name-repo.test.mjs",
"packages/webui/tests/proof-cli.test.mjs",
"packages/webui/tests/proof.test.mjs",
"packages/webui/tests/reads.test.mjs",
"packages/webui/tests/relaunch.test.mjs",
"packages/webui/tests/return-flow.test.mjs",
"packages/webui/tests/routes-browser.test.mjs",
"packages/webui/tests/routes.test.mjs",
"packages/webui/tests/send-browser.test.mjs",
"packages/webui/tests/send.test.mjs",
"packages/webui/tests/serve.test.mjs",
"packages/webui/tests/service.test.mjs",
"packages/webui/tests/settings-form.test.mjs",
"packages/webui/tests/settings-write.test.mjs",
"packages/webui/tests/shell.test.mjs",
"packages/webui/tests/sso-browser.test.mjs",
"packages/webui/tests/sso.test.mjs",
"packages/webui/tests/tester-browser.test.mjs",
"packages/webui/tests/tester-cli.test.mjs",
"packages/webui/tests/tester-listener.test.mjs",
"packages/webui/tests/tester-socket.test.mjs",
"packages/webui/tests/usage-browser.test.mjs",
"packages/webui/tests/usage.test.mjs",
"packages/webui/tests/views.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r6/webui.log",
"code": 0,
"signal": null,
"wallSeconds": 111.03407226800002,
"pass": 304,
"fail": 0,
"skip": 1,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"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/r6/cli.log",
"code": 0,
"signal": null,
"wallSeconds": 587.827140887,
"pass": 744,
"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/r6/packages_business_tests_business.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.4857721460000612,
"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/r6/packages_business_tests_cli.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 3.404195076999953,
"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/r6/packages_business_tests_instance-settings.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.8708043269999326,
"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/r6/packages_business_tests_library-projects-protected.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.4709744530000026,
"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/r6/packages_business_tests_resolve.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.4367549480000743,
"pass": 11,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_conversation_tests_cohort.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/conversation/tests/cohort.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/conversation/tests/cohort.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r6/packages_conversation_tests_cohort.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 27.922146513000015,
"pass": 38,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_library_tests_mapping.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/library/tests/mapping.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/library/tests/mapping.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r6/packages_library_tests_mapping.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.4136770970000652,
"pass": 8,
"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/r6/packages_library_tests_mirror.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 7.354534180999966,
"pass": 16,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_library_tests_sync.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/library/tests/sync.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/library/tests/sync.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r6/packages_library_tests_sync.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 2.932404891999904,
"pass": 15,
"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/r6/packages_project_tests_project.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.7687200799999991,
"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/r6/packages_seat_tests_checkout.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 6.295986329999985,
"pass": 78,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
},
{
"name": "packages_tasks_tests_requirements.test.mjs",
"command": "/usr/bin/node",
"args": [
"--test",
"--test-reporter=tap",
"packages/tasks/tests/requirements.test.mjs"
],
"kind": "node",
"wholeFiles": [
"packages/tasks/tests/requirements.test.mjs"
],
"log": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r6/packages_tasks_tests_requirements.test.mjs.log",
"code": 0,
"signal": null,
"wallSeconds": 1.3982757729999722,
"pass": 3,
"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/r6/test-auth.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 1.9081228229999543,
"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/r6/test-conductor.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 8.057173820000026,
"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/r6/test-config.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 3.1678915339999367,
"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/r6/test-discord.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 8.613370803000056,
"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/r6/test-extension-package.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 2.6515103489999894,
"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/r6/test-foundation.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 39.145344808000026,
"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/r6/test-land-work.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 12.047738473000004,
"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/r6/test-queue.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 21.795574542999965,
"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/r6/test-release.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 10.876533943000016,
"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/r6/test-task.sh.log",
"code": 0,
"signal": null,
"wallSeconds": 27.828224730000017,
"pass": 98,
"fail": 0,
"skip": 0,
"observedFailures": 0,
"stopped": false,
"complete": true
}
]