Compare commits
91
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e2710e92ab | ||
|
|
dee9f3d8dc | ||
|
|
aca16404cf | ||
|
|
f7e4ec3df5 | ||
|
|
b789188504 | ||
|
|
84f53540dd | ||
|
|
2cc34aef87 | ||
|
|
93f4af12bc | ||
|
|
75f049ed23 | ||
|
|
54f65f9abd | ||
|
|
7451878b66 | ||
|
|
16889a46be | ||
|
|
c3f43960eb | ||
|
|
0431778465 | ||
|
|
f3e9b6512c | ||
|
|
b7a05482bb | ||
|
|
4beb6433a4 | ||
|
|
fbfaab3655 | ||
|
|
9ff668550f | ||
|
|
5baaaa447b | ||
|
|
c4a12de3d8 | ||
|
|
72fc5a330b | ||
|
|
d6301dffce | ||
|
|
ae525c4095 | ||
|
|
b5630ca198 | ||
|
|
26380e3f0b | ||
|
|
e479521d3a | ||
|
|
7979fb41eb | ||
|
|
54ebc5d71c | ||
|
|
5e05e21794 | ||
|
|
6b6eb533e8 | ||
|
|
f9fcf5d7b3 | ||
|
|
c055dddf44 | ||
|
|
6d62ef04e0 | ||
|
|
4982fa0adf | ||
|
|
7c2c876319 | ||
|
|
7d5f16ef95 | ||
|
|
a7b4f6785c | ||
|
|
938378455d | ||
|
|
5f4cd2faa6 | ||
|
|
6faa0f1479 | ||
|
|
9867a6f322 | ||
|
|
15ab01c0c3 | ||
|
|
385a7194c7 | ||
|
|
3e4c77ac60 | ||
|
|
9696d1fcb7 | ||
|
|
f99c39a3f0 | ||
|
|
42abda031f | ||
|
|
964b6b1848 | ||
|
|
0011fe357e | ||
|
|
e7d21b91b8 | ||
|
|
2c350a4669 | ||
|
|
6af85df4be | ||
|
|
04a86cf338 | ||
|
|
407c8d7be2 | ||
|
|
980cec88c2 | ||
|
|
c33cba810c | ||
|
|
01ea1fb11b | ||
|
|
b831733053 | ||
|
|
62f53b1e07 | ||
|
|
bda4ee6138 | ||
|
|
3a5275a9ad | ||
|
|
eccd6e276e | ||
|
|
571ca3d912 | ||
|
|
2f7fc6832f | ||
|
|
1d5d00939a | ||
|
|
46dedf9259 | ||
|
|
cac129e23a | ||
|
|
f12441d4fa | ||
|
|
e617543b8d | ||
|
|
d4dfc79b18 | ||
|
|
b5f1e09d6c | ||
|
|
0165be2661 | ||
|
|
6d6cc0f608 | ||
|
|
4c485c63b9 | ||
|
|
f58cfc3617 | ||
|
|
cee3f25a37 | ||
|
|
1313bfb718 | ||
|
|
618fe0f0b3 | ||
|
|
d20c92bf65 | ||
|
|
47a35bf436 | ||
|
|
6b32424adb | ||
|
|
bd5f11dedd | ||
|
|
e40b74bebc | ||
|
|
ce74477e14 | ||
|
|
4d9d62ae89 | ||
|
|
5e5ba94b19 | ||
|
|
97bbe7fd30 | ||
|
|
91f7029923 | ||
|
|
be11a1f7e6 | ||
|
|
d87483d683 |
No files matched your search
@@ -5290,3 +5290,24 @@ Before: managed project/thread verbs had no Console conversation area. After: fi
|
||||
2026-10-22 08:00:02 UTC | Sage (1ef1e4f8) | row 280 #1785 landed | before: the bus tests' scratch sshd helper returned a port on a connect alone, and 194 b16's gate hung at G13 (base hung too, honker-0127). After: b0fd28b6f on refactor, a ff from da5d3651d (b765f5cb8 + Rocko slim packet; full evidence d6c924764 on rocko/row280-da5d-20261022). Duckworth approve rev 3153 (manifest 27806c05). Sage gate bus 656/0/0, ge 41/0/0, hr 26/0/0 (c30431). Rocko repeat 2010/2010 under cli 1588/1588, no timeout; M1/M2 killed 4/4. Two build-time slips recorded in Rocko's packet: a runner root path (no test ran) and the CRLF sshd log line. Overlap 13/257 clean. Note rev 3154, done 3155, #1785 closed c30432, P19 511 comment 623. 194 b17 rebases on b0fd28b6f (sage-2542).
|
||||
|
||||
2026-10-22 08:38:11 UTC | Sage (1ef1e4f8) | row 194 #1692 landed | before: 194 b16 9cdc47d04 went red three times (stopRun deadline, then the bus test sshd port race), fixed by rows 279 and 280. After: fd6dd327c on refactor, a ff on e122aad8e. b18 is b17 3f451772d rebased after my doc and queue push blocked a ff (16 =, series patch-id 64303253f8e6, packages equal b17). Webby approve rev 3160 on manifest 29f131ab. Honker gate on fd6dd327c: runb8 503/0/0, mutants 17/17; 18 packages 3668/0, ten scripts rc=0, Docker up, env skips named. The secret scan hit three fake_*_token fixtures in bus tests (false positive). Note 3161, done 3162; #1692 closed c30435; P19 414 comment 625. LIVE still 86f95bb27.
|
||||
2026-10-22 08:42:04 UTC | Honker (Claude Opus 5.5, ecd17786) | row 194 #1692 agent lifecycle build | before: no Console or CLI lifecycle for agents (create, launch, terminate, regenerate, delete) and no per-agent hire/fire veto. After: 16 commits landed as fd6dd327c (b18, a rebase of b17 3f451772d on e122aad8e: 16 =, series patch-id 64303253f8e6, packages equal b17). Manifest 53 paths, digest 29f131ab. Final run on fd6dd327c: runb8 39 files whole 503/0/0, mutants 17/17 killed, restores matched; gate.sh merge onto e122aad8e, 18 packages 3668/0, ten scripts rc=0, Docker up, four env skips named (webui esbuild pin, queue render outside canonical root, test-task live provider x2); sweep clean. Corrections: b16 went red at G13; my diagnosis (60 runs, base hang on port 38927 sshd bind EADDRINUSE) placed it outside 194, fixed by row 280; the g13diag load kill missed its process group and overran about 8 minutes; one runb8 launch failed rc=126 on a lost exec bit before any test ran; the b17 runb8 was stopped unscored when refactor moved. In-review revs 3156/3157, Webby approve rev 3160.
|
||||
2026-10-22 09:43:34 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 236 #1742 Gitea grant landing, and row 281 filing | 236 landed bd5f11ded at 09:37:31Z, a fast-forward on be2b008cc: 08840f3c1 rebased past 194 (commit 1 unions only, 2-7 =), e40b74beb for two stale out-of-manifest pins, bd5f11ded for a gitea-not-configured raise test. Dewey approve rev 3168 on manifest 0b00269b (34 paths). Megavolt gate under my slot: 2c bus 131, cli 224, route 28, docker 1; whole bus 765, business 228, cli 832, ten scripts rc=0; mutants 40/40; skips named, env only. Overlap with 13 and 257 clean. Note 3169, done 3170; #1742 closed c30451; P19 436 comment 639. Correction: the first whole run on ce74477e1 went red 762/764 on the two stale pins; that run is void. Follow-up per mos-1271: row 281 (#1786), a fire or delete revokes host and Gitea grants, Megavolt owns, Dewey reviews; brief docs/plans/2026-10-22_fire-revokes-grants.md; DEFERRED entry points at it.
|
||||
2026-10-22 10:30:51 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 274 #1779 FED R3 broker user principal landing | 274 landed 4c485c63b at 10:28:26Z, a fast-forward on 47a35bf43: six Morgana commits d20c92bf6..4c485c63b. r5 f58cfc361 moved covers, LEVELS and the all marker into business/src/vocabulary.mjs so the broker keeps its sandbox import closure (M16/M16b/M16c). r6 4c485c63b pins USER_VERBS as the ruled seven and widens the R3 off-list set. Dewey approve rev 3178 on manifest 00047b52 (13 paths), comment 30487. Morgana gate under my slot, 10:09-10:22Z: 23 touched files 0 fail, bus 787, harness 151, business 228, cli 832, seat 167, ten scripts rc=0, mutants 22/22; skips named, env only (test-queue 1, test-task 2). Overlap with 13 and 257 clean. Note 3179, done 3180; #1779 closed c30491; P19 414 comment 646. Corrections: the r5 gate on f58cfc361 went red (M3x/M6x survived the R3 off-list set), void; my gate comment 30490 said 24 touched files, the count is 23; the kit comment guessed human-required for the M3x wall, the run code is not-holder.
|
||||
2026-10-22 10:57:34 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 256 #1761 the human deletes a creative instance, landing | before: row 194's deleteRefusal refused every END_PROTECTED definition for every actor, so nobody could delete a creative instance; the human could only delist one with launch: false. After: 256 landed f12441d4f, a fast-forward on 0165be266 (the 274 landing plus its docs and queue commits): four Honker commits b5f1e09d6..f12441d4f, patch-id b28e63746f8c. One protectedRefusal predicate serves delete and the listing's per-viewer endProtected; any non-human actor gets organization-creative-human-only, fire unchanged. Rebased twice (past 236, then past 274), each range-diff 4/4 =, carries checked by Webby (webby-0126, webby-0128). Webby APPROVE on manifest-r3 01eb75aa (10 paths), comment 30519, posted by Sage as jarvis because Webby has no token; review request c30518 (Sage, revs 3183/3184) after Honker's request failed (no token, revs 3181/3182). Gate by Honker under Sage's slot 10:33Z-10:52Z on merge tree ced6bf5f8: touched files 31/0/0, 18 packages 3757/0 (bus 788, business 231, cli 832, webui 335), ten scripts/test-*.sh rc=0, mutants M1, M2, M3, M4a, M4b killed with blob-checked restores. Skips, named and environment-only: webui editor rebuild byte check (esbuild 0.28.1 installed, pin 0.28.2), test-queue non-canonical root, test-task live provider x2. Overlap with in-review rows 13 and 257 clean. Order change sage-2594: 256 landed before 277 because 277's gate had not run. LIVE is still 86f95bb27. Queue note rev 3186, done rev 3187; #1761 closed c30520; P19 416 comment 649.
|
||||
2026-10-22 11:19:28 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 277 #1782 the owner sees a thread agent's claims, landing | before: a thread run's role.claim wrote thread_claims only, and the agents verb read role_claims only, so the owner had no way to see a thread agent's claim (PRD :1083-1084). After: 277 landed 62f53b1e0, a fast-forward on 46dedf925 (the 256 landing plus its docs and queue commits): seven Morgana commits 1d5d00939..62f53b1e0, range patch-id 7f0533520bd2. A bus verb thread.claims serves human and reader sessions; mosaic agents adds thread lines without --tester or --json, --json keeps the agents array, the tester path makes one call, a refused thread.claims prints the role lines and the refusal code, and an error with no bus code still throws. Rebased onto 0165be266, then onto 46dedf925 after 256 landed first (sage-2594); both range-diffs all =, manifest e281aa2c unchanged (duckworth-0126). Duckworth APPROVE comment 30539, recorded rev 3192, posted by Sage as jarvis; review request c30538 (revs 3190/3191) after Morgana's request failed (no token, revs 3188/3189). Gate by Morgana under Sage's slot 11:01:23Z-11:13:56Z: 7 touched files 0 fail (thread-claims 5, message-filter 6, user-principal 22, format 4, tester 11, other-tree 4, host 43), bus 793, cli 836, harness 151, business 231, seat 167, ten scripts/test-*.sh rc=0, M1-M9 killed on committed bytes. Skips named, environment only: test-queue non-canonical root, test-task live provider x2. Overlap with in-review 13 and 257 clean. Duckworth N1 (M8 dies on a rethrown error) to DEFERRED; 0123 N3 per-session claims binds 264a r7. Note rev 3193, done rev 3194; #1782 closed c30540; P19 506 comment 652. Also landed as doc-only picks: Honker's 256 BUILD.md gate results (80620a3a0 as b83173305) and Megavolt's 236 BUILD.md runs (9c6e1a165 as 01ea1fb11). LIVE is still 86f95bb27.
|
||||
|
||||
2026-10-22T11:37:16Z | Gander row278 #1783 implementation prepared, verification held | Before: owner thread claims were visible through row277 but absent from the Console Agents view. After: prepared a separate four-field table, a Console-owned read adapter, section-local refusal handling and an explicit tester refusal before busRead. Ten tests and six unique check definitions are prepared but unrun. Base moved from980cec88c to6af85df4b under sage-2625 on new gander/row278-b; no candidate path overlapped. No Node process, syntax check, test, browser, queue command, push helper or live action ran. Next: Sage CLEAR for the queue claim and gate; Webby reviews the verified manifest.
|
||||
|
||||
2026-10-22T12:09:45.285844+00:00 | Gander row278 run1 void, loader fake repaired | First new-file run stopped3/1/0 because the fake omitted BusReadError imported by base chat.mjs. Sage-2638 places the first-own-test red and permits the assertion-preserving export; test-only commit964b6b184. Runtime bytes unchanged. All run1 results void, no timeout or run leftovers. Run2 must restart every step after busy CLEAR; a second red goes to Sage then Mos before any change. No product acceptance or push claimed.
|
||||
|
||||
### 2026-10-22 | Gander | row278 gate run3
|
||||
|
||||
Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version skip), all ten shell files425/0, touched files15/0, M1-M6 killed6/6. No timeout; sweep0 run-created leftovers. Runs1/2 void. Seven-path manifest8fa859a0 goes to Webby for final review. No landing or live change.
|
||||
|
||||
2026-10-22 11:29:09 UTC | Rocko | V502 carry/rerun on980cec88c: source407c8d7be and packet04a86cf33 match approved8e3c6a79b/9bf4683c6 patch-ids, no conflicts. Dewey0834 carry conditioned on rerun, satisfied under sage2616: stop-run13,processingHTTP6,bustasks9 allgreen (Node28/28),Python4/4,0skips/timeouts. Manifest5758d699,source5/5restored,cwdsweep[]. Doc rerun packet6af85df4b explicitly pushed to rocko/vikunja502-980c-20261022; no live action.
|
||||
|
||||
2026-10-22 11:30:17 UTC | Sage | Vikunja 502 (row 191 follow-up, no queue row) LANDED 6af85df4b, a fast-forward from 980cec88c. Before: the processing failure diagnostics and cleanup in stop-run, processing HTTP and bus tasks tests were Dewey-approved on the pre-194 base only (8e3c6a79b/9bf4683c6). After: Rocko's picks 407c8d7be/04a86cf33 carry the same patch-ids (37135ebe/0dbcda54), plus a doc-only rerun record 6af85df4b. The rerun on the new base was green: stop-run 13/13, processing HTTP 6/6, bus tasks 9/9, Python 4/4, 0 skips. Dewey carried the approve (dewey-0836). mosaic-task.mjs is unchanged, so N7 (runs suite) didn't trigger. Overlap with in-review rows 13 and 257 was clean. LIVE is still 86f95bb27.
|
||||
|
||||
2026-10-22 13:10 UTC | Sage | Rows 278 and 281 LANDED. Before: refactor at 6af85df4b (V502). Row 278 (#1783, Gander, Webby): the Console Agents view shows thread claims in their own section. It landed as 385a7194c at 12:39Z, ff, 9 commits, manifest 8fa859a0. Run 3 was green: bus 793, webui 345/0/1, ten shells 425/0 under the 3x limits (mos-1275), M1-M6 killed. Runs 1 and 2 were void, on fixture fixes 964b6b184 (placed by Sage) and 9696d1fcb (ruled by Mos, mos-1275). Webby approved (c30588, rev 3200). Done rev 3202, #1783 closed c30589. Row 281 (#1786, Megavolt, Dewey): a fire or a delete revokes the instance's host and Gitea grants. It landed as e479521d3 at 13:06Z, ff, 17 commits, manifest b73d4c81. Slot on 7979fb41e: bus 819, business 231, cli 837, dewey-bus 76 with the Docker gitea-grant test, shells green, M1-M22 killed. The M1 hang was fixed at its cause in b4a (mos-1273). Dewey approved (c30614, rev 3207). Done rev 3209, #1786 closed c30621. Skips on both: test-task's row 244 live-provider pair and test-queue's canonical-root check, plus webui's esbuild rebuild test on 278. After: refactor at e479521d3. DEFERRED moves the grant gap to Done and opens Dewey's N1/N2 text gaps. LIVE is still 86f95bb27.
|
||||
|
||||
2026-10-22 14:18:23 UTC | Sage | Row 264a LANDED (#1769, Gizmoduck, Duckworth): sessions per thread, schema 3k-3l. Before: refactor at e479521d3 (row 281). It landed as 84f53540d, ff, 21 commits, manifest 257408e9 (Duckworth approve rev 3214, comment 30640). Gate r13 on 2cc34aef8: 20 touched files, bus 827, cli 837, webui 345/1 named skip, ten shells under 3x limits, mutants M1-M4 killed on assertions. Corrections on the way: the kit stopped on first red, so four reds surfaced one at a time. r10 later3l missed a trigger (mos-1276). T2 had failed since r2 because refusals log action.refused (mos-1277, my sage-2257 wording). threads.test:341 kept the old trigger text (mos-1278). M2 was caught by the store trigger before any assertion, so it now drops the trigger too (mos-1279, four files with the SCHEMA_SHA256 pin). Deferred: actor_run pin binds row 269, esbuild skip to a later gate, session-scoped user reply binds row 272. No live change; LIVE is still 86f95bb27.
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"old_base": "980cec88c",
|
||||
"new_base": "6af85df4b",
|
||||
"old_branch": "gander/row278",
|
||||
"new_branch": "gander/row278-b",
|
||||
"replayed_commits": 0,
|
||||
"source_carried_uncommitted": true,
|
||||
"upstream_source_test_paths": [
|
||||
"packages/bus/tests/tasks.test.mjs",
|
||||
"packages/processing-control/tests/stop-run.test.mjs",
|
||||
"packages/webui/tests/processing.test.mjs"
|
||||
],
|
||||
"overlap_with_candidate_paths": [],
|
||||
"direct_test_file_reads": false,
|
||||
"shared_fixture": "packages/webui/tests/fixture.mjs close export, unchanged upstream",
|
||||
"note": "The focused tests do not import processing.test.mjs, tasks.test.mjs or stop-run.test.mjs, nor their changed fixtures. serve.mjs imports processing-http.mjs, which did not change in this integration. The whole WebUI and bus suites cover the first two changed test files on the new base."
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
# Row278 / #1783: Console thread claims
|
||||
|
||||
Gander, prepared 2026-10-22T11:37:16Z. Reviewer Webby. Brief: docs/plans/2026-10-22_owner-thread-claims.md, section Brief: the Console shows thread claims. Authority sage-2491, design notes gander-0087/0088, Webby acceptances webby-0115/0116 (39c821e7c, 873992a9e), then build instruction sage-2607 after277 landed62f53b1e0. Final277 shape is argument-free [{thread,instance,holder_run,harness,at}], oldest thread first.
|
||||
|
||||
## Current state and boundaries
|
||||
|
||||
Row253 is not mid-run and has no completed C4 gate. It is held unchanged while278 goes first. Already in the seat's isolated worktree; node_modules remains the plain canonical symlink. No install, new runtime dependency, harness launch, live config/unit/port change, credential read, provider call or paid action. Sage registers sessions. Claim and queue-next commands execute Node, so neither ran while another seat holds the slot. The claimant move belongs in the same CLEAR gap as the gate.
|
||||
|
||||
Sage-2625 moved the required base from980cec88c to6af85df4b. New branch gander/row278-b preserves gander/row278 and the row253 branches. There were no row278 commits yet, so the rebase has zero replayed commits; the pending source/test blobs were preserved. BASE-DRIFT.json records upstream's three test paths. No candidate path overlaps. Focused tests do not import/read those test files; shared fixture.mjs close() is unchanged, as is processing-http.mjs imported by serve.mjs. WebUI and bus whole suites include the changed processing.test.mjs and tasks.test.mjs on the new base.
|
||||
|
||||
## Implementation decisions under the accepted design
|
||||
|
||||
- cli.mjs adds only the normal listener's named thread.claims read adapter. It sends no arguments and makes no eligibility guess. views.mjs and testerBus are unchanged. The bus checks human/reader authority. No --send requirement.
|
||||
- serve.mjs has a named read allowlist entry, refuses query arguments, and gives the tester listener explicit403 tester-refused before busRead or any supplied bus callback. GET only; no new write route.
|
||||
- bus.js adds a separate Thread claims table after the unchanged Held roles section. Only thread, holder_run, harness and at are projected through existing text/time escaping. Extra instance/name/body/address fields never render. No s1-agents selector or role count change.
|
||||
- R1: only signed-out escapes the section catch. Every other error, including403, evicts only thread.claims from the existing cache, shows its reason locally and preserves roles. The following stale repaint cannot recover refused claims.
|
||||
- Sign-out uses the existing global data/DOM clearing path. The section also rejects an answer that arrives while signed out and deletes that late cache entry. The sign-out tests check the visible data and subsequent fallback behavior; the late-answer test also waits for JSON consumption.
|
||||
- The section awaits the existing config read before testing known tester mode. This prevents a direct Agents navigation from requesting owner metadata before the tester flag arrives. The server guard is independent of this client display choice.
|
||||
|
||||
## Tests written before implementation, not executed
|
||||
|
||||
Four tests in thread-claims.test.mjs cover read envelope/no-store/no-send, argument and method refusal, malformed/empty/refused answers, tester-socket403 with zero bus calls, and a loader stand-in proving the normal adapter sends thread.claims with no args. Six browser tests cover:
|
||||
|
||||
1. Held/empty/released claims, exact headers/time and byte-equal role section/count before/after refresh.
|
||||
2. HTTP403 plus not-configured and outcome-unknown stay local; a subsequent all-read failure proves old claims cannot return through the stale cache.
|
||||
3. Hostile visible fields are escaped; hostile extra instance/name/body/address fields are absent; no injected DOM nodes or scripts execute.
|
||||
4. A claims401 sign-in-required response uses global sign-out, removes claims/roles and prevents cached re-use.
|
||||
5. The actual tester socket browser retains role rows, renders no owner section, and makes no claims HTTP or bus call.
|
||||
6. A held claims response delivered after sign-out is not displayed or recovered on the next unavailable read.
|
||||
|
||||
The test-first execution order is intentionally held by Sage's no-Node rule. No RED or GREEN observation is claimed. On CLEAR, window.py red restores all three source files to6af85df4b temporarily, runs the named HTTP/section RED cases, then restores byte-identical source and git status. Only intentional missing-feature failures count as RED.
|
||||
|
||||
## Named proposed checks
|
||||
|
||||
M1 removes the section and M2 merges thread rows into roles; both are killed only if the named held/release browser test fails. M3 also rethrows403; the named byte-equal role-section test must kill it. M4 removes the tester guard; the socket test must observe the wrong status/call count. M5 dispatches agents instead of thread.claims; the adapter test checks the exact verb/args. M6 retains the claims cache on refusal; the stale repaint in the local403 test must expose that. UNIQUENESS.json is a source-only count/hash check: all six old strings occur exactly once. It is not kill evidence.
|
||||
|
||||
## Gate prepared, all steps NOTRUN
|
||||
|
||||
On Sage CLEAR: claimant move, syntax preflight, two intended RED cases, both touched files whole, M1-M6 with passing bases and per-change byte-identical restoration, bus whole, webui whole, all ten scripts/test-*.sh. Use TMPDIR from mktemp -d /mnt/storage/scratch/tmp/gXXXXXX, pipefail and tee. Busy check before every start. Log/wrapper names must not match the busy detector. Prepare commands in JSON to keep their text out of wrapper argv. checks.py and window.py were prepared from the proven253 harness but have not run; syntax classification uses node --check only, and runtime failures remain test failures. Per-case timeout is a stop for classification, never silently counted as a kill. Conservative stop on the first unexpected failure and report it to Sage; no retry without a ruling. Return the slot with per-step pass/fail/skip counts, elapsed seconds, kill table and cwd sweep count.
|
||||
|
||||
Manifest digest: d6e1476c8c37f41e7b199175bf9fec84696c950c6f169bb4e5c14286103ca882. Final review is Webby's manifest round; no author self-review replaces it. Static author review so far: examined all three source hunks, request/auth dispatch, local versus global refusal, tester config timing, field projection/escaping and fixture cleanup. git diff --check is the only executed check and finds no whitespace errors. No Node, browser, syntax execution or test has run.
|
||||
|
||||
## Committed candidate under sage-2630
|
||||
|
||||
Source commit e7d21b91b82c6cc1cec0a87995012a87b070b9bf contains all six runnable source/test/doc paths on gander/row278-b. Sage clarifies that invariant8 gates refactor commits, while the seat gate and Webby need a committed candidate tree. The previous packet-only status is superseded. This following commit records the source SHA separately, regenerates the manifest from git blobs and saves sha256sum -c output. Digest remains d6e1476c8c37f41e7b199175bf9fec84696c950c6f169bb4e5c14286103ca882; all six source blobs equal the previously frozen candidate. No Node, test, syntax execution or browser ran. No push until green.
|
||||
|
||||
The accepted first-run stop rule is explicit: a red in our new tests stops and goes to Sage; a red in a test already on refactor goes to Mos before Sage places it (mos-1272). Both categories stop immediately. Expected missing-feature RED observations are the intentional red stage, not unexpected failures. No automatic rerun.
|
||||
|
||||
## Run1 void, test-only repair and run2
|
||||
|
||||
Grant sage-2632: claimant move rev3195 succeeded. Syntax5/0 (0.320s total); two intended RED cases observed (0.265s HTTP404,3.922s missing section) with byte-identical restoration; first new file whole3/1/0 in0.315s. Failure: the adapter loader omitted BusReadError required by the base's chat.mjs import. The runner stopped before the browser whole file or any remaining step. No timeout. Cwd sweep0 run leftovers; the raw match was only pre-existing chrome-devtools-mcp PID2880439, recorded with its start receipt and untouched. No pre-existing test ran red. Reported as gander-0092 and returned the slot.
|
||||
|
||||
Sage-2638 places the first own-test red and approves only the fake export, with all assertions unchanged. Webby-0133 confirms the import graph. Test-only source commit 964b6b1848d3bb5f2c15f9c835eb07783596ced9 adds that export. Run1 is void; no result carries, including intended REDs. New manifest digest 188071d851e1f68297a7160a2bd557d9ca1b2776897ea2dd3b2c910ffd1c1f4a; only the new HTTP/adapter test blob changes. Runtime source and other tests are identical.
|
||||
|
||||
The harness now wraps every controlled node --test invocation with timeout -k10 300. The wrapper's124/137 outcomes are marked timeout, never pass or killed; the outer330s harness wait is a fallback. Each command uses the busy check, pipefail and tee. The source/test-only repair and record commit execute no Node. Run2 may start on own busy CLEAR without another Sage message, under2638. It repeats syntax, both REDs, both files whole, M1-M6, bus whole, webui whole and ten shells. A second unexpected red of any kind goes to Sage before any further change, then Mos under mos-1272. No automatic rerun. A15-minute status and40-minute notice still apply. Run2 numbers follow here after execution; none is claimed yet.
|
||||
|
||||
## Run2 void, awaiting Mos before any repair
|
||||
|
||||
Grant sage-2638 on42abda031/source964b6b184: syntax5/0 in0.320s; expected REDs0.214s and3.772s, restored byte-identically; new HTTP/adapter whole4/0/0 in0.365s; new browser whole6/0/0 in4.023s; M1-M6 killed6/6, survivor0, timeout0, passing bases2.159s and changed runs12.765s; bus whole793/0/0 in23.116s; webui whole344/1/1 in55.324s. All ten shell files NOTRUN. run2/SUMMARY.json is assembled from preserved results and raw logs; KILL-TABLE.md names every check. All results are VOID under sage-2644, with no carry into run3.
|
||||
|
||||
The second unexpected red is pre-existing shell.test.mjs:415, five states on Board, Inbox, Tasks, Agents and Trail, assertion463: Agents normal state expected0 banners, got1. Static read shows stubBus lacks thread.claims. The section correctly shows the resulting local invalid-response banner. Proposed repair is an empty row array and callback in that existing stub, with every assertion unchanged. No repair, source/test/fixture/driver change or rerun has been made while Mos rules. Reported to Sage, Mos and Webby as gander-0094; slot returned. Sweep0 run leftovers, pre-existing chrome-devtools-mcp excluded with evidence from run1.
|
||||
|
||||
Named environment-only skip: editor rebuild from source needs exactly esbuild0.28.2; canonical node_modules has0.28.1. MOSAIC_REQUIRE_EDITOR_BUILD=1 would turn it into a failure. No install attempted; preserve and name this skip in run3.
|
||||
|
||||
Sage-2644 settles nested timeouts: do not edit any scripts/test-*.sh, even temporarily. At the call, wrap each whole file as timeout -k10 900 bash scripts/test-X.sh, which bounds all nested children. No such script was edited or run in run2. The planned harness-only call change will be made after Mos's ruling, before run3. Every direct node --test call already uses timeout -k10 300; command JSONs verify that prefix. Run3 starts from the top after Megavolt and on the granted slot. No Node executes while waiting.
|
||||
|
||||
## Mos-1274 repair and run3 bounds, before execution
|
||||
|
||||
Test-only commit 9696d1fcb78d6082cae8dcb61913225e98c9c138 changes exactly two fixture lines in shell.test.mjs: adds an empty thread.claims row list and the callback using the existing verb() fail/hold path. No assertion changes. No runtime blob changes. This file joins the manifest and the independent whole-file phase, for seven paths and digest 8fa859a0c617defe42e50028b057a603c6634f6db47ac2e3f7c01dfb290228a3. Webby rechecks this digest. No Node or test has executed after the second stop.
|
||||
|
||||
Run3 waits for Sage's slot-to-you after Megavolt. It starts from the top. window.py now includes shell.test.mjs in the touched whole-file phase and wraps each whole shell invocation as timeout -k10 LIMIT bash scripts/test-X.sh. No scripts/test-*.sh bytes are edited. Any such timeout is unplaced to Sage and Mos. A further red or moved existing assertion is likewise unplaced; no automatic rerun.
|
||||
|
||||
Longest receipt selection: scanned every available Gander row196 JSON result/summary at ec1e7fad8 for successful, complete bash whole-file entries with one scripts/test-*.sh argument. This is the recorded-duration set available to this seat, not a claim to all fleet timings. Row278 runs1/2 ran no shell file. Each bound is ceil(3*longest)+120 seconds for headroom against newer-base changes; if no record existed it would be900 per sage-2646. All ten have receipts. SHELL-LIMITS.json records the exact durations, sources, script hashes and consulted set.
|
||||
|
||||
| Whole shell file | Longest recorded seconds | Limit seconds | Receipt |
|
||||
|---|---:|---:|---|
|
||||
| scripts/test-auth.sh | 1.908123 | 126 | ec1e7fad8:agents/gander/work/queue-196/r6/whole-results.json |
|
||||
| scripts/test-conductor.sh | 8.057174 | 145 | ec1e7fad8:agents/gander/work/queue-196/r6/whole-results.json |
|
||||
| scripts/test-config.sh | 3.167892 | 130 | ec1e7fad8:agents/gander/work/queue-196/r6/whole-results.json |
|
||||
| scripts/test-discord.sh | 8.776728 | 147 | ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json |
|
||||
| scripts/test-extension-package.sh | 3.012857 | 130 | ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json |
|
||||
| scripts/test-foundation.sh | 39.708726 | 240 | ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json |
|
||||
| scripts/test-land-work.sh | 12.623263 | 158 | ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json |
|
||||
| scripts/test-queue.sh | 23.443742 | 191 | ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json |
|
||||
| scripts/test-release.sh | 12.168674 | 157 | ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json |
|
||||
| scripts/test-task.sh | 36.783798 | 231 | ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json |
|
||||
|
||||
Run3 numbers will be appended here after execution. Run1/run2 remain void next to their numbers above. No result carries.
|
||||
|
||||
## Run3 green under sage-2648
|
||||
|
||||
Candidate3e4c77ac6, source9696d1fcb, manifest8fa859a0. Fresh run from the top; nothing carried from void runs1/2. Started12:26:46Z and completed verification12:31:45Z,299 wall seconds. No unexpected failure, assertion change or timeout.
|
||||
|
||||
| Step | Pass/fail/skip | Wall seconds |
|
||||
|---|---:|---:|
|
||||
| syntax-0 | 1/0/0 | 0.064 |
|
||||
| syntax-1 | 1/0/0 | 0.064 |
|
||||
| syntax-2 | 1/0/0 | 0.064 |
|
||||
| syntax-3 | 1/0/0 | 0.064 |
|
||||
| syntax-4 | 1/0/0 | 0.064 |
|
||||
| syntax-6 | 1/0/0 | 0.064 |
|
||||
| red-0 | 0/1/0 intended RED | 0.214 |
|
||||
| red-1 | 0/1/0 intended RED | 3.773 |
|
||||
| focused-0 | 4/0/0 | 0.365 |
|
||||
| focused-1 | 6/0/0 | 3.922 |
|
||||
| focused-2 | 5/0/0 | 8.082 |
|
||||
| bus whole | 793/0/0 | 22.463 |
|
||||
| webui whole | 345/0/1 | 56.982 |
|
||||
| scripts/test-auth.sh whole | 15/0/0 | 0.816 |
|
||||
| scripts/test-conductor.sh whole | 17/0/0 | 6.078 |
|
||||
| scripts/test-config.sh whole | 31/0/0 | 1.868 |
|
||||
| scripts/test-discord.sh whole | 81/0/0 | 7.431 |
|
||||
| scripts/test-extension-package.sh whole | 18/0/0 | 1.366 |
|
||||
| scripts/test-foundation.sh whole | 44/0/0 | 39.901 |
|
||||
| scripts/test-land-work.sh whole | 86/0/0 | 11.338 |
|
||||
| scripts/test-queue.sh whole | 28/0/0 | 21.158 |
|
||||
| scripts/test-release.sh whole | 14/0/0 | 2.67 |
|
||||
| scripts/test-task.sh whole | 91/0/0 | 13.843 |
|
||||
|
||||
Syntax6/0. Both intended REDs repeat and restore byte-identical source and tracked status. Touched files whole: new HTTP4/0, new browser6/0, existing shell5/0. M1-M6 killed6/6, survivor0, timeout0, with passing bases and exact restores; run3/KILL-TABLE.md records named killers and times. Bus793/0, WebUI345/0/1, ten shell whole files425/0. Whole-phase reported assertions1563/0/1; this counts shell summary assertions, without adding nested TAP tests again. Focused repeats are listed separately. All direct test command JSONs use timeout -k10 300. Each whole shell command matches its pre-recorded limit exactly. No script changed.
|
||||
|
||||
Named skip: rebuilding from the source gives the same bytes, because esbuild0.28.1 is installed and0.28.2 is required. MOSAIC_REQUIRE_EDITOR_BUILD=1 would fail instead. No dependency install. The log line is saved in SUMMARY.json.
|
||||
|
||||
Sweep:0 run-created leftovers. The broad sweep found eight additional MCP/npm/code-mode processes plus the previously known browser helper; all predate the gate by over an hour. Their11:23:49-11:24:06Z start times are recorded with /proc ticks and UTC ps in run3/sweep.json and preexisting-processes.txt; initial broad output retained. Nothing signalled. Source and all ten script hashes still match their frozen values. No product/test bytes changed during the gate.
|
||||
|
||||
Seven-path manifest remains8fa859a0c617defe42e50028b057a603c6634f6db47ac2e3f7c01dfb290228a3. Records commit follows; publish own branch only under sage-2648, then hand directly to Webby and Sage. BUILD-LOG stays outside the landing manifest.
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"packages/webui/src/cli.mjs": "7ac85787f614aabce4b8eccef01fcdbf1018003e806c5de97d40f47c4041710a",
|
||||
"packages/webui/src/serve.mjs": "aa25b50543b5bc632ac984e85b0d8b43b1c9af2d617bfc7c19351d07310f396d",
|
||||
"packages/webui/src/public/bus.js": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"packages/webui/tests/thread-claims.test.mjs": "48117fe02ef9b76ad12f15dfb0d25e77d187c088c0bff572f33e18418e566913",
|
||||
"packages/webui/tests/thread-claims-browser.test.mjs": "3b2770db03a2fcce87512b600f386a51f822b251ccb992a46208ee484ee99f7e",
|
||||
"packages/webui/README.md": "426007525d15ad0fa11ba02d6cc5d8436c7ff3fa38beb01e9a651c202169d6a5",
|
||||
"packages/webui/tests/shell.test.mjs": "fd7ad903b682f8f6ceee2d75111b01aa97f50233cd875dd5553e3e83de33ce32"
|
||||
}
|
||||
@@ -0,0 +1,273 @@
|
||||
--- a/packages/webui/src/cli.mjs
|
||||
+++ b/packages/webui/src/cli.mjs
|
||||
@@ -86 +86,3 @@
|
||||
- bus = { ...views({ call }), names: () => call('names'), instances: () => call('instances'), routes: () => call('routes') };
|
||||
+ // Row 278: this owner/reader read belongs to the Console, not the shared
|
||||
+ // role views or the tester adapter. The bus decides caller eligibility.
|
||||
+ bus = { ...views({ call }), names: () => call('names'), instances: () => call('instances'), routes: () => call('routes'), 'thread.claims': () => call('thread.claims') };
|
||||
--- a/packages/webui/src/serve.mjs
|
||||
+++ b/packages/webui/src/serve.mjs
|
||||
@@ -64 +64 @@
|
||||
-const BUS_VERBS = ['inbox', 'tasks', 'agents', 'trail', 'decisions', 'credentials', 'replies', 'messages', 'usage', 'limits', 'names', 'instances', 'routes'];
|
||||
+const BUS_VERBS = ['inbox', 'tasks', 'agents', 'thread.claims', 'trail', 'decisions', 'credentials', 'replies', 'messages', 'usage', 'limits', 'names', 'instances', 'routes'];
|
||||
@@ -71,0 +72 @@
|
||||
+ if (verb === 'thread.claims' && search) return json(res, 400, { error: 'invalid-request', message: 'thread.claims takes no arguments' });
|
||||
@@ -737,0 +739,2 @@
|
||||
+ // Owner/reader metadata is never a tester read, even with a supplied bus.
|
||||
+ if (tester && verb === 'thread.claims') return json(res, 403, { error: 'tester-refused' });
|
||||
--- a/packages/webui/src/public/bus.js
|
||||
+++ b/packages/webui/src/public/bus.js
|
||||
@@ -271,0 +272 @@
|
||||
+ let configRead = Promise.resolve();
|
||||
@@ -471,0 +473,18 @@
|
||||
+ // Row 278: a claims refusal belongs to this section. Only sign-out reaches
|
||||
+ // the global handler; a 403 here must not forget the successful role read.
|
||||
+ async function threadClaimsSection(get) {
|
||||
+ await configRead;
|
||||
+ if (isTester) return '';
|
||||
+ const title = '<h2 id="b-thread-claims">Thread claims</h2>';
|
||||
+ try {
|
||||
+ const claims = await get('thread.claims');
|
||||
+ if (out()) { last.delete('thread.claims'); throw signedOut(); }
|
||||
+ if (!claims.every(c => c && ['thread', 'holder_run', 'harness', 'at'].every(k => typeof c[k] === 'string'))) throw new ReadError('invalid-response', '');
|
||||
+ const rows = claims.map(c => `<tr><th scope="row">${txt(c.thread)}</th><td>${txt(c.holder_run)}</td><td>${txt(c.harness)}</td><td>${when(c.at)}</td></tr>`).join('');
|
||||
+ return `<section aria-labelledby="b-thread-claims">${title}${claims.length ? `<div class="table-wrap" tabindex="0" role="region" aria-label="Thread claims, scroll for all columns"><table class="s1-table s1-thread-claims"><thead><tr>${['Thread', 'Holder run', 'Harness', 'Claimed at'].map(h => `<th scope="col">${h}</th>`).join('')}</tr></thead><tbody>${rows}</tbody></table></div>` : empty('No thread claim is held right now.', 'A thread appears while a run holds its claim on the bus.')}</section>`;
|
||||
+ } catch (err) {
|
||||
+ if (err.code === 'signed-out') throw err;
|
||||
+ last.delete('thread.claims');
|
||||
+ return `<section aria-labelledby="b-thread-claims">${title}<div class="banner err" role="alert"><p>${why(err)}</p>${retry}</div></section>`;
|
||||
+ }
|
||||
+ }
|
||||
@@ -473,0 +493 @@
|
||||
+ const threadSection = await threadClaimsSection(get);
|
||||
@@ -477,0 +498 @@
|
||||
+ ${threadSection}
|
||||
@@ -1296 +1317 @@
|
||||
- fetch('/api/config', { cache: 'no-store', redirect: 'manual' }).then(r => { if (r.type === 'opaqueredirect') { signOut(); return null; } return r.json(); }).then(c => {
|
||||
+ configRead = fetch('/api/config', { cache: 'no-store', redirect: 'manual' }).then(r => { if (r.type === 'opaqueredirect') { signOut(); return null; } return r.json(); }).then(c => {
|
||||
--- /dev/null
|
||||
+++ b/packages/webui/tests/thread-claims.test.mjs
|
||||
@@ -0,0 +1,68 @@
|
||||
+// Row 278 (#1783): Console-owned read adapter and the listener boundary.
|
||||
+// All listeners and config are fixtures; no live bus or host configuration.
|
||||
+import test from 'node:test';
|
||||
+import assert from 'node:assert/strict';
|
||||
+import { spawnSync } from 'node:child_process';
|
||||
+import { readFileSync, writeFileSync } from 'node:fs';
|
||||
+import { join } from 'node:path';
|
||||
+import { tmp, fixture } from '../../cli/tests/helpers.mjs';
|
||||
+import { startServer } from '../src/serve.mjs';
|
||||
+import { startTesterSocket } from '../src/tester-socket.mjs';
|
||||
+import { testerRequest } from '../../cli/src/tester-http.mjs';
|
||||
+import { BusReadError } from '../src/bus.mjs';
|
||||
+import { close } from './fixture.mjs';
|
||||
+
|
||||
+const rows = [{ thread: '11111111-1111-4111-8111-111111111111', instance: 'assistant', holder_run: 'thread-run', harness: 'pi', at: '2026-01-01T00:00:00Z' }];
|
||||
+
|
||||
+test('row278 HTTP read returns held claims without send and refuses arguments before the bus', async t => {
|
||||
+ const calls = [];
|
||||
+ const bus = { 'thread.claims': async arg => { calls.push(arg); return rows; } };
|
||||
+ const web = await startServer({ port: 0, board: 'http://127.0.0.1:9', bus });
|
||||
+ t.after(() => close(web));
|
||||
+ const url = `http://127.0.0.1:${web.address().port}/api/bus/thread.claims`;
|
||||
+ const result = await fetch(url);
|
||||
+ assert.equal(result.status, 200); assert.equal(result.headers.get('cache-control'), 'no-store');
|
||||
+ const body = await result.json(); assert.deepEqual(body.rows, rows); assert.ok(body.at);
|
||||
+ assert.deepEqual(calls, [undefined]);
|
||||
+ for (const query of ['?thread=one', '?subject=one', '?limit=1', '?unknown=']) {
|
||||
+ const r = await fetch(url + query); assert.equal(r.status, 400); assert.equal((await r.json()).error, 'invalid-request');
|
||||
+ }
|
||||
+ assert.equal((await fetch(url, { method: 'POST' })).status, 405);
|
||||
+ assert.equal(calls.length, 1);
|
||||
+});
|
||||
+
|
||||
+test('row278 HTTP read preserves bus refusal and rejects a malformed result', async t => {
|
||||
+ let value = new BusReadError('human-required');
|
||||
+ const web = await startServer({ port: 0, bus: { 'thread.claims': async () => { if (value instanceof Error) throw value; return value; } } });
|
||||
+ t.after(() => close(web));
|
||||
+ const url = `http://127.0.0.1:${web.address().port}/api/bus/thread.claims`;
|
||||
+ let r = await fetch(url); assert.equal(r.status, 403); assert.equal((await r.json()).error, 'human-required');
|
||||
+ value = {};
|
||||
+ r = await fetch(url); assert.equal(r.status, 502); assert.equal((await r.json()).error, 'invalid-response');
|
||||
+ value = [];
|
||||
+ r = await fetch(url); assert.equal(r.status, 200); assert.deepEqual((await r.json()).rows, []);
|
||||
+});
|
||||
+
|
||||
+test('row278 tester socket refuses thread claims explicitly with zero bus calls', async t => {
|
||||
+ const dataRoot = tmp(t, 'claims-tester-'); let calls = 0;
|
||||
+ const web = await startTesterSocket({ dataRoot, bus: { 'thread.claims': async () => { calls++; return rows; } } });
|
||||
+ t.after(() => close(web));
|
||||
+ const r = await testerRequest({ dataRoot, path: '/api/bus/thread.claims' });
|
||||
+ assert.equal(r.status, 403); assert.equal(r.body.error, 'tester-refused'); assert.equal(calls, 0);
|
||||
+});
|
||||
+
|
||||
+test('row278 Console adapter calls argument-free thread.claims through the normal transport', t => {
|
||||
+ const root = tmp(t, 'claims-cli-'), f = fixture(root), log = join(root, 'calls.jsonl'), hook = join(root, 'hooks.mjs');
|
||||
+ writeFileSync(log, '');
|
||||
+ const serveSource = `export const DEFAULT_BOARD='http://127.0.0.1:9';export const previewOptions=()=>null;export const proofOptions=()=>null;export async function startServer(o){await o.bus['thread.claims']();return {address:()=>({port:0}),close:()=>{}};}`;
|
||||
+ const busSource = `import {appendFileSync} from 'node:fs';export class BusReadError extends Error{};export const busCaller=o=>async(verb,...args)=>{appendFileSync(${JSON.stringify(log)},JSON.stringify({verb,args,tester:!!o.cli})+'\\n');return [];};`;
|
||||
+ writeFileSync(hook, `import {registerHooks} from 'node:module';registerHooks({load(url,context,next){
|
||||
+ if(url.endsWith('/webui/src/serve.mjs'))return {format:'module',shortCircuit:true,source:${JSON.stringify(serveSource)}};
|
||||
+ if(url.endsWith('/webui/src/bus.mjs'))return {format:'module',shortCircuit:true,source:${JSON.stringify(busSource)}};
|
||||
+ return next(url,context);
|
||||
+ }});`);
|
||||
+ const r = spawnSync(process.execPath, [new URL('../src/cli.mjs', import.meta.url).pathname, 'serve', '--business', 'acme', '--port', '0'],
|
||||
+ { env: { ...f.env, NODE_OPTIONS: `--import=${hook}` }, encoding: 'utf8', timeout: 10000 });
|
||||
+ assert.equal(r.status, 0, r.stdout + r.stderr);
|
||||
+ assert.deepEqual(readFileSync(log, 'utf8').trim().split('\n').map(JSON.parse), [{ verb: 'thread.claims', args: [], tester: false }]);
|
||||
+});
|
||||
--- /dev/null
|
||||
+++ b/packages/webui/tests/thread-claims-browser.test.mjs
|
||||
@@ -0,0 +1,132 @@
|
||||
+// Row 278: real Console rendering and HTTP with mutable bus-answer stand-ins.
|
||||
+// Broker claim/release semantics are covered by row 277; this tests the reader.
|
||||
+import test from 'node:test';
|
||||
+import assert from 'node:assert/strict';
|
||||
+import { startServer } from '../src/serve.mjs';
|
||||
+import { BusReadError } from '../src/bus.mjs';
|
||||
+import { fixture, close } from './fixture.mjs';
|
||||
+import { browser } from './browser.mjs';
|
||||
+import { startTesterSocket, TESTER_ORIGIN } from '../src/tester-socket.mjs';
|
||||
+import { testerBrowser } from './tester-browser-fixture.mjs';
|
||||
+import { tmp } from '../../cli/tests/helpers.mjs';
|
||||
+
|
||||
+const AT = '2026-01-01T00:00:00Z';
|
||||
+const THREAD = '11111111-1111-4111-8111-111111111111';
|
||||
+const claim = { thread: THREAD, holder_run: 'thread-run', harness: 'pi', at: AT };
|
||||
+async function setup(t) {
|
||||
+ const f = await fixture(); t.after(() => f.close());
|
||||
+ const state = { rows: [], failure: null, offline: false, calls: [], hold: false, release: null };
|
||||
+ t.after(() => { state.hold = false; state.release?.(); });
|
||||
+ const role = { role: 'coder', holder_run: 'role-run', harness: 'pi', at: AT, state: 'idle', inputNeeded: [] };
|
||||
+ const read = (verb, answer) => async () => {
|
||||
+ state.calls.push(verb);
|
||||
+ if (state.offline) throw new BusReadError('outcome-unknown');
|
||||
+ if (verb === 'thread.claims' && state.failure) throw new BusReadError(state.failure);
|
||||
+ if (verb === 'thread.claims' && state.hold) await new Promise(resolve => { state.release = resolve; });
|
||||
+ return typeof answer === 'function' ? answer() : answer;
|
||||
+ };
|
||||
+ const bus = { agents: read('agents', [role]), inbox: read('inbox', []), messages: read('messages', { messages: [], unread: 0 }), 'thread.claims': read('thread.claims', () => state.rows) };
|
||||
+ const web = await startServer({ port: 0, board: f.boardURL, bus }); t.after(() => close(web));
|
||||
+ const b = await browser(); t.after(() => b.close());
|
||||
+ const wait = expression => b.evaluate(`(async()=>{for(let i=0;i<100;i++){if(${expression})return true;await new Promise(r=>setTimeout(r,30));}throw Error(${JSON.stringify(expression)})})()`);
|
||||
+ await b.navigate(`http://127.0.0.1:${web.address().port}/#/agents`);
|
||||
+ await wait(`!!document.querySelector('#b-thread-claims')`);
|
||||
+ const roleHtml = () => b.evaluate(`document.querySelector('[aria-labelledby="b-claims"]').outerHTML`);
|
||||
+ const refresh = () => b.evaluate(`document.querySelector('#refresh').click(),true`);
|
||||
+ return { b, state, wait, roleHtml, refresh };
|
||||
+}
|
||||
+
|
||||
+test('row278 browser lists held claims and release preserves role rows and totals', async t => {
|
||||
+ const { b, state, wait, roleHtml, refresh } = await setup(t);
|
||||
+ const before = await roleHtml();
|
||||
+ assert.match(await b.evaluate(`document.querySelector('[aria-labelledby="b-thread-claims"]').textContent`), /No thread claim is held/);
|
||||
+ state.rows = [claim]; await refresh();
|
||||
+ await wait(`document.querySelector('.s1-thread-claims tbody')?.textContent.includes('${THREAD}')`);
|
||||
+ assert.deepEqual(await b.evaluate(`Array.from(document.querySelectorAll('.s1-thread-claims thead th'),e=>e.textContent)`), ['Thread', 'Holder run', 'Harness', 'Claimed at']);
|
||||
+ assert.equal(await b.evaluate(`document.querySelector('#b-claims .count').textContent`), '1');
|
||||
+ assert.equal(await roleHtml(), before);
|
||||
+ assert.equal(await b.evaluate(`document.querySelector('.s1-thread-claims time').dateTime`), AT);
|
||||
+ state.rows = []; await refresh();
|
||||
+ await wait(`document.querySelector('[aria-labelledby="b-thread-claims"]').textContent.includes('No thread claim is held')`);
|
||||
+ assert.equal(await b.evaluate(`document.querySelectorAll('.s1-thread-claims tbody tr').length`), 0);
|
||||
+ assert.equal(await roleHtml(), before);
|
||||
+});
|
||||
+
|
||||
+test('row278 browser claims 403 stays local and role section remains byte-equal', async t => {
|
||||
+ const { b, state, wait, roleHtml, refresh } = await setup(t);
|
||||
+ const before = await roleHtml(); state.rows = [claim]; await refresh();
|
||||
+ await wait(`!!document.querySelector('.s1-thread-claims tbody tr')`);
|
||||
+ for (const code of ['human-required', 'not-configured', 'outcome-unknown']) {
|
||||
+ state.failure = code; await refresh();
|
||||
+ await wait(`document.querySelector('[aria-labelledby="b-thread-claims"] code')?.textContent===${JSON.stringify(code)}`);
|
||||
+ assert.equal(await roleHtml(), before, code);
|
||||
+ assert.equal(await b.evaluate(`document.querySelector('#b-claims .count').textContent`), '1');
|
||||
+ assert.equal(await b.evaluate(`document.querySelectorAll('.s1-thread-claims tbody tr').length`), 0, 'failed read drops claims only');
|
||||
+ }
|
||||
+ state.offline = true; await refresh();
|
||||
+ await wait(`!!document.querySelector('.s1-stale') && document.querySelector('[aria-labelledby="b-thread-claims"] code')?.textContent==='not-read'`);
|
||||
+ assert.equal(await roleHtml(), before, 'other reads may use the kept role section');
|
||||
+ assert.equal(await b.evaluate(`document.querySelectorAll('.s1-thread-claims tbody tr').length`), 0, 'a later stale repaint must not recover refused claims');
|
||||
+});
|
||||
+
|
||||
+test('row278 browser renders only four escaped claim fields and never instance or other extras', async t => {
|
||||
+ const { b, state, wait, refresh } = await setup(t);
|
||||
+ const hostile = '<img src=x onerror="window.claimInjected=1">';
|
||||
+ state.rows = [{ ...claim, thread: hostile, holder_run: '<script>window.claimInjected=2</script>', harness: '<b>pi</b>',
|
||||
+ instance: 'NEVER_INSTANCE', name: 'NEVER_THREAD_NAME', body: 'NEVER_MESSAGE_BODY', address: 'NEVER_ADDRESS' }];
|
||||
+ await refresh(); await wait(`document.querySelector('.s1-thread-claims tbody')?.textContent.includes('onerror')`);
|
||||
+ const text = await b.evaluate(`document.querySelector('[aria-labelledby="b-thread-claims"]').textContent`);
|
||||
+ assert.ok(text.includes(hostile)); assert.ok(text.includes('<script>window.claimInjected=2</script>')); assert.ok(text.includes('<b>pi</b>'));
|
||||
+ assert.doesNotMatch(text, /NEVER_INSTANCE|NEVER_THREAD_NAME|NEVER_MESSAGE_BODY|NEVER_ADDRESS/);
|
||||
+ assert.equal(await b.evaluate(`document.querySelectorAll('.s1-thread-claims tbody tr > *').length`), 4);
|
||||
+ assert.equal(await b.evaluate(`document.querySelectorAll('.s1-thread-claims script,.s1-thread-claims img,.s1-thread-claims b').length`), 0);
|
||||
+ assert.equal(await b.evaluate(`!!window.claimInjected`), false);
|
||||
+});
|
||||
+
|
||||
+test('row278 browser sign-out removes claims and prevents reuse of cached answers', async t => {
|
||||
+ const { b, state, wait, refresh } = await setup(t);
|
||||
+ state.rows = [claim]; await refresh(); await wait(`!!document.querySelector('.s1-thread-claims tbody tr')`);
|
||||
+ await b.evaluate(`window.claimFetch=fetch;window.fetch=(url,options)=>url==='/api/bus/thread.claims'?Promise.resolve(new Response(JSON.stringify({error:'sign-in required'}),{status:401})):window.claimFetch(url,options);true`);
|
||||
+ await refresh();
|
||||
+ await wait(`document.body.classList.contains('signed-out') && !document.querySelector('#b-thread-claims')`);
|
||||
+ const calls = state.calls.length; await refresh(); assert.equal(state.calls.length, calls);
|
||||
+ // Simulate returning to the route while the bus is unavailable. A cache that
|
||||
+ // survived sign-out would repopulate the held thread from reader(false).
|
||||
+ state.offline = true;
|
||||
+ await b.evaluate(`window.fetch=window.claimFetch;document.body.classList.remove('signed-out');location.hash='#/agents?after-signout=1';true`);
|
||||
+ await wait(`document.querySelector('#bus-view h1')?.textContent==='The read failed'`);
|
||||
+ assert.doesNotMatch(await b.evaluate(`document.querySelector('#bus-view').textContent`), new RegExp(THREAD));
|
||||
+});
|
||||
+
|
||||
+test('row278 tester browser keeps role rows without requesting the owner claims section', async t => {
|
||||
+ const dataRoot = tmp(t, 'claims-view-'), calls = [], reads = [];
|
||||
+ const web = await startTesterSocket({ dataRoot, board: 'http://127.0.0.1:9', bus: {
|
||||
+ agents: async () => [{ role: 'coder', holder_run: 'role-run', harness: 'pi', at: AT }],
|
||||
+ messages: async () => ({ messages: [], unread: 0 }),
|
||||
+ 'thread.claims': async () => { calls.push('thread.claims'); return [claim]; },
|
||||
+ } });
|
||||
+ t.after(() => close(web));
|
||||
+ const b = await testerBrowser(web); t.after(() => b.close());
|
||||
+ b.on('Fetch.requestPaused', ({ request }) => { if (new URL(request.url).pathname === '/api/bus/thread.claims') reads.push(request.url); });
|
||||
+ await b.navigate(TESTER_ORIGIN + '/#/agents');
|
||||
+ await b.evaluate(`(async()=>{for(let i=0;i<100;i++){if(document.querySelector('#tester-banner')&&document.querySelector('.s1-agents tbody tr'))return true;await new Promise(r=>setTimeout(r,30));}throw Error('tester Agents view did not render')})()`);
|
||||
+ assert.equal(await b.evaluate(`document.querySelector('#b-claims .count').textContent`), '1');
|
||||
+ assert.equal(await b.evaluate(`document.querySelector('#b-thread-claims')===null`), true);
|
||||
+ assert.deepEqual(calls, []);
|
||||
+ assert.deepEqual(reads, []);
|
||||
+});
|
||||
+
|
||||
+test('row278 browser discards a late claims answer after sign-out', async t => {
|
||||
+ const { b, state, wait, refresh } = await setup(t);
|
||||
+ await b.evaluate(`window.claimFetch=fetch;window.fetch=async(url,options)=>{const r=await window.claimFetch(url,options);if(url==='/api/bus/thread.claims'){const json=r.json.bind(r);r.json=async()=>{const body=await json();window.lateClaimsFinished=true;return body;};}return r;};true`);
|
||||
+ state.rows = [claim]; state.hold = true; await refresh();
|
||||
+ for (let n = 0; !state.release && n < 100; n++) await new Promise(resolve => setTimeout(resolve, 10));
|
||||
+ assert.equal(typeof state.release, 'function');
|
||||
+ await b.evaluate(`document.dispatchEvent(new Event('mosaic-signed-out')),true`);
|
||||
+ state.release(); state.hold = false;
|
||||
+ await wait(`window.lateClaimsFinished && document.body.classList.contains('signed-out') && !document.querySelector('#b-thread-claims')`);
|
||||
+ state.offline = true;
|
||||
+ await b.evaluate(`window.fetch=window.claimFetch;document.body.classList.remove('signed-out');location.hash='#/agents?late-answer=1';true`);
|
||||
+ await wait(`document.querySelector('#bus-view h1')?.textContent==='The read failed'`);
|
||||
+ assert.doesNotMatch(await b.evaluate(`document.querySelector('#bus-view').textContent`), new RegExp(THREAD));
|
||||
+});
|
||||
--- a/packages/webui/README.md
|
||||
+++ b/packages/webui/README.md
|
||||
@@ -384,0 +385,9 @@
|
||||
+The same view has a separate **Thread claims** section (row 278, #1783).
|
||||
+It reads `thread.claims` and shows thread id, holder run, harness and claim time,
|
||||
+in the bus's order. Thread names, messages, instance and address are not shown.
|
||||
+An empty read has an empty-state line. A refused or failed read clears only
|
||||
+this section's kept claims and shows its reason; the held roles and their
|
||||
+count stay intact. Sign-out clears the claims with the other bus reads.
|
||||
+The read needs no `--send`. The bus permits human and reader sessions;
|
||||
+the tester listener refuses it with HTTP 403 `tester-refused` before any bus call.
|
||||
+
|
||||
--- a/packages/webui/tests/shell.test.mjs
|
||||
+++ b/packages/webui/tests/shell.test.mjs
|
||||
@@ -97 +97 @@
|
||||
- const rows = { inbox: [], tasks: [], agents: [], trail: [] };
|
||||
+ const rows = { inbox: [], tasks: [], agents: [], trail: [], 'thread.claims': [] };
|
||||
@@ -101 +101 @@
|
||||
- return { rows, hold, fail: code => { fail = code; }, bus: { inbox: verb('inbox'), tasks: verb('tasks'), agents: verb('agents'), trail: verb('trail') } };
|
||||
+ return { rows, hold, fail: code => { fail = code; }, bus: { inbox: verb('inbox'), tasks: verb('tasks'), agents: verb('agents'), trail: verb('trail'), 'thread.claims': verb('thread.claims') } };
|
||||
@@ -0,0 +1,11 @@
|
||||
# Row278 committed candidate manifest, run3
|
||||
|
||||
Base6af85df4b, branch gander/row278-b. Runnable source commit 9696d1fcb78d6082cae8dcb61913225e98c9c138. Original runtime source remains e7d21b91b, unchanged. The assertion-preserving test repairs are964b6b184 (new adapter loader) and9696d1fcb (existing shell fixture, authorized mos-1274).
|
||||
|
||||
Seven manifest paths are pinned from committed blobs; shell.test.mjs is now included. Digest 8fa859a0c617defe42e50028b057a603c6634f6db47ac2e3f7c01dfb290228a3. SOURCE.json identifies the source reference. sha256sum -c verifies the working tree matches the source commit. CANDIDATE.patch matches the complete pending change from the base.
|
||||
|
||||
Run1 and run2 are void. Run3 must repeat syntax, both expected REDs, all three touched test files whole, M1-M6, bus and webui whole, and ten whole shell files. Direct Node test calls use timeout -k10 300. The whole shell-file calls use their SHELL-LIMITS.json value, derived and recorded in BUILD.md, with no script edit. No Node or test has run since the second stop. Sage grants the slot after Megavolt.
|
||||
|
||||
A further unexpected red, any moved existing assertion or a shell timeout goes to Sage and Mos unplaced, with no change/rerun. The editor rebuild environment skip (installed esbuild0.28.1 versus required0.28.2) stays named; no install. No push until green. BUILD-LOG is excluded from the landing manifest and lands as a doc-only append after code.
|
||||
|
||||
Run3 is now GREEN under sage-2648 on3e4c77ac6. run3/SUMMARY.json, raw command/log files and KILL-TABLE.md are the acceptance records. Bus793/0, WebUI345/0/1 (named esbuild version skip), ten shells425/0, touched whole files15/0, M1-M6 killed6/6, no timeout, sweep0 run-created leftovers. Source/test/script bytes match the pinned candidate. Run1/run2 remain void. Webby final manifest review is next after publication.
|
||||
@@ -0,0 +1,7 @@
|
||||
426007525d15ad0fa11ba02d6cc5d8436c7ff3fa38beb01e9a651c202169d6a5 packages/webui/README.md
|
||||
7ac85787f614aabce4b8eccef01fcdbf1018003e806c5de97d40f47c4041710a packages/webui/src/cli.mjs
|
||||
c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0 packages/webui/src/public/bus.js
|
||||
aa25b50543b5bc632ac984e85b0d8b43b1c9af2d617bfc7c19351d07310f396d packages/webui/src/serve.mjs
|
||||
fd7ad903b682f8f6ceee2d75111b01aa97f50233cd875dd5553e3e83de33ce32 packages/webui/tests/shell.test.mjs
|
||||
3b2770db03a2fcce87512b600f386a51f822b251ccb992a46208ee484ee99f7e packages/webui/tests/thread-claims-browser.test.mjs
|
||||
48117fe02ef9b76ad12f15dfb0d25e77d187c088c0bff572f33e18418e566913 packages/webui/tests/thread-claims.test.mjs
|
||||
@@ -0,0 +1,101 @@
|
||||
{
|
||||
"authority": [
|
||||
"mos-1274",
|
||||
"sage-2646"
|
||||
],
|
||||
"scope": "Longest durations in all available Gander row196 successful whole-file receipts at ec1e7fad8; run1/run2 of row278 ran no shells.",
|
||||
"consulted_records": [
|
||||
"ec1e7fad8:agents/gander/work/queue-196/evidence/suite-results-run1.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/evidence/suite-results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r2/mutants/results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r2/run2/base-results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r2/run2/killers/results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r3/gate/base-results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r3/gate/killers/results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r3/gate/sso-results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r4/gate/base-results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r4/gate/killers/results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r4/gate/sso-results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r4/gate/whole-results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r5/gate/whole-results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r5/resume/summary.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r6/base-results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r6/first-attempt/results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r6/killers/results.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r6/summary.json",
|
||||
"ec1e7fad8:agents/gander/work/queue-196/r6/whole-results.json"
|
||||
],
|
||||
"scripts": {
|
||||
"scripts/test-auth.sh": {
|
||||
"recorded_duration_seconds": 1.9081228229999543,
|
||||
"receipt": "ec1e7fad8:agents/gander/work/queue-196/r6/whole-results.json",
|
||||
"limit_seconds": 126,
|
||||
"derivation": "ceil(3 * longest successful whole-file receipt) + 120s headroom",
|
||||
"script_sha256": "dd4720cb0cbecd2fc523a318f2222d21d257c8c5889996a3d69e522ee971a707"
|
||||
},
|
||||
"scripts/test-conductor.sh": {
|
||||
"recorded_duration_seconds": 8.057173820000026,
|
||||
"receipt": "ec1e7fad8:agents/gander/work/queue-196/r6/whole-results.json",
|
||||
"limit_seconds": 145,
|
||||
"derivation": "ceil(3 * longest successful whole-file receipt) + 120s headroom",
|
||||
"script_sha256": "da84150467494a4c979759f400854411bd93a7efce981139757bf526d688a23b"
|
||||
},
|
||||
"scripts/test-config.sh": {
|
||||
"recorded_duration_seconds": 3.1678915339999367,
|
||||
"receipt": "ec1e7fad8:agents/gander/work/queue-196/r6/whole-results.json",
|
||||
"limit_seconds": 130,
|
||||
"derivation": "ceil(3 * longest successful whole-file receipt) + 120s headroom",
|
||||
"script_sha256": "3301c1fabf616bb961d62f6decd0a46dadb0f399b8ba7f3c2ca60023d2b24c78"
|
||||
},
|
||||
"scripts/test-discord.sh": {
|
||||
"recorded_duration_seconds": 8.776727847000002,
|
||||
"receipt": "ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json",
|
||||
"limit_seconds": 147,
|
||||
"derivation": "ceil(3 * longest successful whole-file receipt) + 120s headroom",
|
||||
"script_sha256": "a5dcf783c51a5d5d184a357f91ebf9fa1c4e054f0cb84a3d1d7668f6156e025e"
|
||||
},
|
||||
"scripts/test-extension-package.sh": {
|
||||
"recorded_duration_seconds": 3.01285702399991,
|
||||
"receipt": "ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json",
|
||||
"limit_seconds": 130,
|
||||
"derivation": "ceil(3 * longest successful whole-file receipt) + 120s headroom",
|
||||
"script_sha256": "5d7b687f16fd1a9414b229501177d530ba3af4eadd3cac319b33f38fdba9bf99"
|
||||
},
|
||||
"scripts/test-foundation.sh": {
|
||||
"recorded_duration_seconds": 39.70872647900006,
|
||||
"receipt": "ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json",
|
||||
"limit_seconds": 240,
|
||||
"derivation": "ceil(3 * longest successful whole-file receipt) + 120s headroom",
|
||||
"script_sha256": "2e11038e7f784ec4f539eb768f63bab0fab9c9940334388a1fe2d47ab9e2b008"
|
||||
},
|
||||
"scripts/test-land-work.sh": {
|
||||
"recorded_duration_seconds": 12.623263413000037,
|
||||
"receipt": "ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json",
|
||||
"limit_seconds": 158,
|
||||
"derivation": "ceil(3 * longest successful whole-file receipt) + 120s headroom",
|
||||
"script_sha256": "c9d1d5c9b006d5c12e5f796a9828361059f8e0410846fc55c070c0148b15cef4"
|
||||
},
|
||||
"scripts/test-queue.sh": {
|
||||
"recorded_duration_seconds": 23.443742031000088,
|
||||
"receipt": "ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json",
|
||||
"limit_seconds": 191,
|
||||
"derivation": "ceil(3 * longest successful whole-file receipt) + 120s headroom",
|
||||
"script_sha256": "c270f181d1fa8b6d42ff4131c339beba786a8fd620bb66f8afdcec05e8b10868"
|
||||
},
|
||||
"scripts/test-release.sh": {
|
||||
"recorded_duration_seconds": 12.168674453999964,
|
||||
"receipt": "ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json",
|
||||
"limit_seconds": 157,
|
||||
"derivation": "ceil(3 * longest successful whole-file receipt) + 120s headroom",
|
||||
"script_sha256": "be706dff832257bd4781abeabd19faa4ac16edf9a4af0c96457e33cf3bb6deb3"
|
||||
},
|
||||
"scripts/test-task.sh": {
|
||||
"recorded_duration_seconds": 36.783798266,
|
||||
"receipt": "ec1e7fad8:agents/gander/work/queue-196/r5/resume/whole-results.json",
|
||||
"limit_seconds": 231,
|
||||
"derivation": "ceil(3 * longest successful whole-file receipt) + 120s headroom",
|
||||
"script_sha256": "10c4abb70bf9b83e617089b06a5436cc7fa6b866a176458b22128c3a15163f94"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"source_commit": "9696d1fcb78d6082cae8dcb61913225e98c9c138",
|
||||
"runtime_commit": "e7d21b91b82c6cc1cec0a87995012a87b070b9bf",
|
||||
"new_test_fix_commit": "964b6b1848d3bb5f2c15f9c835eb07783596ced9",
|
||||
"legacy_fixture_fix_commit": "9696d1fcb78d6082cae8dcb61913225e98c9c138",
|
||||
"branch": "gander/row278-b",
|
||||
"base": "6af85df4b",
|
||||
"manifest_sha256": "8fa859a0c617defe42e50028b057a603c6634f6db47ac2e3f7c01dfb290228a3",
|
||||
"paths": {
|
||||
"packages/webui/src/cli.mjs": "7ac85787f614aabce4b8eccef01fcdbf1018003e806c5de97d40f47c4041710a",
|
||||
"packages/webui/src/serve.mjs": "aa25b50543b5bc632ac984e85b0d8b43b1c9af2d617bfc7c19351d07310f396d",
|
||||
"packages/webui/src/public/bus.js": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"packages/webui/tests/thread-claims.test.mjs": "48117fe02ef9b76ad12f15dfb0d25e77d187c088c0bff572f33e18418e566913",
|
||||
"packages/webui/tests/thread-claims-browser.test.mjs": "3b2770db03a2fcce87512b600f386a51f822b251ccb992a46208ee484ee99f7e",
|
||||
"packages/webui/README.md": "426007525d15ad0fa11ba02d6cc5d8436c7ff3fa38beb01e9a651c202169d6a5",
|
||||
"packages/webui/tests/shell.test.mjs": "fd7ad903b682f8f6ceee2d75111b01aa97f50233cd875dd5553e3e83de33ce32"
|
||||
},
|
||||
"verification": "Run3 green under sage-2648; run3/SUMMARY.json contains fresh evidence. Runs1/2 void.",
|
||||
"publication": "authorized after green under sage-2648"
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
[
|
||||
{
|
||||
"id": "M1",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "e1b693b5ddf3cd55091dd4c0a47934ca22fe7851c6e942f2386a6eefdcb5a1a0",
|
||||
"killer": "packages/webui/tests/thread-claims-browser.test.mjs",
|
||||
"pattern": "row278 browser lists held claims"
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "6a7274e2d2281ac2d927a00e6cabe72656f648f721607f0896cac107a4e22fdb",
|
||||
"killer": "packages/webui/tests/thread-claims-browser.test.mjs",
|
||||
"pattern": "row278 browser lists held claims"
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "7c30c0cfa6908bc0946df325d417f726ea67373b8afffe72fd3aebcd6a52c52b",
|
||||
"killer": "packages/webui/tests/thread-claims-browser.test.mjs",
|
||||
"pattern": "row278 browser claims 403 stays local"
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"file": "packages/webui/src/serve.mjs",
|
||||
"occurrences": 1,
|
||||
"before": "aa25b50543b5bc632ac984e85b0d8b43b1c9af2d617bfc7c19351d07310f396d",
|
||||
"after": "10324c3a22dbefac6286af4f06e53a6e8057aef56f744eaf7bdd879ac76626e1",
|
||||
"killer": "packages/webui/tests/thread-claims.test.mjs",
|
||||
"pattern": "row278 tester socket refuses thread claims"
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"file": "packages/webui/src/cli.mjs",
|
||||
"occurrences": 1,
|
||||
"before": "7ac85787f614aabce4b8eccef01fcdbf1018003e806c5de97d40f47c4041710a",
|
||||
"after": "3fa30f91b19a1ea0348214b927925b163e51a6184b97910ded2dbc2282e1ddf6",
|
||||
"killer": "packages/webui/tests/thread-claims.test.mjs",
|
||||
"pattern": "row278 Console adapter calls argument-free"
|
||||
},
|
||||
{
|
||||
"id": "M6",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "c1c4f97a962d8da9055373ca7ac4441712c2c9f4ea675d7b137a3306d0621012",
|
||||
"killer": "packages/webui/tests/thread-claims-browser.test.mjs",
|
||||
"pattern": "row278 browser claims 403 stays local"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,50 @@
|
||||
[
|
||||
{
|
||||
"id": "M1",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"old": " async function threadClaimsSection(get) {",
|
||||
"new": " async function threadClaimsSection(get) {\n return \"\";",
|
||||
"killer": "packages/webui/tests/thread-claims-browser.test.mjs",
|
||||
"pattern": "row278 browser lists held claims"
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"old": " const threadSection = await threadClaimsSection(get);",
|
||||
"new": " const threadSection = await threadClaimsSection(get);\n claims.push(...(last.get('thread.claims')?.rows ?? []));",
|
||||
"killer": "packages/webui/tests/thread-claims-browser.test.mjs",
|
||||
"pattern": "row278 browser lists held claims"
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"old": " if (err.code === 'signed-out') throw err;\n last.delete('thread.claims');",
|
||||
"new": " if (err.code === 'signed-out' || err.status === 403) throw err;\n last.delete('thread.claims');",
|
||||
"killer": "packages/webui/tests/thread-claims-browser.test.mjs",
|
||||
"pattern": "row278 browser claims 403 stays local"
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"file": "packages/webui/src/serve.mjs",
|
||||
"old": " if (tester && verb === 'thread.claims') return json(res, 403, { error: 'tester-refused' });",
|
||||
"new": " // tester guard removed",
|
||||
"killer": "packages/webui/tests/thread-claims.test.mjs",
|
||||
"pattern": "row278 tester socket refuses thread claims"
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"file": "packages/webui/src/cli.mjs",
|
||||
"old": "'thread.claims': () => call('thread.claims')",
|
||||
"new": "'thread.claims': () => call('agents')",
|
||||
"killer": "packages/webui/tests/thread-claims.test.mjs",
|
||||
"pattern": "row278 Console adapter calls argument-free"
|
||||
},
|
||||
{
|
||||
"id": "M6",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"old": " last.delete('thread.claims');\n return `<section aria-labelledby=\"b-thread-claims\">",
|
||||
"new": " // keep the old claims\n return `<section aria-labelledby=\"b-thread-claims\">",
|
||||
"killer": "packages/webui/tests/thread-claims-browser.test.mjs",
|
||||
"pattern": "row278 browser claims 403 stays local"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,115 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Run explicit row278 changes only under Sage's grant. --static runs no tests."""
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import signal
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
REPO = HERE.parents[3]
|
||||
|
||||
def digest(data):
|
||||
return hashlib.sha256(data).hexdigest()
|
||||
|
||||
def busy():
|
||||
p = subprocess.run(['bash', '/mnt/storage/scratch/sage-busy-now.sh'], text=True, capture_output=True)
|
||||
if p.returncode or p.stdout.splitlines()[-1:] != ['CLEAR']:
|
||||
raise RuntimeError('busy refusal: ' + p.stdout + p.stderr)
|
||||
|
||||
def run(command, path, seconds=330):
|
||||
busy()
|
||||
if command[:2] == ['node', '--test']:
|
||||
command = ['timeout', '-k', '10', '300', *command]
|
||||
started = time.monotonic()
|
||||
command_file = path.with_suffix('.command.json')
|
||||
command_file.write_text(json.dumps(command))
|
||||
# Keep command text out of wrapper argv: the busy guard scans every argv.
|
||||
# launch.py execs the structured command. bash owns a pipefail/tee pipeline.
|
||||
p = subprocess.Popen(['bash','-o','pipefail','-c',
|
||||
'python3 "$1" "$2" 2>&1 | tee "$3"', '--',str(HERE/'launch.py'),str(command_file),str(path)],
|
||||
cwd=REPO,start_new_session=True)
|
||||
expired = False
|
||||
try:
|
||||
code = p.wait(timeout=seconds)
|
||||
expired = code in (124, 137)
|
||||
except subprocess.TimeoutExpired:
|
||||
expired = True
|
||||
os.killpg(p.pid, signal.SIGKILL)
|
||||
code = p.wait()
|
||||
finally:
|
||||
try:
|
||||
os.killpg(p.pid, signal.SIGKILL)
|
||||
except ProcessLookupError:
|
||||
pass
|
||||
return dict(code=code, timeout=expired, seconds=round(time.monotonic()-started, 3), log=str(path))
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument('--static', action='store_true')
|
||||
ap.add_argument('--grant')
|
||||
ap.add_argument('--out', type=Path)
|
||||
args = ap.parse_args()
|
||||
expected = json.loads((HERE/'CANDIDATE-SHAS.json').read_text())
|
||||
for name, sha in expected.items():
|
||||
assert digest((REPO/name).read_bytes()) == sha, name
|
||||
definitions = json.loads((HERE/'changes.json').read_text())
|
||||
checked = []
|
||||
for d in definitions:
|
||||
original = (REPO/d['file']).read_bytes()
|
||||
count = original.count(d['old'].encode())
|
||||
if count != 1:
|
||||
raise RuntimeError(f"{d['id']}: target occurs {count} times")
|
||||
changed = original.replace(d['old'].encode(), d['new'].encode(), 1)
|
||||
checked.append(dict(id=d['id'], file=d['file'], occurrences=count,
|
||||
before=digest(original), after=digest(changed)))
|
||||
if args.static:
|
||||
print(json.dumps(checked, indent=2))
|
||||
return
|
||||
if not args.grant or not args.out:
|
||||
ap.error('execution needs --grant and --out')
|
||||
if not os.environ.get('TMPDIR', '').startswith('/mnt/storage/scratch/tmp/g'):
|
||||
raise RuntimeError('TMPDIR must be the granted scratch directory')
|
||||
status = subprocess.check_output(['git','status','--porcelain','--untracked-files=no'],cwd=REPO)
|
||||
args.out.mkdir(parents=True, exist_ok=True)
|
||||
results = dict(grant=args.grant, static=checked, bases={}, changes=[])
|
||||
failures = 0
|
||||
for d in definitions:
|
||||
key = d['killer']+'|'+d['pattern']
|
||||
command = ['node','--test','--test-reporter=tap','--test-name-pattern',d['pattern'],d['killer']]
|
||||
if key not in results['bases']:
|
||||
base = run(command, args.out/(d['id']+'-base.log'))
|
||||
results['bases'][key] = base
|
||||
(args.out/'results.json').write_text(json.dumps(results,indent=2)+'\n')
|
||||
if base['code'] != 0 or base['seconds'] > 30:
|
||||
raise RuntimeError('base failed or exceeded 30 seconds: '+d['id'])
|
||||
target = REPO/d['file']
|
||||
original = target.read_bytes()
|
||||
try:
|
||||
target.write_bytes(original.replace(d['old'].encode(),d['new'].encode(),1))
|
||||
busy()
|
||||
pre = subprocess.run(['node','--check',str(target)],capture_output=True)
|
||||
if pre.returncode:
|
||||
raise RuntimeError('invalid syntax: '+d['id'])
|
||||
result = run(command,args.out/(d['id']+'.log'))
|
||||
result.update(id=d['id'], base_seconds=results['bases'][key]['seconds'],
|
||||
outcome='timeout' if result['timeout'] else 'killed' if result['code'] != 0 else 'survived')
|
||||
results['changes'].append(result)
|
||||
if result['timeout']:
|
||||
raise RuntimeError('timeout requires Sage/Mos classification: '+d['id'])
|
||||
if result['outcome'] != 'killed':
|
||||
failures += 1
|
||||
finally:
|
||||
target.write_bytes(original)
|
||||
assert target.read_bytes() == original
|
||||
assert subprocess.check_output(['git','status','--porcelain','--untracked-files=no'],cwd=REPO) == status
|
||||
(args.out/'results.json').write_text(json.dumps(results,indent=2)+'\n')
|
||||
if failures >= 1:
|
||||
raise RuntimeError('first unexpected failure: end the granted window')
|
||||
print(json.dumps(results,indent=2))
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Exec a structured command without putting its text in wrapper argv."""
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
with open(sys.argv[1]) as source:
|
||||
command = json.load(source)
|
||||
os.execvp(command[0], command)
|
||||
@@ -0,0 +1,7 @@
|
||||
packages/webui/README.md: OK
|
||||
packages/webui/src/cli.mjs: OK
|
||||
packages/webui/src/public/bus.js: OK
|
||||
packages/webui/src/serve.mjs: OK
|
||||
packages/webui/tests/shell.test.mjs: OK
|
||||
packages/webui/tests/thread-claims-browser.test.mjs: OK
|
||||
packages/webui/tests/thread-claims.test.mjs: OK
|
||||
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Assemble run3 evidence from complete logs without running tests."""
|
||||
import hashlib, json, re
|
||||
from pathlib import Path
|
||||
HERE=Path(__file__).resolve().parent
|
||||
RUN=HERE/'run3'
|
||||
def main():
|
||||
sections={n:json.loads((RUN/n/'results.json').read_text()) for n in ['syntax','red','focused','changes','whole']}
|
||||
for n in ['syntax','focused','whole']:
|
||||
assert all(s['code']==0 and not s['timeout'] for s in sections[n]['steps']), n
|
||||
assert len(sections['whole']['steps'])==12
|
||||
assert all(s['code']!=0 and not s['timeout'] for s in sections['red']['steps'])
|
||||
changes=sections['changes']['changes']
|
||||
assert len(changes)==6 and all(s['outcome']=='killed' and not s['timeout'] for s in changes)
|
||||
limits=json.loads((HERE/'SHELL-LIMITS.json').read_text())['scripts']
|
||||
shells=[]
|
||||
for s in sections['whole']['steps'][2:]:
|
||||
command=json.loads(Path(s['log']).with_suffix('.command.json').read_text())
|
||||
script=command[-1]
|
||||
assert command==['timeout','-k','10',str(limits[script]['limit_seconds']),'bash',script]
|
||||
raw=Path(s['log']).read_text(errors='replace')
|
||||
matches=re.findall(r'([^\n]*?: (\d+) passed, (\d+) failed)',raw)
|
||||
assert matches, script
|
||||
line, passed, failed=matches[-1]
|
||||
assert int(failed)==0
|
||||
shells.append(dict(script=script,pass_count=int(passed),fail_count=int(failed),seconds=s['seconds'],limit_seconds=limits[script]['limit_seconds'],summary_line=line,command=command))
|
||||
webui=Path(sections['whole']['steps'][1]['log']).read_text(errors='replace')
|
||||
skips=[line for line in webui.splitlines() if '# SKIP' in line]
|
||||
direct=[]
|
||||
for p in RUN.rglob('*.command.json'):
|
||||
cmd=json.loads(p.read_text())
|
||||
if 'node' in cmd and '--test' in cmd:
|
||||
assert cmd[:5]==['timeout','-k','10','300','node']
|
||||
direct.append(str(p))
|
||||
expected=json.loads((HERE/'CANDIDATE-SHAS.json').read_text())
|
||||
repo=HERE.parents[3]
|
||||
assert all(hashlib.sha256((repo/n).read_bytes()).hexdigest()==v for n,v in expected.items())
|
||||
assert all(hashlib.sha256((repo/n).read_bytes()).hexdigest()==v['script_sha256'] for n,v in limits.items())
|
||||
result=dict(status='GREEN',grant='sage-2648',candidate='3e4c77ac6056e8efa887eecdbc4001d249b880f6',source='9696d1fcb78d6082cae8dcb61913225e98c9c138',manifest=hashlib.sha256((HERE/'MANIFEST.sha256').read_bytes()).hexdigest(),sections=sections,shells=shells,named_skips=skips,killed=len(changes),survived=0,timeouts=0,timeout_wrapped_direct_test_commands=direct,all_candidate_and_script_hashes_match=True)
|
||||
(RUN/'SUMMARY.json').write_text(json.dumps(result,indent=2)+'\n')
|
||||
defs={d['id']:d for d in json.loads((HERE/'changes.json').read_text())}
|
||||
lines=['# Run3 kill table','','All six bases passed; no timeout. Every change restored exact bytes and tracked git status.','','| Check | Named killer | Base seconds | Changed seconds | Result |','|---|---|---:|---:|---|']
|
||||
lines += [f"| {s['id']} | {defs[s['id']]['pattern']} | {s['base_seconds']} | {s['seconds']} | {s['outcome']} |" for s in changes]
|
||||
(RUN/'KILL-TABLE.md').write_text('\n'.join(lines)+'\n')
|
||||
print(json.dumps(dict(shells=shells,named_skips=skips,killed=len(changes)),indent=2))
|
||||
if __name__=='__main__': main()
|
||||
@@ -0,0 +1,138 @@
|
||||
{
|
||||
"grant": "sage-2632",
|
||||
"candidate": "0011fe357",
|
||||
"source": "e7d21b91b",
|
||||
"status": "VOID_UNDER_SAGE_2638",
|
||||
"queue_rev": 3195,
|
||||
"syntax": {
|
||||
"grant": "sage-2632",
|
||||
"stage": "syntax",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-0.log",
|
||||
"name": "syntax-0",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-1.log",
|
||||
"name": "syntax-1",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-2.log",
|
||||
"name": "syntax-2",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-3.log",
|
||||
"name": "syntax-3",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-4.log",
|
||||
"name": "syntax-4",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
"red": {
|
||||
"grant": "sage-2632",
|
||||
"stage": "red",
|
||||
"steps": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.265,
|
||||
"log": "agents/gander/work/queue-278/run1/red/red-0.log",
|
||||
"name": "red-0",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.922,
|
||||
"log": "agents/gander/work/queue-278/run1/red/red-1.log",
|
||||
"name": "red-1",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"focused": {
|
||||
"grant": "sage-2632",
|
||||
"stage": "focused",
|
||||
"steps": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.315,
|
||||
"log": "agents/gander/work/queue-278/run1/focused/focused-0.log",
|
||||
"name": "focused-0",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 4,
|
||||
"pass": 3,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"unrun": [
|
||||
"thread-claims-browser whole",
|
||||
"M1-M6",
|
||||
"bus whole",
|
||||
"webui whole",
|
||||
"ten shell files"
|
||||
],
|
||||
"sweep": {
|
||||
"timestamp": "2026-10-22T12:07:11.740057+00:00",
|
||||
"raw_matches": 1,
|
||||
"count": 0,
|
||||
"excluded_preexisting_infrastructure": [
|
||||
{
|
||||
"pid": 2880439,
|
||||
"comm": "chrome-devtools",
|
||||
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
|
||||
"args": "chrome-devtools-mcp ",
|
||||
"start_receipt": " PID STARTED ELAPSED COMMAND\n2880439 Thu Oct 22 06:23:50 2026 43:20 chrome-devtools\n"
|
||||
}
|
||||
],
|
||||
"remaining": [],
|
||||
"note": "The only raw match is the pre-existing chrome-devtools-mcp harness helper, started before this grant. No node, tee, timeout, browser test process or FIFO reader from this run remains. No process was signalled."
|
||||
},
|
||||
"diagnosis": "New adapter test replaces webui bus.mjs without exporting BusReadError required by chat.mjs. Proposed test-only fix: export a stand-in BusReadError alongside busCaller; assertions unchanged. No fix or rerun made.",
|
||||
"results_carry": false,
|
||||
"test_fix_commit": "964b6b1848d3bb5f2c15f9c835eb07783596ced9"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
ok gander-278-start rev 3195 row 278 briefed→in-progress
|
||||
@@ -0,0 +1,77 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
ok 1 - row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
---
|
||||
duration_ms: 32.1613
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 HTTP read preserves bus refusal and rejects a malformed result
|
||||
ok 2 - row278 HTTP read preserves bus refusal and rejects a malformed result
|
||||
---
|
||||
duration_ms: 8.353095
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
ok 3 - row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
---
|
||||
duration_ms: 4.686299
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
not ok 4 - row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
---
|
||||
duration_ms: 99.361185
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:54:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/src/chat.mjs:7
|
||||
import { BusReadError } from './bus.mjs';
|
||||
^^^^^^^^^^^^
|
||||
SyntaxError: The requested module './bus.mjs' does not provide an export named 'BusReadError'
|
||||
at #asyncInstantiate (node:internal/modules/esm/module_job:463:21)
|
||||
at async ModuleJob.run (node:internal/modules/esm/module_job:561:5)
|
||||
at async node:internal/modules/esm/loader:650:26
|
||||
at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5)
|
||||
|
||||
Node.js v26.8.1
|
||||
|
||||
|
||||
1 !== 0
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 0
|
||||
actual: 1
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
#asyncInstantiate (node:internal/modules/esm/module_job:463:21)
|
||||
async ModuleJob.run (node:internal/modules/esm/module_job:561:5)
|
||||
async node:internal/modules/esm/loader:650:26
|
||||
async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5)
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:66:10)
|
||||
Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
Test.run (node:internal/test_runner/test:1402:25)
|
||||
Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
Test.run (node:internal/test_runner/test:1467:12)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
1..4
|
||||
# tests 4
|
||||
# suites 0
|
||||
# pass 3
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 267.798271
|
||||
Traceback (most recent call last):
|
||||
File "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-278/window.py", line 83, in <module>
|
||||
main()
|
||||
File "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-278/window.py", line 72, in main
|
||||
step('focused-'+str(index), ['node', '--test', '--test-reporter=tap', name])
|
||||
File "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/agents/gander/work/queue-278/window.py", line 50, in step
|
||||
raise RuntimeError('unexpected failure: stop and report')
|
||||
RuntimeError: unexpected failure: stop and report
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/webui/tests/thread-claims.test.mjs"]
|
||||
@@ -0,0 +1,69 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
ok 1 - row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
---
|
||||
duration_ms: 32.1613
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 HTTP read preserves bus refusal and rejects a malformed result
|
||||
ok 2 - row278 HTTP read preserves bus refusal and rejects a malformed result
|
||||
---
|
||||
duration_ms: 8.353095
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
ok 3 - row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
---
|
||||
duration_ms: 4.686299
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
not ok 4 - row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
---
|
||||
duration_ms: 99.361185
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:54:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/src/chat.mjs:7
|
||||
import { BusReadError } from './bus.mjs';
|
||||
^^^^^^^^^^^^
|
||||
SyntaxError: The requested module './bus.mjs' does not provide an export named 'BusReadError'
|
||||
at #asyncInstantiate (node:internal/modules/esm/module_job:463:21)
|
||||
at async ModuleJob.run (node:internal/modules/esm/module_job:561:5)
|
||||
at async node:internal/modules/esm/loader:650:26
|
||||
at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5)
|
||||
|
||||
Node.js v26.8.1
|
||||
|
||||
|
||||
1 !== 0
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 0
|
||||
actual: 1
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
#asyncInstantiate (node:internal/modules/esm/module_job:463:21)
|
||||
async ModuleJob.run (node:internal/modules/esm/module_job:561:5)
|
||||
async node:internal/modules/esm/loader:650:26
|
||||
async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5)
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:66:10)
|
||||
Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
Test.run (node:internal/test_runner/test:1402:25)
|
||||
Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
Test.run (node:internal/test_runner/test:1467:12)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
...
|
||||
1..4
|
||||
# tests 4
|
||||
# suites 0
|
||||
# pass 3
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 267.798271
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"grant": "sage-2632",
|
||||
"stage": "focused",
|
||||
"steps": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.315,
|
||||
"log": "agents/gander/work/queue-278/run1/focused/focused-0.log",
|
||||
"name": "focused-0",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 4,
|
||||
"pass": 3,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
not ok 1 - row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
---
|
||||
duration_ms: 19.9422
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:17:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
404 !== 200
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 200
|
||||
actual: 404
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:24:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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 168.23002
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
not ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 3702.361642
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:39:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: "Uncaught (in promise) Error: !!document.querySelector('#b-thread-claims'): undefined"
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:33:3)
|
||||
async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:40:49)
|
||||
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 3825.651636
|
||||
{
|
||||
"grant": "sage-2632",
|
||||
"stage": "red",
|
||||
"steps": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.265,
|
||||
"log": "agents/gander/work/queue-278/run1/red/red-0.log",
|
||||
"name": "red-0",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.922,
|
||||
"log": "agents/gander/work/queue-278/run1/red/red-1.log",
|
||||
"name": "red-1",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 HTTP read returns held claims", "packages/webui/tests/thread-claims.test.mjs"]
|
||||
@@ -0,0 +1,33 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
not ok 1 - row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
---
|
||||
duration_ms: 19.9422
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:17:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
404 !== 200
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 200
|
||||
actual: 404
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:24:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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 168.23002
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 browser lists held claims", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
@@ -0,0 +1,27 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
not ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 3702.361642
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:39:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: "Uncaught (in promise) Error: !!document.querySelector('#b-thread-claims'): undefined"
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:33:3)
|
||||
async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:40:49)
|
||||
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 3825.651636
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"grant": "sage-2632",
|
||||
"stage": "red",
|
||||
"steps": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.265,
|
||||
"log": "agents/gander/work/queue-278/run1/red/red-0.log",
|
||||
"name": "red-0",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.922,
|
||||
"log": "agents/gander/work/queue-278/run1/red/red-1.log",
|
||||
"name": "red-1",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
2026-10-22T12:04:14Z
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"timestamp": "2026-10-22T12:06:39.845905+00:00",
|
||||
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
|
||||
"count": 1,
|
||||
"processes": [
|
||||
{
|
||||
"pid": 2880439,
|
||||
"comm": "chrome-devtools",
|
||||
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
|
||||
"args": "chrome-devtools-mcp "
|
||||
}
|
||||
],
|
||||
"method": "read-only proc cwd sweep; own ancestry excluded; node, tee, timeout, Chromium and FIFO commands; no signalling"
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"timestamp": "2026-10-22T12:07:11.740057+00:00",
|
||||
"raw_matches": 1,
|
||||
"count": 0,
|
||||
"excluded_preexisting_infrastructure": [
|
||||
{
|
||||
"pid": 2880439,
|
||||
"comm": "chrome-devtools",
|
||||
"cwd": "/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196",
|
||||
"args": "chrome-devtools-mcp ",
|
||||
"start_receipt": " PID STARTED ELAPSED COMMAND\n2880439 Thu Oct 22 06:23:50 2026 43:20 chrome-devtools\n"
|
||||
}
|
||||
],
|
||||
"remaining": [],
|
||||
"note": "The only raw match is the pre-existing chrome-devtools-mcp harness helper, started before this grant. No node, tee, timeout, browser test process or FIFO reader from this run remains. No process was signalled."
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"grant": "sage-2632",
|
||||
"stage": "syntax",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-0.log",
|
||||
"name": "syntax-0",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-1.log",
|
||||
"name": "syntax-1",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-2.log",
|
||||
"name": "syntax-2",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-3.log",
|
||||
"name": "syntax-3",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-4.log",
|
||||
"name": "syntax-4",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"grant": "sage-2632",
|
||||
"stage": "syntax",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-0.log",
|
||||
"name": "syntax-0",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-1.log",
|
||||
"name": "syntax-1",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-2.log",
|
||||
"name": "syntax-2",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-3.log",
|
||||
"name": "syntax-3",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run1/syntax/syntax-4.log",
|
||||
"name": "syntax-4",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
["node", "--check", "packages/webui/src/cli.mjs"]
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
["node", "--check", "packages/webui/src/serve.mjs"]
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
["node", "--check", "packages/webui/src/public/bus.js"]
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
["node", "--check", "packages/webui/tests/thread-claims.test.mjs"]
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
["node", "--check", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
/mnt/storage/scratch/tmp/gJZKyzz
|
||||
@@ -0,0 +1,10 @@
|
||||
# Run2 proposed-check table, void under sage-2644
|
||||
|
||||
| Check | Outcome | Base seconds | Changed seconds | Timeout |
|
||||
|---|---|---:|---:|---|
|
||||
| M1 | killed | 0.715 | 3.774 | False |
|
||||
| M2 | killed | 0.715 | 0.816 | False |
|
||||
| M3 | killed | 0.916 | 3.773 | False |
|
||||
| M4 | killed | 0.214 | 0.214 | False |
|
||||
| M5 | killed | 0.314 | 0.315 | False |
|
||||
| M6 | killed | 0.916 | 3.873 | False |
|
||||
@@ -0,0 +1,342 @@
|
||||
{
|
||||
"status": "VOID_UNDER_SAGE_2644",
|
||||
"results_carry": false,
|
||||
"grant": "sage-2638",
|
||||
"candidate": "42abda031f419bc51fe09a784081afaa9d04d8a3",
|
||||
"source": "964b6b1848d3bb5f2c15f9c835eb07783596ced9",
|
||||
"manifest": "188071d851e1f68297a7160a2bd557d9ca1b2776897ea2dd3b2c910ffd1c1f4a",
|
||||
"sections": {
|
||||
"syntax": {
|
||||
"grant": "sage-2638",
|
||||
"stage": "syntax",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-0.log",
|
||||
"name": "syntax-0",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-1.log",
|
||||
"name": "syntax-1",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-2.log",
|
||||
"name": "syntax-2",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-3.log",
|
||||
"name": "syntax-3",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-4.log",
|
||||
"name": "syntax-4",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
"red": {
|
||||
"grant": "sage-2638",
|
||||
"stage": "red",
|
||||
"steps": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.214,
|
||||
"log": "agents/gander/work/queue-278/run2/red/red-0.log",
|
||||
"name": "red-0",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.772,
|
||||
"log": "agents/gander/work/queue-278/run2/red/red-1.log",
|
||||
"name": "red-1",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"focused": {
|
||||
"grant": "sage-2638",
|
||||
"stage": "focused",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.365,
|
||||
"log": "agents/gander/work/queue-278/run2/focused/focused-0.log",
|
||||
"name": "focused-0",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 4,
|
||||
"pass": 4,
|
||||
"fail": 0,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 4.023,
|
||||
"log": "agents/gander/work/queue-278/run2/focused/focused-1.log",
|
||||
"name": "focused-1",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 6,
|
||||
"pass": 6,
|
||||
"fail": 0,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"changes": {
|
||||
"grant": "sage-2638",
|
||||
"static": [
|
||||
{
|
||||
"id": "M1",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "e1b693b5ddf3cd55091dd4c0a47934ca22fe7851c6e942f2386a6eefdcb5a1a0"
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "6a7274e2d2281ac2d927a00e6cabe72656f648f721607f0896cac107a4e22fdb"
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "7c30c0cfa6908bc0946df325d417f726ea67373b8afffe72fd3aebcd6a52c52b"
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"file": "packages/webui/src/serve.mjs",
|
||||
"occurrences": 1,
|
||||
"before": "aa25b50543b5bc632ac984e85b0d8b43b1c9af2d617bfc7c19351d07310f396d",
|
||||
"after": "10324c3a22dbefac6286af4f06e53a6e8057aef56f744eaf7bdd879ac76626e1"
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"file": "packages/webui/src/cli.mjs",
|
||||
"occurrences": 1,
|
||||
"before": "7ac85787f614aabce4b8eccef01fcdbf1018003e806c5de97d40f47c4041710a",
|
||||
"after": "3fa30f91b19a1ea0348214b927925b163e51a6184b97910ded2dbc2282e1ddf6"
|
||||
},
|
||||
{
|
||||
"id": "M6",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "c1c4f97a962d8da9055373ca7ac4441712c2c9f4ea675d7b137a3306d0621012"
|
||||
}
|
||||
],
|
||||
"bases": {
|
||||
"packages/webui/tests/thread-claims-browser.test.mjs|row278 browser lists held claims": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.715,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M1-base.log"
|
||||
},
|
||||
"packages/webui/tests/thread-claims-browser.test.mjs|row278 browser claims 403 stays local": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.916,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M3-base.log"
|
||||
},
|
||||
"packages/webui/tests/thread-claims.test.mjs|row278 tester socket refuses thread claims": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.214,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M4-base.log"
|
||||
},
|
||||
"packages/webui/tests/thread-claims.test.mjs|row278 Console adapter calls argument-free": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.314,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M5-base.log"
|
||||
}
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.774,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M1.log",
|
||||
"id": "M1",
|
||||
"base_seconds": 0.715,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.816,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M2.log",
|
||||
"id": "M2",
|
||||
"base_seconds": 0.715,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.773,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M3.log",
|
||||
"id": "M3",
|
||||
"base_seconds": 0.916,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.214,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M4.log",
|
||||
"id": "M4",
|
||||
"base_seconds": 0.214,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.315,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M5.log",
|
||||
"id": "M5",
|
||||
"base_seconds": 0.314,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.873,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M6.log",
|
||||
"id": "M6",
|
||||
"base_seconds": 0.916,
|
||||
"outcome": "killed"
|
||||
}
|
||||
]
|
||||
},
|
||||
"whole": {
|
||||
"grant": "sage-2638",
|
||||
"stage": "whole",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 23.116,
|
||||
"log": "agents/gander/work/queue-278/run2/whole/bus.log",
|
||||
"name": "bus",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 793,
|
||||
"pass": 793,
|
||||
"fail": 0,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 55.324,
|
||||
"log": "agents/gander/work/queue-278/run2/whole/webui.log",
|
||||
"name": "webui",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 346,
|
||||
"pass": 344,
|
||||
"fail": 1,
|
||||
"skipped": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"killed": 6,
|
||||
"survived": 0,
|
||||
"timeouts": 0,
|
||||
"failure": {
|
||||
"file": "packages/webui/tests/shell.test.mjs",
|
||||
"test": "five states on Board, Inbox, Tasks, Agents and Trail",
|
||||
"assertion_line": 463,
|
||||
"expected_banner_count": 0,
|
||||
"actual_banner_count": 1,
|
||||
"static_diagnosis": "stubBus supplies no thread.claims callback, so the section correctly shows an invalid-response banner",
|
||||
"ruling": "Mos pending; no source, test, fixture or driver change made after the stop"
|
||||
},
|
||||
"named_skips": [
|
||||
{
|
||||
"tap_line": "ok 98 - rebuilding from the source gives the same bytes (needs the pinned esbuild; MOSAIC_REQUIRE_EDITOR_BUILD=1 makes its absence a failure) # SKIP esbuild 0.28.1 is installed at /mnt/storage/src/mosaic-stack/node_modules/esbuild; the editor rebuild needs exactly 0.28.2 (npm ci --ignore-scripts in packages/webui) (set MOSAIC_REQUIRE_EDITOR_BUILD=1 to fail instead of skip)"
|
||||
}
|
||||
],
|
||||
"unrun": [
|
||||
"all ten shell files"
|
||||
],
|
||||
"sweep": {
|
||||
"timestamp": "2026-10-22T12:17:12.732808+00:00",
|
||||
"count": 0,
|
||||
"remaining": [],
|
||||
"excluded_preexisting_infrastructure": [
|
||||
{
|
||||
"pid": 2880439,
|
||||
"comm": "chrome-devtools"
|
||||
}
|
||||
],
|
||||
"note": "Read-only cwd proc sweep, own ancestry excluded. No signalling. Slot already returned in gander-0094."
|
||||
},
|
||||
"timeout_wrapped_direct_test_commands": [
|
||||
"agents/gander/work/queue-278/run2/focused/focused-0.command.json",
|
||||
"agents/gander/work/queue-278/run2/focused/focused-1.command.json",
|
||||
"agents/gander/work/queue-278/run2/changes/M1-base.command.json",
|
||||
"agents/gander/work/queue-278/run2/changes/M4-base.command.json",
|
||||
"agents/gander/work/queue-278/run2/changes/M1.command.json",
|
||||
"agents/gander/work/queue-278/run2/changes/M4.command.json",
|
||||
"agents/gander/work/queue-278/run2/changes/M6.command.json",
|
||||
"agents/gander/work/queue-278/run2/changes/M2.command.json",
|
||||
"agents/gander/work/queue-278/run2/changes/M3-base.command.json",
|
||||
"agents/gander/work/queue-278/run2/changes/M3.command.json",
|
||||
"agents/gander/work/queue-278/run2/changes/M5-base.command.json",
|
||||
"agents/gander/work/queue-278/run2/changes/M5.command.json",
|
||||
"agents/gander/work/queue-278/run2/whole/bus.command.json",
|
||||
"agents/gander/work/queue-278/run2/whole/webui.command.json",
|
||||
"agents/gander/work/queue-278/run2/red/red-1.command.json",
|
||||
"agents/gander/work/queue-278/run2/red/red-0.command.json"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,388 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 535.499612
|
||||
type: 'test'
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 1
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 651.310935
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
not ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 3566.368806
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:39:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: "Uncaught (in promise) Error: !!document.querySelector('#b-thread-claims'): undefined"
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:33:3)
|
||||
async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:40:49)
|
||||
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 3677.584834
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
not ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 598.604567
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:39:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
'2' !== '1'
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: '1'
|
||||
actual: '2'
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:46:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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 716.536553
|
||||
TAP version 13
|
||||
# Subtest: row278 browser claims 403 stays local and role section remains byte-equal
|
||||
ok 1 - row278 browser claims 403 stays local and role section remains byte-equal
|
||||
---
|
||||
duration_ms: 715.095255
|
||||
type: 'test'
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 1
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 831.950838
|
||||
TAP version 13
|
||||
# Subtest: row278 browser claims 403 stays local and role section remains byte-equal
|
||||
not ok 1 - row278 browser claims 403 stays local and role section remains byte-equal
|
||||
---
|
||||
duration_ms: 3591.462679
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:55:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: `Uncaught (in promise) Error: document.querySelector('[aria-labelledby="b-thread-claims"] code')?.textContent==="human-required": undefined`
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:61:5)
|
||||
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 3706.82009
|
||||
TAP version 13
|
||||
# Subtest: row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
ok 1 - row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
---
|
||||
duration_ms: 14.65787
|
||||
type: 'test'
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 1
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 133.295747
|
||||
TAP version 13
|
||||
# Subtest: row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
not ok 1 - row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
---
|
||||
duration_ms: 14.509095
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:46:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
200 !== 403
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 403
|
||||
actual: 200
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:51:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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 125.024128
|
||||
TAP version 13
|
||||
# Subtest: row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
ok 1 - row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
---
|
||||
duration_ms: 117.719722
|
||||
type: 'test'
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 1
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 229.873766
|
||||
TAP version 13
|
||||
# Subtest: row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
not ok 1 - row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
---
|
||||
duration_ms: 116.367834
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:54:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
{
|
||||
args: [],
|
||||
tester: false,
|
||||
+ verb: 'agents'
|
||||
- verb: 'thread.claims'
|
||||
}
|
||||
]
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
0:
|
||||
verb: 'thread.claims'
|
||||
args:
|
||||
tester: false
|
||||
actual:
|
||||
0:
|
||||
verb: 'agents'
|
||||
args:
|
||||
tester: false
|
||||
operator: 'deepStrictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:67:10)
|
||||
Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
Test.run (node:internal/test_runner/test:1402:25)
|
||||
Test.start (node:internal/test_runner/test:1262:17)
|
||||
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 0
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 230.973133
|
||||
TAP version 13
|
||||
# Subtest: row278 browser claims 403 stays local and role section remains byte-equal
|
||||
not ok 1 - row278 browser claims 403 stays local and role section remains byte-equal
|
||||
---
|
||||
duration_ms: 3697.026047
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:55:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: `Uncaught (in promise) Error: !!document.querySelector('.s1-stale') && document.querySelector('[aria-labelledby="b-thread-claims"] code')?.textContent==='not-read': undefined`
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:67:3)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 0
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 3817.114582
|
||||
{
|
||||
"grant": "sage-2638",
|
||||
"static": [
|
||||
{
|
||||
"id": "M1",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "e1b693b5ddf3cd55091dd4c0a47934ca22fe7851c6e942f2386a6eefdcb5a1a0"
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "6a7274e2d2281ac2d927a00e6cabe72656f648f721607f0896cac107a4e22fdb"
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "7c30c0cfa6908bc0946df325d417f726ea67373b8afffe72fd3aebcd6a52c52b"
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"file": "packages/webui/src/serve.mjs",
|
||||
"occurrences": 1,
|
||||
"before": "aa25b50543b5bc632ac984e85b0d8b43b1c9af2d617bfc7c19351d07310f396d",
|
||||
"after": "10324c3a22dbefac6286af4f06e53a6e8057aef56f744eaf7bdd879ac76626e1"
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"file": "packages/webui/src/cli.mjs",
|
||||
"occurrences": 1,
|
||||
"before": "7ac85787f614aabce4b8eccef01fcdbf1018003e806c5de97d40f47c4041710a",
|
||||
"after": "3fa30f91b19a1ea0348214b927925b163e51a6184b97910ded2dbc2282e1ddf6"
|
||||
},
|
||||
{
|
||||
"id": "M6",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "c1c4f97a962d8da9055373ca7ac4441712c2c9f4ea675d7b137a3306d0621012"
|
||||
}
|
||||
],
|
||||
"bases": {
|
||||
"packages/webui/tests/thread-claims-browser.test.mjs|row278 browser lists held claims": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.715,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M1-base.log"
|
||||
},
|
||||
"packages/webui/tests/thread-claims-browser.test.mjs|row278 browser claims 403 stays local": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.916,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M3-base.log"
|
||||
},
|
||||
"packages/webui/tests/thread-claims.test.mjs|row278 tester socket refuses thread claims": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.214,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M4-base.log"
|
||||
},
|
||||
"packages/webui/tests/thread-claims.test.mjs|row278 Console adapter calls argument-free": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.314,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M5-base.log"
|
||||
}
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.774,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M1.log",
|
||||
"id": "M1",
|
||||
"base_seconds": 0.715,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.816,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M2.log",
|
||||
"id": "M2",
|
||||
"base_seconds": 0.715,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.773,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M3.log",
|
||||
"id": "M3",
|
||||
"base_seconds": 0.916,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.214,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M4.log",
|
||||
"id": "M4",
|
||||
"base_seconds": 0.214,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.315,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M5.log",
|
||||
"id": "M5",
|
||||
"base_seconds": 0.314,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.873,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M6.log",
|
||||
"id": "M6",
|
||||
"base_seconds": 0.916,
|
||||
"outcome": "killed"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 browser lists held claims", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
@@ -0,0 +1,16 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 535.499612
|
||||
type: 'test'
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 1
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 651.310935
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 browser lists held claims", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
@@ -0,0 +1,27 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
not ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 3566.368806
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:39:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: "Uncaught (in promise) Error: !!document.querySelector('#b-thread-claims'): undefined"
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:33:3)
|
||||
async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:40:49)
|
||||
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 3677.584834
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 browser lists held claims", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
@@ -0,0 +1,33 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
not ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 598.604567
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:39:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
'2' !== '1'
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: '1'
|
||||
actual: '2'
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:46:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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 716.536553
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 browser claims 403 stays local", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
@@ -0,0 +1,16 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 browser claims 403 stays local and role section remains byte-equal
|
||||
ok 1 - row278 browser claims 403 stays local and role section remains byte-equal
|
||||
---
|
||||
duration_ms: 715.095255
|
||||
type: 'test'
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 1
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 831.950838
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 browser claims 403 stays local", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
@@ -0,0 +1,26 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 browser claims 403 stays local and role section remains byte-equal
|
||||
not ok 1 - row278 browser claims 403 stays local and role section remains byte-equal
|
||||
---
|
||||
duration_ms: 3591.462679
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:55:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: `Uncaught (in promise) Error: document.querySelector('[aria-labelledby="b-thread-claims"] code')?.textContent==="human-required": undefined`
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:61:5)
|
||||
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 3706.82009
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 tester socket refuses thread claims", "packages/webui/tests/thread-claims.test.mjs"]
|
||||
@@ -0,0 +1,16 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
ok 1 - row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
---
|
||||
duration_ms: 14.65787
|
||||
type: 'test'
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 1
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 133.295747
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 tester socket refuses thread claims", "packages/webui/tests/thread-claims.test.mjs"]
|
||||
@@ -0,0 +1,33 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
not ok 1 - row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
---
|
||||
duration_ms: 14.509095
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:46:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
200 !== 403
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 403
|
||||
actual: 200
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:51:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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 125.024128
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 Console adapter calls argument-free", "packages/webui/tests/thread-claims.test.mjs"]
|
||||
@@ -0,0 +1,16 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
ok 1 - row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
---
|
||||
duration_ms: 117.719722
|
||||
type: 'test'
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 1
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 229.873766
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 Console adapter calls argument-free", "packages/webui/tests/thread-claims.test.mjs"]
|
||||
@@ -0,0 +1,50 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
not ok 1 - row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
---
|
||||
duration_ms: 116.367834
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:54:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
{
|
||||
args: [],
|
||||
tester: false,
|
||||
+ verb: 'agents'
|
||||
- verb: 'thread.claims'
|
||||
}
|
||||
]
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected:
|
||||
0:
|
||||
verb: 'thread.claims'
|
||||
args:
|
||||
tester: false
|
||||
actual:
|
||||
0:
|
||||
verb: 'agents'
|
||||
args:
|
||||
tester: false
|
||||
operator: 'deepStrictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:67:10)
|
||||
Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
Test.run (node:internal/test_runner/test:1402:25)
|
||||
Test.start (node:internal/test_runner/test:1262:17)
|
||||
startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 0
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 230.973133
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 browser claims 403 stays local", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
@@ -0,0 +1,26 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 browser claims 403 stays local and role section remains byte-equal
|
||||
not ok 1 - row278 browser claims 403 stays local and role section remains byte-equal
|
||||
---
|
||||
duration_ms: 3697.026047
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:55:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: `Uncaught (in promise) Error: !!document.querySelector('.s1-stale') && document.querySelector('[aria-labelledby="b-thread-claims"] code')?.textContent==='not-read': undefined`
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:67:3)
|
||||
async Test.run (node:internal/test_runner/test:1409:7)
|
||||
async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
...
|
||||
1..1
|
||||
# tests 1
|
||||
# suites 0
|
||||
# pass 0
|
||||
# fail 1
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 3817.114582
|
||||
@@ -0,0 +1,129 @@
|
||||
{
|
||||
"grant": "sage-2638",
|
||||
"static": [
|
||||
{
|
||||
"id": "M1",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "e1b693b5ddf3cd55091dd4c0a47934ca22fe7851c6e942f2386a6eefdcb5a1a0"
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "6a7274e2d2281ac2d927a00e6cabe72656f648f721607f0896cac107a4e22fdb"
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "7c30c0cfa6908bc0946df325d417f726ea67373b8afffe72fd3aebcd6a52c52b"
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"file": "packages/webui/src/serve.mjs",
|
||||
"occurrences": 1,
|
||||
"before": "aa25b50543b5bc632ac984e85b0d8b43b1c9af2d617bfc7c19351d07310f396d",
|
||||
"after": "10324c3a22dbefac6286af4f06e53a6e8057aef56f744eaf7bdd879ac76626e1"
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"file": "packages/webui/src/cli.mjs",
|
||||
"occurrences": 1,
|
||||
"before": "7ac85787f614aabce4b8eccef01fcdbf1018003e806c5de97d40f47c4041710a",
|
||||
"after": "3fa30f91b19a1ea0348214b927925b163e51a6184b97910ded2dbc2282e1ddf6"
|
||||
},
|
||||
{
|
||||
"id": "M6",
|
||||
"file": "packages/webui/src/public/bus.js",
|
||||
"occurrences": 1,
|
||||
"before": "c0306a4db82c286826b157cceb036496666f58ce8073d14280e58c10377ed0d0",
|
||||
"after": "c1c4f97a962d8da9055373ca7ac4441712c2c9f4ea675d7b137a3306d0621012"
|
||||
}
|
||||
],
|
||||
"bases": {
|
||||
"packages/webui/tests/thread-claims-browser.test.mjs|row278 browser lists held claims": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.715,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M1-base.log"
|
||||
},
|
||||
"packages/webui/tests/thread-claims-browser.test.mjs|row278 browser claims 403 stays local": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.916,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M3-base.log"
|
||||
},
|
||||
"packages/webui/tests/thread-claims.test.mjs|row278 tester socket refuses thread claims": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.214,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M4-base.log"
|
||||
},
|
||||
"packages/webui/tests/thread-claims.test.mjs|row278 Console adapter calls argument-free": {
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.314,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M5-base.log"
|
||||
}
|
||||
},
|
||||
"changes": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.774,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M1.log",
|
||||
"id": "M1",
|
||||
"base_seconds": 0.715,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.816,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M2.log",
|
||||
"id": "M2",
|
||||
"base_seconds": 0.715,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.773,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M3.log",
|
||||
"id": "M3",
|
||||
"base_seconds": 0.916,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.214,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M4.log",
|
||||
"id": "M4",
|
||||
"base_seconds": 0.214,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.315,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M5.log",
|
||||
"id": "M5",
|
||||
"base_seconds": 0.314,
|
||||
"outcome": "killed"
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.873,
|
||||
"log": "agents/gander/work/queue-278/run2/changes/M6.log",
|
||||
"id": "M6",
|
||||
"base_seconds": 0.916,
|
||||
"outcome": "killed"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
ok 1 - row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
---
|
||||
duration_ms: 33.448366
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 HTTP read preserves bus refusal and rejects a malformed result
|
||||
ok 2 - row278 HTTP read preserves bus refusal and rejects a malformed result
|
||||
---
|
||||
duration_ms: 8.452867
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
ok 3 - row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
---
|
||||
duration_ms: 4.790522
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
ok 4 - row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
---
|
||||
duration_ms: 122.251062
|
||||
type: 'test'
|
||||
...
|
||||
1..4
|
||||
# tests 4
|
||||
# suites 0
|
||||
# pass 4
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 295.403076
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 628.085767
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 browser claims 403 stays local and role section remains byte-equal
|
||||
ok 2 - row278 browser claims 403 stays local and role section remains byte-equal
|
||||
---
|
||||
duration_ms: 716.110463
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 browser renders only four escaped claim fields and never instance or other extras
|
||||
ok 3 - row278 browser renders only four escaped claim fields and never instance or other extras
|
||||
---
|
||||
duration_ms: 586.771059
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 browser sign-out removes claims and prevents reuse of cached answers
|
||||
ok 4 - row278 browser sign-out removes claims and prevents reuse of cached answers
|
||||
---
|
||||
duration_ms: 653.839485
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 tester browser keeps role rows without requesting the owner claims section
|
||||
ok 5 - row278 tester browser keeps role rows without requesting the owner claims section
|
||||
---
|
||||
duration_ms: 583.925999
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 browser discards a late claims answer after sign-out
|
||||
ok 6 - row278 browser discards a late claims answer after sign-out
|
||||
---
|
||||
duration_ms: 649.933183
|
||||
type: 'test'
|
||||
...
|
||||
1..6
|
||||
# tests 6
|
||||
# suites 0
|
||||
# pass 6
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 3944.33987
|
||||
{
|
||||
"grant": "sage-2638",
|
||||
"stage": "focused",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.365,
|
||||
"log": "agents/gander/work/queue-278/run2/focused/focused-0.log",
|
||||
"name": "focused-0",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 4,
|
||||
"pass": 4,
|
||||
"fail": 0,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 4.023,
|
||||
"log": "agents/gander/work/queue-278/run2/focused/focused-1.log",
|
||||
"name": "focused-1",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 6,
|
||||
"pass": 6,
|
||||
"fail": 0,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/webui/tests/thread-claims.test.mjs"]
|
||||
@@ -0,0 +1,34 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
ok 1 - row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
---
|
||||
duration_ms: 33.448366
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 HTTP read preserves bus refusal and rejects a malformed result
|
||||
ok 2 - row278 HTTP read preserves bus refusal and rejects a malformed result
|
||||
---
|
||||
duration_ms: 8.452867
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
ok 3 - row278 tester socket refuses thread claims explicitly with zero bus calls
|
||||
---
|
||||
duration_ms: 4.790522
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
ok 4 - row278 Console adapter calls argument-free thread.claims through the normal transport
|
||||
---
|
||||
duration_ms: 122.251062
|
||||
type: 'test'
|
||||
...
|
||||
1..4
|
||||
# tests 4
|
||||
# suites 0
|
||||
# pass 4
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 295.403076
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
@@ -0,0 +1,46 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 628.085767
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 browser claims 403 stays local and role section remains byte-equal
|
||||
ok 2 - row278 browser claims 403 stays local and role section remains byte-equal
|
||||
---
|
||||
duration_ms: 716.110463
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 browser renders only four escaped claim fields and never instance or other extras
|
||||
ok 3 - row278 browser renders only four escaped claim fields and never instance or other extras
|
||||
---
|
||||
duration_ms: 586.771059
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 browser sign-out removes claims and prevents reuse of cached answers
|
||||
ok 4 - row278 browser sign-out removes claims and prevents reuse of cached answers
|
||||
---
|
||||
duration_ms: 653.839485
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 tester browser keeps role rows without requesting the owner claims section
|
||||
ok 5 - row278 tester browser keeps role rows without requesting the owner claims section
|
||||
---
|
||||
duration_ms: 583.925999
|
||||
type: 'test'
|
||||
...
|
||||
# Subtest: row278 browser discards a late claims answer after sign-out
|
||||
ok 6 - row278 browser discards a late claims answer after sign-out
|
||||
---
|
||||
duration_ms: 649.933183
|
||||
type: 'test'
|
||||
...
|
||||
1..6
|
||||
# tests 6
|
||||
# suites 0
|
||||
# pass 6
|
||||
# fail 0
|
||||
# cancelled 0
|
||||
# skipped 0
|
||||
# todo 0
|
||||
# duration_ms 3944.33987
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"grant": "sage-2638",
|
||||
"stage": "focused",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.365,
|
||||
"log": "agents/gander/work/queue-278/run2/focused/focused-0.log",
|
||||
"name": "focused-0",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 4,
|
||||
"pass": 4,
|
||||
"fail": 0,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 4.023,
|
||||
"log": "agents/gander/work/queue-278/run2/focused/focused-1.log",
|
||||
"name": "focused-1",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 6,
|
||||
"pass": 6,
|
||||
"fail": 0,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
not ok 1 - row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
---
|
||||
duration_ms: 19.724699
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:17:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
404 !== 200
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 200
|
||||
actual: 404
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:24:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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 135.150334
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
not ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 3569.516596
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:39:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: "Uncaught (in promise) Error: !!document.querySelector('#b-thread-claims'): undefined"
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:33:3)
|
||||
async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:40:49)
|
||||
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 3689.416702
|
||||
{
|
||||
"grant": "sage-2638",
|
||||
"stage": "red",
|
||||
"steps": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.214,
|
||||
"log": "agents/gander/work/queue-278/run2/red/red-0.log",
|
||||
"name": "red-0",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.772,
|
||||
"log": "agents/gander/work/queue-278/run2/red/red-1.log",
|
||||
"name": "red-1",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 HTTP read returns held claims", "packages/webui/tests/thread-claims.test.mjs"]
|
||||
@@ -0,0 +1,33 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
not ok 1 - row278 HTTP read returns held claims without send and refuses arguments before the bus
|
||||
---
|
||||
duration_ms: 19.724699
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:17:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: |-
|
||||
Expected values to be strictly equal:
|
||||
|
||||
404 !== 200
|
||||
|
||||
code: 'ERR_ASSERTION'
|
||||
name: 'AssertionError'
|
||||
expected: 200
|
||||
actual: 404
|
||||
operator: 'strictEqual'
|
||||
stack: |-
|
||||
TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims.test.mjs:24:10)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
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 135.150334
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "--test-name-pattern", "row278 browser lists held claims", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
@@ -0,0 +1,27 @@
|
||||
TAP version 13
|
||||
# Subtest: row278 browser lists held claims and release preserves role rows and totals
|
||||
not ok 1 - row278 browser lists held claims and release preserves role rows and totals
|
||||
---
|
||||
duration_ms: 3569.516596
|
||||
type: 'test'
|
||||
location: '/home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:39:1'
|
||||
failureType: 'testCodeFailure'
|
||||
error: "Uncaught (in promise) Error: !!document.querySelector('#b-thread-claims'): undefined"
|
||||
code: 'ERR_TEST_FAILURE'
|
||||
stack: |-
|
||||
Object.evaluate (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/browser.mjs:49:35)
|
||||
process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
async setup (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:33:3)
|
||||
async TestContext.<anonymous> (file:///home/jwoltje/.t3/worktrees/mosaic-stack/gander-row196/packages/webui/tests/thread-claims-browser.test.mjs:40:49)
|
||||
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 3689.416702
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"grant": "sage-2638",
|
||||
"stage": "red",
|
||||
"steps": [
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 0.214,
|
||||
"log": "agents/gander/work/queue-278/run2/red/red-0.log",
|
||||
"name": "red-0",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 3.772,
|
||||
"log": "agents/gander/work/queue-278/run2/red/red-1.log",
|
||||
"name": "red-1",
|
||||
"expected_red": true,
|
||||
"counts": {
|
||||
"tests": 1,
|
||||
"pass": 0,
|
||||
"fail": 1,
|
||||
"skipped": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
2026-10-22T12:10:18Z
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"timestamp": "2026-10-22T12:17:12.732808+00:00",
|
||||
"count": 0,
|
||||
"remaining": [],
|
||||
"excluded_preexisting_infrastructure": [
|
||||
{
|
||||
"pid": 2880439,
|
||||
"comm": "chrome-devtools"
|
||||
}
|
||||
],
|
||||
"note": "Read-only cwd proc sweep, own ancestry excluded. No signalling. Slot already returned in gander-0094."
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"grant": "sage-2638",
|
||||
"stage": "syntax",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-0.log",
|
||||
"name": "syntax-0",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-1.log",
|
||||
"name": "syntax-1",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-2.log",
|
||||
"name": "syntax-2",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-3.log",
|
||||
"name": "syntax-3",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-4.log",
|
||||
"name": "syntax-4",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"grant": "sage-2638",
|
||||
"stage": "syntax",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-0.log",
|
||||
"name": "syntax-0",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-1.log",
|
||||
"name": "syntax-1",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-2.log",
|
||||
"name": "syntax-2",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-3.log",
|
||||
"name": "syntax-3",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
},
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 0.064,
|
||||
"log": "agents/gander/work/queue-278/run2/syntax/syntax-4.log",
|
||||
"name": "syntax-4",
|
||||
"expected_red": false,
|
||||
"counts": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
["node", "--check", "packages/webui/src/cli.mjs"]
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
["node", "--check", "packages/webui/src/serve.mjs"]
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
["node", "--check", "packages/webui/src/public/bus.js"]
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
["node", "--check", "packages/webui/tests/thread-claims.test.mjs"]
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
["node", "--check", "packages/webui/tests/thread-claims-browser.test.mjs"]
|
||||
Whitespace-only changes.
@@ -0,0 +1 @@
|
||||
/mnt/storage/scratch/tmp/gAvwCXy
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/bus/tests/"]
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"grant": "sage-2638",
|
||||
"stage": "whole",
|
||||
"steps": [
|
||||
{
|
||||
"code": 0,
|
||||
"timeout": false,
|
||||
"seconds": 23.116,
|
||||
"log": "agents/gander/work/queue-278/run2/whole/bus.log",
|
||||
"name": "bus",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 793,
|
||||
"pass": 793,
|
||||
"fail": 0,
|
||||
"skipped": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": 1,
|
||||
"timeout": false,
|
||||
"seconds": 55.324,
|
||||
"log": "agents/gander/work/queue-278/run2/whole/webui.log",
|
||||
"name": "webui",
|
||||
"expected_red": false,
|
||||
"counts": {
|
||||
"tests": 346,
|
||||
"pass": 344,
|
||||
"fail": 1,
|
||||
"skipped": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
["timeout", "-k", "10", "300", "node", "--test", "--test-reporter=tap", "packages/webui/tests/"]
|
||||
File diff suppressed because it is too large.
Load diff
Loaded 100 of 331 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user