Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42b47f36c4 | ||
|
|
1bb1e8dd60 | ||
|
|
ed99ca2259 | ||
|
|
ab1f0e576f | ||
|
|
d218e14bd9 | ||
|
|
64539c96bb |
No files matched your search
-155
@@ -5177,8 +5177,6 @@ Before: managed project/thread verbs had no Console conversation area. After: fi
|
||||
2026-10-21T01:28:05Z | Darkwing | row 232 #1734 installer I1 build, round 1 in review | Before: stack-release.sh managed only user units (systemctl --user), and stack-copy.sh had no bundle copy. After: --units external (adopt, activate, rollback --to, status, confirm, revert, gate --since, AWAITING-UNITS, stale-start, external-pm, --plan --expect-from) and stack-copy check --units external, copy --bundle FILE SHA, wrapper ID --create; user mode byte-identical to the base by test. First build 0af0c73c6 on 00d4cc1f6; rebased onto row 200 (cb5fdb064) as a0ffabc3f on darkwing/row232-r1; --sso refused under external (D9), row 200 config_checks run under external (D10). Gate on Sage's slot (sage-1618): cli 561/0, every scripts/test-*.sh green; 17/17 mutants killed. Results commit 84f1a91e6 (pushed, seat branch only). Manifest 7a3b4ea1 (9 paths), queue revs 2595-2596, request comment 29825, reviewer Filbert. Packet agents/darkwing/work/queue-232/BUILD.md.
|
||||
2026-10-21T04:50:44Z | Darkwing | row 233 #1735 installer I3 build, round 1 in review | Before: root had no upgrade driver for root-owned units and no host run sheet; stack-release.sh had no rehearse --backup last and no external plan refusals. After: scripts/stack-upgrade.sh upgrade and rollback (r6 A1-A5, A2f, R1-R4) with 20 tests, docs/guides/host-run-sheet.md, TOOLS.md lines, and on Sage's rulings stack-release.sh --backup last, BACKUP_STORE and the --plan refusals open-activation and migrate-required (3 tests). Base e65a3ab4d (row 232's landing). Gate on Sage's slot (sage-1704) on d99166ade: cli 616/0, every scripts/test-*.sh green, 1201/0 summed by awk; m1-m8 8/8 killed. Correction: the process sweep after the gate found an orphaned sleep 60 from the lock test's flock holder (N1); 08db6ac3f fixes it test only, Sage ruled the gate stands (sage-1707), rerun c0 20/0 and m1 killed with 0 left (sage-1708). Tip 1a1dc80ca (pushed, seat branch only). Manifest 464ce9eb (7 paths), queue revs 2644 and 2647, request comment 29901, reviewer Filbert. Packet agents/darkwing/work/queue-233/BUILD.md.
|
||||
2026-10-21T06:37:41Z | Darkwing | row 240 #1746 installer I4 build, round 1 in review | Before: root had no host check for the bwrap AppArmor profile, its pins or a boot unit, and stack-upgrade.sh exited 1 args-failed when the args move after A5 failed, while exit 1 means the old copy runs. After: scripts/case1-hostcheck.sh (seven items, --check, --enforce, --upstream), scripts/case1-pins.sh, mosaic-hostcheck.service and 16 tests; the args move failure exits 5 args-failed, documented in TOOLS.md and run sheet section 6 and tested; run sheet section 3 puts the pinned npm on PATH and names the bin/claude.exe --claude path; sections 8 and 10 have precheck lines. Verification: slot run r1 on 47ec9fe2f failed at the singles (the new N1 test's after hook threw ENOENT after the fixture cleanup removed the root); b45852daa drops the hook; r2 on b45852daa green: singles 16/0 and 21/0, c0 plus M1-M8 8/8 killed, cli 639/0, scripts 585/0. Candidate darkwing/row240-r3 ad1b23ab2 on c771a36f4, manifest 573ece95 (9 paths), revs 2694 and 2695, comment 29943.
|
||||
2026-10-21T09:00Z | Herb | row 215 C2-04 implementation started | Before: business files reject library entries and root consumers assume code projects; the organization writer can change all project mappings. Plan: approved manifest 2522025af on C2-01 a2c72ac95, Filbert reply to herb-0056, scope sage-1848/1852/1860. Focused slot sage-1869 observed expected red mapping and M9 cases, then 14/0 green for new T1/T2 cases, no skips; clear herb-0062 with empty test/fixture process scan. After that clear, T3/T4 tests and host-only mirror/bus implementation continue under sage-1874, unrun while Sage holds the slot. Full singles, suites and implementation review remain pending. No source commit, push or live change.
|
||||
2026-10-21T13:29Z | Herb | row 215 C2-04 source verified for candidate review | Before: business code assumed every project had a root and organization writes could replace project mappings. After: library mappings load without agent checkouts or publish grants, project mappings are protected before and after serialization, host-only bare mirrors share a bounded publication lock with sync, and library.file/library.status are human-only async bus reads. Base f8276c5eb preserves all nine landed overlaps. Granted sage-2008 whole singles: 16 files, 451/0, no skips or cancellations, ended 13:27:27.279728Z; all source hashes unchanged, process scan empty, no own-path drift through 8a04f4aa4. Full landing gate and implementation review remain pending; no HTTP, sync writer or live change.
|
||||
|
||||
2026-10-20 19:09:44 UTC | Gander row 196 #1694 design phase | Before: tester TCP reaches every local uid and human proofs do not bind the socket peer. After: design draft at agents/gander/work/queue-196/DESIGN.md inventories listeners, proposes private tester HTTP and SO_PEERCRED binding, aligns the per-request principal contract with Morgana and Gizmoduck, and lists migration, tests, mutants and same-uid limits. Python versus other credential options and Console provenance require Duckworth ruling. Documentation only. No product code, suite, live probe, secret access or deployment.
|
||||
|
||||
@@ -5189,156 +5187,3 @@ Before: managed project/thread verbs had no Console conversation area. After: fi
|
||||
2026-10-20 19:34:28 UTC | Gander row 196 build paused at design mismatch | Before: approved design promised Unix tester cleanup only for the owned inode. After: scratch test shows Node/libuv close unlinks a replacement inode before JS close handlers. Evidence agents/gander/work/queue-196/evidence/tester-cleanup-blocker.txt. Sent Sage/Duckworth gander-0016/0017, recommending explicit same-uid residual with private 0700 parent retained. Interpreter, concurrent peer, principal, human, peer-transport, transport, tester and process single files passed. Partial code uncommitted, tester transport not wired. No suites, mutant batches or live actions.
|
||||
|
||||
2026-10-21 18:45 UTC | Gander row 196 preservation before rebase | Sage-2051, Mos order mos-1193, explicitly authorizes commit and fast-forward push of the current build before deferred full verification. Product and evidence preserved together; prior focused checks and stopped gates are recorded in the row196 packet, with no claim of full acceptance. Next: rebase onto a36523713 on new gander/row196-r2, report range-diff/patch-id/conflicts, then await Sage's clear for M1-M29 and all requested suites. No live action, force push, branch deletion or tests during hold.
|
||||
|
||||
2026-10-21T16:34:44Z | Huey | Q198/Q199 system-manager design, mos-1183, Vikunja 452 | Before: pinned foundation 6c75887b0 has separate bus, development queue, run evidence, turn/cohort controls and launch/usage paths; the assignment requests a mechanical manager design. After: docs/plans/2026-10-21_q198-system-manager.md proposes admission/cooldown, priority and safe interruption, durable requests, bounded retry/DLQ/replay/rerouting, Console monitoring, optional decision adapters with USD reservations, six ordered slices and three recommended owner decisions. Verification: 26 pinned file:line references resolve, ten-line summary, manual source/contract review, git diff --check and installed queue guard pass. No builds/suites, runtime writes, credential reads, service changes or paid calls. Huey queue next refused the linked worktree, then returned nothing from canonical checkout; direct brief controls this assignment. Gitea issue and queue-row capture are handed to Sage under the no-credential-read/no-queue-write boundary.
|
||||
|
||||
2026-10-21T18:45:47Z | Huey | Q198 system-manager design r2, mos-1194, Vikunja 452 | Before: Scrooge requested changes on add7cb506 for decision-key worker exposure, cap scope and absent sampler ownership. After: distinct MOSAIC_DECISION_OPENROUTER_KEY with S6 sessionEnv canary requirement; exclusive per-instance key with per-key caps and provider limit on every enablement; S2 owns supervisor sampler and waits until after MVP/re-pin. Also records P1 interpretation, missing-confidence fallback and stand-in timeout selection, explains verified Noul spelling, excludes notifier/gateway retry loops with citations, and cites lifecycle revocation requirement. Verification: 30 pinned citation spans resolve, ten-line summary, manual diff/source review and whitespace/queue-guard checks. No builds, suites, live changes, credential reads or paid calls.
|
||||
|
||||
2026-10-21T19:56:11Z | Huey | Q198 design r3, mos-1201/1201a, Vikunja 452 | Before: Scrooge approved r2 7e785a08f with three notes. After: N1 names proposed system.health bus read verb and includes broker handler/authorization in S2 scope and review; N2 labels exclusive ownership as a setup attestation that cannot be mechanically proved and identifies provider key limit as real ceiling; N3 adds recommended Q4 for P1 narrowing and removes the Mos-flag instruction. Other design content retained. Verification: manual r2-to-r3 delta review, ten-line summary, whitespace and installed queue-guard checks. No builds, suites, live changes or paid calls.
|
||||
|
||||
2026-10-21T20:19:53Z | Huey | Q198 design r4, mos-1203, DECISIONS Q204, Vikunja 452 | Before: r3 a36952564 presented Q1–Q4 for owner approval. After: section 9 records Q20a–Q20c verbatim as approved; D11 labels Huey’s reading of configurable daily/monthly caps with $0.10/$1 defaults in the one instance config via reviewed schema; provider key ceiling and explicit enable/key requirements retained; Q4 pending, Jason restated 2026-10-21, P1 unchanged. Verification: quotes match DECISIONS ledger, unrelated sections and P1 equal r3, ten-line summary, whitespace and installed queue guard checked. No builds, suites, live changes or paid calls.
|
||||
|
||||
2026-10-21T20:48:49Z | Huey | Q198 design r5, mos-1206, DECISIONS Q205/Q206, Vikunja 452 | Before: r4 1e8bccff1 left Q4 pending and long outages could exhaust request retry budgets. After: protected mode separate from unchanged D1 human kill authority; mechanical detection, safe-point pause/proof, JEV-first endpoint-before-headless probes at 60-second increments to 600 seconds without attempt limit, upstream reset waits, shared D11 probe accounting, one test session then batches, proposed three-failed-exit escalation, frozen outage clocks/counters without DLQ, advisory online-service routing, Q4 superseded and Q22 pending. Thresholds/deadlines/batches/escalation explicitly labelled Huey readings. Acceptance proposals updated, no implementation. Verification: complete Q205/Q206 read, quotes match ledger, D1/inventory/Q1–Q3 unchanged, 30 pinned citation references resolve, 11-line summary, manual consistency/diff review, whitespace and installed queue guard checked. No builds, suites, real probes, live changes or paid calls.
|
||||
|
||||
2026-10-21T21:04:37Z | Huey | Q198 design r6, mos-1208/mos-1210, DECISIONS Q207, scrooge-0003, Vikunja 452 | Before: r5 fd44f7c60 gated probes on JEV and lacked request-local resume failure separation. After: parallel independent probes; central JEV/smaller-model/rules endpoint chain, per-model timeout/calibration, 4 KiB metadata limit and isolated fallback credentials; subscription quota vs metered USD accounting and separately enabled paid-probe budget (proposed $0 defaults). S-F1–S-F7: bounded outage classification, request-local D6/two-resume DLQ rule and batch definition; escalation latch with authorized revision-bound system.recovery.release separate from kill clear; cooperative F5 pause/F6 proof only; proposed configurable 24-hour cumulative pause expiry; full Q205 kill sentence with labelled protected-mode interpretation; r3–r6 history. S5/S6 acceptance proposals updated. Verification: Q205/Q207 quotes match ledger, D1/inventory/Q1–Q3 unchanged, 30 pinned references resolve, summary within 15 lines, manual consistency/delta review, whitespace and installed queue guard checked. No builds, suites, real probes, live changes, credential reads or paid calls.
|
||||
|
||||
2026-10-21T21:39:25Z | Huey | Q198 r6.1 touch-up, mos-1222, scrooge-0004 N1–N3, Vikunja 452 | Before: approved r6 2ee68cd69 had unprovable session-call denial wording, implicit queue/late-call behavior and a partial Q207 paragraph. After: rule/S6 tests require session decision calls/output have no routing authority; non-waiting dispatchers use internal rules immediately; timed-out JEV does not occupy fallback decision slot but retains spend reservation; full Q207 paragraph copied exactly from DECISIONS; matching Q22 reading corrected. ENV_ALLOW and all runtime code unchanged. Verification: exact full-quote equality, obsolete wording absent, D1 unchanged, summary within 15 lines, manual N1–N3 delta review, whitespace and installed queue guard checked. No builds, suites, probes, live changes or paid calls. Review/handoff via T3 as Mos authorized.
|
||||
|
||||
2026-10-21T21:11:44Z | Della mos-1213 / Vikunja 460 planning phase | Before: PRD 1.10 has no email feature; MP 95b0298 and EP 7a64921 are read-only prior inputs. Scope: independent post-v1 email plan on della/email-plan, no implementation/live access/MVP or queue changes. Gitea issue enrollment belongs to Mos/Sage because this seat has no API credential.
|
||||
|
||||
2026-10-21T21:12:18Z | Della mos-1213 / Vikunja 460 planning verification | After: docs/plans/2026-10-21_email-plan-della.md is 341 lines, with 13 post-v1 rows and six Jason questions. Verified 42 pinned citation anchors, ten requested coverage areas, identical prior src trees, append-only records, clean whitespace and repository queue guard. No configured CI pipeline or CI-queue wrapper found in the current foundation; documentation-only validation applies, no product suites or live tests run. Phase B/C and Gitea issue/queue enrollment remain with Mos/Sage. Only della/email-plan is authorized for push.
|
||||
|
||||
2026-10-21T21:37:07Z | Della mos-1220 / Vikunja 460 phase B cross-review | Before: independent plans Della 191dff32f and Ludwig 4a27b73ac delivered. After: docs/plans/2026-10-21_email-review-by-della.md reviews all 218 Ludwig plan lines, records ten findings, five grafts, six retained strengths, nine disagreements and eleven merged Jason questions. Ludwig review 143415779 read in full after ludwig-0002 arrived; reconciliation records new mail-access action, no agent reroute and correction of Della dataRoot credential example. Original plan unchanged. Planning only, no product/MVP/queue/live change.
|
||||
|
||||
2026-10-21T21:43:02Z | Della mos-1223 / Vikunja 460 phase C synthesis | Before: independent plans/reviews complete, Mos selected Della base. After: docs/plans/2026-10-21_email-plan.md merges Ludwig grafts and accepted corrections, with 16 post-v1 rows (eight READY, eight WAIT/optional), eleven deduplicated Jason questions, per-row test paths and explicit Q210 non-v1 scheduling. Original Della plan/review preserved; Ludwig originals remain on their branch. Static checks cover graft/row/question/citation anchors and original blobs. No source code, suite, mailbox, secret file, service, MVP or queue change. Candidate goes to Ludwig before Sage landing/queue handoff, copying Mos.
|
||||
|
||||
2026-10-21T21:45:20Z | Della mos-1223 / ludwig-0004 focused corrections | Before: b096a16cc left content-key location implicit and E05 core registration marked ready. After: merged plan 399 lines fixes external configDir secret key/lifecycle namespace outside dataRoot backup/restore, E01 schema and E03 missing/expired-key restore tests, and E05/E06 test-local registry readiness with core kinds.mjs registration gated on approved E01/Q4. Sixteen rows and eleven questions retained; originals unchanged. Focused static checks and queue guard apply, no product/live changes. Reviewer will check changed lines only.
|
||||
|
||||
2026-10-21T22:24:12Z | Huey | T1 item 7 sessions design r1, mos-1232, Vikunja 463 | Before: origin/refactor cca206cdc keys assistant claims/stores/messages by thread and renders Pi compaction markers; row 194 r4 excludes thread context clear. After: docs/plans/2026-10-21_t1-sessions.md proposes independent per-agent sessions within threads on Pi/Claude, scoped claims/stores/messages/workspaces, completed compaction counts, owner-write/RBAC matrix, idempotent proven-stop/fresh-successor clear, common admission/kill checks, migration and seven acceptance groups, replacement REQ-ROLE-2/REQ-THREAD-2 text and three owner questions. PRD 1.12 USER-3/4 candidate 1509c7cc5 cited separately from base. Verification: 22 pinned references resolve, eight-line summary and three exact owner quotes; manual source/consistency review, whitespace and installed queue guard checked. No code, queue/PRD edits, builds, suites, credential reads, live changes or paid calls. MVP priority ahead of Q198 S1. Review via Scrooge, then Sage/Ludwig as Mos authorized.
|
||||
|
||||
2026-10-21T22:28:56Z | Huey | T1 sessions design r2, scrooge-0006, mos-1235/1236, Vikunja 463 | Before: r1 347278044 lacked the exact per-session checkout/single-writer invariant and safe runner drain ordering, and admitted other role instances. After: F1 exact workspace path, fenced checkout setup, legacy shared-workspace quiescence, clear retains old dirty/untracked/unpushed checkout and creates fresh approved checkout, T2 mutant; F2 dequeue fence and generation-bound turn-boundary idle proof before runner signal, busy drain stays clearing, T4 cases; F3 THREAD_DEFINITION only per Mos scope ruling, no role eligibility change; N1 private titles/history vs owner-visible count/activity projection; N2 Claude offline adapter/managed-store-reader dependency flagged as MVP risk. Section 8 records Mos’s Q1–Q3 readings, no questions to Jason. Verification: 27 pinned references resolve, summary within 15 lines, source/delta consistency review, whitespace and installed queue guard checked. No code, queue/PRD edits, builds/suites/live changes/provider calls/credential reads.
|
||||
|
||||
2026-10-21T22:30:20Z | Huey | T1 sessions design r3, scrooge-0007 R1, Vikunja 463 | Before: r2 e19e30df2 nested new session checkouts under the retained legacy instance workspace, allowing project-name collision or historical parent inspection to reach live siblings. After: exact path is dataRoot/session-workspaces/business/instance/session, outside the legacy root; canonicalized ancestor/descendant overlap refuses; T2 nesting mutant covers historical mount/inspection and a legacy project named sessions. All other r2 content retained as approved, revision label updated. Verification: old nested path absent, manual R1-only delta, whitespace and installed queue guard checked; no code/builds/suites/live changes/provider calls/credential reads.
|
||||
|
||||
2026-10-20 18:51:10 UTC | Row 191 #1689 design phase | Before: per-business launch revoke and per-binding Discord STOP leave task containers, active sessions and background work without one switch. Proposed per-data-root durable halt with human-only resume, generation-fenced starts, bounded concurrent termination, write-once stop receipts and existing event mirror; no schema migration. DESIGN.md inventories starter/continuation paths and container control-mount restriction. Sent to Dewey with Sage copied; implementation waits independent design approval. No tests, commits or live actions.
|
||||
|
||||
2026-10-20 18:57:51 UTC | Row 191 design revision | Dewey r1 changes: interim Console --send absence, reserved processing events and missing-state semantics required correction. DESIGN-r2.md now names CLI interim path, unavailable UI controls, trusted initialization and fail-closed missing leaf, container delete/replace mount tests, reservations and id-bound reconciliation. Small notes addressed including diagnostic seats and aliases. Recommended smaller Docker scope to Sage; design and scope approval pending, no code or test runs.
|
||||
|
||||
2026-10-20T19:50:56Z | Rocko | row 191 #1689 implementation stage: from independent brakes to shared root state, generation-fenced launcher and tracked stops, Discord/task guards and control HTTP/UI. Evidence is agents/rocko/work/queue-191/logs/ and PROGRESS.md. Fixture single files only so far; heavy verification and candidate not complete. Scope additions sage-1367 (one read-only CODE file) and sage-1392 (processing-only client socket timeout); no schema, proof baseline, live file/unit, commit or push change.
|
||||
|
||||
2026-10-20 22:58:45 UTC | Rocko | row 191 #1689 rebase inspection candidate | Rebuilt uncommitted kill-switch tree from da230ca48 onto landed row 190 base 00d4cc1f6 under new branch rocko/row191-r2-00d4. Hand merges retained instance flags and SSO/sign-out changes; fixture tests exposed and fixed SSO signer compatibility and two unknown-runtime cleanup defects. Final touched singles 249/249 across 26 files; 15 overlapping Client reader files 102/102. Manifest a4f780c2 has 78 paths; packet 185 files verified with scan clear. Mutants and owner gate remain pending; no review-ready or activation claim, no commit/push/live action.
|
||||
|
||||
2026-10-21 23:39:21 UTC | Rocko | row 191 #1689 inspection snapshot | Sage-2242 authorized a local inspection commit for Honker's row 194 S6. Created d52b4db1c on new rocko/row191-inspection-20261021, parent 00d4cc1f6, preserving the reviewed-design build and candidate a4f780c2 (78 paths). Static manifest/index/source scan and diff check verified; no tests run, no push credential or push attempt. Existing single-file evidence is historical, 249/249 and overlapping Client readers 102/102; suites/mutants/gate remain pending. Current code has verified runtime signalling and instance halt, but no dedicated per-run stop API yet; Honker and Sage notified of that seam directly. Snapshot is not review-ready or approved for live use.
|
||||
|
||||
2026-10-22 00:04:05 UTC | Rocko | row 191 #1689 per-run stop inspection | Implemented agreed Honker-0079/0081 stopRun contract with verified per-signal identity, fixed 5s+2s, durable first-owner join and immutable result plus later-exit observations. Focused CLEAR sage-2250: final 9 files 62/62, no skipped, after correcting host guard placement and peer-discovery fixture timeout isolation; initial failures and failed teardown logs retained, only own failed group stopped. Slot returned with cwd sweep clear. Sage published f7bf7dfec; sage-2265 clean rebase creates 7aa18b0f6 on dcd8d4dda under new branch, explicit Rocko identity, all 79 manifest product blobs identical so 62/62 evidence carried. Direct S6 handoff sent to Honker and Sage. Wider suites, mutants, review and activation remain pending.
|
||||
|
||||
2026-10-22T00:18:12Z | Sage (Opus 5.5) | row 254 landing (#1759), library.sync human timeout | Before: the human transport gave library.sync the 5-second default, so a sync longer than that reported outcome-unknown, and six library-* codes reached the Console as 502. After: 331597709 lands Megavolt's candidate (7 paths, tree d49e4626f, manifest digest be63cfbe recomputed and matched). human-cli.mjs waits 130 s for library.sync, past the server's 120 s hold, and 5 s for other verbs. webui bus.mjs maps library-sync-busy, library-diverged and library-accept-stale to 409, library-accept-invalid to 400, and library-credential-missing and library-fetch-failed to 503. channel-proof re-pinned. Merged-tree gate on the landing commit: library 77/0, bus 628/0, webui 305/0 (1 skip), cli 749/0 (23:44:33-23:55:11Z). eb9672c91 adds the README request-timeout sentence (Dewey N1) and a DEFERRED entry for the four library codes still at 502 (Dewey N2, binds the Console library routes row). Overlap sweep before push: 268 rebased to r2 ecd9b35eb (README only, approval carried webby-0096), 194 rebased to b7. Done rev 3072, #1759 closed.
|
||||
|
||||
2026-10-22 00:24:34 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 full gate on c78f48946 | stopped on second integration failure per sage-2275; singles 269/269, processing-control 61/61, bus 646/646; CLI interrupted with 26 observed failures; no further edits; cwd sweep empty and slot returned to Sage.
|
||||
|
||||
2026-10-22 00:48:20 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 eb3abba12 full gate | stopped at Discord 190/192; 32 singles 304/304, processing-control 61/61, bus 646/646, cli 761/761; two uninitialized Discord fixtures reported to Sage; no later run; cwd sweep empty, slot clear.
|
||||
|
||||
2026-10-22 00:58:27 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 sage-2294 fixture fix | e6800380d on eb3abba12, two test files/four additions, assertions preserved; 338-entry static all-package sweep recorded; no tests; sent Sage for publication and Honker for dependent gate.
|
||||
|
||||
2026-10-22 01:30:04 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 e6800380d resume | binding15/15, recover5/5, Discord192/192; stopped WebUI314 passed/4 failed/1 esbuild skip; processing polling violates sign-out/manual redirect and bar changes layout; no fixes/retries, cwd sweep empty, slot returned.
|
||||
|
||||
2026-10-22 01:38:08 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 sage-2317 Console integration fix | 8e1f55c1d on e6800380d; shared sign-out/manual redirect/interval and desktop frame fixes, assertions retained, six browser cases, 73 mutant sites preflight; syntax only, no tests; sent Sage/Honker.
|
||||
|
||||
2026-10-22 02:06:38 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 rebase sage-2329 | eafcbd3e7 on ddfb29af7, new branch, dispatcher retains processing and access; CLI/readme auto-merges checked; 87-path fd0f2740 manifest and 73-site preflight; Sage2333 published, awaiting CLEAR; no tests.
|
||||
|
||||
2026-10-22 02:20:51 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 eafcbd3e7 full gate | stopped singles313/6: six new browser cases count app freshness timer as processing timer; diagnosis sent Sage, no fix/retry; no suites/shells/mutants; cwd sweep empty, slot clear.
|
||||
|
||||
2026-10-22 02:23:13 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 sage-2345 timer fixture | 4db8b5778 on eafcbd3e7, one line attributes timer to processing.js; all assertions retained, no product change or tests; sent Sage and Honker; awaiting publication/CLEAR.
|
||||
|
||||
2026-10-22 02:25:29 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 sage-2349 record commit | 0f8235277 on 4db8b5778 adds packet BUILD.md cause record; product manifest remains ffb46fbd/87 paths; no amend, product change or tests; Sage/Honker notified.
|
||||
|
||||
2026-10-22 02:48:36 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 0f8235277 full gate second red | singles330/330, processing61/61, bus646/646, cli783/783, discord192/192; WebUI323/1/1 host esbuild skip; shell geometry1062vs1000; stopped/no retry, no later suites/shells/mutants; cwd sweep empty, slot returned, Sage escalates Mos.
|
||||
|
||||
2026-10-22 02:57:36 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 mos-1248 desktop layout restart | FF 5cd32f4c1 on 0f8235277: desktop grid allocates processing bar, existing shell assertions kept, visibility/no-scroll assertions added; 74 static mutant sites; candidate 2f93ef19; sent Webby/Sage for static review; no runs, awaiting review and CLEAR.
|
||||
|
||||
2026-10-22 03:11:09 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 static nav layout, mos-1249/1250 | FF da4334806 on 5cd32f4c1; controls first in nav, non-sticky per sage-2386/webby-0108; candidate-only placement assertion changed, landed shell assertions preserved; 77 mutants statically preflighted; manifest 245dceb1; Webby/Sage handoff sent, no runs, awaiting static look/publish/debug CLEAR.
|
||||
|
||||
2026-10-22 03:15:11 UTC | Rocko (d99326cc) | row 191 sage-2394 debug | da4334806 shell5/5 and processing-browser9/9, awk14/0/0; geometry heights reported with read-only distinction; cwd sweep[] and slot returned; full window awaits separate CLEAR.
|
||||
|
||||
2026-10-22 02:01:30 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 202 #1700 FED R5 landing | ddfb29af7 on 9c9732983: 6 manifest paths from a74cd9f87 (digests match CANDIDATE.sha256, patch-id 9d89077b equal); Duckworth APPROVE r5 rev 3026; C1 gate by Quackerjack on merge 3b86180b9: cli 771/771 skip 0 (run 2, run 1 red on gate TMPDIR length), 10 test-*.sh rc 0, M1-M13 killed; done rev 3108; landing note refused for length before the done move, so the record is the commit body and #1700 c30265; 191 and 194 rebased onto it (one scripts/mosaic case line)
|
||||
|
||||
2026-10-22 03:35:55 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 273 #1778 activate --send/--no-sso landing | 0bbf0f6d1 landed on 378a76b85, a rebase of cac7d0f67 (0042f713d) with all 6 range-diff pairs = and equal patch-ids; 4-path manifest e1031023 unchanged; Filbert APPROVE rev 3111 (c30308) carried merge-scoped under mos-1160, carry comment c30319 names 0bbf0f6d1. Gate on 0bbf0f6d1 by Darkwing: stack-release.test.mjs 218/218 skip 0, stack-release-external.test.mjs 25/25 skip 0, test-release.sh rc 0 (selftest 14/0, no skips), T58 controls c0 11/11 pass and c1 11/11 fail, M1-M7 killed. Rerun because row 202 changed scripts/mosaic, which stack-release.test.mjs copies. Red 1 was 978143bf4 (T53 test 6 usage pin). This doc commit adds the TOOLS.md usage line and F39 rules (Filbert N1).
|
||||
|
||||
2026-10-22 04:02:12 UTC | Rocko (d99326cc) | row191 full window0fa7bf421 | touched35files336pass, packages2403pass/1esbuildskip, shells425selftests+156queue node pass; SR01–07killed, SR08timeout,69unrun; stopped/no retry;88blobs restored,cwd sweep[],owned network removed,slot returned Sage; await Mos ruling.
|
||||
|
||||
2026-10-22 04:14:56 UTC | Rocko (d99326cc) | row191 control/resume sage-2427 | control12/12;SR08separate timeoutkill;49resumed assertionkills thenKS43survived;total56assertionkills+1timeout,1survivor,19unrun;88blobs restored,cwd sweep[],slot returned,Sage/Mos informed;no retry/edit.
|
||||
|
||||
2026-10-22 04:21:30 UTC | Rocko (d99326cc) | row191 KS43+19 retarget run | KS43assertionkill thenKS44invalid mutation syntax;57assertionkills+1timeout,1invalid,18unrun;stopped,no edit/retry;88hashes restored,cwd sweep[],slot returned,Sage/Mos notified.
|
||||
|
||||
2026-10-22 04:30:06 UTC | Rocko (d99326cc) | row191 KS44+18 resume | 10assertionkills thenKS54timeout-without-control despite dependency assertion;total67assertionkills+1timeoutkill,1unqualifiedtimeout,8unrun;88hashes restored,cwd sweep[],slot returned,Sage/Mos notified,no retry/edit.
|
||||
|
||||
2026-10-22 04:41:46 UTC | Rocko (Codex gpt-6.1-sol,d99326cc) | row191 #1689 builder complete/in-review | published0fa7bf421,manifest0bcbf337;35singles336pass,9packages2403pass/1knownskip,10shells425selftests+156queue nodepass;75assertionkills+2controlledtimeoutkills=77;88hashrestore,cwd sweep[],slotreturned;in-review rev3114,expected no-token failure3115(exit1);Sage/Dewey handoff,no live action.
|
||||
|
||||
2026-10-22 05:03:18 UTC | Rocko (Codex gpt-6.1-sol,d99326cc) | Vikunja502 processing test/runner hardening | brief+isolatedrocko-v502;expected wordingred→green,Node27/27,Python4/4,5/5assertionkills(includingSR08andKS54nohang),0skips/timeouts;sweep[],candidate5hashrestored,slotreturned05:01:29Z;candidate968d6ee3,runnerc5bdc764;packetready,no commit/push/liveaction.
|
||||
|
||||
2026-10-22 05:07:34 UTC | Rocko (d99326cc) | Vikunja502 committed/review handoff sage-2482 | newbranchrocko/vikunja502-ce6a-20261022,source8e3c6a79b+packet9bf4683c6 on ce6a96ad6;5paths no base drift,range-diff=,patch-id37135ebe unchanged;manifest968d6ee3,packet93889519 verifies39/39;focused runs carry;Sage publish/Dewey review handoff sent,no push/liveaction.
|
||||
|
||||
2026-10-22 05:10:00 UTC | Sage (1ef1e4f8) | serial landing 205 then 268 | 205: 3 commits, 4 paths, digest 858463b1, every scripts/test-*.sh green on ce6a96ad6, Duckworth N1-N4 carried (N1/N3 to 205b or R3, N2 to the 193b2 brief, N4 #1782 before any user thread goes live). 268 r4: c27207f6e on 205, 9 paths, digest caa0fa4e, patch-id 2942acc8 equal to r3. Overlap checks clean before both pushes. No live action; LIVE stays 86f95bb27.
|
||||
|
||||
2026-10-22 05:58:59 UTC | Rocko | row 279 #1784: before, deadline overshoot skipped final observation and returned unknown; after, one-line for (;;) retains final mapping and unchanged unreachable fallback. Regression red as specified; whole stop-run 13/13 and processing-control 62/62; M1 assertion kill, no skips, restored and swept. Source 1016b8584, packet cad927137; manifest 312ed511d8f1cff826ee2fd547de8368923130c7bfe06236d8e29d8655b80aaa. Pending Sage publication and Dewey review; no live action.
|
||||
|
||||
2026-10-22 06:15:54 UTC | Sage (1ef1e4f8) | row 279 #1784 landed (mos-1269) | Before: stopRun returned unknown for a live run when a sleep overshot the deadline. After: LANDED ceadad993 as a carry of cad927137 onto 343b6dd76 (range-diff 1:= 2:=, patch-ids 6d8ae7f4/e484c297 equal, Dewey carry c30410). Sage gate on cad927137: business 209/0/0, cli 794/0/0, discord processing + processing-stop 9/0/0. Correction: the first discord run wrote to a wrong out path and ran nothing; the rerun is the result. Overlap sweep clean (13, 257). Note rev 3144, done rev 3145. No live action; LIVE stays 86f95bb27.
|
||||
|
||||
2026-10-22 06:37:43 UTC | Sage (1ef1e4f8) | row 194 b16 third red (mos-1269/mos-1270) | Gate on ceadad993 + 9cdc47d04: business 228/0, cli 826/0 (T9a passes), control-board 124/0, bus 705/1 at grant-executor.test.mjs G13 (timed out 10044 ms); conversation, webui and scripts/test-*.sh never ran. runb8 green 436/0/0, 17/17 mutants. Correction to sage-2524 (mos-1270): the stuck wait is the first until at :733, the holding file after decision.resolve, so the executor never started the install and hosts.revoke at :734 never ran; it is not a revoke-path hang. Ruling: a diagnosis run, 30 base + 30 candidate alternating under cli load, no gate retry.
|
||||
|
||||
2026-10-22 07:51:04 UTC | Rocko | row 280 #1785: before, any TCP connect could accept a port our sshd failed to bind; after, attempt-local exact log proof plus liveness and connect, non-ephemeral picker, bounded scratch remote sleep cleanup. Both occupied regressions red on old acceptance; CRLF build failure captured and fixed under sage-2535. Committed source b765f5cb8, packet d6c924764, manifest27806c0579c76d0999d2e6be4180c3867570df0268af9d7e0d7b971af799e6f5. Repeats07:29:03Z–07:48:38Z grant1230/1230,host780/780,CLI1588/1588; final M1/M2 four assertion kills,0skips/timeouts,sweepclear. Sage publishes/gates; Duckworth reviews.
|
||||
2026-10-22 08:00:02 UTC | Sage (1ef1e4f8) | row 280 #1785 landed | before: the bus tests' scratch sshd helper returned a port on a connect alone, and 194 b16's gate hung at G13 (base hung too, honker-0127). After: b0fd28b6f on refactor, a ff from da5d3651d (b765f5cb8 + Rocko slim packet; full evidence d6c924764 on rocko/row280-da5d-20261022). Duckworth approve rev 3153 (manifest 27806c05). Sage gate bus 656/0/0, ge 41/0/0, hr 26/0/0 (c30431). Rocko repeat 2010/2010 under cli 1588/1588, no timeout; M1/M2 killed 4/4. Two build-time slips recorded in Rocko's packet: a runner root path (no test ran) and the CRLF sshd log line. Overlap 13/257 clean. Note rev 3154, done 3155, #1785 closed c30432, P19 511 comment 623. 194 b17 rebases on b0fd28b6f (sage-2542).
|
||||
|
||||
2026-10-22 08:38:11 UTC | Sage (1ef1e4f8) | row 194 #1692 landed | before: 194 b16 9cdc47d04 went red three times (stopRun deadline, then the bus test sshd port race), fixed by rows 279 and 280. After: fd6dd327c on refactor, a ff on e122aad8e. b18 is b17 3f451772d rebased after my doc and queue push blocked a ff (16 =, series patch-id 64303253f8e6, packages equal b17). Webby approve rev 3160 on manifest 29f131ab. Honker gate on fd6dd327c: runb8 503/0/0, mutants 17/17; 18 packages 3668/0, ten scripts rc=0, Docker up, env skips named. The secret scan hit three fake_*_token fixtures in bus tests (false positive). Note 3161, done 3162; #1692 closed c30435; P19 414 comment 625. LIVE still 86f95bb27.
|
||||
2026-10-22 08:42:04 UTC | Honker (Claude Opus 5.5, ecd17786) | row 194 #1692 agent lifecycle build | before: no Console or CLI lifecycle for agents (create, launch, terminate, regenerate, delete) and no per-agent hire/fire veto. After: 16 commits landed as fd6dd327c (b18, a rebase of b17 3f451772d on e122aad8e: 16 =, series patch-id 64303253f8e6, packages equal b17). Manifest 53 paths, digest 29f131ab. Final run on fd6dd327c: runb8 39 files whole 503/0/0, mutants 17/17 killed, restores matched; gate.sh merge onto e122aad8e, 18 packages 3668/0, ten scripts rc=0, Docker up, four env skips named (webui esbuild pin, queue render outside canonical root, test-task live provider x2); sweep clean. Corrections: b16 went red at G13; my diagnosis (60 runs, base hang on port 38927 sshd bind EADDRINUSE) placed it outside 194, fixed by row 280; the g13diag load kill missed its process group and overran about 8 minutes; one runb8 launch failed rc=126 on a lost exec bit before any test ran; the b17 runb8 was stopped unscored when refactor moved. In-review revs 3156/3157, Webby approve rev 3160.
|
||||
2026-10-22 09:43:34 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 236 #1742 Gitea grant landing, and row 281 filing | 236 landed bd5f11ded at 09:37:31Z, a fast-forward on be2b008cc: 08840f3c1 rebased past 194 (commit 1 unions only, 2-7 =), e40b74beb for two stale out-of-manifest pins, bd5f11ded for a gitea-not-configured raise test. Dewey approve rev 3168 on manifest 0b00269b (34 paths). Megavolt gate under my slot: 2c bus 131, cli 224, route 28, docker 1; whole bus 765, business 228, cli 832, ten scripts rc=0; mutants 40/40; skips named, env only. Overlap with 13 and 257 clean. Note 3169, done 3170; #1742 closed c30451; P19 436 comment 639. Correction: the first whole run on ce74477e1 went red 762/764 on the two stale pins; that run is void. Follow-up per mos-1271: row 281 (#1786), a fire or delete revokes host and Gitea grants, Megavolt owns, Dewey reviews; brief docs/plans/2026-10-22_fire-revokes-grants.md; DEFERRED entry points at it.
|
||||
2026-10-22 10:30:51 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 274 #1779 FED R3 broker user principal landing | 274 landed 4c485c63b at 10:28:26Z, a fast-forward on 47a35bf43: six Morgana commits d20c92bf6..4c485c63b. r5 f58cfc361 moved covers, LEVELS and the all marker into business/src/vocabulary.mjs so the broker keeps its sandbox import closure (M16/M16b/M16c). r6 4c485c63b pins USER_VERBS as the ruled seven and widens the R3 off-list set. Dewey approve rev 3178 on manifest 00047b52 (13 paths), comment 30487. Morgana gate under my slot, 10:09-10:22Z: 23 touched files 0 fail, bus 787, harness 151, business 228, cli 832, seat 167, ten scripts rc=0, mutants 22/22; skips named, env only (test-queue 1, test-task 2). Overlap with 13 and 257 clean. Note 3179, done 3180; #1779 closed c30491; P19 414 comment 646. Corrections: the r5 gate on f58cfc361 went red (M3x/M6x survived the R3 off-list set), void; my gate comment 30490 said 24 touched files, the count is 23; the kit comment guessed human-required for the M3x wall, the run code is not-holder.
|
||||
2026-10-22 10:57:34 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 256 #1761 the human deletes a creative instance, landing | before: row 194's deleteRefusal refused every END_PROTECTED definition for every actor, so nobody could delete a creative instance; the human could only delist one with launch: false. After: 256 landed f12441d4f, a fast-forward on 0165be266 (the 274 landing plus its docs and queue commits): four Honker commits b5f1e09d6..f12441d4f, patch-id b28e63746f8c. One protectedRefusal predicate serves delete and the listing's per-viewer endProtected; any non-human actor gets organization-creative-human-only, fire unchanged. Rebased twice (past 236, then past 274), each range-diff 4/4 =, carries checked by Webby (webby-0126, webby-0128). Webby APPROVE on manifest-r3 01eb75aa (10 paths), comment 30519, posted by Sage as jarvis because Webby has no token; review request c30518 (Sage, revs 3183/3184) after Honker's request failed (no token, revs 3181/3182). Gate by Honker under Sage's slot 10:33Z-10:52Z on merge tree ced6bf5f8: touched files 31/0/0, 18 packages 3757/0 (bus 788, business 231, cli 832, webui 335), ten scripts/test-*.sh rc=0, mutants M1, M2, M3, M4a, M4b killed with blob-checked restores. Skips, named and environment-only: webui editor rebuild byte check (esbuild 0.28.1 installed, pin 0.28.2), test-queue non-canonical root, test-task live provider x2. Overlap with in-review rows 13 and 257 clean. Order change sage-2594: 256 landed before 277 because 277's gate had not run. LIVE is still 86f95bb27. Queue note rev 3186, done rev 3187; #1761 closed c30520; P19 416 comment 649.
|
||||
2026-10-22 11:19:28 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 277 #1782 the owner sees a thread agent's claims, landing | before: a thread run's role.claim wrote thread_claims only, and the agents verb read role_claims only, so the owner had no way to see a thread agent's claim (PRD :1083-1084). After: 277 landed 62f53b1e0, a fast-forward on 46dedf925 (the 256 landing plus its docs and queue commits): seven Morgana commits 1d5d00939..62f53b1e0, range patch-id 7f0533520bd2. A bus verb thread.claims serves human and reader sessions; mosaic agents adds thread lines without --tester or --json, --json keeps the agents array, the tester path makes one call, a refused thread.claims prints the role lines and the refusal code, and an error with no bus code still throws. Rebased onto 0165be266, then onto 46dedf925 after 256 landed first (sage-2594); both range-diffs all =, manifest e281aa2c unchanged (duckworth-0126). Duckworth APPROVE comment 30539, recorded rev 3192, posted by Sage as jarvis; review request c30538 (revs 3190/3191) after Morgana's request failed (no token, revs 3188/3189). Gate by Morgana under Sage's slot 11:01:23Z-11:13:56Z: 7 touched files 0 fail (thread-claims 5, message-filter 6, user-principal 22, format 4, tester 11, other-tree 4, host 43), bus 793, cli 836, harness 151, business 231, seat 167, ten scripts/test-*.sh rc=0, M1-M9 killed on committed bytes. Skips named, environment only: test-queue non-canonical root, test-task live provider x2. Overlap with in-review 13 and 257 clean. Duckworth N1 (M8 dies on a rethrown error) to DEFERRED; 0123 N3 per-session claims binds 264a r7. Note rev 3193, done rev 3194; #1782 closed c30540; P19 506 comment 652. Also landed as doc-only picks: Honker's 256 BUILD.md gate results (80620a3a0 as b83173305) and Megavolt's 236 BUILD.md runs (9c6e1a165 as 01ea1fb11). LIVE is still 86f95bb27.
|
||||
|
||||
2026-10-22T11:37:16Z | Gander row278 #1783 implementation prepared, verification held | Before: owner thread claims were visible through row277 but absent from the Console Agents view. After: prepared a separate four-field table, a Console-owned read adapter, section-local refusal handling and an explicit tester refusal before busRead. Ten tests and six unique check definitions are prepared but unrun. Base moved from980cec88c to6af85df4b under sage-2625 on new gander/row278-b; no candidate path overlapped. No Node process, syntax check, test, browser, queue command, push helper or live action ran. Next: Sage CLEAR for the queue claim and gate; Webby reviews the verified manifest.
|
||||
|
||||
2026-10-22T12:09:45.285844+00:00 | Gander row278 run1 void, loader fake repaired | First new-file run stopped3/1/0 because the fake omitted BusReadError imported by base chat.mjs. Sage-2638 places the first-own-test red and permits the assertion-preserving export; test-only commit964b6b184. Runtime bytes unchanged. All run1 results void, no timeout or run leftovers. Run2 must restart every step after busy CLEAR; a second red goes to Sage then Mos before any change. No product acceptance or push claimed.
|
||||
|
||||
### 2026-10-22 | Gander | row278 gate run3
|
||||
|
||||
Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version skip), all ten shell files425/0, touched files15/0, M1-M6 killed6/6. No timeout; sweep0 run-created leftovers. Runs1/2 void. Seven-path manifest8fa859a0 goes to Webby for final review. No landing or live change.
|
||||
|
||||
2026-10-22 11:29:09 UTC | Rocko | V502 carry/rerun on980cec88c: source407c8d7be and packet04a86cf33 match approved8e3c6a79b/9bf4683c6 patch-ids, no conflicts. Dewey0834 carry conditioned on rerun, satisfied under sage2616: stop-run13,processingHTTP6,bustasks9 allgreen (Node28/28),Python4/4,0skips/timeouts. Manifest5758d699,source5/5restored,cwdsweep[]. Doc rerun packet6af85df4b explicitly pushed to rocko/vikunja502-980c-20261022; no live action.
|
||||
|
||||
2026-10-22 11:30:17 UTC | Sage | Vikunja 502 (row 191 follow-up, no queue row) LANDED 6af85df4b, a fast-forward from 980cec88c. Before: the processing failure diagnostics and cleanup in stop-run, processing HTTP and bus tasks tests were Dewey-approved on the pre-194 base only (8e3c6a79b/9bf4683c6). After: Rocko's picks 407c8d7be/04a86cf33 carry the same patch-ids (37135ebe/0dbcda54), plus a doc-only rerun record 6af85df4b. The rerun on the new base was green: stop-run 13/13, processing HTTP 6/6, bus tasks 9/9, Python 4/4, 0 skips. Dewey carried the approve (dewey-0836). mosaic-task.mjs is unchanged, so N7 (runs suite) didn't trigger. Overlap with in-review rows 13 and 257 was clean. LIVE is still 86f95bb27.
|
||||
|
||||
2026-10-22 13:10 UTC | Sage | Rows 278 and 281 LANDED. Before: refactor at 6af85df4b (V502). Row 278 (#1783, Gander, Webby): the Console Agents view shows thread claims in their own section. It landed as 385a7194c at 12:39Z, ff, 9 commits, manifest 8fa859a0. Run 3 was green: bus 793, webui 345/0/1, ten shells 425/0 under the 3x limits (mos-1275), M1-M6 killed. Runs 1 and 2 were void, on fixture fixes 964b6b184 (placed by Sage) and 9696d1fcb (ruled by Mos, mos-1275). Webby approved (c30588, rev 3200). Done rev 3202, #1783 closed c30589. Row 281 (#1786, Megavolt, Dewey): a fire or a delete revokes the instance's host and Gitea grants. It landed as e479521d3 at 13:06Z, ff, 17 commits, manifest b73d4c81. Slot on 7979fb41e: bus 819, business 231, cli 837, dewey-bus 76 with the Docker gitea-grant test, shells green, M1-M22 killed. The M1 hang was fixed at its cause in b4a (mos-1273). Dewey approved (c30614, rev 3207). Done rev 3209, #1786 closed c30621. Skips on both: test-task's row 244 live-provider pair and test-queue's canonical-root check, plus webui's esbuild rebuild test on 278. After: refactor at e479521d3. DEFERRED moves the grant gap to Done and opens Dewey's N1/N2 text gaps. LIVE is still 86f95bb27.
|
||||
|
||||
2026-10-22 14:18:23 UTC | Sage | Row 264a LANDED (#1769, Gizmoduck, Duckworth): sessions per thread, schema 3k-3l. Before: refactor at e479521d3 (row 281). It landed as 84f53540d, ff, 21 commits, manifest 257408e9 (Duckworth approve rev 3214, comment 30640). Gate r13 on 2cc34aef8: 20 touched files, bus 827, cli 837, webui 345/1 named skip, ten shells under 3x limits, mutants M1-M4 killed on assertions. Corrections on the way: the kit stopped on first red, so four reds surfaced one at a time. r10 later3l missed a trigger (mos-1276). T2 had failed since r2 because refusals log action.refused (mos-1277, my sage-2257 wording). threads.test:341 kept the old trigger text (mos-1278). M2 was caught by the store trigger before any assertion, so it now drops the trigger too (mos-1279, four files with the SCHEMA_SHA256 pin). Deferred: actor_run pin binds row 269, esbuild skip to a later gate, session-scoped user reply binds row 272. No live change; LIVE is still 86f95bb27.
|
||||
2026-10-21 21:24:47 UTC | Gander row253 #1758 design r1 | Investigation began21:12Z under sage-2162; recorded now. Before: case2 installer still renders tester TCP and case1 acceptance requires it. After: proposed design covers socket marker migration, actual configured dataRoot within unchanged hardening, target-uid metadata queries, kernel-peer acceptance observation and explicit same-uid residual. Initial inventory saved; no passing final static-check claim, product edit, test, host or live action. Duckworth design review precedes code.
|
||||
|
||||
### 2026-10-21 row253 implementation prepared, gate pending
|
||||
|
||||
Gander: after Duckworth-0100 design approval with C1-C5, prepared the two host-script socket migrations, fake fixtures, updated retirement docs and 33 unique change checks. Static syntax/diff and source inventory checks pass; behavioral tests have not run. Sage-2191 queues the requested full scope and will send CLEAR. No host, unit or live config changed.
|
||||
|
||||
2026-10-22 02:13:30 UTC | Gander row253 C4 committed candidate, gate pending | Sage-2335 explicitly directs committing runnable source and tests before the whole gate. The repair implements the approved after-uid supervisor with separate inner/outer bounds; the static packet is b64aa316a. Current repaired bytes have run no syntax check, test, probe or host experiment. Earlier static syntax results apply only to the old build. Results from 8a8df4171 are historical and do not carry. Duckworth static verdict and Sage CLEAR precede all gate execution. F5 is row276 / #1781 in DEFERRED.md.
|
||||
|
||||
2026-10-22 14:45 UTC | Gander row253 focused27 on finalaca16404c base | Fresh0604d91fc / manifest573c51cf:27 whole files604/0/0, no timeout/retry, case134/0 in99.281s, case243/0 in66.418s, stack-release includingT46221/0 in583.453s. N9 sandbox bind ran and passed, no focused skips. Seven source blobs unchanged; sweep0 run-created leftovers, pre-existing infrastructure receipts retained. Whole gate and M1-M40 await separate Sage CLEAR after Duckworth rebase check. No live action.
|
||||
|
||||
2026-10-22 14:46 UTC | Gander correction to the row253 focused27 entry immediately above | stack-release whole was218/0/0, not221/0. The27-file sum604/0/0 and duration583.453s are unchanged; raw files/results.json and SUMMARY.json give the exact per-file totals.
|
||||
|
||||
2026-10-21T16:04:23Z | Q195/Q196 writing editor design, #1752 / Vikunja #448 | Before: row 154 edits Markdown in a separate Docs view, with no selected-word thesaurus or document pins. After: design draft on gyro/editor-design compares three editor approaches, records WordNet source/license/size, folds the pane/pin model and specifies guarded context/proposal APIs, DesignCraft handoff and seven proposed briefs. Q196 changes the basis to a Word-like interface. Verification so far: editor/provenance checks 10 pass, 1 explicit rebuild skip (pinned esbuild absent); brief fields, unique headings and 11-line checklist checked. Product, queue and live state unchanged. WordCraft scratch evaluation is being incorporated before publication. Review and Jason choices remain open.
|
||||
|
||||
2026-10-21T16:22:36Z | Q195/Q196 design verification, #1752 / Vikunja #448 | Folded Fenton 7caf8008b and Louie 880ef19e0. Recommend bounded O3: Word-like DOM editor plus isolated headless DOCX export, with explicit feature cut and semantic loss checks. WordCraft web 44,179,239 bytes, identical twice; measured comment/footnote conversion limits recorded. Seven briefs and 12-line checklist validated. Fresh editor/provenance: 10 pass, 0 fail, 1 explicit rebuild skip (esbuild 0.28.2 absent). CI queue guard identity gyro/purpose push returned documented degraded-pass (exit 0), CANNOT_ASSERT credential-unresolvable, scratch audit gyro-q195-ci-queue-audit.jsonl; no fallback or CI-green claim. Documentation-only candidate for Mos/Fenton review, no source, queue or live changes.
|
||||
|
||||
2026-10-22T16:06:34Z | Q195/Q196 design review fixes, #1752 / Vikunja #448, mos-1300 / fenton-0004 | Before: draft 105811400 had owner-only thread wording, stale source positions, two mismatched seat/model assignments, an assumed library save boundary and 12 owner questions. After: grant-aware pin validation and stale/revoked access redaction; references refreshed against aca16404c, including public/bus.js and README offsets; Sage assigns model-only seats; unimplemented library.file.save/C2-11b brief blocks book editing; tabs explicitly cover 62-76rem; J7 stricter context choice recorded; pronouns removed; six owner questions. Static docs/source-anchor checks only, no builds, product suites, MVP gate slot or live action. Fenton re-check pending; O3 and both companion folds retained.
|
||||
|
||||
2026-10-22T16:09:56Z | Della mos-1303 / Vikunja 460 Q217/Q222 revision | Before: Q1/Q2 open and Q3-Q7 phrased as Jason questions. After: Jason-created InMotion/woltje.com ingress recorded; per-source mailboxScope defaults none with human-only CLI then Console writer and named default/change/agent-refusal tests. Q3-Q7 settings/defaults/owners documented; no new external decision required for default development, conditional provider/spend/exposure list retained. PRD/grant/data.delete/live gates preserved. Docs only, no product suite or live operation. Earlier uncommitted append-only PRD review session receipts are preserved in this docs commit. Ludwig reviews before Sage landing.
|
||||
|
||||
2026-10-22T16:12:26Z | Della ludwig-0035 / mos-1303 / Vikunja 460 focused corrections | Verified REQ-WAIT-2/3 at db1e7732a: Jason approval is required to route mail.access out of hard waits. Restored explicit Jason-approved PRD gate; no Q211 waiver inferred. Named tunable parser/attachment settings, defaults and schema/test review ownership of resource bounds; E04 checks changed values and bound refusals. Clarified Q8 extraction stays Jason choice. Docs-only checks, no product/live action; focused review before Sage handoff.
|
||||
|
||||
2026-10-22 13:06 UTC | Megavolt | Row 281 (#1786) build. Before: a fire or delete left host_grants/gitea_grants rows, the host line and the Gitea token live. After: step G in broker.mjs revokes them in a detached job per agent (the host line first, then Gitea local-first with an admin preflight); a refusal is grant.revoke.refused plus a human message; open grant decisions are in the set; a raise for a fired agent refuses instance-fired. Tests T1-T14 (bus fire-revokes-grants, lifecycle-revoke, grant-executor, gitea-grant; cli lifecycle). Gate on 7979fb41e: base 121/121 + 24/24, 29 anchors, M1 exit check rc1/17, M1-M22 22/22 killed, dewey-0840 files 76+14+23, bus 819, business 231, cli 837, ten shells rc 0 under the mos-1275 limits; skips: test-task row 244 live-provider pair, test-queue canonical-root check. Corrections: the first base run on c174f37ac went red on five first-run test defects (b3, test only); the first mutant run on 06ee5ed6b hung on M1 because T6c's held loop never ended (b4a fixed the teardown, and the runner now has timeout -k 10 180 and an exit check without --test-force-exit).
|
||||
|
||||
2026-10-22T16:36:30Z | Della row224 C2-05b #1725 preparation | Before: C2-05a queries exist at 4f3fbc25a but no broker lookup verbs or typed tools. Scope: broker/tools plus Sage-authorized runtime/bundle integration, tests and docs. Existing human-only library reads retained; five agent queries require a live holder and trusted configured source. Code/docs only under row253 gate; no Node/test/push/claim. Runtime ownership coordinated with Rocko219/Huey272.
|
||||
|
||||
2026-10-22T16:52:55Z | Rocko | Row219 prepared under sage2793/2807; explicit creative thread/default-session selection, narrow metadata route/picker U1–U5,22 static mutant sites; unrun while253 holds.
|
||||
|
||||
2026-10-22T17:42:16Z | Sage | Row 253 (#1758, Gander, Duckworth) LANDED 48e450ce8. Before: refactor at aca16404c; case-sudo calls had no supervised session check and the M21 survivor hid behind a fast-exit fixture (mos-1297). After: a fast-forward of 22 commits; manifest 591020a1 rechecked with 0 mismatches; run 5 whole gate green with M1-M40 killed, the M38 PID equals SID assertion added under mos-1298; Duckworth APPROVE rev 3252, note rev 3253, done rev 3254; #1758 comment 30701 and closed; P19 416 comment 719. N1 (fast child reported as exit 85) is DEFERRED as Vikunja 532.
|
||||
|
||||
2026-10-22T18:11:57Z | Sage | Row 275 (#1780, Morgana, Duckworth) LANDED 3410df7c3. Before: refactor at 48e450ce8; viewers had no verb list of their own and board reads were not refused to users. After: a fast-forward of 3 commits; manifest 39847b15 (4 paths) blobs match; gate 17:52:12Z-18:05:00Z green (whole files 7/22/6, bus 834, cli 861, harness 151, business 231, seat 167, 10 scripts with 3 named skips), M6 and M10 killed; Duckworth APPROVE rev 3260 (comment 30717); note and done by sage-2897; #1780 comment 30728 and closed. N1 (board refusal test as a loop over BOARD_VERBS) is non-blocking.
|
||||
@@ -22,7 +22,6 @@ RUN npm ci --ignore-scripts
|
||||
# runtime adapters.
|
||||
COPY contracts /opt/mosaic/contracts
|
||||
COPY src /opt/mosaic/src
|
||||
COPY packages/processing-control/src/state.mjs packages/processing-control/src/entrypoint.mjs /opt/mosaic/processing-control/
|
||||
COPY adapters /opt/mosaic/adapters
|
||||
RUN chmod 0555 /opt/mosaic/contracts /opt/mosaic/contracts/* \
|
||||
&& chmod 0555 /opt/mosaic/src /opt/mosaic/src/*.sh \
|
||||
|
||||
+1
-17
@@ -75,8 +75,7 @@ session's workspace and its own process group. Same contract, plus:
|
||||
| `MOSAIC_POLICY_FILE`, `MOSAIC_TOOLS_FILE` | The bundle's gate policy and typed tools. |
|
||||
| `MOSAIC_TOOL_SOCKET` | The runner's tool socket, which the typed tools call. |
|
||||
| `MOSAIC_TURN_MARKER` | `pi`: the extension writes it at `agent_end`; a pi turn that exits 0 without it failed. |
|
||||
| `MOSAIC_EXTENSIONS` | `pi` only: extension files loaded with `-e`; a missing one exits 2. The pi module names two: the gate and typed tools extension, then the unslop check's `tools/unslop-hook/extension.ts` (row 66). |
|
||||
| `MOSAIC_UNSLOP_LOG` | The unslop check's JSONL log, `<run>/unslop.jsonl`, which the runner sets for both adapters and reads after each turn (row 66). |
|
||||
| `MOSAIC_EXTENSIONS` | `pi` only: extension files loaded with `-e`; a missing one exits 2. |
|
||||
| `MOSAIC_CLAUDE_SETTINGS`, `MOSAIC_CLAUDE_MCP_CONFIG` | `claude` only: the bundle's gate hook and MCP server; required. |
|
||||
| `MOSAIC_THINKING` | The route's thinking level (row 65), which the harness module's `levels()` already checked. `pi` passes `--thinking` (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`) and omits it when unset, as for `run-task.sh` workers. `claude` passes `--effort` (`low`, `medium`, `high`, `xhigh`, `max`) and requires it; unset exits 2. |
|
||||
| `MOSAIC_CLAUDE_BIN` | `claude` only: absolute path of the CLI to run, from the host's environment (the bus unit pins it). Unset or empty runs `claude` from `PATH`; a relative path or a non-executable file exits 2. |
|
||||
@@ -111,18 +110,3 @@ argument, which Linux caps at 128 KiB; row 213 passes the file instead, so no
|
||||
local user reads the prompt in `/proc/<pid>/cmdline`. Pi 0.85.1 uses the path
|
||||
string itself as the prompt when the file is missing or can't be read, so the
|
||||
pi adapter exits 2 unless the path is a readable regular file.
|
||||
|
||||
### The unslop check (row 66)
|
||||
|
||||
Both adapters run the mechanical writing check from `tools/unslop-hook`,
|
||||
driven by one `lists.json`. `pi` loads it as its second `-e` extension.
|
||||
`claude` runs `claude-hook.js` from the bundle's `settings.json`: the Stop
|
||||
hook checks the turn's replies, and the UserPromptSubmit hook adds the
|
||||
correction notice as context on the next turn when the last reply had
|
||||
tells. Each hook command ends `; exit 0`, so neither blocks. Both log to
|
||||
`MOSAIC_UNSLOP_LOG`, and the runner adds a note for the operator to the
|
||||
next RESULT it sends (`packages/harness/README.md`, the runner). The
|
||||
harness modules mount the three files read-only at their own paths, and
|
||||
the manifest records their digests. `MOSAIC_UNSLOP_HOOK` and `UNSLOP_LISTS`
|
||||
aren't in the session environment's allowlist, so a managed session can't
|
||||
switch the check off or swap its lists.
|
||||
@@ -27,11 +27,6 @@ not fleet seats. Keep changes in `/mnt/storage/src/mosaic-stack`; do not modify
|
||||
| Gizmoduck | Federation design (#414) and builder of FED R1 | T3 session (Claude, Opus 5.5, thread 9312a896) | none, T3 only |
|
||||
| Webby | Reviewer: Case 2 designs, rows 192 and 194 | T3 session (Claude, Opus 5.5, thread 03086006), started by Mos (mos-0981) | none, T3 only |
|
||||
| Duckworth | Reviewer: federation designs, row 193 | T3 session (Claude, Opus 5.5, thread ffceafec), started by Mos (mos-0977) | none, T3 only |
|
||||
| Della | Builder, email plan (Vikunja 460) and row 224 (C2-05b) | T3 session (Codex, gpt-6.1-sol, thread 66735a7f), started by Mos | none, T3 only |
|
||||
| Scrooge | Builder of row 252 and reviewer of row 272 | T3 session (Claude, Opus 5.5, thread 629b6cd3), started by Mos | none, T3 only |
|
||||
| Huey | Builder, row 272 (T1 sessions) | T3 session (Codex, gpt-6.1-sol, thread cabd45ca), started by Mos | none, T3 only |
|
||||
| Louie | Builder and research, editor evaluation and row 174 | T3 session (Codex, gpt-6-luna, thread bfd13d49), started by Mos | none, T3 only |
|
||||
| Ludwig | Builder and reviewer, post-v1 email PRD and row 258 (E01) | T3 session (Claude, Opus 5.5, thread 8615b2a6), started by Mos | none, T3 only |
|
||||
| Sage | Project lead: coordination, review, integration; earlier DYOR strategy records retained | T3 session (Claude Code); Pi launcher `zai/glm-5.3:high` retained | `agents/sage/launch.sh` |
|
||||
|
||||
Each script supports `--check` and `--fresh`. Normal launches resume the agent's
|
||||
|
||||
@@ -1,191 +0,0 @@
|
||||
# Row 251 build: T27 lists no identities right after `ssh-add -t 1` (Vikunja #453)
|
||||
|
||||
Brief `docs/plans/2026-10-21_t27-ssh-add-lifetime.md` (rev 2931), Mos ruling mos-1185 item 2, assigned in
|
||||
sage-2075. Owner Darkwing, reviewer Dewey, gate owner Sage. Branch `darkwing/row251` from 3b0aef995,
|
||||
claimed in-progress at rev 2938.
|
||||
|
||||
## Step 1: the failure names its cause (e5e4b2e5a)
|
||||
|
||||
T27's two lists now carry a message that prints only when they fail. It gives the time from addKey's
|
||||
start to its resolve and to each `ssh-add -l` call, the hrtime at each with how far into its second it
|
||||
fell, `/proc/uptime` at each, and whether the agent process and its socket were still there. The checks
|
||||
themselves did not change. The commit holds nothing else.
|
||||
|
||||
## Step 2: the cause
|
||||
|
||||
ssh-agent counts a key's lifetime in whole seconds of CLOCK_BOOTTIME, at the add and at the reap. I read
|
||||
OpenSSH 10.5p1, the version on dragon-lin (`ssh -V`: OpenSSH_10.5p1), at tag V_10_5_P1 (ssh-agent.c
|
||||
sha256 873691c4, misc.c sha256 ee467f43):
|
||||
|
||||
- `misc.c:1790-1798` and `:1828`: `monotime()` returns `ts.tv_sec` of `clock_gettime(CLOCK_BOOTTIME)`,
|
||||
falling back to MONOTONIC. The fraction of the second is dropped.
|
||||
- `ssh-agent.c:1315`: the `-t` constraint sets `*deathp = monotime() + seconds`. Lines 1410 and 1598
|
||||
do the same for the agent's default lifetime.
|
||||
- `ssh-agent.c:1064`: the reaper drops a key when `now >= id->death`, `now` being `monotime()` again.
|
||||
- `ssh-agent.c:2650`: the main loop runs `reaper()` after every poll, before it reads requests. A list
|
||||
that arrives after the boundary sees the key gone.
|
||||
|
||||
So a key added at second s plus a fraction f dies at s + N, and `-t N` keeps it N - f seconds, between
|
||||
N - 1 and N. With `-t 1`, an add late in a second leaves the key milliseconds to live. That matches
|
||||
Sage's probe in the brief: 8 of 80 `-t 1` adds missed, each one made at 0.9947-0.9973 of a monotonic
|
||||
second and finished at 0.998-0.0008, and none earlier in the second missed. It also matches proof 5's
|
||||
failure, where the first list ran 31.9 ms into the test and found no identities.
|
||||
|
||||
Node's hrtime is CLOCK_MONOTONIC. BOOTTIME differs from it by the time the host spent suspended. On
|
||||
dragon-lin the difference read 0.000001 s at 19:09Z, so a monotonic second boundary is a BOOTTIME one
|
||||
here.
|
||||
|
||||
`addKey` and the agent start are not the cause. `addKey` passes the lifetime through as `-t`
|
||||
(`host-run.mjs:90`), and the agent starts with no default lifetime (`:175`). Production adds the key
|
||||
with `timeout + 30` (`:180`), where losing up to a second makes no difference. The only caller that
|
||||
can't afford the lost fraction is T27, which asks for 1 s. The fix belongs in the test's lifetime choice,
|
||||
and `host-run.mjs` doesn't change.
|
||||
|
||||
The slot confirms this against T27 itself (below), not just from the source.
|
||||
|
||||
## Step 3: the fix (this commit)
|
||||
|
||||
T27 adds the key with `-t 2`. The agent then keeps it more than 1 s and at most 2 s. The first list
|
||||
runs milliseconds after the add, so it has over a second of margin even under load. The sleep before
|
||||
the second list grows from 2.5 s to 3.5 s, which keeps the old 1.5 s margin past the new 2 s ceiling.
|
||||
Both checks stay: listed after the add, gone after the lifetime. A comment above the add says why the
|
||||
lifetime is 2.
|
||||
|
||||
I considered `-t 3` with a 4.5 s sleep for a 2 s floor. One second of floor is far above anything the
|
||||
first list has needed (31.9 ms in proof 5), and the concurrent-suite run below tests it under load, so I
|
||||
took the smaller change.
|
||||
|
||||
## Base
|
||||
|
||||
The branch stays on 3b0aef995. By 19:15Z origin/refactor was at 6096b051b, after rows 66 and 243
|
||||
landed. `git diff 3b0aef995 6096b051b` touches neither `packages/bus/src/host-run.mjs` nor
|
||||
`packages/bus/tests/host-run.test.mjs`, so there's no rebase (sage-2084). Row 243 did change
|
||||
`packages/bus/tests/process.test.mjs`. My slot's bus suites run that file as it was at 3b0aef995, and the
|
||||
gate rerun on Sage's slot runs it as landed.
|
||||
|
||||
## Prediction for part A on e5e4b2e5a (written before the slot)
|
||||
|
||||
The hook starts `ssh-add -t 1` at the given fraction of a monotonic second. From the brief's probe, the
|
||||
agent stores the key about 3 ms later. The first list reaches the agent a few ms after addKey resolves:
|
||||
Node's exit event, the mark, and `ssh-add -l`'s own start. A red needs the add to land before the second
|
||||
boundary and the list to land after it.
|
||||
|
||||
- 0.990: green. The add and the list both land before the boundary.
|
||||
- 0.993, 0.995, 0.996, 0.997: red expected. The add lands before the boundary, the list after. At 0.993
|
||||
and 0.997 I'm less sure, because the list (at 0.993) or the add (at 0.997) can land right at the
|
||||
boundary. A green at either is in line with the cause, and so is a red.
|
||||
- 0.998: green. The add lands after the boundary, so the key gets almost a full second.
|
||||
|
||||
Every red should show "first list got" an answer with no SHA256 line. It should also show addKey
|
||||
resolving before a second boundary and the first list starting after it or within a few ms of it, with
|
||||
the agent alive and its socket present.
|
||||
|
||||
Under sage-2084's rule, on e5e4b2e5a only a red at 0.990 or 0.998 counts toward the stop, and two such
|
||||
reds stop the run. On the fix commit any red counts, and two stop it. In parts B to D, the first red stops
|
||||
the run.
|
||||
|
||||
## Slot plan
|
||||
|
||||
All scripts are in `/mnt/storage/scratch/darkwing-251-out/`, launched from `/`, each behind the busy
|
||||
checks and chained with `&&`, TMPDIR under `/mnt/storage/scratch/tmp`.
|
||||
|
||||
1. Confirmation. `align-hooks.mjs` is a load hook, outside the repo, that serves `host-run.mjs` with
|
||||
`addKey` wrapped to start `ssh-add` at a chosen fraction of a monotonic second. T27 runs unchanged
|
||||
under it, alone (`--test-name-pattern`). It runs at fractions 0.990, 0.993, 0.995, 0.996, 0.997 and
|
||||
0.998, three times each:
|
||||
- on e5e4b2e5a (step 1, `-t 1`). Expected: some first lists fail, and the step 1 message shows the
|
||||
add's resolve and the list on either side of a second boundary, with the agent alive and the
|
||||
socket present. These reds are the point of the run.
|
||||
- on the fix commit (`-t 2`). Expected: all 18 pass.
|
||||
2. `host-run.test.mjs` whole, once, on the fix commit.
|
||||
3. The bus suite whole, three times in a row.
|
||||
4. The bus suite whole in two clean worktrees at the same commit, started together.
|
||||
|
||||
## Slot results
|
||||
|
||||
Sage's CLEAR came in sage-2154 at 20:58:55Z. `slot-251.sh` ran parts A and B from 20:59:22Z to 21:01:33Z,
|
||||
on node v26.8.1 and OpenSSH_10.5p1, with TMPDIR `/mnt/storage/scratch/tmp/r251`. At the start, BOOTTIME
|
||||
minus MONOTONIC read 0.000001 s, then 0.000000 s twice (dewey-0769 N1). So the hrtime fractions below
|
||||
put the agent's second boundary in the right place.
|
||||
|
||||
### Part A: T27 alone under `align-hooks.mjs`, 3 runs per fraction
|
||||
|
||||
The fraction is when the hook started `ssh-add`. The hook logged each start within 0.0001 of its target.
|
||||
|
||||
| fraction | e5e4b2e5a (`-t 1`) | 68f2dfd4b (`-t 2`) |
|
||||
|---|---|---|
|
||||
| 0.990 | 3 pass | 3 pass |
|
||||
| 0.993 | 3 pass | 3 pass |
|
||||
| 0.995 | 3 red | 3 pass |
|
||||
| 0.996 | 3 red | 3 pass |
|
||||
| 0.997 | 3 pass | 3 pass |
|
||||
| 0.998 | 3 pass | 3 pass |
|
||||
|
||||
e5e4b2e5a went red 6 times out of 18, every time at a fraction the prediction named, so none of them
|
||||
counted toward the stop. 68f2dfd4b passed all 18. The fix runs used 68f2dfd4b, whose test blob is the same
|
||||
as c19b4167e's (280132c7).
|
||||
|
||||
Every red failed on the first list and got `"The agent has no identities.\n"`, with the agent alive and
|
||||
its socket present. The step 1 message gave these hrtime fractions. "addKey start" is the mark before the
|
||||
hook's wait, so its fraction is earlier than the ssh-add start.
|
||||
|
||||
| run | addKey resolved | first list mark |
|
||||
|---|---|---|
|
||||
| 0.995 rep 1 | 0.9992 (+317.6 ms) | 0.9993 |
|
||||
| 0.995 rep 2 | 0.9991 (+846.5 ms) | 0.9991 |
|
||||
| 0.995 rep 3 | 0.9988 (+845.0 ms) | 0.9988 |
|
||||
| 0.996 rep 1 | 0.9999 (+839.8 ms) | 1.0000 |
|
||||
| 0.996 rep 2 | 0.0004 (+845.0 ms) | 0.0004 |
|
||||
| 0.996 rep 3 | 0.0002 (+835.9 ms) | 0.0002 |
|
||||
|
||||
At 0.995 the add finished about 4 ms in, before the boundary, and the list mark came just before it. The
|
||||
`ssh-add -l` process then reached the agent after the boundary. At 0.996 the agent stored the key before
|
||||
the boundary, and addKey resolved just after it. In both cases the key's whole second ended between the
|
||||
add and the list, which is the cause step 2 gives. The two edge fractions came out green on the first
|
||||
build. At 0.993 the list still reached the agent before the boundary, and at 0.997 the add landed after
|
||||
it, so the key got almost a full second. The prediction allowed either result at those two.
|
||||
|
||||
### Part B: `host-run.test.mjs` whole on 68f2dfd4b
|
||||
|
||||
24 tests, 24 passed (21:01:18Z, 14.0 s).
|
||||
|
||||
### The stop before C1, and the resume
|
||||
|
||||
At 21:01:33Z the script stopped before C1, with exit 4 and no red. My own `busy.sh` matched two `sleep 60`
|
||||
processes, mine, in `darkwing-r251/packages/bus`. Part B left them. They come from T27 "the start sweep
|
||||
keeps a live bus dir and kills only a matching live process" (`host-run.test.mjs:528` and `:536`). Its
|
||||
`t.after` SIGKILLs the `/bin/sh -c 'sleep 60; :'` parent, but the `sleep` child lives on for up to 60 s.
|
||||
That code is outside this row's diff, so the row leaves it alone, and it's recorded below as a follow-up.
|
||||
Sage confirmed (sage-2159) that the right move is to resume only the scope that hadn't run.
|
||||
|
||||
`slot-251-cd.sh` runs C and D as `slot-251.sh` has them, with the same two busy checks. Before each check,
|
||||
it waits up to 75 s for those orphans to exit: my uid, my trees, a command line of exactly `sleep 60`.
|
||||
It logs them as it waits. Any other process still trips the checks.
|
||||
|
||||
### Parts C and D: the bus suite whole on 68f2dfd4b
|
||||
|
||||
| run | start | tests | pass | fail | time |
|
||||
|---|---|---|---|---|---|
|
||||
| C1 | 21:02:48Z | 598 | 598 | 0 | 21.6 s |
|
||||
| C2 | 21:04:06Z | 598 | 598 | 0 | 21.4 s |
|
||||
| C3 | 21:05:26Z | 598 | 598 | 0 | 22.1 s |
|
||||
| D1, darkwing-r251 | 21:06:44Z | 598 | 598 | 0 | 24.2 s |
|
||||
| D2, darkwing-r251b, TMPDIR `r251-b` | 21:06:44Z | 598 | 598 | 0 | 24.2 s |
|
||||
|
||||
The script waited 33 s before C2, 34 s before C3, 33 s before D and 32 s before the sweep. Each time it
|
||||
was waiting for that run's `sleep 60` orphans (two per suite, four after D), and nothing else. After the
|
||||
wait, the sweep of my trees, the out dir and TMPDIR found 0 processes left (21:08:04Z). Sage confirmed
|
||||
(sage-2159, sage-2160) that the short gitea-api and `node --check` runs they made during the slot weren't
|
||||
stops. None of my busy checks refused on any of them.
|
||||
|
||||
These runs used the bus files as they were at 3b0aef995. Since then, origin/refactor (666173292, then
|
||||
7247d80c7 and c3d88840c with row 196) has changed `broker.mjs`, `runtime.mjs` and `server.mjs`, which T27's
|
||||
file imports, along with other bus files. None of those commits touch this row's two paths or
|
||||
`host-run.mjs`, and `git merge-tree` of c3d88840c with 68f2dfd4b is clean. The gate rerun in
|
||||
a clean worktree on Sage's slot runs T27 against them.
|
||||
|
||||
### Follow-up, not in this row
|
||||
|
||||
T27's start-sweep test leaves the `sleep 60` child of each planted shell running for up to 60 s after
|
||||
the test. Killing the process group (`process.kill(-pid)`; both shells are spawned `detached`) or
|
||||
`exec sleep 60` in the shell would end the child along with its parent.
|
||||
@@ -1,113 +0,0 @@
|
||||
# Row 273 (#1778): activate --send and --no-sso
|
||||
|
||||
Darkwing, 2026-10-22. Brief: `docs/plans/2026-10-22_activate-send-nosso.md` (blob in f0d0b31e9), approved by
|
||||
Mos in mos-1246 (F39). Base: origin/refactor 0042f713d. Reviewer: Filbert. Gate owner: Sage.
|
||||
|
||||
## What changed
|
||||
|
||||
Only `scripts/stack-release.sh` and its two node test files.
|
||||
|
||||
- `activate --send` puts `--send` into the run's Console flags after `--sso` and before the tester
|
||||
flags, where webui-service.sh renders it. It refuses `send-needs-sso` unless those flags hold `--sso`,
|
||||
given or carried. The plan line is `send: on; --send was given`, or `send: carried` when the pointer
|
||||
already holds it. `check_target` lets it name the pointer's copy only when the pointer holds no `--send`,
|
||||
so a second `--send` on the same copy refuses `already-active`.
|
||||
- `activate --no-sso` refuses `sso-not-on` when the pointer holds no `--sso`. Otherwise it takes the
|
||||
Console flags from a rollback set (below) and keeps the pointer's tester flags. `send_for_target`
|
||||
drops `--send`, whether it came from the set or the pointer. It is the only place that does, so one
|
||||
mutant there (M3) shows the drop is tested. The plan prints `sso: off; Console flags from <set>/<file>; restores <flags>`
|
||||
and a send line, `send: dropped; --no-sso drops --send (F39)` or `send: off; --no-sso was given and the
|
||||
pointer holds no --send`. The steps log gets `drop --send; --no-sso was given` and
|
||||
`turn off --sso; the Console flags come from <set>/<file>`.
|
||||
- Usage errors: `--send` with `--no-send`; `--no-sso` with `--sso`, `--send`, a proof pair or
|
||||
`--no-proof`; either flag on any verb but activate; either flag under `--units external`.
|
||||
`--no-sso --no-send` is allowed, since the brief doesn't forbid it and both drop the same flag.
|
||||
- The set read that `sso_base` did inline for a rollback to a Console without `--sso` moved into
|
||||
`set_flags`, which both paths call. Its three messages are unchanged, and T57 still pins them.
|
||||
- `from_log` has a new mode, `sets`: the activation of each ok activate and rollback line, newest first,
|
||||
stopping at the adopt line, which took no rollback set.
|
||||
|
||||
## The consequential choice: which set --no-sso reads
|
||||
|
||||
The brief says the flags come from "the rollback set of the activation that turned `--sso` on", and that
|
||||
"a set whose Console already ran with `--sso`" refuses. Each set holds the Console unit from before its
|
||||
run. So the activation that turned `--sso` on is the newest one whose set holds a Console without
|
||||
`--sso`: every activation after it ran with `--sso`, and so did every set it left.
|
||||
|
||||
`no_sso_base` walks the log's sets newest first and stops at the first set whose Console has no `--sso`.
|
||||
It refuses `sso-off-flags` at the first set it can't read (missing, failing its SHA256SUMS, or with no
|
||||
argv the script can parse), since it can't tell whether that set was the one. If every set ran with
|
||||
`--sso`, it refuses with `the Console in <set>/<file> already ran with --sso, and the log names no
|
||||
earlier activation`. A log with no set at all refuses with `the log names no activation with a rollback
|
||||
set`.
|
||||
|
||||
The tradeoff: a later same-copy re-pin that carried `--sso` (a `--no-send`, or a re-pin onto a newer
|
||||
copy) doesn't break `--no-sso`, which the phase 2 window needs if a re-pin lands between step 5 and a
|
||||
rollback. The cost is that "a set that ran with `--sso` refuses" now applies only when no older set
|
||||
without `--sso` exists. A tampered set on the walk still refuses, even one newer than the set the walk
|
||||
would have used. Filbert, please rule on this reading.
|
||||
|
||||
## Filbert's early look: B1 and N1 (sage-2315)
|
||||
|
||||
Filbert accepted the walk. Sage ruled both findings into this row.
|
||||
|
||||
- B1: row 200's rollback to a copy whose Console has no `--sso` took the flags from the set and kept
|
||||
the pointer's `--send`. From an `--sso --send` pointer, which this row's `--send` can now make, that
|
||||
gave a Console with `--send` and no `--sso`, which F39 b forbids. `send_for_target` now drops `--send`
|
||||
whenever the run drops the pointer's `--sso`, so it is still the one place that drops it. The plan
|
||||
line reads `send: dropped; the run drops --sso, and --send needs it (F39)`, and the steps log gets
|
||||
`drop --send; the run drops --sso`. Row 200's sso line now names only the tester as following the
|
||||
pointer.
|
||||
- Changed existing assertion, for the review to approve by name: T57 item 3 (sage-1389), "the
|
||||
plain case", ends with `assert.deepEqual(pointer(g).console,[...noSend(gbase),...pair(f)])`. It
|
||||
used to expect `'--send'` at the end. The case seeds a legacy `--send` pointer, turns `--sso` on
|
||||
(which carries `--send`), then rolls back to B, whose Console has no `--sso`. A carried `--send`
|
||||
that ends without `--sso` breaks F39 b whatever its source, so the old pin asserted the wrong
|
||||
outcome (Sage accepted this in sage-2321). Row 200's two sso plan strings also lose "--send and"
|
||||
(`ROLLBACK_PLAN` and the round 3 named-instance case), since `--send` no longer follows the pointer
|
||||
on that path.
|
||||
- N1: the walk skipped an ok line with no activation. Skipping it could land on an older set that
|
||||
isn't the right one, so it now refuses `sso-off-flags` with `an ok line in the log names no
|
||||
activation`. The walk reads the log through `mapfile`. That gives no entry for an empty log, so a
|
||||
log with no set still gets its own message.
|
||||
|
||||
## test-release.sh
|
||||
|
||||
The window plan says test-release.sh "gets cases for both". The brief lists it only as a file to run
|
||||
whole. test-release.sh is release.sh's Docker selftest and doesn't call stack-release.sh, so the cases
|
||||
live in the node tests and test-release.sh runs unchanged.
|
||||
|
||||
## Tests (T58 in stack-release.test.mjs)
|
||||
|
||||
- T1: `--sso --send` from B onto C1 with a tester port: plan, pointer, unit and steps. `--send` beside a
|
||||
carried `--sso` re-pins C1 once; a second `--send` refuses `already-active`; C carries it.
|
||||
- T2: `--send` without `--sso` refuses on another copy and on the pointer's copy, also when the pointer
|
||||
carries `--send` alone; `--plan` lists the refusal.
|
||||
- T2 (sage-2315 B1): `--sso --send` onto C1, then a rollback to B, whose Console has no `--sso`. The
|
||||
pointer and the unit end with neither flag, and the plan and steps name the drop.
|
||||
- T2 and T4 usage: every forbidden pairing and verb, checked against the full usage text.
|
||||
- T3: from an `--sso --send` pointer, `--no-sso` on the same copy gives back the pre-`--sso` ExecStart
|
||||
line byte for byte, without `--send`. A second case walks past a `--no-send` re-pin that ran with
|
||||
`--sso` and keeps the pointer's tester port (7334), which differs from the set's (7333). A third
|
||||
(sage-2305 a) turns `--sso` on, then re-pins twice with `--send` and `--no-send`, so the two newest
|
||||
sets both hold `--sso`. `--no-sso` then gives back the arrival's ExecStart line byte for byte.
|
||||
- T4 (sage-2305 b): two sets, both edited or written to hold `--sso` with sums intact, refuse
|
||||
`sso-off-flags` through `refused()`.
|
||||
- T4: `sso-not-on`; an ok line with no activation; a set that fails its sums, ran with `--sso`, has no
|
||||
argv or is missing; a log with no set. Each runs through `refused()`, so nothing stops and nothing else changes.
|
||||
- T5: stack-release-external.test.mjs adds `--send` and `--no-sso` to the row 232 usage list.
|
||||
- T55 test 5 and the T57 usage test match the new usage line.
|
||||
|
||||
## Mutants
|
||||
|
||||
| # | Change | Expected killer |
|
||||
|---|---|---|
|
||||
| M1 | `set_flags` skips the SHA256SUMS comparison when `--no-sso` is given | T4 tampered set |
|
||||
| M2 | `no_sso_base` skips the `sso-not-on` refusal | T4 `sso-not-on` |
|
||||
| M3 | the `--no-sso` branch of `send_for_target` keeps `--send` | T3 |
|
||||
| M4 | `--send` skips the `send-needs-sso` refusal | T2 |
|
||||
| M5 | parse_opts drops the `--send`/`--no-send` rule | T2 and T4 usage |
|
||||
| M6 | a rollback to a Console without `--sso` keeps `--send` (B1) | T2 (sage-2315 B1) |
|
||||
| M7 | the walk skips an ok line with no activation (N1) | T4 no-activation line |
|
||||
|
||||
Runs and results go in the round's notes once Sage clears the slot.
|
||||
@@ -1,8 +0,0 @@
|
||||
# Della
|
||||
|
||||
Builder seat, Codex gpt-6.1-sol, started by Mos for the email plan (Vikunja 460). Owns row 224 (C2-05b) under Q220.
|
||||
|
||||
No launcher in this directory. The seat runs as a T3 thread (thread 66735a7f) and works in its own worktree. It has no
|
||||
credentials of its own; it pushes only its own `della/*` branches through the repository credential helper (mos-0981),
|
||||
never `refactor`, `main` or another seat's branch. Registered by Sage on 2026-10-22 so the queue can name the seat as
|
||||
row owner under Q220 (mos-1301).
|
||||
@@ -0,0 +1,107 @@
|
||||
# Row 196 build evidence
|
||||
|
||||
Base 4d26003f7. Build authorized sage-1371, design approved duckworth-0009/0015.
|
||||
No live units, live ports, credentials, real second uid or live state touched.
|
||||
Single test files only so far. Suites and mutant batches require Sage's slot.
|
||||
|
||||
## Cleanup ruling, sage-1382 (2026-10-20T19:39:30Z)
|
||||
|
||||
The first scratch test proved Node/libuv unlinks a final-path replacement before
|
||||
JavaScript close callbacks. Evidence: evidence/tester-cleanup-blocker.txt.
|
||||
Duckworth's option 1 (523a6bddf) was then verified in a standalone scratch test:
|
||||
bind temporary.sock, record dev/ino, rename to tester.sock, connect successfully,
|
||||
replace final inode, close. Temporary name absent and replacement survived.
|
||||
|
||||
Sage chose option 1. The code binds a unique temporary name in the checked 0700
|
||||
parent, chmods/verifies the socket, records its dev/ino and renames to tester.sock.
|
||||
The temporary basename has the same length as tester.sock. libuv remembers the
|
||||
removed temporary name. The close callback lstat/checks the final dev/ino before
|
||||
unlink. The final-path replacement test was RED with direct bind and GREEN after
|
||||
rename. It also asserts no temporary entry after bind or close. M24 will bind the
|
||||
final path directly and must fail this test.
|
||||
|
||||
Residual: a hostile same-uid process can replace a path between lstat and unlink
|
||||
(or between the final-path check and rename), or recreate the temporary name
|
||||
before libuv closes it. The checked private parent excludes other uids, not the
|
||||
instance's own uid. These same-uid races are outside this row's guarantees.
|
||||
|
||||
## Development checks
|
||||
|
||||
Evidence files retain the red/green and diagnostic output. The initial concurrent
|
||||
peer test exposed that Node pauses a Socket passed through spawn stdio. The caller
|
||||
now resumes it after helper exit, with bidirectional post-helper traffic asserted.
|
||||
No product commits until applicable suites pass. Final candidate and counts follow
|
||||
after implementation and authorized verification.
|
||||
|
||||
## Gate stop, 2026-10-20T19:57:01Z
|
||||
|
||||
Gate run 1 stopped at bus 463 pass/1 failure. The row164 reviewed byte pins needed
|
||||
the intentional row196 human-walk/nonce and Console initial-spawn nonce changes.
|
||||
Only those two pins were updated, retaining human-cli and CLI transport pins,
|
||||
literal path recovery and channel plug-in import bans. Focused test passed.
|
||||
|
||||
Run 2: bus 464 pass/0 fail. WebUI stopped at two failures in tester-browser.test.mjs:
|
||||
it still formed TCP URLs from the now-Unix listener address. Script counted 269
|
||||
passing top-level cases before interruption and 2 failures. No final WebUI summary.
|
||||
CLI and mutants did not run. Node24 peer 3/3 and principal 4/4 passed separately.
|
||||
Sage received clear (gander-0023). The failures are fixture migration omissions,
|
||||
not timing failures from Launchpad's overlapping single T56 run. No product commit.
|
||||
|
||||
Focused repairs: the browser fixture fulfills synthetic-origin requests through
|
||||
CDP from the scratch Unix listener, with no TCP listener, proxy or product relay.
|
||||
The two tester browser tests pass. Self-review also found a FIFO receipt could
|
||||
block open before fstat; O_NONBLOCK now makes it refuse promptly (RED timeout,
|
||||
then interpreter 5/5 GREEN). Missing/non-regular helper now refuses construction
|
||||
before opening broker.sock (RED missing refusal, then peer reader 4/4 GREEN).
|
||||
Renewed slot requested in gander-0024; no suite or mutant rerun yet.
|
||||
|
||||
## Manifest preparation while the slot is occupied
|
||||
|
||||
sage-1409 accepts the CDP fixture repair and startup refusals. MANIFEST.md gives
|
||||
each its own item, including the old/new human.mjs and WebUI bus.mjs sha256 values
|
||||
and rationale for the row164 re-pin. PRODUCT-FILES.json records current product,
|
||||
test and operator-document hashes, explicitly as an uncommitted draft.
|
||||
|
||||
Self-review also found helper shutdown returned before child close. The focused
|
||||
test was RED (evidence/peer-shutdown-red.txt), then GREEN after reader.close awaits
|
||||
all killed helper close events and server.close awaits reader.close. M27 removes
|
||||
the wait. M25 removes FIFO nonblocking open and M26 removes helper preflight.
|
||||
All three are prepared but unexecuted, reported to Sage in gander-0025.
|
||||
|
||||
After this change, individual Node 24 files pass: peercred 5/5 and principal 4/4.
|
||||
Node 26 peer-transport is 3/3. Their logs retain the full results. No suite or
|
||||
mutant batch ran during the hold. sage-1416 puts Gander after Launchpad, Darkwing,
|
||||
Rocko and row 192; Sage must send go before the renewed batch starts.
|
||||
|
||||
The consumer audit found one additional conversion defect in the files already
|
||||
changed: proof insertion stopped at --tester-port but not --tester-socket.
|
||||
Pointer argv therefore differed from rendered unit argv when conversion also
|
||||
supplied a proof pair. The extended row196 release case reproduced the exact
|
||||
order mismatch, then passed after adding the socket flag to that insertion
|
||||
boundary. The proof-file no-read check still passes. M28 restores the defect.
|
||||
No batch ran. Shell syntax and diff whitespace checks pass. Final prepared
|
||||
mutant count is 28, pending Sage's go.
|
||||
|
||||
## Static review completion, sage-1425
|
||||
|
||||
The changed verifier path now has a real Client refusal test. A completed proof
|
||||
refusal reaches the client as human-required; helper failure is peercred-required.
|
||||
No broker request dispatches. peer-transport is 4/4. Client code is unchanged:
|
||||
an abrupt close, timeout or transport error without a response is outcome-unknown.
|
||||
The scratch base/candidate comparison returns human-required for both. It does
|
||||
not reproduce Quackerjack's exact failing instance; the manifest names this limit.
|
||||
|
||||
Review also found release did not check tester path length until after service
|
||||
stop. The focused long-path activation fixture reproduced it, then passed with
|
||||
the new preflight. Existing unsafe parent type/uid/mode checks also precede stop;
|
||||
the fixture verifies no start/stop calls for unsafe mode. M29 removes the check.
|
||||
Legacy tester-port-invalid wording is restored to avoid an unrelated contract
|
||||
change. Review covered all changed trust paths and consumers; no further code
|
||||
changes are planned before the batch. M1-M29 remain prepared and unexecuted.
|
||||
|
||||
2026-10-21 sage-2063: driver uses only node --check for syntax validity; runtime test failures count as kills, and the r2 driver records GNU timeout process-group TERM/KILL exits so blocked descendants cannot survive. No rerun before next clear.
|
||||
|
||||
2026-10-21 r2 stop 2: base killer invocations 14/0 under 30 seconds each; M23-M27 killed, M28 survived due rebase making its generic mutation target the earlier SSO insertion. No M29 or golden suite run. Every restored hash and Git status clean; leftover process sweep count 0. Slot returned to Sage in gander-0035. Full per-step counts, base/mutant times and kill table in r2/run2/. Awaiting ruling before any fix or rerun; third stop goes to Mos.
|
||||
|
||||
2026-10-21 sage-2072 product test: added the merge-scoped SSO/socket conversion case without --send, asserting pointer argv order, rendered unit argv order, status agreement and no secret-file reads. Removing socket from sso_for_target is its planned RED case (M28b). Focused RED/GREEN remains pending the busy gate: Herb's suite was active at the preflight, so no test started. Runtime code unchanged. Mos mos-1197 owner-subject ruling recorded in queue-252/BUILD-NOTES.md.
|
||||
2026-10-21 sage-2072/2077 driver: unique string-target guard preflights every definition before any tests and before creating scratch state; M28 names without_proof, M28b names kept, M5 names the parse catch, M25 names append flags, M29 uses the unique full line. Static audit accepts all 30 definitions; zero/duplicate targets refuse. Against 64539c96b, M5 old/narrowed bytes match; M25 differs and joins the next batch. No mutation tests ran in this static check.
|
||||
@@ -0,0 +1,332 @@
|
||||
# Row 196: the human boundary across uids and humans
|
||||
|
||||
Gander, 2026-10-20. Revision 3, recording approved r2 and N5. Gitea #1694, P19 333.
|
||||
Base: `96f243faf`, branch `gander/row196`. Design approval latest-by 2026-10-22, landing
|
||||
latest-by 2026-10-24 and before federation R3. This document authorizes no live action.
|
||||
|
||||
## 1. Outcome and authority
|
||||
|
||||
Other Linux users must not reach the tester's data or writes. A bus human proof must describe
|
||||
the process that actually connected. Console user calls must also pass the human walk and
|
||||
come directly from this bus tree's Console. Row 193 and federation R3 use that one verifier.
|
||||
|
||||
This is not isolation from a hostile process on the instance's own uid. Keeping the human
|
||||
terminal CLI means that an unmarked process on that uid still has the owner's authority.
|
||||
Process ancestry cannot prove that a process was never an agent. Sections 4 and 8 state this
|
||||
limit without treating it as an enforcement guarantee.
|
||||
|
||||
Inputs: COMMON at `53bb59462`, the row brief at `96f243faf`, Q175 sections 1, 6 and 8,
|
||||
federation r2 at `60b9b112a` section 3.6, Duckworth's B1-B5 at `b402197ff`, row 190's
|
||||
DESIGN.md and the row 190b brief. Q175-Q178 and the MVP plan set the order. Row 190b is on
|
||||
hold pending the host decision. This row does not assume that a separate uid is already live.
|
||||
|
||||
Sage's `sage-1343` accepts the design direction and requires Duckworth to rule on the peer
|
||||
credential implementation. `sage-1345` keeps the control board inventory-only. Morgana's
|
||||
`morgana-0003` supplies the principal contract in section 4. Sage registers this session.
|
||||
Mos accepted removal of direct tester browser access in mos-1015, relayed by sage-1363.
|
||||
Agents test through the private socket. Any later browser view is an authenticated relay
|
||||
behind SSO, designed and reviewed in its own row. This row adds no relay.
|
||||
|
||||
## 2. Inventory from code, not a live probe
|
||||
|
||||
"Same uid" includes untrusted local processes. "Other uid" excludes root, which is outside
|
||||
this boundary. SSO below means Q175 is active on that instance, not merely installed.
|
||||
|
||||
| Entry | Same uid today | Other uid today | Effect of SSO and this row |
|
||||
|---|---|---|---|
|
||||
| Main Console, default 7332, bare serve default 7330 | Loopback reads. With preview/send, matching Host, header and origin can write as owner | Same TCP reach and header forgery | Q175 SSO verifies login and refuses non-public Host except GET /healthz. This row does not change public ingress |
|
||||
| Tester TCP, default installation 7333, optional per instance | Reads and the tester instance, route, name and chat writes | Identical reach, no uid check | Q175 deliberately leaves tester separate. This row replaces TCP with a private filesystem Unix socket |
|
||||
| `<dataRoot>/bus/broker.sock` | Connects, then needs cap or proof. Claimed human PID is not the socket peer | Normally refused by bus/ 0700 and socket 0600 | SSO changes nothing. Add peer uid and PID binding, retain file checks |
|
||||
| Human wrapper to tree's human-cli.mjs | Owner if CLI path, nonce and ancestry pass. Agent ancestors refuse | Cannot connect to protected socket, and proof uid refuses | Preserve terminal owner path, add peer binding. SSO does not authenticate terminal users |
|
||||
| Tester CLI to broker.sock | Tester if its proof passes and bus.tester is exactly true. T3 agents are allowed, managed runs are not | Filesystem modes normally refuse | Same tester policy, plus peer binding. No owner/user upgrade |
|
||||
| `<dataRoot>/bus-host/launch.sock` | Requires run cap and launcher checks | bus-host/ 0700, socket 0600 | No human proof endpoint. Unchanged |
|
||||
| `<dataRoot>/bus-host/git.sock` | Git capability protocol and broker authorization | bus-host/ 0700, socket 0600 | No human proof endpoint. Unchanged |
|
||||
| Discord connector | Outbound Discord gateway/REST, no inbound local listener. Local process could tamper with same-uid files/process | No local port to call. File separation depends on uid and modes | Existing guild, user, channel, bot and webhook checks remain. Discord is not a new bus human transport |
|
||||
| Row 190 additions | Separate configs, roots, unit names, wrappers and Console ports, on one uid | Console/tester TCP still reachable | Adds no new class of listener. Row 196 derives its socket per dataRoot. Row 190 alone supplies no hostile-process isolation |
|
||||
| Control board, default 7331 | Unauthenticated transcript/board reads, POST /api/reply and /api/seen after request checks | Same loopback reach. A local client can supply matching request headers | Independent development service, outside instance SSO. Inventory only per sage-1345. Its fix needs another row |
|
||||
|
||||
Evidence: `packages/webui/src/{cli,serve,bus}.mjs`, `packages/bus/src/{server,runtime,human,
|
||||
tester,store}.mjs`, `packages/cli/src/{launcher,git-socket,transport}.mjs`,
|
||||
`packages/discord/src/{gateway,authorize}.mjs`, `packages/control-board/src/serve.mjs`.
|
||||
Store checks bus/ with `safe(directory,true)`, including owner, symlink and mode checks.
|
||||
The dataRoot check itself does not require 0700 today. Do not describe that as a checked mode.
|
||||
|
||||
## 3. D1: private tester HTTP socket
|
||||
|
||||
Add `serve --tester-socket`, a boolean selecting `<dataRoot>/console/tester.sock`. No arbitrary
|
||||
path or new system config field. Create console/ as 0700. Refuse a symlink, wrong owner,
|
||||
non-directory or any group/other bits on an existing console/. Refuse a pre-existing socket
|
||||
or other entry rather than deleting it blindly. A stale socket needs an operator's diagnosis.
|
||||
Refuse a path longer than Linux's 107-byte pathname capacity before binding.
|
||||
|
||||
Bind HTTP on the Unix path, set socket mode 0600, then verify type, owner and mode before
|
||||
declaring ready. The private parent covers the bind-to-chmod interval. Cleanup only the owned
|
||||
device/inode, as broker.sock does. Never open a TCP compatibility bridge or an abstract socket.
|
||||
Readiness failure closes the main listener too, rather than leaving a partially started Console.
|
||||
|
||||
The tester handler keeps its fixed principal, header/cookie refusals and exact write list.
|
||||
Use a fixed logical origin `http://mosaic-tester.invalid` for URL and same-origin checks. It
|
||||
does not resolve that name. Clients send that Host and Origin plus the existing Fetch Metadata
|
||||
when required. A Host string is not authentication. Unix socket access supplies that boundary.
|
||||
The main listener still refuses x-mosaic-tester. No tester /auth route exists.
|
||||
|
||||
`bus.tester` remains Jason's switch. Socket reach never enables tester authority by itself.
|
||||
Turning it off must refuse every tester bus call. This row adds no user or owner capability
|
||||
to the tester. Tester reads retain today's scope, including any local Console reads that are
|
||||
not bus calls. This row does not turn bus.tester into a separate HTTP read switch.
|
||||
|
||||
### Consumers and migration paths
|
||||
|
||||
| Consumer of 7333 | New path |
|
||||
|---|---|
|
||||
| Agent tester HTTP tools and curl probes in authorized window packets | `curl --unix-socket <dataRoot>/console/tester.sock http://mosaic-tester.invalid/...`, with the fixed Origin for writes. Add one repository helper for bounded tester HTTP requests so callers do not copy path/origin logic |
|
||||
| `scripts/mosaic ... --tester` | Already uses TESTER_CLI and broker.sock, not TCP. Keep its verbs, output and switch |
|
||||
| Browser tester page in row 176 and later window checks | Ordinary browsers cannot navigate a Unix HTTP socket. Replace automated tester HTTP checks with the socket helper. Browser visual QA uses scratch fixtures only. No local TCP relay is added |
|
||||
| `webui-service.sh` render/install and installed unit | Carry --tester-socket for new copies. Refuse a target without support. Units running old copies retain their old flags until a window |
|
||||
| `stack-release.sh` activate, plan, rehearsal and rollback | Add --tester-socket. Replace inherited --tester-port N only when explicitly requested. Refuse incompatible inherited flags before stopping units. Plan names the transport and every dropped pair. Rehearsal uses a scratch socket |
|
||||
| Gate/window Console checks, including agents' console-check scripts | Extend checks to use scratch Unix HTTP and expect no tester TCP bind. Sage owns live packet updates, including Q175 phase 2's old --tester-port 7333 instructions |
|
||||
| `docs/TOOLS.md`, webui/cli/bus READMEs and examples | Document socket invocation, fixed origin, loss of direct browser navigation and per-instance path. Historical window receipts stay unchanged |
|
||||
|
||||
Repository search found no non-test hardcoded 7333 caller in tools/ or the harness code. The
|
||||
active windows and external seat commands still need Sage's consumer audit before re-pin.
|
||||
The build manifest will record the full search, rather than treating this draft as that audit.
|
||||
|
||||
## 4. D2: one verified principal per bus request
|
||||
|
||||
Internal interface: `verifyPrincipal(request, connection) -> {kind,business,id}` or refusal.
|
||||
Kinds are owner, user and tester. The connection metadata is supplied by the trusted server,
|
||||
never deserialized from JSON. No role or authority is returned. The broker looks up live policy.
|
||||
|
||||
1. Read and validate the bounded envelope first. For human, tester and user proofs, read Linux
|
||||
SO_PEERCRED on that accepted Unix connection before dispatch. Require a valid peer PID
|
||||
and the bus uid. Refuse unavailable credentials, unsupported platform and errors. Cap
|
||||
traffic keeps its capability protocol behind the validated 0700 directory and 0600 socket.
|
||||
2. Require exactly one cap, human, tester or future user envelope. Human/tester/user proof.pid
|
||||
must equal the kernel peer PID. Verify startTime, nonce and CLI path against that process.
|
||||
Keep the second process read after the walk. Missing, changed or exited processes refuse.
|
||||
3. Owner terminal: run the full existing human walk. Map the business to businesses[b].human.
|
||||
No supplied human id, role or uid selects the principal. Keep today's terminal invocation.
|
||||
4. Tester: run verifyTester, retaining its deliberate difference from the human walk. An agent
|
||||
seat may be tester. A managed-run marker or registered managed ancestor refuses. Then check
|
||||
bus.tester. The full human walk must never be weakened to admit a session user.
|
||||
5. Session user: use the full human walk with the path-bound user-cli entry and its own nonce
|
||||
variable, MOSAIC_BUS_USER_NONCE. Parameterize the nonce reader without admitting a human
|
||||
or tester nonce as a user proof. Require its immediate parent to be the same tree's resolved webui/src/cli.mjs,
|
||||
argv[2] `serve`. Check parent uid, startTime and ppid again before binding. Both child and
|
||||
parent remain alive for the call. A different checkout or wrapper parent refuses.
|
||||
6. For user calls, the Console puts its mapped access-file user id in the verified proof's
|
||||
user field, as federation 3.6 specifies. The id comes only from claims Q175 verified for
|
||||
this request's live session, never from an identity cached past that session. It never
|
||||
takes that id from a form field or verb
|
||||
args. Return kind user, proof.business and proof.user as id only after the provenance
|
||||
checks. R3 then validates that mapping and the live grant. Bad access.json denies users,
|
||||
not the terminal owner. The verifier does not implement access-file policy.
|
||||
7. Owner Console calls keep the verified Q175 owner subject path. Under SSO only a subject
|
||||
in console.sso.subjects reaches owner bus calls. They use human-cli and the same peer/walk
|
||||
checks. A terminal owner still needs no SSO token. No anonymous main-listener fallback.
|
||||
|
||||
The bus verifies which process supplied the session identity. It relies on that Console's
|
||||
Q175 implementation to have verified OIDC. It does not independently verify an ID token in
|
||||
this option. A provider/sub field alone, from another process, is not enough.
|
||||
|
||||
The Console must spawn user-cli directly with its nonce already in the launch environment.
|
||||
It must not use human-cli's existing self-respawn pattern, which makes the CLI's parent a CLI.
|
||||
Apply the same initial-nonce spawn to Console human calls for consistent tests. Terminal
|
||||
human-cli can retain its self-respawn since no Console-parent condition applies there.
|
||||
Never strip agent markers from inherited environments to make a walk pass.
|
||||
|
||||
The server binds an internal cap for this request, dispatches, and disconnects in every
|
||||
success/error/timeout path, including asynchronous task and web calls. It never returns the
|
||||
cap or a reusable principal handle. A proof copied by another process has a different kernel
|
||||
peer PID and fails. One verified CLI may make only its one request on its one connection.
|
||||
The session may hold s.user for that request. No PID or principal cache survives the connection.
|
||||
|
||||
### Fit with rows 193 and R3
|
||||
|
||||
Row 196 owns peer metadata, proof/walk verification and the internal principal interface.
|
||||
It supplies the Console provenance verifier and tests before R3 adds user-cli and user sessions.
|
||||
R3 owns access.json mapping and the bindUser integration, using this interface. It must not
|
||||
add a second ancestry implementation. Row 193 adds viewer and share policy to the same live
|
||||
grant check. An owner id is the business human. A user id is the access-file id, with stored
|
||||
owner string `user:<id>`. Neither row takes role from the proof.
|
||||
|
||||
No live grant, unknown subject, duplicate owner/user mapping and invalid access file all
|
||||
deny user binding through R3's policy. Per-request authorization, access.reload and the
|
||||
30-second recheck remain R3's responsibility. Share visibility uses that check in row 193.
|
||||
Binding provenance is not a grant and never widens one. R3's user dispatch must run before
|
||||
names falls through to #agent. R3 must not land before this contract and its tests are green.
|
||||
Gizmoduck's gizmoduck-0015 and Gander's gander-0007 agree on this split. R3 keeps the reserved
|
||||
user-name mutant. Row 196 tests kind separation even if a user id resembles the owner name.
|
||||
|
||||
### OIDC alternative
|
||||
|
||||
The bus could verify the signed ID token itself and map its issuer/sub. That reduces reliance
|
||||
on the Console's subject assertion, but requires JWKS/provider handling, nonce or challenge
|
||||
binding, replay handling, login and logout/session lifetimes in the bus. Reusing an ID token
|
||||
on every request either creates a replay credential or expires a Console session with the
|
||||
token. A bus-issued session needs a separate lifecycle design. It also leaves the terminal
|
||||
owner and hostile same-uid limit intact. Recommend the Console provenance contract for this
|
||||
slice. Duckworth approved this option in duckworth-0006, with the live-session condition above
|
||||
and the requirement to carry section 8 R2 into P19 333 word for word.
|
||||
|
||||
## 5. D3: obtaining kernel credentials, O1 approved with conditions
|
||||
|
||||
All options must bind the accepted connection, not a PID a caller picked. None gets a silent
|
||||
fallback to the current proof. Sage required this comparison. Duckworth selected O1 in
|
||||
duckworth-0006, with the interpreter, proof-only and image conditions below. O4 remains the
|
||||
fallback if Python is unavailable, and needs a revised build manifest before use.
|
||||
|
||||
| Option | What it proves and costs | Recommendation |
|
||||
|---|---|---|
|
||||
| O1 Python stdlib helper on inherited accepted socket | Node passes the accepted net.Socket as fd 3 using documented spawn stdio stream passing. Python socket(fileno=3) reads SO_PEERCRED and returns only pid,uid,gid on stdout. No socket reads, no shell, no credential values. Adds Python to bus hosts and any future bus image, with a process per admitted proof connection. Copies carry the helper and depend on the system interpreter | Selected by Duckworth, with conditions below |
|
||||
| O2 /proc/net/unix plus inode and /proc/PID/fd scans | The table identifies Unix socket entries, not an authenticated peer PID for each accepted connection. Finding a process holding an inode is racy, may have several holders and can be unreadable. The server endpoint's inode is not the client's inode | Reject as a replacement for SO_PEERCRED. No claimed proof PID may choose the scan target |
|
||||
| O3 plain Node fd passing or abstract sockets | A private inherited IPC channel can authenticate a child that this parent spawned. The bus did not spawn the independently started Console or terminal CLI. Moving the bus into the Console's child tree changes lifecycle and ownership. An abstract name supplies no filesystem mode boundary and no peer uid check by itself. Node's public net API supplies no SO_PEERCRED accessor | Reject as a drop-in. A larger bus-spawned transport design could use fd capabilities, but is outside this slice |
|
||||
| O4 small compiled helper or Node-API addon | Calls getsockopt directly, with no Python runtime. A helper can use the same inherited fd. Adds compiler/build closure and platform artifacts to stack-copy and containers. An addon also needs a supported way to obtain the accepted socket fd and Node version coverage | Viable alternative if Python is refused. Prefer a small helper over undocumented Node handles |
|
||||
|
||||
For O1, pin the system interpreter `/usr/bin/python3`, resolving its system symlink to an
|
||||
absolute ELF binary. Require root ownership and no group/other write on that executable and
|
||||
its path components. Refuse scripts, PATH shims and any resolved path under an OS account's
|
||||
home, including /home and /root. A pyenv shim can choose an interpreter before -I -S applies.
|
||||
No PATH lookup, caller-selected interpreter or helper. Invoke the resolved binary with
|
||||
`-I -S`, a minimal environment and the absolute helper path in the same pinned copy.
|
||||
|
||||
Activation preflight records the interpreter's resolved path, version and file identity/hash
|
||||
in its gate evidence. The bus validates and pins the resolved executable at each startup
|
||||
before opening broker.sock. The activation gate must report the same interpreter used by
|
||||
that bus. Missing, unsafe or changed resolution during that activation refuses it, never
|
||||
falling back to PATH. No secret values are recorded. Test system-owned interpreter checks
|
||||
through injected metadata.
|
||||
|
||||
N5 decision: a later bus restart repeats the safety/version/support checks and accepts a
|
||||
safe system interpreter installed by an OS upgrade. It does not compare against an old
|
||||
activation hash. Before opening the listener, append a startup receipt with timestamp,
|
||||
copy path, resolved interpreter path, version and file identity/hash to
|
||||
`<dataRoot>/bus/peercred-starts.jsonl` (0600 in the checked 0700 bus directory). Refuse an
|
||||
unsafe receipt file or failed append. Never edit the old activation evidence. The startup
|
||||
receipt identifies the binary now in use, so the old receipt remains a historical fact.
|
||||
If an upgraded interpreter fails the checks, startup fails closed until a safe supported
|
||||
system interpreter is restored by the operator. There is no shim or O4 auto-fallback.
|
||||
|
||||
Operator re-pin after an interpreter change: in the next authorized window, prepare the
|
||||
next reviewed copy with `scripts/stack-copy.sh copy NEW`, then run
|
||||
`scripts/stack-release.sh activate NEW BUSINESS --tester-socket` with that instance's existing
|
||||
flags and selector, first with --plan. NEW must differ from the active copy because activate
|
||||
refuses already-active. Record the interpreter in the new activation evidence and compare it
|
||||
with the bus startup receipt. A routine OS update alone does not authorize a re-pin or unit
|
||||
restart. A bus restart does not rewrite config, pointer or activation history.
|
||||
|
||||
Preflight helper and SO_PEERCRED support too. The helper lives under packages/bus/src so
|
||||
stack-copy's closure includes it. Copies remain immutable. Document Python >=3.10 on bus
|
||||
hosts. Today's Containerfile builds the worker image and runs run-agent.sh, not the bus.
|
||||
It needs no Python change for this row. A future bus-host image must explicitly include
|
||||
the pinned system Python or use reviewed O4. No install through the node_modules symlink.
|
||||
|
||||
Pause each proof connection while reading credentials. Limit outstanding helpers
|
||||
to 16, timeout to one second, output to one strict JSON record of at most 256 bytes. Refuse
|
||||
nonzero exit, extra output, malformed integers, missing fd and timeout. Validate pid, uid and
|
||||
gid as safe integers, pid >=2 and uid/gid >=0. Only pid and uid select the principal. gid is
|
||||
validated but grants no authority. Kill and reap helpers on shutdown. Cap envelopes never
|
||||
spawn this helper. Reading the proof envelope first is sound because SO_PEERCRED describes
|
||||
the peer at connect time. Keep the accepted Socket object owned by its connection closure,
|
||||
not a shared current-fd variable. Only the helper's duplicate fd is closed when it exits.
|
||||
|
||||
References: [Node stdio stream passing](https://nodejs.org/api/child_process.html#optionsstdio),
|
||||
[Node Unix socket support](https://nodejs.org/api/net.html#ipc-support),
|
||||
[Python socket and getsockopt](https://docs.python.org/3/library/socket.html),
|
||||
[Linux Unix credentials and permissions](https://man7.org/linux/man-pages/man7/unix.7.html),
|
||||
[Linux proc network table fields](https://man7.org/linux/man-pages/man5/proc_pid_net.5.html).
|
||||
These support the APIs. The connection-binding behavior still needs T2 on supported Node versions.
|
||||
|
||||
## 6. Migration and rollback
|
||||
|
||||
No config schema or store schema changes. Old copies and units keep working until each
|
||||
instance re-pins. No new verifier is loaded into a running old broker. Do not pair a new
|
||||
Console with an old bus and call it protected. Same-tree paths intentionally refuse mixtures.
|
||||
|
||||
The authorized window must pin bus, Console and human wrapper to one candidate. New tools
|
||||
offer `activate ID BUSINESS --tester-socket`. Plan must show the old tester-port pair removed
|
||||
and the new socket flag added, and tell Jason that direct tester browser navigation is lost.
|
||||
Mos accepted that change in mos-1015 (sage-1363). Agents test through the socket. A later
|
||||
authenticated browser relay behind SSO belongs to its own row. Without the explicit
|
||||
conversion, a candidate that no longer
|
||||
serves tester TCP refuses inherited --tester-port before stopping anything. New serve refuses
|
||||
--tester-port with a migration error. It never silently changes that flag's meaning.
|
||||
|
||||
Rollback to a copy lacking --tester-socket drops tester enablement and reports it, as today's
|
||||
tools drop unsupported flags. It does not turn the socket back into TCP. The old main Console
|
||||
and owner CLI can run with their known old limits. A failed activation's recovery may restore
|
||||
the old saved unit, including its TCP listener. Report that recovery as restoration of the old
|
||||
security state, never as a hardened deployment. After rollback, R3 and second-human access are
|
||||
not accepted until prerequisites are restored. Older operator tools cannot manage the new
|
||||
flag safely. The window must use the reviewed candidate tool blob for rollback as well.
|
||||
|
||||
The Q173 window supplies real uid-denial evidence and the final consumer audit. No second uid,
|
||||
live socket, unit, config or secret is touched in this row's tests. Row 190b or a separate host
|
||||
still owns cross-instance file isolation. It is not replaced by SSO or this socket change.
|
||||
|
||||
## 7. Acceptance tests and mutants
|
||||
|
||||
All fixtures use scratch roots and ephemeral sockets, no live 7332/7333, public origin or
|
||||
provider. No real second uid. Foreign uid checks use injected metadata and name that limit.
|
||||
Use short TMPDIR paths so the longest Unix socket path stays under 108 bytes.
|
||||
|
||||
| Test | Required evidence | Mutant killed |
|
||||
|---|---|---|
|
||||
| T1 private tester | HTTP over scratch socket reads and writes as tester only. parent 0700, socket 0600. No tester TCP listen. Wrong Host/origin and auth cookies refuse | M1 bind loopback TCP as well, M2 remove socket mode check, M3 accept owner cookie |
|
||||
| T2 real peer binding | At least 8 concurrent proof connections from distinct scratch client processes, each with its own live proof, plus a copier racing one live CLI. Barrier the helpers so connections overlap. Each genuine call must bind its own peer PID and pass, the copier must refuse. Repeat on Node 24 and 26. A lower-level helper fixture exchanges bytes both ways on the accepted socket after the helper exits, and each real bus call receives its response after helper exit. Helper failure cases all refuse | M4 use proof.pid as peer PID, M5 continue after helper error, M20 give the helper another pending connection's socket |
|
||||
| T3 uid/path refusal | Inject foreign peer uid, wrong file owner/modes, symlink parent, existing socket and long path. Inject interpreter script, user-owned ELF, home path, writable ancestor and missing executable. Refuse before dispatch, no repaired paths. Unsafe pid/uid/gid and extra helper output refuse | M6 ignore uid, M7 accept unsafe parent |
|
||||
| T4 ancestry | Agent env, binary and registered launch above owner/user refuse. Missing/reused PID, changed parent and cycles refuse. Clean terminal owner works | M8 omit walk, M9 omit identity re-read |
|
||||
| T5 Console parent | Direct CLI child from exact tree Console fixture works. Same CLI under shell, other copy, wrapper, agent ancestor or CLI respawn refuses | M10 remove direct-parent check, M11 accept any Console basename |
|
||||
| T6 principal shape | No human id or role from request body. Exactly one proof. No returned cap. Disconnect on synchronous and async failure, timeout and close. Tester agent allowed, managed tester refused | M12 accept extra identity, M13 omit disconnect, M14 use tester walk for user |
|
||||
| T7 consumer migration | Render/plan/activate/rehearse fixture carries socket flag in unit and pointer. Explicit conversion removes port. Unsupported/inherited mismatch refuses before unit calls. Rollback disables unsupported tester, never opens TCP | M15 keep inherited tester port, M16 restore TCP on downgrade |
|
||||
| T8 gates and identity | bus.tester false refuses tester calls. SSO owner/user wiring uses only claims verified for that request's live session. Expired/logged-out or replaced session cannot reuse an earlier mapped id. User kind never becomes owner from its id. R3 integration maps subject, denies missing/invalid grants and owner overlap, broken access file leaves terminal owner working | M17 bypass tester switch, M18 turn user kind into owner by id |
|
||||
| T9 isolation limits | Two scratch instances have different sockets and matching tree paths. Foreign-uid stand-in refuses. Record that no real uid boundary was exercised | M19 choose default instance socket |
|
||||
| T10 interpreter and cap path | Activation evidence records the same pinned root-owned system ELF that the bus uses. Scripts, home paths and unsafe owners/modes refuse. Simulated OS replacement followed by startup accepts a safe replacement and appends its actual identity without changing the old receipt, refuses an unsafe replacement or unsafe/unwritable receipt. Cap calls complete without invoking the helper, proven with a helper spy that fails if called | M21 bypass interpreter safety, M22 invoke helper for cap traffic, M23 retain stale interpreter identity after restart |
|
||||
|
||||
Tests for new policy stay in the bus, WebUI and CLI packages. R3 provides the real user/grant
|
||||
half of T8 in its candidate, with its own gate. This row tests the shared verifier's user
|
||||
provenance without shipping placeholder user access. Mutants run on scratch copies,
|
||||
restore the original bytes and verify hashes. Two failures in a gate run stop and are reported.
|
||||
Single test files run freely. Ask Sage for the slot before any suite. Final acceptance is
|
||||
Duckworth's approved manifest plus Sage's bus, WebUI, CLI and scripts/test-*.sh gate.
|
||||
|
||||
## 8. Closure, limits and review decisions
|
||||
|
||||
R1. Same uid remains trusted OS authority. A hostile process may detach, clear its markers,
|
||||
modify argv, read same-uid pipes or capabilities, edit policy files, or interfere with the
|
||||
Console where host policy permits. SO_PEERCRED proves the connecting process identity at
|
||||
connection time. It does not prove human intent, protect memory, or track a socket passed to
|
||||
another process. Ordinary agent children fail the walk. Hostile detached agents are not
|
||||
claimed contained. Separate uids narrow cross-instance reach, not reach within one instance.
|
||||
|
||||
R2. 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.
|
||||
|
||||
R3. A Unix tester endpoint removes direct browser navigation. No bridge is in this design.
|
||||
The 7331 development board remains a separately reported reachability and impersonation risk.
|
||||
|
||||
P19 333 can record the following after the implementation gate and authorized re-pin:
|
||||
"Tester ingress is private to the instance uid. Bus human proofs are tied to the actual
|
||||
Unix peer and retain the human walk. Session-user calls require the same-tree Console as
|
||||
direct parent. Q175 phase 2 separately protects main Console ingress with verified OIDC.
|
||||
Hostile processes on the instance uid, root, and the independent development control board
|
||||
remain outside these guarantees. Cross-instance file isolation requires the uid/host gate."
|
||||
|
||||
Duckworth requires that P19 333 also carry R2 word for word:
|
||||
"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."
|
||||
|
||||
Do not mark the historical task fully closed on a design or commit. Closure needs live
|
||||
Q175 phase 2, this row's re-pin and the recorded residual accepted through Mos. A promise of
|
||||
hostile same-uid isolation would require separate OS authority for agents and a new design.
|
||||
|
||||
Review receipt: duckworth-0006, notes at `86be181a2:agents/duckworth/work/row196/REVIEW.md`.
|
||||
Q1 selects O1 with the conditions incorporated in section 5. Q2 approves Console provenance
|
||||
with the live-session and unchanged P19 R2 conditions. B1 adds concurrent T2, M20 and socket
|
||||
survival checks. N2's detached-Console limit remains in R1. N3's gid validation and N4's
|
||||
operator window warning are included. Mos's tester-access ruling is recorded above. No
|
||||
product code begins before design approval.
|
||||
Duckworth approved revision 2 in duckworth-0009, review at
|
||||
`cb6d840df:agents/duckworth/work/row196/REVIEW-r2.md`. N5 permits either restart policy.
|
||||
Revision 3 selects safety revalidation with a new append-only startup receipt, and gives the
|
||||
operator a re-pin path that respects the existing already-active refusal.
|
||||
@@ -0,0 +1,121 @@
|
||||
# Row 196 review manifest
|
||||
|
||||
Status: draft, not an acceptance claim. Candidate product files are uncommitted.
|
||||
Base: 4d26003f731a6eec439df6a48cacc3ef482a59c8. Design r3 approved by
|
||||
duckworth-0009/0015 and sage-1371. No merge, deployment or live re-pin requested.
|
||||
Current path hashes are in PRODUCT-FILES.json, marked as an uncommitted draft.
|
||||
Final candidate commit, exact changed-file hashes and gate totals follow after
|
||||
the renewed suite slot. Sage owns that slot and the final gate. Duckworth reviews
|
||||
this manifest before Sage's gate.
|
||||
|
||||
## Review items
|
||||
|
||||
| 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. |
|
||||
|
||||
All package paths above are under `packages/`. Mutants are prepared in
|
||||
`mutants.mjs` but none have run as of this draft. Their kill and restoration
|
||||
receipts must be attached before acceptance. M25-M29 supplement design M1-M24.
|
||||
|
||||
## 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`. These hashes must be checked again
|
||||
against the final candidate before review.
|
||||
|
||||
## 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.
|
||||
|
||||
## Gate history and remaining evidence
|
||||
|
||||
Run 1: bus 463 pass, one byte-baseline failure. Run 2: bus 464 pass; WebUI
|
||||
stopped at its second fixture migration failure, with 269 observed top-level
|
||||
passes and no final summary. CLI and mutants did not start. Sage received clear
|
||||
in gander-0023. No timing failures were attributed to Launchpad's T56 overlap.
|
||||
The two browser failures were repaired and verified in a single file.
|
||||
|
||||
sage-1416 delays the renewed slot until Launchpad, Darkwing, Rocko and row 192
|
||||
finish. No suite or mutant batch starts before Sage's go. Remaining: final
|
||||
bus/WebUI/CLI suites, M1-M29 receipts, final changed-file hashes,
|
||||
verified candidate commit/push, Duckworth
|
||||
manifest review and Sage's gate. No approval is implied by this draft.
|
||||
|
||||
Node 24 focused reruns after the shutdown change are complete: peercred 5/5 and
|
||||
principal 4/4. Node 26 peer-transport now passes 4/4, including client-visible
|
||||
refusal codes. Full logs are in evidence/.
|
||||
|
||||
## Refused caller behavior and static review
|
||||
|
||||
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 prepared mutant. An unrelated change to legacy
|
||||
tester-port-invalid text was also removed to preserve the existing contract.
|
||||
No further implementation changes are planned before the authorized batch.
|
||||
|
||||
## 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:
|
||||
|
||||
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.
|
||||
@@ -0,0 +1,121 @@
|
||||
# Row 196 Human Boundary Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox syntax for tracking.
|
||||
|
||||
**Goal:** Bind human proofs to their actual Unix peers and make tester HTTP private to the instance uid.
|
||||
|
||||
**Architecture:** The bus reads kernel credentials through a pinned system Python helper only for proof envelopes. One principal verifier keeps the human walk and supplies Console provenance for federation R3. Tester HTTP moves to a private filesystem socket. Release tools migrate the flags explicitly.
|
||||
|
||||
**Tech Stack:** Linux, Node 24 and 26, Python >=3.10 standard library, existing Node test runner and shell release tools.
|
||||
|
||||
**Spec:** `agents/gander/work/queue-196/DESIGN.md`, approved r2 at 5fe259f16, with N5 restart policy added in r3.
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Work in the existing gander/row196 worktree. Plain node_modules symlink. No new package dependency.
|
||||
- No live files, credentials, listeners, units, second uid or external authentication service.
|
||||
- Helpers: proof envelopes only, at most 16 concurrent, one second timeout, 256-byte strict output.
|
||||
- Root-owned system Python ELF at resolved /usr/bin/python3, never PATH or a home/shim path.
|
||||
- console/ 0700, tester.sock 0600, Unix pathname at most 107 bytes.
|
||||
- One principal and transient cap per request. R3 owns user access policy and user-cli integration.
|
||||
- Mos accepted socket-only tester access. No TCP relay or control-board change.
|
||||
- Single test files run freely. Ask Sage before any suite. Stop and report two failures in a gate run.
|
||||
- Commit code only after applicable suites pass. Sage owns the final gate and manifest queue moves.
|
||||
|
||||
## Review Focus
|
||||
|
||||
- Connection overlap and disconnect: helpers must retain the correct Socket object and release capacity on every exit.
|
||||
- OS interpreter replacement: restart records the actual safe binary, while old receipts remain unchanged.
|
||||
- Long or unsafe instance paths: refuse before binding or stopping any service.
|
||||
- Rollback/recovery: distinguish intentional tester disablement from restoration of an old saved TCP unit.
|
||||
- CLI nonce respawn and session expiry: direct-parent provenance must survive correct Console spawning and refuse stale identity.
|
||||
|
||||
## Task 1: kernel credentials and interpreter evidence
|
||||
|
||||
Files: create `packages/bus/src/peercred.mjs`, `packages/bus/src/peercred.py`,
|
||||
`packages/bus/src/interpreter.mjs`; tests in `packages/bus/tests/peercred.test.mjs` and
|
||||
`packages/bus/tests/interpreter.test.mjs`, with subprocess fixtures under `packages/bus/fixtures/`.
|
||||
|
||||
Interfaces: `inspectInterpreter()` returns a validated immutable record of path, version,
|
||||
device, inode and sha256. `recordInterpreterStart(directory, record)` appends the actual startup
|
||||
identity safely. `createPeerReader({interpreter})` returns `{read(socket),close()}`. read resolves
|
||||
to `{pid,uid,gid}` from that exact socket, or refuses. Test-only injected OS/process operations
|
||||
do not become product flags or environment overrides.
|
||||
|
||||
- [ ] Write interpreter safety, receipt replacement and cap-independent helper tests (T3/T10).
|
||||
- [ ] Run each new test file alone and record the expected missing-module failures.
|
||||
- [ ] Implement system interpreter validation and startup receipt append with no-follow, owner/type/mode checks.
|
||||
- [ ] Write T2's eight-process barrier plus racing copier, wrong-fd case and post-helper socket exchange.
|
||||
- [ ] Implement fd-3 helper, strict result validation, bounded async reader and helper shutdown.
|
||||
- [ ] Run `node --test packages/bus/tests/interpreter.test.mjs` and separately `node --test packages/bus/tests/peercred.test.mjs`.
|
||||
- [ ] Confirm process/socket cleanup, eight distinct kernel PIDs, copier refusal and original receipt preservation.
|
||||
|
||||
## Task 2: principal provenance and bus dispatch
|
||||
|
||||
Files: modify `packages/bus/src/{human,tester,server,runtime}.mjs`, create
|
||||
`packages/bus/src/principal.mjs`, add `packages/bus/tests/principal.test.mjs`, and extend
|
||||
`packages/bus/tests/human.test.mjs`. Extend server/runtime test files after inspecting their fixtures.
|
||||
|
||||
Interfaces: `verifyPrincipal(request, {peer,...trustedPathsAndProcessReaders})` returns
|
||||
`{kind,business,id}`. Human maps to the business human, tester to tester, user to its verified
|
||||
Console proof id. No roles or grants. Server obtains peer metadata from Task 1 only after
|
||||
envelope validation and only for proofs. Existing cap dispatch never invokes the helper.
|
||||
Future user binding stays refused without R3's trusted integration.
|
||||
|
||||
- [ ] Write T4/T5/T6/T8 process-table tests, including changed ancestry, distinct nonce namespaces and kind confusion.
|
||||
- [ ] Run the focused new file and confirm expected failure before implementing the verifier.
|
||||
- [ ] Parameterize the nonce/path portion of the existing human walk and retain all marker/binary/launch checks.
|
||||
- [ ] Wire peer metadata, interpreter startup receipt and one-request cleanup into runtime/server.
|
||||
- [ ] Test cap requests with a failing helper spy (M22), and test async refusal/close cleanup.
|
||||
- [ ] Run each affected bus test file alone. Record any base fixture changes needed for real peer identity.
|
||||
|
||||
## Task 3: tester Unix HTTP and Console nonce spawning
|
||||
|
||||
Files: modify `packages/webui/src/{cli,serve,bus}.mjs`, create
|
||||
`packages/webui/src/tester-socket.mjs` and `packages/cli/src/tester-http.mjs`; add focused
|
||||
`packages/webui/tests/tester-socket.test.mjs` and `packages/cli/tests/tester-http.test.mjs`.
|
||||
Extend existing WebUI transport tests.
|
||||
|
||||
Interfaces: `startTesterSocket({dataRoot,...handlerOptions})` owns the private listener and
|
||||
cleanup. `testerRequest({dataRoot,method,path,body})` uses the fixed logical origin and bounded
|
||||
Unix HTTP. Console human child spawning supplies its initial nonce, preserving agent markers.
|
||||
R3 reuses that spawn pattern for its user-cli.
|
||||
|
||||
- [ ] Write T1/T3/T9 socket permission, unsafe-path, wrong-origin and instance separation tests.
|
||||
- [ ] Confirm the new focused files fail, then implement --tester-socket and refusal of --tester-port.
|
||||
- [ ] Keep tester principal, write allowlist and cookie/header refusals intact. Add no browser relay.
|
||||
- [ ] Write and implement the initial-nonce Console spawn test and the helper request timeout test.
|
||||
- [ ] Run each new or changed test file alone, verifying cleanup and no tester TCP bind.
|
||||
|
||||
## Task 4: release migration and operator evidence
|
||||
|
||||
Files: modify `scripts/{webui-service,stack-release}.sh`, inspect
|
||||
`scripts/stack-copy.sh` closure, extend `packages/cli/tests/stack-release.test.mjs` and its
|
||||
render fixtures. Update `docs/TOOLS.md` and package READMEs with the implementation.
|
||||
|
||||
Interfaces: `activate ID BUSINESS --tester-socket` explicitly replaces inherited tester-port
|
||||
flags. Pointer and unit argv agree. Candidate support and interpreter preflight run before
|
||||
any unit stop. Activation gate evidence records the same interpreter as the bus startup receipt.
|
||||
|
||||
- [ ] Write T7 explicit conversion, inherited mismatch and unsupported-target refusal fixtures.
|
||||
- [ ] Run only the affected test file, then implement flag rendering, plan output and rollback disabling unsupported tester.
|
||||
- [ ] Preserve old-copy recovery behavior and report restored old security state accurately.
|
||||
- [ ] Add rehearsal scratch socket and T10 interpreter gate identity comparison.
|
||||
- [ ] Verify same-copy activation refusal is preserved. Document N5's next-reviewed-copy re-pin path.
|
||||
- [ ] Run the affected file alone, shell syntax checks, and inspect remaining tester-port references by purpose.
|
||||
|
||||
## Task 5: mutants, approved suites and manifest
|
||||
|
||||
Files: add the row's mutation runner and receipts under `agents/gander/work/queue-196/`.
|
||||
Append BUILD-LOG phase receipts. No SESSIONS or queue file edits.
|
||||
|
||||
- [ ] Exercise M1-M23 against isolated scratch copies. Record killer test, restored hash and cleanup for each.
|
||||
- [ ] Run focused tests on Node 24 and 26, including the concurrent T2 case and socket lifetime checks.
|
||||
- [ ] Send Sage the scope and estimated duration, obtain the suite slot, then run approved bus/WebUI/CLI suites.
|
||||
- [ ] Let Sage own the scripts/test-*.sh gate. Stop on the repository's two-failure rule.
|
||||
- [ ] Build the exact changed-path manifest with acceptance evidence, search results, limits and consumer audit.
|
||||
- [ ] Commit/push the verified candidate only after applicable suites pass. Send Duckworth and Sage path, commit and hashes for manifest review.
|
||||
|
||||
Execution stays with Gander in this worktree. No new agent delegation. Duckworth reviews
|
||||
the manifest independently. Push is only to gander/row196. No merge, re-pin or deployment
|
||||
is authorized by this plan.
|
||||
@@ -0,0 +1,186 @@
|
||||
{
|
||||
"status": "uncommitted draft; regenerate after final tests",
|
||||
"base": "4d26003f731a6eec439df6a48cacc3ef482a59c8",
|
||||
"files": [
|
||||
{
|
||||
"path": "docs/TOOLS.md",
|
||||
"baselineSha256": "5bd1bc697cd56e57b00e60c0e80be72cd1043a55a6d2fc0b9e2ccdd0c5cf9802",
|
||||
"candidateSha256": "7eba3f1ac2e5a159c9c764f1c3e4f6fdfaf06d2904cdc36338723d5ddd9044c8"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/README.md",
|
||||
"baselineSha256": "4377cc32aed37fa1bb645c0bbc3340eed4ec01740e67327449949474e35d3fdb",
|
||||
"candidateSha256": "becff52b647f28079d2756b26a7e46e28f14b695f57b2dede779e7cb43af3d96"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/fixtures/peer-client.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "60720461a7994011a9a30594715eb2c992be699cd61c656e77cbd609ad05328e"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/src/human.mjs",
|
||||
"baselineSha256": "b995fc5cff3af8ade4c990d0e3bebf9d83829e00f034ebc9c3dcfd05f252b573",
|
||||
"candidateSha256": "0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/src/interpreter.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "d5d98a9133a1b449acc48143fd559d890a470c6ea210b30b9b70e491e6cd855a"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/src/peercred.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/src/peercred.py",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "d1536a8f472fa5b3773adb10555529ed049ad63b647c0b44c00ce5f25ce09f85"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/src/principal.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/src/runtime.mjs",
|
||||
"baselineSha256": "fe70f4b6568fbfec85e58d34f3cb8c3624daba65487d73ad24e981f2121cb27a",
|
||||
"candidateSha256": "e001bdba127fc6e7a6e95ef1864e661b2842f3c797169ab0a6ccaa5e2cd7da00"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/src/server.mjs",
|
||||
"baselineSha256": "8a1b8eac60a5885bbfd36f939b63443de303ed298bf9e1ff653a5a7bcbae76d2",
|
||||
"candidateSha256": "a5788c0a0b2b78de5eb2111a47c475e100cbb0e2eca4b601e7f027cac2c56d7e"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/tests/channel-proof.test.mjs",
|
||||
"baselineSha256": "98f12f509f0e292fa0b0e3924834f9d0f285c08ea5c4d22057566c49e2bd6c68",
|
||||
"candidateSha256": "e99133c3c957a1e856e404343721add2430e4a0d8c75452517aef04942af56ab"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/tests/interpreter.test.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "d19779b97e80ed3d62f58d0e798df46c23f45fa02b14fb4ac7a2ff4690a734e2"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/tests/peer-transport.test.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "a39af877a2d9143cc8d0584af0d603ca7ab651db8787e5816579762f17295887"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/tests/peercred.test.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "2c4c0bed41e546ce94535d8c4547b1cf5552a181183525dd1d52e2af1d64ccb6"
|
||||
},
|
||||
{
|
||||
"path": "packages/bus/tests/principal.test.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "cefbc0688d823c69196d94bb71467884acd639070721286d7e8e4e986c8240c1"
|
||||
},
|
||||
{
|
||||
"path": "packages/cli/README.md",
|
||||
"baselineSha256": "2c9f8fe7143aa80e59826ab53bd046de2b5e0a8f3e81fe4e3df77726bb54d50b",
|
||||
"candidateSha256": "23f4c767a67b358025f0d035d2a676e14e335478c480bc44a5c303066c40709c"
|
||||
},
|
||||
{
|
||||
"path": "packages/cli/src/tester-http.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "4bd7bdf0898844684ebf9444b110d2c5b6fa874b2681183e54f1f62f97823192"
|
||||
},
|
||||
{
|
||||
"path": "packages/cli/tests/stack-release.test.mjs",
|
||||
"baselineSha256": "b01ff656962c6fdb5bc3554cfbb13645b7f25adae5f6cd9608af8de6d6091c6c",
|
||||
"candidateSha256": "4c92b7cc7c4b942a1bbb9a9e24c7c1ef10e23d3f9d166bee98ed1b7f6b8de4b0"
|
||||
},
|
||||
{
|
||||
"path": "packages/cli/tests/tester-http.test.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "fbaa36e64129aee324341364bde831c379c098b97932cceadb7fcaa7909d4b20"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/README.md",
|
||||
"baselineSha256": "78c7b60d23cf20863a1cb66e16af2f9363d08acc79c5b4a344cd8af4fbe5bd44",
|
||||
"candidateSha256": "8bf41140a0c013a3d77757b66e442d46c278cf8eb0f54ac26b4e477e8265279b"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/src/bus.mjs",
|
||||
"baselineSha256": "76a1b57858c4aa41071746713a196299264851c18322a6f9869d553f0362d421",
|
||||
"candidateSha256": "934ab2f9b6bde72aafe7814758550c283eb25a4f3a23b284021b13718d67178f"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/src/cli.mjs",
|
||||
"baselineSha256": "4f988333ec6af225a023323dda85a159b81a77f408a8dd7bff798fe9a1f4b24b",
|
||||
"candidateSha256": "fbe9db9352300fb969aa889e40323c61b1a51d01f63434964be0a8c530240e50"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/src/serve.mjs",
|
||||
"baselineSha256": "ba7d3e35b225cb4e17a4d2530a0f34d0a3734641e3982229a38207a36b3cd433",
|
||||
"candidateSha256": "894bdb260af418bef7ca9dac5dd19541ca898d6f946ed12fa832bc3475234709"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/src/tester-socket.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/tests/browser.mjs",
|
||||
"baselineSha256": "1e70a0175f1d660f6b71449a1423ece83fbe8332108960fa9aff6f7a5e48022a",
|
||||
"candidateSha256": "2f3ea92cbe1ca115301ee1e3b8fc55a206842606237446b700881ee57a1b18cb"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/tests/proof-cli.test.mjs",
|
||||
"baselineSha256": "c23975b140ed977f3b98dbbec5de289e9f930cc42089193c4aa7c106338a68ba",
|
||||
"candidateSha256": "105cf4936db0498d0c0025698c7ee33ddce9530b43f6c829b77afdbcb3075207"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/tests/proof.test.mjs",
|
||||
"baselineSha256": "c06a1e673ef6f3df8f0473692c828aeba853369d2b668e821f1d41e6340b6503",
|
||||
"candidateSha256": "5f34d699a1bce6f46f286def1a93fdd4d863d06bec6839677fae1041be7153dd"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/tests/service.test.mjs",
|
||||
"baselineSha256": "424be2837a18a41eab56b0deb576e35b460ac16b8c371762ad44896ffc3aad7d",
|
||||
"candidateSha256": "2304ced2473c25b0369b4bb9b1433c1be3ee9ab8a6f75c971487abcd48cb1d1b"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/tests/tester-browser-fixture.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "9215ff92df774ba1e83819b87f758b53c8f3d19c2824c916490165914f1cb9e8"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/tests/tester-browser.test.mjs",
|
||||
"baselineSha256": "3cc6def0c8cfb6cf7bb91a52df6e57f18071549588b35394e0083f7dc938dacf",
|
||||
"candidateSha256": "89ffc5cbed1630a523080e8561d3678c1f781fb657199a5cd6cdb8189f082c73"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/tests/tester-cli.test.mjs",
|
||||
"baselineSha256": "dd74517b336e1670a5910481920ba875ffb004d52d8c6bee7cc5efc81e43215d",
|
||||
"candidateSha256": "a5c6c95dbda75dce37d38d3ce4761d3ad576babd9304a046e9a62b1b5dc2fdfd"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/tests/tester-fixture.mjs",
|
||||
"baselineSha256": "2169803c50815d214cab120eaa9d1542aa3b96bfe4738d68307eb0b92c1213f3",
|
||||
"candidateSha256": "7d4f3a59d21675807b1bfb92d40b7378134df450590bc6d42fa4103ab1343348"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/tests/tester-listener.test.mjs",
|
||||
"baselineSha256": "aed4cec37401bc7953b1a872349ed77c70210fcfb75ebf6d4e881a393f92c7e9",
|
||||
"candidateSha256": "7f0fc2daead11048cb86e0a74b6a223314785b1740a2927461d012b876a69f18"
|
||||
},
|
||||
{
|
||||
"path": "packages/webui/tests/tester-socket.test.mjs",
|
||||
"baselineSha256": null,
|
||||
"candidateSha256": "c01a942da1ad66a08a4e7c92d3c7e64f517530acfe5517f1e9895767d5ea3c0b"
|
||||
},
|
||||
{
|
||||
"path": "scripts/stack-release.sh",
|
||||
"baselineSha256": "5bb3ac40102ce515f1acdcbc5670feb161ce40a193e94e2f8b104ebf98eddc38",
|
||||
"candidateSha256": "59b39d63feb77f22abb4b7152c18feff53715cf3a10dde6374c69615329868c7"
|
||||
},
|
||||
{
|
||||
"path": "scripts/webui-service.sh",
|
||||
"baselineSha256": "d514caf757c03e5d02ef39b19359669bd2476dca1877f5d237c65bd62c33d2bf",
|
||||
"candidateSha256": "67cc347231d4410acf0fd845bde58aeabf099d1d6cf3e36efda4db66c5438c10"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
# Row 196 execution ledger
|
||||
Plan: agents/gander/work/queue-196/PLAN.md
|
||||
Base: 4d26003f7. Build authorized by sage-1371, mos-1021 item 2 and mos-1023 item 3.
|
||||
Pre-flight: Task 1 supplies peer reader and interpreter evidence to Task 2 and release gate in Task 4. Task 2 supplies principal provenance; R3 supplies user policy. Task 3 supplies tester transport to Task 4. Interfaces match approved design.
|
||||
Ruling: retain this repository packet as the ledger instead of adding a root .superpowers directory, honoring bootstrap-only root. No code commits before applicable suites pass; Duckworth is the independent manifest reviewer. Suites and mutant batches require Sage slot.
|
||||
Task 1: in progress.
|
||||
Task 1: interpreter tests RED missing module -> GREEN 3/3; peer reader RED missing module -> timeout diagnosed: Node spawn stdio pauses Socket -> explicit caller resume -> GREEN 3/3. Concurrency test observed nine distinct peers, eight accepted, copier refused, post-helper bidirectional traffic. No suite/commit yet.
|
||||
Task 2: principal RED missing module -> GREEN 3/3; existing human 4/4, peer-transport RED -> GREEN 2/2, transport 5/5, tester 14/14, process 8/8, all individual files. Runtime records interpreter and supplies kernel peer to shared verifier; cap traffic does not spawn helper.
|
||||
Task 3: BLOCKED by design contradiction, reported gander-0016/0017 at 2026-10-20T19:34:28Z. Node/libuv closes Unix listener by unlinking its pathname even after replacement inode. Scratch cleanup assertion reproduces; conditional JavaScript cleanup is too late. Tester module not wired into serve. Recommend explicitly accepting same-uid pathname replacement as residual under private-parent boundary. No product commit, suite or mutant batch.
|
||||
Task 3 resumed: sage-1382 selected Duckworth option 1. Temporary bind -> rename -> conditional final inode cleanup implemented. Replacement survival and absence of temporary name RED -> GREEN. M24 is bind-final-directly. Remaining same-uid lstat/unlink race recorded in BUILD.md. No design weakening.
|
||||
Gate run 1 bus: 463 pass, 1 fail, no other packages started. Failure was row164 byte baseline, which already records intentional re-pins in later rows. Ruling: update only human.mjs and webui bus.mjs pins because their approved row196 changes are intentional, preserving the other two pins, literal entry-path tests and plug-in import ban. This does not bypass a policy refusal or weaken the proof walk.
|
||||
Gate run 2: bus 464/464 pass. WebUI stopped on second failure: tester-browser.test.mjs still constructed TCP URLs using Unix address().port. 269 top-level passing cases observed, 2 failed, final suite summary unavailable due interruption. CLI and M1-M24 not started. Not timing failures. Sage notified clear in gander-0023. Node24 peer 3/3 and principal 4/4 passed. No suite/mutant rerun without renewed slot. Next: migrate scratch browser fixture without adding a product relay.
|
||||
Focused repair after gate stop: tester-browser 2/2 GREEN using CDP request interception and real scratch Unix HTTP, no TCP listener or product relay. Self-review added FIFO startup-receipt refusal (RED timeout -> GREEN) and helper file preflight (RED no refusal -> GREEN). interpreter 5/5 and peer 4/4. Renewed slot requested gander-0024; suites and mutant batch still stopped.
|
||||
sage-1409 accepts the fixture repair and requires separate manifest items for the row164 hashes and startup refusals, each with tests and mutants. sage-1416 delays the slot about an hour; no suite or mutant batch before go. Draft MANIFEST.md and PRODUCT-FILES.json prepared. M25 FIFO, M26 helper preflight and M27 helper shutdown are prepared, not executed. Gander-0025 reports the planned M1-M27 batch.
|
||||
Focused shutdown check: peer reader now awaits killed helper close events and server close awaits the reader. peer-shutdown-red.txt records the failing assertion, peercred-green.txt the 5/5 result. Final focused Node24 reruns: peercred 5/5, principal 4/4. Node26 peer-transport 3/3 after async reader close. git diff --check clean. These are single-file checks, not renewed suite acceptance.
|
||||
Consumer audit found proof insertion missed the new socket flag, making pointer and rendered unit argument order disagree. Focused row196 release fixture extended with preview + explicit proof: RED exact-order mismatch -> GREEN 1/1 after adding --tester-socket to the insertion boundary. Existing proof-file no-read check passes. Evidence release-proof-order-{red,green}.txt. M28 prepared for that boundary. Final planned mutant batch M1-M28; none executed. Shell syntax and diff whitespace checks pass.
|
||||
sage-1425: complete static self-review before slot, document refused caller outcome. Real Client test now verifies human-required for proof refusal and peercred-required for helper failure, without dispatch; peer-transport 4/4. Scratch HEAD-vs-candidate comparison returns human-required in both. Quackerjack's exact failing instance is not reproduced; client.mjs unchanged and abrupt close still outcome-unknown. Manifest states the limit.
|
||||
Static review complete: peer/helper lifecycle, runtime, verifier walk, tester socket, Console spawn, Unix client, release/recovery/preflight and fixtures inspected. Found release path preflight missing before stop: long-path fixture RED -> GREEN with preflight; unsafe parent also refuses before any stop. release-path-{red,green}.txt. M29 prepared. Restored unchanged legacy tester-port-invalid wording. Prepared batch now M1-M29, still unexecuted. No further implementation changes planned before Sage's go.
|
||||
sage-1464 (2026-10-20T20:40Z): renewed bus/WebUI/CLI and M1-M29 slot is fifth, after rows 192, 201, 204 and 200. Continue holding until Sage's go. Fleet notice #426(a), mos-1086, live 20:32:55Z: no branch deletion; any rebase must use a new branch name; leave pr-merge.sh -d off. No rebase or deletion is planned for this row.
|
||||
sage-2051 / mos-1193 (2026-10-21T18:45Z) explicitly orders committing and fast-forward pushing the current row196 build before its deferred full verification, then rebasing onto a36523713 on new gander/row196-r2. This supersedes the earlier no-product-commit-before-suite gate for this preservation commit only. Full acceptance remains pending. No tests until Sage says clear. Subsequent batch order: M1-M29, bus, WebUI, CLI, every whole scripts/test-*.sh; TMPDIR must be created with mktemp under /mnt/storage/scratch/tmp, never /tmp. Preserve the old branch. Row252 design may proceed while waiting; no row252 code before Webby approves.
|
||||
sage-2058 clear: clean detached 64539c96b worktree, short scratch TMPDIR, busy && before starts, pipefail and tee, mutation restoration hash and Git-status checks. M1-M22 killed; M23 rejected by broad runtime SyntaxError classification despite passing node --check, 3 pass/2 fail in killer. Stopped, restored clean, slot returned gander-0031 18:51:50Z. No suites started. sage-2063 calls stop 1; driver fix separately committed, no rerun before next clear. r2/REBASE.md records all ten conflict resolutions. Row252 design drafted, no code.
|
||||
sage-2065 clear at 18:58:34Z: base killers 14/0, wall seconds interpreter 1.470, socket 1.528, peer 2.092, focused release 7.983. M23-M27 killed, no outer timeout. M28 survived because its generic first replacement now hits upstream sso_for_target, not the intended proof insertion. Stopped before M29 or any suite, restored every file and Git status clean; sweep found 0 leftover node/tee/Python readers. Slot handed back gander-0035 at 19:01:26Z. This is stop 2, awaiting Sage ruling; no mutation fix/rerun. r2/run2/SUMMARY.md and kill-table.json preserve counts and timings. Webby approved row252 design r1; nonblocking N1-N5 recorded in queue-252/BUILD-NOTES.md; code still waits on row196 landing and PRD amendment.
|
||||
@@ -0,0 +1,10 @@
|
||||
✔ channel conversion preserves the four proof/transport byte baselines and modules cannot import a proof caller (0.85226ms)
|
||||
✔ channel recovery still requires the same shim path and rejects an absent or forged proof (308.49278ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 389.108211
|
||||
@@ -0,0 +1,12 @@
|
||||
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (2.430093ms)
|
||||
✔ process reader gets own kernel identity without exposing environment values (0.499236ms)
|
||||
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.651712ms)
|
||||
✔ real pid 1 remains inspectable when its environment is protected (0.268904ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 4
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 60.373844
|
||||
@@ -0,0 +1,28 @@
|
||||
✖ non-regular startup receipt refuses promptly without waiting on a FIFO peer (1008.229518ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 1059.700302
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/interpreter.test.mjs:69:1
|
||||
✖ non-regular startup receipt refuses promptly without waiting on a FIFO peer (1008.229518ms)
|
||||
AssertionError [ERR_ASSERTION]: unsafe FIFO must refuse without blocking startup
|
||||
|
||||
null !== 0
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/tests/interpreter.test.mjs:75:9)
|
||||
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: 0,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
✔ system Python is a resolved root-owned ELF, never a shim or home interpreter (1.874163ms)
|
||||
✔ real system interpreter is available and safely inspected (16.54588ms)
|
||||
✔ restart receipt appends actual replacement identity and refuses unsafe files (3.340596ms)
|
||||
✖ activation gate compares fresh startup receipt to the current interpreter identity (1.116553ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 70.983973
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/interpreter.test.mjs:59:1
|
||||
✖ activation gate compares fresh startup receipt to the current interpreter identity (1.116553ms)
|
||||
TypeError: verifyInterpreterReceipt is not a function
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/tests/interpreter.test.mjs:64:15)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
@@ -0,0 +1,13 @@
|
||||
✔ system Python is a resolved root-owned ELF, never a shim or home interpreter (1.992922ms)
|
||||
✔ real system interpreter is available and safely inspected (18.869225ms)
|
||||
✔ restart receipt appends actual replacement identity and refuses unsafe files (3.111417ms)
|
||||
✔ activation gate compares fresh startup receipt to the current interpreter identity (1.357978ms)
|
||||
✔ non-regular startup receipt refuses promptly without waiting on a FIFO peer (32.332597ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 105.511835
|
||||
@@ -0,0 +1,35 @@
|
||||
node:internal/modules/esm/resolve:272
|
||||
throw new ERR_MODULE_NOT_FOUND(
|
||||
^
|
||||
|
||||
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/src/interpreter.mjs' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/tests/interpreter.test.mjs
|
||||
at finalizeResolution (node:internal/modules/esm/resolve:272:11)
|
||||
at moduleResolve (node:internal/modules/esm/resolve:879:10)
|
||||
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
|
||||
at #cachedDefaultResolve (node:internal/modules/esm/loader:708:20)
|
||||
at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:728:38)
|
||||
at ModuleLoader.resolveSync (node:internal/modules/esm/loader:766:56)
|
||||
at #resolve (node:internal/modules/esm/loader:690:17)
|
||||
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:610:35)
|
||||
at ModuleJob.syncLink (node:internal/modules/esm/module_job:277:33)
|
||||
at ModuleJob.link (node:internal/modules/esm/module_job:389:17) {
|
||||
code: 'ERR_MODULE_NOT_FOUND',
|
||||
url: 'file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/src/interpreter.mjs'
|
||||
}
|
||||
|
||||
Node.js v26.8.1
|
||||
✖ packages/bus/tests/interpreter.test.mjs (29.295027ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 34.780279
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/interpreter.test.mjs:1:1
|
||||
✖ packages/bus/tests/interpreter.test.mjs (29.295027ms)
|
||||
'test failed'
|
||||
@@ -0,0 +1,13 @@
|
||||
✔ T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit (244.921933ms)
|
||||
✔ helper output and failures fail closed including unsafe gid (2.053177ms)
|
||||
✔ helper timeout, capacity and shutdown refuse without leaving children (26.359085ms)
|
||||
✔ missing or non-regular peer helper refuses at construction before opening the bus (0.377385ms)
|
||||
✔ shutdown waits for killed helper close before returning (5.980511ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 352.965488
|
||||
@@ -0,0 +1,12 @@
|
||||
✔ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (2.18658ms)
|
||||
✔ user requires its own nonce and full walk plus immediate same-tree Console parent (0.652569ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.382801ms)
|
||||
✔ human leaf identity is reread after walking the parents (0.23585ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 4
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 69.614066
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": "v24.22.0",
|
||||
"path": "/mnt/storage/scratch/tmp/g196-node24-gzFqsW/bin/node",
|
||||
"sha256": "cc2f601cee82d9a5a233302fe307abc600727035fd7d2c3a3571755989e95008",
|
||||
"source": "https://nodejs.org/dist/v24.22.0/node-v24.22.0-linux-x64.tar.xz"
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
✖ missing or non-regular peer helper refuses at construction before opening the bus (0.992412ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 73.967525
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/peercred.test.mjs:93:1
|
||||
✖ missing or non-regular peer helper refuses at construction before opening the bus (0.992412ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/tests/peercred.test.mjs:94:9)
|
||||
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: /peercred-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
✖ shutdown waits for killed helper close before returning (1.761026ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 78.151245
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/peercred.test.mjs:98:1
|
||||
✖ shutdown waits for killed helper close before returning (1.761026ms)
|
||||
AssertionError [ERR_ASSERTION]: shutdown must await the helper close event
|
||||
|
||||
0 !== 1
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/tests/peercred.test.mjs:106:9)
|
||||
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,12 @@
|
||||
✔ proof receives actual peer, cap traffic never invokes helper and transient cap disconnects (7.225507ms)
|
||||
✔ proof helper error and disconnect during verification never dispatch or bind (1.683542ms)
|
||||
✔ Client receives explicit proof refusal codes without dispatch, not outcome-unknown (50.186199ms)
|
||||
✔ asynchronous proof calls release their transient session on success, failure and timeout (28.028729ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 4
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 148.350042
|
||||
@@ -0,0 +1,50 @@
|
||||
✖ proof receives actual peer, cap traffic never invokes helper and transient cap disconnects (5.927716ms)
|
||||
✖ proof helper error and disconnect during verification never dispatch or bind (1.959972ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 57.64878
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/peer-transport.test.mjs:9:1
|
||||
✖ proof receives actual peer, cap traffic never invokes helper and transient cap disconnects (5.927716ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
false !== true
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/tests/peer-transport.test.mjs:15:9)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/bus/tests/peer-transport.test.mjs:20:1
|
||||
✖ proof helper error and disconnect during verification never dispatch or bind (1.959972ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ undefined
|
||||
- 'peercred-required'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/tests/peer-transport.test.mjs:25:9)
|
||||
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: undefined,
|
||||
expected: 'peercred-required',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
✖ T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit (10044.708285ms)
|
||||
ℹ started 9 clients
|
||||
ℹ received 9 envelopes
|
||||
ℹ read 9 peers
|
||||
ℹ received 9 replies; after 0
|
||||
✔ helper output and failures fail closed including unsafe gid (2.230205ms)
|
||||
✔ helper timeout, capacity and shutdown refuse without leaving children (25.395463ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 0
|
||||
ℹ cancelled 1
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 10137.502565
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/peercred.test.mjs:15:1
|
||||
✖ T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit (10044.708285ms)
|
||||
'test timed out after 10000ms'
|
||||
@@ -0,0 +1,13 @@
|
||||
✔ T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit (274.013965ms)
|
||||
✔ helper output and failures fail closed including unsafe gid (1.948532ms)
|
||||
✔ helper timeout, capacity and shutdown refuse without leaving children (26.176111ms)
|
||||
✔ missing or non-regular peer helper refuses at construction before opening the bus (0.331892ms)
|
||||
✔ shutdown waits for killed helper close before returning (5.788665ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 396.110405
|
||||
+6
-6
@@ -2,7 +2,7 @@ node:internal/modules/esm/resolve:272
|
||||
throw new ERR_MODULE_NOT_FOUND(
|
||||
^
|
||||
|
||||
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/mnt/storage/scratch/gt-iwfcrf5s/base/packages/library/src/mirror.mjs' imported from /mnt/storage/scratch/gt-iwfcrf5s/base/packages/library/tests/mirror.test.mjs
|
||||
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/src/peercred.mjs' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/tests/peercred.test.mjs
|
||||
at finalizeResolution (node:internal/modules/esm/resolve:272:11)
|
||||
at moduleResolve (node:internal/modules/esm/resolve:879:10)
|
||||
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
|
||||
@@ -14,11 +14,11 @@ Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/mnt/storage/scratch/gt-iwfcrf
|
||||
at ModuleJob.syncLink (node:internal/modules/esm/module_job:277:33)
|
||||
at ModuleJob.link (node:internal/modules/esm/module_job:389:17) {
|
||||
code: 'ERR_MODULE_NOT_FOUND',
|
||||
url: 'file:///mnt/storage/scratch/gt-iwfcrf5s/base/packages/library/src/mirror.mjs'
|
||||
url: 'file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/src/peercred.mjs'
|
||||
}
|
||||
|
||||
Node.js v26.8.1
|
||||
✖ packages/library/tests/mirror.test.mjs (35.196517ms)
|
||||
✖ packages/bus/tests/peercred.test.mjs (31.978232ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
@@ -26,10 +26,10 @@ Node.js v26.8.1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 41.636181
|
||||
ℹ duration_ms 37.606365
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/library/tests/mirror.test.mjs:1:1
|
||||
✖ packages/library/tests/mirror.test.mjs (35.196517ms)
|
||||
test at packages/bus/tests/peercred.test.mjs:1:1
|
||||
✖ packages/bus/tests/peercred.test.mjs (31.978232ms)
|
||||
'test failed'
|
||||
@@ -0,0 +1,15 @@
|
||||
✔ T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit (259.164726ms)
|
||||
ℹ started 9 clients
|
||||
ℹ received 9 envelopes
|
||||
ℹ read 9 peers; states false/true/false,false/true/false,false/true/false,false/true/false,false/true/false,false/true/false,false/true/false,false/true/false,false/true/false
|
||||
ℹ received 9 replies; after 9
|
||||
✔ helper output and failures fail closed including unsafe gid (1.460068ms)
|
||||
✔ helper timeout, capacity and shutdown refuse without leaving children (26.09001ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 355.364452
|
||||
@@ -0,0 +1,12 @@
|
||||
✔ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.70707ms)
|
||||
✔ user requires its own nonce and full walk plus immediate same-tree Console parent (0.585886ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.289109ms)
|
||||
✔ human leaf identity is reread after walking the parents (0.170627ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 4
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 53.605151
|
||||
+6
-6
@@ -2,7 +2,7 @@ node:internal/modules/esm/resolve:272
|
||||
throw new ERR_MODULE_NOT_FOUND(
|
||||
^
|
||||
|
||||
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/mnt/storage/scratch/gt-iwfcrf5s/base/packages/library/src/mirror.mjs' imported from /mnt/storage/scratch/gt-iwfcrf5s/base/packages/library/tests/mirror.test.mjs
|
||||
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/src/principal.mjs' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/tests/principal.test.mjs
|
||||
at finalizeResolution (node:internal/modules/esm/resolve:272:11)
|
||||
at moduleResolve (node:internal/modules/esm/resolve:879:10)
|
||||
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
|
||||
@@ -14,11 +14,11 @@ Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/mnt/storage/scratch/gt-iwfcrf
|
||||
at ModuleJob.syncLink (node:internal/modules/esm/module_job:277:33)
|
||||
at ModuleJob.link (node:internal/modules/esm/module_job:389:17) {
|
||||
code: 'ERR_MODULE_NOT_FOUND',
|
||||
url: 'file:///mnt/storage/scratch/gt-iwfcrf5s/base/packages/library/src/mirror.mjs'
|
||||
url: 'file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/bus/src/principal.mjs'
|
||||
}
|
||||
|
||||
Node.js v26.8.1
|
||||
✖ packages/library/tests/mirror.test.mjs (29.912154ms)
|
||||
✖ packages/bus/tests/principal.test.mjs (28.063196ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
@@ -26,10 +26,10 @@ Node.js v26.8.1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 35.532092
|
||||
ℹ duration_ms 33.574982
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/library/tests/mirror.test.mjs:1:1
|
||||
✖ packages/library/tests/mirror.test.mjs (29.912154ms)
|
||||
test at packages/bus/tests/principal.test.mjs:1:1
|
||||
✖ packages/bus/tests/principal.test.mjs (28.063196ms)
|
||||
'test failed'
|
||||
@@ -0,0 +1,16 @@
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (135.66144ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (72.874581ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (105.550828ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (164.1127ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (109.156675ms)
|
||||
✔ REQ-LIMIT-4 the broker process answers the launcher's mayLaunch op with the limits' awaited decision (100.062279ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (70.91343ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (105.059528ms)
|
||||
ℹ tests 8
|
||||
ℹ suites 0
|
||||
ℹ pass 8
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 913.679719
|
||||
@@ -0,0 +1,11 @@
|
||||
✔ proof startup refuses partial flags non-preview and invalid fixture file metadata or bytes (1039.716731ms)
|
||||
✔ serve argv carries only fixture proof path and header; startup explicitly reports proof on or off (241.707876ms)
|
||||
✔ CLI applies proof on the main listener and rejects that header on its tester listener (232.216606ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 1631.223267
|
||||
@@ -0,0 +1,12 @@
|
||||
✔ proxy proof admits named reads and sends, reads its fixture once, and never exposes the value (33.64167ms)
|
||||
✔ proxy proof refuses missing wrong short or repeated proof before auth and before any read (9.334211ms)
|
||||
✔ proxy proof header is refused on other Hosts and on the tester listener (4.637787ms)
|
||||
✔ proof options reject unsafe or colliding header names without disclosing file contents (0.742812ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 4
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 170.24723
|
||||
@@ -0,0 +1,2 @@
|
||||
baseline human-required
|
||||
candidate human-required
|
||||
@@ -0,0 +1,9 @@
|
||||
✔ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (5883.382797ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6639.610757
|
||||
@@ -0,0 +1,36 @@
|
||||
✖ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (6495.905564ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 7217.097801
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/stack-release.test.mjs:2088:1
|
||||
✖ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (6495.905564ms)
|
||||
AssertionError [ERR_ASSERTION]: stack-release: interpreter: {"path":"/usr/bin/python3","sha256":"fixture"}
|
||||
stack-release: captured the rollback set: /mnt/storage/scratch/tmp/sr-eLxVuy/data-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/state/stack-rollback/20261020T201023Z-bb03a6447dc9
|
||||
stack-release: stopped both units
|
||||
stack-release: stopped store schema: 3g
|
||||
stack-release: backup: /mnt/storage/scratch/tmp/sr-eLxVuy/data-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/backups/stack/20261020T201023Z-bb03a6447dc9
|
||||
stack-release: installed bb03a6447dc98f172cbd28c2fbab126b37ff69c3
|
||||
stack-release: gate passed on bb03a6447dc98f172cbd28c2fbab126b37ff69c3
|
||||
stack-release: activate ok: bb03a6447dc98f172cbd28c2fbab126b37ff69c3 is live for acme
|
||||
|
||||
|
||||
0 !== 3
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/stack-release.test.mjs:2108:9)
|
||||
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,9 @@
|
||||
✔ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (5160.650984ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6043.67883
|
||||
@@ -0,0 +1,43 @@
|
||||
✖ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (3046.881963ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3691.652388
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/stack-release.test.mjs:2088:1
|
||||
✖ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (3046.881963ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
[
|
||||
'--port',
|
||||
'43495',
|
||||
'--business',
|
||||
'acme',
|
||||
...
|
||||
'jason',
|
||||
+ '--tester-socket',
|
||||
'--proof-header',
|
||||
'x-console-proof',
|
||||
'--proof-file',
|
||||
'/mnt/storage/scratch/tmp/sr-fLVpjD/proof.187',
|
||||
- '--tester-socket'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/stack-release.test.mjs:2102:9)
|
||||
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: [ '--port', '43495', '--business', 'acme', '--public-host', 'console.example', '--auth-header', 'x-user', '--allow-user', 'jason', '--tester-socket', '--proof-header', 'x-console-proof', '--proof-file', '/mnt/storage/scratch/tmp/sr-fLVpjD/proof.187' ],
|
||||
expected: [ '--port', '43495', '--business', 'acme', '--public-host', 'console.example', '--auth-header', 'x-user', '--allow-user', 'jason', '--proof-header', 'x-console-proof', '--proof-file', '/mnt/storage/scratch/tmp/sr-fLVpjD/proof.187', '--tester-socket' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
✔ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (4452.603661ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 5183.817431
|
||||
@@ -0,0 +1,36 @@
|
||||
✖ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (2938.271119ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3279.087225
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/stack-release.test.mjs:2088:1
|
||||
✖ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (2938.271119ms)
|
||||
AssertionError [ERR_ASSERTION]: stack-release: captured the rollback set: /mnt/storage/scratch/tmp/sr-QgMOBP/data/state/stack-rollback/20261020T194438Z-6e9ce64cf63b
|
||||
stack-release: drop --tester-port 7333; the target Console does not support it
|
||||
stack-release: stopped both units
|
||||
stack-release: stopped store schema: 3g
|
||||
stack-release: backup: /mnt/storage/scratch/tmp/sr-QgMOBP/data/backups/stack/20261020T194438Z-6e9ce64cf63b
|
||||
stack-release: installed 6e9ce64cf63b125d007476844c4d695a308514d8
|
||||
stack-release: gate passed on 6e9ce64cf63b125d007476844c4d695a308514d8
|
||||
stack-release: activate ok: 6e9ce64cf63b125d007476844c4d695a308514d8 is live for acme
|
||||
|
||||
|
||||
0 !== 3
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/stack-release.test.mjs:2095:45)
|
||||
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,9 @@
|
||||
✔ row196 socket flag renders only for supporting targets and refuses mixed transports (16.910871ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 77.189844
|
||||
@@ -0,0 +1,32 @@
|
||||
✖ row196 socket flag renders only for supporting targets and refuses mixed transports (7.489228ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 75.646616
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/service.test.mjs:812:1
|
||||
✖ row196 socket flag renders only for supporting targets and refuses mixed transports (7.489228ms)
|
||||
AssertionError [ERR_ASSERTION]: usage: scripts/webui-service.sh copy COMMIT [--copies DIR] [--allow-worktree] | render [--copy ID [--copies DIR]] [FLAGS] | install --copy ID [--copies DIR] [--dir DIR] [--no-reload] [--allow-worktree] [FLAGS] | uninstall [--dir DIR] [--no-reload] | status [--dir DIR]
|
||||
FLAGS: [--port N] [--business ID] [--board URL] [--public-host NAME --auth-header HEADER --allow-user ID [--send]] [--tester-port N] [--proof-header NAME --proof-file PATH]
|
||||
--tester-port: 1024..65535, different from --port and never 7332; loopback tester listener.
|
||||
--allow-worktree is for the tests only: copy and install otherwise refuse outside the canonical checkout.
|
||||
|
||||
|
||||
4 !== 0
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/service.test.mjs:815:9)
|
||||
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: 4,
|
||||
expected: 0,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
✔ tester service render carries the tester port alongside existing flags (24.94035ms)
|
||||
✔ tester service refuses forwarded 7332 even with another main port (9.82912ms)
|
||||
✔ tester service invalid ports refuse render and install with exit 4 and leave the unit alone (104.005996ms)
|
||||
✔ tester service counts the digits as written before it strips leading zeros (10.30812ms)
|
||||
✔ tester service install and status show the tester port without changing send reporting (205.553924ms)
|
||||
✔ render prints the unit without the preview flags (7.561049ms)
|
||||
✔ render carries every serve flag, the preview set included (6.973808ms)
|
||||
✔ a partial preview set is refused (16.637515ms)
|
||||
✔ a value the unit cannot carry is refused, for every flag (256.274405ms)
|
||||
✔ the rendered unit names none of the human proof agent markers and sets no agent variable (16.730737ms)
|
||||
✔ install into --dir with --no-reload writes the file whole, then reports unchanged (48.962613ms)
|
||||
✔ install without --no-reload runs daemon-reload and nothing that starts the unit (20.812535ms)
|
||||
✔ uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not (109.285453ms)
|
||||
✔ status prints the unit state and GET /healthz on the installed port (162.506277ms)
|
||||
✔ usage: an unknown verb or flag, and start or enable, exit 4 (59.94317ms)
|
||||
✔ without --send, render is the template with its placeholders filled, byte for byte (32.400878ms)
|
||||
✔ render --send with the preview set ends ExecStart with --send and changes nothing else (52.094309ms)
|
||||
✔ --send without the whole preview set is refused and writes nothing (131.187356ms)
|
||||
✔ install --send into --dir with --no-reload writes the sending unit, and status says whether it sends (215.263849ms)
|
||||
✔ uninstall and status take no --send (29.745082ms)
|
||||
✔ install refuses while the unit is running, in any state but inactive or failed, and changes nothing (248.230583ms)
|
||||
✔ when the state read fails, install and uninstall refuse with one line and change nothing (71.067475ms)
|
||||
✔ install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree (63.261377ms)
|
||||
✔ install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing (235.658605ms)
|
||||
✔ render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged (19.314052ms)
|
||||
✔ the uid header takes only an Authentik uid; the username header still takes a username (300.432846ms)
|
||||
✔ a preview value cannot start with - or . (28.388974ms)
|
||||
✔ status names the copy and whether refactor has moved past it, and says when the unit runs from no copy (388.565391ms)
|
||||
✔ proxy proof render carries both flags but never opens the fixture file (10.105723ms)
|
||||
✔ proxy proof render refuses incomplete non-preview missing unsafe-mode and repo/copy paths (80.016026ms)
|
||||
✔ proxy proof status retains send and tester reporting with both proof flags (97.518111ms)
|
||||
✔ row196 socket flag renders only for supporting targets and refuses mixed transports (18.052409ms)
|
||||
ℹ tests 32
|
||||
ℹ suites 0
|
||||
ℹ pass 32
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3155.23567
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"bus": {
|
||||
"top_level_passes_observed": 464,
|
||||
"top_level_failures": 0,
|
||||
"final_pass_count": [
|
||||
"464"
|
||||
],
|
||||
"interrupted": false
|
||||
},
|
||||
"webui": {
|
||||
"top_level_passes_observed": 269,
|
||||
"top_level_failures": 2,
|
||||
"final_pass_count": [],
|
||||
"interrupted": true
|
||||
},
|
||||
"mutants_executed": 0,
|
||||
"cli_started": false
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,83 @@
|
||||
[
|
||||
{
|
||||
"package": "bus",
|
||||
"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/credential-status.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/hard-waits.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/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/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/evidence/suite-bus.tap",
|
||||
"failures": 1,
|
||||
"stopped": false,
|
||||
"code": 1,
|
||||
"signal": null
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,143 @@
|
||||
[
|
||||
{
|
||||
"package": "bus",
|
||||
"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/credential-status.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/hard-waits.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/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/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/evidence/suite-bus.tap",
|
||||
"failures": 0,
|
||||
"stopped": false,
|
||||
"code": 0,
|
||||
"signal": null
|
||||
},
|
||||
{
|
||||
"package": "webui",
|
||||
"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/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/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/evidence/suite-webui.tap",
|
||||
"failures": 2,
|
||||
"stopped": true,
|
||||
"code": 1,
|
||||
"signal": null
|
||||
}
|
||||
]
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,10 @@
|
||||
✔ tester Console banner exposes only instance route and name editors and saves a route as tester (903.47494ms)
|
||||
✔ row 177: the tester Console chat composer is enabled and a send shows in its own thread (779.82198ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 1835.567916
|
||||
@@ -0,0 +1,29 @@
|
||||
✖ tester cleanup must leave a replacement inode untouched (4.588498ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 77.335255
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/tester-socket.test.mjs:31:1
|
||||
✖ tester cleanup must leave a replacement inode untouched (4.588498ms)
|
||||
AssertionError [ERR_ASSERTION]: closing the listener must not unlink a replacement inode
|
||||
|
||||
false !== true
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/tester-socket.test.mjs:40:9)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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: false,
|
||||
expected: true,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
✔ tester cleanup must leave a replacement inode untouched (4.721014ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 69.761924
|
||||
@@ -0,0 +1,29 @@
|
||||
✖ tester cleanup must leave a replacement inode untouched (5.181827ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 70.292577
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/tester-socket.test.mjs:31:1
|
||||
✖ tester cleanup must leave a replacement inode untouched (5.181827ms)
|
||||
AssertionError [ERR_ASSERTION]: closing the listener must not unlink a replacement inode
|
||||
|
||||
false !== true
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/tester-socket.test.mjs:41:9)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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: false,
|
||||
expected: true,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
✔ tester-port validates range tunnel main port and requires configured bus before listening (842.750345ms)
|
||||
✔ CLI tester listener binds a private Unix socket and spawns TESTER_CLI for every Console bus read (2447.891251ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3426.404641
|
||||
@@ -0,0 +1,10 @@
|
||||
✔ tester HTTP helper uses instance socket, logical origin and JSON without retrying (16.169258ms)
|
||||
✔ tester HTTP timeout closes the socket and does not retry (24.057725ms)
|
||||
ℹ tests 2
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 109.82809
|
||||
@@ -0,0 +1,18 @@
|
||||
✔ main listener refuses x-mosaic-tester before any board or bus read for every Host (17.594021ms)
|
||||
✔ tester listener rejects preview binding and requires its fixed logical Host and no proxy auth header (97.026908ms)
|
||||
✔ tester listener writes only instances routes and names with tester receipts and actor (102.526377ms)
|
||||
✔ tester listener refuses every human-only write with no bus call (74.180878ms)
|
||||
✔ tester-off and tester-required reads return HTTP 403 (72.172231ms)
|
||||
✔ tester credentials routes and committed project reads keep secrets and paths bounded (139.034531ms)
|
||||
✔ row 177 W1: the tester chat makes, sends to, opens and reads its own thread as tester (19.236645ms)
|
||||
✔ row 177 W2: tester chat writes refuse a missing or foreign Origin, cross-site, text/plain and the proxy header with no bus call (9.497407ms)
|
||||
✔ row 177 W3: the human thread through the tester chat is thread-not-owned, and bus.tester off answers tester-off (22.342419ms)
|
||||
✔ row 177 W4: the main listener refuses x-mosaic-tester on chat reads and writes before the chat (1.907ms)
|
||||
ℹ tests 10
|
||||
ℹ suites 0
|
||||
ℹ pass 10
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 677.96388
|
||||
@@ -0,0 +1,11 @@
|
||||
✔ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (56.084397ms)
|
||||
✔ private tester refuses symlink, unsafe parent and long path without repairs (0.822118ms)
|
||||
✔ tester cleanup must leave a replacement inode untouched (1.433318ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 119.311098
|
||||
@@ -0,0 +1,35 @@
|
||||
node:internal/modules/esm/resolve:272
|
||||
throw new ERR_MODULE_NOT_FOUND(
|
||||
^
|
||||
|
||||
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/src/tester-socket.mjs' imported from /home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/tester-socket.test.mjs
|
||||
at finalizeResolution (node:internal/modules/esm/resolve:272:11)
|
||||
at moduleResolve (node:internal/modules/esm/resolve:879:10)
|
||||
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
|
||||
at #cachedDefaultResolve (node:internal/modules/esm/loader:708:20)
|
||||
at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:728:38)
|
||||
at ModuleLoader.resolveSync (node:internal/modules/esm/loader:766:56)
|
||||
at #resolve (node:internal/modules/esm/loader:690:17)
|
||||
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:610:35)
|
||||
at ModuleJob.syncLink (node:internal/modules/esm/module_job:277:33)
|
||||
at ModuleJob.link (node:internal/modules/esm/module_job:389:17) {
|
||||
code: 'ERR_MODULE_NOT_FOUND',
|
||||
url: 'file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/src/tester-socket.mjs'
|
||||
}
|
||||
|
||||
Node.js v26.8.1
|
||||
✖ packages/webui/tests/tester-socket.test.mjs (33.788429ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 42.005573
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/tester-socket.test.mjs:1:1
|
||||
✖ packages/webui/tests/tester-socket.test.mjs (33.788429ms)
|
||||
'test failed'
|
||||
@@ -0,0 +1,22 @@
|
||||
✔ the tester binds only when the business sets bus.tester to exactly true (61.599223ms)
|
||||
✔ a business may not name a role tester, so the tester address is never a role (17.534761ms)
|
||||
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (37.114694ms)
|
||||
✔ a tester message is from tester, needs no prefix, and writes no human.input or authority (14.658214ms)
|
||||
✔ a tester message to a role no run holds refuses tester-target-not-running and stores nothing (10.010587ms)
|
||||
✔ a tester message is refused while the run is only launched, and routes once it claims (11.801045ms)
|
||||
✔ a human message to a role no run holds still waits and tells launch.by (9.843013ms)
|
||||
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (21.065845ms)
|
||||
✔ the tester reads the human views a reader reads (23.085923ms)
|
||||
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.132907ms)
|
||||
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.338746ms)
|
||||
✔ testerNonce reads only the tester's variable and gives null on any read error (0.167036ms)
|
||||
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (82.495712ms)
|
||||
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (949.011498ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 14
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 1344.0805
|
||||
@@ -0,0 +1,13 @@
|
||||
✔ socket capability stamps launch identity; shared views use wire, no SQL client (55.397456ms)
|
||||
✔ two wire claims serialize; a lost reply never automatically retries (48.315452ms)
|
||||
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (34.817302ms)
|
||||
✔ client preserves UTF-8 when a response divides a multibyte character (11.903844ms)
|
||||
✔ committed mutation followed by dropped reply reports unknown and is never retried (29.646174ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 288.566303
|
||||
@@ -0,0 +1,18 @@
|
||||
✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (67.351635ms)
|
||||
✔ decisions route serves the roles and recent lists from the reader view (32.001579ms)
|
||||
✔ credentials route serves the broker credential status from the reader view (11.335934ms)
|
||||
✔ replies route serves the replies to one message from the reader view (33.381558ms)
|
||||
✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (56.18236ms)
|
||||
✔ bus refusals map to statuses and never carry a path or a stack (26.580535ms)
|
||||
✔ humanCall speaks the human transport protocol without blocking the server (1664.225925ms)
|
||||
✔ busReader takes --business, else the live bus host, else refuses (179.394177ms)
|
||||
✔ humanCall kills a transport that runs past its timeout (527.236263ms)
|
||||
✔ serve refuses a --business value that is not a business id (267.848133ms)
|
||||
ℹ tests 10
|
||||
ℹ suites 0
|
||||
ℹ pass 10
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3002.288149
|
||||
@@ -0,0 +1,16 @@
|
||||
// Synchronous mutation preparation only. No file is written until every replacement is unique.
|
||||
export function guardMutation(input, mutate, { auditOnly = false } = {}) {
|
||||
const targets = [];
|
||||
class UniqueText extends String {
|
||||
replace(target, replacement) { return this.applyReplacement('replace', target, replacement); }
|
||||
replaceAll(target, replacement) { return this.applyReplacement('replaceAll', target, replacement); }
|
||||
applyReplacement(method, target, replacement) {
|
||||
if (typeof target !== 'string' || !target) throw Error('mutation target must be a nonempty string');
|
||||
const source = String(this), count = source.split(target).length - 1;
|
||||
targets.push({ method, target, count });
|
||||
if (count !== 1 && !auditOnly) throw Error(`mutation target occurs ${count} times, expected exactly once: ${target}`);
|
||||
return new UniqueText(String.prototype[method].call(source, target, replacement));
|
||||
}
|
||||
}
|
||||
return { text: String(mutate(new UniqueText(input))), targets };
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
import { guardMutation } from './mutant-guard.mjs';
|
||||
// Authorized batch only. Mutate isolated scratch copies, never the candidate or installed tree.
|
||||
import {mkdtempSync,cpSync,readFileSync,writeFileSync,rmSync,symlinkSync,existsSync,mkdirSync} from 'node:fs';
|
||||
import {tmpdir} from 'node:os';import {join,resolve} from 'node:path';
|
||||
import {spawnSync,execFileSync} from 'node:child_process';import {createHash} from 'node:crypto';
|
||||
import {fileURLToPath} from 'node:url';
|
||||
const root=fileURLToPath(new URL('../../../../',import.meta.url));
|
||||
const out=join(root,'agents/gander/work/queue-196/evidence/mutants');mkdirSync(out,{recursive:true});
|
||||
const p='packages/bus/src/principal.mjs',h='packages/bus/src/human.mjs',w='packages/webui/src/tester-socket.mjs',s='packages/bus/src/server.mjs',peer='packages/bus/src/peercred.mjs';
|
||||
const principal='packages/bus/tests/principal.test.mjs',socket='packages/webui/tests/tester-socket.test.mjs',transport='packages/bus/tests/peer-transport.test.mjs',interpreter='packages/bus/tests/interpreter.test.mjs';
|
||||
const release=['--test-name-pattern=row196 explicit socket','packages/cli/tests/stack-release.test.mjs'];
|
||||
const specs=[
|
||||
['M1', 'packages/webui/src/serve.mjs','tester uses TCP',socket, text=>text.replace('if (tester) return bindTesterSocket(server, testerSocket);',"if (tester) return new Promise(r=>server.listen(0,'127.0.0.1',()=>r(server)));" )],
|
||||
['M2',w,'socket mode widened',socket,t=>t.replace('chmodSync(temporary, 0o600)','chmodSync(temporary, 0o666)')],
|
||||
['M3','packages/webui/src/serve.mjs','sign-in accepted on tester',socket,t=>t.replace("if (tester && (Object.hasOwn(req.headers, 'authorization')", "if (false && (Object.hasOwn(req.headers, 'authorization')")],
|
||||
['M4',p,'copied PID accepted',principal,t=>t.replace('peer.pid !== proof.pid','false')],
|
||||
['M5',peer,'helper parse error ignored','packages/bus/tests/peercred.test.mjs',t=>t.replace('finish(false, Object.freeze(p));\n } catch { finish(true); }','finish(false, Object.freeze(p));\n } catch { finish(false, {pid:2,uid:0,gid:0}); }')],
|
||||
['M6',p,'foreign uid accepted',principal,t=>t.replace('peer.uid !== process.getuid()','false')],
|
||||
['M7',w,'unsafe parent accepted',socket,t=>t.replace('(dir.mode & 0o077)','false')],
|
||||
['M8',h,'agent environment walk skipped',principal,t=>t.replace('current.env !== null && MARKERS.some','false && MARKERS.some')],
|
||||
['M9',h,'leaf identity not reread',principal,t=>t.replace('if (again.startTime !== proof.startTime || again.ppid !== p.ppid)','if (false)')],
|
||||
['M10',p,'Console direct-parent check removed',principal,t=>t.replace("if (parent.uid !== peer.uid || parent.argv[1] !== resolve(paths.console) || parent.argv[2] !== 'serve')",'if (false)')],
|
||||
['M11',p,'Console basename accepted',principal,t=>t.replace("import { resolve }", "import { resolve, basename }").replace('parent.argv[1] !== resolve(paths.console)','basename(parent.argv[1] ?? "") !== basename(paths.console)')],
|
||||
['M12',h,'unknown proof identity accepted',principal,t=>t.replace("Object.keys(proof).some((k) => !['pid', 'startTime', 'nonce', 'business'].includes(k))",'false')],
|
||||
['M13',s,'transient cap leaked',transport,t=>t.replace('broker.disconnect(boundCap)','void(boundCap)')],
|
||||
['M14',p,'tester walk used for user',principal,t=>t.replace("verifyHuman(checked, { cliPath: paths[kind], launches, readProcess,\n nonceKey: kind === 'user' ? 'MOSAIC_BUS_USER_NONCE' : 'MOSAIC_BUS_CLI_NONCE' })",'verifyTester(checked, {cliPath:paths[kind],launches,readProcess,readNonce:()=>checked.nonce})')],
|
||||
['M15','scripts/stack-release.sh','TCP retained during conversion',release,t=>t.replace('RUN_CONSOLE=("${without_tester[@]}" --tester-socket)','RUN_CONSOLE=("${BASE_CONSOLE[@]}" --tester-socket)')],
|
||||
['M16','scripts/stack-release.sh','TCP reopened on downgrade',release,t=>t.replace('RUN_CONSOLE=("${without_tester[@]}") DROP_TESTER="--tester-socket','RUN_CONSOLE=("${without_tester[@]}" --tester-port 7333) DROP_TESTER="--tester-socket')],
|
||||
['M17','packages/bus/src/broker.mjs','tester switch ignored','packages/bus/tests/tester.test.mjs',t=>t.replace("if (this.#business(record.business).vars?.['bus.tester'] !== true)",'if (false)')],
|
||||
['M18',p,'user kind becomes owner',principal,t=>t.replace("return { kind: 'user', business, id: proof.user }","return { kind: 'owner', business, id: proof.user }")],
|
||||
['M19','packages/cli/src/tester-http.mjs','selected instance root ignored',socket,t=>t.replace('socketPath: testerSocketPath(dataRoot)','socketPath: testerSocketPath(dataRoot + "/wrong-instance")')],
|
||||
['M20',peer,'helper gets another pending socket','packages/bus/tests/peercred.test.mjs',t=>t.replace('export function createPeerReader','function originalPeerReader')+`\nexport function createPeerReader(options){const base=originalPeerReader(options),queue=[];let scheduled=false;return{read(socket){return new Promise((resolve,reject)=>{queue.push({socket,resolve,reject});if(!scheduled){scheduled=true;queueMicrotask(()=>{scheduled=false;const jobs=queue.splice(0);jobs.forEach((job,i)=>base.read(jobs[(i+1)%jobs.length].socket).then(job.resolve,job.reject));});}});},close(){base.close();}};}\n`],
|
||||
['M21','packages/bus/src/interpreter.mjs','user-owned interpreter accepted',interpreter,t=>t.replace('s.uid !== 0 || (s.mode & 0o022)','false || (s.mode & 0o022)')],
|
||||
['M22',s,'cap requests invoke helper',transport,t=>t.replace(' if (kind) {',' if (r.cap) await peers.read(socket);\n if (kind) {')],
|
||||
['M23','packages/bus/src/interpreter.mjs','restart retains stale identity',interpreter,t=>t.replace('export function recordInterpreterStart(directory, record) {','export function recordInterpreterStart(directory, record) {\n try { readFileSync(join(directory,"peercred-starts.jsonl")); return; } catch {}')],
|
||||
['M24',w,'listener binds final path directly',socket,t=>t.replace("const temporary = join(parent, '.' + randomBytes(4).toString('hex') + '.s');",'const temporary = path;')],
|
||||
['M25','packages/bus/src/interpreter.mjs','FIFO receipt blocks before type refusal',['--test-name-pattern=non-regular startup receipt',interpreter],t=>t.replace('constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT | constants.O_NOFOLLOW | constants.O_NONBLOCK, 0o600','constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT | constants.O_NOFOLLOW, 0o600')],
|
||||
['M26',peer,'missing helper accepted at startup',['--test-name-pattern=missing or non-regular peer helper','packages/bus/tests/peercred.test.mjs'],t=>t.replace('if (!s.isFile() || s.isSymbolicLink()) throw Error();','if (false) throw Error();').replace('catch { throw refused(); }','catch {}')],
|
||||
['M27',peer,'shutdown returns before helpers are reaped',['--test-name-pattern=shutdown waits','packages/bus/tests/peercred.test.mjs'],t=>t.replace(" await Promise.all([...children].map(child => new Promise(resolve => {\n child.once('close', resolve);\n child.kill('SIGKILL');\n })));"," for (const child of children) child.kill('SIGKILL');")],
|
||||
['M28','scripts/stack-release.sh','proof pair placed after tester socket flag',release,t=>t.replace('case "${without_proof[i]}" in --send | --tester-port | --tester-socket) break','case "${without_proof[i]}" in --send | --tester-port) break')],
|
||||
['M28b','scripts/stack-release.sh','SSO placed after tester socket flag',['--test-name-pattern=row196 SSO socket','packages/cli/tests/stack-release.test.mjs'],t=>t.replace('case "${kept[i]}" in --send | --tester-port | --tester-socket) break','case "${kept[i]}" in --send | --tester-port) break')],
|
||||
['M29','scripts/stack-release.sh','unsafe tester path reaches service stop',release,t=>t.replace(t.split('\n').find(line=>line.includes('|| check_refuse tester-socket-path'))+'\n','')],
|
||||
];
|
||||
const hash=x=>createHash('sha256').update(x).digest('hex');
|
||||
const results=[];
|
||||
for (const [id,file,,,mutate] of specs) {
|
||||
try { guardMutation(readFileSync(join(root,file),'utf8'),mutate); }
|
||||
catch(error) { throw Error(id+': '+error.message); }
|
||||
}
|
||||
const scratch=mkdtempSync(join(tmpdir(),'g196-mut-'));
|
||||
try {
|
||||
for(const name of ['packages','scripts','adapters','roles','contracts','RELEASE','package.json','package-lock.json','.git'])if(existsSync(join(root,name)))cpSync(join(root,name),join(scratch,name),{recursive:true,filter:src=>!src.includes('/node_modules/')&&!src.endsWith('/node_modules')});
|
||||
symlinkSync(join(root,'node_modules'),join(scratch,'node_modules'));
|
||||
for(const [id,file,description,test,mutate] of specs) {
|
||||
const at=join(scratch,file),original=readFileSync(at,'utf8'),before=hash(original),changed=guardMutation(original,mutate).text;
|
||||
if(changed===original)throw Error(id+' did not change bytes');
|
||||
writeFileSync(at,changed);
|
||||
const syntax=spawnSync(file.endsWith('.sh')?'bash':process.execPath,[file.endsWith('.sh')?'-n':'--check',at],{encoding:'utf8'});
|
||||
if(syntax.status!==0)throw Error(id+' invalid mutation: '+syntax.stderr);
|
||||
const args=['--test',...(Array.isArray(test)?test:[test])];
|
||||
const run=spawnSync(process.execPath,args,{cwd:scratch,encoding:'utf8',timeout:30000,maxBuffer:2*1024*1024});
|
||||
const log=(run.stdout??'')+(run.stderr??'');writeFileSync(join(out,id+'.txt'),log);
|
||||
writeFileSync(at,original);if(hash(readFileSync(at))!==before)throw Error(id+' restore hash failed');
|
||||
const failed=/[ℹ#]\s*(?:fail|tests failed)\s+[1-9]/.test(log) || /✖/.test(log);
|
||||
// Syntax validity is decided exclusively by the node --check preflight above.
|
||||
const killed=run.status!==0&&failed;
|
||||
const result={id,description,test,args,status:run.status,signal:run.signal,killed,restoredSha256:before};results.push(result);
|
||||
writeFileSync(join(out,'results.json'),JSON.stringify(results,null,2)+'\n');
|
||||
console.log(id+' '+(killed?'KILLED':'SURVIVED/INVALID'));
|
||||
if(!killed) {process.exitCode=1;break;}
|
||||
}
|
||||
} finally {rmSync(scratch,{recursive:true,force:true});}
|
||||
@@ -0,0 +1,55 @@
|
||||
# Row 196 r2 rebase and gate record
|
||||
|
||||
Preservation: caf5c9b71b7ffe3e1a195c50a96439cb1d94bb0f, fast-forward pushed
|
||||
on gander/row196 per sage-2051 / mos-1193. Stat against 4d26003f7:
|
||||
93 files changed, 9940 insertions(+), 178 deletions(-).
|
||||
Rebased candidate: 64539c96bb9eb34ff0cce6ab2e04410041a2a31e, on a36523713,
|
||||
pushed as new gander/row196-r2. Old branch preserved. No force push or deletion.
|
||||
range-diff.txt and patch-id-{before,after}.txt hold the exact comparison.
|
||||
Stable patch ids differ: 294d45c6c8494e83e4276a8c554fcbe85674f3d0 before;
|
||||
fb96c71db3715d7ea766b278377c4f215ba1537b after.
|
||||
|
||||
## 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.
|
||||
|
||||
## First r2 slot, sage-2058
|
||||
|
||||
Clean detached worktree pinned to 64539c96b, linked node_modules. paths.txt
|
||||
records it and the short mktemp TMPDIR under /mnt/storage/scratch/tmp. Product
|
||||
tracked files stayed clean; node_modules is the expected untracked symlink.
|
||||
The external driver creates an isolated Git snapshot for mutations and checks
|
||||
both the original file hash and empty Git status after every restoration.
|
||||
Every test start uses busy.py gated with &&, pipefail and tee. busy.py retains
|
||||
canonical busy detections and excludes only its own process ancestors, which
|
||||
would otherwise match the driver's command text. No other test process is
|
||||
whitelisted.
|
||||
|
||||
M1-M22 killed. M23 syntax preflight passed; the whole interpreter killer file
|
||||
reported 3 pass/2 fail. The old driver rejected its runtime JSON SyntaxError as
|
||||
invalid, so stopped before M24. M23 also made the FIFO child hit its own one
|
||||
second timeout. No golden package or shell suite started. All 23 restorations
|
||||
passed hash and clean-status checks. batch.log and mutants/results.json retain
|
||||
the original classification, not retrospectively edited. Slot handed back in
|
||||
gander-0031 at 2026-10-21T18:51:50Z. Sage calls this stop 1 (sage-2063).
|
||||
|
||||
Next run requires Sage's next clear, after Morgana's row243 singles. M1-M22
|
||||
stand under sage-2063, pending the separate driver correction. Rerun M23-M29,
|
||||
then whole bus/WebUI/CLI suites and all ten whole scripts/test-*.sh. A second
|
||||
stop goes to Sage before any rerun; a third goes to Mos. No acceptance claim.
|
||||
@@ -0,0 +1,23 @@
|
||||
M1 KILLED
|
||||
M2 KILLED
|
||||
M3 KILLED
|
||||
M4 KILLED
|
||||
M5 KILLED
|
||||
M6 KILLED
|
||||
M7 KILLED
|
||||
M8 KILLED
|
||||
M9 KILLED
|
||||
M10 KILLED
|
||||
M11 KILLED
|
||||
M12 KILLED
|
||||
M13 KILLED
|
||||
M14 KILLED
|
||||
M15 KILLED
|
||||
M16 KILLED
|
||||
M17 KILLED
|
||||
M18 KILLED
|
||||
M19 KILLED
|
||||
M20 KILLED
|
||||
M21 KILLED
|
||||
M22 KILLED
|
||||
M23 SURVIVED/INVALID
|
||||
@@ -0,0 +1,15 @@
|
||||
import os,subprocess,sys
|
||||
ancestors=set();pid=os.getpid()
|
||||
while pid>1 and pid not in ancestors:
|
||||
ancestors.add(pid)
|
||||
try:pid=int(open('/proc/%s/stat'%pid).read().rsplit(')',1)[1].split()[1])
|
||||
except (OSError,ValueError):break
|
||||
r=subprocess.run(['bash','/mnt/storage/scratch/sage-busy-now.sh'],capture_output=True,text=True)
|
||||
other=[]
|
||||
for line in r.stdout.splitlines():
|
||||
if line.startswith('BUSY '):
|
||||
try:pid=int(line.split()[1].rstrip(':'))
|
||||
except ValueError:other.append(line);continue
|
||||
if pid not in ancestors:other.append(line)
|
||||
if other:print('\n'.join(other));sys.exit(1)
|
||||
print('CLEAR (current driver ancestors excluded)')
|
||||
@@ -0,0 +1,47 @@
|
||||
diff --git a/agents/gander/work/queue-196/BUILD.md b/agents/gander/work/queue-196/BUILD.md
|
||||
index 72e359134..1deba067c 100644
|
||||
--- a/agents/gander/work/queue-196/BUILD.md
|
||||
+++ b/agents/gander/work/queue-196/BUILD.md
|
||||
@@ -98,3 +98,5 @@ the fixture verifies no start/stop calls for unsafe mode. M29 removes the check.
|
||||
Legacy tester-port-invalid wording is restored to avoid an unrelated contract
|
||||
change. Review covered all changed trust paths and consumers; no further code
|
||||
changes are planned before the batch. M1-M29 remain prepared and unexecuted.
|
||||
+
|
||||
+2026-10-21 sage-2063: driver uses only node --check for syntax validity; runtime test failures count as kills, and the r2 driver records GNU timeout process-group TERM/KILL exits so blocked descendants cannot survive. No rerun before next clear.
|
||||
diff --git a/agents/gander/work/queue-196/mutants.mjs b/agents/gander/work/queue-196/mutants.mjs
|
||||
index 95b216d3a..a3342f63d 100644
|
||||
--- a/agents/gander/work/queue-196/mutants.mjs
|
||||
+++ b/agents/gander/work/queue-196/mutants.mjs
|
||||
@@ -56,7 +56,8 @@ try {
|
||||
const log=(run.stdout??'')+(run.stderr??'');writeFileSync(join(out,id+'.txt'),log);
|
||||
writeFileSync(at,original);if(hash(readFileSync(at))!==before)throw Error(id+' restore hash failed');
|
||||
const failed=/[ℹ#]\s*(?:fail|tests failed)\s+[1-9]/.test(log) || /✖/.test(log);
|
||||
- const killed=run.status!==0&&failed&&!/SyntaxError|ERR_MODULE_NOT_FOUND/.test(log);
|
||||
+ // Syntax validity is decided exclusively by the node --check preflight above.
|
||||
+ const killed=run.status!==0&&failed;
|
||||
const result={id,description,test,args,status:run.status,signal:run.signal,killed,restoredSha256:before};results.push(result);
|
||||
writeFileSync(join(out,'results.json'),JSON.stringify(results,null,2)+'\n');
|
||||
console.log(id+' '+(killed?'KILLED':'SURVIVED/INVALID'));
|
||||
diff --git a/agents/gander/work/queue-196/r2/driver.mjs b/agents/gander/work/queue-196/r2/driver.mjs
|
||||
index 6f80b6546..508fa4ad3 100644
|
||||
--- a/agents/gander/work/queue-196/r2/driver.mjs
|
||||
+++ b/agents/gander/work/queue-196/r2/driver.mjs
|
||||
@@ -53,12 +53,15 @@ try {
|
||||
const syntax=spawnSync(file.endsWith('.sh')?'bash':process.execPath,[file.endsWith('.sh')?'-n':'--check',at],{encoding:'utf8'});
|
||||
if(syntax.status!==0)throw Error(id+' invalid mutation: '+syntax.stderr);
|
||||
const args=['--test',...(Array.isArray(test)?test:[test])];
|
||||
- const run=spawnSync('bash',['-c','set -o pipefail; python3 "$G196_BUSY" && "$G196_NODE" "$@" 2>&1 | tee "$G196_LOG"','--',...args],{cwd:scratch,env:{...process.env,G196_NODE:process.execPath,G196_LOG:join(out,id+'.txt')},encoding:'utf8',timeout:60000,maxBuffer:2*1024*1024});
|
||||
+ const run=spawnSync('timeout',['--signal=TERM','--kill-after=2s','60s','bash','-c','set -o pipefail; python3 "$G196_BUSY" && "$G196_NODE" "$@" 2>&1 | tee "$G196_LOG"','--',...args],{cwd:scratch,env:{...process.env,G196_NODE:process.execPath,G196_LOG:join(out,id+'.txt')},encoding:'utf8',maxBuffer:2*1024*1024});
|
||||
const log=(run.stdout??'')+(run.stderr??'');writeFileSync(join(out,id+'.txt'),log);
|
||||
writeFileSync(at,original);const clean=execFileSync('git',['status','--porcelain'],{cwd:scratch,encoding:'utf8'});if(clean.trim())throw Error(id+' dirty restored tree: '+clean);if(hash(readFileSync(at))!==before)throw Error(id+' restore hash failed');
|
||||
const failed=/[ℹ#]\s*(?:fail|tests failed)\s+[1-9]/.test(log) || /✖/.test(log);
|
||||
- const killed=run.status!==0&&failed&&!/SyntaxError|ERR_MODULE_NOT_FOUND/.test(log);
|
||||
- const result={id,description,test,args,status:run.status,signal:run.signal,killed,restoredSha256:before};results.push(result);
|
||||
+ // Syntax validity is decided exclusively by the node --check preflight above.
|
||||
+ // GNU timeout owns a process group and terminates its shell, tee and test descendants.
|
||||
+ const timedOut=run.status===124||run.status===137;
|
||||
+ const killed=timedOut||(run.status!==0&&failed);
|
||||
+ const result={id,description,test,args,status:run.status,signal:run.signal,killed,timedOut,timeoutSeconds:60,timeoutKillAfterSeconds:2,processGroupTimeout:true,syntaxStatus:syntax.status,restoredSha256:before};results.push(result);
|
||||
writeFileSync(join(out,'results.json'),JSON.stringify(results,null,2)+'\n');
|
||||
console.log(id+' '+(killed?'KILLED':'SURVIVED/INVALID'));
|
||||
if(!killed) {process.exitCode=1;break;}
|
||||
@@ -0,0 +1,75 @@
|
||||
import { guardMutation } from '../mutant-guard.mjs';
|
||||
// Authorized batch only. Mutate isolated scratch copies, never the candidate or installed tree.
|
||||
import {mkdtempSync,cpSync,readFileSync,writeFileSync,rmSync,symlinkSync,existsSync,mkdirSync} from 'node:fs';
|
||||
import {tmpdir} from 'node:os';import {join,resolve} from 'node:path';
|
||||
import {spawnSync,execFileSync} from 'node:child_process';import {createHash} from 'node:crypto';
|
||||
import {fileURLToPath} from 'node:url';
|
||||
const root='/mnt/storage/scratch/tmp/g196-tree-tn651z';
|
||||
const out='/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-196/r2/mutants';mkdirSync(out,{recursive:true});
|
||||
const p='packages/bus/src/principal.mjs',h='packages/bus/src/human.mjs',w='packages/webui/src/tester-socket.mjs',s='packages/bus/src/server.mjs',peer='packages/bus/src/peercred.mjs';
|
||||
const principal='packages/bus/tests/principal.test.mjs',socket='packages/webui/tests/tester-socket.test.mjs',transport='packages/bus/tests/peer-transport.test.mjs',interpreter='packages/bus/tests/interpreter.test.mjs';
|
||||
const release=['--test-name-pattern=row196 explicit socket','packages/cli/tests/stack-release.test.mjs'];
|
||||
const specs=[
|
||||
['M1', 'packages/webui/src/serve.mjs','tester uses TCP',socket, text=>text.replace('if (tester) return bindTesterSocket(server, testerSocket);',"if (tester) return new Promise(r=>server.listen(0,'127.0.0.1',()=>r(server)));" )],
|
||||
['M2',w,'socket mode widened',socket,t=>t.replace('chmodSync(temporary, 0o600)','chmodSync(temporary, 0o666)')],
|
||||
['M3','packages/webui/src/serve.mjs','sign-in accepted on tester',socket,t=>t.replace("if (tester && (Object.hasOwn(req.headers, 'authorization')", "if (false && (Object.hasOwn(req.headers, 'authorization')")],
|
||||
['M4',p,'copied PID accepted',principal,t=>t.replace('peer.pid !== proof.pid','false')],
|
||||
['M5',peer,'helper parse error ignored','packages/bus/tests/peercred.test.mjs',t=>t.replace('finish(false, Object.freeze(p));\n } catch { finish(true); }','finish(false, Object.freeze(p));\n } catch { finish(false, {pid:2,uid:0,gid:0}); }')],
|
||||
['M6',p,'foreign uid accepted',principal,t=>t.replace('peer.uid !== process.getuid()','false')],
|
||||
['M7',w,'unsafe parent accepted',socket,t=>t.replace('(dir.mode & 0o077)','false')],
|
||||
['M8',h,'agent environment walk skipped',principal,t=>t.replace('current.env !== null && MARKERS.some','false && MARKERS.some')],
|
||||
['M9',h,'leaf identity not reread',principal,t=>t.replace('if (again.startTime !== proof.startTime || again.ppid !== p.ppid)','if (false)')],
|
||||
['M10',p,'Console direct-parent check removed',principal,t=>t.replace("if (parent.uid !== peer.uid || parent.argv[1] !== resolve(paths.console) || parent.argv[2] !== 'serve')",'if (false)')],
|
||||
['M11',p,'Console basename accepted',principal,t=>t.replace("import { resolve }", "import { resolve, basename }").replace('parent.argv[1] !== resolve(paths.console)','basename(parent.argv[1] ?? "") !== basename(paths.console)')],
|
||||
['M12',h,'unknown proof identity accepted',principal,t=>t.replace("Object.keys(proof).some((k) => !['pid', 'startTime', 'nonce', 'business'].includes(k))",'false')],
|
||||
['M13',s,'transient cap leaked',transport,t=>t.replace('broker.disconnect(boundCap)','void(boundCap)')],
|
||||
['M14',p,'tester walk used for user',principal,t=>t.replace("verifyHuman(checked, { cliPath: paths[kind], launches, readProcess,\n nonceKey: kind === 'user' ? 'MOSAIC_BUS_USER_NONCE' : 'MOSAIC_BUS_CLI_NONCE' })",'verifyTester(checked, {cliPath:paths[kind],launches,readProcess,readNonce:()=>checked.nonce})')],
|
||||
['M15','scripts/stack-release.sh','TCP retained during conversion',release,t=>t.replace('RUN_CONSOLE=("${without_tester[@]}" --tester-socket)','RUN_CONSOLE=("${BASE_CONSOLE[@]}" --tester-socket)')],
|
||||
['M16','scripts/stack-release.sh','TCP reopened on downgrade',release,t=>t.replace('RUN_CONSOLE=("${without_tester[@]}") DROP_TESTER="--tester-socket','RUN_CONSOLE=("${without_tester[@]}" --tester-port 7333) DROP_TESTER="--tester-socket')],
|
||||
['M17','packages/bus/src/broker.mjs','tester switch ignored','packages/bus/tests/tester.test.mjs',t=>t.replace("if (this.#business(record.business).vars?.['bus.tester'] !== true)",'if (false)')],
|
||||
['M18',p,'user kind becomes owner',principal,t=>t.replace("return { kind: 'user', business, id: proof.user }","return { kind: 'owner', business, id: proof.user }")],
|
||||
['M19','packages/cli/src/tester-http.mjs','selected instance root ignored',socket,t=>t.replace('socketPath: testerSocketPath(dataRoot)','socketPath: testerSocketPath(dataRoot + "/wrong-instance")')],
|
||||
['M20',peer,'helper gets another pending socket','packages/bus/tests/peercred.test.mjs',t=>t.replace('export function createPeerReader','function originalPeerReader')+`\nexport function createPeerReader(options){const base=originalPeerReader(options),queue=[];let scheduled=false;return{read(socket){return new Promise((resolve,reject)=>{queue.push({socket,resolve,reject});if(!scheduled){scheduled=true;queueMicrotask(()=>{scheduled=false;const jobs=queue.splice(0);jobs.forEach((job,i)=>base.read(jobs[(i+1)%jobs.length].socket).then(job.resolve,job.reject));});}});},close(){base.close();}};}\n`],
|
||||
['M21','packages/bus/src/interpreter.mjs','user-owned interpreter accepted',interpreter,t=>t.replace('s.uid !== 0 || (s.mode & 0o022)','false || (s.mode & 0o022)')],
|
||||
['M22',s,'cap requests invoke helper',transport,t=>t.replace(' if (kind) {',' if (r.cap) await peers.read(socket);\n if (kind) {')],
|
||||
['M23','packages/bus/src/interpreter.mjs','restart retains stale identity',interpreter,t=>t.replace('export function recordInterpreterStart(directory, record) {','export function recordInterpreterStart(directory, record) {\n try { readFileSync(join(directory,"peercred-starts.jsonl")); return; } catch {}')],
|
||||
['M24',w,'listener binds final path directly',socket,t=>t.replace("const temporary = join(parent, '.' + randomBytes(4).toString('hex') + '.s');",'const temporary = path;')],
|
||||
['M25','packages/bus/src/interpreter.mjs','FIFO receipt blocks before type refusal',['--test-name-pattern=non-regular startup receipt',interpreter],t=>t.replace('constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT | constants.O_NOFOLLOW | constants.O_NONBLOCK, 0o600','constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT | constants.O_NOFOLLOW, 0o600')],
|
||||
['M26',peer,'missing helper accepted at startup',['--test-name-pattern=missing or non-regular peer helper','packages/bus/tests/peercred.test.mjs'],t=>t.replace('if (!s.isFile() || s.isSymbolicLink()) throw Error();','if (false) throw Error();').replace('catch { throw refused(); }','catch {}')],
|
||||
['M27',peer,'shutdown returns before helpers are reaped',['--test-name-pattern=shutdown waits','packages/bus/tests/peercred.test.mjs'],t=>t.replace(" await Promise.all([...children].map(child => new Promise(resolve => {\n child.once('close', resolve);\n child.kill('SIGKILL');\n })));"," for (const child of children) child.kill('SIGKILL');")],
|
||||
['M28','scripts/stack-release.sh','proof pair placed after tester socket flag',release,t=>t.replace('case "${without_proof[i]}" in --send | --tester-port | --tester-socket) break','case "${without_proof[i]}" in --send | --tester-port) break')],
|
||||
['M28b','scripts/stack-release.sh','SSO placed after tester socket flag',['--test-name-pattern=row196 SSO socket','packages/cli/tests/stack-release.test.mjs'],t=>t.replace('case "${kept[i]}" in --send | --tester-port | --tester-socket) break','case "${kept[i]}" in --send | --tester-port) break')],
|
||||
['M29','scripts/stack-release.sh','unsafe tester path reaches service stop',release,t=>t.replace(t.split('\n').find(line=>line.includes('|| check_refuse tester-socket-path'))+'\n','')],
|
||||
];
|
||||
const hash=x=>createHash('sha256').update(x).digest('hex');
|
||||
const results=[];
|
||||
for (const [id,file,,,mutate] of specs) {
|
||||
try { guardMutation(readFileSync(join(root,file),'utf8'),mutate); }
|
||||
catch(error) { throw Error(id+': '+error.message); }
|
||||
}
|
||||
const scratch=mkdtempSync(join(tmpdir(),'g196-mut-'));
|
||||
try {
|
||||
for(const name of ['packages','scripts','adapters','roles','contracts','RELEASE','package.json','package-lock.json','.gitignore'])if(existsSync(join(root,name)))cpSync(join(root,name),join(scratch,name),{recursive:true,filter:src=>!src.includes('/node_modules/')&&!src.endsWith('/node_modules')});
|
||||
symlinkSync(join(root,'node_modules'),join(scratch,'node_modules'));
|
||||
for(const args of [['init','-q'],['add','.'],['-c','user.name=fixture','-c','user.email=fixture@invalid','-c','commit.gpgsign=false','-c','core.hooksPath=/dev/null','commit','-qm','candidate snapshot']])execFileSync('git',args,{cwd:scratch});
|
||||
for(const [id,file,description,test,mutate] of specs) {
|
||||
const at=join(scratch,file),original=readFileSync(at,'utf8'),before=hash(original),changed=guardMutation(original,mutate).text;
|
||||
if(changed===original)throw Error(id+' did not change bytes');
|
||||
writeFileSync(at,changed);
|
||||
const syntax=spawnSync(file.endsWith('.sh')?'bash':process.execPath,[file.endsWith('.sh')?'-n':'--check',at],{encoding:'utf8'});
|
||||
if(syntax.status!==0)throw Error(id+' invalid mutation: '+syntax.stderr);
|
||||
const args=['--test',...(Array.isArray(test)?test:[test])];
|
||||
const run=spawnSync('timeout',['--signal=TERM','--kill-after=2s','60s','bash','-c','set -o pipefail; python3 "$G196_BUSY" && "$G196_NODE" "$@" 2>&1 | tee "$G196_LOG"','--',...args],{cwd:scratch,env:{...process.env,G196_NODE:process.execPath,G196_LOG:join(out,id+'.txt')},encoding:'utf8',maxBuffer:2*1024*1024});
|
||||
const log=(run.stdout??'')+(run.stderr??'');writeFileSync(join(out,id+'.txt'),log);
|
||||
writeFileSync(at,original);const clean=execFileSync('git',['status','--porcelain'],{cwd:scratch,encoding:'utf8'});if(clean.trim())throw Error(id+' dirty restored tree: '+clean);if(hash(readFileSync(at))!==before)throw Error(id+' restore hash failed');
|
||||
const failed=/[ℹ#]\s*(?:fail|tests failed)\s+[1-9]/.test(log) || /✖/.test(log);
|
||||
// Syntax validity is decided exclusively by the node --check preflight above.
|
||||
// GNU timeout owns a process group and terminates its shell, tee and test descendants.
|
||||
const timedOut=run.status===124||run.status===137;
|
||||
const killed=timedOut||(run.status!==0&&failed);
|
||||
const result={id,description,test,args,status:run.status,signal:run.signal,killed,timedOut,timeoutSeconds:60,timeoutKillAfterSeconds:2,processGroupTimeout:true,syntaxStatus:syntax.status,restoredSha256:before};results.push(result);
|
||||
writeFileSync(join(out,'results.json'),JSON.stringify(results,null,2)+'\n');
|
||||
console.log(id+' '+(killed?'KILLED':'SURVIVED/INVALID'));
|
||||
if(!killed) {process.exitCode=1;break;}
|
||||
}
|
||||
} finally {rmSync(scratch,{recursive:true,force:true});}
|
||||
@@ -0,0 +1,54 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (49.694568ms)
|
||||
✖ private tester refuses symlink, unsafe parent and long path without repairs (1.885024ms)
|
||||
✔ tester cleanup must leave a replacement inode untouched (2.384441ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 121.753018
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/tester-socket.test.mjs:13:1
|
||||
✖ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (49.694568ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ {
|
||||
+ address: '127.0.0.1',
|
||||
+ family: 'IPv4',
|
||||
+ port: 41395
|
||||
+ }
|
||||
- '/mnt/storage/scratch/tmp/gJ3j/g196-w-L7UCok/console/tester.sock'
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/webui/tests/tester-socket.test.mjs:16:9)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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: { address: '127.0.0.1', family: 'IPv4', port: 41395 },
|
||||
expected: '/mnt/storage/scratch/tmp/gJ3j/g196-w-L7UCok/console/tester.sock',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/webui/tests/tester-socket.test.mjs:26:1
|
||||
✖ private tester refuses symlink, unsafe parent and long path without repairs (1.885024ms)
|
||||
AssertionError [ERR_ASSERTION]: unsafe tester bind must refuse
|
||||
at refused (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/webui/tests/tester-socket.test.mjs:11:9)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/webui/tests/tester-socket.test.mjs:29:2)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: false,
|
||||
expected: true,
|
||||
operator: '==',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✔ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.647432ms)
|
||||
✖ user requires its own nonce and full walk plus immediate same-tree Console parent (0.71001ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.285297ms)
|
||||
✔ human leaf identity is reread after walking the parents (0.167787ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 59.125304
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:22:1
|
||||
✖ user requires its own nonce and full walk plus immediate same-tree Console parent (0.71001ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:27:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /human-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✔ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.685528ms)
|
||||
✖ user requires its own nonce and full walk plus immediate same-tree Console parent (0.680266ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.286586ms)
|
||||
✔ human leaf identity is reread after walking the parents (0.150943ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 51.004525
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:22:1
|
||||
✖ user requires its own nonce and full walk plus immediate same-tree Console parent (0.680266ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:27:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /human-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.927254ms)
|
||||
✔ user requires its own nonce and full walk plus immediate same-tree Console parent (0.491561ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.278262ms)
|
||||
✔ human leaf identity is reread after walking the parents (0.159989ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 53.494457
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:15:1
|
||||
✖ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.927254ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:19:9)
|
||||
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: /human-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ proof receives actual peer, cap traffic never invokes helper and transient cap disconnects (9.052406ms)
|
||||
✔ proof helper error and disconnect during verification never dispatch or bind (1.997863ms)
|
||||
✔ Client receives explicit proof refusal codes without dispatch, not outcome-unknown (43.098804ms)
|
||||
✖ asynchronous proof calls release their transient session on success, failure and timeout (2.35303ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 114.087067
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/peer-transport.test.mjs:11:1
|
||||
✖ proof receives actual peer, cap traffic never invokes helper and transient cap disconnects (9.052406ms)
|
||||
AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
|
||||
|
||||
assert.ok(disconnected.includes('transient'))
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/peer-transport.test.mjs:18:52)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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/bus/tests/peer-transport.test.mjs:46:1
|
||||
✖ asynchronous proof calls release their transient session on success, failure and timeout (2.35303ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ []
|
||||
- [
|
||||
- 'success'
|
||||
- ]
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/peer-transport.test.mjs:56:11)
|
||||
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: [],
|
||||
expected: [ 'success' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (2.090667ms)
|
||||
✖ user requires its own nonce and full walk plus immediate same-tree Console parent (0.460285ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.249211ms)
|
||||
✖ human leaf identity is reread after walking the parents (0.26504ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 3
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 62.713304
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:15:1
|
||||
✖ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (2.090667ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /human-required/. Input:
|
||||
|
||||
'Error: tester-required'
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:19:9)
|
||||
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: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: Error: tester-required
|
||||
at refuse (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/src/tester.mjs:13:9)
|
||||
at verifyTester (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/src/tester.mjs:40:5)
|
||||
at verifyPrincipal (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/src/principal.mjs:31:24)
|
||||
at file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:19:20
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24)
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:19:9)
|
||||
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),
|
||||
expected: /human-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:22:1
|
||||
✖ user requires its own nonce and full walk plus immediate same-tree Console parent (0.460285ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:27:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /human-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:44:1
|
||||
✖ human leaf identity is reread after walking the parents (0.26504ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /human-required/. Input:
|
||||
|
||||
'Error: tester-required'
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:47:9)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: Error: tester-required
|
||||
at refuse (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/src/tester.mjs:13:9)
|
||||
at verifyTester (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/src/tester.mjs:70:5)
|
||||
at verifyPrincipal (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/src/principal.mjs:31:24)
|
||||
at file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:47:20
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24)
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:47:9)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18),
|
||||
expected: /human-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (3916.205226ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4304.679862
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/stack-release.test.mjs:2277:1
|
||||
✖ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (3916.205226ms)
|
||||
AssertionError [ERR_ASSERTION]: stack-release: interpreter: {"path":"/usr/bin/python3","sha256":"fixture"}
|
||||
stack-release: captured the rollback set: /mnt/storage/scratch/tmp/gJ3j/sr-hy3kBG/data/state/stack-rollback/20261021T185103Z-1263a5e3af50
|
||||
stack-release: drop --tester-port 7333 (replaced by private Unix socket); the target Console does not support it
|
||||
stack-release: stopped both units
|
||||
stack-release: stopped store schema: 3g
|
||||
stack-release: backup: /mnt/storage/scratch/tmp/gJ3j/sr-hy3kBG/data/backups/stack/20261021T185103Z-1263a5e3af50
|
||||
stack-release: rolling back: install-console
|
||||
stack-release: stopped both units
|
||||
stack-release: put back the unit files and the wrapper from /mnt/storage/scratch/tmp/gJ3j/sr-hy3kBG/data/state/stack-rollback/20261021T185103Z-1263a5e3af50
|
||||
stack-release: gate passed on 901e0b11e9113fbb981db30e6fbe83635540d1f3
|
||||
stack-release: install-console; rolled back to 901e0b11e9113fbb981db30e6fbe83635540d1f3, which passed the gate
|
||||
|
||||
|
||||
1 !== 0
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/cli/tests/stack-release.test.mjs:2290:78)
|
||||
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: 1,
|
||||
expected: 0,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (5111.05339ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 0
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 5664.207303
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/cli/tests/stack-release.test.mjs:2277:1
|
||||
✖ row196 explicit socket conversion refuses inherited TCP before stop and rollback disables socket (5111.05339ms)
|
||||
AssertionError [ERR_ASSERTION]: The input was expected to not match the regular expression /--tester-(socket|port)/. Input:
|
||||
|
||||
'# Mosaic Console: `node packages/webui/src/cli.mjs serve`, one instance.\n' +
|
||||
'# Rendered by scripts/webui-service.sh from packages/webui/systemd/; /mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/copies/0d30b8dfbb41b6ca567206d291451b1f5b7d13bd,\n' +
|
||||
'# /usr/local/bin:/usr/bin:/bin, /usr/bin/node and the serve flags below are filled in at install time.\n' +
|
||||
'# /mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/copies/0d30b8dfbb41b6ca567206d291451b1f5b7d13bd is the read-only copy `install --copy ID` names, and the flags\n' +
|
||||
'# pass the canonical checkout as --checkout for the queue read (row 77).\n' +
|
||||
'# Row 178: optional --proof-header NAME --proof-file PATH checks proxy proof;\n' +
|
||||
'# the value is read once by serve and never carried in this unit.\n' +
|
||||
'# Edit the template and reinstall; do not edit the installed unit.\n' +
|
||||
'#\n' +
|
||||
'# The Console reads the bus through the human transport, so whoever starts\n' +
|
||||
"# this unit holds the human's capability. Jason starts and restarts it\n" +
|
||||
'# (`systemctl --user enable --now mosaic-webui`), and so may Mos under lead\n' +
|
||||
'# decision 102, which accepts that sends then enter the trail as Jason. Any\n' +
|
||||
'# other agent starting it works around the human proof (lead decisions 62\n' +
|
||||
'# and 94). The unit sets no MOSAIC_*, CLAUDE*, CODEX* or PI_* variable.\n' +
|
||||
'[Unit]\n' +
|
||||
'Description=Mosaic Console\n' +
|
||||
'Documentation=file:///mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/copies/0d30b8dfbb41b6ca567206d291451b1f5b7d13bd/packages/webui/README.md\n' +
|
||||
'StartLimitIntervalSec=600\n' +
|
||||
'StartLimitBurst=5\n' +
|
||||
'\n' +
|
||||
'[Service]\n' +
|
||||
'Type=simple\n' +
|
||||
'WorkingDirectory=/mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/copies/0d30b8dfbb41b6ca567206d291451b1f5b7d13bd\n' +
|
||||
'Environment=PATH=/usr/local/bin:/usr/bin:/bin\n' +
|
||||
'# The server binds 127.0.0.1 only. Usage, config and listen refusals\n' +
|
||||
'# (a port already in use included) exit 2 and are not retried; fix the\n' +
|
||||
'# flags or free the port, then start it again.\n' +
|
||||
'ExecStart=/usr/bin/node /mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/copies/0d30b8dfbb41b6ca567206d291451b1f5b7d13bd/packages/webui/src/cli.mjs serve --checkout /mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/repo --port 41915 --business acme --public-host console.example --auth-header x-user --allow-user jason --proof-header x-console-proof --proof-file /mnt/storage/scratch/tmp/gJ3j/sr-K2QFsd/proof.187 --tester-port 7333\n' +
|
||||
'Restart=on-failure\n' +
|
||||
'RestartSec=15\n' +
|
||||
'RestartPreventExitStatus=2\n' +
|
||||
'# `systemctl --user stop` sends SIGTERM; the server stops accepting and\n' +
|
||||
'# closes. Open connections that outlast TimeoutStopSec are killed.\n' +
|
||||
'KillSignal=SIGTERM\n' +
|
||||
'TimeoutStopSec=30\n' +
|
||||
'NoNewPrivileges=yes\n' +
|
||||
'\n' +
|
||||
'[Install]\n' +
|
||||
'WantedBy=default.target\n'
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/cli/tests/stack-release.test.mjs:2292:77)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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: "# Mosaic Console: `node packages/webui/src/cli.mjs serve`, one instance.\n# Rendered by scripts/webui-service.sh from packages/webui/systemd/; /mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/copies/0d30b8dfbb41b6ca567206d291451b1f5b7d13bd,\n# /usr/local/bin:/usr/bin:/bin, /usr/bin/node and the serve flags below are filled in at install time.\n# /mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/copies/0d30b8dfbb41b6ca567206d291451b1f5b7d13bd is the read-only copy `install --copy ID` names, and the flags\n# pass the canonical checkout as --checkout for the queue read (row 77).\n# Row 178: optional --proof-header NAME --proof-file PATH checks proxy proof;\n# the value is read once by serve and never carried in this unit.\n# Edit the template and reinstall; do not edit the installed unit.\n#\n# The Console reads the bus through the human transport, so whoever starts\n# this unit holds the human's capability. Jason starts and restarts it\n# (`systemctl --user enable --now mosaic-webui`), and so may Mos under lead\n# decision 102, which accepts that sends then enter the trail as Jason. Any\n# other agent starting it works around the human proof (lead decisions 62\n# and 94). The unit sets no MOSAIC_*, CLAUDE*, CODEX* or PI_* variable.\n[Unit]\nDescription=Mosaic Console\nDocumentation=file:///mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/copies/0d30b8dfbb41b6ca567206d291451b1f5b7d13bd/packages/webui/README.md\nStartLimitIntervalSec=600\nStartLimitBurst=5\n\n[Service]\nType=simple\nWorkingDirectory=/mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/copies/0d30b8dfbb41b6ca567206d291451b1f5b7d13bd\nEnvironment=PATH=/usr/local/bin:/usr/bin:/bin\n# The server binds 127.0.0.1 only. Usage, config and listen refusals\n# (a port already in use included) exit 2 and are not retried; fix the\n# flags or free the port, then start it again.\nExecStart=/usr/bin/node /mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/copies/0d30b8dfbb41b6ca567206d291451b1f5b7d13bd/packages/webui/src/cli.mjs serve --checkout /mnt/storage/scratch/tmp/gJ3j/stack-release-bKqva6/repo --port 41915 --business acme --public-host console.example --auth-header x-user --allow-user jason --proof-header x-console-proof --proof-file /mnt/storage/scratch/tmp/gJ3j/sr-K2QFsd/proof.187 --tester-port 7333\nRestart=on-failure\nRestartSec=15\nRestartPreventExitStatus=2\n# `systemctl --user stop` sends SIGTERM; the server stops accepting and\n# closes. Open connections that outlast TimeoutStopSec are killed.\nKillSignal=SIGTERM\nTimeoutStopSec=30\nNoNewPrivileges=yes\n\n[Install]\nWantedBy=default.target\n",
|
||||
expected: /--tester-(socket|port)/,
|
||||
operator: 'doesNotMatch',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ the tester binds only when the business sets bus.tester to exactly true (17.53619ms)
|
||||
✔ a business may not name a role tester, so the tester address is never a role (17.82968ms)
|
||||
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (36.71909ms)
|
||||
✔ a tester message is from tester, needs no prefix, and writes no human.input or authority (14.532304ms)
|
||||
✔ a tester message to a role no run holds refuses tester-target-not-running and stores nothing (10.145587ms)
|
||||
✔ a tester message is refused while the run is only launched, and routes once it claims (12.444532ms)
|
||||
✔ a human message to a role no run holds still waits and tells launch.by (10.928459ms)
|
||||
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (20.898774ms)
|
||||
✔ the tester reads the human views a reader reads (24.490999ms)
|
||||
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.344138ms)
|
||||
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.406093ms)
|
||||
✔ testerNonce reads only the tester's variable and gives null on any read error (0.198658ms)
|
||||
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (118.437146ms)
|
||||
✖ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (1234.579269ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 12
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 1628.145277
|
||||
|
||||
✖ 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 (17.53619ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: null
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/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 (1234.579269ms)
|
||||
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/gJ3j/g196-mut-crpRhv/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,42 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✔ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.996624ms)
|
||||
✖ user requires its own nonce and full walk plus immediate same-tree Console parent (1.266948ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.350185ms)
|
||||
✔ human leaf identity is reread after walking the parents (0.203698ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 76.258279
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:22:1
|
||||
✖ user requires its own nonce and full walk plus immediate same-tree Console parent (1.266948ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
{
|
||||
business: 'demo',
|
||||
id: 'owner',
|
||||
+ kind: 'owner'
|
||||
- kind: 'user'
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:24:9)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: { kind: 'owner', business: 'demo', id: 'owner' },
|
||||
expected: { kind: 'user', business: 'demo', id: 'owner' },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (56.676653ms)
|
||||
✔ private tester refuses symlink, unsafe parent and long path without repairs (1.634686ms)
|
||||
✔ tester cleanup must leave a replacement inode untouched (1.97195ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 131.19279
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/tester-socket.test.mjs:13:1
|
||||
✖ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (56.676653ms)
|
||||
Error: connect ENOENT /mnt/storage/scratch/tmp/gJ3j/g196-w-6wAD6F/wrong-instance/console/tester.sock
|
||||
at PipeConnectWrap.afterConnect [as oncomplete] (node:net:2021:16) {
|
||||
errno: -2,
|
||||
code: 'ENOENT',
|
||||
syscall: 'connect',
|
||||
address: '/mnt/storage/scratch/tmp/gJ3j/g196-w-6wAD6F/wrong-instance/console/tester.sock'
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (40.421617ms)
|
||||
✔ private tester refuses symlink, unsafe parent and long path without repairs (0.920109ms)
|
||||
✖ tester cleanup must leave a replacement inode untouched (0.939648ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 102.876749
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/tester-socket.test.mjs:13:1
|
||||
✖ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (40.421617ms)
|
||||
Error: tester-socket-unsafe
|
||||
at bindTesterSocket (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/webui/src/tester-socket.mjs:29:102)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/webui/tests/tester-socket.test.mjs:15:12)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
|
||||
test at packages/webui/tests/tester-socket.test.mjs:36:1
|
||||
✖ tester cleanup must leave a replacement inode untouched (0.939648ms)
|
||||
Error: tester-socket-unsafe
|
||||
at bindTesterSocket (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/webui/src/tester-socket.mjs:29:102)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/webui/tests/tester-socket.test.mjs:42:15)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
@@ -0,0 +1,53 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit (292.257839ms)
|
||||
✔ helper output and failures fail closed including unsafe gid (2.680068ms)
|
||||
✔ helper timeout, capacity and shutdown refuse without leaving children (25.751457ms)
|
||||
✔ missing or non-regular peer helper refuses at construction before opening the bus (0.36369ms)
|
||||
✖ shutdown waits for killed helper close before returning (0.370388ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 401.085642
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/peercred.test.mjs:15:1
|
||||
✖ T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit (292.257839ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
false !== true
|
||||
|
||||
at file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/peercred.test.mjs:56:12
|
||||
at Array.forEach (<anonymous>)
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/peercred.test.mjs:52:11)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/bus/tests/peercred.test.mjs:98:1
|
||||
✖ shutdown waits for killed helper close before returning (0.370388ms)
|
||||
AssertionError [ERR_ASSERTION]: shutdown must await the helper close event
|
||||
|
||||
0 !== 1
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/peercred.test.mjs:106:9)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 0,
|
||||
expected: 1,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ system Python is a resolved root-owned ELF, never a shim or home interpreter (2.489468ms)
|
||||
✔ real system interpreter is available and safely inspected (22.481127ms)
|
||||
✔ restart receipt appends actual replacement identity and refuses unsafe files (9.851443ms)
|
||||
✔ activation gate compares fresh startup receipt to the current interpreter identity (1.482676ms)
|
||||
✔ non-regular startup receipt refuses promptly without waiting on a FIFO peer (33.784543ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 4
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 128.30192
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/interpreter.test.mjs:15:1
|
||||
✖ system Python is a resolved root-owned ELF, never a shim or home interpreter (2.489468ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/interpreter.test.mjs:31:31)
|
||||
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: /interpreter-unsafe/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ proof receives actual peer, cap traffic never invokes helper and transient cap disconnects (7.03352ms)
|
||||
✔ proof helper error and disconnect during verification never dispatch or bind (1.790604ms)
|
||||
✔ Client receives explicit proof refusal codes without dispatch, not outcome-unknown (42.381026ms)
|
||||
✔ asynchronous proof calls release their transient session on success, failure and timeout (28.479209ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 135.242751
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/peer-transport.test.mjs:11:1
|
||||
✖ proof receives actual peer, cap traffic never invokes helper and transient cap disconnects (7.03352ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
2 !== 1
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/peer-transport.test.mjs:20:9)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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: 2,
|
||||
expected: 1,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✔ system Python is a resolved root-owned ELF, never a shim or home interpreter (2.259714ms)
|
||||
✔ real system interpreter is available and safely inspected (20.668185ms)
|
||||
✖ restart receipt appends actual replacement identity and refuses unsafe files (2.992321ms)
|
||||
✔ activation gate compares fresh startup receipt to the current interpreter identity (1.363356ms)
|
||||
✖ non-regular startup receipt refuses promptly without waiting on a FIFO peer (1005.398641ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 1086.382437
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/interpreter.test.mjs:38:1
|
||||
✖ restart receipt appends actual replacement identity and refuses unsafe files (2.992321ms)
|
||||
SyntaxError: "undefined" is not valid JSON
|
||||
at JSON.parse (<anonymous>)
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/interpreter.test.mjs:49:48)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
|
||||
test at packages/bus/tests/interpreter.test.mjs:69:1
|
||||
✖ non-regular startup receipt refuses promptly without waiting on a FIFO peer (1005.398641ms)
|
||||
AssertionError [ERR_ASSERTION]: unsafe FIFO must refuse without blocking startup
|
||||
|
||||
null !== 0
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/interpreter.test.mjs:75:9)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: null,
|
||||
expected: 0,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (59.338551ms)
|
||||
✔ private tester refuses symlink, unsafe parent and long path without repairs (1.388654ms)
|
||||
✔ tester cleanup must leave a replacement inode untouched (1.72767ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 128.502051
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/tester-socket.test.mjs:13:1
|
||||
✖ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (59.338551ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
200 !== 403
|
||||
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/webui/tests/tester-socket.test.mjs:21:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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: 200,
|
||||
expected: 403,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.691534ms)
|
||||
✔ user requires its own nonce and full walk plus immediate same-tree Console parent (0.594758ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.274537ms)
|
||||
✔ human leaf identity is reread after walking the parents (0.160418ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 52.34153
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:15:1
|
||||
✖ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.691534ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:18:77)
|
||||
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: /human-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✔ T2 eight proof callers and a racing copier bind the exact accepted socket, which survives helper exit (252.611828ms)
|
||||
✖ helper output and failures fail closed including unsafe gid (1.307507ms)
|
||||
✔ helper timeout, capacity and shutdown refuse without leaving children (26.237379ms)
|
||||
✔ missing or non-regular peer helper refuses at construction before opening the bus (0.252246ms)
|
||||
✖ shutdown waits for killed helper close before returning (4.713775ms)
|
||||
ℹ tests 5
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 376.324408
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/peercred.test.mjs:74:1
|
||||
✖ helper output and failures fail closed including unsafe gid (1.307507ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected rejection.
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/peercred.test.mjs:77:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /peercred-required/,
|
||||
operator: 'rejects',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at packages/bus/tests/peercred.test.mjs:98:1
|
||||
✖ shutdown waits for killed helper close before returning (4.713775ms)
|
||||
[AssertionError [ERR_ASSERTION]: Missing expected rejection.] { generatedMessage: false, code: 'ERR_ASSERTION', actual: undefined, expected: /peercred-required/, operator: 'rejects', diff: 'simple' }
|
||||
@@ -0,0 +1,31 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✖ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.939462ms)
|
||||
✔ user requires its own nonce and full walk plus immediate same-tree Console parent (0.501573ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.285393ms)
|
||||
✔ human leaf identity is reread after walking the parents (0.163302ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 56.13375
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:15:1
|
||||
✖ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.939462ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:18:77)
|
||||
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: /human-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✔ private tester HTTP serves on 0600 socket in 0700 parent and fixed origin (87.784551ms)
|
||||
✖ private tester refuses symlink, unsafe parent and long path without repairs (2.258513ms)
|
||||
✔ tester cleanup must leave a replacement inode untouched (2.916815ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 2
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 190.892552
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/webui/tests/tester-socket.test.mjs:26:1
|
||||
✖ private tester refuses symlink, unsafe parent and long path without repairs (2.258513ms)
|
||||
AssertionError [ERR_ASSERTION]: unsafe tester bind must refuse
|
||||
at refused (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/webui/tests/tester-socket.test.mjs:11:9)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/webui/tests/tester-socket.test.mjs:29:2)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: false,
|
||||
expected: true,
|
||||
operator: '==',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✔ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.760997ms)
|
||||
✖ user requires its own nonce and full walk plus immediate same-tree Console parent (0.759143ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.301518ms)
|
||||
✔ human leaf identity is reread after walking the parents (0.176796ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 63.261715
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:22:1
|
||||
✖ user requires its own nonce and full walk plus immediate same-tree Console parent (0.759143ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:27:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /human-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
CLEAR (current driver ancestors excluded)
|
||||
✔ principal binds kernel peer PID and uid, maps owner, and never takes identity or role from body (1.588487ms)
|
||||
✔ user requires its own nonce and full walk plus immediate same-tree Console parent (0.483775ms)
|
||||
✔ tester deliberately admits agent parents but rejects managed runs and another nonce (0.301471ms)
|
||||
✖ human leaf identity is reread after walking the parents (0.520477ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 58.566309
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at packages/bus/tests/principal.test.mjs:44:1
|
||||
✖ human leaf identity is reread after walking the parents (0.520477ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///mnt/storage/scratch/tmp/gJ3j/g196-mut-crpRhv/packages/bus/tests/principal.test.mjs:47:9)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /human-required/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,309 @@
|
||||
[
|
||||
{
|
||||
"id": "M1",
|
||||
"description": "tester uses TCP",
|
||||
"test": "packages/webui/tests/tester-socket.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/webui/tests/tester-socket.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "da624f188c69e016ff82e1d1dcae1c579e68a57f0f25d773bb5d8bca56b80ee1"
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"description": "socket mode widened",
|
||||
"test": "packages/webui/tests/tester-socket.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/webui/tests/tester-socket.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16"
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"description": "sign-in accepted on tester",
|
||||
"test": "packages/webui/tests/tester-socket.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/webui/tests/tester-socket.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "da624f188c69e016ff82e1d1dcae1c579e68a57f0f25d773bb5d8bca56b80ee1"
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"description": "copied PID accepted",
|
||||
"test": "packages/bus/tests/principal.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/principal.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd"
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"description": "helper parse error ignored",
|
||||
"test": "packages/bus/tests/peercred.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/peercred.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"
|
||||
},
|
||||
{
|
||||
"id": "M6",
|
||||
"description": "foreign uid accepted",
|
||||
"test": "packages/bus/tests/principal.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/principal.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd"
|
||||
},
|
||||
{
|
||||
"id": "M7",
|
||||
"description": "unsafe parent accepted",
|
||||
"test": "packages/webui/tests/tester-socket.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/webui/tests/tester-socket.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "1c1fe0c795adac97f28502564a75f26d5666d9be5ae51169f7dd5bb7741fad16"
|
||||
},
|
||||
{
|
||||
"id": "M8",
|
||||
"description": "agent environment walk skipped",
|
||||
"test": "packages/bus/tests/principal.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/principal.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079"
|
||||
},
|
||||
{
|
||||
"id": "M9",
|
||||
"description": "leaf identity not reread",
|
||||
"test": "packages/bus/tests/principal.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/principal.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079"
|
||||
},
|
||||
{
|
||||
"id": "M10",
|
||||
"description": "Console direct-parent check removed",
|
||||
"test": "packages/bus/tests/principal.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/principal.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd"
|
||||
},
|
||||
{
|
||||
"id": "M11",
|
||||
"description": "Console basename accepted",
|
||||
"test": "packages/bus/tests/principal.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/principal.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd"
|
||||
},
|
||||
{
|
||||
"id": "M12",
|
||||
"description": "unknown proof identity accepted",
|
||||
"test": "packages/bus/tests/principal.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/principal.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "0c6d96abe4607cba0b02b0638a2fc217ff8135bac9a47761a0ef015fbe9d3079"
|
||||
},
|
||||
{
|
||||
"id": "M13",
|
||||
"description": "transient cap leaked",
|
||||
"test": "packages/bus/tests/peer-transport.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/peer-transport.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "830faa9a76150b59189cde395ec8deeb768e4b0d45ed262a57bb6fc6e459abb4"
|
||||
},
|
||||
{
|
||||
"id": "M14",
|
||||
"description": "tester walk used for user",
|
||||
"test": "packages/bus/tests/principal.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/principal.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd"
|
||||
},
|
||||
{
|
||||
"id": "M15",
|
||||
"description": "TCP retained during conversion",
|
||||
"test": [
|
||||
"--test-name-pattern=row196 explicit socket",
|
||||
"packages/cli/tests/stack-release.test.mjs"
|
||||
],
|
||||
"args": [
|
||||
"--test",
|
||||
"--test-name-pattern=row196 explicit socket",
|
||||
"packages/cli/tests/stack-release.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
|
||||
},
|
||||
{
|
||||
"id": "M16",
|
||||
"description": "TCP reopened on downgrade",
|
||||
"test": [
|
||||
"--test-name-pattern=row196 explicit socket",
|
||||
"packages/cli/tests/stack-release.test.mjs"
|
||||
],
|
||||
"args": [
|
||||
"--test",
|
||||
"--test-name-pattern=row196 explicit socket",
|
||||
"packages/cli/tests/stack-release.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "b916a2793311d21e3ce7117e9b5e0768e6e33c841fa3aa39fb7ffc9c5974acd2"
|
||||
},
|
||||
{
|
||||
"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": true,
|
||||
"restoredSha256": "e6f33bac95a40c9d52d67f297eec361cd0f30da5d3c28057468ee5d56c3ae7fc"
|
||||
},
|
||||
{
|
||||
"id": "M18",
|
||||
"description": "user kind becomes owner",
|
||||
"test": "packages/bus/tests/principal.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/principal.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "32ef39d80b523bdd586c29620d7a752c309c8e1aa70befc1414125468f3411dd"
|
||||
},
|
||||
{
|
||||
"id": "M19",
|
||||
"description": "selected instance root ignored",
|
||||
"test": "packages/webui/tests/tester-socket.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/webui/tests/tester-socket.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "4bd7bdf0898844684ebf9444b110d2c5b6fa874b2681183e54f1f62f97823192"
|
||||
},
|
||||
{
|
||||
"id": "M20",
|
||||
"description": "helper gets another pending socket",
|
||||
"test": "packages/bus/tests/peercred.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/peercred.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "29c88655e8b9aed8db604573c9213fd9f3c40ef35ff04f4eda8fbe8f1b8a32d7"
|
||||
},
|
||||
{
|
||||
"id": "M21",
|
||||
"description": "user-owned interpreter accepted",
|
||||
"test": "packages/bus/tests/interpreter.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/interpreter.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "d5d98a9133a1b449acc48143fd559d890a470c6ea210b30b9b70e491e6cd855a"
|
||||
},
|
||||
{
|
||||
"id": "M22",
|
||||
"description": "cap requests invoke helper",
|
||||
"test": "packages/bus/tests/peer-transport.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/peer-transport.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": true,
|
||||
"restoredSha256": "830faa9a76150b59189cde395ec8deeb768e4b0d45ed262a57bb6fc6e459abb4"
|
||||
},
|
||||
{
|
||||
"id": "M23",
|
||||
"description": "restart retains stale identity",
|
||||
"test": "packages/bus/tests/interpreter.test.mjs",
|
||||
"args": [
|
||||
"--test",
|
||||
"packages/bus/tests/interpreter.test.mjs"
|
||||
],
|
||||
"status": 1,
|
||||
"signal": null,
|
||||
"killed": false,
|
||||
"restoredSha256": "d5d98a9133a1b449acc48143fd559d890a470c6ea210b30b9b70e491e6cd855a"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
fb96c71db3715d7ea766b278377c4f215ba1537b 0000000000000000000000000000000000000000
|
||||
@@ -0,0 +1 @@
|
||||
294d45c6c8494e83e4276a8c554fcbe85674f3d0 0000000000000000000000000000000000000000
|
||||
@@ -0,0 +1,2 @@
|
||||
/mnt/storage/scratch/tmp/g196-tree-tn651z
|
||||
/mnt/storage/scratch/tmp/gJ3j
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,54 @@
|
||||
# Row 196 r2 stop 2 results
|
||||
|
||||
Product 64539c96b. Driver ab1f0e576 plus the required M23-M29 selection and base timing receipt adapter. No product changes.
|
||||
|
||||
| Mutant | Result | Killer pass/fail | Base seconds | Mutant seconds | Outer timeout |
|
||||
|---|---|---|---|---|---|
|
||||
| M1 | killed | 1/2 | not measured in run 1 | see log | False |
|
||||
| M2 | killed | 1/2 | not measured in run 1 | see log | False |
|
||||
| M3 | killed | 2/1 | not measured in run 1 | see log | False |
|
||||
| M4 | killed | 3/1 | not measured in run 1 | see log | False |
|
||||
| M5 | killed | 3/2 | not measured in run 1 | see log | False |
|
||||
| M6 | killed | 3/1 | not measured in run 1 | see log | False |
|
||||
| M7 | killed | 2/1 | not measured in run 1 | see log | False |
|
||||
| M8 | killed | 3/1 | not measured in run 1 | see log | False |
|
||||
| M9 | killed | 3/1 | not measured in run 1 | see log | False |
|
||||
| M10 | killed | 3/1 | not measured in run 1 | see log | False |
|
||||
| M11 | killed | 3/1 | not measured in run 1 | see log | False |
|
||||
| M12 | killed | 3/1 | not measured in run 1 | see log | False |
|
||||
| M13 | killed | 2/2 | not measured in run 1 | see log | False |
|
||||
| M14 | killed | 1/3 | not measured in run 1 | see log | False |
|
||||
| M15 | killed | 0/1 | not measured in run 1 | see log | False |
|
||||
| M16 | killed | 0/1 | not measured in run 1 | see log | False |
|
||||
| M17 | killed | 12/2 | not measured in run 1 | see log | False |
|
||||
| M18 | killed | 3/1 | not measured in run 1 | see log | False |
|
||||
| M19 | killed | 2/1 | not measured in run 1 | see log | False |
|
||||
| M20 | killed | 3/2 | not measured in run 1 | see log | False |
|
||||
| M21 | killed | 4/1 | not measured in run 1 | see log | False |
|
||||
| M22 | killed | 3/1 | not measured in run 1 | see log | False |
|
||||
| M23 | killed | 3/2 | 1.4702031439999999 | 2.736 | False |
|
||||
| M24 | killed | 1/2 | 1.52819561 | 1.647 | False |
|
||||
| M25 | killed | 0/1 | 1.4702031439999999 | 2.946 | False |
|
||||
| M26 | killed | 0/1 | 2.0922415990000003 | 1.95 | False |
|
||||
| M27 | killed | 0/1 | 2.0922415990000003 | 1.572 | False |
|
||||
| M28 | survived | 1/0 | 7.983384869 | 8.367 | False |
|
||||
| M29 | unrun | unrun | not measured in run 1 | see log | False |
|
||||
|
||||
27 confirmed kills, M28 survived, M29 unrun. No package or shell suite started.
|
||||
M1-M22 stand under sage-2063/2065. M23-M27 passed syntax preflight and were
|
||||
killed by test failures. No outer per-mutant timeout occurred. The unmutated
|
||||
killers passed 14 tests total, zero failed. Exact arguments and base wall times
|
||||
are in base-results.json; release uses the unchanged focused killer arguments.
|
||||
|
||||
M28 targeted the earlier sso_for_target insertion clause after rebase, instead
|
||||
of proof_for_target. Its killer passed 1/0, so the driver correctly reports a
|
||||
survivor. A precise mutation must name the without_proof expression. No fix or
|
||||
rerun before Sage rules. Slot handed back in gander-0035 at 19:01:26Z.
|
||||
|
||||
All six restoration checks passed byte hashes and empty Git status. Candidate
|
||||
Git status excluding the expected node_modules symlink is empty. Process sweep
|
||||
found zero leftover node, tee or Python/FIFO readers under the candidate cwd,
|
||||
TMPDIR and seat worktree. process-sweep.json records scope and count.
|
||||
|
||||
This is stop 2. No golden suite failures have yet been observed because those
|
||||
suites have not started. A third stop goes to Mos under mos-1166.
|
||||
@@ -0,0 +1,4 @@
|
||||
{"name":"interpreter","args":["packages/bus/tests/interpreter.test.mjs"],"seconds":1.4702031439999999,"status":0,"signal":null}
|
||||
{"name":"socket","args":["packages/webui/tests/tester-socket.test.mjs"],"seconds":1.52819561,"status":0,"signal":null}
|
||||
{"name":"peercred","args":["packages/bus/tests/peercred.test.mjs"],"seconds":2.0922415990000003,"status":0,"signal":null}
|
||||
{"name":"release","args":["--test-name-pattern=row196 explicit socket","packages/cli/tests/stack-release.test.mjs"],"seconds":7.983384869,"status":0,"signal":null}
|
||||
Loaded 100 of 1457 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user