Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a8281a6f0 | ||
|
|
5b63ea3236 | ||
|
|
64f6558ee4 | ||
|
|
f799e8b155 | ||
|
|
4992e49097 | ||
|
|
e86c712f5c | ||
|
|
87e67a765f |
No files matched your search
@@ -5381,37 +5381,3 @@ Gander: after Duckworth-0100 design approval with C1-C5, prepared the two host-s
|
||||
|
||||
2026-10-23T02:21:06Z | Sage, rows 270+271 landing, 571 landing, MVP rows | Before: 270 (#1775) and 271 (#1776) were approved on gizmoduck/row270-271-r4 49cee846e and 2b964a082 after combined gate C2 run 5 GREEN on 53406f3e4 (bus 873, seat 202, cli 905, ten scripts, 38/38 mutants). After: 33 commits cherry-picked onto 767bb62c7 as 7328da8ca, range-diff all "=", 40 paths identical to the candidate; 270 manifest f4174458 matches, 271 manifest 3ab1f5c8 matches on 29 paths, the other 4 moved under 270 and match its manifest. Done revs 3396/3398, #1775 c30962 and #1776 c30964 closed, P19 463 c861. 571 (Gyro, Fenton APPROVE) picked as ee5f7b9ef, 6345aae3d, 767bb62c7 (blobs 9382f85b, 7ec0897b), 1ac76a417 left out; N7 911dad2aa (Fenton-0014) picked after. Rows 293-299 added (574, FED R6, R4, R7, GitHub grant, Q228, 573), queue commit 253346e3c. Correction: the push sync step checked out O..S paths over the canonical worktree without testing for uncommitted edits, so any pending SESSIONS or BUILD-LOG line in the canonical checkout at 02:06Z would have been overwritten; the sync now skips edited paths. Schema 3n is not live (LIVE 0cbe2e9b3 at 3m).
|
||||
2026-10-23T03:59:52Z | Sage, row 293 (Vikunja 574) landing and 3m-3n live window | Before: live 0cbe2e9b3 at schema 3m; 574 approved by Filbert (c30982, cdda41f5) on gander/v574-r2 a9cae2bd6 after run 2 GREEN on 6bfab273b (four files 153/0, seat 202/0, cli 905/0, 312 flagged commits with 0 maintenance children). After: Darkwing's window put live on 464010fbe at 3n (activation 20261023T034557Z-464010fbe4c6, 26/97/5/28, Console 7332 200, W9b pm ra38826f3c6e2 left live, STATE darkwing/window-migrate-3n 8708927e5); 574's six commits cherry-picked onto 464010fbe as e51d11640, range-diff all =, patch-ids equal, only docs differ from a9cae2bd6. #1805 closed c31013, P19 386 c887 and 574 c888. Residual: queue store.mjs, discord git.mjs, harness tools.mjs commit without the maintenance flags; no whole-root test covers them yet.
|
||||
2026-10-23T05:47:17Z | Sage, row 292 (#1797) landing, idle-stop race row 302, rows 300/301, row 294 rounds 2-3 | Before: refactor 4a9c536e8; 292's gate on 0d0021454 hit one red at compactions-launch.test.mjs:229, ['session-invalid',22,null] where ['stopped',0,null] was expected, product and test unchanged. Gizmoduck read it as a race: threadIdle releases the claim, then the launcher sends SIGTERM, and a runner call in between gets not-holder and exits 22. Mos (mos-1411) rejected loosening :229, let 292 count one whole unedited green cli rerun, and allowed one rerun for that exact signature on other gates until the race row lands (hits logged on Vikunja 588). The 10-run diagnostic passed 10/10, but one runner log (r846b8d083502) showed not-holder then exit 22. After: the cli rerun was 910/910. 292 LANDED 6aab979e6 05:18Z (7 cherry-picks, range-diff all =, patch-ids equal), done rev 3447, #1797 closed c31038, Vikunja 588 c891. Briefs 86d5ac69b (R6-N1 #1807, R6-N4 #1808, rows 300/301) and e3ef1eaf6/fdedc56e2 (race, #1809, row 302). Row 302 design d1/d2 approved by Dewey with D1 (role.claim refuses a released run), c31044. Mos ruled landRelease folded in, code launcher-released, and four old-test lines moved to exact values (mos-1414/1415/1416): threads.test:394, runner.test:771-772, land.test:464. Row 294 round 2 stopped at webui G5 granted-user.test:269: max(seq) over an empty events table is NULL. Round 3 is one line, coalesce(max(seq),0) (mos-1417), Duckworth APPROVE c31045 rev 3462, gate pending. Queue commit 756284e8e (revs 3448-3456). Correction: two review-request attempts this window ran without MOSAIC_GITEA_CREDENTIAL_FILE exported and failed (3450 Launchpad, 3451/3452 Sage); the posted request was 3453/3454.
|
||||
2026-10-23T07:11:43Z | Sage, row 294 (#1800) rounds 3-4 and landing, row 219 edits 2-3, R9 transient and row 303 | Before: refactor 09d0d6faf; 294 run 3 on cb1648f3 stopped with 20 cli reds from two causes. A: the stack-release rehearsal fixture copies lacked cli access.mjs and transport.mjs, which 294's config.mjs now imports. B: the B1-B3 boot tests read warnings that now carry the fixture tracker line. Mos ruled A as two copy-list entries and B as a full pin, no filter: a TRACKER const and deepEqual (mos-1419). After: round 4 8616b9a4f, manifest a1ff5d67, Duckworth APPROVE c31053 rev 3469 with C1/C2. Run 4 from npm ci green: webui 365, cli 909, bus 873, 10 scripts, M1-M11 killed. Merged tree d3059c2c3 (11 cherry-picks, range-diff all =, patch-id 8371405a equal): stack-release-external 25/25, stack-upgrade 21/21. stack-release 223/224 on the first run, R9 at :2178: TypeError on join(r.dir) with r.dir null, so rehearse stopped before its directory and the output was lost. R9 passed 6/6 run alone on d3059c2c3, 09d0d6faf and 24b745447. Mos (mos-1422) allowed one unedited whole rerun: 224/224. 294 LANDED d3059c2c3 07:04Z, done rev 3471, #1800 closed c31068, P19 269 c895. Row 303 (#1810, Vikunja 589, brief ad6ca7930) adds an r.dir guard in R9 only. Queue commit 80793d824 (revs 3464-3473). Row 219: Rocko's second edit 7cbd839d0 (mos-1418, Dewey dewey-0883) restarted and went red at thread-launch C2-09a :489 on a legacy history path. The third edit 5f2ef92e5 (mos-1420, Dewey dewey-0885) reads the native session path. 219 now rebases onto 80793d824, because 294 overlaps its webui files. Correction: the first merged-tree check counted on the 292 drift and found an unrelated transient, and my P19 placeholder sed also rewrote the script's own guard line; the guard refused to post, and I restored the line before posting.
|
||||
|
||||
Row 299 (573, #1806, Gander, Filbert): before, the P10 band test timed a fault run minus a separate baseline run, and a loaded whole-suite run went red. Mos approved direct timing from host /proc/uptime stamps with ambient load only (mos-1409). After: rebased onto 80793d824 as ffa93b054 (range-diff 3/3 =, manifest 277ace0b unchanged). Gate 07:26Z-07:50Z: case1 whole 3x 53/0/0, cli whole 917/0/0 (59 files, load 1.54-7.17), P10 inner 2.27 s, outer 4.01 s, M1-M6 killed. M4's planned guard return then exact outer-reason failure counts as its kill (sage-3271, mos-1426). Filbert APPROVE c31084 rev 3485, N1 M1 margin 0.02 s. 299 LANDED ffb2fedfb 08:03Z, done rev 3487, #1806 closed c31087; queue commit 8a35ffadb (revs 3474-3487). Row 303: Duckworth APPROVE c31079 rev 3480 with C1, the whole-file gate. Rows 219 (bfa421b6c) and 295 r2 (b16cef1d0) rebases: Dewey static clean. Corrections: Launchpad and Gander have no token, and the CLI refuses another seat's token file, so I posted both requests as sage (c31082, c31083). My sage-3265 wording led Duckworth to poll queue show into Gander's slot (07:20Z-07:26Z); I ruled it ambient load (sage-3274).
|
||||
2026-10-23T10:48:40Z | Sage, rows 302, 295 and 219 landings, the Docker pool diagnostic, rows for Vikunja 590 and 591 | Before: refactor 1ac655005. 302 (#1809, Gizmoduck, Dewey) LANDED 3ed9fd754 08:49Z: 7 commits onto 1ac655005, range-diff all =, tree = gated merge 783602e06; queue commit 07802dc57 (revs 3488-3494). Row 219's gate went 11/3 in test-release.sh: release activate's health check failed because Docker could not create sage-diag1437_default, since all predefined address pools were used up. Under mos-1437 I reproduced it on clean 07802dc57 (11/3, the same stderr). I then removed 18 unused gate _default networks, and the rerun went 14/0 with the run-task marker ok. Mos accepted the removal and ruled that a probe that can create something waits for the go and a removal waits for the report (mos-1438). 295 (#1801, Morgana, Dewey) round 2 gate on d68b4300d (manifest e94c9aeb) was green. It LANDED 2efd127ce 10:10Z: 9 commits onto 07802dc57, HEAD~1 tree = gated a86592ffc. Done rev 3502, #1801 c31105, P19 414 c911. 219 (#1720, Rocko, Dewey): the restart on the post-295 merge 054da642f (manifest 4a2271dd, my mos-1439 call) passed node 2523/0/2 and shells 449/0, with 24 mutants killed. It LANDED 5fdfd7275 10:40Z (8 row commits plus packet-only evidence, tree e86a84a85 = gated). Done rev 3509, #1720 c31110, P19 416 c913. Queue commit 90633c864 (revs 3495-3510). Brief docs/plans/2026-10-23_gate-env-rows.md names rows for 590 (claude-session slug) and 591 (compose network cleanup), and DEFERRED.md gets 219 N1 (U6). Row 272 (Huey) conflicts with 5fdfd7275 in code, so it moves back to in-progress for a rebase. Its new fallback is bounded to a session.list access-refused on an omitted-session route (sage-3357). Corrections: my network create probe ran before Mos's go, and the removal ran before the report. My first slot-order line put the diag start at 09:44Z; it was about 09:41Z. My 219 push piped its output through grep, but the after-fetch confirmed origin. Queue commit 90633c864 also carries Huey's rev 3510 (272 back to in-progress), and its message names only 3495-3509.
|
||||
|
||||
|
||||
2026-10-23T11:03:46Z | Gyro Vikunja571 mos-1444 PRD d8 follow-on | Branch gyro/editor-571-d8 from origin/refactor c16e943b9. Both designs now keep library.convert outside ACTIONS/ROUTED and broker processing, retain REQ-WAIT-1/hard-wait test unchanged, constrain unmarked story eligibility to mapped book/playground scope, and add whole-host pre-import restore recovery from remote import manifests plus the Gitea archive commit. Lookups refuse until one current version is proven; VM1012 restore needs Jason present under Q185. W7 no longer owns hard-waits.test.mjs. Canonical queue next gyro returned nothing; direct Mos assignment governs. Static diff, exact replacement and append-only checks pass. No code, tests, build, browser, private-file or live action. Fenton re-check requested after authorized branch push.
|
||||
|
||||
2026-10-22 | Huey | Row 272 / 264e (#1777) preparation on huey/row272, base 2d0d407ba. Before: bus session metadata and launcher isolation exist, CLI/Console expose only the saved thread default. Draft: session CLI, Console chooser with isolated drafts/cursors/receipts, metadata counts and safe-clear operation receipts against Gizmoduck's 0260 contracts; narrow deferred B6 reply fence. Tests authored, not run: Gander row 253 holds Sage's slot; no Node, claim, HTTPS git, push or live changes. This entry records preparation after the first draft, not a green acceptance result.
|
||||
|
||||
2026-10-22 | Huey | Row 272 draft, 264d additive contract gizmoduck-0272 (78e14352f). Added confirmed cancellation through the human channel, cancelled receipt retirement distinction, named refusals and routed-message cancellation output. Before: cancelled was not recognized as terminal; after: draft CLI stops polling and Console shows the before/after retirement outcome. Acceptance remains unverified: no Node/tests/claim/commit/push under Sage's gate. No runtime/lifecycle authority expanded.
|
||||
|
||||
2026-10-23 | Huey | Row 272 / 264e sage-3141 local rebase. Before: uncommitted draft on 2d0d407ba. After: same draft on new huey/row272-b23783f39 at b23783f39, with 270/271 landed (7328da8ca) and schema 3n. Product changes auto-merged; both append-only logs retain the full new base and original Huey additions. Checked landed session.list and clear/cancel/operation envelopes against the wired draft: no incompatible contract change. Historical unavailable-dependency cases stay as stand-ins; actual base supplies counters and lifecycle state. No tests/Node/claim/commit/push while Gander holds row 574 run 2. Existing-test fixture/assertion delta is named in the packet for Mos's ruling via Sage before execution.
|
||||
|
||||
2026-10-23 | Huey | Row 272 sage-3145 preservation correction. refs/stash is shared, so it was unsafe as sole draft storage. Pinned exact stash commit 07dc9d2f7944b4781b5e80dfa18425f4749f7a45 to local huey/row272-stash-keep and left the entry untouched. Sage explicitly directed committing the rebased draft before testing to preserve it: an untested local checkpoint, no acceptance claim. No Node/test/queue/network/live action. Separate claims and test CLEARs remain pending; old-test delta is with Mos via sage-3144.
|
||||
|
||||
2026-10-23 | Huey | Row 272 early static review follow-up, scrooge-272-early-read-huey-1. Before: a bad-session 404 erased sibling draft/recovery caches, malformed clear/cancel write receipts omitted the audit line, and another session's op key produced an ambiguous error. Draft after: purge only on named thread-level refusals, write one redacted malformed-receipt audit line, and identify key reuse without a write. New browser/HTTP/CLI tests authored, unrun under test hold; approved old-test hunks unchanged. Published 850b22680/round-1 manifest unchanged; follow-up is uncommitted, no acceptance claim.
|
||||
|
||||
2026-10-23 | Huey | Row 272 round 2 on row 219 landing 5fdfd7275, after 295. Replayed round 1 and B1/N1/N2; seven conflicts resolved retaining both log histories, both test sets, 219 instance chooser and 295 owner-settings-only transport. Static comparison confirms old tests differ only by mos-1388 approved hunks. Sage3357/Mos1442 authorize bounded granted-user legacy fallback: only session.list access-refused and omitted-session route; no new session grants or owner routing. RED first under3358 on new file only: 1 expected legacy assertion failure, 3 guards pass, 3.504s, TMPDIR mktemp/no underscore, no compose network; slot returned as huey0035. Then implemented fallback and added timeout/bus/malformed guards plus isolated-copy mutant runner, all unrun afterward. Candidate commit/push precedes Sage's full gate by3354; no green claim.
|
||||
|
||||
2026-10-23 | Huey | Row 272 round 3 per mos-1455 / sage-3435. Gate run 1 on b44332a93 RED: bus 891/0, business 231/0, CLI 940/1, plugins 110/1, webui 372/20; no mutants. Fixed only new CLI fixture role authority and three null-old render guards. Catching browser tests unchanged. manifest.r3 freezes the same 17 paths. Authorized pre-gate follow-up commit/push; no local tests, Node or queue writes; separate compactions dependency and Sage gate remain pending.
|
||||
|
||||
2026-10-23 | Sage (1ef1e4f8) | Row 272 landing (#1777, 264e) | Gate r4 on bea0c8e1c over 1e629c892: bus 891/0, cli 941/0, webui 392/0, business 231/0; plugins 110/1, the single red being row 65 harness.test.mjs:192 naming compactions.mjs, which row 307 owned and fixed. M1-M6 and F1-F4 killed, restore clean. Landed d33989230, queue commit 8dc132bec.
|
||||
|
||||
2026-10-23 | Sage (1ef1e4f8) | Row 307 landing (#1814, Vikunja 598) | Six first-parent commits replayed onto 8dc132bec with matching patch-ids, 16 paths equal to 6fdfe3790, manifest digest 17c9f8d9 rebuilt from git. Gate green 14:37:21Z: bus 891/0, cli 941/0, plugins 119/0, webui 392/0, business 231/0, every other package 0 failed 0 skipped, every scripts/test-*.sh passed (skips: test-queue canonical root, test-task live provider x2). M1-M4 killed, restore clean. Landed d243f6b25, DEFERRED 307 N1 0621c439e, queue commit fe4ee8c7b. Correction: my first note said Vikunja 598 done when I had only commented (951); Mos closed it (952).
|
||||
|
||||
2026-10-23T17:29:46Z | Gyro Vikunja571 sage-3542 Connections amendment | Branch gyro/editor-connections-design cut exactly from landed PRD1.17 30e6bb680; read REQ-LIB-5 in that PRD. Replaced stale J-b waits in parent and W4. Proposed W8 owns current authorized Markdown/DOCX links/backlinks list, labels, versioned refresh, leakage refusals and fixture tests. Build order under mos-1470/comment961 is W7 closed routing candidate, W8 landing, then W7 human first-real-import opening. No REQ-LIB-8 condition or acceptance change. Q234/mos-1363/S0 M1-M14 and post-10-27/MVP priority fixed. Static diff, twelve brief sections and append-only checks pass. No repo Node, tests, build, browser, queue mutation or live action. Fenton reviews after authorized docs branch push; Sage lands on approval.
|
||||
|
||||
2026-10-23T17:32:37Z | Gyro sage-3544 fenton-0016 N1/N2 delta | Before: W7 Gate/final real-conversion list omit the W8 build-order cross-reference and W8 human-view filtering cites agent settings. After: both locations explicitly put W8 landing before human opening as mos-1470 build order, not acceptance; comment/tracked-deletion links are not current story links and never appear in the human Connections view regardless of agent settings. New commit atop approved 5af060fb5, no amend. Static diff and append-only checks pass. Docs only, no repo Node/tests/live action. Fenton checks only this delta.
|
||||
|
||||
## 2026-10-23 — Row 288 C2-02 build starts (Bubba, #1793)
|
||||
|
||||
Before: agents can read the library; supporting-path and push-credential dependencies are separate unlanded heads. After intended: per-seat supporting writes/deletes with exact notices, human revert and one commit per Console save. Work is on bubba/row288, chained on original 283/285/286 commits; 284 tool base still pending. Plan and acceptance evidence: agents/bubba/work/queue-288/BUILD.md. Untested; no Node/test/build/gate run before Sage CLEAR. Landing waits for every dependency's own gate.
|
||||
@@ -47,14 +47,6 @@ its launch configuration remains fixed, including on resume. Use Filbert's
|
||||
wrapper to select that configuration; a direct shared-helper invocation uses
|
||||
its own supplied flags or the system defaults.
|
||||
|
||||
Any run that includes the webui suite, whether a seat's slot run or a landing
|
||||
gate, sets `MOSAIC_REQUIRE_EDITOR_BUILD=1`, so a missing editor toolchain fails
|
||||
the run instead of skipping the rebuild test. A worktree that links the
|
||||
canonical `node_modules` also runs `npm ci --ignore-scripts --no-audit --no-fund`
|
||||
in its own `packages/webui` first. The root install carries esbuild 0.28.1
|
||||
through pi-coding-agent, and the rebuild needs the 0.28.2 that
|
||||
`packages/webui/package-lock.json` pins (Vikunja 597, mos-1453).
|
||||
|
||||
All agents follow repository governance and current user direction. Team
|
||||
leadership does not add deployment or push authority. Coordinate overlapping
|
||||
work with Sage and preserve other sessions' changes.
|
||||
|
||||
@@ -1,304 +0,0 @@
|
||||
# Row 288 (#1793): C2-02 agent writes, notices, revert and Console saves
|
||||
|
||||
Owner: Bubba, Codex gpt-6.1-sol, thread 3d6672b5-5544-4b95-9e09-e79574f1aa14.
|
||||
Reviewer: Webby. Gate and landing: Sage. Append-only build record.
|
||||
|
||||
## 2026-10-23 start and implementation plan
|
||||
|
||||
Base 45dca69f6 on bubba/row288. Direct mandate mos-1499 (Q245), confirmed sage-3613.
|
||||
The canonical `scripts/mosaic queue next bubba` returned `nothing`; Sage owns the owner transition.
|
||||
The initial worktree invocation refused linked-worktree use; retried in canonical checkout.
|
||||
|
||||
Spec: docs/plans/2026-10-20_case2-rows.md, C2-02; agents/gosalyn/work/case2/DESIGN.md ruling after r11.
|
||||
Handoffs: Honker queue-283 BUILD.md Q4 (missing/non-100644 delete refuses); Morgana
|
||||
queue-225 BUILD.md A2 at 66f7becf2 (strict revert arguments/result), confirmed by Fethry fethry-0005.
|
||||
`project` is the business.projects key, never a chat UUID.
|
||||
|
||||
Dependencies merged with their commits intact, no amend or force-push:
|
||||
- 283 origin/honker/row283-build 88ec5e8e4 (new E4 head to follow).
|
||||
- 285 origin/scrooge/row285-r2 53db6b7ca.
|
||||
- 286 origin/ludwig/row286-r2 573fa0be0.
|
||||
- 284: no named remote branch yet. Tool changes come last.
|
||||
All merge commits are marked Untested. Nothing has run under Node. Sage's latest instruction
|
||||
sage-3613 reserves **all Node and test runs** for CLEAR; this supersedes the initial targeted-test
|
||||
permission. Build untested now as instructed, then run RED/GREEN checks/mutants on CLEAR.
|
||||
|
||||
Architecture: one host-only plumbing writer under the existing library lock; broker authorizes and
|
||||
selects credentials, then inserts the fixed notice directly. Human save/revert use editor +
|
||||
library-human independently of seat lifecycle. No worktree, deferred push, role expansion or UI.
|
||||
|
||||
### Tasks and acceptance
|
||||
|
||||
- [ ] Plumbing: new library/src/write.mjs, mirror state publication and package exports; new
|
||||
library/tests/write.test.mjs. One-parent write/delete, byte-exact content, seat identity/trailer,
|
||||
stale-base, nonregular/missing deletes, retry once on an unrelated remote change, push failure
|
||||
without local ref movement, human editor and revert reachability/single-path checks.
|
||||
- [ ] Broker + runtime: library.doc.write/delete, library.file.save, library.revert; strict keys,
|
||||
creative + library.write + live unheld project grant; direct exact notice; human-only save/revert.
|
||||
New bus/tests/library-write.test.mjs covers authorization, unchanged refs, A2 contract and socket.
|
||||
- [ ] Transport: only human library.file.save joins the existing large-save exception. New tests
|
||||
prove >64 KiB save accepted, agent writes retain 64 KiB bound, malformed/oversize saves refuse.
|
||||
- [ ] Tools after 284: library_doc_write/delete in harness tools; exact eight/ten-name snapshots
|
||||
in a new harness test; cli dispatch wiring.
|
||||
- [ ] Verify on CLEAR: new tests, library/bus/harness suites and all scripts/test-*.sh on Sage's
|
||||
assigned slot. Mutants remove supporting guard and force push; both must fail. Fixture-token
|
||||
search over captured output. No gate, landing or queue move claimed before Sage's acceptance.
|
||||
|
||||
Pre-flight interfaces: broker consumes library writer {project,path,commit}; revert adds reverted;
|
||||
writer consumes C2-03b push {pushed} or {raced,tip} and supportingPath(mapping,universe,path,tree).
|
||||
State publication must add optional lastPush while preserving old state readability. Refusals must
|
||||
restore fetched remote-tracking refs as well as preserve served. Runtime must bind credential file
|
||||
references itself; no file, identity, message or credential is supplied by the agent.
|
||||
|
||||
Necessary file-scope additions: packages/bus/src/runtime.mjs (actual adapter injection),
|
||||
packages/library/src/index.mjs (exports), and CLI's existing console adapter if saves require it.
|
||||
Reported to Sage in bubba-0002. Existing tests will not be edited without Mos's OK via Sage.
|
||||
|
||||
Review focus: remote tip races, nonregular entries and folded paths, unsafe human credential before
|
||||
git, revert after revoked/fired writer, and large-request exception never extending agent writes.
|
||||
|
||||
### Existing-test changes
|
||||
|
||||
None authored by Bubba yet. Dependency test changes remain their owners' original commits.
|
||||
|
||||
## 2026-10-23 first static build (not a gate result)
|
||||
|
||||
283 E4 merged intact at 76d651dba. Honker next reports e67c27b32 (test environment only), to merge
|
||||
before push. Della reports row 284 has not been built/pushed; row224's 23816cf28 is not a 284 head.
|
||||
No speculative 284 pin. Typed tools and served-blob lookup integration remain pending 284.
|
||||
|
||||
Implemented (unrun): bare plumbing writer, one-parent commit and fixed trailer, exact-content blobs,
|
||||
base comparison, supporting path guard and delete regular-blob check, one remote-race retry,
|
||||
ref restoration on refusal, immediate served publication/lastPush; human save and reachable one-path
|
||||
business-trailer revert; broker grants/identity/notice path; runtime adapter wiring; large-save socket
|
||||
exception. New tests: library/tests/write.test.mjs and bus/tests/library-write.test.mjs. No old test edits.
|
||||
|
||||
### Approved scope additions, sage-3628
|
||||
|
||||
Every hunk outside the brief's owned list:
|
||||
- `packages/bus/src/runtime.mjs`: `humanWriteOptions` checks editor before choosing the human slot;
|
||||
three library adapter entries bind dataRoot, command and the host-only seat store reference. These
|
||||
are needed to make actual bus calls reach the new writer without accepting agent-supplied files.
|
||||
- `packages/library/src/index.mjs`: export writeLibraryDoc/saveLibraryFile/revertLibraryCommit so
|
||||
runtime's existing library module adapter can call them.
|
||||
- `packages/library/src/sync.mjs`: shared write guard with opaque token compared by identity;
|
||||
push's race fetch recognizes only that owner and does not clear its guard; ordinary sync and a
|
||||
forged token still refuse library-sync-busy. Narrow publishLibraryWrite validates ids, reads the
|
||||
locked state, rebuilds the index via readLibrary, moves served/tracking and writes lastPush. The
|
||||
raw writeState remains private and is not exported through index.mjs.
|
||||
|
||||
Ludwig ludwig-0064 reviewed the intended interface and requested the opaque token (implemented),
|
||||
narrow publication (implemented), whole library + bus library-credential checks and a token mutant
|
||||
(planned). His 573fa0be0 remains current and unrun. 288's additions are separate commits, not folded
|
||||
into 286. Tracking restores only if the whole write refuses, not between the first race and retry.
|
||||
|
||||
Known tradeoff, accepted by Sage sage-3628 for MVP: the brief holds the flock through network Git;
|
||||
readers can hit the existing 5-second library-sync-busy while it runs. Structural supportingPath
|
||||
preflight is pure and precedes Git; served/fetched listTree checks repeat it with the real tree before
|
||||
any remote write. A tree-dependent check necessarily reads the tree first (Honker honker-0184 item2).
|
||||
|
||||
### Mutants for CLEAR
|
||||
|
||||
- Remove the `pathOf` calls for agent operations: the M12 broker/bare-ref tests must fail on a
|
||||
story/unsupported path while checking remote, tracking and served refs.
|
||||
- Prefix the push refspec in syncCommand with `+`: write.test moved-target race must fail, because
|
||||
its command seam preserves production syncCommand's refspec (only remote URL/protocol are fixture).
|
||||
- Replace `writers.get(mirror) === writeToken` with `true`: write.test forged-token case must fail.
|
||||
|
||||
No Node, test, build or mutant has run. `git diff --check` is clean. Counts are not claimed.
|
||||
|
||||
### Console dispatch integration
|
||||
|
||||
The existing cli delegates its transport wiring to console-bus.mjs, so the save dispatch needs that
|
||||
file too: one null `librarySave` option and one `--send` assignment to library.file.save. cli.mjs
|
||||
threads that option into startServer; row C2-11b owns the actual route/page that consumes it. New
|
||||
webui/tests/library-write-options.test.mjs covers --send and the user transport boundary. 225 owns
|
||||
libraryRevert dispatch; 288 adds only librarySave to avoid overlapping that ownership. Additional
|
||||
scope reported to Sage and Fethry. No changes to an existing test.
|
||||
|
||||
## 2026-10-23 second static pass and dependency review
|
||||
|
||||
First push: c867cada9 on origin/bubba/row288, reported bubba-0005 to Sage/Webby/Mos and
|
||||
bubba-0006 to Fethry/Ludwig. No PR created and no review/gate requested as complete.
|
||||
|
||||
Ludwig ludwig-0065 checked the exact sync diff against 286 without running anything. Token identity,
|
||||
ordinary-sync exclusion, 286 R1 preservation, guard key and end-of-write tracking restoration fit.
|
||||
F1: state publication could fail after served moved, leaving old state/new served. Root cause is
|
||||
publication order without rollback, compared against sync's existing rollback. Added an unrun
|
||||
filesystem rename-failure regression, then changed the narrow helper: on failure it validates the
|
||||
state under the same lock, CAS-restoring served if state has not published the new commit. If rename
|
||||
succeeded but directory fsync failed and the state validates against new served, it keeps that pair.
|
||||
All failure cases answer outcome-unknown; tracking remains the commit already pushed remotely.
|
||||
Verification is pending CLEAR, so this is a proposed fix, not a tested resolution.
|
||||
|
||||
Added the actual broker-to-bare tests for each M12 path refusal (both agent verbs), unchanged remote
|
||||
and all mirror refs, exact write/delete notices, and human revert after fixture grant removal/hold.
|
||||
The bare fixture moved to new library/tests/write-fixture.mjs so broker tests reuse real plumbing.
|
||||
Added the raw socket proof-nested-save-name case to pin the parsed-verb large-request check.
|
||||
Missing editor/slot tests now make the mirror metadata invalid first: reaching Git would change the
|
||||
refusal, so the tests check the pre-Git gate rather than merely count remote commands.
|
||||
|
||||
Additional required doc hunk: packages/library/README.md appends the four verb contracts,
|
||||
lastPush shape, exact notice, lock tradeoff and publication failure behavior. No existing test from
|
||||
the dependency/base has changed. All new/modified tests in this pass were authored by this row.
|
||||
`git diff --check` remains clean. No Node/tests/build/mutants run; 284 and CLEAR remain pending.
|
||||
|
||||
## 2026-10-23 early review follow-up (Webby E1-E6; Ludwig F2)
|
||||
|
||||
Sage sage-3652 approves console-bus.mjs wiring (null option + --send dispatch), confirms editor.user
|
||||
as the sole human login source and reserves CLEAR for T3/T4 after T2. Ordinary sync()'s separate
|
||||
post-rename fsync gap stays out of 288 per that ruling; no change to sync()'s existing rollback.
|
||||
|
||||
Honker 283 head 46bad7ea3 merged intact: mapping editor.user is optional, and if present uses the
|
||||
existing plain Gitea-user pattern. The omission at mapping level is valid; human writes refuse it.
|
||||
|
||||
- Ludwig F2 / Webby E6: confirmed the previous runtime used the fetch bot's mapping.user wrongly.
|
||||
Runtime now passes mapping.editor.user to humanCredential, never mapping.user. Missing user gives
|
||||
library-human-missing before Git. New real-runtime cases pin both save and revert with a separate
|
||||
fetch-bot login, positive pushes under her-gitea-login, and no command for an absent editor login.
|
||||
The broker's credential.agent is s.role, not args: added an exact assertion and strict-key refusal
|
||||
cases for caller-supplied agent and credential.
|
||||
- E1: replaced the business-id RegExp interpolation with a literal startsWith(business.id + '/')
|
||||
check and ID_PATTERN on only the instance suffix. New acme.co vs acme-co trailer test.
|
||||
- E2: new broker→bare case holds the seat in the fetch command. beforePush must refuse
|
||||
library-write-no-grant with all local refs and the remote unchanged and no notice. New mutant:
|
||||
remove `options.beforePush?.();` in write.mjs; the E2 test must fail.
|
||||
- E3: new broker cases for expired rotate_by, fire.stopped without fire.done, missing role.publish
|
||||
project, grant/identity Gitea-user mismatch, and missing identity name/email, for both agent verbs.
|
||||
- E4: the exceptional publication failure currently returns outcome-unknown before the broker has
|
||||
a successful result to put in a notice, so a remote agent commit can exist without a Console
|
||||
notice. There is no durable notice outbox/retry in this row. The trailer commit remains human
|
||||
revertible by id after sync; this is an explicit known failure-mode gap for the manifest, not
|
||||
a claim that every failed publication emits a notice. A new real-push test breaks state decoding
|
||||
after push admission, pins outcome-unknown, old served and no notice. It also found a local error
|
||||
propagation gap: errors before publishLibraryWrite's internal try now normalize to outcome-unknown
|
||||
in the writer once push has succeeded, so the caller is never told an ordinary refused-write code.
|
||||
- E5: 284 still has no build. Tools/8-or-10 snapshot and served-blob integration remain pending.
|
||||
librarySave is intentionally only an adapter option until C2-11b supplies its route/page.
|
||||
|
||||
All tests above are newly authored by row288 and remain unrun; no changes to baseline/dependency
|
||||
tests. RED/GREEN and mutants await CLEAR. Proposed fixes are not claimed verified. The new host-only
|
||||
library write module imports the existing pure ID_PATTERN to match the broker's accepted instance ids.
|
||||
|
||||
## 2026-10-23 mos-1520 ruling: post-push notice is required
|
||||
|
||||
Correction to the E4 interpretation above: Mos rejected the known-gap treatment. The requirement
|
||||
stays: a pushed agent commit has the exact notice even if local publication then fails. This is not
|
||||
an outbox or retry. The writer now calls the broker's trusted synchronous onPushed callback as soon
|
||||
as push returns pushed:true, before publication. The callback records the exact library-write notice
|
||||
and action.allowed in the normal Console-store transaction. Publication failure still answers
|
||||
outcome-unknown. The notice's Revert can refuse library-revert-not-agent until sync makes that commit
|
||||
reachable from served; README now says that explicitly and removes the rejected gap description.
|
||||
|
||||
The row's own real-push corruption test now pins the exact notice body with the pushed id, old
|
||||
served and outcome-unknown; after restoring readable state it pins Revert's refusal before sync and
|
||||
success after sync. The successful-write adapter fixture calls onPushed too, matching runtime's
|
||||
writer contract. No existing baseline/dependency test changed (mos-1520 explicitly authorizes this
|
||||
row's test correction without mos-1272).
|
||||
|
||||
Residual Console-store failure: if notice insertion/routing/its event transaction fails, the broker
|
||||
calls a separate host log sink with {event:library-notice-store-failed,code:outcome-unknown,business,
|
||||
instance,op,commit}. It logs no args, path content, credential, raw SQL or exception output. Runtime's
|
||||
new library.log adapter writes this metadata to stderr. The caller gets outcome-unknown even if
|
||||
recording action.refused in that same broken store fails. A new real-push test uses temporary SQLite
|
||||
abort triggers on notice insertion and refusal evidence, checks remote advanced/served unchanged,
|
||||
no message, the exact external log and outcome-unknown. It does not claim a notice can be stored in
|
||||
a failed Console store. If the host log sink itself also fails, no durable log can be promised; the
|
||||
caller still receives outcome-unknown. The runtime log hunk is the required residual-failure wiring.
|
||||
|
||||
Mutant added: move `options.onPushed?.({ project: context.project, path: change.path, commit });`
|
||||
from before `await publishLibraryWrite(...)` to immediately after that await inside the same try.
|
||||
Successful operations keep their notice, but the outcome-unknown publication path drops it. The
|
||||
C2-02 E4 real-push corruption test must fail on its exact notice assertion. Run on CLEAR and restore.
|
||||
|
||||
No Node/tests/build/mutants run. Static git diff --check clean. Della's first284 head0ed4fbab9 is
|
||||
explicitly incomplete and not a finished dependency; waiting for her complete-head pin before tools.
|
||||
|
||||
Webby webby-0253 (static, cef503cb9) closes E4 per mos-1520; no tests ran. N1: a failed notice insert throws from onPushed before publication, so served stays at the prior commit until sync; the store-failure test pins this safe direction. Only E5 (284 tools/snapshot integration) remains open in this early review.
|
||||
|
||||
## 2026-10-23 complete284 merge and final tool integration (unrun)
|
||||
|
||||
Della della-0037 supplied complete untested head47db04eba85ac3ceb7e81385603f97bb6f8c1a38,
|
||||
replacing the incomplete head. Merged intact as c0ca3894c. Its22423816cf28 and2164f3fbc25a
|
||||
lineage is retained. Three conflicts were in overlapping production wiring only:
|
||||
- broker.mjs: keep Della's LIBRARY_LOOKUPS object and #requestLibraryLookup byte-for-byte, and
|
||||
keep288 writer/notice methods; LIBRARY_VERBS contains both sets and request dispatch calls lookup.
|
||||
- runtime.mjs: keep lookup adapter plus288's metadata log and write adapters.
|
||||
- library/index.mjs: keep index/query exports,286's push/humanCredential exports and288's writer exports.
|
||||
No dependency test body was changed in the merge. These are overlapping consumer integrations,
|
||||
not rewrites of dependency commits. Every prerequisite still needs its own gate (mos-1351).
|
||||
|
||||
Added library_doc_write/library_doc_delete after the five lookups, only for a creative definition
|
||||
with a within-role library.write grant and library enabled. Closed schemas carry exactly
|
||||
{universe,path,base,content} and {universe,path,base}; base is string-or-null with 40-lowercase-hex
|
||||
pattern. No project, business, author, credential, commit or message. tools.action is library.write.
|
||||
New harness/tests/library-write-tools.test.mjs pins per-role eight/ten names, both schema invariants,
|
||||
no repo/commit/business/accept, exact required/verb/action, nullable base, and missing library/grant
|
||||
or noncreative exclusion. This satisfies sage-3678 and mos-1523's replacement coverage condition.
|
||||
|
||||
Publication's narrow helper now calls indexFor for the new served commit instead of only readLibrary,
|
||||
so the284 lookup index is rebuilt before publication. New broker integration uses library.get's
|
||||
served blob as write/delete base, independently checks served:path, reads the new text/blob immediately,
|
||||
preserves default-canon null, then sees null after delete. No change to284's query behavior.
|
||||
|
||||
### Authorized baseline-test migration, own commit (mos-1523 via sage-3677)
|
||||
|
||||
File: packages/harness/tests/library-tools.test.mjs. Numstat: +4/-4, exactly.
|
||||
The noncreative LOOKUPS assertion at :33 is unchanged. Every existing lookup schema assertion stays.
|
||||
The four old/new lines are:
|
||||
|
||||
```diff
|
||||
- ? ['web_search', 'web_fetch'] : []), ...LOOKUPS];
|
||||
+ ? ['web_search', 'web_fetch'] : []), ...LOOKUPS, 'library_doc_write', 'library_doc_delete'];
|
||||
-test('M3: per-role snapshots contain six names, or eight with the C2-08 web grant', t => {
|
||||
+test('M3: per-role snapshots contain eight names, or ten with the C2-08 web grant', t => {
|
||||
- for (const [i, tool] of tools.filter(t => t.name.startsWith('library_')).entries()) {
|
||||
+ for (const [i, tool] of tools.filter(t => LOOKUPS.includes(t.name)).entries()) {
|
||||
- assert.deepEqual(tools.map(t => t.name), ['send_message', ...LOOKUPS]);
|
||||
+ assert.deepEqual(tools.map(t => t.name), ['send_message', ...LOOKUPS, 'library_doc_write', 'library_doc_delete']);
|
||||
```
|
||||
|
||||
Additional schema mutant (mos-1523): add `commit: str("caller commit")` to writeBase in tools.mjs,
|
||||
thereby adding it to either/both write schemas. The new-file schema test must fail both its exact
|
||||
property set and forbidden-property assertions. Run on CLEAR and restore. No further assertion
|
||||
change in library-tools.test.mjs is authorized or made.
|
||||
|
||||
All code/tests/mutants remain unrun. No Node, build or syntax check before Sage's named CLEAR.
|
||||
Static diff --check is clean. Scope additions stay listed above, now including indexFor import and
|
||||
call in the previously approved narrow publication helper. E5 implementation is present; review and
|
||||
acceptance are pending evidence, not claimed complete.
|
||||
|
||||
## 2026-10-23 testing and landing boundary (sage-3682)
|
||||
|
||||
Latest complete dependency2845d587a552 (test/docs only over47db04eba) merged intact as f8f79ea2f.
|
||||
Own tool implementation cd2f50dae and separate mos-1523 migration29455c0c5 are pushed; Webby reads
|
||||
E5 and Dewey checks the migration. Static manifest-r1 covered21 own paths at f8f79ea2f.
|
||||
|
||||
Sage reserves first focused runs/RED-GREEN/mutants for T7, provisionally about22:25Z, unless he
|
||||
explicitly frees an earlier lane. No Node before his CLEAR. This is a schedule, not CLEAR. Full
|
||||
library/bus/harness and shell gates still need their own authorized slot; no gate result is claimed.
|
||||
|
||||
Before the gate, incorporate landed refactor after283/224/284 land while preserving every
|
||||
prerequisite. Under the standing add-commits/no-force-push rule, update this published branch by merge
|
||||
rather than rewriting its pushed history. 288 lands last in the chain; no landing is authorized here.
|
||||
|
||||
## 2026-10-23 E5 static closure and N2 wording
|
||||
|
||||
Dewey dewey-0948: the mos-1523 migration at29455c0c5 is static CLEAN, exactly+4/-4, with the
|
||||
noncreative assertion unchanged and new-file schema coverage meeting every condition. Webby
|
||||
webby-0263: E5 closed on29455c0c5/cd2f50dae (f8f79ea2f;98ca25ab1 only BUILD.md), nothing blocking.
|
||||
Both ran nothing; Webby did not read the scratch manifest, so no manifest verification is implied.
|
||||
|
||||
Webby N2: delete inherited the write base description "or null to create". Delete now overrides only
|
||||
that description: "The existing file's blob from library_get; a missing file cannot be deleted".
|
||||
The reviewed nullable-base schema/required keys/verbs remain unchanged. The row's new schema test
|
||||
pins create wording only on write and existing-file wording without create on delete. No further
|
||||
assertion change in the baseline library-tools.test.mjs. No Node/tests run; still await Sage CLEAR.
|
||||
|
||||
## 2026-10-23 dependency283 follow-up (honker-0195)
|
||||
|
||||
Merged origin/honker/row283-build b2a1f4092 intact, fast-forward lineage from46bad7ea3. It changes
|
||||
supporting.test's helper and Honker's BUILD receipts only; no production source changed. Honker
|
||||
reports library98/98, business231/231 and14/14 mutants killed on that dependency head. Those are
|
||||
his dependency receipts, not verification of288's combined branch. No288 Node/tests run; Sage's
|
||||
CLEAR is still required. The dependency's own gate/landing remains Sage's responsibility.
|
||||
@@ -1,170 +0,0 @@
|
||||
# Row 224 — C2-05b broker lookups and typed tools (#1725)
|
||||
|
||||
Owner: Della; reviewer: Dewey. Assignment sage-2795; scope extension sage-2804.
|
||||
Base: `4f3fbc25a` (Researcher C2-05a). Branch: `della/row224`.
|
||||
Brief: C2-05b in `docs/plans/2026-10-20_case2-rows.md` at `aca16404c`
|
||||
and `51cc0445c`; design section 3, 5.3 M3 and 7.2; C2-05a BUILD rulings.
|
||||
|
||||
## Execution boundary and progress
|
||||
|
||||
Code/docs and local Git only while row 253 holds the gate. No Node (including
|
||||
syntax checks), HTTPS Git, queue claim, test or push until Sage's CLEAR.
|
||||
Tests are written first; their RED/GREEN runs are deferred, not claimed.
|
||||
Queue next is deferred too: its executable uses Node. Sage assigned this row
|
||||
explicitly. After 253 and 216 land, rebase under a new branch name.
|
||||
|
||||
- Pre-flight: query.mjs consumes `{repo,commit,mapping}`; broker cannot import
|
||||
Git/filesystem library code because it is in the sandbox import closure.
|
||||
Runtime injects the host lookup adapter; existing human file/status/sync stay.
|
||||
- Pre-flight: resolved has no project list and a library is never a checkout.
|
||||
Bundle needs an explicit library flag from launcher business configuration.
|
||||
- M3 reading: exact creative base is five lookups plus send_message; retain
|
||||
explicitly granted broker web_search/web_fetch for research/companion under
|
||||
landed C2-08 and sage-2804. No generic spec, task, evidence or decision tools. Residual (mos-1308): those
|
||||
reads lack broker action checks; their typed-tool absence is the only fence
|
||||
for creative roles. M1/M2 deny bash; broker-side refusal is outside this row.
|
||||
Mos confirmed this interpretation in mos-1308; design wording fix belongs to Gosalyn. Other definitions retain their current tools.
|
||||
- Multi-library businesses use an optional project ID; omit it only with one
|
||||
configured library. Universe is required for all five tools, including get.
|
||||
- Missing library uses the brief's `library-not-configured`; argument errors
|
||||
reuse `invalid-request` and C2-05a query codes. No new action or authority.
|
||||
|
||||
## Manifest (draft code, unrun)
|
||||
|
||||
- bus/src/broker.mjs: five lookup verbs, strict args, holder/business rechecks.
|
||||
- bus/src/runtime.mjs: host lookup adapter, stale-before-read sync, served pin.
|
||||
- harness/src/tools.mjs: five schemas; creative exact-set filtering.
|
||||
- harness/src/bundle.mjs: library flag forwarded to typedTools.
|
||||
- cli/src/launcher.mjs: one flag derived from trusted business projects.
|
||||
- bus/tests/library-lookups.test.mjs: real query/broker/socket/runtime cases.
|
||||
- harness/tests/library-tools.test.mjs: schemas, role snapshots, bundle parity.
|
||||
- cli/tests/thread-launch.test.mjs: flag reaches a real launched bundle with no library checkout.
|
||||
- agents/della/work/queue-224/BUILD.md: manifest, rulings and deferred verification ledger.
|
||||
|
||||
## Verification ledger
|
||||
|
||||
No test or syntax-check run yet. Acceptance requires full bus/cli/harness suites
|
||||
and every scripts/test-*.sh on Sage's gate; focused files and affected CLI/
|
||||
seat import-closure tests precede that only in an authorized CLEAR.
|
||||
|
||||
## Coordination
|
||||
|
||||
Huey272 reports no runtime/bundle/launcher overlap. Rocko219 changes launcher
|
||||
THREAD_DEFINITIONS checks only, separate from our buildBundle flag argument.
|
||||
The launcher argument is required: bundle cannot derive library presence from
|
||||
checkout IDs (a library has no agent clone). No role, authority or config schema
|
||||
changes; library project entries are already validated and protected by M9.
|
||||
|
||||
## Mount and pin impact (inspection only)
|
||||
|
||||
No new imports in broker.mjs or tools.mjs; no RUNNER_FILES or sandbox mount
|
||||
addition. runtime.mjs is host-only and already imports library index.mjs.
|
||||
Bundle forwards only a boolean, never a root/mapping/slot/credential. The
|
||||
existing import-closure tests are bus/tests/project-runtime.test.mjs and
|
||||
seat/tests/sandbox.test.mjs. Grep found no literal sha256 pin for runtime.mjs
|
||||
or bundle.mjs; bundle tests derive current source digests through SOURCES.
|
||||
Library sources remain in the existing whole-directory release copy.
|
||||
|
||||
## Runs to schedule only after CLEAR
|
||||
|
||||
Set TMPDIR=/mnt/storage/scratch/tmp. Focused new bus/harness files first,
|
||||
then existing library.test.mjs, library-sync.test.mjs, project-runtime.test.mjs,
|
||||
harness creative/tools/spec-tools/bundle files and affected CLI launch tests.
|
||||
Follow with the required whole bus/cli/harness suites and Sage's full shell gate.
|
||||
No timing claim yet: use the repository/Sage per-file limits and record every
|
||||
command, outcome, elapsed time and timeout before acceptance. No focused skip
|
||||
or pattern run substitutes for whole-file gate evidence.
|
||||
|
||||
## Read-through findings and residuals
|
||||
|
||||
- Library get requires universe although the older design table omitted it;
|
||||
section 3 isolation rule and C2-05a's accepted API are binding.
|
||||
- Query type enum matches mapping.TYPES (five values); manuscript is a distinct
|
||||
lookup and not a find type. Unknown host-path/commit/business/accept fields
|
||||
are refused; explicit project is restricted to this business's library list.
|
||||
- Async reads recheck the live holder and current project revision. A stale
|
||||
read attempts sync, then takes the new served snapshot; a returned fetch
|
||||
failure/divergence keeps serving the old pin. Busy sync uses the current pin.
|
||||
Unreadable state, no served commit or unsafe configuration refuse. Query
|
||||
and sync never hold a SQLite transaction over await.
|
||||
- Processing halt refuses new agent lookup work and rechecks before returning
|
||||
async results. Existing human library file/status/sync behavior is unchanged.
|
||||
- Timer sync and reads still use C2-03a's 60-second contract. No timer tuning or
|
||||
resource-limit schema is introduced by this row. Q222 creative reply settings
|
||||
are in C2-06; no reply guard or writing capability is implemented here.
|
||||
- The generic tool socket's existing 60-second client timeout can precede the
|
||||
server's 120-second Git timeout. This row does not change the generic timeout;
|
||||
a timed-out lookup is read-only and retryable, never a write/outcome claim.
|
||||
- All tests are authored but unrun. No RED, GREEN, syntax, runtime performance,
|
||||
sandbox, broker/harness suite, shell gate, claim or push evidence exists yet.
|
||||
|
||||
## Candidate review checklist (read-through only)
|
||||
|
||||
- [x] Five verbs mapped to real C2-05a methods, all require universe.
|
||||
- [x] Default sole library or explicit owned project; no caller repo/commit.
|
||||
- [x] Human-only file/status/sync gates kept; lookup holder rechecked.
|
||||
- [x] Async socket dispatch includes lookup verbs through LIBRARY_VERBS.
|
||||
- [x] Stale/unknown fetch syncs first; results use current immutable served pin.
|
||||
- [x] Six/eight creative names per mos-1308; other roles retain their tools.
|
||||
- [x] Launcher -> bundle -> typedTools passes presence without a library clone.
|
||||
- [x] No imports added to sandbox source closure; no mount change.
|
||||
- [ ] Execute new tests, RED characterization, full files/suites after CLEAR.
|
||||
- [ ] Rebase after rows 253/216 land, under a new branch name.
|
||||
- [ ] Claim/push only in Sage-authorized gap; Dewey review and Sage gate.
|
||||
|
||||
Candidate preservation commits are explicitly unrun under sage-2795; they are
|
||||
not completion, green-suite or landing claims. No dependencies installed.
|
||||
|
||||
Correction: the first committed-range diff --check found a blank line at EOF
|
||||
in the new library-tools test, missed while it was untracked. Removed in a
|
||||
follow-up local commit; the complete range must be checked again. No tests ran.
|
||||
|
||||
## Shared-log receipts for Sage (sage-2815)
|
||||
|
||||
The shared logs are unchanged from the base in this row. Sage appends these
|
||||
receipts in the landing sweep; they are preserved here, not in the manifest.
|
||||
|
||||
For `BUILD-LOG.md`:
|
||||
|
||||
```text
|
||||
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.
|
||||
```
|
||||
|
||||
For `docs/SESSIONS.md`:
|
||||
|
||||
```text
|
||||
2026-10-22T16:36:30Z | Della (sage-2795 / sage-2804, Q220) | Row 224 C2-05b #1725, della/row224 base 4f3fbc25a | Read both pinned briefs and C2-05a source; preparing broker/typed tools and authorized host runtime/bundle seams. No queue command, Node, HTTPS Git, claim, test or push during Gander gate. Dewey reviewer; Rocko/Huey runtime coordination sent. Tests and integration verification deferred to CLEAR.
|
||||
```
|
||||
|
||||
Local-only draft pins 19c0a7adf/7cf39c390 are superseded by the
|
||||
log-free candidate. Saved as local branch della/row224-draft-with-logs before
|
||||
rebuilding the unpublished candidate commit; no remote history changed.
|
||||
|
||||
## Dewey dewey-0852 and Sage sage-2819 — focused corrections
|
||||
|
||||
B1: inline freshness uses max(lastFetch, lastError.at), not lastFetch alone.
|
||||
An error within 60 seconds counts as a recent attempt, so later lookups serve
|
||||
the old served pin without another fetch. Keep inline sync: the brief requires
|
||||
it and businesses without timed libraries have no sync timer. The extended
|
||||
failed-fetch test makes reads at +1, +59,999 and +60,000 ms (one attempt total),
|
||||
then +60,001 ms (second attempt). All reads must return the old commit.
|
||||
|
||||
Required mutant M-B1: remove lastError.at from recentAttempt. The repeated
|
||||
reads must fail the attempted-count assertion. This mutant has NOT been run.
|
||||
|
||||
Residual (Sage will defer): the first inline fetch in each outage window can
|
||||
still exceed the tool timeout (60 seconds, or the runner broker client’s
|
||||
30 seconds). Bounding that fetch is out of scope for 224. Subsequent reads
|
||||
are paced by persisted lastError.at. No claim of first-read outage latency.
|
||||
|
||||
N1: whole bus, cli and harness suites are required, plus the shell gate.
|
||||
If the new thread-launch integration test skips due to sandboxProblem(),
|
||||
name the skip; a skip is not launcher integration proof.
|
||||
N2: cli/tests/thread-launch.test.mjs now depends on library/tests/helpers.mjs
|
||||
mappingEntry() and library/tests/fixtures/mapping.json. Changes to that fixture
|
||||
must rerun the CLI launch file.
|
||||
N3: harness/tests/library-tools.test.mjs compares the type enum to mapping.mjs
|
||||
TYPES, so adding a mapped type cannot silently leave the typed tool behind.
|
||||
|
||||
These edits are local code/docs only. No Node, RED/GREEN run, mutant, claim,
|
||||
HTTPS Git or push. New local pin goes to Dewey/Mos/Sage for focused review.
|
||||
@@ -1,196 +0,0 @@
|
||||
# Row284 C2-05c — supporting scope and served-tree blob (#1789)
|
||||
|
||||
Owner Della; reviewer Dewey; gate Sage. Build start sage-3658/3660 (10-23).
|
||||
Branch della/row284. Original prerequisite base Honker28346bad7ea3;
|
||||
merge fc05bcbc3 carries22423816cf28 and2164f3fbc25a intact. Only conflict was
|
||||
CLI thread-launch's added footer tests: retained both full test bodies and
|
||||
assertions. No prerequisite code copied. Every prerequisite needs its own
|
||||
review/mutants/landing under mos1351; rebase after283 lands.
|
||||
|
||||
## Execution status
|
||||
|
||||
UNTESTED. No Node, node--check, test or mutant run before Sage CLEAR. First
|
||||
own commit is the authorized old-test migration; the implementation follows.
|
||||
Sage authorizes an immediate untested push. No queue write or shared-log edit.
|
||||
224 stays first;284 is critical to Bubba288. T4 for224 is not a CLEAR yet.
|
||||
|
||||
## Binding readings
|
||||
|
||||
Brief C2-05c at94c33a43c:1737-1789, Q226, sage2918 and mos1330 item3.
|
||||
get defaults canon; explicit playground/supporting opt-in; mismatch null.
|
||||
Sort full outgoing/incoming lists supporting, playground, canon before paging,
|
||||
keep cross-scope links and universe filter. Manuscript stays canon/playground.
|
||||
No all/array scope, write tool, guard, mapping or creative-name-count change.
|
||||
|
||||
## mos-1330 old-test migration (separate commit)
|
||||
|
||||
All paths below are packages/library/tests/query.test.mjs. Baseline file at
|
||||
fc05bcbc3 matches216's file. Source assertions retained; negative calls receive
|
||||
explicit scope too, so universe isolation cannot pass on default-scope denial.
|
||||
|
||||
Call/assertion 348 -> 348:
|
||||
|
||||
```js
|
||||
// OLD
|
||||
const rin = await get(s, { universe: 'idea', path: 'Drafts/New World/Characters/Rin.md' });
|
||||
// NEW
|
||||
const rin = await get(s, { universe: 'idea', path: 'Drafts/New World/Characters/Rin.md', scope: 'playground' });
|
||||
```
|
||||
|
||||
Call/assertion 350 -> 350:
|
||||
|
||||
```js
|
||||
// OLD
|
||||
assert.equal(await get(s, { universe: 'harbor', path: 'Drafts/New World/Characters/Rin.md' }), null);
|
||||
// NEW
|
||||
assert.equal(await get(s, { universe: 'harbor', path: 'Drafts/New World/Characters/Rin.md', scope: 'playground' }), null);
|
||||
```
|
||||
|
||||
Call/assertion 366 -> 366:
|
||||
|
||||
```js
|
||||
// OLD
|
||||
assert.equal(await get(src(ref, mapping(WITH_BLEND)), { universe: 'blend', path }), null);
|
||||
// NEW
|
||||
assert.equal(await get(src(ref, mapping(WITH_BLEND)), { universe: 'blend', path, scope: 'playground' }), null);
|
||||
```
|
||||
|
||||
Call/assertion 367 -> 367:
|
||||
|
||||
```js
|
||||
// OLD
|
||||
const own = await get(src(ref), { universe: 'harbor', path });
|
||||
// NEW
|
||||
const own = await get(src(ref), { universe: 'harbor', path, scope: 'playground' });
|
||||
```
|
||||
|
||||
Assertion 349 retained, OLD == NEW:
|
||||
|
||||
```js
|
||||
assert.equal(rin.scope, 'playground');
|
||||
```
|
||||
|
||||
Assertion 368 retained, OLD == NEW:
|
||||
|
||||
```js
|
||||
assert.equal(own.scope, 'playground');
|
||||
```
|
||||
|
||||
The null assertions at350 and366 are the complete OLD/NEW expressions above:
|
||||
expectation remains null. Added one separate no-scope playground-get -> null
|
||||
behavior test. It is unrun and expected to expose old get behavior until the
|
||||
new scope implementation lands. This migration is authorized by mos1330 under
|
||||
mos1272; no check removed or weakened. Dewey checks this list in manifest review.
|
||||
|
||||
## 283 surface and blob choice
|
||||
|
||||
Inspected actual46bad7ea3: optional editor.user is present. reader's parsed
|
||||
file records and index entries still discard tree oid. In owned query.mjs use
|
||||
the existing bounded listTree(repo, servedCommit) to obtain exact path oid,
|
||||
not HEAD and not a user-supplied revision expression. No reader/index edit.
|
||||
Tradeoff: one additional bounded tree listing per get; latency unmeasured.
|
||||
Recheck after rebasing to283's actual landing.
|
||||
|
||||
## Intended owned paths
|
||||
|
||||
query.mjs; broker.mjs lookup branch; tools.mjs lookup schemas/descriptions;
|
||||
library query.test.mjs/query-fixture.mjs; bus library-lookups.test.mjs;
|
||||
harness library-tools.test.mjs; this BUILD.md. Other files are prerequisites.
|
||||
|
||||
## Gate
|
||||
|
||||
Dewey manifest approval, whole library/bus/harness suites and every
|
||||
scripts/test-*.sh on Sage gate. Before review grep all package tests for enum
|
||||
pins and canon/playground pairs. Keep shared logs out; send receipts to Sage.
|
||||
No test or mutant evidence claimed. Manifest/digest follows complete code.
|
||||
|
||||
## Implementation head (UNTESTED, sage-3658)
|
||||
|
||||
- query scope accepts supporting for find/search/get. get defaults canon,
|
||||
mismatch null. Manuscript passes a separate two-value scope allowlist.
|
||||
- get returns blob from listTree(source.repo,index.commit) after scope/universe
|
||||
filtering. The same index.commit supplies the text; source HEAD is irrelevant.
|
||||
- Full outgoing and incoming link lists are stably sorted by supporting,
|
||||
playground,canon before combining/paging. All visible cross-scope links stay;
|
||||
universe/hybrid visibility still applies. Scope metadata isn't added to links.
|
||||
- Broker only adds optional scope to library.get's strict fields. No new verbs.
|
||||
- Typed scope expands find/search/get only; manuscript retains its own two-value
|
||||
enum. Names/M3 counts remain the row224 six/eight, no write tools added.
|
||||
- New tests: book/universe/draft supporting find/search/get; defaults/mismatch;
|
||||
absent supporting prefix; source HEAD advances but each scope's blob equals
|
||||
served:path; 300 outgoing plus300 incoming links ordered across bounded pages,
|
||||
retaining cross-scope links and dropping other-universe links; hybrid source
|
||||
stays canon-only; no all/array scope; manuscript rejects supporting; broker
|
||||
scope/blob forwarding; typed enums and unchanged names. All unrun.
|
||||
|
||||
## Additional old assertion pin (brief Gate)
|
||||
|
||||
harness/tests/library-tools.test.mjs:49 at23816cf28 (line49, unchanged in this head):
|
||||
OLD find scope enum ['canon','playground']; NEW ['canon','playground','supporting'].
|
||||
This is the exact scope-enum pin the brief directs updating. Existing six/eight
|
||||
name snapshots and TYPES equality assertion are unchanged. The new manuscript
|
||||
pin intentionally remains ['canon','playground']. No other two-scope test pin
|
||||
was found by rg over packages/*/tests at this build's prerequisite merge.
|
||||
|
||||
## Proposed mutation evidence (reviewer confirms final set)
|
||||
|
||||
All unrun. Require assertion failures with whole-file runs and pristine restore:
|
||||
M1 remove supporting from query SCOPES -> supporting lookup cases.
|
||||
M2 drop get's requested-scope comparison -> default/mismatch null cases.
|
||||
M3 use source HEAD for blob lookup -> served-tree/advanced-HEAD equality case.
|
||||
M4 remove link rank sort -> multi-page outgoing/incoming expected order.
|
||||
M5 restrict links to requested scope -> cross-scope link counts/order case.
|
||||
M6 drop sees() from visible/link filtering -> second-universe/hybrid cases.
|
||||
M7 allow supporting in manuscript validator -> manuscript refusal case.
|
||||
M8 omit get scope from broker fields -> real broker supporting get case.
|
||||
M9 widen typed manuscript enum -> typed-scope separation case.
|
||||
|
||||
## Inspection and pending gate
|
||||
|
||||
No production imports change in broker/tools, so no new sandbox closure file
|
||||
or mount. query.mjs is host library code and adds existing reader.listTree;
|
||||
no new package/export/copy-path file. rg found the one old find scope pin plus
|
||||
the intentional new manuscript two-scope pin. Whole library/bus/harness and
|
||||
shell gates remain required. CLI integration/merge context is prerequisite224/
|
||||
219, not this row's source delta; any changed gate expectation goes to Sage.
|
||||
Node checks, tests, mutants and elapsed-time evidence remain absent pending
|
||||
CLEAR. The first test-migration commit and this implementation are distinct.
|
||||
|
||||
Sage sweep receipt: Della row284 builds on28346bad7ea3 plus intact224 merge;
|
||||
mos1330 old-test migration separate, supporting scope/blob implementation and
|
||||
fixtures authored, completely UNTESTED. No shared-log/queue write or live action.
|
||||
|
||||
## Current assertion anchors after implementation imports
|
||||
|
||||
The separate migration commit0ed4fbab9 retains its complete OLD/NEW text
|
||||
above. Adding only the fs/path imports in the implementation shifts anchors:
|
||||
|
||||
query.test.mjs:130: `const blendCh2 = await get(src(ref, mapping(WITH_BLEND)), { universe: 'blend', path: 'Book One/Chapters/Chapter 02.md' });`
|
||||
query.test.mjs:350: `const rin = await get(s, { universe: 'idea', path: 'Drafts/New World/Characters/Rin.md', scope: 'playground' });`
|
||||
query.test.mjs:351: `assert.equal(rin.scope, 'playground');`
|
||||
query.test.mjs:352: `assert.equal(await get(s, { universe: 'harbor', path: 'Drafts/New World/Characters/Rin.md', scope: 'playground' }), null);`
|
||||
query.test.mjs:368: `assert.equal(await get(src(ref, mapping(WITH_BLEND)), { universe: 'blend', path, scope: 'playground' }), null);`
|
||||
query.test.mjs:369: `const own = await get(src(ref), { universe: 'harbor', path, scope: 'playground' });`
|
||||
query.test.mjs:370: `assert.equal(own.scope, 'playground');`
|
||||
|
||||
No result/null assertion changed; scope arguments carry the explicit opt-in.
|
||||
|
||||
## Dewey dewey-0941 static review — round2
|
||||
|
||||
Static scope fc05bcbc3..47db04eba CLEAN; not a final verdict or test evidence.
|
||||
M1-M9 accepted as the final set. Optional M10 not added to this gate.
|
||||
N2 taken: keep the existing canon-path supporting-scope mismatch assertion,
|
||||
and ADD get(Book One/Support/Notes/Helper.md,scope:supporting) -> null under
|
||||
the default mapping with no supporting prefix. The supporting-positive test
|
||||
already returns this same path under withSupporting, so the added probe
|
||||
pins the missing-prefix case directly. No assertion removed or weakened;
|
||||
mos1330's separate migration commit and its retained assertions unchanged.
|
||||
|
||||
N1 proposed DEFERRED/follow-up for Sage: retain each tree oid in reader/index
|
||||
entries so get can return blob without cat-file/whole ls-tree -r -l per page.
|
||||
Current get's result is pinned correctly, but per-page cost grows with the
|
||||
library. No performance measurement yet. This optimization needs reader/index
|
||||
ownership and separate acceptance/performance evidence; do not silently expand
|
||||
284's manifest or change its served-snapshot contract for it.
|
||||
|
||||
No Node, tests, mutants or syntax checks run in this round; hold still applies.
|
||||
@@ -1,47 +0,0 @@
|
||||
{
|
||||
"authority": "mos-1409 via sage-3181",
|
||||
"base": "4a9c536e8",
|
||||
"path": "packages/cli/tests/case1-accept.test.mjs",
|
||||
"old_line_replacements": [
|
||||
{
|
||||
"old": " if(fault==='inner')assert.ok(probeSeconds>=1.25&&probeSeconds<2.75,`${mode}: probe ${probeSeconds}s after baseline ${baselineSeconds}s`);",
|
||||
"new": " if(fault==='inner')assert.ok(probeSeconds>=1.25&&probeSeconds<2.75,`${mode}: direct probe ${probeSeconds}s; baseline ${baselineSeconds}s is diagnostic only`);",
|
||||
"change": "diagnostic message only; numeric comparisons and strictness unchanged"
|
||||
},
|
||||
{
|
||||
"old": " assert.ok(probeSeconds>=3.25&&probeSeconds<4.75,`${mode}: probe ${probeSeconds}s after baseline ${baselineSeconds}s`);",
|
||||
"new": " assert.ok(probeSeconds>=3.25&&probeSeconds<4.75,`${mode}: direct probe ${probeSeconds}s; baseline ${baselineSeconds}s is diagnostic only`);",
|
||||
"change": "diagnostic message only; numeric comparisons and strictness unchanged"
|
||||
},
|
||||
{
|
||||
"old": " const probeSeconds=seconds-baselineSeconds;",
|
||||
"new": " let probeSeconds=seconds;\n if(timingFile)assert.doesNotThrow(()=>{probeSeconds=readProbeSeconds(read(timingFile));},'P10 observer pair is required');",
|
||||
"change": "approved observer plumbing or probeSeconds source"
|
||||
},
|
||||
{
|
||||
"old": "function run(h, extra = {}, argv = [\"--business\", \"mosaic-stack\", \"--args\", \"/etc/mosaic-stack/dev.args\", \"--claude-pin\", CLAUDE_PIN, \"--node-pin\", NODE_PIN, \"--root\", h.root]) {",
|
||||
"new": "function run(h, extra = {}, argv = [\"--business\", \"mosaic-stack\", \"--args\", \"/etc/mosaic-stack/dev.args\", \"--claude-pin\", CLAUDE_PIN, \"--node-pin\", NODE_PIN, \"--root\", h.root], script = SCRIPT) {",
|
||||
"change": "approved observer plumbing or probeSeconds source"
|
||||
},
|
||||
{
|
||||
"old": " const r = spawnSync(SCRIPT, argv, {",
|
||||
"new": " const r = spawnSync(script, argv, {",
|
||||
"change": "approved observer plumbing or probeSeconds source"
|
||||
},
|
||||
{
|
||||
"old": " const start=performance.now(),r=run(h),seconds=(performance.now()-start)/1000;capture();",
|
||||
"new": " const start=performance.now(),r=run(h,timingFile?{ROW299_TIMING_FILE:timingFile}:{},undefined,observedScript),seconds=(performance.now()-start)/1000;capture();",
|
||||
"change": "fault run selects private copy only for inner/outer; default SCRIPT and overflow remain"
|
||||
}
|
||||
],
|
||||
"only_removed_assertion_lines_are_two_diagnostic_messages": true,
|
||||
"numeric_bands_unchanged": {
|
||||
"inner": "[1.25,2.75)",
|
||||
"outer": "[3.25,4.75)"
|
||||
},
|
||||
"baseline_status_and_clean_session_lines_byte_identical": true,
|
||||
"all_other_original_assertion_lines_preserved": true,
|
||||
"guard_7000_unchanged": true,
|
||||
"new_assertions": "copy reversal, observer variable isolation, stream/status/EXIT preservation, strict records, required pair",
|
||||
"runtime_status": "NOT RUN; no Node or test until CLEAR"
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"row": 299,
|
||||
"issue": 1806,
|
||||
"vikunja": 573,
|
||||
"base": "4a9c536e861f1d9f9a018019b3ac4519d65eccf0",
|
||||
"branch": "gander/row299-p10",
|
||||
"status": "IMPLEMENTED STATIC; source 1ec2b9765; no Node/test/push",
|
||||
"authority": "mos-1409, sage-3181; Filbert implementation review pending",
|
||||
"files": [
|
||||
{
|
||||
"path": "packages/cli/tests/case1-accept.test.mjs",
|
||||
"git_blob": "c196b40981056963ed924a09f649cfe8e99b34c6",
|
||||
"sha256": "1e8af0656707d93dedade923bf60556022dc7121c43761876a5d7e02731c14aa"
|
||||
},
|
||||
{
|
||||
"path": "packages/cli/tests/case-sudo-fixture.mjs",
|
||||
"git_blob": "866c6c0d229a1fc1e9401ee8bb5522ac8cb01ebc",
|
||||
"sha256": "eac5c83f43056bdeb5781101307e17d4bc01f03e97e02f4f5e930436d7e43535"
|
||||
},
|
||||
{
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"git_blob": "05cb249ea2217d1a542438b597d382669acf8a9b",
|
||||
"sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2"
|
||||
}
|
||||
],
|
||||
"source": "1ec2b97650849b90f41a8e1d1190f609de312d49",
|
||||
"execution": "HELD for Sage CLEAR; no stress process; ambient load >=4 is target only"
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
# Row 299 / Vikunja 573: direct P10 timing
|
||||
|
||||
> Execution method: Gander implements inline after Mos's old-test ruling and Filbert's static read. No delegation. Static implementation authorized by mos-1409 / sage-3181. Every runtime step remains held for CLEAR.
|
||||
|
||||
**Goal:** Measure whether P10 takes its two-second inner path or four-second outer path under load, without subtracting unrelated work from another run.
|
||||
|
||||
**Architecture:** Add a test helper that makes a private, instrumented copy of the current acceptance script. Two root-side observer statements bracket only the P10 capture's actual bounded wait. Read a complete monotonic begin/end pair from a separate fixture file, while all existing refusal, residual and cleanup assertions still examine the real acceptance output.
|
||||
|
||||
**Tech stack:** Existing Node test runner, Bash builtins, Linux /proc/uptime. No new package, interpreter, product hook or live host action.
|
||||
|
||||
**Spec:** docs/plans/2026-10-23_mvp-readiness-rows.md, "Brief: 573, the P10 hop band"; sage-3175. Base 4a9c536e8, branch gander/row299-p10. Reviewer Filbert; gate owner Sage. Row 293 is done. Queue claim is held because it executes Node, forbidden in the present slot.
|
||||
|
||||
## Constraints and current status
|
||||
|
||||
- Static implementation only, authorized by mos-1409. No Node, tests, HTTPS Git, queue call or push has run for 299. No production edit.
|
||||
- Mos approved the measurement semantics in mos-1409 via sage-3181 under mos-1272. The numeric bands stay unchanged.
|
||||
- All script/supervisor bytes, 2/4-second budgets, 128-byte cap, exact reason assertions, no-observed assertion, hop residual assertion and cleanup assertions remain authoritative.
|
||||
- Keep the same healthy baseline status and `baseline leaves no session` assertions. It may remain as an independent healthy control and diagnostic; it no longer supplies the clock value being asserted.
|
||||
- No extra retry, smoothing, percentile selection, ignored red, clock fallback, or widened band. Missing clock evidence fails.
|
||||
- Tests use a short TMPDIR directly under /mnt/storage/scratch/tmp/gXXXXXX, never /tmp. No live units, ports, credentials or instance state.
|
||||
|
||||
## Source of the band and evidence
|
||||
|
||||
1. The original row 253 test timed the full acceptance run. Row 276 exposed it after adding stdout spooling: the old inner `<4 s` whole-run bound already failed 2/5 before that delta and 5/5 after it. Mos's mos-1350 ruled that tests 9 and 10 must measure the probe's cost, offering probe stamps or a same-mode no-fault baseline. See agents/gander/work/queue-276/BUILD.md:120-145 and ASSERTION-PRESERVATION.json.
|
||||
2. We chose baseline subtraction in 135bb8fae (original source 6f8c5653a). e06130fc0 added the required clean baseline check. Current test lines 371-388 measure two separate full runs and compute `probeSeconds=seconds-baselineSeconds`.
|
||||
3. The adopted windows are inner [1.25,2.75) and outer [3.25,4.75): 0.75 s around the configured 2/4 s budgets, with 0.5 s between windows. Duckworth-0218 accepted them; the isolated proof in queue-276/BUILD.md reported inner exec 2.033..2.171, inner hop 2.055..2.135, outer exec 3.758..3.961, outer hop 3.736..3.911. Those are historical evidence, not a new run or carried result.
|
||||
4. The recorded failure is agents/gizmoduck/work/queue-270/BUILD.md:629-636: run 3 on 53406f3e4 had CLI 904/905, inner hop estimate 1.08 below 1.25. The file was unchanged. Its isolated whole rerun passed 50/50 at load 3.19 (mos-1367). No other seat's scratch has been read for this packet.
|
||||
5. Production is scripts/case1-accept.sh:744, `tester_capture 2 4 128`. Its inner timer is after the uid drop; its outer timeout is started at :238 and waited at :244. The capture validates tools and creates its private files at :233-235, before the timer is armed. Exact refusal mapping is :224-229. The stalled-supervisor case remains an explicit same-uid residual.
|
||||
|
||||
Static mechanism: let H be the healthy probe cost, I the true faulty wait and U the rest of the full run, including scheduling delays. The current estimate is `(I + U_fault) - (H + U_baseline)`. It contains `U_fault-U_baseline-H`, so it can underestimate I when the baseline gets more delay. The 1.08 report is consistent with that mechanism; we do not invent the separate component timings absent from the committed record. A direct bracket removes the unrelated subtraction; execution must still establish its margins under the agreed load.
|
||||
|
||||
## Approaches considered
|
||||
|
||||
- Repeat baselines or use a median: reduces some noise but still subtracts two unrelated schedules and adds work to every whole-file gate. Reject as the fix.
|
||||
- Stamp in the peer Python or sudo fake: the inner/outer timer is already armed before a delayed child reaches the stamp, so it can measure only the remaining budget and undercount again. Reject.
|
||||
- **Recommend a direct root-side bracket in a private script copy.** Begin immediately before the actual outer timeout launch, after validation; end immediately after its wait, before unrelated post-checks. Includes sudo dispatch, the inner wait and its cleanup, or the outer timeout. Excludes preceding functional checks, the healthy run, metadata work before capture, and tool-validation cost. It measures the same timing distinction, using both existing fake sudo modes.
|
||||
|
||||
Mos approved this approach in mos-1409. Timing still includes kernel scheduling and inner cleanup. Arbitrary starvation cannot be given a hard wall-time guarantee; an overshoot remains a red for placement, not permission to retune.
|
||||
|
||||
## Proposed files and interfaces
|
||||
|
||||
- New packages/cli/tests/case-p10-timing-fixture.mjs: `instrumentP10Probe(source)` returns a copy of the current script with exactly two observer blocks; `readProbeSeconds(text)` returns `(end-begin)` in seconds from two validated centisecond readings.
|
||||
- Existing packages/cli/tests/case1-accept.test.mjs: an optional script-path argument to run(), defaulting to SCRIPT for every current caller. Only inner/outer P10 fault runs execute the private copy. The baseline still uses SCRIPT. Overflow stays on SCRIPT and unchanged.
|
||||
- agents/gander/work/queue-299/: plan, assertion-preservation record, manifest, raw logs, load/timing receipts and mutant records after authorization. No production path in the candidate manifest.
|
||||
|
||||
Observer details:
|
||||
|
||||
1. Locate exactly one `tester_capture() (` function, scoped before the unique row276-legacy marker. Each insertion anchor must occur once within that slice. Never apply an unscoped global replace.
|
||||
2. Just before :238 and just after :244, use shell `read` on /proc/uptime plus `printf` to append `begin <uptime>` / `end <uptime>` to ROW299_TIMING_FILE, only when `maximum` is 128. Selecting the existing probe cap, rather than the 2/4 budgets, keeps the observer active when a timer mutant changes a budget. Config query uses 4096 and emits no probe pair.
|
||||
3. Read and printf are Bash builtins: no new process or Python/Node startup inside the timed span. Preserve `$rc` and every original command, redirection and heredoc byte. Do not emit observer bytes on stdout/stderr. The file is private fixture evidence, not a product authority channel.
|
||||
4. The copy retains the original absolute /proc reads and the --root fixture seam. The script has no relative self-path imports. Write the copy under h.dir with executable mode and pass the private timing path only to that run. No product script is rewritten.
|
||||
5. Reverse the two recorded insertions and assert byte equality with freshly read SCRIPT. This applies to the current script, including a deliberately mutated source, rather than a stale frozen healthy copy. The same source/copy comparison and unique anchors fail closed on drift.
|
||||
6. Parser requires exactly one newline-terminated begin and end pair, in that order, each `<integer>.<two digits>`, and end strictly above begin. No extra pair, missing value, NaN or negative interval is accepted. Use integer centiseconds before converting to seconds. A 10 ms clock resolution is much smaller than the existing 0.5 s window gap.
|
||||
7. Keep inner [1.25,2.75) and outer [3.25,4.75) exactly. Change only the source of probeSeconds and its diagnostic description. Preserve every existing status/reason/no-observed/residual/cleanup assertion, including the healthy baseline checks. The existing 7 s fixture safety guard stays unchanged and remains cleanup only, never proof of an outer timeout. If it intervenes or masks a measurement, stop for Sage/Mos; do not silently extend it.
|
||||
|
||||
## Review focus
|
||||
|
||||
- A delayed healthy baseline cannot change the measured interval: it is diagnostic only. No baseline value enters readProbeSeconds or a timing assertion.
|
||||
- A child delayed after timer arming is not used as the start observer. The begin read precedes timer launch in the root-side capture copy.
|
||||
- Missing/duplicated/reversed records fail before a band assertion. Add named observer-record tests; no fallback to the old arithmetic.
|
||||
- A timer mutant reaches the actual observer copy. Source reconstruction and cap-based selection prevent budgets changed to 1/3 seconds from disabling observation.
|
||||
- Observer code must not change stdout, refusal status, cleanup or trust. Preserve original source bytes by inverse comparison and all original non-timing assertion lines by an assertion-preservation receipt.
|
||||
|
||||
## Implementation and evidence sequence (held)
|
||||
|
||||
- [x] Proposal sent in gander-0183; mos-1409 / sage-3181 approve the measurement change. Filbert accepts the observation points and supplies implementation checks I1-I5.
|
||||
- [x] Source 1ec2b9765 adds the helper and observer wiring, plus source/variable, streams/status/trap, and record-validation tests. ASSERTION-PRESERVATION.json lists all six old line replacements; only two original assertion messages change. No runtime or syntax claim.
|
||||
- [ ] Static review on the committed candidate and manifest. Prove scripts/case1-accept.sh and scripts/case2-unit.sh are byte-identical to the approved base, and no unrelated assertion moved. Finalize all mutant anchors with exactly-one checks.
|
||||
- [ ] On Sage CLEAR, first record a passing named base for each killer and then M1-M6 from MUTANT-PLAN.json. Report the actual assertion killed. Every restore is byte-identical and git status is checked. A timeout or survivor stops for placement, not a kill.
|
||||
- [ ] Run case1-accept.test.mjs whole at least three times under load, then CLI whole, as the brief requires. Record ambient load at each of the three starts and throughout each file; >=4 is a target, never a wait condition (mos-1409). No stress process. The whole CLI suite is the required loaded proof; record its load and all exec/hop direct intervals, plus min/max. Do not hold the slot for load.
|
||||
- [ ] Record all timeout limits before launch: per-node-file timeout -k 10; use at least ceil(3x longest receipt)+120, with 900 s for an unknown file. Whole case1 gets 1200 s from the row293 receipt; stack-release 2400 s from its 683.647 s historical receipt; recheck measured maxima before the current gate. Print the full CLI file list and run the package whole with its normal test-file concurrency, so the suite itself supplies the required loaded proof. Use timeout -k 10 5400 around that whole invocation: 3x the row293 1367.764 s CLI receipt plus 120 is 4224 s, below 5400. TMPDIR is fresh short scratch. No runs are authorized now.
|
||||
- [ ] Any old-test red, reason mismatch, fixture-guard intervention, timeout, or survivor goes to Sage/Mos before edits or retry. No carried result from row293. Commit and publish records only in Sage's gap, claimant review move only in a queue gap. Filbert reviews; Sage gates and lands.
|
||||
|
||||
## Static self-review
|
||||
|
||||
The proposal meets the brief's source/fix/mutant items and preserves the 2/4 s distinction and separated numeric windows. No runtime or load-stability claim is made. Timing-copy instrumentation is the main review risk: Filbert must approve the two exact observation points and source-byte reconstruction before execution. Mos approved the changed old-test measurement semantics in mos-1409. The 7 s whole-run fixture guard and scheduling overshoot remain explicit risks to measure, not hidden assertions to relax. No other test or supervisor repair is bundled.
|
||||
|
||||
|
||||
## Implemented static: mos-1409 / sage-3181 and Filbert I1-I5
|
||||
|
||||
Source 1ec2b9765 on base 4a9c536e8. The two observers use `read -r row299_up row299_spare < /proc/uptime`, never the fixture root. Both guard cap 128 and a nonempty `${ROW299_TIMING_FILE-}`. printf is redirected to that absolute private fixture file; grouped stderr goes to /dev/null; errors leave absent evidence which the parser refuses. No observer assigns a production capture variable, changes rc, or touches a trap. New tests assert row299-only read targets and no other assignment; preserve explicit stdout/stderr bytes, exit 87 and the EXIT trap; and reject missing begin/end, duplicate pair, reversed order, nonnumeric/equal/backward readings, and a missing/extra final newline.
|
||||
|
||||
Only inner/outer fault runs receive the absolute timing path and executable 0700 private copy. Every such run reverses its two insertions and compares to a fresh read of SCRIPT, including any timer mutant. Baseline and overflow use SCRIPT; baseline status and clean-session assertions remain unchanged. The clock pair is required by assert.doesNotThrow before applying the unchanged bands. baselineSeconds stays diagnostic only. Capture launch insertion keys on its unique LC_ALL=C prefix rather than the timeout command itself, so M4 (outer removal) reaches execution instead of an anchor refusal.
|
||||
|
||||
M1-M6 have one target each in their defined scope. M5 now suppresses only the begin printf, preserving the constant block and reversal check so the named inner test must reject an end-only record. M6 admits equal readings so the record-validation test must catch it. M1 retains the known startup-overhead risk: save its interval and stop on a survivor, without changing the ruled bands. All production/shared fixture bytes are unchanged. Manifest is the two test/helper paths only. No Node, syntax preflight, test, mutant, queue call, or HTTPS operation has run. The implementation is unverified until Filbert's static read and Sage CLEAR.
|
||||
|
||||
|
||||
## sage-3255 integration, static only
|
||||
|
||||
Rebased all three commits from 4a9c536e8 onto 80793d824 under new branch gander/row299-8079, preserving gander/row299-p10. No conflict. The range-diff has three equal pairs and all per-commit stable patch-ids match. Source is e6751ecab; both manifest blobs equal the approved 1ec2b9765 blobs, so digest 277ace0b is unchanged. Direct test/helper, product case1 script, shared CLI helper and sudo-fixture paths have zero drift over 4a9c536e8..80793d824. Row294's CLI config/access and stack-release-test changes are in the new base and covered by the required full CLI suite. No package/source/test implementation changed in this integration. Full records in integration-8079/.
|
||||
|
||||
Gate remains held for CLEAR. Ambient load >=4 remains a target, not a wait condition under mos-1409; no stress process. Record each of three whole case1 starts and the whole CLI suite's load and per-mode direct timings. Numeric windows and the 7 s guard remain fixed. Any red, guard intervention, timeout, survivor or overshoot stops to Sage for Mos before edits or retry.
|
||||
|
||||
## Gate run 1: sage-3268, 2026-10-23
|
||||
|
||||
GREEN on ffa93b054 / 277ace0b. Three whole case1 runs 53/0/0 each; whole CLI 917/0/0 across 59 files. Total 1076/0/0, no cancelled/todo. M1-M6 all killed at their intended assertions, with byte-identical clean restores. No unmutated guard intervention, external timeout, retry or carry. UTC run 07:26:52–07:50:16 (1404 s). CLI load reached 7.17; direct CLI intervals inner exec/hop 2.27/2.27, outer exec/hop 4.01/4.01.
|
||||
|
||||
M4 follows sage-3273 / mos-1426: the 7 s fixture guard returned, then exact outer-reason assertion at case1-accept.test.mjs:445 failed on probe-inner-command. No timeout or cleanup-only kill. M1 measured 1.23 s, preserving the noted narrow kill margin. Sweep found zero gate residuals; four MCP harness processes predate this run. Full records, load samples, assertion locations and named base evidence are in run1/RESULTS.md and run1/results.json. Manifest remains unchanged.
|
||||
@@ -1,2 +0,0 @@
|
||||
7ac9d29281d4076bf2e00b7a07294cd4519d7ae9f97c4f6ddc1d22440c9b071a packages/cli/tests/case-p10-timing-fixture.mjs
|
||||
685cf69c741540240c5b414e1907e624cbc59656541316f178d377472fad34a2 packages/cli/tests/case1-accept.test.mjs
|
||||
@@ -1,73 +0,0 @@
|
||||
{
|
||||
"status": "Static definitions finalized; no mutant executed",
|
||||
"mutants": [
|
||||
{
|
||||
"id": "M1",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"old": "tester_capture 2 4 128",
|
||||
"new": "tester_capture 1 4 128",
|
||||
"killer": "row253 C4 P10 inner reason holds under both sudo models",
|
||||
"expected": "exact inner-timeout reason remains valid, but direct probe interval is below 1.25 s; ERR_ASSERTION on the existing lower-band check",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2",
|
||||
"receipt_requirement": "Record direct interval even if it survives; startup overhead can erase the 0.25 s kill margin. Survivor stops to Sage/Mos; bands unchanged."
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"old": "tester_capture 2 4 128",
|
||||
"new": "tester_capture 3 4 128",
|
||||
"killer": "row253 C4 P10 inner reason holds under both sudo models",
|
||||
"expected": "exact inner-timeout reason remains valid, but direct interval exceeds the unchanged 2.75 s top; ERR_ASSERTION on upper-band check",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2"
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"old": "tester_capture 2 4 128",
|
||||
"new": "tester_capture 2 3 128",
|
||||
"killer": "row253 C4 P10 outer reason holds under both sudo models",
|
||||
"expected": "stalled supervisor still gives exact outer-timeout, but direct interval falls below 3.25 s; ERR_ASSERTION on outer lower-band check",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2"
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"scope": "tester_capture function only",
|
||||
"description": "Remove the trusted outer GNU timeout from the capture invocation, keeping the fixture guard",
|
||||
"killer": "row253 C4 P10 outer reason holds under both sudo models",
|
||||
"expected": "the fixture safety guard permits return but the exact probe-outer-timeout assertion fails; never count external command timeout or cleanup alone as a kill",
|
||||
"scope_begin": "tester_capture() (\n",
|
||||
"scope_end": "# row276-legacy-begin",
|
||||
"old": "LC_ALL=C \"$TS_TIMEOUT\" --verbose --signal=KILL \"${outer}s\" \"$TS_BASH\" -c ",
|
||||
"new": "LC_ALL=C \"$TS_BASH\" -c ",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2"
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"path": "packages/cli/tests/case-p10-timing-fixture.mjs",
|
||||
"description": "Suppress the begin printf while retaining the inserted begin block and reversal check",
|
||||
"killer": "row253 C4 P10 inner reason holds under both sudo models",
|
||||
"expected": "the existing inner test requires a valid pair with assert.doesNotThrow; end-only evidence fails ERR_ASSERTION",
|
||||
"old": "printf 'begin %s\\\\n' \"$row299_up\" >> \"$ROW299_TIMING_FILE\";",
|
||||
"new": ":;",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "7ac9d29281d4076bf2e00b7a07294cd4519d7ae9f97c4f6ddc1d22440c9b071a"
|
||||
},
|
||||
{
|
||||
"id": "M6",
|
||||
"path": "packages/cli/tests/case-p10-timing-fixture.mjs",
|
||||
"description": "Accept an equal begin/end clock pair",
|
||||
"killer": "row299 P10 observer records are complete and ordered",
|
||||
"expected": "the equal-readings case in the named record test expects refusal and fails ERR_ASSERTION",
|
||||
"old": "end <= begin",
|
||||
"new": "end < begin",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "7ac9d29281d4076bf2e00b7a07294cd4519d7ae9f97c4f6ddc1d22440c9b071a"
|
||||
}
|
||||
],
|
||||
"restore": "Restore byte-identical source/test/helper files and require clean git status between cases. Timeout is a stop, never a kill."
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
b0ca08db7968e92d417960e58112d767d54902e4d1121f97d4eef2152a2340eb agents/gander/work/queue-299/ASSERTION-PRESERVATION.json
|
||||
3cc775b0c0e78d0aca5396aba4380a0bdd38d421b144dceea4124323ddfd1bc4 agents/gander/work/queue-299/BASE.json
|
||||
132cd793d5f9daa93c879d073dd1fa1d1568b07851b707a3c0b519ed64e9a63a agents/gander/work/queue-299/BUILD.md
|
||||
277ace0b4274970d5bd4c05cf8fe99aa1e7ebc469a719e4cefcb334a75d3865d agents/gander/work/queue-299/MANIFEST.sha256
|
||||
ff72c99b4b73cfe2acbaf79eb9aed442c855f011fe662722acba7f8a388d3f9b agents/gander/work/queue-299/MUTANT-PLAN.json
|
||||
7657e629dab262aaeb46004526ede586a167675558a72b6177abf7e646ce6885 agents/gander/work/queue-299/integration-8079/CHECKS.json
|
||||
b6632cb58ccfc79262f98322682cfd2887e102436cdd1af9e8ac37d2a482b9d8 agents/gander/work/queue-299/integration-8079/range-diff.txt
|
||||
@@ -1,35 +0,0 @@
|
||||
{
|
||||
"base": "80793d824e05baaef4820f4be7790aba55971b6f",
|
||||
"rebased_source": "e6751ecab",
|
||||
"rebased_tip_before_records": "bc7da6814",
|
||||
"conflicts": [],
|
||||
"range_diff": "all three pairs equal",
|
||||
"patch_ids": [
|
||||
{
|
||||
"old": "31c847580",
|
||||
"new": "482adc255",
|
||||
"patch_id": "224e6ce7677320cf362189ad2746c481176c3429"
|
||||
},
|
||||
{
|
||||
"old": "1ec2b9765",
|
||||
"new": "e6751ecab",
|
||||
"patch_id": "dec31bc01820a54fa4001fda4886905576a6b692"
|
||||
},
|
||||
{
|
||||
"old": "9872b5ab5",
|
||||
"new": "bc7da6814",
|
||||
"patch_id": "f335941005f9c113aa09a800a3569d2447be3464"
|
||||
}
|
||||
],
|
||||
"checked_paths": [
|
||||
"packages/cli/tests/case1-accept.test.mjs",
|
||||
"packages/cli/tests/case-p10-timing-fixture.mjs",
|
||||
"scripts/case1-accept.sh",
|
||||
"packages/cli/tests/helpers.mjs",
|
||||
"packages/cli/tests/case-sudo-fixture.mjs"
|
||||
],
|
||||
"drift": "",
|
||||
"manifest": "277ace0b4274970d5bd4c05cf8fe99aa1e7ebc469a719e4cefcb334a75d3865d",
|
||||
"test_blobs_match_static_approved_1ec2b9765": true,
|
||||
"runtime": "Not run; awaiting Sage CLEAR. No queue/Node/tests executed."
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
1: 31c847580 = 1: 482adc255 docs(row299): propose direct P10 wait timing for mos-1272 review
|
||||
2: 1ec2b9765 = 2: e6751ecab test(case): observe P10 wait directly under mos-1409
|
||||
3: 9872b5ab5 = 3: bc7da6814 docs(row299): record mos-1409 preservation and static candidate
|
||||
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"label": "M1-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"bash",
|
||||
"-n",
|
||||
"scripts/case1-accept.sh"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gh8s2Og",
|
||||
"started_utc": "2026-10-23T07:49:28Z",
|
||||
"start_load": "1.51 2.50 2.68 3/5810 1153451",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M1-syntax.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:49:28Z",
|
||||
"load": "1.51 2.50 2.68 2/5811 1153452"
|
||||
}
|
||||
]
|
||||
Whitespace-only changes.
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"label": "M1",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row253 C4 P10 inner reason holds under both sudo models$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gxjj9Vd",
|
||||
"started_utc": "2026-10-23T07:49:30Z",
|
||||
"start_load": "1.51 2.50 2.68 1/5816 1156782",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M1.log",
|
||||
"expected_red": true
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:49:30Z",
|
||||
"load": "1.51 2.50 2.68 3/5817 1156783"
|
||||
}
|
||||
]
|
||||
@@ -1,29 +0,0 @@
|
||||
TAP version 13
|
||||
# Subtest: row253 C4 P10 inner reason holds under both sudo models
|
||||
not ok 1 - row253 C4 P10 inner reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 4641.831075
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:421:49'
|
||||
failureType: 'testCodeFailure'
|
||||
error: 'exec: direct probe 1.23s; baseline 1.764558389s is diagnostic only'
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: true
|
||||
actual: false
|
||||
operator: '=='
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:450:29)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
# {"fault":"inner","mode":"exec","baselineSeconds":1.764558389,"faultSeconds":2.8568522200000004,"probeSeconds":1.23}
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 0
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 4737.590412
|
||||
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"label": "M2-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"bash",
|
||||
"-n",
|
||||
"scripts/case1-accept.sh"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gZ30EQX",
|
||||
"started_utc": "2026-10-23T07:49:36Z",
|
||||
"start_load": "1.47 2.48 2.67 1/5822 1162481",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M2-syntax.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:49:36Z",
|
||||
"load": "1.47 2.48 2.67 3/5823 1162482"
|
||||
}
|
||||
]
|
||||
Whitespace-only changes.
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"label": "M2",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row253 C4 P10 inner reason holds under both sudo models$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gYr4G6o",
|
||||
"started_utc": "2026-10-23T07:49:37Z",
|
||||
"start_load": "1.47 2.48 2.67 1/5823 1165689",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M2.log",
|
||||
"expected_red": true
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:49:37Z",
|
||||
"load": "1.47 2.48 2.67 3/5824 1165690"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 5.001,
|
||||
"utc": "2026-10-23T07:49:42Z",
|
||||
"load": "1.43 2.45 2.66 3/5865 1168855"
|
||||
}
|
||||
]
|
||||
@@ -1,29 +0,0 @@
|
||||
TAP version 13
|
||||
# Subtest: row253 C4 P10 inner reason holds under both sudo models
|
||||
not ok 1 - row253 C4 P10 inner reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 6624.625527
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:421:49'
|
||||
failureType: 'testCodeFailure'
|
||||
error: 'exec: direct probe 3.24s; baseline 1.754618234s is diagnostic only'
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: true
|
||||
actual: false
|
||||
operator: '=='
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:450:29)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
# {"fault":"inner","mode":"exec","baselineSeconds":1.754618234,"faultSeconds":4.849417662,"probeSeconds":3.24}
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 0
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 6718.852297
|
||||
@@ -1,6 +0,0 @@
|
||||
CLEAR
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1169351/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1169352/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1169353/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1169354/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1169382/cmdline: No such file or directory
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"label": "M3-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"bash",
|
||||
"-n",
|
||||
"scripts/case1-accept.sh"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gwCkjzX",
|
||||
"started_utc": "2026-10-23T07:49:45Z",
|
||||
"start_load": "1.40 2.43 2.66 2/5844 1172866",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M3-syntax.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:49:45Z",
|
||||
"load": "1.40 2.43 2.66 4/5845 1172867"
|
||||
}
|
||||
]
|
||||
Whitespace-only changes.
@@ -1,7 +0,0 @@
|
||||
CLEAR
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1172650/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1172687/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1172732/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1172780/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1172825/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1172863/cmdline: No such file or directory
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"label": "M3",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row253 C4 P10 outer reason holds under both sudo models$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/g6TrU8V",
|
||||
"started_utc": "2026-10-23T07:49:46Z",
|
||||
"start_load": "1.40 2.43 2.66 2/5868 1176268",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M3.log",
|
||||
"expected_red": true
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:49:46Z",
|
||||
"load": "1.40 2.43 2.66 4/5869 1176269"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 5.001,
|
||||
"utc": "2026-10-23T07:49:51Z",
|
||||
"load": "1.44 2.42 2.65 1/5889 1179184"
|
||||
}
|
||||
]
|
||||
@@ -1,29 +0,0 @@
|
||||
TAP version 13
|
||||
# Subtest: row253 C4 P10 outer reason holds under both sudo models
|
||||
not ok 1 - row253 C4 P10 outer reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 6474.774742
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:421:49'
|
||||
failureType: 'testCodeFailure'
|
||||
error: 'exec: direct probe 3.01s; baseline 1.7982556909999998s is diagnostic only'
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: true
|
||||
actual: false
|
||||
operator: '=='
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:452:11)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
# {"fault":"outer","mode":"exec","baselineSeconds":1.7982556909999998,"faultSeconds":4.664919980999999,"probeSeconds":3.01}
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 0
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 6573.218398
|
||||
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"label": "M4-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"bash",
|
||||
"-n",
|
||||
"scripts/case1-accept.sh"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gRPd59t",
|
||||
"started_utc": "2026-10-23T07:49:54Z",
|
||||
"start_load": "1.41 2.40 2.64 3/5836 1182894",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M4-syntax.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:49:54Z",
|
||||
"load": "1.41 2.40 2.64 7/5837 1182895"
|
||||
}
|
||||
]
|
||||
Whitespace-only changes.
@@ -1,3 +0,0 @@
|
||||
CLEAR
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1182788/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1182883/cmdline: No such file or directory
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"label": "M4",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row253 C4 P10 outer reason holds under both sudo models$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gAKhO44",
|
||||
"started_utc": "2026-10-23T07:49:56Z",
|
||||
"start_load": "1.41 2.40 2.64 8/5839 1186447",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M4.log",
|
||||
"expected_red": true
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.001,
|
||||
"utc": "2026-10-23T07:49:56Z",
|
||||
"load": "1.41 2.40 2.64 8/5838 1186448"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 5.001,
|
||||
"utc": "2026-10-23T07:50:01Z",
|
||||
"load": "1.54 2.41 2.64 5/5866 1190264"
|
||||
}
|
||||
]
|
||||
@@ -1,92 +0,0 @@
|
||||
TAP version 13
|
||||
# Subtest: row253 C4 P10 outer reason holds under both sudo models
|
||||
not ok 1 - row253 C4 P10 outer reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 8880.927284
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:421:49'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
The input did not match the regular expression /P10 tester-socket-squat unnamed boundary=failed reason=probe-outer-timeout /. Input:
|
||||
|
||||
'F1 units-user pass [email protected] and mosaic-webui.service are active as mosaic (uid 997)\n' +
|
||||
'F2 console-loopback pass healthz answers, and 732 is bound to 127.0.0.1 only, by MainPID 200\n' +
|
||||
'F3 tester-reply pass chief replied to case1-accept-e61888cb4c54\n' +
|
||||
'F4 precheck pass case2-precheck.sh --profile factory exits 0\n' +
|
||||
"F5 bwrap-label pass bwrap 300 reads 'bwrap (enforce)' and its claude descendant 302 reads 'bwrap//&unpriv_bwrap (enforce)'\n" +
|
||||
"F6 claude-pin pass /opt/mosaic-stack/claude-2.1.0/node_modules/@anthropic-ai/claude-code/bin/claude.exe prints '2.1.0 (Claude Code)'\n" +
|
||||
'F7 pm-live pass one live launch: pm run r-0002\n' +
|
||||
"F8 credential-file pass /srv/mosaic/.config/mosaic-dev/secrets/claude-session.env is 'mosaic 600 regular file'\n" +
|
||||
'F9 autoupdater-off pass /etc/claude-code/managed-settings.json is root:root 0644 with env.DISABLE_AUTOUPDATER "1"\n' +
|
||||
'F10 node-pin pass /opt/mosaic-stack/node-v24.1.0/bin/node prints v24.1.0\n' +
|
||||
'F11 no-discord pass /srv/mosaic/.mosaic-dev/discord is absent\n' +
|
||||
'P1 mosaic-sudo closed sudo -l: User mosaic is not allowed to run sudo on dev-53.\n' +
|
||||
"P2 mosaic-groups-keys closed id -G is '997'; authorized_keys is absent\n" +
|
||||
'P3 localadmin-sudo accepted Q183 sudo -l -U localadmin lists 1 NOPASSWD lines\n' +
|
||||
"P4 pve-root-pbs accepted Q182+Q183 root on pve over VM 1008, and PBS backups that hold /srv/mosaic with the credential; this script can't see pve\n" +
|
||||
'P5 jarvis-reach closed jarvis is in none of sudo, docker and lxd (groups: jarvis)\n' +
|
||||
'P6 group-members closed sudo holds only localadmin, and docker and lxd have no members\n' +
|
||||
'P7 sudoers-d closed no file under /etc/sudoers.d names mosaic\n' +
|
||||
'P8 lan-listeners closed 732 is on 127.0.0.1 only by MainPID 200; no TCP listener on 7331 or 7333; tester uses /srv/mosaic/.mosaic-dev/console/tester.sock\n' +
|
||||
'P9 bwrap-userns accepted mos-1096 hostcheck items 1-6 ok, jarvis is denied bwrap, and group mosaic has no other member\n' +
|
||||
'P10 tester-socket-squat unnamed boundary=failed reason=probe-inner-command path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains\n' +
|
||||
'P11 hostcheck-before-bus closed mosaic-hostcheck.service is enabled, and its Before= names [email protected]\n' +
|
||||
'count pass 11\n' +
|
||||
'count FAIL 0\n' +
|
||||
'count closed 7\n' +
|
||||
'count accepted Q182+Q183 1\n' +
|
||||
'count accepted Q183 1\n' +
|
||||
'count accepted mos-1096 1\n' +
|
||||
'count unnamed 1\n' +
|
||||
'case1-accept: every F check passes; send the whole output to Duckworth, and each unnamed line to Mos\n'
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
actual: |-
|
||||
F1 units-user pass [email protected] and mosaic-webui.service are active as mosaic (uid 997)
|
||||
F2 console-loopback pass healthz answers, and 732 is bound to 127.0.0.1 only, by MainPID 200
|
||||
F3 tester-reply pass chief replied to case1-accept-e61888cb4c54
|
||||
F4 precheck pass case2-precheck.sh --profile factory exits 0
|
||||
F5 bwrap-label pass bwrap 300 reads 'bwrap (enforce)' and its claude descendant 302 reads 'bwrap//&unpriv_bwrap (enforce)'
|
||||
F6 claude-pin pass /opt/mosaic-stack/claude-2.1.0/node_modules/@anthropic-ai/claude-code/bin/claude.exe prints '2.1.0 (Claude Code)'
|
||||
F7 pm-live pass one live launch: pm run r-0002
|
||||
F8 credential-file pass /srv/mosaic/.config/mosaic-dev/secrets/claude-session.env is 'mosaic 600 regular file'
|
||||
F9 autoupdater-off pass /etc/claude-code/managed-settings.json is root:root 0644 with env.DISABLE_AUTOUPDATER "1"
|
||||
F10 node-pin pass /opt/mosaic-stack/node-v24.1.0/bin/node prints v24.1.0
|
||||
F11 no-discord pass /srv/mosaic/.mosaic-dev/discord is absent
|
||||
P1 mosaic-sudo closed sudo -l: User mosaic is not allowed to run sudo on dev-53.
|
||||
P2 mosaic-groups-keys closed id -G is '997'; authorized_keys is absent
|
||||
P3 localadmin-sudo accepted Q183 sudo -l -U localadmin lists 1 NOPASSWD lines
|
||||
P4 pve-root-pbs accepted Q182+Q183 root on pve over VM 1008, and PBS backups that hold /srv/mosaic with the credential; this script can't see pve
|
||||
P5 jarvis-reach closed jarvis is in none of sudo, docker and lxd (groups: jarvis)
|
||||
P6 group-members closed sudo holds only localadmin, and docker and lxd have no members
|
||||
P7 sudoers-d closed no file under /etc/sudoers.d names mosaic
|
||||
P8 lan-listeners closed 732 is on 127.0.0.1 only by MainPID 200; no TCP listener on 7331 or 7333; tester uses /srv/mosaic/.mosaic-dev/console/tester.sock
|
||||
P9 bwrap-userns accepted mos-1096 hostcheck items 1-6 ok, jarvis is denied bwrap, and group mosaic has no other member
|
||||
P10 tester-socket-squat unnamed boundary=failed reason=probe-inner-command path=/srv/mosaic/.mosaic-dev/console/tester.sock MainPID=200; hostile same-uid substitution remains
|
||||
P11 hostcheck-before-bus closed mosaic-hostcheck.service is enabled, and its Before= names [email protected]
|
||||
count pass 11
|
||||
count FAIL 0
|
||||
count closed 7
|
||||
count accepted Q182+Q183 1
|
||||
count accepted Q183 1
|
||||
count accepted mos-1096 1
|
||||
count unnamed 1
|
||||
case1-accept: every F check passes; send the whole output to Duckworth, and each unnamed line to Mos
|
||||
|
||||
operator: 'match'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:445:10)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 0
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 8984.292623
|
||||
@@ -1,2 +0,0 @@
|
||||
CLEAR
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1193437/cmdline: No such file or directory
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"label": "M5-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"node",
|
||||
"--check",
|
||||
"packages/cli/tests/case-p10-timing-fixture.mjs"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/g8waDyO",
|
||||
"started_utc": "2026-10-23T07:50:06Z",
|
||||
"start_load": "1.65 2.42 2.65 2/5826 1197030",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M5-syntax.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:50:06Z",
|
||||
"load": "1.65 2.42 2.65 4/5827 1197031"
|
||||
}
|
||||
]
|
||||
Whitespace-only changes.
@@ -1,2 +0,0 @@
|
||||
CLEAR
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/1197017/cmdline: No such file or directory
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"label": "M5",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row253 C4 P10 inner reason holds under both sudo models$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gdAgQSv",
|
||||
"started_utc": "2026-10-23T07:50:07Z",
|
||||
"start_load": "1.65 2.42 2.65 2/5824 1200489",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M5.log",
|
||||
"expected_red": true
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:50:07Z",
|
||||
"load": "1.65 2.42 2.65 6/5827 1200493"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 5.001,
|
||||
"utc": "2026-10-23T07:50:12Z",
|
||||
"load": "1.60 2.40 2.64 2/5882 1203150"
|
||||
}
|
||||
]
|
||||
@@ -1,38 +0,0 @@
|
||||
TAP version 13
|
||||
# Subtest: row253 C4 P10 inner reason holds under both sudo models
|
||||
not ok 1 - row253 C4 P10 inner reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 5653.123684
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:421:49'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Got unwanted exception: P10 observer pair is required
|
||||
Actual message: "P10 observer needs exactly one complete ordered pair"
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
actual:
|
||||
error: 'P10 observer needs exactly one complete ordered pair'
|
||||
stack: |-
|
||||
readProbeSeconds (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case-p10-timing-fixture.mjs:56:42)
|
||||
file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:448:55
|
||||
getActual (node:assert:580:5)
|
||||
strict.doesNotThrow (node:assert:748:32)
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:448:24)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
operator: 'doesNotThrow'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:448:24)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 0
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 5762.289353
|
||||
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"label": "M6-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"node",
|
||||
"--check",
|
||||
"packages/cli/tests/case-p10-timing-fixture.mjs"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gD2IEb2",
|
||||
"started_utc": "2026-10-23T07:50:15Z",
|
||||
"start_load": "1.63 2.39 2.63 1/5845 1206646",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M6-syntax.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:50:15Z",
|
||||
"load": "1.63 2.39 2.63 4/5846 1206647"
|
||||
}
|
||||
]
|
||||
Whitespace-only changes.
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"label": "M6",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row299 P10 observer records are complete and ordered$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gAZq1pv",
|
||||
"started_utc": "2026-10-23T07:50:16Z",
|
||||
"start_load": "1.63 2.39 2.63 2/5837 1210084",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M6.log",
|
||||
"expected_red": true
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:50:16Z",
|
||||
"load": "1.63 2.39 2.63 2/5838 1210085"
|
||||
}
|
||||
]
|
||||
@@ -1,29 +0,0 @@
|
||||
TAP version 13
|
||||
# Subtest: row299 P10 observer records are complete and ordered
|
||||
not ok 1 - row299 P10 observer records are complete and ordered
|
||||
---
|
||||
duration_ms: 1.544819
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:405:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: 'Missing expected exception: equal readings'
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
operator: 'throws'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/cli/tests/case1-accept.test.mjs:418:58)
|
||||
Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
Test.run (node:internal/test_runner/test:1402:25)
|
||||
Test.start (node:internal/test_runner/test:1262:17)
|
||||
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 0
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 97.805057
|
||||
@@ -1,78 +0,0 @@
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/M1-syntax.busy.log
|
||||
0e86c022784e85084f08044940ec6623e736e2eea3e87afe994cebcdaa18c016 agents/gander/work/queue-299/run1/M1-syntax.command.json
|
||||
6552beee45c19264b36614eb09e49f4c24e66521732071036c194b7ab5b6c3ee agents/gander/work/queue-299/run1/M1-syntax.load.json
|
||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 agents/gander/work/queue-299/run1/M1-syntax.log
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/M1.busy.log
|
||||
9bfeb9cb89dde406b0b8997250139dc1eb925fb17a7d308c59ab628bd46f175d agents/gander/work/queue-299/run1/M1.command.json
|
||||
c834b00bfe2b7fca539cd93a428b7d92b377a93d6a3aad65e33916735e4fca4e agents/gander/work/queue-299/run1/M1.load.json
|
||||
6566b6d9f613a5904d85b0d0032a0dcd29aa81dcdfd363234537594006c1c5d4 agents/gander/work/queue-299/run1/M1.log
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/M2-syntax.busy.log
|
||||
4c04e5dcd4e7620a50436f09b60dfb5e0177978d765e5f14fc3da301cb91c729 agents/gander/work/queue-299/run1/M2-syntax.command.json
|
||||
827351dfdde96da9bc13133600a6d2997299ed442df774e1c7718c34f02259c1 agents/gander/work/queue-299/run1/M2-syntax.load.json
|
||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 agents/gander/work/queue-299/run1/M2-syntax.log
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/M2.busy.log
|
||||
4f0f7aef97edc93582921f5b15745bc72b3aae8ba7a71aaa145cd7d78b080af6 agents/gander/work/queue-299/run1/M2.command.json
|
||||
d1ccdfc399964b4a9f61f2ff8eb5304b9556033e1e255467b0887460e56f5ae0 agents/gander/work/queue-299/run1/M2.load.json
|
||||
b80762fb0b571cadaad5fcf5e43e040c533d2aca1cf939ea4247c5c8f50bd176 agents/gander/work/queue-299/run1/M2.log
|
||||
8e62af85b120ec37099cfba76475359132a1ec673b55350da4442a2356f18fb4 agents/gander/work/queue-299/run1/M3-syntax.busy.log
|
||||
019d63399b36b47bdf38730229aabd8edb5c25e27f7f78f462c70963a02aca69 agents/gander/work/queue-299/run1/M3-syntax.command.json
|
||||
d31ae584602d69e1c6d68e1186b45d518741028e5f9ca289ddba6b472638e634 agents/gander/work/queue-299/run1/M3-syntax.load.json
|
||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 agents/gander/work/queue-299/run1/M3-syntax.log
|
||||
2d80452846bb5af54c76122f0647cb850bbf22ed114e17f9fb883b2c41f3d82e agents/gander/work/queue-299/run1/M3.busy.log
|
||||
5619bd5a00679fc783d1f0ef8111570268238fc5cfc3b0586539fece039a0d14 agents/gander/work/queue-299/run1/M3.command.json
|
||||
3ac8b2e351f5b3e016114f7ff45cc71a1d6287c4dc8d52640c6233424afdc59b agents/gander/work/queue-299/run1/M3.load.json
|
||||
d5f21e277400f33779ea94940979bc89ae54c7484a762f373027bf837b98a47a agents/gander/work/queue-299/run1/M3.log
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/M4-syntax.busy.log
|
||||
c6f7857ef123cddd6190eba9e6b9a3356821bb0b3a797a1b05a2e19d108c5ec7 agents/gander/work/queue-299/run1/M4-syntax.command.json
|
||||
f983475d9ea0c5cbff43d0de9f8514488d20e2d7732af8d050ca10b9fb81c061 agents/gander/work/queue-299/run1/M4-syntax.load.json
|
||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 agents/gander/work/queue-299/run1/M4-syntax.log
|
||||
d2361f293ed1242c07568092784e830638a3da691d01019a18beaff859d96b2a agents/gander/work/queue-299/run1/M4.busy.log
|
||||
f66ae61b9ed0ea5a720f5c2457ecfb8cc610e192cd619ee5433f24af25f17f85 agents/gander/work/queue-299/run1/M4.command.json
|
||||
cd20239485328874f8bbe30acd9470c3874011ef5bb6f39f33ed210b7c4a4f27 agents/gander/work/queue-299/run1/M4.load.json
|
||||
e64c363e8f11574be893acce37a4152c90c31f5547ca6d48780160c556f0db70 agents/gander/work/queue-299/run1/M4.log
|
||||
7c3a3b6bcf027e99e0f3903215f4ffca88d8bff9fb3a8ef92d3b28bfa68ba52a agents/gander/work/queue-299/run1/M5-syntax.busy.log
|
||||
3e0f4c82616fa3fa7274ad91ec3f2baa86b7b22288d7507730e66c8e4809c681 agents/gander/work/queue-299/run1/M5-syntax.command.json
|
||||
e0093f4ad39d9d4342b43c0ed2d7671747870d6d6166d0692eecbf3dc8033645 agents/gander/work/queue-299/run1/M5-syntax.load.json
|
||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 agents/gander/work/queue-299/run1/M5-syntax.log
|
||||
f104c336fdfa56a241f1b769938b71eafbfb237a88b3089309671eb5a8db4f0e agents/gander/work/queue-299/run1/M5.busy.log
|
||||
35f7ce5f6e56047d600633a0e27826f6f54aa585552593bfb4954f8469238f7a agents/gander/work/queue-299/run1/M5.command.json
|
||||
059de490b1a31be3a8c9a02ff49f84b744d057f66d4f55508e637e6b0896b670 agents/gander/work/queue-299/run1/M5.load.json
|
||||
42e0a43b161e61775b0d4bdde73be4c131a8d6edb4aabf14422755e553272a3f agents/gander/work/queue-299/run1/M5.log
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/M6-syntax.busy.log
|
||||
867359f0e7ebf5516ae1e1147327e9f6e20d48cb2993b46866f9d90a9ebdbecb agents/gander/work/queue-299/run1/M6-syntax.command.json
|
||||
8d1d69b01dffda714da78c7f08e14b7d1db12a788c812ab02d3a3faa6c52d8a6 agents/gander/work/queue-299/run1/M6-syntax.load.json
|
||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 agents/gander/work/queue-299/run1/M6-syntax.log
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/M6.busy.log
|
||||
3e46e6d020a0fe9782b3e84462f634daed0885c0e992e482f7d815524fe2294e agents/gander/work/queue-299/run1/M6.command.json
|
||||
24e987a747661e01b9e2a28b0580a0be5b16fad57da5c8c35f41b82835ea76ed agents/gander/work/queue-299/run1/M6.load.json
|
||||
8a0f18ea13b69c71a742a755eb7437d06e49679b777880a8db7b4297ae9849d9 agents/gander/work/queue-299/run1/M6.log
|
||||
e8efed810462567a977a64235454f5d59e92dbfb570d5537652c8deb52b9de66 agents/gander/work/queue-299/run1/RESULTS.md
|
||||
e055720cf64d62331a1e957d285d2583bfb3708fc1b9bf951ab8a99a25c5b2e4 agents/gander/work/queue-299/run1/ambient-overlap.json
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/case1-whole-1.busy.log
|
||||
16ea379e1482e79b380c9a7be82703e735bea7ef80f1e785a032af9198b26c35 agents/gander/work/queue-299/run1/case1-whole-1.command.json
|
||||
d87a93023d545cd38fcf0a77577c88326897700325fbecd84fd8287a26b33864 agents/gander/work/queue-299/run1/case1-whole-1.load.json
|
||||
c4d7cf6a001a6741af3aa0e0615989327f63fe92999e8fb6d46c2d30f8c08f09 agents/gander/work/queue-299/run1/case1-whole-1.log
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/case1-whole-2.busy.log
|
||||
4b69775fb03d9fa56a9eef0c9dc8f3cb00013aa4d601f433519ef1dafcc2544c agents/gander/work/queue-299/run1/case1-whole-2.command.json
|
||||
62c4cc338455841d9faf1198acddc3f3204346800e2db7222d1fc33aba189fe3 agents/gander/work/queue-299/run1/case1-whole-2.load.json
|
||||
2ed90fe79a18f794363c47e34440b877a3ffa1256f9a5badb31b317ecbc2fb7b agents/gander/work/queue-299/run1/case1-whole-2.log
|
||||
56d73910ed8d6773724be75e02506a365e5e03c4c98be07a32d49957f24b3e4a agents/gander/work/queue-299/run1/case1-whole-3.busy.log
|
||||
a9225b3ae990e328d739d9259b5dfce0391d5054dedd074f53b81c92e7225c1a agents/gander/work/queue-299/run1/case1-whole-3.command.json
|
||||
dc440ef86b769bf498ed9fcaa178ef9098f7bb9233dd625579d344464c00b11a agents/gander/work/queue-299/run1/case1-whole-3.load.json
|
||||
a803a8e73902337b63d229d0703d45ec9fccd7a1930e192d322d4cc79b9774d6 agents/gander/work/queue-299/run1/case1-whole-3.log
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/cli-whole.busy.log
|
||||
e3ea8c0434fb979a4943f1bfab1984ff8b919bb062945803e1ddcaa61170d1a5 agents/gander/work/queue-299/run1/cli-whole.command.json
|
||||
db54ea06016fa065f25ed62f5704757a727ff37009e010fa43b1e297bfb2b51b agents/gander/work/queue-299/run1/cli-whole.load.json
|
||||
5222a0807a5ed3d8548711d09e7d3b09504f18b5f3f095c2529b4eedf5a2846b agents/gander/work/queue-299/run1/cli-whole.log
|
||||
d58a500c8e125540aeee461cde68aa6bfe65ab386ae15c9af7dfe363a73a9fd2 agents/gander/work/queue-299/run1/controller.log
|
||||
906c08da89e164e214464014edb672f8d389cb3eab70929d994bcff2794ff45a agents/gander/work/queue-299/run1/results.json
|
||||
b7450a29a470bb48c300d630cd8079be283187d372b9bafd0fbaaafb261e9639 agents/gander/work/queue-299/run1/sweep.json
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/syntax-1.busy.log
|
||||
03471d51f50a2607f65bc6bfc5764119421fedd003bd569b5fc9ce7fa57c6be6 agents/gander/work/queue-299/run1/syntax-1.command.json
|
||||
e429b112499bf432c8f561b02119025476f57f03208ee67a85282802a431de2d agents/gander/work/queue-299/run1/syntax-1.load.json
|
||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 agents/gander/work/queue-299/run1/syntax-1.log
|
||||
ba45d57c9b255311bb220598f90c1a4fb01b420511974c28f102881cbd7df21a agents/gander/work/queue-299/run1/syntax-2.busy.log
|
||||
287a012953621602eaf7eb129a836b2e3be076b72d6da7131b5e605d2bb5c4ff agents/gander/work/queue-299/run1/syntax-2.command.json
|
||||
795e4a257a3836bfe65ddfa5a734ed239145d1add7d543d52263707467e2345d agents/gander/work/queue-299/run1/syntax-2.load.json
|
||||
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 agents/gander/work/queue-299/run1/syntax-2.log
|
||||
13987615007f93b11780d44e827ce6a9a57e4373f0074a838ca87b762758d053 agents/gander/work/queue-299/run1/window.py
|
||||
@@ -1,38 +0,0 @@
|
||||
# Row 299 gate run 1
|
||||
|
||||
Grant sage-3268. Candidate ffa93b054f28852a75017928d8478bdf9046e717, base 80793d824, manifest 277ace0b4274970d5bd4c05cf8fe99aa1e7ebc469a719e4cefcb334a75d3865d. Run 2026-10-23T07:26:52Z to 2026-10-23T07:50:16Z, 1404 seconds by UTC timestamps. No carried result or retry.
|
||||
|
||||
The preflight passed. All three case1 files and all 59 CLI files ran whole. Unmutated total: 1076 pass, 0 fail, 0 skip, 0 cancelled, 0 todo. Mutants: 6/6 killed by named assertions, no external timeout. All six restores match their original SHA256 and have clean git status. Sweep: 0 gate residuals; four MCP harness processes predate the gate, with start times in sweep.json.
|
||||
|
||||
| Stage | Pass | Fail | Skip | Wall seconds | Start load |
|
||||
| --- | ---: | ---: | ---: | ---: | --- |
|
||||
| case1-whole-1 | 53 | 0 | 0 | 239.134 | 1.05 |
|
||||
| case1-whole-2 | 53 | 0 | 0 | 240.044 | 3.41 |
|
||||
| case1-whole-3 | 53 | 0 | 0 | 235.011 | 2.08 |
|
||||
| cli-whole | 917 | 0 | 0 | 631.848 | 1.91 |
|
||||
|
||||
CLI sampled 1-minute load range: 1.54 to 7.17. Ambient >=4 was a target, not a wait condition. No stress process. Each of the three case1 start loads and the CLI start/load samples are recorded. The direct readings below come from the test diagnostics, with fixed inner [1.25,2.75) and outer [3.25,4.75) bands.
|
||||
|
||||
| Stage | Inner exec | Inner hop | Outer exec | Outer hop |
|
||||
| --- | ---: | ---: | ---: | ---: |
|
||||
| case1-whole-1 | 2.25 | 2.27 | 4 | 4 |
|
||||
| case1-whole-2 | 2.29 | 2.28 | 4 | 4.01 |
|
||||
| case1-whole-3 | 2.25 | 2.26 | 4 | 4 |
|
||||
| cli-whole | 2.27 | 2.27 | 4.01 | 4.01 |
|
||||
|
||||
| Mutant | Named killer | Assertion | Direct interval | Wall seconds |
|
||||
| --- | --- | --- | --- | ---: |
|
||||
| M1 | row253 C4 P10 inner reason holds under both sudo models | case1-accept.test.mjs:450 lower band | 1.23 | 4.774 |
|
||||
| M2 | row253 C4 P10 inner reason holds under both sudo models | case1-accept.test.mjs:450 upper band | 3.24 | 6.768 |
|
||||
| M3 | row253 C4 P10 outer reason holds under both sudo models | case1-accept.test.mjs:452 outer lower band | 3.01 | 6.618 |
|
||||
| M4 | row253 C4 P10 outer reason holds under both sudo models | case1-accept.test.mjs:445 exact probe-outer-timeout reason | not reached | 9.023 |
|
||||
| M5 | row253 C4 P10 inner reason holds under both sudo models | case1-accept.test.mjs:448 required complete pair (doesNotThrow) | not reached | 5.816 |
|
||||
| M6 | row299 P10 observer records are complete and ordered | case1-accept.test.mjs:418 equal readings must refuse (throws) | not reached | 0.164 |
|
||||
|
||||
M1 measured 1.23 s, below 1.25 by only 0.02 s. This is the anticipated startup-overhead risk. It died at the intended lower-band assertion; no tuning or retry was used.
|
||||
|
||||
M4 classification follows sage-3271, sage-3273 and mos-1426. The unchanged 7000 ms fixture guard returned; the named outer test failed with ERR_ASSERTION / match at line 445 because P10 reported reason=probe-inner-command instead of exact reason=probe-outer-timeout. It returned rc 1 in 9.023 s including the baseline. No external command timeout or cleanup-only failure was counted. Raw evidence: M4.log, M4.command.json, results.json guard_return_receipt and clean restore.
|
||||
|
||||
sage-3274 reported a read-only canonical queue polling overlap for receipts window 07:20–07:26Z. It wrote nothing and touched no worktree or test path. This is accepted ambient load, not a rerun condition; ambient-overlap.json keeps the report.
|
||||
|
||||
All raw logs, command headers with timeout -k 10, TMPDIRs, per-stage load samples, controller, results, and restores are in this directory. Every run used a fresh short TMPDIR directly under /mnt/storage/scratch/tmp. No source or assertion changed during the gate.
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"source": "sage-3274",
|
||||
"reported_utc": "2026-10-23T07:27:24Z",
|
||||
"window_utc": [
|
||||
"2026-10-23T07:20:00Z",
|
||||
"2026-10-23T07:26:00Z"
|
||||
],
|
||||
"activity": "Read-only canonical queue show 303 every 20 seconds by Duckworth, stopped; no writes or test/worktree paths touched",
|
||||
"classification": "Allowed ambient overlap under mos-1409, no rerun or recheck"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"label": "case1-whole-1",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/geSGqXZ",
|
||||
"started_utc": "2026-10-23T07:26:57Z",
|
||||
"start_load": "1.05 1.69 2.00 1/6640 205920",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/case1-whole-1.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,242 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:26:57Z",
|
||||
"load": "1.05 1.69 2.00 5/6641 205921"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 5.001,
|
||||
"utc": "2026-10-23T07:27:02Z",
|
||||
"load": "1.05 1.68 1.99 2/6664 208983"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 10.001,
|
||||
"utc": "2026-10-23T07:27:07Z",
|
||||
"load": "1.12 1.69 1.99 4/6679 212072"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 15.001,
|
||||
"utc": "2026-10-23T07:27:12Z",
|
||||
"load": "1.19 1.69 1.99 4/6676 215231"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 20.001,
|
||||
"utc": "2026-10-23T07:27:17Z",
|
||||
"load": "1.26 1.70 1.99 2/6696 218364"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 25.002,
|
||||
"utc": "2026-10-23T07:27:22Z",
|
||||
"load": "1.24 1.69 1.99 2/6689 221537"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 30.002,
|
||||
"utc": "2026-10-23T07:27:27Z",
|
||||
"load": "1.22 1.67 1.98 2/6683 224753"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 35.002,
|
||||
"utc": "2026-10-23T07:27:32Z",
|
||||
"load": "1.36 1.70 1.99 3/6686 228651"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 40.002,
|
||||
"utc": "2026-10-23T07:27:37Z",
|
||||
"load": "1.33 1.68 1.98 3/6709 231645"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 45.003,
|
||||
"utc": "2026-10-23T07:27:42Z",
|
||||
"load": "1.22 1.66 1.97 2/6719 234495"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 50.003,
|
||||
"utc": "2026-10-23T07:27:47Z",
|
||||
"load": "1.21 1.64 1.97 3/6710 235979"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 55.003,
|
||||
"utc": "2026-10-23T07:27:52Z",
|
||||
"load": "1.27 1.65 1.97 3/6724 238345"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 60.003,
|
||||
"utc": "2026-10-23T07:27:57Z",
|
||||
"load": "1.33 1.66 1.97 4/6734 240013"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 65.004,
|
||||
"utc": "2026-10-23T07:28:02Z",
|
||||
"load": "1.38 1.66 1.97 1/6730 240697"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 70.004,
|
||||
"utc": "2026-10-23T07:28:07Z",
|
||||
"load": "1.43 1.67 1.97 4/6727 243478"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 75.004,
|
||||
"utc": "2026-10-23T07:28:12Z",
|
||||
"load": "1.48 1.67 1.97 2/6745 245706"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 80.004,
|
||||
"utc": "2026-10-23T07:28:17Z",
|
||||
"load": "1.44 1.66 1.96 2/6741 247933"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 85.005,
|
||||
"utc": "2026-10-23T07:28:22Z",
|
||||
"load": "1.48 1.67 1.97 1/6742 249267"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 90.005,
|
||||
"utc": "2026-10-23T07:28:27Z",
|
||||
"load": "1.53 1.68 1.97 1/6710 251793"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 95.005,
|
||||
"utc": "2026-10-23T07:28:32Z",
|
||||
"load": "1.48 1.66 1.96 2/6712 253250"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 100.005,
|
||||
"utc": "2026-10-23T07:28:37Z",
|
||||
"load": "1.53 1.67 1.96 4/6719 256547"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 105.006,
|
||||
"utc": "2026-10-23T07:28:42Z",
|
||||
"load": "1.56 1.68 1.96 5/6721 259938"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 110.006,
|
||||
"utc": "2026-10-23T07:28:47Z",
|
||||
"load": "1.68 1.70 1.97 4/6762 263119"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 115.006,
|
||||
"utc": "2026-10-23T07:28:52Z",
|
||||
"load": "1.86 1.74 1.98 3/6741 266483"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 120.006,
|
||||
"utc": "2026-10-23T07:28:57Z",
|
||||
"load": "2.20 1.81 2.00 2/6714 269932"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 125.006,
|
||||
"utc": "2026-10-23T07:29:02Z",
|
||||
"load": "2.42 1.86 2.02 6/6713 274031"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 130.007,
|
||||
"utc": "2026-10-23T07:29:07Z",
|
||||
"load": "2.55 1.90 2.03 3/6718 277881"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 135.007,
|
||||
"utc": "2026-10-23T07:29:12Z",
|
||||
"load": "2.58 1.91 2.03 2/6741 281990"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 140.007,
|
||||
"utc": "2026-10-23T07:29:17Z",
|
||||
"load": "2.62 1.93 2.04 4/6740 286159"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 145.007,
|
||||
"utc": "2026-10-23T07:29:22Z",
|
||||
"load": "2.73 1.97 2.05 2/6748 290530"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 150.008,
|
||||
"utc": "2026-10-23T07:29:27Z",
|
||||
"load": "2.99 2.04 2.07 2/6701 294400"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 155.008,
|
||||
"utc": "2026-10-23T07:29:32Z",
|
||||
"load": "3.07 2.07 2.08 3/6694 297610"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 160.008,
|
||||
"utc": "2026-10-23T07:29:37Z",
|
||||
"load": "3.15 2.10 2.09 5/6705 300813"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 165.008,
|
||||
"utc": "2026-10-23T07:29:42Z",
|
||||
"load": "3.05 2.10 2.09 2/6703 304321"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 170.008,
|
||||
"utc": "2026-10-23T07:29:47Z",
|
||||
"load": "3.05 2.11 2.10 3/6739 307613"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 175.009,
|
||||
"utc": "2026-10-23T07:29:52Z",
|
||||
"load": "2.97 2.11 2.10 2/6745 310850"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 180.009,
|
||||
"utc": "2026-10-23T07:29:57Z",
|
||||
"load": "2.89 2.11 2.09 4/6709 314125"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 185.009,
|
||||
"utc": "2026-10-23T07:30:02Z",
|
||||
"load": "3.14 2.17 2.12 4/6698 317556"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 190.009,
|
||||
"utc": "2026-10-23T07:30:07Z",
|
||||
"load": "3.93 2.35 2.17 2/6708 321964"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 195.009,
|
||||
"utc": "2026-10-23T07:30:12Z",
|
||||
"load": "3.93 2.38 2.18 2/6713 325120"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 200.01,
|
||||
"utc": "2026-10-23T07:30:17Z",
|
||||
"load": "3.78 2.38 2.18 3/6721 328405"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 205.01,
|
||||
"utc": "2026-10-23T07:30:22Z",
|
||||
"load": "3.80 2.40 2.19 2/6725 331643"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 210.01,
|
||||
"utc": "2026-10-23T07:30:27Z",
|
||||
"load": "3.89 2.45 2.21 5/6714 335757"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 215.01,
|
||||
"utc": "2026-10-23T07:30:32Z",
|
||||
"load": "3.74 2.44 2.21 2/6706 339141"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 220.01,
|
||||
"utc": "2026-10-23T07:30:37Z",
|
||||
"load": "3.60 2.43 2.20 3/6722 342107"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 225.011,
|
||||
"utc": "2026-10-23T07:30:42Z",
|
||||
"load": "3.63 2.46 2.21 4/6716 345179"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 230.011,
|
||||
"utc": "2026-10-23T07:30:47Z",
|
||||
"load": "3.66 2.48 2.22 2/6740 349322"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 235.011,
|
||||
"utc": "2026-10-23T07:30:52Z",
|
||||
"load": "3.53 2.47 2.22 3/6745 352500"
|
||||
}
|
||||
]
|
||||
@@ -1,332 +0,0 @@
|
||||
TAP version 13
|
||||
# Subtest: row253 socket observation uses configured root, metadata and the Console peer without sending bytes
|
||||
ok 1 - row253 socket observation uses configured root, metadata and the Console peer without sending bytes
|
||||
---
|
||||
duration_ms: 1855.818133
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
|
||||
ok 2 - row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
|
||||
---
|
||||
duration_ms: 29336.896059
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 acceptance rejects bad config and unsupported copies before talk
|
||||
ok 3 - row253 acceptance rejects bad config and unsupported copies before talk
|
||||
---
|
||||
duration_ms: 1492.589344
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 stalled peer observation ends within its bound without leaving a reader
|
||||
ok 4 - row253 stalled peer observation ends within its bound without leaving a reader
|
||||
---
|
||||
duration_ms: 3995.592937
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 P8 refuses both retired TCP and board listeners
|
||||
ok 5 - row253 P8 refuses both retired TCP and board listeners
|
||||
---
|
||||
duration_ms: 3885.105115
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 acceptance query inner reason holds under both sudo models
|
||||
ok 6 - row253 C4 acceptance query inner reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 10722.031738
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 acceptance query outer reason discards stdout and names residual cleanup
|
||||
ok 7 - row253 C4 acceptance query outer reason discards stdout and names residual cleanup
|
||||
---
|
||||
duration_ms: 14183.471618
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 acceptance query overflow is output-limit in both models
|
||||
ok 8 - row253 C4 acceptance query overflow is output-limit in both models
|
||||
---
|
||||
duration_ms: 492.660764
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row299 P10 timing copy preserves shipped bytes and isolates observer variables
|
||||
ok 9 - row299 P10 timing copy preserves shipped bytes and isolates observer variables
|
||||
---
|
||||
duration_ms: 0.874413
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row299 P10 observers preserve stdout stderr status and the EXIT trap
|
||||
ok 10 - row299 P10 observers preserve stdout stderr status and the EXIT trap
|
||||
---
|
||||
duration_ms: 3.117643
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row299 P10 observer records are complete and ordered
|
||||
ok 11 - row299 P10 observer records are complete and ordered
|
||||
---
|
||||
duration_ms: 0.494254
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 P10 inner reason holds under both sudo models
|
||||
ok 12 - row253 C4 P10 inner reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 11837.509919
|
||||
type: 'test'
|
||||
...
|
||||
# {"fault":"inner","mode":"exec","baselineSeconds":1.8914214159999974,"faultSeconds":3.974223306999993,"probeSeconds":2.25}
|
||||
# {"fault":"inner","mode":"hop","baselineSeconds":1.8980776110000006,"faultSeconds":4.004310756999999,"probeSeconds":2.27}
|
||||
# Subtest: row253 C4 P10 outer reason holds under both sudo models
|
||||
ok 13 - row253 C4 P10 outer reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 15238.957947
|
||||
type: 'test'
|
||||
...
|
||||
# {"fault":"outer","mode":"exec","baselineSeconds":1.8725320299999875,"faultSeconds":5.715126132999998,"probeSeconds":4}
|
||||
# {"fault":"outer","mode":"hop","baselineSeconds":1.8715896639999992,"faultSeconds":5.726812752999991,"probeSeconds":4}
|
||||
# Subtest: row253 C4 P10 overflow reason holds under both sudo models
|
||||
ok 14 - row253 C4 P10 overflow reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 3757.733977
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: every check passing exits 0, with each P mark and counts that match the lines
|
||||
ok 15 - row 195 accept: every check passing exits 0, with each P mark and counts that match the lines
|
||||
---
|
||||
duration_ms: 1879.003371
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: exits 1 with each F check failing alone, and its line names it
|
||||
ok 16 - row 195 accept: exits 1 with each F check failing alone, and its line names it
|
||||
---
|
||||
duration_ms: 21149.551708
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error
|
||||
ok 17 - row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error
|
||||
---
|
||||
duration_ms: 3936.849005
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic
|
||||
ok 18 - row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic
|
||||
---
|
||||
duration_ms: 3519.175544
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port
|
||||
ok 19 - row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port
|
||||
---
|
||||
duration_ms: 3846.383271
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space
|
||||
ok 20 - row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space
|
||||
---
|
||||
duration_ms: 8775.592742
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone
|
||||
ok 21 - row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone
|
||||
---
|
||||
duration_ms: 4053.330344
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment
|
||||
ok 22 - row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment
|
||||
---
|
||||
duration_ms: 5151.877925
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by
|
||||
ok 23 - row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by
|
||||
---
|
||||
duration_ms: 5579.901611
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential
|
||||
ok 24 - row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential
|
||||
---
|
||||
duration_ms: 5585.627061
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag
|
||||
ok 25 - row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag
|
||||
---
|
||||
duration_ms: 5536.898215
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it
|
||||
ok 26 - row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it
|
||||
---
|
||||
duration_ms: 5246.446744
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory
|
||||
ok 27 - row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory
|
||||
---
|
||||
duration_ms: 3711.063365
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: each P check reports unnamed on its fault, and the exit stays 0
|
||||
ok 28 - row 195 accept: each P check reports unnamed on its fault, and the exit stays 0
|
||||
---
|
||||
duration_ms: 16646.70564
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker
|
||||
ok 29 - row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker
|
||||
---
|
||||
duration_ms: 3728.983
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys
|
||||
ok 30 - row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys
|
||||
---
|
||||
duration_ms: 1843.108704
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: P9 is unnamed once for each item missing
|
||||
ok 31 - row 195 accept: P9 is unnamed once for each item missing
|
||||
---
|
||||
duration_ms: 9276.56305
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 accept: P10 fails its observation with another peer; P11 with the unit disabled
|
||||
ok 32 - row253 accept: P10 fails its observation with another peer; P11 with the unit disabled
|
||||
---
|
||||
duration_ms: 3822.919805
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: every P check unnamed together still exits 0
|
||||
ok 33 - row 195 accept: every P check unnamed together still exits 0
|
||||
---
|
||||
duration_ms: 1656.312404
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason
|
||||
ok 34 - row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason
|
||||
---
|
||||
duration_ms: 97.36437
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: usage errors and a run without --root as a user exit 2
|
||||
ok 35 - row 195 accept: usage errors and a run without --root as a user exit 2
|
||||
---
|
||||
duration_ms: 10.881957
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:...
|
||||
ok 36 - row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:...
|
||||
---
|
||||
duration_ms: 1850.760145
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: the host check runs with --check and never --enforce
|
||||
ok 37 - row 195 accept: the host check runs with --check and never --enforce
|
||||
---
|
||||
duration_ms: 1869.942933
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 legacy call inventory pins every production bound and the conversation contract
|
||||
ok 38 - row276 legacy call inventory pins every production bound and the conversation contract
|
||||
---
|
||||
duration_ms: 0.366334
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 talk legacy inner timeout cleans both sudo models
|
||||
ok 39 - row276 talk legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1692.158566
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 precheck legacy inner timeout cleans both sudo models
|
||||
ok 40 - row276 precheck legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1720.136504
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 claude-version legacy inner timeout cleans both sudo models
|
||||
ok 41 - row276 claude-version legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1702.886014
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 pm-list legacy inner timeout cleans both sudo models
|
||||
ok 42 - row276 pm-list legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1710.920935
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 node-version legacy inner timeout cleans both sudo models
|
||||
ok 43 - row276 node-version legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1712.683898
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 legacy streams and display status preserve failures without granting success
|
||||
ok 44 - row276 legacy streams and display status preserve failures without granting success
|
||||
---
|
||||
duration_ms: 2671.771328
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 trailer grammar cannot make supervisor failure pass
|
||||
ok 45 - row276 trailer grammar cannot make supervisor failure pass
|
||||
---
|
||||
duration_ms: 2089.079622
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 earlier forged trailer and appended zero remain failures
|
||||
ok 46 - row276 earlier forged trailer and appended zero remain failures
|
||||
---
|
||||
duration_ms: 513.433074
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 precheck outer bound discards success status and fixture cleans residual
|
||||
ok 47 - row276 precheck outer bound discards success status and fixture cleans residual
|
||||
---
|
||||
duration_ms: 2173.848153
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 case1 capture and legacy tools refuse unsafe system tools
|
||||
ok 48 - row276 case1 capture and legacy tools refuse unsafe system tools
|
||||
---
|
||||
duration_ms: 76.5521
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 stderr retention is bounded and keeps the final diagnostic
|
||||
ok 49 - row276 stderr retention is bounded and keeps the final diagnostic
|
||||
---
|
||||
duration_ms: 278.525167
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 version and PM checks refuse successful-looking stdout on supervisor failure
|
||||
ok 50 - row276 version and PM checks refuse successful-looking stdout on supervisor failure
|
||||
---
|
||||
duration_ms: 15.742297
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 full acceptance keeps all five healthy calls in both sudo models
|
||||
ok 51 - row276 full acceptance keeps all five healthy calls in both sudo models
|
||||
---
|
||||
duration_ms: 3757.894895
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 vanished pid stat read returns 3 with empty stderr in both scripts
|
||||
ok 52 - row276 vanished pid stat read returns 3 with empty stderr in both scripts
|
||||
---
|
||||
duration_ms: 4.785932
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 legacy stdout snapshot preserves exact bytes on success and command failure
|
||||
ok 53 - row276 legacy stdout snapshot preserves exact bytes on success and command failure
|
||||
---
|
||||
duration_ms: 3281.165451
|
||||
type: 'test'
|
||||
...
|
||||
1..53
|
||||
# tests 53
|
||||
# suites 0
|
||||
# pass 53
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 239100.197017
|
||||
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"label": "case1-whole-2",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gd0qwWL",
|
||||
"started_utc": "2026-10-23T07:30:57Z",
|
||||
"start_load": "3.41 2.47 2.22 4/6666 357541",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/case1-whole-2.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,247 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:30:57Z",
|
||||
"load": "3.41 2.47 2.22 8/6667 357542"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 5.001,
|
||||
"utc": "2026-10-23T07:31:02Z",
|
||||
"load": "3.21 2.44 2.21 6/6697 360865"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 10.001,
|
||||
"utc": "2026-10-23T07:31:07Z",
|
||||
"load": "3.44 2.50 2.23 2/6704 364103"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 15.001,
|
||||
"utc": "2026-10-23T07:31:12Z",
|
||||
"load": "3.24 2.48 2.23 2/6696 367319"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 20.001,
|
||||
"utc": "2026-10-23T07:31:17Z",
|
||||
"load": "3.14 2.47 2.23 8/6721 370622"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 25.002,
|
||||
"utc": "2026-10-23T07:31:22Z",
|
||||
"load": "3.05 2.46 2.22 3/6707 373850"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 30.002,
|
||||
"utc": "2026-10-23T07:31:27Z",
|
||||
"load": "2.89 2.44 2.22 2/6664 377071"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 35.002,
|
||||
"utc": "2026-10-23T07:31:32Z",
|
||||
"load": "2.73 2.41 2.21 2/6679 380056"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 40.002,
|
||||
"utc": "2026-10-23T07:31:37Z",
|
||||
"load": "2.52 2.37 2.20 4/6709 384877"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 45.002,
|
||||
"utc": "2026-10-23T07:31:42Z",
|
||||
"load": "2.71 2.42 2.21 3/6727 386330"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 50.003,
|
||||
"utc": "2026-10-23T07:31:47Z",
|
||||
"load": "2.58 2.39 2.21 1/6740 387775"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 55.003,
|
||||
"utc": "2026-10-23T07:31:52Z",
|
||||
"load": "2.69 2.42 2.22 9/6763 389481"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 60.003,
|
||||
"utc": "2026-10-23T07:31:57Z",
|
||||
"load": "2.56 2.39 2.21 3/6722 390241"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 65.003,
|
||||
"utc": "2026-10-23T07:32:02Z",
|
||||
"load": "2.43 2.37 2.20 4/6732 391752"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 70.004,
|
||||
"utc": "2026-10-23T07:32:07Z",
|
||||
"load": "2.40 2.36 2.20 9/6738 395390"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 75.004,
|
||||
"utc": "2026-10-23T07:32:12Z",
|
||||
"load": "2.44 2.38 2.21 6/6731 398840"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 80.004,
|
||||
"utc": "2026-10-23T07:32:17Z",
|
||||
"load": "2.57 2.40 2.22 3/6790 402895"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 85.004,
|
||||
"utc": "2026-10-23T07:32:22Z",
|
||||
"load": "2.60 2.41 2.22 1/6721 405197"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 90.005,
|
||||
"utc": "2026-10-23T07:32:27Z",
|
||||
"load": "2.48 2.39 2.21 6/6682 407571"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 95.005,
|
||||
"utc": "2026-10-23T07:32:32Z",
|
||||
"load": "2.44 2.38 2.21 3/6688 408595"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 100.005,
|
||||
"utc": "2026-10-23T07:32:37Z",
|
||||
"load": "2.32 2.36 2.21 4/6690 411784"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 105.005,
|
||||
"utc": "2026-10-23T07:32:42Z",
|
||||
"load": "2.38 2.37 2.21 2/6695 414989"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 110.006,
|
||||
"utc": "2026-10-23T07:32:47Z",
|
||||
"load": "2.27 2.35 2.20 2/6747 418296"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 115.006,
|
||||
"utc": "2026-10-23T07:32:52Z",
|
||||
"load": "2.16 2.32 2.20 3/6725 421487"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 120.006,
|
||||
"utc": "2026-10-23T07:32:57Z",
|
||||
"load": "2.31 2.35 2.21 2/6717 424642"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 125.006,
|
||||
"utc": "2026-10-23T07:33:02Z",
|
||||
"load": "2.37 2.36 2.21 2/6711 427881"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 130.007,
|
||||
"utc": "2026-10-23T07:33:07Z",
|
||||
"load": "2.34 2.36 2.21 8/6702 431078"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 135.007,
|
||||
"utc": "2026-10-23T07:33:12Z",
|
||||
"load": "2.55 2.40 2.22 4/6715 434482"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 140.007,
|
||||
"utc": "2026-10-23T07:33:17Z",
|
||||
"load": "2.59 2.41 2.23 8/6722 437629"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 145.007,
|
||||
"utc": "2026-10-23T07:33:22Z",
|
||||
"load": "3.10 2.52 2.27 5/6730 441654"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 150.008,
|
||||
"utc": "2026-10-23T07:33:27Z",
|
||||
"load": "2.93 2.50 2.26 3/6688 445391"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 155.008,
|
||||
"utc": "2026-10-23T07:33:32Z",
|
||||
"load": "2.86 2.49 2.26 2/6720 449750"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 160.008,
|
||||
"utc": "2026-10-23T07:33:37Z",
|
||||
"load": "2.63 2.45 2.24 3/6720 454134"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 165.008,
|
||||
"utc": "2026-10-23T07:33:42Z",
|
||||
"load": "2.58 2.44 2.24 3/6705 458552"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 170.008,
|
||||
"utc": "2026-10-23T07:33:47Z",
|
||||
"load": "2.53 2.43 2.24 2/6751 462649"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 175.009,
|
||||
"utc": "2026-10-23T07:33:52Z",
|
||||
"load": "2.49 2.42 2.24 2/6728 466002"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 180.009,
|
||||
"utc": "2026-10-23T07:33:57Z",
|
||||
"load": "2.37 2.40 2.23 4/6684 469149"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 185.009,
|
||||
"utc": "2026-10-23T07:34:02Z",
|
||||
"load": "2.50 2.43 2.24 10/6506 472229"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 190.009,
|
||||
"utc": "2026-10-23T07:34:07Z",
|
||||
"load": "2.78 2.49 2.26 3/6479 475928"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 195.01,
|
||||
"utc": "2026-10-23T07:34:12Z",
|
||||
"load": "2.64 2.46 2.26 3/6479 479085"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 200.01,
|
||||
"utc": "2026-10-23T07:34:17Z",
|
||||
"load": "2.51 2.44 2.25 3/6502 482380"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 205.01,
|
||||
"utc": "2026-10-23T07:34:22Z",
|
||||
"load": "2.63 2.46 2.26 4/6485 486156"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 210.01,
|
||||
"utc": "2026-10-23T07:34:27Z",
|
||||
"load": "2.50 2.44 2.25 2/6457 489465"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 215.011,
|
||||
"utc": "2026-10-23T07:34:32Z",
|
||||
"load": "2.38 2.41 2.25 2/6462 492613"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 220.011,
|
||||
"utc": "2026-10-23T07:34:37Z",
|
||||
"load": "2.27 2.39 2.24 2/6495 494796"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 225.011,
|
||||
"utc": "2026-10-23T07:34:42Z",
|
||||
"load": "2.08 2.35 2.23 1/6512 496267"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 230.011,
|
||||
"utc": "2026-10-23T07:34:47Z",
|
||||
"load": "2.00 2.33 2.22 2/6527 499579"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 235.012,
|
||||
"utc": "2026-10-23T07:34:52Z",
|
||||
"load": "2.00 2.32 2.22 2/6514 502183"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 240.012,
|
||||
"utc": "2026-10-23T07:34:57Z",
|
||||
"load": "2.00 2.32 2.22 8/6467 505173"
|
||||
}
|
||||
]
|
||||
@@ -1,332 +0,0 @@
|
||||
TAP version 13
|
||||
# Subtest: row253 socket observation uses configured root, metadata and the Console peer without sending bytes
|
||||
ok 1 - row253 socket observation uses configured root, metadata and the Console peer without sending bytes
|
||||
---
|
||||
duration_ms: 1878.940051
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
|
||||
ok 2 - row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
|
||||
---
|
||||
duration_ms: 29659.298682
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 acceptance rejects bad config and unsupported copies before talk
|
||||
ok 3 - row253 acceptance rejects bad config and unsupported copies before talk
|
||||
---
|
||||
duration_ms: 1402.898543
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 stalled peer observation ends within its bound without leaving a reader
|
||||
ok 4 - row253 stalled peer observation ends within its bound without leaving a reader
|
||||
---
|
||||
duration_ms: 3999.716359
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 P8 refuses both retired TCP and board listeners
|
||||
ok 5 - row253 P8 refuses both retired TCP and board listeners
|
||||
---
|
||||
duration_ms: 3772.509207
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 acceptance query inner reason holds under both sudo models
|
||||
ok 6 - row253 C4 acceptance query inner reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 10718.848845
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 acceptance query outer reason discards stdout and names residual cleanup
|
||||
ok 7 - row253 C4 acceptance query outer reason discards stdout and names residual cleanup
|
||||
---
|
||||
duration_ms: 14188.226585
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 acceptance query overflow is output-limit in both models
|
||||
ok 8 - row253 C4 acceptance query overflow is output-limit in both models
|
||||
---
|
||||
duration_ms: 508.639752
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row299 P10 timing copy preserves shipped bytes and isolates observer variables
|
||||
ok 9 - row299 P10 timing copy preserves shipped bytes and isolates observer variables
|
||||
---
|
||||
duration_ms: 0.798822
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row299 P10 observers preserve stdout stderr status and the EXIT trap
|
||||
ok 10 - row299 P10 observers preserve stdout stderr status and the EXIT trap
|
||||
---
|
||||
duration_ms: 3.117025
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row299 P10 observer records are complete and ordered
|
||||
ok 11 - row299 P10 observer records are complete and ordered
|
||||
---
|
||||
duration_ms: 0.531705
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 P10 inner reason holds under both sudo models
|
||||
ok 12 - row253 C4 P10 inner reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 12501.629468
|
||||
type: 'test'
|
||||
...
|
||||
# {"fault":"inner","mode":"exec","baselineSeconds":1.9894229939999932,"faultSeconds":4.213512103000001,"probeSeconds":2.29}
|
||||
# {"fault":"inner","mode":"hop","baselineSeconds":2.056171266999998,"faultSeconds":4.169351735999997,"probeSeconds":2.28}
|
||||
# Subtest: row253 C4 P10 outer reason holds under both sudo models
|
||||
ok 13 - row253 C4 P10 outer reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 15355.835698
|
||||
type: 'test'
|
||||
...
|
||||
# {"fault":"outer","mode":"exec","baselineSeconds":1.9589971570000053,"faultSeconds":5.726783651999998,"probeSeconds":4}
|
||||
# {"fault":"outer","mode":"hop","baselineSeconds":1.879084925999996,"faultSeconds":5.732443853999998,"probeSeconds":4.01}
|
||||
# Subtest: row253 C4 P10 overflow reason holds under both sudo models
|
||||
ok 14 - row253 C4 P10 overflow reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 3793.194421
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: every check passing exits 0, with each P mark and counts that match the lines
|
||||
ok 15 - row 195 accept: every check passing exits 0, with each P mark and counts that match the lines
|
||||
---
|
||||
duration_ms: 1868.627362
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: exits 1 with each F check failing alone, and its line names it
|
||||
ok 16 - row 195 accept: exits 1 with each F check failing alone, and its line names it
|
||||
---
|
||||
duration_ms: 21072.838361
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error
|
||||
ok 17 - row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error
|
||||
---
|
||||
duration_ms: 3708.467117
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic
|
||||
ok 18 - row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic
|
||||
---
|
||||
duration_ms: 3517.599317
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port
|
||||
ok 19 - row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port
|
||||
---
|
||||
duration_ms: 4025.946308
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space
|
||||
ok 20 - row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space
|
||||
---
|
||||
duration_ms: 8845.119954
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone
|
||||
ok 21 - row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone
|
||||
---
|
||||
duration_ms: 4126.5763
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment
|
||||
ok 22 - row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment
|
||||
---
|
||||
duration_ms: 5137.178557
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by
|
||||
ok 23 - row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by
|
||||
---
|
||||
duration_ms: 5691.366549
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential
|
||||
ok 24 - row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential
|
||||
---
|
||||
duration_ms: 5730.966972
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag
|
||||
ok 25 - row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag
|
||||
---
|
||||
duration_ms: 5621.584201
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it
|
||||
ok 26 - row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it
|
||||
---
|
||||
duration_ms: 5316.258522
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory
|
||||
ok 27 - row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory
|
||||
---
|
||||
duration_ms: 3764.13795
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: each P check reports unnamed on its fault, and the exit stays 0
|
||||
ok 28 - row 195 accept: each P check reports unnamed on its fault, and the exit stays 0
|
||||
---
|
||||
duration_ms: 16622.156132
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker
|
||||
ok 29 - row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker
|
||||
---
|
||||
duration_ms: 3681.147919
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys
|
||||
ok 30 - row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys
|
||||
---
|
||||
duration_ms: 1837.622854
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: P9 is unnamed once for each item missing
|
||||
ok 31 - row 195 accept: P9 is unnamed once for each item missing
|
||||
---
|
||||
duration_ms: 9351.705376
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 accept: P10 fails its observation with another peer; P11 with the unit disabled
|
||||
ok 32 - row253 accept: P10 fails its observation with another peer; P11 with the unit disabled
|
||||
---
|
||||
duration_ms: 3724.049411
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: every P check unnamed together still exits 0
|
||||
ok 33 - row 195 accept: every P check unnamed together still exits 0
|
||||
---
|
||||
duration_ms: 1644.081467
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason
|
||||
ok 34 - row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason
|
||||
---
|
||||
duration_ms: 93.429959
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: usage errors and a run without --root as a user exit 2
|
||||
ok 35 - row 195 accept: usage errors and a run without --root as a user exit 2
|
||||
---
|
||||
duration_ms: 10.484275
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:...
|
||||
ok 36 - row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:...
|
||||
---
|
||||
duration_ms: 1850.954185
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: the host check runs with --check and never --enforce
|
||||
ok 37 - row 195 accept: the host check runs with --check and never --enforce
|
||||
---
|
||||
duration_ms: 1829.605146
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 legacy call inventory pins every production bound and the conversation contract
|
||||
ok 38 - row276 legacy call inventory pins every production bound and the conversation contract
|
||||
---
|
||||
duration_ms: 0.390713
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 talk legacy inner timeout cleans both sudo models
|
||||
ok 39 - row276 talk legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1671.508097
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 precheck legacy inner timeout cleans both sudo models
|
||||
ok 40 - row276 precheck legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1671.245175
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 claude-version legacy inner timeout cleans both sudo models
|
||||
ok 41 - row276 claude-version legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1675.495392
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 pm-list legacy inner timeout cleans both sudo models
|
||||
ok 42 - row276 pm-list legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1661.382885
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 node-version legacy inner timeout cleans both sudo models
|
||||
ok 43 - row276 node-version legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1692.3437
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 legacy streams and display status preserve failures without granting success
|
||||
ok 44 - row276 legacy streams and display status preserve failures without granting success
|
||||
---
|
||||
duration_ms: 2545.7498
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 trailer grammar cannot make supervisor failure pass
|
||||
ok 45 - row276 trailer grammar cannot make supervisor failure pass
|
||||
---
|
||||
duration_ms: 2097.946825
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 earlier forged trailer and appended zero remain failures
|
||||
ok 46 - row276 earlier forged trailer and appended zero remain failures
|
||||
---
|
||||
duration_ms: 521.451262
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 precheck outer bound discards success status and fixture cleans residual
|
||||
ok 47 - row276 precheck outer bound discards success status and fixture cleans residual
|
||||
---
|
||||
duration_ms: 2170.592563
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 case1 capture and legacy tools refuse unsafe system tools
|
||||
ok 48 - row276 case1 capture and legacy tools refuse unsafe system tools
|
||||
---
|
||||
duration_ms: 76.678871
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 stderr retention is bounded and keeps the final diagnostic
|
||||
ok 49 - row276 stderr retention is bounded and keeps the final diagnostic
|
||||
---
|
||||
duration_ms: 261.872028
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 version and PM checks refuse successful-looking stdout on supervisor failure
|
||||
ok 50 - row276 version and PM checks refuse successful-looking stdout on supervisor failure
|
||||
---
|
||||
duration_ms: 16.458898
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 full acceptance keeps all five healthy calls in both sudo models
|
||||
ok 51 - row276 full acceptance keeps all five healthy calls in both sudo models
|
||||
---
|
||||
duration_ms: 3762.37926
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 vanished pid stat read returns 3 with empty stderr in both scripts
|
||||
ok 52 - row276 vanished pid stat read returns 3 with empty stderr in both scripts
|
||||
---
|
||||
duration_ms: 4.628196
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 legacy stdout snapshot preserves exact bytes on success and command failure
|
||||
ok 53 - row276 legacy stdout snapshot preserves exact bytes on success and command failure
|
||||
---
|
||||
duration_ms: 3223.67506
|
||||
type: 'test'
|
||||
...
|
||||
1..53
|
||||
# tests 53
|
||||
# suites 0
|
||||
# pass 53
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 240011.017536
|
||||
@@ -1,3 +0,0 @@
|
||||
CLEAR
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/445652/cmdline: No such file or directory
|
||||
/mnt/storage/scratch/sage-busy-now.sh: line 4: /proc/505165/cmdline: No such file or directory
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"label": "case1-whole-3",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gdjuph7",
|
||||
"started_utc": "2026-10-23T07:34:59Z",
|
||||
"start_load": "2.08 2.33 2.22 4/6464 509071",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/case1-whole-3.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,237 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:34:59Z",
|
||||
"load": "2.08 2.33 2.22 8/6465 509072"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 5.001,
|
||||
"utc": "2026-10-23T07:35:04Z",
|
||||
"load": "2.23 2.36 2.23 4/6481 514861"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 10.001,
|
||||
"utc": "2026-10-23T07:35:09Z",
|
||||
"load": "2.13 2.33 2.22 3/6475 518876"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 15.001,
|
||||
"utc": "2026-10-23T07:35:14Z",
|
||||
"load": "2.04 2.31 2.22 3/6502 522276"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 20.001,
|
||||
"utc": "2026-10-23T07:35:19Z",
|
||||
"load": "2.04 2.31 2.22 3/6502 525490"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 25.001,
|
||||
"utc": "2026-10-23T07:35:24Z",
|
||||
"load": "2.04 2.30 2.21 5/6478 528962"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 30.002,
|
||||
"utc": "2026-10-23T07:35:29Z",
|
||||
"load": "2.03 2.30 2.21 3/6458 532409"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 35.002,
|
||||
"utc": "2026-10-23T07:35:34Z",
|
||||
"load": "2.03 2.29 2.21 2/6481 535342"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 40.002,
|
||||
"utc": "2026-10-23T07:35:39Z",
|
||||
"load": "2.03 2.29 2.21 3/6483 537759"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 45.002,
|
||||
"utc": "2026-10-23T07:35:44Z",
|
||||
"load": "1.86 2.25 2.20 5/6511 539004"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 50.003,
|
||||
"utc": "2026-10-23T07:35:49Z",
|
||||
"load": "1.72 2.21 2.19 2/6524 540002"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 55.003,
|
||||
"utc": "2026-10-23T07:35:54Z",
|
||||
"load": "1.58 2.17 2.17 2/6482 540672"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 60.003,
|
||||
"utc": "2026-10-23T07:35:59Z",
|
||||
"load": "1.53 2.15 2.17 4/6471 541194"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 65.003,
|
||||
"utc": "2026-10-23T07:36:04Z",
|
||||
"load": "1.81 2.20 2.18 2/6474 541568"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 70.003,
|
||||
"utc": "2026-10-23T07:36:09Z",
|
||||
"load": "2.31 2.30 2.21 4/6503 545391"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 75.004,
|
||||
"utc": "2026-10-23T07:36:14Z",
|
||||
"load": "2.28 2.29 2.21 4/6517 548112"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 80.004,
|
||||
"utc": "2026-10-23T07:36:19Z",
|
||||
"load": "2.42 2.32 2.22 3/6526 551314"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 85.004,
|
||||
"utc": "2026-10-23T07:36:24Z",
|
||||
"load": "2.38 2.31 2.22 23/6474 553438"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 90.004,
|
||||
"utc": "2026-10-23T07:36:29Z",
|
||||
"load": "2.27 2.29 2.21 3/6475 556781"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 95.005,
|
||||
"utc": "2026-10-23T07:36:34Z",
|
||||
"load": "2.25 2.29 2.21 4/6460 559513"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 100.005,
|
||||
"utc": "2026-10-23T07:36:39Z",
|
||||
"load": "2.79 2.40 2.25 4/6488 566252"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 105.005,
|
||||
"utc": "2026-10-23T07:36:44Z",
|
||||
"load": "2.81 2.41 2.25 4/6480 569779"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 110.005,
|
||||
"utc": "2026-10-23T07:36:49Z",
|
||||
"load": "2.66 2.39 2.25 3/6489 572874"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 115.006,
|
||||
"utc": "2026-10-23T07:36:54Z",
|
||||
"load": "2.61 2.38 2.25 3/6447 576109"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 120.006,
|
||||
"utc": "2026-10-23T07:36:59Z",
|
||||
"load": "2.64 2.39 2.25 3/6433 579360"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 125.006,
|
||||
"utc": "2026-10-23T07:37:04Z",
|
||||
"load": "2.59 2.38 2.25 6/6448 582606"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 130.006,
|
||||
"utc": "2026-10-23T07:37:09Z",
|
||||
"load": "2.54 2.38 2.25 5/6451 585750"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 135.006,
|
||||
"utc": "2026-10-23T07:37:14Z",
|
||||
"load": "2.42 2.35 2.24 3/6464 588554"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 140.007,
|
||||
"utc": "2026-10-23T07:37:19Z",
|
||||
"load": "2.31 2.33 2.23 5/6469 591375"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 145.007,
|
||||
"utc": "2026-10-23T07:37:24Z",
|
||||
"load": "2.20 2.31 2.23 3/6436 594632"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 150.007,
|
||||
"utc": "2026-10-23T07:37:29Z",
|
||||
"load": "2.10 2.29 2.22 4/6408 597793"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 155.007,
|
||||
"utc": "2026-10-23T07:37:34Z",
|
||||
"load": "2.02 2.27 2.21 6/6423 601114"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 160.008,
|
||||
"utc": "2026-10-23T07:37:39Z",
|
||||
"load": "1.93 2.24 2.21 5/6420 604470"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 165.008,
|
||||
"utc": "2026-10-23T07:37:44Z",
|
||||
"load": "1.86 2.22 2.20 4/6456 608664"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 170.008,
|
||||
"utc": "2026-10-23T07:37:49Z",
|
||||
"load": "1.87 2.22 2.20 4/6455 612187"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 175.008,
|
||||
"utc": "2026-10-23T07:37:54Z",
|
||||
"load": "2.04 2.25 2.21 4/6441 616556"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 180.009,
|
||||
"utc": "2026-10-23T07:37:59Z",
|
||||
"load": "2.36 2.31 2.23 5/6417 620859"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 185.009,
|
||||
"utc": "2026-10-23T07:38:04Z",
|
||||
"load": "2.25 2.29 2.22 4/6428 625167"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 190.009,
|
||||
"utc": "2026-10-23T07:38:09Z",
|
||||
"load": "2.15 2.27 2.21 3/6424 629560"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 195.009,
|
||||
"utc": "2026-10-23T07:38:14Z",
|
||||
"load": "2.06 2.25 2.21 3/6441 632894"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 200.009,
|
||||
"utc": "2026-10-23T07:38:19Z",
|
||||
"load": "1.97 2.22 2.20 4/6447 636095"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 205.01,
|
||||
"utc": "2026-10-23T07:38:24Z",
|
||||
"load": "1.97 2.22 2.20 3/6421 639217"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 210.01,
|
||||
"utc": "2026-10-23T07:38:29Z",
|
||||
"load": "2.06 2.23 2.20 3/6413 642341"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 215.01,
|
||||
"utc": "2026-10-23T07:38:34Z",
|
||||
"load": "1.89 2.20 2.19 2/6452 644528"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 220.01,
|
||||
"utc": "2026-10-23T07:38:39Z",
|
||||
"load": "1.98 2.21 2.20 5/6458 646052"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 225.011,
|
||||
"utc": "2026-10-23T07:38:44Z",
|
||||
"load": "1.90 2.19 2.19 3/6453 648762"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 230.011,
|
||||
"utc": "2026-10-23T07:38:49Z",
|
||||
"load": "1.99 2.20 2.19 3/6456 650851"
|
||||
}
|
||||
]
|
||||
@@ -1,332 +0,0 @@
|
||||
TAP version 13
|
||||
# Subtest: row253 socket observation uses configured root, metadata and the Console peer without sending bytes
|
||||
ok 1 - row253 socket observation uses configured root, metadata and the Console peer without sending bytes
|
||||
---
|
||||
duration_ms: 1953.256427
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
|
||||
ok 2 - row253 P10 refuses unsafe metadata, wrong peers and an unsafe Python without claiming closure
|
||||
---
|
||||
duration_ms: 29343.328577
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 acceptance rejects bad config and unsupported copies before talk
|
||||
ok 3 - row253 acceptance rejects bad config and unsupported copies before talk
|
||||
---
|
||||
duration_ms: 1354.971037
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 stalled peer observation ends within its bound without leaving a reader
|
||||
ok 4 - row253 stalled peer observation ends within its bound without leaving a reader
|
||||
---
|
||||
duration_ms: 3964.438002
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 P8 refuses both retired TCP and board listeners
|
||||
ok 5 - row253 P8 refuses both retired TCP and board listeners
|
||||
---
|
||||
duration_ms: 3689.613255
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 acceptance query inner reason holds under both sudo models
|
||||
ok 6 - row253 C4 acceptance query inner reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 10712.630086
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 acceptance query outer reason discards stdout and names residual cleanup
|
||||
ok 7 - row253 C4 acceptance query outer reason discards stdout and names residual cleanup
|
||||
---
|
||||
duration_ms: 14177.055814
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 acceptance query overflow is output-limit in both models
|
||||
ok 8 - row253 C4 acceptance query overflow is output-limit in both models
|
||||
---
|
||||
duration_ms: 492.274319
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row299 P10 timing copy preserves shipped bytes and isolates observer variables
|
||||
ok 9 - row299 P10 timing copy preserves shipped bytes and isolates observer variables
|
||||
---
|
||||
duration_ms: 0.683633
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row299 P10 observers preserve stdout stderr status and the EXIT trap
|
||||
ok 10 - row299 P10 observers preserve stdout stderr status and the EXIT trap
|
||||
---
|
||||
duration_ms: 3.307686
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row299 P10 observer records are complete and ordered
|
||||
ok 11 - row299 P10 observer records are complete and ordered
|
||||
---
|
||||
duration_ms: 0.539265
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 C4 P10 inner reason holds under both sudo models
|
||||
ok 12 - row253 C4 P10 inner reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 11734.519359
|
||||
type: 'test'
|
||||
...
|
||||
# {"fault":"inner","mode":"exec","baselineSeconds":1.8627637730000133,"faultSeconds":3.9948855329999935,"probeSeconds":2.25}
|
||||
# {"fault":"inner","mode":"hop","baselineSeconds":1.8459824050000024,"faultSeconds":3.963717149000004,"probeSeconds":2.26}
|
||||
# Subtest: row253 C4 P10 outer reason holds under both sudo models
|
||||
ok 13 - row253 C4 P10 outer reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 15259.754291
|
||||
type: 'test'
|
||||
...
|
||||
# {"fault":"outer","mode":"exec","baselineSeconds":1.8736066859999991,"faultSeconds":5.7249899409999925,"probeSeconds":4}
|
||||
# {"fault":"outer","mode":"hop","baselineSeconds":1.8894593350000068,"faultSeconds":5.709737833999999,"probeSeconds":4}
|
||||
# Subtest: row253 C4 P10 overflow reason holds under both sudo models
|
||||
ok 14 - row253 C4 P10 overflow reason holds under both sudo models
|
||||
---
|
||||
duration_ms: 3822.763403
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: every check passing exits 0, with each P mark and counts that match the lines
|
||||
ok 15 - row 195 accept: every check passing exits 0, with each P mark and counts that match the lines
|
||||
---
|
||||
duration_ms: 1879.591109
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: exits 1 with each F check failing alone, and its line names it
|
||||
ok 16 - row 195 accept: exits 1 with each F check failing alone, and its line names it
|
||||
---
|
||||
duration_ms: 20490.628667
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error
|
||||
ok 17 - row 195 accept: F3 fails on exit 0 with no reply line, and its evidence takes talk's error
|
||||
---
|
||||
duration_ms: 3653.736213
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic
|
||||
ok 18 - row 195 accept: F1 fails on a unit that isn't active or isn't User=mosaic
|
||||
---
|
||||
duration_ms: 3442.442361
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port
|
||||
ok 19 - row 195 accept: F2 fails when healthz doesn't answer and when another pid holds the port
|
||||
---
|
||||
duration_ms: 3683.514446
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space
|
||||
ok 20 - row 195 accept: F5 fails on unpriv_bwrap (enforce), on complain and on a trailing space
|
||||
---
|
||||
duration_ms: 8437.165336
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone
|
||||
ok 21 - row 195 accept: F5 fails with no bwrap of mosaic's, and passes on comm alone
|
||||
---
|
||||
duration_ms: 3900.598202
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment
|
||||
ok 22 - row 195 accept: F6 fails on a stub that prints nothing, on a path outside claude-<pin> and on a .. segment
|
||||
---
|
||||
duration_ms: 4987.50038
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by
|
||||
ok 23 - row 195 accept: F7 fails on two live PM launches, one for another business, and no launch.by
|
||||
---
|
||||
duration_ms: 5425.289834
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential
|
||||
ok 24 - row 195 accept: F8 fails on 0640, on another owner and on a symlink, and never prints the credential
|
||||
---
|
||||
duration_ms: 5477.40542
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag
|
||||
ok 25 - row 195 accept: F9 fails on another owner, a group-writable mode and a number for the flag
|
||||
---
|
||||
duration_ms: 5434.786414
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it
|
||||
ok 26 - row 195 accept: F9 won't run --node as root off the pin path or with a writable directory above it
|
||||
---
|
||||
duration_ms: 5126.262984
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory
|
||||
ok 27 - row 195 accept: F11 fails on one *.json under discord/ and passes on an empty directory
|
||||
---
|
||||
duration_ms: 3711.251951
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: each P check reports unnamed on its fault, and the exit stays 0
|
||||
ok 28 - row 195 accept: each P check reports unnamed on its fault, and the exit stays 0
|
||||
---
|
||||
duration_ms: 16470.538016
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker
|
||||
ok 29 - row 195 accept: P2 is unnamed with a supplementary group, and P5 names docker
|
||||
---
|
||||
duration_ms: 3660.364965
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys
|
||||
ok 30 - row 195 accept: P5 is closed with no jarvis account, and P2 with an empty authorized_keys
|
||||
---
|
||||
duration_ms: 1799.768335
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: P9 is unnamed once for each item missing
|
||||
ok 31 - row 195 accept: P9 is unnamed once for each item missing
|
||||
---
|
||||
duration_ms: 9047.041702
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row253 accept: P10 fails its observation with another peer; P11 with the unit disabled
|
||||
ok 32 - row253 accept: P10 fails its observation with another peer; P11 with the unit disabled
|
||||
---
|
||||
duration_ms: 3624.70672
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: every P check unnamed together still exits 0
|
||||
ok 33 - row 195 accept: every P check unnamed together still exits 0
|
||||
---
|
||||
duration_ms: 1628.049695
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason
|
||||
ok 34 - row 195 accept: a bad args file refuses with exit 2 before any check, each for its own reason
|
||||
---
|
||||
duration_ms: 96.211247
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: usage errors and a run without --root as a user exit 2
|
||||
ok 35 - row 195 accept: usage errors and a run without --root as a user exit 2
|
||||
---
|
||||
duration_ms: 11.078071
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:...
|
||||
ok 36 - row 195 accept: every in-instance call goes through sudo -u mosaic -H env PATH=<node dir>:...
|
||||
---
|
||||
duration_ms: 1819.893166
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row 195 accept: the host check runs with --check and never --enforce
|
||||
ok 37 - row 195 accept: the host check runs with --check and never --enforce
|
||||
---
|
||||
duration_ms: 1818.576075
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 legacy call inventory pins every production bound and the conversation contract
|
||||
ok 38 - row276 legacy call inventory pins every production bound and the conversation contract
|
||||
---
|
||||
duration_ms: 0.367599
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 talk legacy inner timeout cleans both sudo models
|
||||
ok 39 - row276 talk legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1643.944453
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 precheck legacy inner timeout cleans both sudo models
|
||||
ok 40 - row276 precheck legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1647.187165
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 claude-version legacy inner timeout cleans both sudo models
|
||||
ok 41 - row276 claude-version legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1658.311785
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 pm-list legacy inner timeout cleans both sudo models
|
||||
ok 42 - row276 pm-list legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1662.34616
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 node-version legacy inner timeout cleans both sudo models
|
||||
ok 43 - row276 node-version legacy inner timeout cleans both sudo models
|
||||
---
|
||||
duration_ms: 1691.506329
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 legacy streams and display status preserve failures without granting success
|
||||
ok 44 - row276 legacy streams and display status preserve failures without granting success
|
||||
---
|
||||
duration_ms: 2558.787354
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 trailer grammar cannot make supervisor failure pass
|
||||
ok 45 - row276 trailer grammar cannot make supervisor failure pass
|
||||
---
|
||||
duration_ms: 1998.18351
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 earlier forged trailer and appended zero remain failures
|
||||
ok 46 - row276 earlier forged trailer and appended zero remain failures
|
||||
---
|
||||
duration_ms: 502.525144
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 precheck outer bound discards success status and fixture cleans residual
|
||||
ok 47 - row276 precheck outer bound discards success status and fixture cleans residual
|
||||
---
|
||||
duration_ms: 2166.851271
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 case1 capture and legacy tools refuse unsafe system tools
|
||||
ok 48 - row276 case1 capture and legacy tools refuse unsafe system tools
|
||||
---
|
||||
duration_ms: 74.697527
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 stderr retention is bounded and keeps the final diagnostic
|
||||
ok 49 - row276 stderr retention is bounded and keeps the final diagnostic
|
||||
---
|
||||
duration_ms: 241.007102
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 version and PM checks refuse successful-looking stdout on supervisor failure
|
||||
ok 50 - row276 version and PM checks refuse successful-looking stdout on supervisor failure
|
||||
---
|
||||
duration_ms: 16.132196
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 full acceptance keeps all five healthy calls in both sudo models
|
||||
ok 51 - row276 full acceptance keeps all five healthy calls in both sudo models
|
||||
---
|
||||
duration_ms: 3685.474118
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 vanished pid stat read returns 3 with empty stderr in both scripts
|
||||
ok 52 - row276 vanished pid stat read returns 3 with empty stderr in both scripts
|
||||
---
|
||||
duration_ms: 4.365639
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row276 legacy stdout snapshot preserves exact bytes on success and command failure
|
||||
ok 53 - row276 legacy stdout snapshot preserves exact bytes on success and command failure
|
||||
---
|
||||
duration_ms: 3188.820303
|
||||
type: 'test'
|
||||
...
|
||||
1..53
|
||||
# tests 53
|
||||
# suites 0
|
||||
# pass 53
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 234980.293151
|
||||
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,77 +0,0 @@
|
||||
{
|
||||
"label": "cli-whole",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"5400",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"packages/cli/tests/access-boot.test.mjs",
|
||||
"packages/cli/tests/access.test.mjs",
|
||||
"packages/cli/tests/app.test.mjs",
|
||||
"packages/cli/tests/boot-status.test.mjs",
|
||||
"packages/cli/tests/case1-accept.test.mjs",
|
||||
"packages/cli/tests/case1-hostcheck.test.mjs",
|
||||
"packages/cli/tests/case2-persona-import.test.mjs",
|
||||
"packages/cli/tests/case2-unit.test.mjs",
|
||||
"packages/cli/tests/channel-cli.test.mjs",
|
||||
"packages/cli/tests/channel-recovery.test.mjs",
|
||||
"packages/cli/tests/cli.test.mjs",
|
||||
"packages/cli/tests/compactions-launch.test.mjs",
|
||||
"packages/cli/tests/config.test.mjs",
|
||||
"packages/cli/tests/credentials.test.mjs",
|
||||
"packages/cli/tests/follow.test.mjs",
|
||||
"packages/cli/tests/format.test.mjs",
|
||||
"packages/cli/tests/gate-lane-auth.test.mjs",
|
||||
"packages/cli/tests/gate-lane-fixtures.test.mjs",
|
||||
"packages/cli/tests/gate-lane-image.test.mjs",
|
||||
"packages/cli/tests/gate-lane-state.test.mjs",
|
||||
"packages/cli/tests/gate-lane.test.mjs",
|
||||
"packages/cli/tests/git-socket.test.mjs",
|
||||
"packages/cli/tests/grants.test.mjs",
|
||||
"packages/cli/tests/host.test.mjs",
|
||||
"packages/cli/tests/hosts.test.mjs",
|
||||
"packages/cli/tests/instances.test.mjs",
|
||||
"packages/cli/tests/launch-account.test.mjs",
|
||||
"packages/cli/tests/launch-limit-checks.test.mjs",
|
||||
"packages/cli/tests/launch-limits.test.mjs",
|
||||
"packages/cli/tests/launch-routes.test.mjs",
|
||||
"packages/cli/tests/launcher.test.mjs",
|
||||
"packages/cli/tests/lifecycle.test.mjs",
|
||||
"packages/cli/tests/limits-tokens.test.mjs",
|
||||
"packages/cli/tests/limits.test.mjs",
|
||||
"packages/cli/tests/mark-read.test.mjs",
|
||||
"packages/cli/tests/names.test.mjs",
|
||||
"packages/cli/tests/notifier.test.mjs",
|
||||
"packages/cli/tests/other-tree.test.mjs",
|
||||
"packages/cli/tests/processing-cli.test.mjs",
|
||||
"packages/cli/tests/project-name-repo.test.mjs",
|
||||
"packages/cli/tests/project.test.mjs",
|
||||
"packages/cli/tests/publish-socket.test.mjs",
|
||||
"packages/cli/tests/session-clear.test.mjs",
|
||||
"packages/cli/tests/session-launch.test.mjs",
|
||||
"packages/cli/tests/stack-copy.test.mjs",
|
||||
"packages/cli/tests/stack-instances.test.mjs",
|
||||
"packages/cli/tests/stack-release-external.test.mjs",
|
||||
"packages/cli/tests/stack-release.test.mjs",
|
||||
"packages/cli/tests/stack-upgrade.test.mjs",
|
||||
"packages/cli/tests/tester-http.test.mjs",
|
||||
"packages/cli/tests/tester-reads.test.mjs",
|
||||
"packages/cli/tests/tester-threads.test.mjs",
|
||||
"packages/cli/tests/tester.test.mjs",
|
||||
"packages/cli/tests/thread-cli.test.mjs",
|
||||
"packages/cli/tests/thread-launch.test.mjs",
|
||||
"packages/cli/tests/trackers-boot.test.mjs",
|
||||
"packages/cli/tests/transport.test.mjs",
|
||||
"packages/cli/tests/usage.test.mjs",
|
||||
"packages/cli/tests/verbs.test.mjs"
|
||||
],
|
||||
"limit_seconds": 5400,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gebsaIr",
|
||||
"started_utc": "2026-10-23T07:38:55Z",
|
||||
"start_load": "1.91 2.18 2.19 1/6404 656161",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/cli-whole.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,637 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:38:55Z",
|
||||
"load": "1.91 2.18 2.19 4/6405 656162"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 5.001,
|
||||
"utc": "2026-10-23T07:39:00Z",
|
||||
"load": "3.52 2.51 2.29 20/6571 665258"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 10.001,
|
||||
"utc": "2026-10-23T07:39:05Z",
|
||||
"load": "4.36 2.70 2.36 17/6696 672370"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 15.001,
|
||||
"utc": "2026-10-23T07:39:10Z",
|
||||
"load": "5.05 2.88 2.41 32/6707 679808"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 20.001,
|
||||
"utc": "2026-10-23T07:39:15Z",
|
||||
"load": "5.77 3.06 2.48 20/6712 687650"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 25.002,
|
||||
"utc": "2026-10-23T07:39:20Z",
|
||||
"load": "6.59 3.28 2.55 21/6675 696103"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 30.002,
|
||||
"utc": "2026-10-23T07:39:25Z",
|
||||
"load": "6.78 3.37 2.58 13/6627 705121"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 35.002,
|
||||
"utc": "2026-10-23T07:39:30Z",
|
||||
"load": "6.56 3.38 2.59 4/6596 713973"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 40.003,
|
||||
"utc": "2026-10-23T07:39:35Z",
|
||||
"load": "6.59 3.44 2.62 4/6582 722361"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 45.003,
|
||||
"utc": "2026-10-23T07:39:40Z",
|
||||
"load": "6.71 3.52 2.64 5/6573 729968"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 50.003,
|
||||
"utc": "2026-10-23T07:39:45Z",
|
||||
"load": "6.81 3.59 2.67 9/6577 737845"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 55.003,
|
||||
"utc": "2026-10-23T07:39:50Z",
|
||||
"load": "6.67 3.62 2.69 6/6627 744813"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 60.004,
|
||||
"utc": "2026-10-23T07:39:55Z",
|
||||
"load": "7.01 3.74 2.73 4/6582 752028"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 65.004,
|
||||
"utc": "2026-10-23T07:40:00Z",
|
||||
"load": "7.17 3.83 2.76 5/6551 763533"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 70.004,
|
||||
"utc": "2026-10-23T07:40:05Z",
|
||||
"load": "7.08 3.86 2.78 5/6568 774263"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 75.004,
|
||||
"utc": "2026-10-23T07:40:10Z",
|
||||
"load": "6.99 3.90 2.80 4/6564 781529"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 80.004,
|
||||
"utc": "2026-10-23T07:40:15Z",
|
||||
"load": "6.91 3.93 2.82 4/6556 787135"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 85.005,
|
||||
"utc": "2026-10-23T07:40:20Z",
|
||||
"load": "6.68 3.93 2.82 5/6548 793267"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 90.005,
|
||||
"utc": "2026-10-23T07:40:25Z",
|
||||
"load": "6.46 3.94 2.83 2/6525 799740"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 95.005,
|
||||
"utc": "2026-10-23T07:40:30Z",
|
||||
"load": "6.19 3.92 2.83 3/6566 805494"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 100.005,
|
||||
"utc": "2026-10-23T07:40:35Z",
|
||||
"load": "7.05 4.14 2.91 4/6526 810900"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 105.006,
|
||||
"utc": "2026-10-23T07:40:40Z",
|
||||
"load": "6.57 4.09 2.90 3/6492 813663"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 110.006,
|
||||
"utc": "2026-10-23T07:40:45Z",
|
||||
"load": "6.12 4.03 2.89 6/6526 817202"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 115.006,
|
||||
"utc": "2026-10-23T07:40:50Z",
|
||||
"load": "5.71 3.98 2.88 4/6542 820365"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 120.006,
|
||||
"utc": "2026-10-23T07:40:55Z",
|
||||
"load": "5.49 3.97 2.88 3/6504 824801"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 125.006,
|
||||
"utc": "2026-10-23T07:41:00Z",
|
||||
"load": "5.13 3.92 2.87 5/6520 829672"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 130.007,
|
||||
"utc": "2026-10-23T07:41:05Z",
|
||||
"load": "4.96 3.90 2.87 5/6491 835347"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 135.007,
|
||||
"utc": "2026-10-23T07:41:10Z",
|
||||
"load": "4.81 3.89 2.87 6/6515 841325"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 140.007,
|
||||
"utc": "2026-10-23T07:41:15Z",
|
||||
"load": "4.66 3.87 2.87 3/6533 846943"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 145.007,
|
||||
"utc": "2026-10-23T07:41:20Z",
|
||||
"load": "4.53 3.86 2.87 6/6537 852457"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 150.008,
|
||||
"utc": "2026-10-23T07:41:25Z",
|
||||
"load": "4.81 3.93 2.90 5/6497 857183"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 155.008,
|
||||
"utc": "2026-10-23T07:41:30Z",
|
||||
"load": "4.74 3.93 2.91 9/6493 862111"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 160.008,
|
||||
"utc": "2026-10-23T07:41:35Z",
|
||||
"load": "4.52 3.89 2.90 3/6484 867180"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 165.008,
|
||||
"utc": "2026-10-23T07:41:40Z",
|
||||
"load": "4.88 3.98 2.93 3/6494 874705"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 170.009,
|
||||
"utc": "2026-10-23T07:41:45Z",
|
||||
"load": "4.57 3.93 2.92 5/6513 879949"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 175.009,
|
||||
"utc": "2026-10-23T07:41:50Z",
|
||||
"load": "4.36 3.90 2.92 3/6532 885364"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 180.009,
|
||||
"utc": "2026-10-23T07:41:55Z",
|
||||
"load": "4.09 3.85 2.91 4/6518 889649"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 185.009,
|
||||
"utc": "2026-10-23T07:42:00Z",
|
||||
"load": "4.33 3.90 2.93 3/6500 895045"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 190.01,
|
||||
"utc": "2026-10-23T07:42:05Z",
|
||||
"load": "4.22 3.89 2.93 5/6497 900591"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 195.01,
|
||||
"utc": "2026-10-23T07:42:10Z",
|
||||
"load": "4.28 3.91 2.94 6/6500 906203"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 200.01,
|
||||
"utc": "2026-10-23T07:42:15Z",
|
||||
"load": "4.18 3.89 2.94 3/6513 911214"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 205.01,
|
||||
"utc": "2026-10-23T07:42:20Z",
|
||||
"load": "4.00 3.86 2.94 3/6521 916524"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 210.011,
|
||||
"utc": "2026-10-23T07:42:25Z",
|
||||
"load": "4.56 3.98 2.98 4/6507 921377"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 215.011,
|
||||
"utc": "2026-10-23T07:42:30Z",
|
||||
"load": "4.84 4.04 3.01 2/6517 926031"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 220.011,
|
||||
"utc": "2026-10-23T07:42:35Z",
|
||||
"load": "4.61 4.01 3.00 2/6512 930921"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 225.011,
|
||||
"utc": "2026-10-23T07:42:40Z",
|
||||
"load": "4.72 4.04 3.02 5/6513 936830"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 230.011,
|
||||
"utc": "2026-10-23T07:42:45Z",
|
||||
"load": "5.07 4.13 3.05 6/6527 943593"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 235.012,
|
||||
"utc": "2026-10-23T07:42:50Z",
|
||||
"load": "4.90 4.11 3.05 4/6524 949131"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 240.012,
|
||||
"utc": "2026-10-23T07:42:55Z",
|
||||
"load": "4.75 4.09 3.05 3/6538 954091"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 245.012,
|
||||
"utc": "2026-10-23T07:43:00Z",
|
||||
"load": "4.53 4.05 3.04 4/6526 957569"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 250.012,
|
||||
"utc": "2026-10-23T07:43:05Z",
|
||||
"load": "4.49 4.05 3.05 4/6512 961428"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 255.013,
|
||||
"utc": "2026-10-23T07:43:10Z",
|
||||
"load": "4.21 4.00 3.04 2/6514 964580"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 260.013,
|
||||
"utc": "2026-10-23T07:43:15Z",
|
||||
"load": "4.03 3.97 3.03 3/6520 969453"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 265.013,
|
||||
"utc": "2026-10-23T07:43:20Z",
|
||||
"load": "3.95 3.95 3.03 2/6510 972206"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 270.013,
|
||||
"utc": "2026-10-23T07:43:25Z",
|
||||
"load": "3.71 3.90 3.02 4/6485 974717"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 275.013,
|
||||
"utc": "2026-10-23T07:43:30Z",
|
||||
"load": "3.49 3.85 3.01 2/6458 976947"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 280.014,
|
||||
"utc": "2026-10-23T07:43:35Z",
|
||||
"load": "3.29 3.81 3.00 2/6480 979354"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 285.014,
|
||||
"utc": "2026-10-23T07:43:40Z",
|
||||
"load": "3.11 3.76 2.99 2/6484 981777"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 290.014,
|
||||
"utc": "2026-10-23T07:43:45Z",
|
||||
"load": "2.94 3.71 2.98 9/6503 984183"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 295.014,
|
||||
"utc": "2026-10-23T07:43:50Z",
|
||||
"load": "2.86 3.68 2.97 2/6530 986646"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 300.015,
|
||||
"utc": "2026-10-23T07:43:55Z",
|
||||
"load": "2.72 3.64 2.96 2/6518 989821"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 305.015,
|
||||
"utc": "2026-10-23T07:44:00Z",
|
||||
"load": "2.66 3.61 2.95 2/6504 993303"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 310.015,
|
||||
"utc": "2026-10-23T07:44:05Z",
|
||||
"load": "2.77 3.62 2.96 3/6379 996998"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 315.015,
|
||||
"utc": "2026-10-23T07:44:10Z",
|
||||
"load": "2.78 3.61 2.96 3/6398 1000446"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 320.015,
|
||||
"utc": "2026-10-23T07:44:15Z",
|
||||
"load": "2.72 3.58 2.95 3/6378 1003966"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 325.016,
|
||||
"utc": "2026-10-23T07:44:20Z",
|
||||
"load": "2.90 3.61 2.97 1/6404 1007129"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 330.016,
|
||||
"utc": "2026-10-23T07:44:25Z",
|
||||
"load": "2.75 3.56 2.96 2/6357 1009536"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 335.016,
|
||||
"utc": "2026-10-23T07:44:30Z",
|
||||
"load": "2.69 3.54 2.95 3/6346 1011941"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 340.016,
|
||||
"utc": "2026-10-23T07:44:35Z",
|
||||
"load": "2.56 3.49 2.94 2/6359 1014274"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 345.017,
|
||||
"utc": "2026-10-23T07:44:40Z",
|
||||
"load": "2.43 3.45 2.93 2/6364 1016643"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 350.017,
|
||||
"utc": "2026-10-23T07:44:45Z",
|
||||
"load": "2.24 3.39 2.91 2/6385 1019039"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 355.017,
|
||||
"utc": "2026-10-23T07:44:50Z",
|
||||
"load": "2.14 3.35 2.90 2/6398 1021488"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 360.017,
|
||||
"utc": "2026-10-23T07:44:55Z",
|
||||
"load": "2.12 3.33 2.90 1/6372 1024145"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 365.018,
|
||||
"utc": "2026-10-23T07:45:00Z",
|
||||
"load": "2.03 3.29 2.89 2/6356 1026540"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 370.018,
|
||||
"utc": "2026-10-23T07:45:05Z",
|
||||
"load": "2.03 3.27 2.88 4/6367 1028881"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 375.018,
|
||||
"utc": "2026-10-23T07:45:10Z",
|
||||
"load": "2.03 3.25 2.88 4/6356 1031296"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 380.018,
|
||||
"utc": "2026-10-23T07:45:15Z",
|
||||
"load": "2.43 3.31 2.90 4/6364 1034002"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 385.019,
|
||||
"utc": "2026-10-23T07:45:20Z",
|
||||
"load": "2.47 3.31 2.90 4/6431 1037181"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 390.019,
|
||||
"utc": "2026-10-23T07:45:25Z",
|
||||
"load": "2.52 3.30 2.90 3/6366 1040453"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 395.019,
|
||||
"utc": "2026-10-23T07:45:30Z",
|
||||
"load": "2.71 3.33 2.91 2/6356 1043515"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 400.019,
|
||||
"utc": "2026-10-23T07:45:35Z",
|
||||
"load": "2.58 3.29 2.90 2/6353 1047043"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 405.019,
|
||||
"utc": "2026-10-23T07:45:40Z",
|
||||
"load": "2.61 3.29 2.90 3/6371 1050590"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 410.02,
|
||||
"utc": "2026-10-23T07:45:45Z",
|
||||
"load": "2.56 3.26 2.90 4/6371 1054393"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 415.02,
|
||||
"utc": "2026-10-23T07:45:50Z",
|
||||
"load": "2.44 3.23 2.89 2/6391 1057424"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 420.02,
|
||||
"utc": "2026-10-23T07:45:55Z",
|
||||
"load": "2.40 3.21 2.88 2/6381 1059953"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 425.02,
|
||||
"utc": "2026-10-23T07:46:00Z",
|
||||
"load": "2.53 3.22 2.89 6/6361 1062385"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 430.021,
|
||||
"utc": "2026-10-23T07:46:05Z",
|
||||
"load": "2.49 3.20 2.88 5/6347 1064852"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 435.021,
|
||||
"utc": "2026-10-23T07:46:10Z",
|
||||
"load": "2.37 3.16 2.87 4/6362 1067362"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 440.021,
|
||||
"utc": "2026-10-23T07:46:15Z",
|
||||
"load": "2.26 3.13 2.86 2/6373 1069948"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 445.021,
|
||||
"utc": "2026-10-23T07:46:20Z",
|
||||
"load": "2.16 3.09 2.85 2/6397 1072349"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 450.022,
|
||||
"utc": "2026-10-23T07:46:25Z",
|
||||
"load": "2.22 3.09 2.85 3/6359 1075002"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 455.022,
|
||||
"utc": "2026-10-23T07:46:30Z",
|
||||
"load": "2.21 3.07 2.85 2/6341 1077533"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 460.022,
|
||||
"utc": "2026-10-23T07:46:35Z",
|
||||
"load": "2.19 3.05 2.85 2/6351 1080042"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 465.022,
|
||||
"utc": "2026-10-23T07:46:40Z",
|
||||
"load": "2.26 3.05 2.85 2/6353 1084865"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 470.022,
|
||||
"utc": "2026-10-23T07:46:45Z",
|
||||
"load": "2.23 3.03 2.84 2/6375 1087473"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 475.023,
|
||||
"utc": "2026-10-23T07:46:50Z",
|
||||
"load": "2.30 3.03 2.84 5/6406 1090849"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 480.023,
|
||||
"utc": "2026-10-23T07:46:55Z",
|
||||
"load": "3.07 3.18 2.89 2/6380 1094664"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 485.023,
|
||||
"utc": "2026-10-23T07:47:00Z",
|
||||
"load": "3.07 3.18 2.89 4/6352 1098090"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 490.023,
|
||||
"utc": "2026-10-23T07:47:05Z",
|
||||
"load": "3.06 3.17 2.89 7/6377 1101587"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 495.024,
|
||||
"utc": "2026-10-23T07:47:10Z",
|
||||
"load": "3.06 3.17 2.89 6/6350 1104939"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 500.024,
|
||||
"utc": "2026-10-23T07:47:15Z",
|
||||
"load": "2.97 3.15 2.89 4/6368 1107224"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 505.024,
|
||||
"utc": "2026-10-23T07:47:20Z",
|
||||
"load": "2.89 3.13 2.88 2/6386 1109380"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 510.024,
|
||||
"utc": "2026-10-23T07:47:25Z",
|
||||
"load": "3.22 3.20 2.91 1/6387 1110174"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 515.024,
|
||||
"utc": "2026-10-23T07:47:30Z",
|
||||
"load": "3.12 3.18 2.90 4/6370 1111210"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 520.025,
|
||||
"utc": "2026-10-23T07:47:35Z",
|
||||
"load": "2.95 3.14 2.89 3/6330 1112228"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 525.025,
|
||||
"utc": "2026-10-23T07:47:40Z",
|
||||
"load": "2.72 3.09 2.88 1/6328 1112851"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 530.025,
|
||||
"utc": "2026-10-23T07:47:45Z",
|
||||
"load": "2.58 3.05 2.87 1/6357 1113559"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 535.025,
|
||||
"utc": "2026-10-23T07:47:50Z",
|
||||
"load": "2.45 3.02 2.86 1/6366 1114165"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 540.026,
|
||||
"utc": "2026-10-23T07:47:55Z",
|
||||
"load": "2.26 2.97 2.84 1/6356 1114925"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 545.026,
|
||||
"utc": "2026-10-23T07:48:00Z",
|
||||
"load": "2.16 2.94 2.83 3/6326 1115379"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 550.026,
|
||||
"utc": "2026-10-23T07:48:05Z",
|
||||
"load": "1.98 2.89 2.81 1/6330 1115933"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 555.026,
|
||||
"utc": "2026-10-23T07:48:10Z",
|
||||
"load": "1.90 2.86 2.80 5/6348 1117979"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 560.026,
|
||||
"utc": "2026-10-23T07:48:15Z",
|
||||
"load": "1.75 2.81 2.79 5/6352 1119958"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 565.027,
|
||||
"utc": "2026-10-23T07:48:20Z",
|
||||
"load": "1.69 2.78 2.78 3/6395 1121255"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 570.027,
|
||||
"utc": "2026-10-23T07:48:25Z",
|
||||
"load": "1.63 2.75 2.77 2/6344 1122878"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 575.027,
|
||||
"utc": "2026-10-23T07:48:30Z",
|
||||
"load": "1.58 2.72 2.76 2/6330 1125425"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 580.027,
|
||||
"utc": "2026-10-23T07:48:35Z",
|
||||
"load": "1.54 2.69 2.75 3/6307 1128035"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 585.028,
|
||||
"utc": "2026-10-23T07:48:40Z",
|
||||
"load": "1.81 2.73 2.76 3/6395 1131079"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 590.028,
|
||||
"utc": "2026-10-23T07:48:45Z",
|
||||
"load": "1.75 2.70 2.75 2/6324 1133629"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 595.028,
|
||||
"utc": "2026-10-23T07:48:50Z",
|
||||
"load": "1.77 2.69 2.75 2/6354 1135983"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 600.028,
|
||||
"utc": "2026-10-23T07:48:55Z",
|
||||
"load": "1.71 2.66 2.74 2/6317 1138250"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 605.029,
|
||||
"utc": "2026-10-23T07:49:00Z",
|
||||
"load": "1.65 2.63 2.73 2/6307 1140569"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 610.029,
|
||||
"utc": "2026-10-23T07:49:05Z",
|
||||
"load": "1.68 2.62 2.72 2/5871 1142432"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 615.029,
|
||||
"utc": "2026-10-23T07:49:10Z",
|
||||
"load": "1.70 2.61 2.72 2/5858 1144385"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 620.029,
|
||||
"utc": "2026-10-23T07:49:15Z",
|
||||
"load": "1.57 2.57 2.71 1/5860 1145308"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 625.03,
|
||||
"utc": "2026-10-23T07:49:20Z",
|
||||
"load": "1.60 2.56 2.70 2/5872 1147140"
|
||||
},
|
||||
{
|
||||
"wall_seconds": 630.03,
|
||||
"utc": "2026-10-23T07:49:25Z",
|
||||
"load": "1.55 2.53 2.69 2/5844 1149434"
|
||||
}
|
||||
]
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -1,909 +0,0 @@
|
||||
{
|
||||
"grant": "sage-3268",
|
||||
"m4_ruling": "sage-3273 / mos-1426",
|
||||
"head": "ffa93b054f28852a75017928d8478bdf9046e717",
|
||||
"manifest": "277ace0b4274970d5bd4c05cf8fe99aa1e7ebc469a719e4cefcb334a75d3865d",
|
||||
"status": "GREEN",
|
||||
"cli_file_list": [
|
||||
"packages/cli/tests/access-boot.test.mjs",
|
||||
"packages/cli/tests/access.test.mjs",
|
||||
"packages/cli/tests/app.test.mjs",
|
||||
"packages/cli/tests/boot-status.test.mjs",
|
||||
"packages/cli/tests/case1-accept.test.mjs",
|
||||
"packages/cli/tests/case1-hostcheck.test.mjs",
|
||||
"packages/cli/tests/case2-persona-import.test.mjs",
|
||||
"packages/cli/tests/case2-unit.test.mjs",
|
||||
"packages/cli/tests/channel-cli.test.mjs",
|
||||
"packages/cli/tests/channel-recovery.test.mjs",
|
||||
"packages/cli/tests/cli.test.mjs",
|
||||
"packages/cli/tests/compactions-launch.test.mjs",
|
||||
"packages/cli/tests/config.test.mjs",
|
||||
"packages/cli/tests/credentials.test.mjs",
|
||||
"packages/cli/tests/follow.test.mjs",
|
||||
"packages/cli/tests/format.test.mjs",
|
||||
"packages/cli/tests/gate-lane-auth.test.mjs",
|
||||
"packages/cli/tests/gate-lane-fixtures.test.mjs",
|
||||
"packages/cli/tests/gate-lane-image.test.mjs",
|
||||
"packages/cli/tests/gate-lane-state.test.mjs",
|
||||
"packages/cli/tests/gate-lane.test.mjs",
|
||||
"packages/cli/tests/git-socket.test.mjs",
|
||||
"packages/cli/tests/grants.test.mjs",
|
||||
"packages/cli/tests/host.test.mjs",
|
||||
"packages/cli/tests/hosts.test.mjs",
|
||||
"packages/cli/tests/instances.test.mjs",
|
||||
"packages/cli/tests/launch-account.test.mjs",
|
||||
"packages/cli/tests/launch-limit-checks.test.mjs",
|
||||
"packages/cli/tests/launch-limits.test.mjs",
|
||||
"packages/cli/tests/launch-routes.test.mjs",
|
||||
"packages/cli/tests/launcher.test.mjs",
|
||||
"packages/cli/tests/lifecycle.test.mjs",
|
||||
"packages/cli/tests/limits-tokens.test.mjs",
|
||||
"packages/cli/tests/limits.test.mjs",
|
||||
"packages/cli/tests/mark-read.test.mjs",
|
||||
"packages/cli/tests/names.test.mjs",
|
||||
"packages/cli/tests/notifier.test.mjs",
|
||||
"packages/cli/tests/other-tree.test.mjs",
|
||||
"packages/cli/tests/processing-cli.test.mjs",
|
||||
"packages/cli/tests/project-name-repo.test.mjs",
|
||||
"packages/cli/tests/project.test.mjs",
|
||||
"packages/cli/tests/publish-socket.test.mjs",
|
||||
"packages/cli/tests/session-clear.test.mjs",
|
||||
"packages/cli/tests/session-launch.test.mjs",
|
||||
"packages/cli/tests/stack-copy.test.mjs",
|
||||
"packages/cli/tests/stack-instances.test.mjs",
|
||||
"packages/cli/tests/stack-release-external.test.mjs",
|
||||
"packages/cli/tests/stack-release.test.mjs",
|
||||
"packages/cli/tests/stack-upgrade.test.mjs",
|
||||
"packages/cli/tests/tester-http.test.mjs",
|
||||
"packages/cli/tests/tester-reads.test.mjs",
|
||||
"packages/cli/tests/tester-threads.test.mjs",
|
||||
"packages/cli/tests/tester.test.mjs",
|
||||
"packages/cli/tests/thread-cli.test.mjs",
|
||||
"packages/cli/tests/thread-launch.test.mjs",
|
||||
"packages/cli/tests/trackers-boot.test.mjs",
|
||||
"packages/cli/tests/transport.test.mjs",
|
||||
"packages/cli/tests/usage.test.mjs",
|
||||
"packages/cli/tests/verbs.test.mjs"
|
||||
],
|
||||
"cli_file_count": 59,
|
||||
"stages": [
|
||||
{
|
||||
"label": "syntax-1",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"node",
|
||||
"--check",
|
||||
"packages/cli/tests/case-p10-timing-fixture.mjs"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/g6MkUyY",
|
||||
"started_utc": "2026-10-23T07:26:54Z",
|
||||
"start_load": "1.05 1.69 2.00 5/6642 199026",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/syntax-1.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 0.032,
|
||||
"finished_utc": "2026-10-23T07:26:54Z",
|
||||
"end_load": "1.05 1.69 2.00 3/6641 199047",
|
||||
"counts": {},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "syntax-2",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"node",
|
||||
"--check",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gbr1O5v",
|
||||
"started_utc": "2026-10-23T07:26:55Z",
|
||||
"start_load": "1.05 1.69 2.00 2/6651 202505",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/syntax-2.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 0.032,
|
||||
"finished_utc": "2026-10-23T07:26:55Z",
|
||||
"end_load": "1.05 1.69 2.00 1/6651 202515",
|
||||
"counts": {},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "case1-whole-1",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/geSGqXZ",
|
||||
"started_utc": "2026-10-23T07:26:57Z",
|
||||
"start_load": "1.05 1.69 2.00 1/6640 205920",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/case1-whole-1.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 239.134,
|
||||
"finished_utc": "2026-10-23T07:30:56Z",
|
||||
"end_load": "3.41 2.47 2.22 1/6690 353962",
|
||||
"counts": {
|
||||
"tests": 53,
|
||||
"pass": 53,
|
||||
"fail": 0,
|
||||
"cancelled": 0,
|
||||
"skipped": 0,
|
||||
"todo": 0
|
||||
},
|
||||
"metrics": [
|
||||
{
|
||||
"fault": "inner",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 1.8914214159999974,
|
||||
"faultSeconds": 3.974223306999993,
|
||||
"probeSeconds": 2.25
|
||||
},
|
||||
{
|
||||
"fault": "inner",
|
||||
"mode": "hop",
|
||||
"baselineSeconds": 1.8980776110000006,
|
||||
"faultSeconds": 4.004310756999999,
|
||||
"probeSeconds": 2.27
|
||||
},
|
||||
{
|
||||
"fault": "outer",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 1.8725320299999875,
|
||||
"faultSeconds": 5.715126132999998,
|
||||
"probeSeconds": 4
|
||||
},
|
||||
{
|
||||
"fault": "outer",
|
||||
"mode": "hop",
|
||||
"baselineSeconds": 1.8715896639999992,
|
||||
"faultSeconds": 5.726812752999991,
|
||||
"probeSeconds": 4
|
||||
}
|
||||
],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "case1-whole-2",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gd0qwWL",
|
||||
"started_utc": "2026-10-23T07:30:57Z",
|
||||
"start_load": "3.41 2.47 2.22 4/6666 357541",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/case1-whole-2.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 240.044,
|
||||
"finished_utc": "2026-10-23T07:34:57Z",
|
||||
"end_load": "2.00 2.32 2.22 1/6458 505199",
|
||||
"counts": {
|
||||
"tests": 53,
|
||||
"pass": 53,
|
||||
"fail": 0,
|
||||
"cancelled": 0,
|
||||
"skipped": 0,
|
||||
"todo": 0
|
||||
},
|
||||
"metrics": [
|
||||
{
|
||||
"fault": "inner",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 1.9894229939999932,
|
||||
"faultSeconds": 4.213512103000001,
|
||||
"probeSeconds": 2.29
|
||||
},
|
||||
{
|
||||
"fault": "inner",
|
||||
"mode": "hop",
|
||||
"baselineSeconds": 2.056171266999998,
|
||||
"faultSeconds": 4.169351735999997,
|
||||
"probeSeconds": 2.28
|
||||
},
|
||||
{
|
||||
"fault": "outer",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 1.9589971570000053,
|
||||
"faultSeconds": 5.726783651999998,
|
||||
"probeSeconds": 4
|
||||
},
|
||||
{
|
||||
"fault": "outer",
|
||||
"mode": "hop",
|
||||
"baselineSeconds": 1.879084925999996,
|
||||
"faultSeconds": 5.732443853999998,
|
||||
"probeSeconds": 4.01
|
||||
}
|
||||
],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "case1-whole-3",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gdjuph7",
|
||||
"started_utc": "2026-10-23T07:34:59Z",
|
||||
"start_load": "2.08 2.33 2.22 4/6464 509071",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/case1-whole-3.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 235.011,
|
||||
"finished_utc": "2026-10-23T07:38:54Z",
|
||||
"end_load": "1.91 2.18 2.19 2/6403 652743",
|
||||
"counts": {
|
||||
"tests": 53,
|
||||
"pass": 53,
|
||||
"fail": 0,
|
||||
"cancelled": 0,
|
||||
"skipped": 0,
|
||||
"todo": 0
|
||||
},
|
||||
"metrics": [
|
||||
{
|
||||
"fault": "inner",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 1.8627637730000133,
|
||||
"faultSeconds": 3.9948855329999935,
|
||||
"probeSeconds": 2.25
|
||||
},
|
||||
{
|
||||
"fault": "inner",
|
||||
"mode": "hop",
|
||||
"baselineSeconds": 1.8459824050000024,
|
||||
"faultSeconds": 3.963717149000004,
|
||||
"probeSeconds": 2.26
|
||||
},
|
||||
{
|
||||
"fault": "outer",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 1.8736066859999991,
|
||||
"faultSeconds": 5.7249899409999925,
|
||||
"probeSeconds": 4
|
||||
},
|
||||
{
|
||||
"fault": "outer",
|
||||
"mode": "hop",
|
||||
"baselineSeconds": 1.8894593350000068,
|
||||
"faultSeconds": 5.709737833999999,
|
||||
"probeSeconds": 4
|
||||
}
|
||||
],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "cli-whole",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"5400",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"packages/cli/tests/access-boot.test.mjs",
|
||||
"packages/cli/tests/access.test.mjs",
|
||||
"packages/cli/tests/app.test.mjs",
|
||||
"packages/cli/tests/boot-status.test.mjs",
|
||||
"packages/cli/tests/case1-accept.test.mjs",
|
||||
"packages/cli/tests/case1-hostcheck.test.mjs",
|
||||
"packages/cli/tests/case2-persona-import.test.mjs",
|
||||
"packages/cli/tests/case2-unit.test.mjs",
|
||||
"packages/cli/tests/channel-cli.test.mjs",
|
||||
"packages/cli/tests/channel-recovery.test.mjs",
|
||||
"packages/cli/tests/cli.test.mjs",
|
||||
"packages/cli/tests/compactions-launch.test.mjs",
|
||||
"packages/cli/tests/config.test.mjs",
|
||||
"packages/cli/tests/credentials.test.mjs",
|
||||
"packages/cli/tests/follow.test.mjs",
|
||||
"packages/cli/tests/format.test.mjs",
|
||||
"packages/cli/tests/gate-lane-auth.test.mjs",
|
||||
"packages/cli/tests/gate-lane-fixtures.test.mjs",
|
||||
"packages/cli/tests/gate-lane-image.test.mjs",
|
||||
"packages/cli/tests/gate-lane-state.test.mjs",
|
||||
"packages/cli/tests/gate-lane.test.mjs",
|
||||
"packages/cli/tests/git-socket.test.mjs",
|
||||
"packages/cli/tests/grants.test.mjs",
|
||||
"packages/cli/tests/host.test.mjs",
|
||||
"packages/cli/tests/hosts.test.mjs",
|
||||
"packages/cli/tests/instances.test.mjs",
|
||||
"packages/cli/tests/launch-account.test.mjs",
|
||||
"packages/cli/tests/launch-limit-checks.test.mjs",
|
||||
"packages/cli/tests/launch-limits.test.mjs",
|
||||
"packages/cli/tests/launch-routes.test.mjs",
|
||||
"packages/cli/tests/launcher.test.mjs",
|
||||
"packages/cli/tests/lifecycle.test.mjs",
|
||||
"packages/cli/tests/limits-tokens.test.mjs",
|
||||
"packages/cli/tests/limits.test.mjs",
|
||||
"packages/cli/tests/mark-read.test.mjs",
|
||||
"packages/cli/tests/names.test.mjs",
|
||||
"packages/cli/tests/notifier.test.mjs",
|
||||
"packages/cli/tests/other-tree.test.mjs",
|
||||
"packages/cli/tests/processing-cli.test.mjs",
|
||||
"packages/cli/tests/project-name-repo.test.mjs",
|
||||
"packages/cli/tests/project.test.mjs",
|
||||
"packages/cli/tests/publish-socket.test.mjs",
|
||||
"packages/cli/tests/session-clear.test.mjs",
|
||||
"packages/cli/tests/session-launch.test.mjs",
|
||||
"packages/cli/tests/stack-copy.test.mjs",
|
||||
"packages/cli/tests/stack-instances.test.mjs",
|
||||
"packages/cli/tests/stack-release-external.test.mjs",
|
||||
"packages/cli/tests/stack-release.test.mjs",
|
||||
"packages/cli/tests/stack-upgrade.test.mjs",
|
||||
"packages/cli/tests/tester-http.test.mjs",
|
||||
"packages/cli/tests/tester-reads.test.mjs",
|
||||
"packages/cli/tests/tester-threads.test.mjs",
|
||||
"packages/cli/tests/tester.test.mjs",
|
||||
"packages/cli/tests/thread-cli.test.mjs",
|
||||
"packages/cli/tests/thread-launch.test.mjs",
|
||||
"packages/cli/tests/trackers-boot.test.mjs",
|
||||
"packages/cli/tests/transport.test.mjs",
|
||||
"packages/cli/tests/usage.test.mjs",
|
||||
"packages/cli/tests/verbs.test.mjs"
|
||||
],
|
||||
"limit_seconds": 5400,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gebsaIr",
|
||||
"started_utc": "2026-10-23T07:38:55Z",
|
||||
"start_load": "1.91 2.18 2.19 1/6404 656161",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/cli-whole.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 631.848,
|
||||
"finished_utc": "2026-10-23T07:49:27Z",
|
||||
"end_load": "1.55 2.53 2.69 1/5811 1150227",
|
||||
"counts": {
|
||||
"tests": 917,
|
||||
"pass": 917,
|
||||
"fail": 0,
|
||||
"cancelled": 0,
|
||||
"skipped": 0,
|
||||
"todo": 0
|
||||
},
|
||||
"metrics": [
|
||||
{
|
||||
"fault": "inner",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 2.0945929310000064,
|
||||
"faultSeconds": 4.18209504700001,
|
||||
"probeSeconds": 2.27
|
||||
},
|
||||
{
|
||||
"fault": "inner",
|
||||
"mode": "hop",
|
||||
"baselineSeconds": 1.9464092949999903,
|
||||
"faultSeconds": 4.171354483000003,
|
||||
"probeSeconds": 2.27
|
||||
},
|
||||
{
|
||||
"fault": "outer",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 1.9332695270000113,
|
||||
"faultSeconds": 5.785670190999998,
|
||||
"probeSeconds": 4.01
|
||||
},
|
||||
{
|
||||
"fault": "outer",
|
||||
"mode": "hop",
|
||||
"baselineSeconds": 1.8855918230000097,
|
||||
"faultSeconds": 5.739914212000003,
|
||||
"probeSeconds": 4.01
|
||||
}
|
||||
],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "M1-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"bash",
|
||||
"-n",
|
||||
"scripts/case1-accept.sh"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gh8s2Og",
|
||||
"started_utc": "2026-10-23T07:49:28Z",
|
||||
"start_load": "1.51 2.50 2.68 3/5810 1153451",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M1-syntax.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 0.008,
|
||||
"finished_utc": "2026-10-23T07:49:28Z",
|
||||
"end_load": "1.51 2.50 2.68 1/5810 1153455",
|
||||
"counts": {},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "M1",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row253 C4 P10 inner reason holds under both sudo models$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gxjj9Vd",
|
||||
"started_utc": "2026-10-23T07:49:30Z",
|
||||
"start_load": "1.51 2.50 2.68 1/5816 1156782",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M1.log",
|
||||
"expected_red": true,
|
||||
"rc": 1,
|
||||
"wall_seconds": 4.774,
|
||||
"finished_utc": "2026-10-23T07:49:34Z",
|
||||
"end_load": "1.47 2.48 2.67 2/5828 1159225",
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"cancelled": 0,
|
||||
"skipped": 0,
|
||||
"todo": 0
|
||||
},
|
||||
"metrics": [
|
||||
{
|
||||
"fault": "inner",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 1.764558389,
|
||||
"faultSeconds": 2.8568522200000004,
|
||||
"probeSeconds": 1.23
|
||||
}
|
||||
],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false,
|
||||
"killed": true,
|
||||
"kill_test": "row253 C4 P10 inner reason holds under both sudo models",
|
||||
"mutated_sha256": "83fc6e5d93d9dbe8c40995c4e1445a3b61312df3a988a7ad0f7b63c762d2bf3f"
|
||||
},
|
||||
{
|
||||
"label": "M2-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"bash",
|
||||
"-n",
|
||||
"scripts/case1-accept.sh"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gZ30EQX",
|
||||
"started_utc": "2026-10-23T07:49:36Z",
|
||||
"start_load": "1.47 2.48 2.67 1/5822 1162481",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M2-syntax.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 0.008,
|
||||
"finished_utc": "2026-10-23T07:49:36Z",
|
||||
"end_load": "1.47 2.48 2.67 1/5822 1162485",
|
||||
"counts": {},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "M2",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row253 C4 P10 inner reason holds under both sudo models$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gYr4G6o",
|
||||
"started_utc": "2026-10-23T07:49:37Z",
|
||||
"start_load": "1.47 2.48 2.67 1/5823 1165689",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M2.log",
|
||||
"expected_red": true,
|
||||
"rc": 1,
|
||||
"wall_seconds": 6.768,
|
||||
"finished_utc": "2026-10-23T07:49:44Z",
|
||||
"end_load": "1.40 2.43 2.66 5/5879 1169357",
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"cancelled": 0,
|
||||
"skipped": 0,
|
||||
"todo": 0
|
||||
},
|
||||
"metrics": [
|
||||
{
|
||||
"fault": "inner",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 1.754618234,
|
||||
"faultSeconds": 4.849417662,
|
||||
"probeSeconds": 3.24
|
||||
}
|
||||
],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false,
|
||||
"killed": true,
|
||||
"kill_test": "row253 C4 P10 inner reason holds under both sudo models",
|
||||
"mutated_sha256": "269e550da358457cbc85df637f02c323bfc09c21cedea2bc9f4968bedd5c71a4"
|
||||
},
|
||||
{
|
||||
"label": "M3-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"bash",
|
||||
"-n",
|
||||
"scripts/case1-accept.sh"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gwCkjzX",
|
||||
"started_utc": "2026-10-23T07:49:45Z",
|
||||
"start_load": "1.40 2.43 2.66 2/5844 1172866",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M3-syntax.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 0.008,
|
||||
"finished_utc": "2026-10-23T07:49:45Z",
|
||||
"end_load": "1.40 2.43 2.66 2/5844 1172870",
|
||||
"counts": {},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "M3",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row253 C4 P10 outer reason holds under both sudo models$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/g6TrU8V",
|
||||
"started_utc": "2026-10-23T07:49:46Z",
|
||||
"start_load": "1.40 2.43 2.66 2/5868 1176268",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M3.log",
|
||||
"expected_red": true,
|
||||
"rc": 1,
|
||||
"wall_seconds": 6.618,
|
||||
"finished_utc": "2026-10-23T07:49:53Z",
|
||||
"end_load": "1.41 2.40 2.64 2/5827 1179333",
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"cancelled": 0,
|
||||
"skipped": 0,
|
||||
"todo": 0
|
||||
},
|
||||
"metrics": [
|
||||
{
|
||||
"fault": "outer",
|
||||
"mode": "exec",
|
||||
"baselineSeconds": 1.7982556909999998,
|
||||
"faultSeconds": 4.664919980999999,
|
||||
"probeSeconds": 3.01
|
||||
}
|
||||
],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false,
|
||||
"killed": true,
|
||||
"kill_test": "row253 C4 P10 outer reason holds under both sudo models",
|
||||
"mutated_sha256": "21143aeb637ef864cdcb71086b3149c9817b5af752bc431e963c51a04f01b498"
|
||||
},
|
||||
{
|
||||
"label": "M4-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"bash",
|
||||
"-n",
|
||||
"scripts/case1-accept.sh"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gRPd59t",
|
||||
"started_utc": "2026-10-23T07:49:54Z",
|
||||
"start_load": "1.41 2.40 2.64 3/5836 1182894",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M4-syntax.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 0.008,
|
||||
"finished_utc": "2026-10-23T07:49:54Z",
|
||||
"end_load": "1.41 2.40 2.64 3/5840 1182903",
|
||||
"counts": {},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "M4",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row253 C4 P10 outer reason holds under both sudo models$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gAKhO44",
|
||||
"started_utc": "2026-10-23T07:49:56Z",
|
||||
"start_load": "1.41 2.40 2.64 8/5839 1186447",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M4.log",
|
||||
"expected_red": true,
|
||||
"rc": 1,
|
||||
"wall_seconds": 9.023,
|
||||
"finished_utc": "2026-10-23T07:50:05Z",
|
||||
"end_load": "1.65 2.42 2.65 2/5832 1193403",
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"cancelled": 0,
|
||||
"skipped": 0,
|
||||
"todo": 0
|
||||
},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false,
|
||||
"guard_return_receipt": {
|
||||
"ruling": "sage-3273 / mos-1426",
|
||||
"configured_ms": 7000,
|
||||
"named_command_returned": true,
|
||||
"rc": 1,
|
||||
"wall_seconds": 9.023,
|
||||
"actual_refusal": "probe-inner-command",
|
||||
"external_timeout": false,
|
||||
"evidence": "named outer-reason ERR_ASSERTION in raw log after the unchanged safety guard returns; guard itself has no log channel"
|
||||
},
|
||||
"killed": true,
|
||||
"kill_test": "row253 C4 P10 outer reason holds under both sudo models",
|
||||
"mutated_sha256": "cde2e58596794ff7c185c46979e2f7abcb3032ec6903653b7043fe17ef54baee"
|
||||
},
|
||||
{
|
||||
"label": "M5-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"node",
|
||||
"--check",
|
||||
"packages/cli/tests/case-p10-timing-fixture.mjs"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/g8waDyO",
|
||||
"started_utc": "2026-10-23T07:50:06Z",
|
||||
"start_load": "1.65 2.42 2.65 2/5826 1197030",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M5-syntax.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 0.032,
|
||||
"finished_utc": "2026-10-23T07:50:06Z",
|
||||
"end_load": "1.65 2.42 2.65 2/5838 1197071",
|
||||
"counts": {},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "M5",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row253 C4 P10 inner reason holds under both sudo models$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gdAgQSv",
|
||||
"started_utc": "2026-10-23T07:50:07Z",
|
||||
"start_load": "1.65 2.42 2.65 2/5824 1200489",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M5.log",
|
||||
"expected_red": true,
|
||||
"rc": 1,
|
||||
"wall_seconds": 5.816,
|
||||
"finished_utc": "2026-10-23T07:50:13Z",
|
||||
"end_load": "1.63 2.39 2.63 2/5844 1203280",
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"cancelled": 0,
|
||||
"skipped": 0,
|
||||
"todo": 0
|
||||
},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false,
|
||||
"killed": true,
|
||||
"kill_test": "row253 C4 P10 inner reason holds under both sudo models",
|
||||
"mutated_sha256": "e8a42dc79c14ada3e3339b372af75f2b4688a43ec8748b4cf3acb8bec32a3a23"
|
||||
},
|
||||
{
|
||||
"label": "M6-syntax",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"node",
|
||||
"--check",
|
||||
"packages/cli/tests/case-p10-timing-fixture.mjs"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gD2IEb2",
|
||||
"started_utc": "2026-10-23T07:50:15Z",
|
||||
"start_load": "1.63 2.39 2.63 1/5845 1206646",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M6-syntax.log",
|
||||
"expected_red": false,
|
||||
"rc": 0,
|
||||
"wall_seconds": 0.032,
|
||||
"finished_utc": "2026-10-23T07:50:15Z",
|
||||
"end_load": "1.63 2.39 2.63 2/5845 1206656",
|
||||
"counts": {},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false
|
||||
},
|
||||
{
|
||||
"label": "M6",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"1200",
|
||||
"node",
|
||||
"--test",
|
||||
"--test-reporter=tap",
|
||||
"--test-name-pattern",
|
||||
"^row299 P10 observer records are complete and ordered$",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 1200,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gAZq1pv",
|
||||
"started_utc": "2026-10-23T07:50:16Z",
|
||||
"start_load": "1.63 2.39 2.63 2/5837 1210084",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/M6.log",
|
||||
"expected_red": true,
|
||||
"rc": 1,
|
||||
"wall_seconds": 0.164,
|
||||
"finished_utc": "2026-10-23T07:50:16Z",
|
||||
"end_load": "1.63 2.39 2.63 1/5837 1210101",
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"cancelled": 0,
|
||||
"skipped": 0,
|
||||
"todo": 0
|
||||
},
|
||||
"metrics": [],
|
||||
"skip_lines": [],
|
||||
"external_timeout": false,
|
||||
"killed": true,
|
||||
"kill_test": "row299 P10 observer records are complete and ordered",
|
||||
"mutated_sha256": "a4256c6ffdc55c8047693e80114361d9c9ad97898fe58125299d967f5badf417"
|
||||
}
|
||||
],
|
||||
"restores": [
|
||||
{
|
||||
"id": "M1",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"before_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2",
|
||||
"restored_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2",
|
||||
"git_status": "",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"before_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2",
|
||||
"restored_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2",
|
||||
"git_status": "",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"before_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2",
|
||||
"restored_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2",
|
||||
"git_status": "",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"before_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2",
|
||||
"restored_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2",
|
||||
"git_status": "",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"path": "packages/cli/tests/case-p10-timing-fixture.mjs",
|
||||
"before_sha256": "7ac9d29281d4076bf2e00b7a07294cd4519d7ae9f97c4f6ddc1d22440c9b071a",
|
||||
"restored_sha256": "7ac9d29281d4076bf2e00b7a07294cd4519d7ae9f97c4f6ddc1d22440c9b071a",
|
||||
"git_status": "",
|
||||
"identical": true
|
||||
},
|
||||
{
|
||||
"id": "M6",
|
||||
"path": "packages/cli/tests/case-p10-timing-fixture.mjs",
|
||||
"before_sha256": "7ac9d29281d4076bf2e00b7a07294cd4519d7ae9f97c4f6ddc1d22440c9b071a",
|
||||
"restored_sha256": "7ac9d29281d4076bf2e00b7a07294cd4519d7ae9f97c4f6ddc1d22440c9b071a",
|
||||
"git_status": "",
|
||||
"identical": true
|
||||
}
|
||||
],
|
||||
"started_utc": "2026-10-23T07:26:52Z",
|
||||
"finished_utc": "2026-10-23T07:50:16Z"
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
{
|
||||
"utc": "2026-10-23T07:50:47Z",
|
||||
"count": 0,
|
||||
"matches": [],
|
||||
"scope": "All recorded stage TMPDIRs by cwd or argv, and node/tee/FIFO commands with worktree cwd; controller ancestors excluded",
|
||||
"all_matches_count": 4,
|
||||
"preexisting_harness": [
|
||||
{
|
||||
"pid": 14082,
|
||||
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
|
||||
"cmd": "/usr/bin/node /mnt/storage/src/t3-comms/t3-code-agent-mcp/dist/cli.js ",
|
||||
"started_utc": "2026-10-23T07:10:47.750000+00:00",
|
||||
"predates_gate": true
|
||||
},
|
||||
{
|
||||
"pid": 14243,
|
||||
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
|
||||
"cmd": "node /home/jwoltje/.npm/_npx/de2bd410102f5eda/node_modules/.bin/mcp-server-sequential-thinking ",
|
||||
"started_utc": "2026-10-23T07:10:48.770000+00:00",
|
||||
"predates_gate": true
|
||||
},
|
||||
{
|
||||
"pid": 14282,
|
||||
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
|
||||
"cmd": "/usr/bin/node /home/jwoltje/.npm/_npx/15c61037b1978c83/node_modules/chrome-devtools-mcp/build/src/telemetry/watchdog/main.js --parent-pid=14259 --app-version=1.12.0 --os-type=3 ",
|
||||
"started_utc": "2026-10-23T07:10:49.120000+00:00",
|
||||
"predates_gate": true
|
||||
},
|
||||
{
|
||||
"pid": 14383,
|
||||
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
|
||||
"cmd": "node /home/jwoltje/.npm/_npx/9833c18b2d85bc59/node_modules/.bin/playwright-mcp ",
|
||||
"started_utc": "2026-10-23T07:10:49.540000+00:00",
|
||||
"predates_gate": true
|
||||
}
|
||||
],
|
||||
"classification": "Four MCP harness processes predate the gate; zero gate-created residuals. No processes killed."
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"label": "syntax-1",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"node",
|
||||
"--check",
|
||||
"packages/cli/tests/case-p10-timing-fixture.mjs"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/g6MkUyY",
|
||||
"started_utc": "2026-10-23T07:26:54Z",
|
||||
"start_load": "1.05 1.69 2.00 5/6642 199026",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/syntax-1.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:26:54Z",
|
||||
"load": "1.05 1.69 2.00 7/6643 199027"
|
||||
}
|
||||
]
|
||||
Whitespace-only changes.
@@ -1 +0,0 @@
|
||||
CLEAR
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"label": "syntax-2",
|
||||
"argv": [
|
||||
"timeout",
|
||||
"-k",
|
||||
"10",
|
||||
"120",
|
||||
"node",
|
||||
"--check",
|
||||
"packages/cli/tests/case1-accept.test.mjs"
|
||||
],
|
||||
"limit_seconds": 120,
|
||||
"tmpdir": "/mnt/storage/scratch/tmp/gbr1O5v",
|
||||
"started_utc": "2026-10-23T07:26:55Z",
|
||||
"start_load": "1.05 1.69 2.00 2/6651 202505",
|
||||
"log": "/mnt/storage/scratch/tmp/gABO62Q/records/syntax-2.log",
|
||||
"expected_red": false
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
[
|
||||
{
|
||||
"wall_seconds": 0.0,
|
||||
"utc": "2026-10-23T07:26:55Z",
|
||||
"load": "1.05 1.69 2.00 4/6652 202506"
|
||||
}
|
||||
]
|
||||
Whitespace-only changes.
@@ -1,104 +0,0 @@
|
||||
import os,sys,json,time,re,pathlib,subprocess,shlex,hashlib,signal
|
||||
REPO=pathlib.Path('/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196')
|
||||
ROOT=pathlib.Path(__file__).parent; OUT=ROOT/'records'; OUT.mkdir(exist_ok=True)
|
||||
CASE='packages/cli/tests/case1-accept.test.mjs'
|
||||
HELPER='packages/cli/tests/case-p10-timing-fixture.mjs'
|
||||
HEAD='ffa93b054f28852a75017928d8478bdf9046e717'
|
||||
DIGEST='277ace0b4274970d5bd4c05cf8fe99aa1e7ebc469a719e4cefcb334a75d3865d'
|
||||
FILES=sorted(str(p.relative_to(REPO)) for p in (REPO/'packages/cli/tests').glob('*.test.mjs'))
|
||||
PLAN=json.loads((REPO/'agents/gander/work/queue-299/MUTANT-PLAN.json').read_text())['mutants']
|
||||
STATE={'grant':'sage-3268','m4_ruling':'sage-3273 / mos-1426','head':HEAD,'manifest':DIGEST,'status':'PREPARED','cli_file_list':FILES,'cli_file_count':len(FILES),'stages':[],'restores':[]}
|
||||
def utc():return time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime())
|
||||
def git(*args):return subprocess.check_output(['git',*args],cwd=REPO,text=True).strip()
|
||||
def save(): (OUT/'results.json').write_text(json.dumps(STATE,indent=2)+'\n')
|
||||
def stop(reason):
|
||||
STATE['status']='STOP';STATE['reason']=reason;STATE['stopped_utc']=utc();save();print('STOP '+reason,flush=True);raise SystemExit(1)
|
||||
def load(): return pathlib.Path('/proc/loadavg').read_text().strip()
|
||||
def busy(label):
|
||||
r=subprocess.run(['bash','/mnt/storage/scratch/sage-busy-now.sh'],capture_output=True,text=True)
|
||||
(OUT/(label+'.busy.log')).write_text(r.stdout+r.stderr)
|
||||
if r.returncode or r.stdout.strip().splitlines()[-1:]!=['CLEAR']:stop('busy refusal before '+label)
|
||||
def parse_metrics(text):
|
||||
result=[]
|
||||
for line in text.splitlines():
|
||||
m=re.match(r'^\s*#\s*(\{.*\})\s*$',line)
|
||||
if m:
|
||||
try:
|
||||
item=json.loads(m[1])
|
||||
if 'probeSeconds' in item:result.append(item)
|
||||
except json.JSONDecodeError:pass
|
||||
return result
|
||||
def execute(label,args,limit,expected_red=False,syntax=False):
|
||||
busy(label)
|
||||
tmp=subprocess.check_output(['mktemp','-d','/mnt/storage/scratch/tmp/gXXXXXX'],text=True).strip()
|
||||
env=os.environ.copy();env['TMPDIR']=tmp
|
||||
argv=['timeout','-k','10',str(limit),*args]
|
||||
meta={'label':label,'argv':argv,'limit_seconds':limit,'tmpdir':tmp,'started_utc':utc(),'start_load':load(),'log':str(OUT/(label+'.log')),'expected_red':expected_red}
|
||||
(OUT/(label+'.command.json')).write_text(json.dumps(meta,indent=2)+'\n')
|
||||
STATE['active']=meta;save();print('START '+json.dumps(meta),flush=True)
|
||||
shell='set -o pipefail\n'+shlex.join(argv)+' 2>&1 | tee '+shlex.quote(meta['log'])
|
||||
start=time.monotonic();samples=[];p=subprocess.Popen(['bash','-c',shell],cwd=REPO,env=env,start_new_session=True)
|
||||
while True:
|
||||
samples.append({'wall_seconds':round(time.monotonic()-start,3),'utc':utc(),'load':load()})
|
||||
try:rc=p.wait(timeout=5);break
|
||||
except subprocess.TimeoutExpired:
|
||||
if time.monotonic()-start>limit+30:
|
||||
os.killpg(p.pid,signal.SIGKILL);p.wait();stop('outer controller timeout '+label)
|
||||
text=pathlib.Path(meta['log']).read_text();seconds=round(time.monotonic()-start,3)
|
||||
counts={}
|
||||
for key in ['tests','pass','fail','cancelled','skipped','todo']:
|
||||
matches=re.findall(r'^# '+key+r' (\d+)\s*$',text,re.M)
|
||||
if matches:counts[key]=int(matches[-1])
|
||||
row={**meta,'rc':rc,'wall_seconds':seconds,'finished_utc':utc(),'end_load':load(),'counts':counts,'metrics':parse_metrics(text),'skip_lines':[s for s in text.splitlines() if '# SKIP' in s],'external_timeout':rc in (124,137)}
|
||||
(OUT/(label+'.load.json')).write_text(json.dumps(samples,indent=2)+'\n')
|
||||
STATE['stages'].append(row);STATE.pop('active',None);save();print('END '+json.dumps(row),flush=True)
|
||||
if row['external_timeout']:stop('timeout '+label)
|
||||
if not expected_red and rc!=0:stop('unexpected red '+label)
|
||||
if not expected_red and not syntax:
|
||||
if len(row['metrics'])!=4:stop('missing direct P10 diagnostics '+label)
|
||||
for m in row['metrics']:
|
||||
lo,hi=(1.25,2.75) if m['fault']=='inner' else (3.25,4.75)
|
||||
if not lo<=m['probeSeconds']<hi:stop('band overshoot '+label)
|
||||
return row,text
|
||||
save()
|
||||
if len(sys.argv)<2 or sys.argv[1]!='run':sys.exit(0)
|
||||
if git('rev-parse','HEAD')!=HEAD or git('status','--porcelain'):stop('candidate/tree mismatch')
|
||||
manifest=(REPO/'agents/gander/work/queue-299/MANIFEST.sha256').read_bytes()
|
||||
if hashlib.sha256(manifest).hexdigest()!=DIGEST:stop('manifest mismatch')
|
||||
for m in PLAN:
|
||||
data=(REPO/m['path']).read_text()
|
||||
if hashlib.sha256(data.encode()).hexdigest()!=m['source_sha256']:stop('source sha mismatch '+m['id'])
|
||||
if m.get('scope_begin'):data=data[data.index(m['scope_begin']):data.index(m['scope_end'])]
|
||||
if data.count(m['old'])!=1:stop('nonunique target '+m['id'])
|
||||
STATE['status']='RUNNING';STATE['started_utc']=utc();save()
|
||||
print('PREAMBLE '+json.dumps({'head':HEAD,'manifest':DIGEST,'source':'e6751ecab','case_limit':1200,'cli_limit':5400,'cli_file_count':len(FILES),'cli_files':FILES,'ambient_load_is_target_only':True}),flush=True)
|
||||
for i,path in enumerate([HELPER,CASE]):execute('syntax-'+str(i+1),['node','--check',path],120,syntax=True)
|
||||
for i in range(1,4):execute('case1-whole-'+str(i),['node','--test','--test-reporter=tap',CASE],1200)
|
||||
execute('cli-whole',['node','--test','--test-reporter=tap',*FILES],5400)
|
||||
for m in PLAN:
|
||||
original=(REPO/m['path']).read_bytes(); before=hashlib.sha256(original).hexdigest();text=original.decode()
|
||||
if m.get('scope_begin'):
|
||||
start=text.index(m['scope_begin']);end=text.index(m['scope_end']);part=text[start:end];changed=text[:start]+part.replace(m['old'],m['new'],1)+text[end:]
|
||||
else:changed=text.replace(m['old'],m['new'],1)
|
||||
row=None;output=''
|
||||
try:
|
||||
(REPO/m['path']).write_text(changed)
|
||||
ext=m['path'].rsplit('.',1)[-1];syntax=['bash','-n',m['path']] if ext=='sh' else ['node','--check',m['path']]
|
||||
execute(m['id']+'-syntax',syntax,120,syntax=True)
|
||||
row,output=execute(m['id'],['node','--test','--test-reporter=tap','--test-name-pattern','^'+m['killer']+'$',CASE],1200,expected_red=True)
|
||||
finally:
|
||||
(REPO/m['path']).write_bytes(original)
|
||||
restored=hashlib.sha256((REPO/m['path']).read_bytes()).hexdigest();status=git('status','--porcelain')
|
||||
STATE['restores'].append({'id':m['id'],'path':m['path'],'before_sha256':before,'restored_sha256':restored,'git_status':status,'identical':before==restored});save()
|
||||
if before!=restored or status:stop('restore drift '+m['id'])
|
||||
if row is None:stop('no result '+m['id'])
|
||||
if row['rc']==0:stop('survivor '+m['id'])
|
||||
named=bool(re.search(r'^not ok \d+ - '+re.escape(m['killer'])+r'\s*$',output,re.M))
|
||||
assertion='ERR_ASSERTION' in output
|
||||
if not named or not assertion:stop('wrong failure '+m['id'])
|
||||
if m['id'] in ['M1','M2','M3'] and not ('direct probe ' in output and row['metrics']):stop('wrong timing kill '+m['id'])
|
||||
if m['id']=='M4':
|
||||
if 'probe-outer-timeout' not in output or 'probe-inner-command' not in output:stop('wrong outer-reason failure M4')
|
||||
row['guard_return_receipt']={'ruling':'sage-3273 / mos-1426','configured_ms':7000,'named_command_returned':True,'rc':row['rc'],'wall_seconds':row['wall_seconds'],'actual_refusal':'probe-inner-command','external_timeout':False,'evidence':'named outer-reason ERR_ASSERTION in raw log after the unchanged safety guard returns; guard itself has no log channel'}
|
||||
row['killed']=True;row['kill_test']=m['killer'];row['mutated_sha256']=hashlib.sha256(changed.encode()).hexdigest();save()
|
||||
STATE['status']='GREEN';STATE['finished_utc']=utc();save();print('GREEN all whole stages and M1-M6',flush=True)
|
||||
@@ -1,82 +0,0 @@
|
||||
# Row 305 (#1812, Vikunja 591): shell suites remove the compose network they create
|
||||
|
||||
Owner Gizmoduck. Reviewer Filbert. Gate owner Sage. Brief:
|
||||
docs/plans/2026-10-23_gate-env-rows.md, "Brief: shell suites remove the compose network they create
|
||||
(Vikunja 591)", at c16e943b9. Base c16e943b9. Mos approved the change in mos-1442 point 2. Mos approved
|
||||
the two new checks in mos-1445 under mos-1272, adding the presence half.
|
||||
|
||||
## The leak, as the code has it at c16e943b9
|
||||
|
||||
- `packages/processing-control/src/containers.mjs:16-19`. `containerArgs` builds
|
||||
`docker compose run --rm ...`. `--rm` removes the container. The project's `<project>_default`
|
||||
network stays.
|
||||
- `compose.yaml` has no top-level `name:`, so compose names the project after the checkout
|
||||
directory. Every gate worktree left one network. By 10-23 they had used up Docker's address pools.
|
||||
|
||||
## Does COMPOSE_PROJECT_NAME reach compose? Yes, on every path the two suites take
|
||||
|
||||
- Task path. `scripts/run-task.sh:29` execs `node scripts/mosaic-task.mjs`. Nothing scrubs the env
|
||||
before that: `scripts/common.sh` has no `env -i`, no `unset` and no COMPOSE. `mosaic-task.mjs:326`
|
||||
sets `spawnEnv = { ...process.env }`, `:405` passes `env: spawnEnv` to `runContainer`, and
|
||||
`containers.mjs:25` passes those options to `spawnSync('docker', ...)`.
|
||||
- test-release. `release.sh activate` calls `health_check`, and `health_check` calls `run-task.sh`
|
||||
at `:54`, which is the task path above. `env MOSAIC_MOCK_RESPONSE=...` adds to the env and keeps
|
||||
the rest. The suite calls only `status`, `activate` and `rollback`, so `release.sh:122`
|
||||
`compose build` is off its path.
|
||||
- test-task seat cases (`:240`, `:315-351`). `agent.sh:209` execs
|
||||
`packages/processing-control/src/container-cli.mjs`, and `container-cli.mjs:16` calls
|
||||
`runContainer` with `env: process.env`.
|
||||
- `build.sh:13`, `release.sh:122` and `verify.sh:40` also run compose. Neither suite calls them.
|
||||
|
||||
## Change (scripts/test-release.sh, scripts/test-task.sh only)
|
||||
|
||||
- After `SANDBOX="$(mktemp -d)"`, export
|
||||
`COMPOSE_PROJECT_NAME=mosaic-test-<release|task>-<id>`. `<id>` is the sandbox name after its last
|
||||
dot, lowercased, alphanumeric only.
|
||||
- `remove_compose_network` runs `docker network rm "${COMPOSE_PROJECT_NAME}_default"`:
|
||||
- If there's no docker binary, it returns 0.
|
||||
- If the error says `not found` or `No such network`, it returns 0.
|
||||
- On any other failure it prints one stderr line naming the network, then returns 0. That
|
||||
includes a daemon that is down. Sage kept that line in sage-3367 (a).
|
||||
- Each existing EXIT trap keeps everything it did and gains `; remove_compose_network` at the end.
|
||||
The trap's own exit status doesn't change the script's.
|
||||
- One new check per suite, just before the summary. That is after the last Docker step whether or
|
||||
not the live cases ran. Both halves sit inside a `docker info` branch:
|
||||
- the network is present under the run's project name before the explicit
|
||||
`remove_compose_network` (this proves the export reached compose);
|
||||
- after the remove, it is absent.
|
||||
|
||||
A failing `docker network ls` fails the check. Without the daemon, the check prints a skip line.
|
||||
- No `docker compose down`, and no other network is touched. No product file changes.
|
||||
|
||||
Commits: 541dee2b7 (draft), 3bce852d5 (presence half, mos-1445).
|
||||
|
||||
## Gate (Sage's slot, in a gap)
|
||||
|
||||
- Before the first run, run `docker network rm` on a name that was never created and record the
|
||||
daemon's exact wording (sage-3367 b). If the wording matches neither pattern, stop and report to
|
||||
Sage.
|
||||
- Each suite runs whole from a gate worktree, under `timeout -k 10 900`. That is far more than
|
||||
3x the row 302 gate's walls: test-release 3 s, test-task 16 s (mos-1275).
|
||||
- TMPDIR comes from `mktemp -d /mnt/storage/scratch/tmp/gXXX`.
|
||||
- Before and after each run, record `docker network ls` filtered to `mosaic-test-`. The run's
|
||||
network must be absent after.
|
||||
- Grep `^skip` and name every skip.
|
||||
- A run killed by the timeout's SIGKILL skips the EXIT trap and leaks its one network. The name is
|
||||
per-run under `mosaic-test-`, so the gate's after-listing finds it and removes it by its exact name
|
||||
(Filbert N1; no code change).
|
||||
- If `docker info` works but there is no network to find, that's a first-run red. It goes to Sage
|
||||
for Mos, unfixed (mos-1445).
|
||||
|
||||
## Mutants (mos-1445)
|
||||
|
||||
- (a) Drop the export. The new check must go red, because compose uses the directory's project and
|
||||
nothing exists under the run's name.
|
||||
- (b) Make the function's `docker network rm` a no-op. The new check must go red, because the
|
||||
network is still present after the remove.
|
||||
- (c) Drop `remove_compose_network` from the trap. This one is a known survivor: the explicit call
|
||||
covers the normal path, and the trap covers early exits.
|
||||
|
||||
Each mutant runs on an isolated copy of the file. Restores are checked by sha256. After each mutant, the network it
|
||||
leaves is removed by its exact name (mos-1438). Mutant (a) leaves the worktree directory's
|
||||
`<dir>_default`, and mutant (b) leaves the run's `${COMPOSE_PROJECT_NAME}_default`.
|
||||
@@ -1,88 +0,0 @@
|
||||
start 2026-10-23T11:14:01Z HEAD 8ddba89b7 refactor b99ca86b9 docker 29.7.2
|
||||
== wording
|
||||
rc=1 stderr: Error response from daemon: network mosaic-test-absent-46829331_default not found
|
||||
exit status 1
|
||||
== green
|
||||
TMPDIR /mnt/storage/scratch/tmp/gIj4
|
||||
nets[before test-task]:
|
||||
test-task rc=0 wall 16 s :: selftest: 92 passed, 0 failed
|
||||
OK compose network made under the run's project and removed after the run
|
||||
skip: skip live provider cases (row 244: no provider call in the gate)
|
||||
skip: skip live provider cases (row 244: no provider call in the gate)
|
||||
nets[after test-task]:
|
||||
TMPDIR /mnt/storage/scratch/tmp/gDYF
|
||||
nets[before test-release]:
|
||||
test-release rc=0 wall 4 s :: selftest: 15 passed, 0 failed
|
||||
OK compose network made under the run's project and removed after the run
|
||||
nets[after test-release]:
|
||||
== mutants
|
||||
Ma scripts/test-task.sh | 2 +-
|
||||
TMPDIR /mnt/storage/scratch/tmp/g6SN
|
||||
nets[before Ma-task]:
|
||||
Ma-task rc=1 wall 16 s :: selftest: 91 passed, 1 failed
|
||||
FAIL compose network made under the run's project and removed after the run
|
||||
red: FAIL compose network made under the run's project and removed after the run
|
||||
skip: skip live provider cases (row 244: no provider call in the gate)
|
||||
skip: skip live provider cases (row 244: no provider call in the gate)
|
||||
nets[after Ma-task]: gizmo-305_default
|
||||
restore ok scripts/test-task.sh
|
||||
Ma-task KILLED
|
||||
cleaned gizmo-305_default
|
||||
nets[after cleanup Ma-task]:
|
||||
Ma scripts/test-release.sh | 2 +-
|
||||
TMPDIR /mnt/storage/scratch/tmp/g48Q
|
||||
nets[before Ma-release]:
|
||||
Ma-release rc=1 wall 3 s :: selftest: 14 passed, 1 failed
|
||||
FAIL compose network made under the run's project and removed after the run
|
||||
red: FAIL compose network made under the run's project and removed after the run
|
||||
nets[after Ma-release]: gizmo-305_default
|
||||
restore ok scripts/test-release.sh
|
||||
Ma-release KILLED
|
||||
cleaned gizmo-305_default
|
||||
nets[after cleanup Ma-release]:
|
||||
Mb scripts/test-task.sh | 2 +-
|
||||
TMPDIR /mnt/storage/scratch/tmp/gcm1
|
||||
nets[before Mb-task]:
|
||||
Mb-task rc=1 wall 15 s :: selftest: 91 passed, 1 failed
|
||||
FAIL compose network made under the run's project and removed after the run
|
||||
red: FAIL compose network made under the run's project and removed after the run
|
||||
skip: skip live provider cases (row 244: no provider call in the gate)
|
||||
skip: skip live provider cases (row 244: no provider call in the gate)
|
||||
nets[after Mb-task]: mosaic-test-task-pf33rz8tic_default
|
||||
restore ok scripts/test-task.sh
|
||||
Mb-task KILLED
|
||||
cleaned mosaic-test-task-pf33rz8tic_default
|
||||
nets[after cleanup Mb-task]:
|
||||
Mb scripts/test-release.sh | 2 +-
|
||||
TMPDIR /mnt/storage/scratch/tmp/gSxg
|
||||
nets[before Mb-release]:
|
||||
Mb-release rc=1 wall 3 s :: selftest: 14 passed, 1 failed
|
||||
FAIL compose network made under the run's project and removed after the run
|
||||
red: FAIL compose network made under the run's project and removed after the run
|
||||
nets[after Mb-release]: mosaic-test-release-db4p70csnf_default
|
||||
restore ok scripts/test-release.sh
|
||||
Mb-release KILLED
|
||||
cleaned mosaic-test-release-db4p70csnf_default
|
||||
nets[after cleanup Mb-release]:
|
||||
Mc scripts/test-task.sh | 2 +-
|
||||
TMPDIR /mnt/storage/scratch/tmp/g6WJ
|
||||
nets[before Mc-task]:
|
||||
Mc-task rc=0 wall 16 s :: selftest: 92 passed, 0 failed
|
||||
OK compose network made under the run's project and removed after the run
|
||||
skip: skip live provider cases (row 244: no provider call in the gate)
|
||||
skip: skip live provider cases (row 244: no provider call in the gate)
|
||||
nets[after Mc-task]:
|
||||
restore ok scripts/test-task.sh
|
||||
Mc-task survived (known)
|
||||
nets[after cleanup Mc-task]:
|
||||
Mc scripts/test-release.sh | 2 +-
|
||||
TMPDIR /mnt/storage/scratch/tmp/g2jz
|
||||
nets[before Mc-release]:
|
||||
Mc-release rc=0 wall 3 s :: selftest: 15 passed, 0 failed
|
||||
OK compose network made under the run's project and removed after the run
|
||||
nets[after Mc-release]:
|
||||
restore ok scripts/test-release.sh
|
||||
Mc-release survived (known)
|
||||
nets[after cleanup Mc-release]:
|
||||
tree clean after mutants
|
||||
end 2026-10-23T11:15:17Z
|
||||
@@ -1,60 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Row 305 gate (sage-3374): wording, both suites whole, mutants a/b/c with exact-name cleanup.
|
||||
set -uo pipefail
|
||||
WT=/mnt/storage/scratch/gizmo-305
|
||||
OUT=/mnt/storage/scratch/gizmo-305-out/gate
|
||||
mkdir -p "$OUT"
|
||||
cd "$WT" || exit 9
|
||||
[ "$(git rev-parse HEAD)" = 8ddba89b7442f09fc71cf24d7f250e40a7f60fdf ] || { echo "HEAD drift"; exit 9; }
|
||||
[ -z "$(git status --porcelain)" ] || { echo "dirty tree"; exit 9; }
|
||||
[ -L node_modules ] || ln -s /mnt/storage/src/mosaic-stack/node_modules node_modules
|
||||
[ -L node_modules ] || { echo "no node_modules link"; exit 8; }
|
||||
DIRNET=gizmo-305_default
|
||||
nets() { echo " nets[$1]: $(docker network ls --format '{{.Name}}' | grep -E '^(mosaic-test-|gizmo-305_)' | tr '\n' ' ')"; }
|
||||
newtmp() { export TMPDIR="$(mktemp -d /mnt/storage/scratch/tmp/gXXX)"; echo " TMPDIR $TMPDIR"; }
|
||||
run() { # name script
|
||||
local name=$1 s=$2; newtmp; nets "before $name"
|
||||
local t0=$SECONDS
|
||||
timeout -k 10 900 "$s" > "$OUT/$name.log" 2>&1; local rc=$?
|
||||
echo "$name rc=$rc wall $((SECONDS-t0)) s :: $(grep -E '^selftest:' "$OUT/$name.log")"
|
||||
[ $rc -eq 124 ] || [ $rc -eq 137 ] && echo "SHELL-PHASE TIMEOUT (mos-1275): to Mos unplaced"
|
||||
grep -E 'compose network' "$OUT/$name.log" | sed 's/^/ /'
|
||||
grep -E '^FAIL|could not remove' "$OUT/$name.log" | sed 's/^/ red: /'
|
||||
grep -E '^skip' "$OUT/$name.log" | sed 's/^/ skip: /'
|
||||
nets "after $name"
|
||||
LASTRC=$rc
|
||||
}
|
||||
echo "start $(date -u +%FT%TZ) HEAD $(git rev-parse --short HEAD) refactor $(git rev-parse --short origin/refactor) docker $(docker version --format '{{.Server.Version}}')"
|
||||
echo "== wording"
|
||||
ABS="mosaic-test-absent-$RANDOM$RANDOM"_default
|
||||
docker network rm "$ABS" >/dev/null 2>"$OUT/absent.txt"; echo " rc=$? stderr: $(cat "$OUT/absent.txt")"
|
||||
grep -qE 'not found|No such network' "$OUT/absent.txt" || { echo "STOP: wording matches neither pattern"; exit 3; }
|
||||
echo "== green"
|
||||
for s in task release; do run "test-$s" "scripts/test-$s.sh"; [ $LASTRC -eq 0 ] || { echo "STOP: red on green run"; exit 4; }; done
|
||||
nets "after green" | grep -qE 'mosaic-test-|gizmo-305_' && { echo "STOP: network left after green"; exit 5; }
|
||||
echo "== mutants"
|
||||
mut() { # tag python-edit expected(red|green)
|
||||
local tag=$1 edit=$2 want=$3
|
||||
for s in task release; do
|
||||
local f="scripts/test-$s.sh" sum; sum=$(sha256sum "$f" | cut -d' ' -f1)
|
||||
cp -p "$f" "$OUT/$s.orig"
|
||||
python3 -B -c "$edit" "$f" || { echo "mutant $tag edit failed"; exit 6; }
|
||||
git diff --stat -- "$f" | head -1 | sed "s/^/ M$tag /"
|
||||
run "M$tag-$s" "$f"
|
||||
cp -p "$OUT/$s.orig" "$f"
|
||||
[ "$(sha256sum "$f" | cut -d' ' -f1)" = "$sum" ] && echo " restore ok $f" || { echo "RESTORE MISMATCH $f"; exit 7; }
|
||||
if [ "$want" = red ]; then grep -q '^FAIL.*compose network' "$OUT/M$tag-$s.log" && echo " M$tag-$s KILLED" || echo " M$tag-$s SURVIVED (unexpected)"
|
||||
else grep -q '^OK.*compose network' "$OUT/M$tag-$s.log" && echo " M$tag-$s survived (known)" || echo " M$tag-$s unexpected red"; fi
|
||||
# exact-name cleanup (mos-1438)
|
||||
for n in $(docker network ls --format '{{.Name}}' | grep -E '^(mosaic-test-(task|release)-[a-z0-9]+_default|gizmo-305_default)$'); do
|
||||
docker network rm "$n" >/dev/null && echo " cleaned $n"
|
||||
done
|
||||
nets "after cleanup M$tag-$s"
|
||||
done
|
||||
}
|
||||
E='import sys;p=sys.argv[1];s=open(p).read();o=%s;n=%s;assert s.count(o)==1;open(p,"w").write(s.replace(o,n))'
|
||||
mut a "$(printf "$E" "'export COMPOSE_PROJECT_NAME='" "'COMPOSE_PROJECT_NAME='")" red
|
||||
mut b "$(printf "$E" "'err=\"\$(docker network rm \"\$net\" 2>&1 >/dev/null)\" && return 0'" "'err=\"\" && return 0'")" red
|
||||
mut c "$(printf "$E" "'; remove_compose_network'\"'\"' EXIT'" "''\"'\"' EXIT'")" green
|
||||
[ -z "$(git status --porcelain | grep -v '^?? node_modules$')" ] && echo "tree clean after mutants" || { echo "TREE DIRTY"; git status --porcelain; }
|
||||
echo "end $(date -u +%FT%TZ)"
|
||||
@@ -1,180 +0,0 @@
|
||||
# Row 307 (#1814, Vikunja 598): move row 270's pi compaction reading behind the harness kind
|
||||
|
||||
Owner Gizmoduck. Reviewer Duckworth. Gate owner Sage. Brief:
|
||||
docs/plans/2026-10-23_harness-kind-compactions.md. Base 1e629c892. Design: DESIGN.md beside this file,
|
||||
approved (static) by Duckworth on 67daf6403 (duckworth-0280), with C1, C2, N1 and N2 folded in at
|
||||
cb048b93c. Mos ruled go on the four old-test edits in mos-1459, with the bounds below.
|
||||
|
||||
## Commits
|
||||
|
||||
1. 1f6db1589, red first. The two new test files and capture.mjs. Its product files are base's:
|
||||
`git diff --stat 1e629c892 1f6db1589` lists only this packet, capture.mjs and the two tests.
|
||||
2. 44104adb1, the build. The product files and the four old-test edits.
|
||||
|
||||
## What the build does
|
||||
|
||||
- `packages/plugins/src/kinds.mjs:52-57`: the harness kind's exports end in `"compactions"`, and the
|
||||
comment gains its contract line. `interfaceVersion` stays 1 (DESIGN.md "interfaceVersion stays 1").
|
||||
- New `packages/plugins/harness/pi/compactions.mjs`: base's `scanPi`, `readRange`, `digest`, `STREAM`,
|
||||
`TAIL`, the chunk size, `PI_VERSION` and `claudeHistory`, unchanged in behaviour, plus the export.
|
||||
`scanPi` is no longer exported and takes no defaults: its one caller passes all four arguments.
|
||||
- `pi/index.mjs` re-exports it. `claude-code/index.mjs` answers harness-unsupported with version null.
|
||||
- `packages/seat/src/compactions.mjs`: keeps the ledger. `readLedger` sets `unsupported` on
|
||||
`r.reason === "harness-unsupported"` only (:113). `checkAnswer` (:147-164) refuses an answer out of
|
||||
contract. `collectCompactions(store, { name, compactions }, opts)` (:174-205) calls the export, checks
|
||||
it, and writes the same lines in the same order as base.
|
||||
- `packages/cli/src/launcher.mjs`: the `compactions` closure takes the loaded module and calls the
|
||||
export directly, with the N1 comment on why it skips `call()`. Both call sites pass `harness`.
|
||||
- `packages/plugins/README.md`: the Harness section gains the `compactions` bullet.
|
||||
|
||||
## Old-test edits (mos-1459 bounds)
|
||||
|
||||
| File | Edit | Bound |
|
||||
| --- | --- | --- |
|
||||
| plugins/tests/kinds.test.mjs | `"compactions"` appended to the pinned list | :17-21, append only |
|
||||
| seat/tests/compactions.test.mjs | two module imports; `collect` passes `{ name, compactions }` | :11/:21, helper only |
|
||||
| seat/tests/compactions-budget.test.mjs | pi import; `collect` passes `{ name, compactions }` | :13/:24-25, helper only |
|
||||
| cli/tests/compactions-launch.test.mjs | pi import; base :344's call (now :345) passes `{ name: "pi", compactions: pi }` | call only, `.count === 1` kept |
|
||||
|
||||
No call or expected value in those files changed. harness.test.mjs, cli helpers.mjs:133-151,
|
||||
launch-routes.test.mjs:17-23 and launcher.test.mjs:694-697 are unedited.
|
||||
|
||||
## New tests
|
||||
|
||||
- `packages/seat/tests/compactions-ledger.test.mjs`:
|
||||
- FIXTURES: seven ledgers row 270's code writes (known, store-incomplete, store-unreadable,
|
||||
not-collected, harness-unsupported from claude-code, harness-unsupported from Claude history, and
|
||||
torn), each with its streams, projects and steps. Per fixture, test A reads `compactionCount` and
|
||||
test B runs one collection through `{ name: "pi", compactions: pi.compactions }`.
|
||||
- Test B runs over the fixture's own streams, not an empty session as DESIGN.md:189 says. Over an
|
||||
empty session every fixture with a cursor would go store-incomplete (the stream went away), so
|
||||
"the others go known" could not hold. The expected answers: known stays known (1), store-unreadable
|
||||
goes known with 0 (the cursor is at the end), not-collected goes known with 1, and
|
||||
store-incomplete, torn and both harness-unsupported fixtures stay unknown.
|
||||
- The malformed-answer test (17 answers, plus a module that throws, over a fresh store and over the
|
||||
known fixture) and the argument test (exact keys; core passes a copy of the cursors).
|
||||
- `packages/plugins/tests/harness-compactions.test.mjs`: CASES plain, budget (100 bytes), cap (1
|
||||
stream of 2), shrank and header against pi; pi's `first` with and without Claude history;
|
||||
claude-code; and a module re-exporting every pi export but `compactions`, refused `missing-export`.
|
||||
- capture.mjs reads both capture blocks from the test files. It replays each fixture with base's
|
||||
`collectCompactions(store, "<name>", ...)` and compares the ledger byte for byte, and it runs base's
|
||||
`scanPi` per case and compares the answer under base's reason order (:301 at base) and
|
||||
`PI_VERSION`. It prints base's `compactionCount` per fixture: that is the before half.
|
||||
|
||||
## Expected red on 1f6db1589
|
||||
|
||||
- seat compactions-ledger: the seven test A pass (the ledger rules are base's). Test B fails for known,
|
||||
store-unreadable and not-collected: base takes the object as a harness that isn't pi and writes
|
||||
harness-unsupported. Test B passes on base for the other four, whose expected answer is unknown with
|
||||
the same reason. The malformed-answer and argument tests fail: base never calls the module.
|
||||
Correction after the run: test B fails on base for claude-history too, so the reds are known,
|
||||
store-unreadable, not-collected and claude-history. On base the object harness takes :304, which
|
||||
writes `collected` without a scan, so the count stays null. Pi on the tip scans on a later
|
||||
collection, finds c1 and answers 1, still unknown with harness-unsupported. The test is right and
|
||||
this list was wrong (Duckworth agreed, duckworth-0287).
|
||||
- plugins harness-compactions: the five CASES, the `first` test and the claude-code test fail with a
|
||||
TypeError (`compactions` isn't exported on base). The missing-export test fails: base's loader loads
|
||||
the module.
|
||||
- harness.test.mjs:192 is already red on base. That's the brief's starting point.
|
||||
|
||||
## Run plan (mos-1275, `timeout -k 10`)
|
||||
|
||||
All on a CLEAR from Sage. TMPDIR comes from `mktemp -d /mnt/storage/scratch/tmp/gXXX`. Gate worktrees
|
||||
under /mnt/storage/scratch, node_modules linked right after `git worktree add`, pipefail and tee.
|
||||
|
||||
| Run | Longest recorded | LIMIT |
|
||||
| --- | --- | --- |
|
||||
| capture.mjs on a 1f6db1589 worktree (base and candidate both it) | none | 120 s |
|
||||
| red first: the two new files on 1f6db1589, each whole | none (seat suite 7 s) | 300 s |
|
||||
| the touched test files whole on 44104adb1, one at a time | compactions-launch alone: none; other files 15 s | 600 s |
|
||||
| bus suite | 25 s (270 r5) | 900 s |
|
||||
| cli suite | 682 s (270 r5) | 2100 s |
|
||||
| plugins suite | none recorded | 900 s |
|
||||
| webui suite | 58.2 s (294) | 600 s |
|
||||
| business suite | none recorded | 900 s |
|
||||
| seat suite whole, `node --test tests/` (Duckworth C1) | 7 s (270 r5) | 600 s |
|
||||
| each scripts/test-*.sh | 42 s (test-foundation) | 900 s |
|
||||
| each mutant, its kill files whole | 1 s (264a probes) | 300 s |
|
||||
|
||||
- In the cli run, compactions-launch's T3 tests (base :206, and :305 with the :344 edit; :207, :306
|
||||
and :345 after the import line) must show as run, not skipped on `sandboxProblem()` (base :36, now
|
||||
:37). The report names every skip (Duckworth C2).
|
||||
- Plugins must have zero failures.
|
||||
- A timeout with no failed test is a hang and goes to Sage. A timeout in the shell phase goes to Mos
|
||||
unplaced. A first-run red in a new 307 test is placed and reported after (mos-1272). A red in an old
|
||||
test goes to Sage, unfixed.
|
||||
|
||||
## Mutants
|
||||
|
||||
Each on an isolated copy of the file, restore checked by sha256, only on a green base.
|
||||
|
||||
| # | Change | Kill files |
|
||||
| --- | --- | --- |
|
||||
| M1 | `readLedger`: `if (r.harness !== "pi" \|\| r.reason === "harness-unsupported")` restored | plugins harness.test.mjs (:192) |
|
||||
| M2 | pi `compactions` drops the `first && claudeHistory(store)` branch | seat compactions-budget.test.mjs (base :86, now :87), plugins harness-compactions.test.mjs |
|
||||
| M3 | `readLedger` never sets `unsupported` | seat compactions-ledger.test.mjs, seat compactions.test.mjs (base :197, now :199) |
|
||||
| M4 | `collectCompactions` skips `checkAnswer` | seat compactions-ledger.test.mjs |
|
||||
|
||||
## Runs
|
||||
|
||||
Sage's CLEARs: sage-3455 for steps 1-3, sage-3465 for steps 4-6. Gate worktrees at
|
||||
/mnt/storage/scratch/g307-base (1f6db1589), g307-tip and g307-mut (1f00d4f91), with node_modules
|
||||
linked. TMPDIR was /mnt/storage/scratch/tmp/gTIK. Outputs went to /mnt/storage/scratch/gizmo-307-out/s1 and s2.
|
||||
|
||||
### Steps 1-3 (13:31:21Z-13:31:36Z, then the capture rerun at 13:32Z)
|
||||
|
||||
- capture.mjs crashed with ENOENT on its first run. Base `sessionStore` (session.mjs:78
|
||||
`privateDirs`, called from :117) makes its directories one level at a time, and :44 passed a
|
||||
per-fixture root that didn't exist yet. The fix is one line before :44,
|
||||
`` mkdirSync(join(root, `f-${name}`)) ``. A copy with that line, run on g307-base as both base and
|
||||
candidate, exited rc 0 and printed `all match`: 7 ledgers byte for byte, 7 base counts and 5 scans.
|
||||
Base counts: known 1 known; store-incomplete, store-unreadable and not-collected null, unknown
|
||||
with their own reason; claude-code and claude-history null, harness-unsupported; torn 1,
|
||||
store-incomplete.
|
||||
- Red first on 1f6db1589, both rc 1. Seat compactions-ledger: 9 pass, 7 fail (the corrected list
|
||||
above, plus the malformed-answer and argument tests). Plugins harness-compactions: 0 pass, 8 fail.
|
||||
Seven fail with `TypeError: pi.compactions is not a function` or `claude.compactions is not a
|
||||
function`. The missing-export test fails because base loads the module.
|
||||
- Touched files whole on 1f00d4f91, all rc 0: compactions-ledger 16/16, harness-compactions 8/8,
|
||||
kinds 5/5, harness 9/9 (:192 green), compactions 20/20, compactions-budget 10/10,
|
||||
compactions-launch 5/5 with 0 skipped.
|
||||
|
||||
### Steps 4-6 (14:00:10Z-14:14:00Z, on 1f00d4f91)
|
||||
|
||||
| Run | rc | Time | Result |
|
||||
| --- | --- | --- | --- |
|
||||
| bus | 0 | 24 s | 890 pass, 0 fail, 0 skipped |
|
||||
| cli | 0 | 631 s | 927 pass, 0 fail, 0 skipped; T3 :207, :306, :345 ran |
|
||||
| plugins | 0 | 0 s | 119 pass, 0 fail, 0 skipped |
|
||||
| webui | 0 | 57 s | 374 pass, 0 fail, 1 skipped (below) |
|
||||
| business | 0 | 2 s | 231 pass, 0 fail, 0 skipped |
|
||||
| seat | 0 | 7 s | 218 pass, 0 fail, 0 skipped |
|
||||
| test-auth | 0 | 0 s | 15 passed, 0 failed |
|
||||
| test-conductor | 0 | 7 s | |
|
||||
| test-config | 0 | 3 s | |
|
||||
| test-discord | 0 | 7 s | |
|
||||
| test-extension-package | 0 | 2 s | |
|
||||
| test-foundation | 0 | 39 s | |
|
||||
| test-land-work | 0 | 12 s | |
|
||||
| test-queue | 0 | 20 s | one skip (below) |
|
||||
| test-release | 0 | 3 s | 15 passed, 0 failed |
|
||||
| test-task | 0 | 14 s | 92 passed, 0 failed, two skips (below) |
|
||||
|
||||
Skips:
|
||||
- webui: "rebuilding from the source gives the same bytes" needs the pinned esbuild. 307 doesn't
|
||||
touch the editor.
|
||||
- test-queue: "queue verify and render --check", because the gate worktree isn't the queue's
|
||||
canonical root.
|
||||
- test-task: "live provider cases" twice (row 244, no provider call in the gate).
|
||||
|
||||
Mutants ran in g307-mut. Each restore matched its sha256, and the tree was clean after M4.
|
||||
|
||||
| # | Killed by |
|
||||
| --- | --- |
|
||||
| M1 | plugins harness.test.mjs:192 |
|
||||
| M2 | seat compactions-budget.test.mjs:87 and :104; plugins harness-compactions.test.mjs:47 |
|
||||
| M3 | seat compactions-ledger.test.mjs:123 (test B, claude-code and claude-history); seat compactions.test.mjs:199 |
|
||||
| M4 | seat compactions-ledger.test.mjs:151 (the malformed-answer test) |
|
||||
|
||||
There were no reds, so nothing was placed under mos-1272. The sweep found no node or chromium left in
|
||||
my cwds.
|
||||
@@ -1,241 +0,0 @@
|
||||
# Row 307 (#1814, Vikunja 598): row 270's pi compaction reading moves behind the harness kind
|
||||
|
||||
Owner Gizmoduck. Reviewer Duckworth. Gate owner Sage. Brief:
|
||||
`docs/plans/2026-10-23_harness-kind-compactions.md` at 1e629c892, which is the base. Mos ruled the
|
||||
move in mos-1455 item 3 and declined an EXCEPT entry.
|
||||
|
||||
## What is red, as the code has it at 1e629c892
|
||||
|
||||
`packages/plugins/tests/harness.test.mjs:192` greps core sources for a quoted harness name. It finds
|
||||
three lines in `packages/seat/src/compactions.mjs`:
|
||||
|
||||
- `:232` in `readLedger`: `if (r.harness !== "pi" || r.reason === "harness-unsupported") unsupported = true;`
|
||||
- `:283` and `:287` in `collectCompactions`: the `harness === "pi"` branches.
|
||||
|
||||
Everything else row 270 put in that file is either harness-free (the ledger, the budget and stream
|
||||
settings, `storeDir`, `compactionCount`) or pi-only (`scanPi`, `PI_VERSION`, `claudeHistory`, and
|
||||
the helpers only `scanPi` uses: `readRange`, `digest`, `STREAM`, `TAIL`).
|
||||
|
||||
## The new export: `compactions`
|
||||
|
||||
`packages/plugins/src/kinds.mjs:54` appends `"compactions"` to the harness kind's exports, so the
|
||||
loader refuses a module without it (`loader.mjs:61-66`, code `missing-export`).
|
||||
|
||||
```
|
||||
compactions({ store, cursors, budget, streams, first })
|
||||
-> { found, cursors, known, reason, version }
|
||||
```
|
||||
|
||||
Arguments, all from core:
|
||||
|
||||
- `store` is `{ session, projects }`, the two native store directories `sessionStore` makes. The
|
||||
module never gets `store.dir`, the directory that holds the ledger.
|
||||
- `cursors` is a copy of the ledger's cursor map, `{ [stream]: { bytes, tail } }`.
|
||||
- `budget` and `streams` are `readBudget(...)` and `readStreams(...)`, as the launcher passes them
|
||||
now (`launcher.mjs:299`, `:305`). Core keeps both readers and their defaults.
|
||||
- `first` is true when the store has no ledger yet (today's `!prior`).
|
||||
|
||||
The answer:
|
||||
|
||||
- `found`: `[{ entry, completedAt, stream }]`, the compactions read past the cursors. `entry` is a
|
||||
non-empty string, `completedAt` a string or null, `stream` a non-empty string.
|
||||
- `cursors`: `{ [stream]: { bytes, tail } }` for each stream the module read. `bytes` is a safe
|
||||
integer of 0 or more and `tail` 64 lowercase hex.
|
||||
- `reason`: null, `store-incomplete`, `store-unreadable`, `not-collected` or `harness-unsupported`.
|
||||
- `known`: a boolean, true exactly when `reason` is null.
|
||||
- `version`: the store format the module read against as a string, or null when it read nothing.
|
||||
|
||||
Core checks the answer before it writes. Anything else throws `harness <name> compactions: bad
|
||||
answer: <what>` and nothing is appended. A throw from the module itself is the same case. Both reach
|
||||
the launcher's existing catch (`launcher.mjs:313-316`), which logs the message and records the run's
|
||||
`compactions` event as unknown with `store-unreadable`, as a scan that throws today does.
|
||||
|
||||
### interfaceVersion stays 1
|
||||
|
||||
- Every harness module lives in this tree, and the loader loads nothing else (decision 143,
|
||||
`loader.mjs:1-5`). Both shipped modules gain the export in the same commit.
|
||||
- A module without the export already refuses at load, as `missing-export` naming `compactions`.
|
||||
That is the brief's third test. A bump would add a second refusal for the same fact.
|
||||
- No existing export changes its arguments or answer. Row 125 moved limit-check to 2 because
|
||||
`mayLaunch`, `mustStop` and `report` changed shape. Nothing like that happens here.
|
||||
- `harness.test.mjs:36` pins `interfaceVersion` 1, and the brief keeps that file unchanged.
|
||||
|
||||
The tradeoff: a module someone wrote against version 1 without `compactions` reports
|
||||
`missing-export`, not `interface-version`. The message names the export, which is the more useful of
|
||||
the two.
|
||||
|
||||
## What moves where
|
||||
|
||||
New file `packages/plugins/harness/pi/compactions.mjs`, imported by `pi/index.mjs`. The loader
|
||||
checks only `index.mjs` itself (`loader.mjs:42-54`), and claude-code's module already imports files
|
||||
outside its directory (`claude-code/index.mjs:11-12`). It takes, unchanged in behaviour:
|
||||
|
||||
- `scanPi`, with `readRange`, `digest`, `STREAM`, `TAIL` and the chunk size it reads by;
|
||||
- `PI_VERSION` ("0.85.1");
|
||||
- `claudeHistory(store)`;
|
||||
- the reason order `["store-incomplete", "store-unreadable", "not-collected"]` from `:301`;
|
||||
- the header comment's Pi paragraphs (`compactions.mjs:12-19`, `:21-24`).
|
||||
|
||||
pi's `compactions`:
|
||||
|
||||
- `first` and `claudeHistory(store)`: answers `{ found: [], cursors: {}, known: false, reason:
|
||||
"harness-unsupported", version: "0.85.1" }`. That is today's `:283-286`.
|
||||
- otherwise: `scanPi(store.session, cursors, budget, streams)`, and answers its `found` and
|
||||
`cursors` with the first reason in the order above, `known` when that's null, and version
|
||||
"0.85.1". That is today's `:287-302` before the dedupe.
|
||||
|
||||
claude-code's `compactions` reads nothing and answers `{ found: [], cursors: {}, known: false,
|
||||
reason: "harness-unsupported", version: null }`. That is today's `:303-304`. Vikunja 466 still has
|
||||
no pinned Claude Code format.
|
||||
|
||||
## Core keeps the ledger
|
||||
|
||||
`packages/seat/src/compactions.mjs` keeps `LEDGER`, `READ_BYTES`, `STREAMS`, `readBudget`,
|
||||
`readStreams`, `storeDir`, `readLedger`, `compactionCount`, the key and the single O_APPEND write.
|
||||
|
||||
`collectCompactions(store, harness, { now, budget, streams })` takes `harness = { name,
|
||||
compactions }`, the name the route used and the loaded module's export. It:
|
||||
|
||||
1. reads the ledger (`prior`), as now;
|
||||
2. calls `harness.compactions({ store: { session: store.session, projects: store.projects },
|
||||
cursors: { ...ledger.cursors }, budget, streams, first: prior === null })` and checks the answer;
|
||||
3. appends, in today's order: one `compaction` line per key the ledger doesn't hold yet, one
|
||||
`cursor` line per stream whose cursor moved, then `{ v: 1, kind: "collected", at, known, reason,
|
||||
harness: name, version }`. These are the same lines and field order as today's `:288-302` and
|
||||
`:304`. `name` is a variable, never a literal;
|
||||
4. returns `compactionCount(store.dir)`.
|
||||
|
||||
`readLedger`'s unsupported test becomes `r.reason === "harness-unsupported"`, a field every answer
|
||||
carries. No core line names a harness. The core comments drop the quoted names too, because the
|
||||
grep reads comments.
|
||||
|
||||
`packages/cli/src/launcher.mjs:309-318`: the `compactions` closure takes the loaded module too and
|
||||
calls `collectCompactions(store, { name: model.harness, compactions: harness.compactions }, {
|
||||
budget, streams })`. Both call sites, `:509` and `:650`, have `harness` in scope (it's
|
||||
`startLocked`'s `let harness` from `:503`; the `exited.then` callback at `:632` closes over it).
|
||||
The closure calls the export directly, not through `call()` (`launcher.mjs:196`), because `call()`
|
||||
turns a throw into a run refusal. The closure gets a comment saying so (Duckworth N1).
|
||||
`bus/src/runtime.mjs:282` and `broker.mjs:885-889` keep calling `compactionCount` and don't change.
|
||||
|
||||
`packages/plugins/README.md`, Harness section, and the comment at `kinds.mjs:35-51` each gain the
|
||||
`compactions` line with the contract above.
|
||||
|
||||
## A ledger row 270 wrote reads the same count
|
||||
|
||||
Row 270's code writes a `collected` line in exactly three places:
|
||||
|
||||
| Line | harness | reason | version | old rule (`:232`) | new rule |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `:286`, Claude history on the first pi collection | `"pi"` | `harness-unsupported` | "0.85.1" | unsupported | unsupported |
|
||||
| `:302`, a pi scan | `"pi"` | null, `store-incomplete`, `store-unreadable` or `not-collected` | "0.85.1" | supported | supported |
|
||||
| `:304`, any other harness name (`claude-code`, or `claude` in the tests) | that name | `harness-unsupported` | null | unsupported | unsupported |
|
||||
|
||||
The two rules agree on every line row 270 can write. The rest of `readLedger` (the `bad`, `torn`,
|
||||
`incomplete` and `events` handling) and all of `compactionCount` don't change. So every ledger row
|
||||
270 wrote reads the same `{ count, known, reason, at }` after the move. Nothing rewrites a ledger;
|
||||
the next collection only appends.
|
||||
|
||||
The rules would differ only on a `collected` line naming a harness other than `"pi"` with a reason
|
||||
other than `harness-unsupported`. Row 270 never writes one, and the launcher is the ledger's only
|
||||
writer (`compactions.mjs:7-10`).
|
||||
|
||||
New collections after the move append the same bytes as before for the same store state. pi's
|
||||
answer is today's scan result, core keeps the dedupe and the line format, and `harness` in the line
|
||||
is still the route's name.
|
||||
|
||||
## Existing tests that change (to Mos through Sage, mos-1272)
|
||||
|
||||
Grepped for `interfaceVersion`, the harness exports, `write("harness"`, `fakeHarnesses` and
|
||||
`collectCompactions(` in `packages/*/tests/*` and `scripts/`.
|
||||
|
||||
Four existing files change:
|
||||
|
||||
1. `packages/plugins/tests/kinds.test.mjs:17-21`: the pinned harness export list gains
|
||||
`"compactions"` at the end.
|
||||
2. `packages/seat/tests/compactions.test.mjs:11` and `:21`: import the two shipped modules. `setup`'s
|
||||
`collect(harness = "pi")` passes `{ name: harness, compactions: MODULES[harness].compactions }`,
|
||||
with `pi` mapped to the pi module and `claude` to claude-code's. The 27 `f.collect()` calls and
|
||||
the two named ones at `:199` and `:201` stay as written.
|
||||
3. `packages/seat/tests/compactions-budget.test.mjs:13` and `:24-25`: the same change in its
|
||||
`collect`. Its calls at `:67-69` and `:129-134` stay as written.
|
||||
4. `packages/cli/tests/compactions-launch.test.mjs:344`: the one direct
|
||||
`collectCompactions(legacy, "pi")` becomes `collectCompactions(legacy, { name: "pi",
|
||||
compactions: pi.compactions })`, with an import of the pi module.
|
||||
|
||||
Fixtures that build a harness module and need no edit, because they re-export a real module and
|
||||
inherit `compactions`:
|
||||
|
||||
- `packages/cli/tests/helpers.mjs:133-151` `fakeHarnesses`, used by `compactions-launch`,
|
||||
`idle-stop-race`, `launcher`, `lifecycle`, `session-clear`, `session-launch`, `thread-launch` and
|
||||
`thread-revoke`;
|
||||
- `packages/cli/tests/launch-routes.test.mjs:17-23`: `down`, `sparse`, `metered` and `throws`
|
||||
re-export pi. `broken` lacks every export but `adapter` on purpose. The loader still refuses it at
|
||||
`levels` first, so `:114` and `:138` (`missing-export`) hold;
|
||||
- `packages/cli/tests/launcher.test.mjs:694-697`: `down` and `fixture` re-export pi.
|
||||
|
||||
`packages/plugins/tests/harness.test.mjs` doesn't change. `:33-37` loops over the kind's exports,
|
||||
which both modules then have, and `:192` goes green.
|
||||
|
||||
No `scripts/test-*.sh` builds a harness module. `test-config.sh:266-280` checks only the two
|
||||
config keys.
|
||||
|
||||
## New tests, red first (mos-1272)
|
||||
|
||||
1. `packages/seat/tests/compactions-ledger.test.mjs`: one fixture ledger per reason row 270 writes:
|
||||
known, `store-incomplete`, `store-unreadable`, `not-collected`, `harness-unsupported` from
|
||||
claude-code, `harness-unsupported` from Claude history, and a torn ledger.
|
||||
- Each is literal JSONL in the test. Before the build, in the slot, a capture script runs base
|
||||
1e629c892's `collectCompactions` with a fixed `now` over the same stores. The literals must
|
||||
equal its output byte for byte. That proves row 270's code wrote them.
|
||||
- `compactionCount` reads each one. I run this half on the base and on the candidate, and record
|
||||
both outputs in BUILD.md as the before and after.
|
||||
- Then one more collection through `{ name, compactions }` over an empty session gives each
|
||||
fixture's expected next answer: unsupported and `store-incomplete` stay, the others go known.
|
||||
This half is red on the base, where core treats the object as a harness that isn't pi.
|
||||
2. `packages/plugins/tests/harness-compactions.test.mjs`:
|
||||
- pi's `compactions` over fixture streams answers what base `scanPi` answers, captured by the same
|
||||
script: a plain count, a budget that stops short (cursor at the last whole line,
|
||||
`not-collected`), more streams than the cap (no cursor for unopened streams, `not-collected`),
|
||||
a stream that shrank under its cursor (`store-incomplete`), a non-session header
|
||||
(`store-unreadable`). Each answer has version "0.85.1".
|
||||
- pi with `first` and a non-empty `projects` answers `harness-unsupported` without scanning.
|
||||
Without `first`, the same store scans.
|
||||
- claude-code answers `harness-unsupported` with version null, over directories that don't exist.
|
||||
- A harness module that re-exports every other pi export by name, without `compactions`, refuses
|
||||
at load: `missing-export`, "doesn't export compactions".
|
||||
3. In the same seat file: core refuses each malformed answer and appends nothing. The cases are
|
||||
`found` not an array, an empty `entry`, a cursor whose `bytes` is negative or `tail` isn't 64
|
||||
hex, `known` true with a reason, an unknown reason, a numeric `version`, and a module that
|
||||
throws. The module gets exactly `{ store: { session, projects }, cursors, budget, streams,
|
||||
first }`.
|
||||
|
||||
## Mutants
|
||||
|
||||
- M1, the brief's first: core branches on a harness name again (`readLedger`'s `r.harness !== "pi"
|
||||
||` restored). Killed by `harness.test.mjs:192`.
|
||||
- M2, the brief's second: pi's module drops the Claude-history check. Killed by
|
||||
`compactions-budget.test.mjs:86` and new test 2's `first` case.
|
||||
- M3, the brief's third: `readLedger` never sets `unsupported`. Killed by new test 1's two
|
||||
`harness-unsupported` fixtures and `compactions.test.mjs:197`.
|
||||
- M4, mine: core skips the answer check. Killed by new test 3.
|
||||
|
||||
## Gate
|
||||
|
||||
Duckworth approves this design, then the manifest. On Sage's CLEAR:
|
||||
|
||||
- the capture script on base 1e629c892 first, then the new tests red on the base;
|
||||
- the bus, cli, plugins (zero failures), webui and business suites, and every `scripts/test-*.sh`;
|
||||
- the seat suite whole (`packages/seat`, `node --test tests/`), where two old-test edits, new
|
||||
tests 1 and 3, and the M2 and M3 kills live (Duckworth C1);
|
||||
- in the cli run, `compactions-launch`'s T3 tests (`:206`, and `:305` with the `:344` edit) must
|
||||
run, not skip on `sandboxProblem()` (`:36`). BUILD.md names every skip (Duckworth C2);
|
||||
- the mutants, each on an isolated copy with its restore checked by sha256.
|
||||
|
||||
Each suite runs under `timeout -k 10` at 3x or more of its longest recorded wall (mos-1275). I'll
|
||||
put the numbers in BUILD.md before the first run. TMPDIR comes from
|
||||
`mktemp -d /mnt/storage/scratch/tmp/gXXX`.
|
||||
|
||||
## Round 1
|
||||
|
||||
Duckworth approved round 1 on 67daf6403 (duckworth-0280). This revision takes C1 and C2 into
|
||||
the gate, adds the N1 comment to the launcher plan, and corrects the N2 line refs (`:302`, `:301`).
|
||||
@@ -1,79 +0,0 @@
|
||||
// Row 307 (#1814): checks the new tests' literals against row 270's code at base 1e629c892.
|
||||
//
|
||||
// node capture.mjs <base checkout at 1e629c892> <candidate checkout>
|
||||
//
|
||||
// Reads the FIXTURES and CASES blocks (between `// capture:begin` and `// capture:end`) from the
|
||||
// candidate's two new test files. Replays each fixture's steps with the base's collectCompactions,
|
||||
// harness named by string as row 270 takes it, with the clock at 12:00:00 and one second a step,
|
||||
// and compares the ledger byte for byte. Prints the base's compactionCount for each. Runs the
|
||||
// base's scanPi over each case and compares the answer the base's reason order gives (:301) with
|
||||
// version PI_VERSION. Exit 0 only when every one matches. Writes only under TMPDIR.
|
||||
|
||||
import assert from "node:assert/strict";
|
||||
import { appendFileSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join, resolve } from "node:path";
|
||||
import { pathToFileURL } from "node:url";
|
||||
|
||||
const [base, cand] = process.argv.slice(2).map((p) => p && resolve(p));
|
||||
if (!base || !cand) {
|
||||
console.error("usage: node capture.mjs <base checkout> <candidate checkout>");
|
||||
process.exit(2);
|
||||
}
|
||||
|
||||
function block(file) {
|
||||
const text = readFileSync(join(cand, file), "utf8");
|
||||
const m = /\n\/\/ capture:begin\nconst [A-Z]+ = (\{[\s\S]*?\});\n\/\/ capture:end\n/.exec(text);
|
||||
if (!m) throw new Error(`${file}: no capture block`);
|
||||
return JSON.parse(m[1]);
|
||||
}
|
||||
|
||||
const FIXTURES = block("packages/seat/tests/compactions-ledger.test.mjs");
|
||||
const CASES = block("packages/plugins/tests/harness-compactions.test.mjs");
|
||||
const seat = await import(pathToFileURL(join(base, "packages/seat/src/compactions.mjs")).href);
|
||||
const { sessionStore } = await import(pathToFileURL(join(base, "packages/seat/src/session.mjs")).href);
|
||||
|
||||
const root = mkdtempSync(join(tmpdir(), "g307-capture-"));
|
||||
let failed = 0;
|
||||
const report = (what, same, detail) => {
|
||||
console.log(`${same ? "MATCH" : "DIFF "} ${what}${detail ? ` ${detail}` : ""}`);
|
||||
if (!same) failed++;
|
||||
};
|
||||
try {
|
||||
for (const [name, fx] of Object.entries(FIXTURES)) {
|
||||
mkdirSync(join(root, `f-${name}`));
|
||||
const store = sessionStore(join(root, `f-${name}`), "acme", "th1", "s1");
|
||||
for (const [file, text] of Object.entries(fx.streams)) writeFileSync(join(store.session, file), text);
|
||||
for (const [file, text] of Object.entries(fx.projects ?? {})) writeFileSync(join(store.projects, file), text);
|
||||
let tick = 0;
|
||||
const now = () => new Date(Date.UTC(2026, 9, 22, 12, 0, tick++)).toISOString();
|
||||
for (const step of fx.steps) {
|
||||
if (step.tear !== undefined) appendFileSync(join(store.dir, seat.LEDGER), step.tear);
|
||||
else seat.collectCompactions(store, step.collect, { now, ...(step.budget === undefined ? {} : { budget: step.budget }) });
|
||||
}
|
||||
const got = readFileSync(join(store.dir, seat.LEDGER), "utf8");
|
||||
const want = fx.ledger.join("\n") + "\n";
|
||||
report(`ledger ${name}`, got === want, got === want ? `(${Buffer.byteLength(got)} bytes)` : `\n--- base wrote\n${got}--- test has\n${want}`);
|
||||
const count = seat.compactionCount(store.dir);
|
||||
report(`base count ${name}`, JSON.stringify(count) === JSON.stringify(fx.count), JSON.stringify(count));
|
||||
}
|
||||
for (const [name, c] of Object.entries(CASES)) {
|
||||
const dir = join(root, `c-${name}`);
|
||||
mkdirSync(dir);
|
||||
for (const [file, text] of Object.entries(c.streams)) writeFileSync(join(dir, file), text);
|
||||
const scan = seat.scanPi(dir, c.cursors, c.budget, c.cap);
|
||||
const reason = ["store-incomplete", "store-unreadable", "not-collected"].find((p) => scan.problems.includes(p)) ?? null;
|
||||
const answer = { found: scan.found, cursors: scan.cursors, known: reason === null, reason, version: seat.PI_VERSION };
|
||||
let same = true;
|
||||
try {
|
||||
assert.deepStrictEqual(answer, c.answer);
|
||||
} catch {
|
||||
same = false;
|
||||
}
|
||||
report(`scan ${name}`, same, JSON.stringify(scan));
|
||||
}
|
||||
} finally {
|
||||
rmSync(root, { recursive: true, force: true });
|
||||
}
|
||||
console.log(failed ? `${failed} differ` : "all match");
|
||||
process.exit(failed ? 1 : 0);
|
||||
@@ -1,260 +0,0 @@
|
||||
# Row 283 (#1788) C2-01d build notes (Honker)
|
||||
|
||||
Append-only. Design: DESIGN.md d2 16e809457, APPROVE webby-0172. Gate owner Sage, reviewer Webby.
|
||||
|
||||
## 2026-10-23 build on 45dca69f6 (sage-3577)
|
||||
|
||||
Branch honker/row283-build from origin/refactor 45dca69f6e4bce52834587f66f2ff33ba839ab8a. The old branch
|
||||
honker/row283 (16e809457) held only the design, so its two commits were cherry-picked as 398314cf4
|
||||
(d1) and 4f66dccde (d2). The DESIGN.md blob equals 16e809457's.
|
||||
|
||||
Commits:
|
||||
- 331653b38: code, README and tests T1-T8.
|
||||
- 28918824c: the survey.test:73 re-pin, alone (mos-1330 item 4).
|
||||
- this file.
|
||||
|
||||
Nothing has run. No node, test or mutant ran during the build: Darkwing held the slot. Every count
|
||||
below is a plan until Sage's CLEAR.
|
||||
|
||||
### Drift check (sage-3577)
|
||||
|
||||
`git diff --stat 94c33a43c 45dca69f6` (design base to build base) over the paths the tests read or
|
||||
hash-pin:
|
||||
- No change in packages/library, packages/business/src/business.mjs or
|
||||
packages/business/tests/business.test.mjs.
|
||||
- No test hash-pins a library file. bus library.test and library-sync.test import index.mjs, and
|
||||
stack-copy.test only checks that index.mjs exists.
|
||||
- webui library-cli.test changed one line and doesn't read scope. The `classify` in webui reads.mjs is
|
||||
the business one, not the library's.
|
||||
|
||||
I redo the drift check on BASE..refactor before the in-review move.
|
||||
|
||||
### N3 (webby-0169): deepEquals of the mapping output outside packages/library
|
||||
|
||||
`git grep -n playground -- 'packages/*/tests/*' ':!packages/library/*'` and the files naming
|
||||
`universes` give two files:
|
||||
- business.test.mjs:20 compares `validateBusinessDocument(...).projects.books` with
|
||||
`checkMapping(mappingEntry())`. That is output against output, so `supporting: []` shows up on both
|
||||
sides. :27 compares only `.playground`.
|
||||
- library-projects-protected.test.mjs compares file bytes (:31, :32) and change paths (:58), never the
|
||||
mapping output.
|
||||
|
||||
No re-pin is needed outside library. Inside library, only the draft deepEqual at mapping.test:48 gains
|
||||
`supporting: []`, as the design says.
|
||||
|
||||
### Q1 departure (sage-2923) and the :73 re-pin (mos-1330 item 4)
|
||||
|
||||
survey.mjs:65 counts `supporting: 0` and formatSurvey prints it. T8 is the only added test
|
||||
(survey.test "C2-01d: with --mapping the survey counts supporting files").
|
||||
|
||||
mos-1330 item 4, packages/library/tests/survey.test.mjs:73, commit 28918824c:
|
||||
- old: `'scopes canon 5, playground 1, unmapped 3; indexed 6',`
|
||||
- new: `'scopes canon 5, playground 1, supporting 0, unmapped 3; indexed 6',`
|
||||
|
||||
N2: the pin gains only `supporting 0`. No other text on the line or in that test moved.
|
||||
|
||||
### Q2 tradeoff (webby-0169)
|
||||
|
||||
A supporting prefix that holds a playground prefix refuses `library-mapping-invalid`. That goes past
|
||||
the brief, but it is the fail-closed reading, and it uses an existing code: classify checks supporting
|
||||
first, so that playground prefix could never match. The cost is that she can't nest a playground under
|
||||
a supporting folder, though she can nest the other way (a playground holding a supporting folder).
|
||||
|
||||
### Handoffs
|
||||
|
||||
- Q4 (webby-0169, sage-2930): the M12 delete rule ("A delete also needs the path to exist at the tip as
|
||||
a 100644 blob", case2 DESIGN.md :308) is not in supportingPath. It binds row 288 (C2-02) via Gitea
|
||||
#1793 comment 30738, with tests for a missing path and a non-100644 entry.
|
||||
- A save with no `editor` refusing is C2-02's (DESIGN.md section 1).
|
||||
|
||||
### Choices the design left open
|
||||
|
||||
- The book loop is now `againstBooks(owners, list, code)` in mapping.mjs, called once per list. The
|
||||
playground's messages and codes are byte-equal to before.
|
||||
- A non-string path refuses `library-write-story-path` ("the path must be a string") as part of
|
||||
check 1. A non-array `tree` is a TypeError (DESIGN.md section 3).
|
||||
- Check 8 builds the tree's names as every path and every folder above it, keyed by
|
||||
`normalize('NFC').toLowerCase()`. A name on the way refuses if its key holds any name other than
|
||||
itself, so a tree that already holds case twins refuses a write to either (R7).
|
||||
|
||||
### Mutants (exact strings)
|
||||
|
||||
Each applies one replacement to the build tip. Run one at a time, and restore with `git checkout --`
|
||||
on the one file before the next.
|
||||
|
||||
| Mutant | File | Replace | With | Killed by |
|
||||
|---|---|---|---|---|
|
||||
| M1 | src/scope.mjs | `const prefix = entry.supporting.find(p => inside(p, path));` | `const prefix = entry.supporting.find(p => inside(p, path) && !entry.playground.some(q => inside(q, path)));` | scope.test "supporting comes before playground", supporting.test "passes at book level" (both-lists path) |
|
||||
| M2 | src/mapping.mjs | `if ((inside \|\| holding) && owner !== id)` | `if ((inside \|\| holding) && owner !== id && list !== 'supporting')` | mapping.test "each supporting prefix rule", business.test C2-04 |
|
||||
| M3 | src/supporting.mjs | `for (const p of own) if (LINKS.has(modes.get(p)))` | `for (const p of own) if (false && LINKS.has(modes.get(p)))` | supporting.test "symlink or gitlink" |
|
||||
| M4 | src/supporting.mjs | `const fold = name => name.normalize('NFC').toLowerCase();` | `const fold = name => name.normalize('NFC');` | supporting.test "case or Unicode form" |
|
||||
| M4b | src/supporting.mjs | `const fold = name => name.normalize('NFC').toLowerCase();` | `const fold = name => name.toLowerCase();` | supporting.test "case or Unicode form" (NFD case) |
|
||||
| M5 | src/supporting.mjs | `Buffer.byteLength(path, 'utf8') > MAX_BYTES` | `path.length > MAX_BYTES` | supporting.test "1025 bytes" |
|
||||
| M6 | src/mapping.mjs | `const IDENT_BAD = /[\u0000-\u001f\u007f-\u009f<>]/;` | `const IDENT_BAD = /[<>]/;` | mapping.test "editor is optional" |
|
||||
| M6b | src/mapping.mjs | `const IDENT_BAD = /[\u0000-\u001f\u007f-\u009f<>]/;` | `const IDENT_BAD = /[\u0000-\u001f\u007f-\u009f]/;` | mapping.test "editor is optional" |
|
||||
| M7 | src/supporting.mjs | `if (place.scope !== 'supporting' \|\| place.universe !== universe)` | `if (place.scope !== 'supporting')` | supporting.test "outside the universe's supporting folders" |
|
||||
| M8 | src/mapping.mjs | `if (sid === pid && s !== p && holds(s, p))` | `if (false && sid === pid && s !== p && holds(s, p))` | mapping.test "each supporting prefix rule" (Workshop case) |
|
||||
|
||||
(The `\|` in the table is an escaped `|` in the source text.) Each mutant runs the one test file named,
|
||||
plus business.test for M2, under `timeout -k 10 600`. A mutant passes the gate only when its run is red
|
||||
on the named test and the restored file's sha256 equals the build tip's.
|
||||
|
||||
### Gate plan (on Sage's CLEAR)
|
||||
|
||||
1. The touched files whole, each under `timeout -k 10 600`: library mapping, scope, supporting and
|
||||
survey tests, and business.test.mjs. Counts go below.
|
||||
2. M1-M8 as above.
|
||||
3. The full gate, under mos-1275 timeouts: `node --test packages/library/tests/` and
|
||||
`node --test packages/business/tests/` each under `timeout -k 10 1800`, and every scripts/test-*.sh
|
||||
under `timeout -k 10 300`. pipefail and tee, with skips named (test-task Docker groups).
|
||||
4. Before in-review: grep packages/*/tests for a 64-hex pin on any changed file and for the changed
|
||||
message text, then the drift check on BASE..refactor.
|
||||
|
||||
## 2026-10-23 Webby early look (webby-0227, static, not a verdict)
|
||||
|
||||
- E1: business.test.mjs is an existing test file with a 4-line addition after the playground refusal.
|
||||
The in-review request lists it next to survey.test:73.
|
||||
- E3 fixed: supportingPath now runs the string check before `JSON.stringify`, so a BigInt (or any
|
||||
non-string) path refuses `library-write-story-path` instead of throwing a TypeError.
|
||||
supporting.test's string case now covers 7, null, undefined, 1n and an array.
|
||||
- E2 open: `editor` takes surrounding whitespace, and git trims it at commit, so the saved ident and
|
||||
the commit ident can differ. DESIGN.md section 1 says "non-empty after trim". Refusing
|
||||
`value.trim() !== value` would change that approved rule, so it went to Sage instead of into the
|
||||
build.
|
||||
|
||||
## 2026-10-23 E2 departure (sage-3601)
|
||||
|
||||
A departure from DESIGN.md section 1 (which stays unedited). The design says each `editor` value is
|
||||
"non-empty after trim". Sage ruled that surrounding whitespace refuses too, because git trims an
|
||||
ident at commit, so a padded value would save one name and commit another. mapping.mjs now adds
|
||||
`if (value.trim() !== value) bad(`editor.${key} must not start or end with whitespace`)` after the
|
||||
IDENT_BAD check. `trim()` covers Unicode whitespace, so U+00A0 and U+3000 refuse as well. Inner
|
||||
whitespace is kept ("Her Middle Name" passes).
|
||||
|
||||
T3 gains a case per key for leading, trailing and both-ends spaces, U+00A0 and U+3000, plus one inner
|
||||
whitespace pass.
|
||||
|
||||
M6 grows a third part:
|
||||
|
||||
| Mutant | File | Replace | With | Killed by |
|
||||
|---|---|---|---|---|
|
||||
| M6c | src/mapping.mjs | `if (value.trim() !== value) bad(` | `if (false && value.trim() !== value) bad(` | mapping.test "editor is optional" (padded cases) |
|
||||
|
||||
Fixture grep: `git grep -nE "\beditor\b|\bauthor\b" -- 'packages/library/tests/*' 'packages/business/tests/*'`,
|
||||
leaving out mapping.test.mjs, finds nothing. packages/business/tests has no fixtures directory. The
|
||||
library fixture mapping.json has no `editor`. The positive control (`vaultPrefix` in mapping.json)
|
||||
matches once. No fixture maps an editor or author with surrounding whitespace.
|
||||
|
||||
## 2026-10-23 E4 (webby-0230, sage-3606), same departure as E2
|
||||
|
||||
Claimed: `queue move 283 in-progress`, op honker-283-start, rev 3642, 19:10:49Z (briefed→in-progress).
|
||||
|
||||
Git's ident.c `crud()` strips any byte <= 0x20 and `, : ; < > " \ '` from both ends of an ident. I
|
||||
checked that with git 2.55.0: `Jane,` `"Jane"` `'Jane'` `Jane;` `Jane:` `Jane\` and `,Jane` all
|
||||
commit as `Jane`, while `Jane.` and `Ja,ne` are kept. mapping.mjs now takes the set from crud()
|
||||
rather than from that list: `IDENT_CRUD_END = /^[\u0000-\u0020,:;<>"\\']|[\u0000-\u0020,:;<>"\\']$/`.
|
||||
The E2 check became `if (value.trim() !== value || IDENT_CRUD_END.test(value))`, which refuses
|
||||
library-mapping-invalid with "editor.<key> must not start or end with whitespace or any of , : ; " ' \".
|
||||
`trim()` still catches Unicode whitespace (U+00A0, U+3000), which crud() leaves alone.
|
||||
|
||||
Inner characters: IDENT_BAD (`/[\u0000-\u001f\u007f-\u009f<>]/`) already refuses `<`, `>`, newline,
|
||||
tab and every other control anywhere in the value. T3 now pins that at the start, the end and the
|
||||
middle. Inner `, : ; " ' \` are kept, since git keeps them, and T3 pins that too.
|
||||
|
||||
Tests:
|
||||
- T3 has one case per character in [space, U+00A0, U+3000, `,`, `:`, `;`, `"`, `'`, `\`], at the start
|
||||
and at the end, for each key. `<`, `>`, newline and tab are pinned at the start, end and middle.
|
||||
Four accepted names have inner crud characters.
|
||||
- New round-trip test, "an accepted editor round-trips through a real git commit unchanged". It
|
||||
commits in a scratch repo with editor `Doe, Jane Q.` / `[email protected].` as author and
|
||||
committer, with GIT_AUTHOR_* and GIT_COMMITTER_* stripped from the env, and asserts `git log`
|
||||
shows exactly the saved values. I preflighted that commit with git 2.55.0 by hand: both values came
|
||||
back unchanged.
|
||||
|
||||
M6c now replaces the whole end check (this supersedes the earlier M6c row):
|
||||
|
||||
| Mutant | File | Replace | With | Killed by |
|
||||
|---|---|---|---|---|
|
||||
| M6c | src/mapping.mjs | `if (value.trim() !== value \|\| IDENT_CRUD_END.test(value))` | `if (false)` | mapping.test "editor is optional" (end cases) |
|
||||
| M6d | src/mapping.mjs | `if (value.trim() !== value \|\| IDENT_CRUD_END.test(value))` | `if (value.trim() !== value)` | mapping.test "editor is optional" (`,` `:` `;` `"` `'` `\` cases) |
|
||||
|
||||
## 2026-10-23 E5 (webby-0236, not blocking), fixed
|
||||
|
||||
The round-trip test stripped only GIT_AUTHOR_* and GIT_COMMITTER_*. With GIT_DIR, GIT_WORK_TREE or
|
||||
GIT_INDEX_FILE set (inside a hook, say), GIT_DIR beats `-C root` and the commit would land in the
|
||||
outer repo, and the test read global and system config. It now deletes GIT_DIR, GIT_WORK_TREE,
|
||||
GIT_COMMON_DIR and GIT_INDEX_FILE (as queue/tests/helpers.mjs gitEnv does) and sets
|
||||
GIT_CONFIG_GLOBAL=/dev/null and GIT_CONFIG_NOSYSTEM=1 (as ledger.test.mjs does). The `-c user.*`
|
||||
ident still applies. Test only; no mutant changes.
|
||||
|
||||
## 2026-10-23 sage-2925: optional editor.user (sage-3649)
|
||||
|
||||
sage-2925 (recorded in ludwig/row286-r2 agents/ludwig/work/queue-286/BUILD.md, Q4) ruled that row 283
|
||||
adds an optional `editor.user`, her Gitea login for the `library-human` slot, which row 288 (C2-02)
|
||||
passes to `humanCredential(context, {user})`. It reached this row after the DESIGN.md d2 approval
|
||||
(ludwig-0068, bubba-0009, sage-3649), so it departs from DESIGN.md section 1 ("exactly the keys
|
||||
`name` and `email`"). DESIGN.md stays unedited.
|
||||
|
||||
- mapping.mjs: `only(entry.editor, ['name', 'email', 'user'], 'editor')`. When present, `user` must be
|
||||
a string matching USER (`/^[A-Za-z0-9_.-]{1,100}$/`, the entry `user` check), else
|
||||
library-mapping-invalid "editor.user must be a plain account name". The output carries `user` only
|
||||
when given. An absent `editor.user` refusing library-human-missing is 288's (bubba-0009).
|
||||
- README: the `editor` line names `user` and the end-character rule from E2/E4.
|
||||
- Tests: T3 (mapping.test "editor is optional") gains one accepted case (`her.login-1`, kept in the
|
||||
output) and refused cases for '', an inner space, '@', 101 characters, 7 and null. They go in
|
||||
mapping.test with the other editor cases, not in the new supporting.test, which tests write paths.
|
||||
- No test outside mapping.test reads `editor` or pins mapping.mjs or README (git grep).
|
||||
|
||||
| Mutant | File | Replace | With | Killed by |
|
||||
|---|---|---|---|---|
|
||||
| M6e | src/mapping.mjs | `if (Object.hasOwn(entry.editor, 'user') && (typeof entry.editor.user !== 'string' \|\| !USER.test(entry.editor.user)))` | `if (false)` | mapping.test "editor is optional" (editor.user refusals) |
|
||||
| M6f | src/mapping.mjs | `...(Object.hasOwn(entry.editor, 'user') ? { user: entry.editor.user } : {})` | `...({})` | mapping.test "editor is optional" (`her.login-1` kept) |
|
||||
|
||||
## 2026-10-23 T2 run (sage-3695 CLEAR, lane A, library and business only)
|
||||
|
||||
Node v26.8.1. refactor was e2b873390 (226 landed); `git diff --stat 45dca69f6 e2b873390 -- packages/library
|
||||
packages/business` is empty. TMPDIR was a mktemp -d under /mnt/storage/scratch/tmp, with pipefail.
|
||||
Singles and mutants ran under `timeout -k 10 600`, suites under `timeout -k 10 1800`.
|
||||
|
||||
First-run red (mos-1272, placed): the first base run on 46bad7ea3 at 20:01:09Z was red in
|
||||
supporting.test "malformed paths refuse by class, in order". 5 of 6 passed, with `TypeError: Do not know
|
||||
how to serialize a BigInt`. The cause was the test helper, not the product: `refuses()` labelled each
|
||||
assertion with `JSON.stringify(path)`, and the 1n case added for E3 can't be stringified. In c18ad3e12
|
||||
the label uses `util.inspect(path)`, a 2-line test-only change. The product's 1n refusal was never in
|
||||
question: supportingPath type-checks before it stringifies (E3). The whole run below is on c18ad3e12.
|
||||
|
||||
Base, the touched files whole (20:01:43Z), all rc=0:
|
||||
- library mapping.test 16/16, scope.test 6/6, supporting.test 6/6, survey.test 7/7;
|
||||
- business business.test 21/21;
|
||||
- 0 skipped, 0 cancelled, 0 todo.
|
||||
|
||||
Mutants (20:01:44Z). Each was applied by exact string with count 1, then restored with `git checkout --`.
|
||||
Every restored sha256 equals HEAD's blob, and the tree was clean after.
|
||||
|
||||
| Mutant | Run | Result | Failing test |
|
||||
|---|---|---|---|
|
||||
| M1 | scope.test | rc=1, 5/6 | supporting comes before playground; a folder in both lists is supporting… |
|
||||
| M1 | supporting.test | rc=1, 5/6 | a path passes at book level, universe level, in a draft and in a folder in both lists |
|
||||
| M2 | mapping.test | rc=1, 15/16 | each supporting prefix rule refuses with its code |
|
||||
| M2 | business.test | rc=1, 20/21 | C2-04: library mappings load without roots, remain frozen, and retain mapping refusals |
|
||||
| M3 | supporting.test | rc=1, 5/6 | a symlink or gitlink on the way, or at the path itself, refuses |
|
||||
| M4 | supporting.test | rc=1, 5/6 | a name that differs from a tree name only in case or Unicode form refuses… |
|
||||
| M4b | supporting.test | rc=1, 5/6 | the same case/Unicode test |
|
||||
| M5 | supporting.test | rc=1, 5/6 | a path of exactly 1024 bytes passes, and 1025 bytes… refuses |
|
||||
| M6 | mapping.test | rc=1, 15/16 | editor is optional, kept when given, and refuses anything but a plain name and email |
|
||||
| M6b | mapping.test | rc=1, 15/16 | the same editor test |
|
||||
| M6c | mapping.test | rc=1, 15/16 | the same editor test |
|
||||
| M6d | mapping.test | rc=1, 15/16 | the same editor test |
|
||||
| M6e | mapping.test | rc=1, 15/16 | the same editor test |
|
||||
| M6f | mapping.test | rc=1, 15/16 | the same editor test |
|
||||
| M7 | supporting.test | rc=1, 5/6 | a path outside the universe's supporting folders refuses |
|
||||
| M8 | mapping.test | rc=1, 15/16 | each supporting prefix rule refuses with its code |
|
||||
|
||||
14 of 14 mutants killed, each on its named test only.
|
||||
|
||||
Suites (20:01:47Z):
|
||||
- `packages/library`: `node --test tests/*.test.mjs` rc=0, 98/98, 0 skipped.
|
||||
- `packages/business`: `node --test tests/` rc=0, 231/231, 0 skipped.
|
||||
|
||||
Not run here: every scripts/test-*.sh and the other packages. Those are Sage's 283 gate, after Webby's
|
||||
APPROVE.
|
||||
@@ -1,191 +0,0 @@
|
||||
# Row 283 (#1788) C2-01d design, draft 2 (Honker)
|
||||
|
||||
Brief: docs/plans/2026-10-20_case2-rows.md "C2-01d" at refactor 94c33a43c. Sources: the design at
|
||||
agents/gosalyn/work/case2/DESIGN.md b68d79663, the ruling after r11 (:207), the M12 paragraph (:300),
|
||||
1.1 (:755) and 1.2 (:817). Base 94c33a43c. Reviewer Webby, gate owner Sage. Nothing is built yet. The
|
||||
build waits for 282 to land (sage-2906).
|
||||
|
||||
## 1. Mapping (packages/library/src/mapping.mjs)
|
||||
|
||||
`supporting`:
|
||||
- Every universe kind takes an optional `supporting` list: plain `['name','books','playground','supporting']`,
|
||||
hybrid adds it to its seven keys, and a draft gets `['kind','name','playground','supporting']`.
|
||||
- Each value is checked as a playground prefix is: a string ending in `/` whose body passes `folder()`.
|
||||
- The output carries `supporting` on every universe, `[]` when absent, the way a draft carries
|
||||
`books: []`. classify then needs no `?? []`. The business writer writes the raw document
|
||||
(organization.mjs:195), not this output, so no business file changes shape.
|
||||
- The prefix rules, across every entry (ruling after r11):
|
||||
- A supporting prefix holding another supporting prefix, or one listed twice, refuses
|
||||
`library-mapping-invalid`.
|
||||
- A prefix equal to one of its own entry's book folders, or holding one, refuses `library-mapping-invalid`.
|
||||
- A prefix inside or holding another entry's book folder refuses `library-supporting-other-universe`.
|
||||
- Level comes from where the prefix sits, as for the playground: inside one of its own entry's books
|
||||
is book level, and outside every book is universe level. A draft's prefixes are all universe level.
|
||||
- Between the two lists (my choice, Q2):
|
||||
- A supporting prefix may equal a playground prefix of the same entry. That folder is writable.
|
||||
- A playground prefix may hold a supporting prefix of the same entry. The inner folder is supporting
|
||||
and the rest stays playground.
|
||||
- A supporting prefix that holds a playground prefix refuses `library-mapping-invalid`. classify
|
||||
checks supporting first, so that playground prefix could never match.
|
||||
- A supporting prefix equal to, holding or inside a playground prefix of another entry refuses
|
||||
`library-mapping-invalid`. Otherwise one path would have two universes.
|
||||
- The book loop at mapping.mjs:128-140 becomes a helper that both lists call with their own code and
|
||||
label. The playground's messages and codes stay byte-equal, so no existing test text moves.
|
||||
|
||||
`editor`:
|
||||
- The entry takes an optional `editor`. When present, it is an object with exactly the keys `name` and
|
||||
`email` (via `only()`). Each value is a string that is non-empty after trim and has no control
|
||||
character (`[\u0000-\u001f\u007f-\u009f]`), `<` or `>` (webby-0169 R1: git drops them from an ident
|
||||
and commits under a different name, so C2-02 would never see a failure). Anything else refuses
|
||||
`library-mapping-invalid`.
|
||||
- The output carries `editor: { name, email }` only when present, as `user` and `vaultPrefix` do. A save
|
||||
with no `editor` refusing is C2-02's job.
|
||||
|
||||
## 2. Scope (scope.mjs)
|
||||
|
||||
- `classify` gets a supporting loop before the playground loop (design 1.2). It returns `place(...)`
|
||||
with `{ scope: 'supporting', universe, book }`. The book is the book folder holding the prefix, or
|
||||
null at universe level and in a draft. The type and folder come from the first folder under the
|
||||
prefix, as for the playground.
|
||||
- The `.md` check stays first, so a `.canvas` or `.base` under a supporting prefix stays unmapped.
|
||||
- The comment above `classify` names the three prefix scopes and the order.
|
||||
|
||||
## 3. supportingPath (new supporting.mjs)
|
||||
|
||||
`supportingPath(mapping, universe, path, tree)` returns `path` or throws
|
||||
`LibraryError('library-write-story-path', ...)`. It is pure and reads no git.
|
||||
|
||||
- `tree` is the array `listTree` returns (reader.mjs:26, `{ mode, type, oid, size, path }`), so the
|
||||
C2-02 broker passes its listing as it is (Q3). A non-array `tree` throws a TypeError, because that is
|
||||
a caller bug, not a path class.
|
||||
- The checks run in this order, each with its own message naming the class:
|
||||
1. The path must be a string of at most 1,024 UTF-8 bytes (`Buffer.byteLength`).
|
||||
2. It must have no control character, using the same control class as `editor` (not `<` or `>`).
|
||||
3. It must have no backslash.
|
||||
4. It must not be absolute (a leading `/`).
|
||||
5. It must have no empty, `.` or `..` segment. That also catches `//` and a trailing `/`.
|
||||
6. `classify(mapping, path)` must give scope `supporting` and that same `universe`. This one check
|
||||
covers an unknown universe, an unmapped path, a `.canvas`, `.base` or attachment, a canon or
|
||||
story path, a playground path that isn't also supporting, and another universe's prefix. The scope
|
||||
rule then has one source, and M1 below hits both.
|
||||
7. Every proper prefix of the path (`a`, `a/b`, ...) and the path itself must not be in `tree` with
|
||||
mode `120000` (symlink) or `160000` (gitlink).
|
||||
8. No prefix of the path, and not the path itself, may equal a tree path or a tree directory
|
||||
(derived from the entries' paths) after `normalize('NFC').toLowerCase()` on both sides, unless
|
||||
it equals that tree path exactly. NFC as well as case, because APFS treats NFC and NFD forms of
|
||||
a name as one file (webby-0169 N1).
|
||||
Directories are checked too, because the folders under a supporting prefix are hers to name. A
|
||||
path in a tree that holds both `a.md` and `A.md` refuses, which matches R7.
|
||||
- The refusal messages quote the path with JSON, except for the control-character class, whose message
|
||||
leaves the path out.
|
||||
- The delete rule ("A delete also needs the path to exist at the tip as a 100644 blob", M12) isn't in
|
||||
the brief's supportingPath list. It stays with C2-02's delete (Q4).
|
||||
The C2-02 brief doesn't name it (only design :308), so BUILD.md carries it to C2-02 under Handoffs
|
||||
(webby-0169 Q4).
|
||||
- index.mjs exports `supportingPath`.
|
||||
|
||||
## 4. README (packages/library/README.md)
|
||||
|
||||
- Mapping: `supporting` and its rules, the cross-list rules, and `editor`.
|
||||
- Refusals: a `library-supporting-other-universe` row, and the new cases in the
|
||||
`library-mapping-invalid` row.
|
||||
- Scope: supporting first, then playground, then canon.
|
||||
- A new section, "Agent write paths", for supportingPath and its classes.
|
||||
|
||||
## 5. Callers of classify outside files owned (Q1 for Sage)
|
||||
|
||||
- survey.mjs:65 builds `{ canon: 0, playground: 0, unmapped: 0 }` and increments
|
||||
`scopes[classify(...).scope]`. A supporting file adds `supporting: NaN`, and formatSurvey (:92) never
|
||||
prints it. I propose a departure: add `supporting: 0` and print it, so the line becomes
|
||||
`scopes canon 5, playground 1, supporting 0, unmapped 3; indexed 6`. That re-pins survey.test:73 and
|
||||
adds a count test. Without it, the survey reports garbage once she marks a folder. The departure
|
||||
covers two files, packages/library/src/survey.mjs and packages/library/tests/survey.test.mjs.
|
||||
- No change in the rest, each for a reason:
|
||||
- reader.mjs:183 skips only unmapped, so supporting files are indexed like playground files.
|
||||
- R5 (:207) flags only canon to playground, as design 1.3 R5 says. A canon link to a supporting file
|
||||
raises nothing.
|
||||
- render.mjs:23 gives supporting a null badge. The supporting badge belongs to C2-10b (design :1415).
|
||||
- mirror.mjs:246 refuses only unmapped. Reading supporting files by scope is C2-05c's.
|
||||
- No bus or webui source filters on scope (git grep at 94c33a43c).
|
||||
- M9 already protects the whole `projects` key from agent edits (library-projects-protected.test). No
|
||||
test is added there.
|
||||
|
||||
## 6. Tests
|
||||
|
||||
- mapping.test:
|
||||
- T1: `supporting` at book level, at universe level, in a hybrid and in a draft. The output carries
|
||||
it, with `[]` when absent. The draft `deepEqual` at :48 gains `supporting: []`.
|
||||
- T2: one test per prefix rule.
|
||||
- These refuse `library-mapping-invalid`: no trailing `/`, a bad folder, one holding another, one
|
||||
listed twice, one equal to its own book, one holding its own book, one holding a playground
|
||||
prefix, and one overlapping another entry's playground.
|
||||
- These refuse `library-supporting-other-universe`: one inside another universe's book, and one
|
||||
holding another universe's book.
|
||||
- An equal same-entry playground passes.
|
||||
- T3: `editor` passes, and absent passes. It refuses `library-mapping-invalid` for a non-object, an
|
||||
array, an extra key, a missing key, an empty or blank value, a non-string, and a control character,
|
||||
`<` or `>` in either value.
|
||||
- scope.test, T4:
|
||||
- Supporting at book level, universe level and in a draft each give their universe and book.
|
||||
- A folder in both lists is `supporting`, and a playground-only folder is `playground`.
|
||||
- A supporting `.canvas` or `.base` is unmapped.
|
||||
- supporting.test (new):
|
||||
- T5 passes at book level, universe level, in a draft, in a both-lists folder, and at exactly 1,024 bytes.
|
||||
- T6 has one refusal per class against a fixture tree with a symlink, a gitlink and a case variant.
|
||||
The classes are:
|
||||
- unmapped, `.canvas`, `.base`, an attachment, canon, playground-only, another universe's
|
||||
supporting prefix, and an unknown universe;
|
||||
- absolute, `..`, `.`, `//`, a trailing `/`, a backslash, a C0 control and DEL;
|
||||
- a symlink folder, a gitlink folder, and a symlink at the path itself;
|
||||
- a case-variant file, a case-variant folder, and an NFD-form variant of an NFC tree name;
|
||||
- 1,025 bytes made with a multi-byte character, so bytes and characters differ.
|
||||
- Each asserts the code `library-write-story-path`.
|
||||
- business.test: T7 adds one assertion that `validateBusinessDocument` refuses
|
||||
`library-supporting-other-universe`.
|
||||
- survey.test (only if Q1 is approved): T8 counts one supporting file, and :73 is re-pinned.
|
||||
|
||||
## 7. Mutants (exact strings go in BUILD.md)
|
||||
|
||||
| Mutant | Change | Killed by |
|
||||
|---|---|---|
|
||||
| M1 | classify checks playground before supporting (the brief's mutant) | T4 both-lists, T5 both-lists |
|
||||
| M2 | the other-universe fail for supporting is dropped | T2 |
|
||||
| M3 | the symlink and gitlink check is dropped | T6 |
|
||||
| M4 | the case check is dropped | T6 |
|
||||
| M4b | check 8 drops `normalize('NFC')` | T6 NFD variant |
|
||||
| M5 | the byte length uses `path.length` | T6 1,025 bytes |
|
||||
| M6 | the `editor` control-character check is dropped | T3 |
|
||||
| M6b | the `editor` `<` and `>` check is dropped | T3 |
|
||||
| M7 | supportingPath skips the universe match | T6 other universe |
|
||||
| M8 | the supporting-holds-playground check is dropped | T2 |
|
||||
|
||||
## 8. Gate
|
||||
|
||||
- Webby approves the manifest.
|
||||
- The library and business suites and every scripts/test-*.sh are green on Sage's gate.
|
||||
- Timeouts (mos-1275): each package `timeout -k 10 1800`, each script `timeout -k 10 300`, each single
|
||||
file and mutant `timeout -k 10 600`. These come from my row 256 gate at 10:34Z.
|
||||
- Before in-review, grep packages/*/tests for 64-hex pins on the changed files and for the changed
|
||||
message text, then drift-check BASE..refactor.
|
||||
|
||||
## 9. Questions
|
||||
|
||||
- Q1 (Sage): approve the survey.mjs and survey.test.mjs departure in section 5?
|
||||
- Q2 (Webby): the cross-list rules in section 1?
|
||||
- Q3 (Webby): `tree` as the `listTree` array?
|
||||
- Q4 (Webby): the delete's 100644 check stays with C2-02?
|
||||
- Q5 (Webby): `editor` refuses only blank values and control characters, as the brief says. `<` and `>`
|
||||
would break a git ident. I'd leave them to C2-02's commit step unless you want them refused here.
|
||||
|
||||
## 10. Draft 2 (webby-0169)
|
||||
|
||||
- R1 folded: `editor` refuses `<` and `>` too, with T3 cases and mutant M6b.
|
||||
- Q2 accepted. BUILD.md records the tradeoff: refusing a supporting prefix that holds a playground
|
||||
prefix goes past the brief, but it is the fail-closed reading and uses an existing code. The cost
|
||||
is that she can't nest a playground under a supporting folder, though she can nest the other way.
|
||||
- Q3 accepted. Q4: carried to C2-02 under Handoffs in BUILD.md, and Sage was asked to add it to C2-02's brief.
|
||||
- N1 folded into check 8 (NFC and case), with an NFD case in T6 and mutant M4b.
|
||||
- N2: the survey.test:73 pin gains only `supporting`, and the count test is the only addition
|
||||
(mos-1330, its own commit).
|
||||
- N3: before the build, re-grep tests outside packages/library for a `deepEqual` of the mapping output
|
||||
on the build base.
|
||||
Loaded 100 of 589 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user