Compare commits
394
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8708927e5e | ||
|
|
464010fbe4 | ||
|
|
e57bfde734 | ||
|
|
319d9f87ea | ||
|
|
b23783f395 | ||
|
|
e18ad27115 | ||
|
|
12f8c3089c | ||
|
|
253346e3c3 | ||
|
|
7328da8ca4 | ||
|
|
84002f960a | ||
|
|
f89aaf57fe | ||
|
|
d3a49f301a | ||
|
|
562b05b43c | ||
|
|
8c28ee7315 | ||
|
|
bce4917154 | ||
|
|
01b57f48bb | ||
|
|
54ec0005e0 | ||
|
|
61e262b7c0 | ||
|
|
540b6f16ba | ||
|
|
e6a675ee83 | ||
|
|
e77635cebb | ||
|
|
3fc8ccef1a | ||
|
|
27d3266fff | ||
|
|
6bd67225b5 | ||
|
|
14715d644a | ||
|
|
f9a9c9b5a0 | ||
|
|
34388223d8 | ||
|
|
3adb391b57 | ||
|
|
4da907cd5e | ||
|
|
aa8fc490f5 | ||
|
|
a9884dc75c | ||
|
|
25c2c1a560 | ||
|
|
4f827a5e81 | ||
|
|
7dc8ff1bfa | ||
|
|
61df3061ed | ||
|
|
b212182ed1 | ||
|
|
dac64ff311 | ||
|
|
b329ad69f5 | ||
|
|
8d4d4ec598 | ||
|
|
5ddc36ca97 | ||
|
|
f510d73676 | ||
|
|
767bb62c7d | ||
|
|
6345aae3d8 | ||
|
|
ee5f7b9ef8 | ||
|
|
0b923a2759 | ||
|
|
b0a6838ca6 | ||
|
|
0626464874 | ||
|
|
66299eeef7 | ||
|
|
569bb6b177 | ||
|
|
fb404c909d | ||
|
|
4c0a2c4fd4 | ||
|
|
2f06aad3f0 | ||
|
|
6863d4c852 | ||
|
|
9ef5798acb | ||
|
|
4897520c31 | ||
|
|
4ca2703079 | ||
|
|
25c09f19fe | ||
|
|
a6da8718c4 | ||
|
|
ee26cfbada | ||
|
|
a4da4e6df4 | ||
|
|
7309260aeb | ||
|
|
7c543fd4a1 | ||
|
|
284d55cf2c | ||
|
|
93a491d732 | ||
|
|
c7b754d7b1 | ||
|
|
a94c95522f | ||
|
|
c4f77373f9 | ||
|
|
c7e77202d6 | ||
|
|
a0094633f6 | ||
|
|
721268b084 | ||
|
|
f0e3dcdf41 | ||
|
|
01983cd3f1 | ||
|
|
626c19e78c | ||
|
|
f32b867f34 | ||
|
|
826e8fd7ff | ||
|
|
e06130fc01 | ||
|
|
466562ba03 | ||
|
|
931fab079a | ||
|
|
135bb8fae2 | ||
|
|
cf228eabc9 | ||
|
|
41f8bd1972 | ||
|
|
47906e4fde | ||
|
|
c2b845c76d | ||
|
|
74635fc608 | ||
|
|
257003ba1a | ||
|
|
537ce2dd4a | ||
|
|
3b90428021 | ||
|
|
859ae37083 | ||
|
|
88179d6de4 | ||
|
|
ccfa17eefc | ||
|
|
b5d9efa1ba | ||
|
|
69979bb8a8 | ||
|
|
155f643224 | ||
|
|
b96b4e303d | ||
|
|
f2735bb6a1 | ||
|
|
0cbe2e9b35 | ||
|
|
9538e0fc86 | ||
|
|
1a228f395f | ||
|
|
8295622600 | ||
|
|
ac0e4dc9bc | ||
|
|
c49fdb2692 | ||
|
|
cfb86f1bd7 | ||
|
|
178eefd5c4 | ||
|
|
8a29f94771 | ||
|
|
d78a9cc83c | ||
|
|
17f4157920 | ||
|
|
647424442f | ||
|
|
71fed6281c | ||
|
|
86a665bdf0 | ||
|
|
efcc9ea8dd | ||
|
|
f39508c24f | ||
|
|
d20ef317fc | ||
|
|
6e50bd6304 | ||
|
|
6c80b12904 | ||
|
|
42fd3edd45 | ||
|
|
dc5836c7df | ||
|
|
2133c5a0c6 | ||
|
|
194dec83d6 | ||
|
|
84b32e3903 | ||
|
|
9d241fdcc2 | ||
|
|
76a6524cfe | ||
|
|
693f7e745e | ||
|
|
94c33a43c0 | ||
|
|
a870fd85bb | ||
|
|
5b1f1dc885 | ||
|
|
8c638b6f66 | ||
|
|
a700992cd4 | ||
|
|
d30f35e292 | ||
|
|
e5b7d1d083 | ||
|
|
836b2f25ca | ||
|
|
73516da853 | ||
|
|
95e3f71661 | ||
|
|
cde0cd0832 | ||
|
|
100f018af3 | ||
|
|
4a8215e3a1 | ||
|
|
669e680368 | ||
|
|
c06ccc9ba4 | ||
|
|
136e5c1ca3 | ||
|
|
cf17ab387b | ||
|
|
09948da187 | ||
|
|
35615b01b7 | ||
|
|
3f1f4e44fa | ||
|
|
65b8c8a9bd | ||
|
|
271cef205c | ||
|
|
3e5db651b7 | ||
|
|
e1c9c09935 | ||
|
|
aaaf45576a | ||
|
|
cf6abca9c0 | ||
|
|
3410df7c3b | ||
|
|
1e3db53436 | ||
|
|
4dd85c6716 | ||
|
|
48e450ce8f | ||
|
|
14e4600617 | ||
|
|
a6c71e6d99 | ||
|
|
e1bc766d87 | ||
|
|
362ec674c9 | ||
|
|
f5ef1c33a3 | ||
|
|
2bef9124c4 | ||
|
|
34401e7c90 | ||
|
|
0604d91fcf | ||
|
|
ed3bb376cd | ||
|
|
cd269e7337 | ||
|
|
e75ef1b19f | ||
|
|
72b17562d9 | ||
|
|
ad67d95955 | ||
|
|
3b142c9c69 | ||
|
|
950cf47f3e | ||
|
|
cca9367168 | ||
|
|
c8cca3a688 | ||
|
|
62de848820 | ||
|
|
6f320b4b0c | ||
|
|
643d16528b | ||
|
|
730a78aa91 | ||
|
|
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 | ||
|
|
be2b008cc0 | ||
|
|
ab7377bcf1 | ||
|
|
fd6dd327c3 | ||
|
|
5fd178e44d | ||
|
|
345f3ace67 | ||
|
|
54ec93d06f | ||
|
|
4f68485272 | ||
|
|
c48239ec3d | ||
|
|
5d2c274420 | ||
|
|
9e5ad7c599 | ||
|
|
939356a1c2 | ||
|
|
3521c23c3e | ||
|
|
2311a50e1c | ||
|
|
29daebf548 | ||
|
|
2f08fd8f23 | ||
|
|
b8c3d00362 | ||
|
|
14124d96d4 | ||
|
|
e7fb59f225 | ||
|
|
e122aad8e2 | ||
|
|
4c4b8559cf | ||
|
|
b0fd28b6f3 | ||
|
|
b765f5cb81 | ||
|
|
da5d3651d7 | ||
|
|
82c8281166 | ||
|
|
ceadad993c | ||
|
|
f5611c937e | ||
|
|
343b6dd766 | ||
|
|
f40f2e770e | ||
|
|
23c3d62183 | ||
|
|
70e289ba73 | ||
|
|
ab50de9fe3 | ||
|
|
b3665f5ab1 | ||
|
|
c27207f6e6 | ||
|
|
ce6a96ad61 | ||
|
|
59f708ca21 | ||
|
|
f751505ada | ||
|
|
0fa7bf421f | ||
|
|
93d211c295 | ||
|
|
08c896e3c5 | ||
|
|
03ed2bccce | ||
|
|
ad6020754d | ||
|
|
5c8f983dde | ||
|
|
f1267e49af | ||
|
|
d2be97c5fc | ||
|
|
c13c68c813 | ||
|
|
4bdc7e0e86 | ||
|
|
86f95bb27f | ||
|
|
5365adaef6 | ||
|
|
0bbf0f6d18 | ||
|
|
95f4bd8fdc | ||
|
|
d8034c51bc | ||
|
|
b28baf7ee8 | ||
|
|
3673463182 | ||
|
|
7991662dc0 | ||
|
|
378a76b854 | ||
|
|
ddfb29af7c | ||
|
|
9c97329833 | ||
|
|
a849d89b73 | ||
|
|
0042f713dc | ||
|
|
f0d0b31e9b | ||
|
|
92be0db025 | ||
|
|
02da6a2ae4 | ||
|
|
2dd9c80c1c | ||
|
|
137ddd0079 | ||
|
|
e3c0446f55 | ||
|
|
dcd8d4ddaa | ||
|
|
eb9672c910 | ||
|
|
3315977095 | ||
|
|
41b0cf7551 | ||
|
|
5f5b51dd65 | ||
|
|
da9555ca2f | ||
|
|
0dbb242905 | ||
|
|
ea6989d4ed | ||
|
|
db1e7732aa | ||
|
|
5d2437f899 | ||
|
|
28e3d82265 | ||
|
|
524e169b8c | ||
|
|
5f73b388c4 | ||
|
|
52f36e921e | ||
|
|
6ba8a582e8 | ||
|
|
aa772d731d | ||
|
|
3dcd3651ed | ||
|
|
eb017d77f1 | ||
|
|
f842462bdd | ||
|
|
ad9cefcf2d | ||
|
|
5c91c96df5 | ||
|
|
1509c7cc57 | ||
|
|
74dea06d92 | ||
|
|
3576afffb3 | ||
|
|
73222011f2 | ||
|
|
ea0b2a16d6 | ||
|
|
cca206cdce | ||
|
|
f437973d79 | ||
|
|
33029f3a8a | ||
|
|
e69260a3ce | ||
|
|
3a853f35dc | ||
|
|
111ec559c8 | ||
|
|
25ffaae832 | ||
|
|
d372102882 | ||
|
|
b79ad5f2cb | ||
|
|
3fb00018e0 | ||
|
|
f7a77721a9 | ||
|
|
829e5f8340 | ||
|
|
abb352d27e | ||
|
|
c3d88840c5 | ||
|
|
7247d80c7a | ||
|
|
6661732925 | ||
|
|
21def28502 | ||
|
|
add0f1aae5 | ||
|
|
7d08237e17 | ||
|
|
f48725cfc1 | ||
|
|
0de97f429d | ||
|
|
0b33f5e9db | ||
|
|
3586955286 | ||
|
|
a54a17f3d8 | ||
|
|
0cdead66cd | ||
|
|
1b6158ce26 | ||
|
|
081ff6b128 | ||
|
|
be86adbff2 | ||
|
|
d163afc47f | ||
|
|
e54e054632 | ||
|
|
6096b051b1 | ||
|
|
9a8c8860d3 | ||
|
|
6195a00f8d | ||
|
|
3b0aef9952 | ||
|
|
2c38325eca | ||
|
|
640aa03f27 | ||
|
|
a365237133 | ||
|
|
5afff54908 | ||
|
|
f33932921c | ||
|
|
1be656ac97 | ||
|
|
19d3d5f026 |
No files matched your search
+203
@@ -5177,3 +5177,206 @@ Before: managed project/thread verbs had no Console conversation area. After: fi
|
||||
2026-10-21T01:28:05Z | Darkwing | row 232 #1734 installer I1 build, round 1 in review | Before: stack-release.sh managed only user units (systemctl --user), and stack-copy.sh had no bundle copy. After: --units external (adopt, activate, rollback --to, status, confirm, revert, gate --since, AWAITING-UNITS, stale-start, external-pm, --plan --expect-from) and stack-copy check --units external, copy --bundle FILE SHA, wrapper ID --create; user mode byte-identical to the base by test. First build 0af0c73c6 on 00d4cc1f6; rebased onto row 200 (cb5fdb064) as a0ffabc3f on darkwing/row232-r1; --sso refused under external (D9), row 200 config_checks run under external (D10). Gate on Sage's slot (sage-1618): cli 561/0, every scripts/test-*.sh green; 17/17 mutants killed. Results commit 84f1a91e6 (pushed, seat branch only). Manifest 7a3b4ea1 (9 paths), queue revs 2595-2596, request comment 29825, reviewer Filbert. Packet agents/darkwing/work/queue-232/BUILD.md.
|
||||
2026-10-21T04:50:44Z | Darkwing | row 233 #1735 installer I3 build, round 1 in review | Before: root had no upgrade driver for root-owned units and no host run sheet; stack-release.sh had no rehearse --backup last and no external plan refusals. After: scripts/stack-upgrade.sh upgrade and rollback (r6 A1-A5, A2f, R1-R4) with 20 tests, docs/guides/host-run-sheet.md, TOOLS.md lines, and on Sage's rulings stack-release.sh --backup last, BACKUP_STORE and the --plan refusals open-activation and migrate-required (3 tests). Base e65a3ab4d (row 232's landing). Gate on Sage's slot (sage-1704) on d99166ade: cli 616/0, every scripts/test-*.sh green, 1201/0 summed by awk; m1-m8 8/8 killed. Correction: the process sweep after the gate found an orphaned sleep 60 from the lock test's flock holder (N1); 08db6ac3f fixes it test only, Sage ruled the gate stands (sage-1707), rerun c0 20/0 and m1 killed with 0 left (sage-1708). Tip 1a1dc80ca (pushed, seat branch only). Manifest 464ce9eb (7 paths), queue revs 2644 and 2647, request comment 29901, reviewer Filbert. Packet agents/darkwing/work/queue-233/BUILD.md.
|
||||
2026-10-21T06:37:41Z | Darkwing | row 240 #1746 installer I4 build, round 1 in review | Before: root had no host check for the bwrap AppArmor profile, its pins or a boot unit, and stack-upgrade.sh exited 1 args-failed when the args move after A5 failed, while exit 1 means the old copy runs. After: scripts/case1-hostcheck.sh (seven items, --check, --enforce, --upstream), scripts/case1-pins.sh, mosaic-hostcheck.service and 16 tests; the args move failure exits 5 args-failed, documented in TOOLS.md and run sheet section 6 and tested; run sheet section 3 puts the pinned npm on PATH and names the bin/claude.exe --claude path; sections 8 and 10 have precheck lines. Verification: slot run r1 on 47ec9fe2f failed at the singles (the new N1 test's after hook threw ENOENT after the fixture cleanup removed the root); b45852daa drops the hook; r2 on b45852daa green: singles 16/0 and 21/0, c0 plus M1-M8 8/8 killed, cli 639/0, scripts 585/0. Candidate darkwing/row240-r3 ad1b23ab2 on c771a36f4, manifest 573ece95 (9 paths), revs 2694 and 2695, comment 29943.
|
||||
2026-10-21T09:00Z | Herb | row 215 C2-04 implementation started | Before: business files reject library entries and root consumers assume code projects; the organization writer can change all project mappings. Plan: approved manifest 2522025af on C2-01 a2c72ac95, Filbert reply to herb-0056, scope sage-1848/1852/1860. Focused slot sage-1869 observed expected red mapping and M9 cases, then 14/0 green for new T1/T2 cases, no skips; clear herb-0062 with empty test/fixture process scan. After that clear, T3/T4 tests and host-only mirror/bus implementation continue under sage-1874, unrun while Sage holds the slot. Full singles, suites and implementation review remain pending. No source commit, push or live change.
|
||||
2026-10-21T13:29Z | Herb | row 215 C2-04 source verified for candidate review | Before: business code assumed every project had a root and organization writes could replace project mappings. After: library mappings load without agent checkouts or publish grants, project mappings are protected before and after serialization, host-only bare mirrors share a bounded publication lock with sync, and library.file/library.status are human-only async bus reads. Base f8276c5eb preserves all nine landed overlaps. Granted sage-2008 whole singles: 16 files, 451/0, no skips or cancellations, ended 13:27:27.279728Z; all source hashes unchanged, process scan empty, no own-path drift through 8a04f4aa4. Full landing gate and implementation review remain pending; no HTTP, sync writer or live change.
|
||||
|
||||
2026-10-20 19:09:44 UTC | Gander row 196 #1694 design phase | Before: tester TCP reaches every local uid and human proofs do not bind the socket peer. After: design draft at agents/gander/work/queue-196/DESIGN.md inventories listeners, proposes private tester HTTP and SO_PEERCRED binding, aligns the per-request principal contract with Morgana and Gizmoduck, and lists migration, tests, mutants and same-uid limits. Python versus other credential options and Console provenance require Duckworth ruling. Documentation only. No product code, suite, live probe, secret access or deployment.
|
||||
|
||||
2026-10-20 19:16:20 UTC | Gander row 196 #1694 design r2 | Before: Duckworth r1 requested concurrent helper-fd evidence (B1) and selected O1 with interpreter, proof-only and image conditions. After: design adds eight concurrent genuine proof processes plus a racing copier, M20 swapped socket and post-helper socket survival, root-owned system ELF pinning and activation evidence, safe gid validation, cap traffic without helpers, and unchanged P19 R2 text. Mos accepted socket-only tester access (mos-1015 via sage-1363); any authenticated browser relay is a separate row. Documentation coverage checks passed. No product code, suites or live action.
|
||||
|
||||
2026-10-20 19:21:19 UTC | Gander row 196 #1694 design approval and N5 | Before: Duckworth approved r2 (duckworth-0009, cb6d840df) with a nonblocking interpreter-upgrade note. After: r3 chooses startup safety revalidation, appends actual interpreter identity to bus/peercred-starts.jsonl and retains old activation evidence. Operator re-pin uses the next reviewed copy, respecting already-active refusal. Added task-by-task PLAN.md for inline implementation and independent manifest review. Documentation checks passed. No product code, suites or live action.
|
||||
|
||||
2026-10-20 19:34:28 UTC | Gander row 196 build paused at design mismatch | Before: approved design promised Unix tester cleanup only for the owned inode. After: scratch test shows Node/libuv close unlinks a replacement inode before JS close handlers. Evidence agents/gander/work/queue-196/evidence/tester-cleanup-blocker.txt. Sent Sage/Duckworth gander-0016/0017, recommending explicit same-uid residual with private 0700 parent retained. Interpreter, concurrent peer, principal, human, peer-transport, transport, tester and process single files passed. Partial code uncommitted, tester transport not wired. No suites, mutant batches or live actions.
|
||||
|
||||
2026-10-21 18:45 UTC | Gander row 196 preservation before rebase | Sage-2051, Mos order mos-1193, explicitly authorizes commit and fast-forward push of the current build before deferred full verification. Product and evidence preserved together; prior focused checks and stopped gates are recorded in the row196 packet, with no claim of full acceptance. Next: rebase onto a36523713 on new gander/row196-r2, report range-diff/patch-id/conflicts, then await Sage's clear for M1-M29 and all requested suites. No live action, force push, branch deletion or tests during hold.
|
||||
|
||||
2026-10-21T16:34:44Z | Huey | Q198/Q199 system-manager design, mos-1183, Vikunja 452 | Before: pinned foundation 6c75887b0 has separate bus, development queue, run evidence, turn/cohort controls and launch/usage paths; the assignment requests a mechanical manager design. After: docs/plans/2026-10-21_q198-system-manager.md proposes admission/cooldown, priority and safe interruption, durable requests, bounded retry/DLQ/replay/rerouting, Console monitoring, optional decision adapters with USD reservations, six ordered slices and three recommended owner decisions. Verification: 26 pinned file:line references resolve, ten-line summary, manual source/contract review, git diff --check and installed queue guard pass. No builds/suites, runtime writes, credential reads, service changes or paid calls. Huey queue next refused the linked worktree, then returned nothing from canonical checkout; direct brief controls this assignment. Gitea issue and queue-row capture are handed to Sage under the no-credential-read/no-queue-write boundary.
|
||||
|
||||
2026-10-21T18:45:47Z | Huey | Q198 system-manager design r2, mos-1194, Vikunja 452 | Before: Scrooge requested changes on add7cb506 for decision-key worker exposure, cap scope and absent sampler ownership. After: distinct MOSAIC_DECISION_OPENROUTER_KEY with S6 sessionEnv canary requirement; exclusive per-instance key with per-key caps and provider limit on every enablement; S2 owns supervisor sampler and waits until after MVP/re-pin. Also records P1 interpretation, missing-confidence fallback and stand-in timeout selection, explains verified Noul spelling, excludes notifier/gateway retry loops with citations, and cites lifecycle revocation requirement. Verification: 30 pinned citation spans resolve, ten-line summary, manual diff/source review and whitespace/queue-guard checks. No builds, suites, live changes, credential reads or paid calls.
|
||||
|
||||
2026-10-21T19:56:11Z | Huey | Q198 design r3, mos-1201/1201a, Vikunja 452 | Before: Scrooge approved r2 7e785a08f with three notes. After: N1 names proposed system.health bus read verb and includes broker handler/authorization in S2 scope and review; N2 labels exclusive ownership as a setup attestation that cannot be mechanically proved and identifies provider key limit as real ceiling; N3 adds recommended Q4 for P1 narrowing and removes the Mos-flag instruction. Other design content retained. Verification: manual r2-to-r3 delta review, ten-line summary, whitespace and installed queue-guard checks. No builds, suites, live changes or paid calls.
|
||||
|
||||
2026-10-21T20:19:53Z | Huey | Q198 design r4, mos-1203, DECISIONS Q204, Vikunja 452 | Before: r3 a36952564 presented Q1–Q4 for owner approval. After: section 9 records Q20a–Q20c verbatim as approved; D11 labels Huey’s reading of configurable daily/monthly caps with $0.10/$1 defaults in the one instance config via reviewed schema; provider key ceiling and explicit enable/key requirements retained; Q4 pending, Jason restated 2026-10-21, P1 unchanged. Verification: quotes match DECISIONS ledger, unrelated sections and P1 equal r3, ten-line summary, whitespace and installed queue guard checked. No builds, suites, live changes or paid calls.
|
||||
|
||||
2026-10-21T20:48:49Z | Huey | Q198 design r5, mos-1206, DECISIONS Q205/Q206, Vikunja 452 | Before: r4 1e8bccff1 left Q4 pending and long outages could exhaust request retry budgets. After: protected mode separate from unchanged D1 human kill authority; mechanical detection, safe-point pause/proof, JEV-first endpoint-before-headless probes at 60-second increments to 600 seconds without attempt limit, upstream reset waits, shared D11 probe accounting, one test session then batches, proposed three-failed-exit escalation, frozen outage clocks/counters without DLQ, advisory online-service routing, Q4 superseded and Q22 pending. Thresholds/deadlines/batches/escalation explicitly labelled Huey readings. Acceptance proposals updated, no implementation. Verification: complete Q205/Q206 read, quotes match ledger, D1/inventory/Q1–Q3 unchanged, 30 pinned citation references resolve, 11-line summary, manual consistency/diff review, whitespace and installed queue guard checked. No builds, suites, real probes, live changes or paid calls.
|
||||
|
||||
2026-10-21T21:04:37Z | Huey | Q198 design r6, mos-1208/mos-1210, DECISIONS Q207, scrooge-0003, Vikunja 452 | Before: r5 fd44f7c60 gated probes on JEV and lacked request-local resume failure separation. After: parallel independent probes; central JEV/smaller-model/rules endpoint chain, per-model timeout/calibration, 4 KiB metadata limit and isolated fallback credentials; subscription quota vs metered USD accounting and separately enabled paid-probe budget (proposed $0 defaults). S-F1–S-F7: bounded outage classification, request-local D6/two-resume DLQ rule and batch definition; escalation latch with authorized revision-bound system.recovery.release separate from kill clear; cooperative F5 pause/F6 proof only; proposed configurable 24-hour cumulative pause expiry; full Q205 kill sentence with labelled protected-mode interpretation; r3–r6 history. S5/S6 acceptance proposals updated. Verification: Q205/Q207 quotes match ledger, D1/inventory/Q1–Q3 unchanged, 30 pinned references resolve, summary within 15 lines, manual consistency/delta review, whitespace and installed queue guard checked. No builds, suites, real probes, live changes, credential reads or paid calls.
|
||||
|
||||
2026-10-21T21:39:25Z | Huey | Q198 r6.1 touch-up, mos-1222, scrooge-0004 N1–N3, Vikunja 452 | Before: approved r6 2ee68cd69 had unprovable session-call denial wording, implicit queue/late-call behavior and a partial Q207 paragraph. After: rule/S6 tests require session decision calls/output have no routing authority; non-waiting dispatchers use internal rules immediately; timed-out JEV does not occupy fallback decision slot but retains spend reservation; full Q207 paragraph copied exactly from DECISIONS; matching Q22 reading corrected. ENV_ALLOW and all runtime code unchanged. Verification: exact full-quote equality, obsolete wording absent, D1 unchanged, summary within 15 lines, manual N1–N3 delta review, whitespace and installed queue guard checked. No builds, suites, probes, live changes or paid calls. Review/handoff via T3 as Mos authorized.
|
||||
|
||||
2026-10-21T21:11:44Z | Della mos-1213 / Vikunja 460 planning phase | Before: PRD 1.10 has no email feature; MP 95b0298 and EP 7a64921 are read-only prior inputs. Scope: independent post-v1 email plan on della/email-plan, no implementation/live access/MVP or queue changes. Gitea issue enrollment belongs to Mos/Sage because this seat has no API credential.
|
||||
|
||||
2026-10-21T21:12:18Z | Della mos-1213 / Vikunja 460 planning verification | After: docs/plans/2026-10-21_email-plan-della.md is 341 lines, with 13 post-v1 rows and six Jason questions. Verified 42 pinned citation anchors, ten requested coverage areas, identical prior src trees, append-only records, clean whitespace and repository queue guard. No configured CI pipeline or CI-queue wrapper found in the current foundation; documentation-only validation applies, no product suites or live tests run. Phase B/C and Gitea issue/queue enrollment remain with Mos/Sage. Only della/email-plan is authorized for push.
|
||||
|
||||
2026-10-21T21:37:07Z | Della mos-1220 / Vikunja 460 phase B cross-review | Before: independent plans Della 191dff32f and Ludwig 4a27b73ac delivered. After: docs/plans/2026-10-21_email-review-by-della.md reviews all 218 Ludwig plan lines, records ten findings, five grafts, six retained strengths, nine disagreements and eleven merged Jason questions. Ludwig review 143415779 read in full after ludwig-0002 arrived; reconciliation records new mail-access action, no agent reroute and correction of Della dataRoot credential example. Original plan unchanged. Planning only, no product/MVP/queue/live change.
|
||||
|
||||
2026-10-21T21:43:02Z | Della mos-1223 / Vikunja 460 phase C synthesis | Before: independent plans/reviews complete, Mos selected Della base. After: docs/plans/2026-10-21_email-plan.md merges Ludwig grafts and accepted corrections, with 16 post-v1 rows (eight READY, eight WAIT/optional), eleven deduplicated Jason questions, per-row test paths and explicit Q210 non-v1 scheduling. Original Della plan/review preserved; Ludwig originals remain on their branch. Static checks cover graft/row/question/citation anchors and original blobs. No source code, suite, mailbox, secret file, service, MVP or queue change. Candidate goes to Ludwig before Sage landing/queue handoff, copying Mos.
|
||||
|
||||
2026-10-21T21:45:20Z | Della mos-1223 / ludwig-0004 focused corrections | Before: b096a16cc left content-key location implicit and E05 core registration marked ready. After: merged plan 399 lines fixes external configDir secret key/lifecycle namespace outside dataRoot backup/restore, E01 schema and E03 missing/expired-key restore tests, and E05/E06 test-local registry readiness with core kinds.mjs registration gated on approved E01/Q4. Sixteen rows and eleven questions retained; originals unchanged. Focused static checks and queue guard apply, no product/live changes. Reviewer will check changed lines only.
|
||||
|
||||
2026-10-21T22:24:12Z | Huey | T1 item 7 sessions design r1, mos-1232, Vikunja 463 | Before: origin/refactor cca206cdc keys assistant claims/stores/messages by thread and renders Pi compaction markers; row 194 r4 excludes thread context clear. After: docs/plans/2026-10-21_t1-sessions.md proposes independent per-agent sessions within threads on Pi/Claude, scoped claims/stores/messages/workspaces, completed compaction counts, owner-write/RBAC matrix, idempotent proven-stop/fresh-successor clear, common admission/kill checks, migration and seven acceptance groups, replacement REQ-ROLE-2/REQ-THREAD-2 text and three owner questions. PRD 1.12 USER-3/4 candidate 1509c7cc5 cited separately from base. Verification: 22 pinned references resolve, eight-line summary and three exact owner quotes; manual source/consistency review, whitespace and installed queue guard checked. No code, queue/PRD edits, builds, suites, credential reads, live changes or paid calls. MVP priority ahead of Q198 S1. Review via Scrooge, then Sage/Ludwig as Mos authorized.
|
||||
|
||||
2026-10-21T22:28:56Z | Huey | T1 sessions design r2, scrooge-0006, mos-1235/1236, Vikunja 463 | Before: r1 347278044 lacked the exact per-session checkout/single-writer invariant and safe runner drain ordering, and admitted other role instances. After: F1 exact workspace path, fenced checkout setup, legacy shared-workspace quiescence, clear retains old dirty/untracked/unpushed checkout and creates fresh approved checkout, T2 mutant; F2 dequeue fence and generation-bound turn-boundary idle proof before runner signal, busy drain stays clearing, T4 cases; F3 THREAD_DEFINITION only per Mos scope ruling, no role eligibility change; N1 private titles/history vs owner-visible count/activity projection; N2 Claude offline adapter/managed-store-reader dependency flagged as MVP risk. Section 8 records Mos’s Q1–Q3 readings, no questions to Jason. Verification: 27 pinned references resolve, summary within 15 lines, source/delta consistency review, whitespace and installed queue guard checked. No code, queue/PRD edits, builds/suites/live changes/provider calls/credential reads.
|
||||
|
||||
2026-10-21T22:30:20Z | Huey | T1 sessions design r3, scrooge-0007 R1, Vikunja 463 | Before: r2 e19e30df2 nested new session checkouts under the retained legacy instance workspace, allowing project-name collision or historical parent inspection to reach live siblings. After: exact path is dataRoot/session-workspaces/business/instance/session, outside the legacy root; canonicalized ancestor/descendant overlap refuses; T2 nesting mutant covers historical mount/inspection and a legacy project named sessions. All other r2 content retained as approved, revision label updated. Verification: old nested path absent, manual R1-only delta, whitespace and installed queue guard checked; no code/builds/suites/live changes/provider calls/credential reads.
|
||||
|
||||
2026-10-20 18:51:10 UTC | Row 191 #1689 design phase | Before: per-business launch revoke and per-binding Discord STOP leave task containers, active sessions and background work without one switch. Proposed per-data-root durable halt with human-only resume, generation-fenced starts, bounded concurrent termination, write-once stop receipts and existing event mirror; no schema migration. DESIGN.md inventories starter/continuation paths and container control-mount restriction. Sent to Dewey with Sage copied; implementation waits independent design approval. No tests, commits or live actions.
|
||||
|
||||
2026-10-20 18:57:51 UTC | Row 191 design revision | Dewey r1 changes: interim Console --send absence, reserved processing events and missing-state semantics required correction. DESIGN-r2.md now names CLI interim path, unavailable UI controls, trusted initialization and fail-closed missing leaf, container delete/replace mount tests, reservations and id-bound reconciliation. Small notes addressed including diagnostic seats and aliases. Recommended smaller Docker scope to Sage; design and scope approval pending, no code or test runs.
|
||||
|
||||
2026-10-20T19:50:56Z | Rocko | row 191 #1689 implementation stage: from independent brakes to shared root state, generation-fenced launcher and tracked stops, Discord/task guards and control HTTP/UI. Evidence is agents/rocko/work/queue-191/logs/ and PROGRESS.md. Fixture single files only so far; heavy verification and candidate not complete. Scope additions sage-1367 (one read-only CODE file) and sage-1392 (processing-only client socket timeout); no schema, proof baseline, live file/unit, commit or push change.
|
||||
|
||||
2026-10-20 22:58:45 UTC | Rocko | row 191 #1689 rebase inspection candidate | Rebuilt uncommitted kill-switch tree from da230ca48 onto landed row 190 base 00d4cc1f6 under new branch rocko/row191-r2-00d4. Hand merges retained instance flags and SSO/sign-out changes; fixture tests exposed and fixed SSO signer compatibility and two unknown-runtime cleanup defects. Final touched singles 249/249 across 26 files; 15 overlapping Client reader files 102/102. Manifest a4f780c2 has 78 paths; packet 185 files verified with scan clear. Mutants and owner gate remain pending; no review-ready or activation claim, no commit/push/live action.
|
||||
|
||||
2026-10-21 23:39:21 UTC | Rocko | row 191 #1689 inspection snapshot | Sage-2242 authorized a local inspection commit for Honker's row 194 S6. Created d52b4db1c on new rocko/row191-inspection-20261021, parent 00d4cc1f6, preserving the reviewed-design build and candidate a4f780c2 (78 paths). Static manifest/index/source scan and diff check verified; no tests run, no push credential or push attempt. Existing single-file evidence is historical, 249/249 and overlapping Client readers 102/102; suites/mutants/gate remain pending. Current code has verified runtime signalling and instance halt, but no dedicated per-run stop API yet; Honker and Sage notified of that seam directly. Snapshot is not review-ready or approved for live use.
|
||||
|
||||
2026-10-22 00:04:05 UTC | Rocko | row 191 #1689 per-run stop inspection | Implemented agreed Honker-0079/0081 stopRun contract with verified per-signal identity, fixed 5s+2s, durable first-owner join and immutable result plus later-exit observations. Focused CLEAR sage-2250: final 9 files 62/62, no skipped, after correcting host guard placement and peer-discovery fixture timeout isolation; initial failures and failed teardown logs retained, only own failed group stopped. Slot returned with cwd sweep clear. Sage published f7bf7dfec; sage-2265 clean rebase creates 7aa18b0f6 on dcd8d4dda under new branch, explicit Rocko identity, all 79 manifest product blobs identical so 62/62 evidence carried. Direct S6 handoff sent to Honker and Sage. Wider suites, mutants, review and activation remain pending.
|
||||
|
||||
2026-10-22T00:18:12Z | Sage (Opus 5.5) | row 254 landing (#1759), library.sync human timeout | Before: the human transport gave library.sync the 5-second default, so a sync longer than that reported outcome-unknown, and six library-* codes reached the Console as 502. After: 331597709 lands Megavolt's candidate (7 paths, tree d49e4626f, manifest digest be63cfbe recomputed and matched). human-cli.mjs waits 130 s for library.sync, past the server's 120 s hold, and 5 s for other verbs. webui bus.mjs maps library-sync-busy, library-diverged and library-accept-stale to 409, library-accept-invalid to 400, and library-credential-missing and library-fetch-failed to 503. channel-proof re-pinned. Merged-tree gate on the landing commit: library 77/0, bus 628/0, webui 305/0 (1 skip), cli 749/0 (23:44:33-23:55:11Z). eb9672c91 adds the README request-timeout sentence (Dewey N1) and a DEFERRED entry for the four library codes still at 502 (Dewey N2, binds the Console library routes row). Overlap sweep before push: 268 rebased to r2 ecd9b35eb (README only, approval carried webby-0096), 194 rebased to b7. Done rev 3072, #1759 closed.
|
||||
|
||||
2026-10-22 00:24:34 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 full gate on c78f48946 | stopped on second integration failure per sage-2275; singles 269/269, processing-control 61/61, bus 646/646; CLI interrupted with 26 observed failures; no further edits; cwd sweep empty and slot returned to Sage.
|
||||
|
||||
2026-10-22 00:48:20 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 eb3abba12 full gate | stopped at Discord 190/192; 32 singles 304/304, processing-control 61/61, bus 646/646, cli 761/761; two uninitialized Discord fixtures reported to Sage; no later run; cwd sweep empty, slot clear.
|
||||
|
||||
2026-10-22 00:58:27 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 sage-2294 fixture fix | e6800380d on eb3abba12, two test files/four additions, assertions preserved; 338-entry static all-package sweep recorded; no tests; sent Sage for publication and Honker for dependent gate.
|
||||
|
||||
2026-10-22 01:30:04 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 e6800380d resume | binding15/15, recover5/5, Discord192/192; stopped WebUI314 passed/4 failed/1 esbuild skip; processing polling violates sign-out/manual redirect and bar changes layout; no fixes/retries, cwd sweep empty, slot returned.
|
||||
|
||||
2026-10-22 01:38:08 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 sage-2317 Console integration fix | 8e1f55c1d on e6800380d; shared sign-out/manual redirect/interval and desktop frame fixes, assertions retained, six browser cases, 73 mutant sites preflight; syntax only, no tests; sent Sage/Honker.
|
||||
|
||||
2026-10-22 02:06:38 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 rebase sage-2329 | eafcbd3e7 on ddfb29af7, new branch, dispatcher retains processing and access; CLI/readme auto-merges checked; 87-path fd0f2740 manifest and 73-site preflight; Sage2333 published, awaiting CLEAR; no tests.
|
||||
|
||||
2026-10-22 02:20:51 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 eafcbd3e7 full gate | stopped singles313/6: six new browser cases count app freshness timer as processing timer; diagnosis sent Sage, no fix/retry; no suites/shells/mutants; cwd sweep empty, slot clear.
|
||||
|
||||
2026-10-22 02:23:13 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 sage-2345 timer fixture | 4db8b5778 on eafcbd3e7, one line attributes timer to processing.js; all assertions retained, no product change or tests; sent Sage and Honker; awaiting publication/CLEAR.
|
||||
|
||||
2026-10-22 02:25:29 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 sage-2349 record commit | 0f8235277 on 4db8b5778 adds packet BUILD.md cause record; product manifest remains ffb46fbd/87 paths; no amend, product change or tests; Sage/Honker notified.
|
||||
|
||||
2026-10-22 02:48:36 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 0f8235277 full gate second red | singles330/330, processing61/61, bus646/646, cli783/783, discord192/192; WebUI323/1/1 host esbuild skip; shell geometry1062vs1000; stopped/no retry, no later suites/shells/mutants; cwd sweep empty, slot returned, Sage escalates Mos.
|
||||
|
||||
2026-10-22 02:57:36 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 #1689 mos-1248 desktop layout restart | FF 5cd32f4c1 on 0f8235277: desktop grid allocates processing bar, existing shell assertions kept, visibility/no-scroll assertions added; 74 static mutant sites; candidate 2f93ef19; sent Webby/Sage for static review; no runs, awaiting review and CLEAR.
|
||||
|
||||
2026-10-22 03:11:09 UTC | Rocko (Codex gpt-6.1-sol, d99326cc) | row 191 static nav layout, mos-1249/1250 | FF da4334806 on 5cd32f4c1; controls first in nav, non-sticky per sage-2386/webby-0108; candidate-only placement assertion changed, landed shell assertions preserved; 77 mutants statically preflighted; manifest 245dceb1; Webby/Sage handoff sent, no runs, awaiting static look/publish/debug CLEAR.
|
||||
|
||||
2026-10-22 03:15:11 UTC | Rocko (d99326cc) | row 191 sage-2394 debug | da4334806 shell5/5 and processing-browser9/9, awk14/0/0; geometry heights reported with read-only distinction; cwd sweep[] and slot returned; full window awaits separate CLEAR.
|
||||
|
||||
2026-10-22 02:01:30 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 202 #1700 FED R5 landing | ddfb29af7 on 9c9732983: 6 manifest paths from a74cd9f87 (digests match CANDIDATE.sha256, patch-id 9d89077b equal); Duckworth APPROVE r5 rev 3026; C1 gate by Quackerjack on merge 3b86180b9: cli 771/771 skip 0 (run 2, run 1 red on gate TMPDIR length), 10 test-*.sh rc 0, M1-M13 killed; done rev 3108; landing note refused for length before the done move, so the record is the commit body and #1700 c30265; 191 and 194 rebased onto it (one scripts/mosaic case line)
|
||||
|
||||
2026-10-22 03:35:55 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 273 #1778 activate --send/--no-sso landing | 0bbf0f6d1 landed on 378a76b85, a rebase of cac7d0f67 (0042f713d) with all 6 range-diff pairs = and equal patch-ids; 4-path manifest e1031023 unchanged; Filbert APPROVE rev 3111 (c30308) carried merge-scoped under mos-1160, carry comment c30319 names 0bbf0f6d1. Gate on 0bbf0f6d1 by Darkwing: stack-release.test.mjs 218/218 skip 0, stack-release-external.test.mjs 25/25 skip 0, test-release.sh rc 0 (selftest 14/0, no skips), T58 controls c0 11/11 pass and c1 11/11 fail, M1-M7 killed. Rerun because row 202 changed scripts/mosaic, which stack-release.test.mjs copies. Red 1 was 978143bf4 (T53 test 6 usage pin). This doc commit adds the TOOLS.md usage line and F39 rules (Filbert N1).
|
||||
|
||||
2026-10-22 04:02:12 UTC | Rocko (d99326cc) | row191 full window0fa7bf421 | touched35files336pass, packages2403pass/1esbuildskip, shells425selftests+156queue node pass; SR01–07killed, SR08timeout,69unrun; stopped/no retry;88blobs restored,cwd sweep[],owned network removed,slot returned Sage; await Mos ruling.
|
||||
|
||||
2026-10-22 04:14:56 UTC | Rocko (d99326cc) | row191 control/resume sage-2427 | control12/12;SR08separate timeoutkill;49resumed assertionkills thenKS43survived;total56assertionkills+1timeout,1survivor,19unrun;88blobs restored,cwd sweep[],slot returned,Sage/Mos informed;no retry/edit.
|
||||
|
||||
2026-10-22 04:21:30 UTC | Rocko (d99326cc) | row191 KS43+19 retarget run | KS43assertionkill thenKS44invalid mutation syntax;57assertionkills+1timeout,1invalid,18unrun;stopped,no edit/retry;88hashes restored,cwd sweep[],slot returned,Sage/Mos notified.
|
||||
|
||||
2026-10-22 04:30:06 UTC | Rocko (d99326cc) | row191 KS44+18 resume | 10assertionkills thenKS54timeout-without-control despite dependency assertion;total67assertionkills+1timeoutkill,1unqualifiedtimeout,8unrun;88hashes restored,cwd sweep[],slot returned,Sage/Mos notified,no retry/edit.
|
||||
|
||||
2026-10-22 04:41:46 UTC | Rocko (Codex gpt-6.1-sol,d99326cc) | row191 #1689 builder complete/in-review | published0fa7bf421,manifest0bcbf337;35singles336pass,9packages2403pass/1knownskip,10shells425selftests+156queue nodepass;75assertionkills+2controlledtimeoutkills=77;88hashrestore,cwd sweep[],slotreturned;in-review rev3114,expected no-token failure3115(exit1);Sage/Dewey handoff,no live action.
|
||||
|
||||
2026-10-22 05:03:18 UTC | Rocko (Codex gpt-6.1-sol,d99326cc) | Vikunja502 processing test/runner hardening | brief+isolatedrocko-v502;expected wordingred→green,Node27/27,Python4/4,5/5assertionkills(includingSR08andKS54nohang),0skips/timeouts;sweep[],candidate5hashrestored,slotreturned05:01:29Z;candidate968d6ee3,runnerc5bdc764;packetready,no commit/push/liveaction.
|
||||
|
||||
2026-10-22 05:07:34 UTC | Rocko (d99326cc) | Vikunja502 committed/review handoff sage-2482 | newbranchrocko/vikunja502-ce6a-20261022,source8e3c6a79b+packet9bf4683c6 on ce6a96ad6;5paths no base drift,range-diff=,patch-id37135ebe unchanged;manifest968d6ee3,packet93889519 verifies39/39;focused runs carry;Sage publish/Dewey review handoff sent,no push/liveaction.
|
||||
|
||||
2026-10-22 05:10:00 UTC | Sage (1ef1e4f8) | serial landing 205 then 268 | 205: 3 commits, 4 paths, digest 858463b1, every scripts/test-*.sh green on ce6a96ad6, Duckworth N1-N4 carried (N1/N3 to 205b or R3, N2 to the 193b2 brief, N4 #1782 before any user thread goes live). 268 r4: c27207f6e on 205, 9 paths, digest caa0fa4e, patch-id 2942acc8 equal to r3. Overlap checks clean before both pushes. No live action; LIVE stays 86f95bb27.
|
||||
|
||||
2026-10-22 05:58:59 UTC | Rocko | row 279 #1784: before, deadline overshoot skipped final observation and returned unknown; after, one-line for (;;) retains final mapping and unchanged unreachable fallback. Regression red as specified; whole stop-run 13/13 and processing-control 62/62; M1 assertion kill, no skips, restored and swept. Source 1016b8584, packet cad927137; manifest 312ed511d8f1cff826ee2fd547de8368923130c7bfe06236d8e29d8655b80aaa. Pending Sage publication and Dewey review; no live action.
|
||||
|
||||
2026-10-22 06:15:54 UTC | Sage (1ef1e4f8) | row 279 #1784 landed (mos-1269) | Before: stopRun returned unknown for a live run when a sleep overshot the deadline. After: LANDED ceadad993 as a carry of cad927137 onto 343b6dd76 (range-diff 1:= 2:=, patch-ids 6d8ae7f4/e484c297 equal, Dewey carry c30410). Sage gate on cad927137: business 209/0/0, cli 794/0/0, discord processing + processing-stop 9/0/0. Correction: the first discord run wrote to a wrong out path and ran nothing; the rerun is the result. Overlap sweep clean (13, 257). Note rev 3144, done rev 3145. No live action; LIVE stays 86f95bb27.
|
||||
|
||||
2026-10-22 06:37:43 UTC | Sage (1ef1e4f8) | row 194 b16 third red (mos-1269/mos-1270) | Gate on ceadad993 + 9cdc47d04: business 228/0, cli 826/0 (T9a passes), control-board 124/0, bus 705/1 at grant-executor.test.mjs G13 (timed out 10044 ms); conversation, webui and scripts/test-*.sh never ran. runb8 green 436/0/0, 17/17 mutants. Correction to sage-2524 (mos-1270): the stuck wait is the first until at :733, the holding file after decision.resolve, so the executor never started the install and hosts.revoke at :734 never ran; it is not a revoke-path hang. Ruling: a diagnosis run, 30 base + 30 candidate alternating under cli load, no gate retry.
|
||||
|
||||
2026-10-22 07:51:04 UTC | Rocko | row 280 #1785: before, any TCP connect could accept a port our sshd failed to bind; after, attempt-local exact log proof plus liveness and connect, non-ephemeral picker, bounded scratch remote sleep cleanup. Both occupied regressions red on old acceptance; CRLF build failure captured and fixed under sage-2535. Committed source b765f5cb8, packet d6c924764, manifest27806c0579c76d0999d2e6be4180c3867570df0268af9d7e0d7b971af799e6f5. Repeats07:29:03Z–07:48:38Z grant1230/1230,host780/780,CLI1588/1588; final M1/M2 four assertion kills,0skips/timeouts,sweepclear. Sage publishes/gates; Duckworth reviews.
|
||||
2026-10-22 08:00:02 UTC | Sage (1ef1e4f8) | row 280 #1785 landed | before: the bus tests' scratch sshd helper returned a port on a connect alone, and 194 b16's gate hung at G13 (base hung too, honker-0127). After: b0fd28b6f on refactor, a ff from da5d3651d (b765f5cb8 + Rocko slim packet; full evidence d6c924764 on rocko/row280-da5d-20261022). Duckworth approve rev 3153 (manifest 27806c05). Sage gate bus 656/0/0, ge 41/0/0, hr 26/0/0 (c30431). Rocko repeat 2010/2010 under cli 1588/1588, no timeout; M1/M2 killed 4/4. Two build-time slips recorded in Rocko's packet: a runner root path (no test ran) and the CRLF sshd log line. Overlap 13/257 clean. Note rev 3154, done 3155, #1785 closed c30432, P19 511 comment 623. 194 b17 rebases on b0fd28b6f (sage-2542).
|
||||
|
||||
2026-10-22 08:38:11 UTC | Sage (1ef1e4f8) | row 194 #1692 landed | before: 194 b16 9cdc47d04 went red three times (stopRun deadline, then the bus test sshd port race), fixed by rows 279 and 280. After: fd6dd327c on refactor, a ff on e122aad8e. b18 is b17 3f451772d rebased after my doc and queue push blocked a ff (16 =, series patch-id 64303253f8e6, packages equal b17). Webby approve rev 3160 on manifest 29f131ab. Honker gate on fd6dd327c: runb8 503/0/0, mutants 17/17; 18 packages 3668/0, ten scripts rc=0, Docker up, env skips named. The secret scan hit three fake_*_token fixtures in bus tests (false positive). Note 3161, done 3162; #1692 closed c30435; P19 414 comment 625. LIVE still 86f95bb27.
|
||||
2026-10-22 08:42:04 UTC | Honker (Claude Opus 5.5, ecd17786) | row 194 #1692 agent lifecycle build | before: no Console or CLI lifecycle for agents (create, launch, terminate, regenerate, delete) and no per-agent hire/fire veto. After: 16 commits landed as fd6dd327c (b18, a rebase of b17 3f451772d on e122aad8e: 16 =, series patch-id 64303253f8e6, packages equal b17). Manifest 53 paths, digest 29f131ab. Final run on fd6dd327c: runb8 39 files whole 503/0/0, mutants 17/17 killed, restores matched; gate.sh merge onto e122aad8e, 18 packages 3668/0, ten scripts rc=0, Docker up, four env skips named (webui esbuild pin, queue render outside canonical root, test-task live provider x2); sweep clean. Corrections: b16 went red at G13; my diagnosis (60 runs, base hang on port 38927 sshd bind EADDRINUSE) placed it outside 194, fixed by row 280; the g13diag load kill missed its process group and overran about 8 minutes; one runb8 launch failed rc=126 on a lost exec bit before any test ran; the b17 runb8 was stopped unscored when refactor moved. In-review revs 3156/3157, Webby approve rev 3160.
|
||||
2026-10-22 09:43:34 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 236 #1742 Gitea grant landing, and row 281 filing | 236 landed bd5f11ded at 09:37:31Z, a fast-forward on be2b008cc: 08840f3c1 rebased past 194 (commit 1 unions only, 2-7 =), e40b74beb for two stale out-of-manifest pins, bd5f11ded for a gitea-not-configured raise test. Dewey approve rev 3168 on manifest 0b00269b (34 paths). Megavolt gate under my slot: 2c bus 131, cli 224, route 28, docker 1; whole bus 765, business 228, cli 832, ten scripts rc=0; mutants 40/40; skips named, env only. Overlap with 13 and 257 clean. Note 3169, done 3170; #1742 closed c30451; P19 436 comment 639. Correction: the first whole run on ce74477e1 went red 762/764 on the two stale pins; that run is void. Follow-up per mos-1271: row 281 (#1786), a fire or delete revokes host and Gitea grants, Megavolt owns, Dewey reviews; brief docs/plans/2026-10-22_fire-revokes-grants.md; DEFERRED entry points at it.
|
||||
2026-10-22 10:30:51 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 274 #1779 FED R3 broker user principal landing | 274 landed 4c485c63b at 10:28:26Z, a fast-forward on 47a35bf43: six Morgana commits d20c92bf6..4c485c63b. r5 f58cfc361 moved covers, LEVELS and the all marker into business/src/vocabulary.mjs so the broker keeps its sandbox import closure (M16/M16b/M16c). r6 4c485c63b pins USER_VERBS as the ruled seven and widens the R3 off-list set. Dewey approve rev 3178 on manifest 00047b52 (13 paths), comment 30487. Morgana gate under my slot, 10:09-10:22Z: 23 touched files 0 fail, bus 787, harness 151, business 228, cli 832, seat 167, ten scripts rc=0, mutants 22/22; skips named, env only (test-queue 1, test-task 2). Overlap with 13 and 257 clean. Note 3179, done 3180; #1779 closed c30491; P19 414 comment 646. Corrections: the r5 gate on f58cfc361 went red (M3x/M6x survived the R3 off-list set), void; my gate comment 30490 said 24 touched files, the count is 23; the kit comment guessed human-required for the M3x wall, the run code is not-holder.
|
||||
2026-10-22 10:57:34 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 256 #1761 the human deletes a creative instance, landing | before: row 194's deleteRefusal refused every END_PROTECTED definition for every actor, so nobody could delete a creative instance; the human could only delist one with launch: false. After: 256 landed f12441d4f, a fast-forward on 0165be266 (the 274 landing plus its docs and queue commits): four Honker commits b5f1e09d6..f12441d4f, patch-id b28e63746f8c. One protectedRefusal predicate serves delete and the listing's per-viewer endProtected; any non-human actor gets organization-creative-human-only, fire unchanged. Rebased twice (past 236, then past 274), each range-diff 4/4 =, carries checked by Webby (webby-0126, webby-0128). Webby APPROVE on manifest-r3 01eb75aa (10 paths), comment 30519, posted by Sage as jarvis because Webby has no token; review request c30518 (Sage, revs 3183/3184) after Honker's request failed (no token, revs 3181/3182). Gate by Honker under Sage's slot 10:33Z-10:52Z on merge tree ced6bf5f8: touched files 31/0/0, 18 packages 3757/0 (bus 788, business 231, cli 832, webui 335), ten scripts/test-*.sh rc=0, mutants M1, M2, M3, M4a, M4b killed with blob-checked restores. Skips, named and environment-only: webui editor rebuild byte check (esbuild 0.28.1 installed, pin 0.28.2), test-queue non-canonical root, test-task live provider x2. Overlap with in-review rows 13 and 257 clean. Order change sage-2594: 256 landed before 277 because 277's gate had not run. LIVE is still 86f95bb27. Queue note rev 3186, done rev 3187; #1761 closed c30520; P19 416 comment 649.
|
||||
2026-10-22 11:19:28 UTC | Sage (Claude Opus 5.5, 1ef1e4f8) | row 277 #1782 the owner sees a thread agent's claims, landing | before: a thread run's role.claim wrote thread_claims only, and the agents verb read role_claims only, so the owner had no way to see a thread agent's claim (PRD :1083-1084). After: 277 landed 62f53b1e0, a fast-forward on 46dedf925 (the 256 landing plus its docs and queue commits): seven Morgana commits 1d5d00939..62f53b1e0, range patch-id 7f0533520bd2. A bus verb thread.claims serves human and reader sessions; mosaic agents adds thread lines without --tester or --json, --json keeps the agents array, the tester path makes one call, a refused thread.claims prints the role lines and the refusal code, and an error with no bus code still throws. Rebased onto 0165be266, then onto 46dedf925 after 256 landed first (sage-2594); both range-diffs all =, manifest e281aa2c unchanged (duckworth-0126). Duckworth APPROVE comment 30539, recorded rev 3192, posted by Sage as jarvis; review request c30538 (revs 3190/3191) after Morgana's request failed (no token, revs 3188/3189). Gate by Morgana under Sage's slot 11:01:23Z-11:13:56Z: 7 touched files 0 fail (thread-claims 5, message-filter 6, user-principal 22, format 4, tester 11, other-tree 4, host 43), bus 793, cli 836, harness 151, business 231, seat 167, ten scripts/test-*.sh rc=0, M1-M9 killed on committed bytes. Skips named, environment only: test-queue non-canonical root, test-task live provider x2. Overlap with in-review 13 and 257 clean. Duckworth N1 (M8 dies on a rethrown error) to DEFERRED; 0123 N3 per-session claims binds 264a r7. Note rev 3193, done rev 3194; #1782 closed c30540; P19 506 comment 652. Also landed as doc-only picks: Honker's 256 BUILD.md gate results (80620a3a0 as b83173305) and Megavolt's 236 BUILD.md runs (9c6e1a165 as 01ea1fb11). LIVE is still 86f95bb27.
|
||||
|
||||
2026-10-22T11:37:16Z | Gander row278 #1783 implementation prepared, verification held | Before: owner thread claims were visible through row277 but absent from the Console Agents view. After: prepared a separate four-field table, a Console-owned read adapter, section-local refusal handling and an explicit tester refusal before busRead. Ten tests and six unique check definitions are prepared but unrun. Base moved from980cec88c to6af85df4b under sage-2625 on new gander/row278-b; no candidate path overlapped. No Node process, syntax check, test, browser, queue command, push helper or live action ran. Next: Sage CLEAR for the queue claim and gate; Webby reviews the verified manifest.
|
||||
|
||||
2026-10-22T12:09:45.285844+00:00 | Gander row278 run1 void, loader fake repaired | First new-file run stopped3/1/0 because the fake omitted BusReadError imported by base chat.mjs. Sage-2638 places the first-own-test red and permits the assertion-preserving export; test-only commit964b6b184. Runtime bytes unchanged. All run1 results void, no timeout or run leftovers. Run2 must restart every step after busy CLEAR; a second red goes to Sage then Mos before any change. No product acceptance or push claimed.
|
||||
|
||||
### 2026-10-22 | Gander | row278 gate run3
|
||||
|
||||
Fresh gate on3e4c77ac6 under sage-2648: bus793/0, WebUI345/0/1 (esbuild version skip), all ten shell files425/0, touched files15/0, M1-M6 killed6/6. No timeout; sweep0 run-created leftovers. Runs1/2 void. Seven-path manifest8fa859a0 goes to Webby for final review. No landing or live change.
|
||||
|
||||
2026-10-22 11:29:09 UTC | Rocko | V502 carry/rerun on980cec88c: source407c8d7be and packet04a86cf33 match approved8e3c6a79b/9bf4683c6 patch-ids, no conflicts. Dewey0834 carry conditioned on rerun, satisfied under sage2616: stop-run13,processingHTTP6,bustasks9 allgreen (Node28/28),Python4/4,0skips/timeouts. Manifest5758d699,source5/5restored,cwdsweep[]. Doc rerun packet6af85df4b explicitly pushed to rocko/vikunja502-980c-20261022; no live action.
|
||||
|
||||
2026-10-22 11:30:17 UTC | Sage | Vikunja 502 (row 191 follow-up, no queue row) LANDED 6af85df4b, a fast-forward from 980cec88c. Before: the processing failure diagnostics and cleanup in stop-run, processing HTTP and bus tasks tests were Dewey-approved on the pre-194 base only (8e3c6a79b/9bf4683c6). After: Rocko's picks 407c8d7be/04a86cf33 carry the same patch-ids (37135ebe/0dbcda54), plus a doc-only rerun record 6af85df4b. The rerun on the new base was green: stop-run 13/13, processing HTTP 6/6, bus tasks 9/9, Python 4/4, 0 skips. Dewey carried the approve (dewey-0836). mosaic-task.mjs is unchanged, so N7 (runs suite) didn't trigger. Overlap with in-review rows 13 and 257 was clean. LIVE is still 86f95bb27.
|
||||
|
||||
2026-10-22 13:10 UTC | Sage | Rows 278 and 281 LANDED. Before: refactor at 6af85df4b (V502). Row 278 (#1783, Gander, Webby): the Console Agents view shows thread claims in their own section. It landed as 385a7194c at 12:39Z, ff, 9 commits, manifest 8fa859a0. Run 3 was green: bus 793, webui 345/0/1, ten shells 425/0 under the 3x limits (mos-1275), M1-M6 killed. Runs 1 and 2 were void, on fixture fixes 964b6b184 (placed by Sage) and 9696d1fcb (ruled by Mos, mos-1275). Webby approved (c30588, rev 3200). Done rev 3202, #1783 closed c30589. Row 281 (#1786, Megavolt, Dewey): a fire or a delete revokes the instance's host and Gitea grants. It landed as e479521d3 at 13:06Z, ff, 17 commits, manifest b73d4c81. Slot on 7979fb41e: bus 819, business 231, cli 837, dewey-bus 76 with the Docker gitea-grant test, shells green, M1-M22 killed. The M1 hang was fixed at its cause in b4a (mos-1273). Dewey approved (c30614, rev 3207). Done rev 3209, #1786 closed c30621. Skips on both: test-task's row 244 live-provider pair and test-queue's canonical-root check, plus webui's esbuild rebuild test on 278. After: refactor at e479521d3. DEFERRED moves the grant gap to Done and opens Dewey's N1/N2 text gaps. LIVE is still 86f95bb27.
|
||||
|
||||
2026-10-22 14:18:23 UTC | Sage | Row 264a LANDED (#1769, Gizmoduck, Duckworth): sessions per thread, schema 3k-3l. Before: refactor at e479521d3 (row 281). It landed as 84f53540d, ff, 21 commits, manifest 257408e9 (Duckworth approve rev 3214, comment 30640). Gate r13 on 2cc34aef8: 20 touched files, bus 827, cli 837, webui 345/1 named skip, ten shells under 3x limits, mutants M1-M4 killed on assertions. Corrections on the way: the kit stopped on first red, so four reds surfaced one at a time. r10 later3l missed a trigger (mos-1276). T2 had failed since r2 because refusals log action.refused (mos-1277, my sage-2257 wording). threads.test:341 kept the old trigger text (mos-1278). M2 was caught by the store trigger before any assertion, so it now drops the trigger too (mos-1279, four files with the SCHEMA_SHA256 pin). Deferred: actor_run pin binds row 269, esbuild skip to a later gate, session-scoped user reply binds row 272. No live change; LIVE is still 86f95bb27.
|
||||
2026-10-21 21:24:47 UTC | Gander row253 #1758 design r1 | Investigation began21:12Z under sage-2162; recorded now. Before: case2 installer still renders tester TCP and case1 acceptance requires it. After: proposed design covers socket marker migration, actual configured dataRoot within unchanged hardening, target-uid metadata queries, kernel-peer acceptance observation and explicit same-uid residual. Initial inventory saved; no passing final static-check claim, product edit, test, host or live action. Duckworth design review precedes code.
|
||||
|
||||
### 2026-10-21 row253 implementation prepared, gate pending
|
||||
|
||||
Gander: after Duckworth-0100 design approval with C1-C5, prepared the two host-script socket migrations, fake fixtures, updated retirement docs and 33 unique change checks. Static syntax/diff and source inventory checks pass; behavioral tests have not run. Sage-2191 queues the requested full scope and will send CLEAR. No host, unit or live config changed.
|
||||
|
||||
2026-10-22 02:13:30 UTC | Gander row253 C4 committed candidate, gate pending | Sage-2335 explicitly directs committing runnable source and tests before the whole gate. The repair implements the approved after-uid supervisor with separate inner/outer bounds; the static packet is b64aa316a. Current repaired bytes have run no syntax check, test, probe or host experiment. Earlier static syntax results apply only to the old build. Results from 8a8df4171 are historical and do not carry. Duckworth static verdict and Sage CLEAR precede all gate execution. F5 is row276 / #1781 in DEFERRED.md.
|
||||
|
||||
2026-10-22 14:45 UTC | Gander row253 focused27 on finalaca16404c base | Fresh0604d91fc / manifest573c51cf:27 whole files604/0/0, no timeout/retry, case134/0 in99.281s, case243/0 in66.418s, stack-release includingT46221/0 in583.453s. N9 sandbox bind ran and passed, no focused skips. Seven source blobs unchanged; sweep0 run-created leftovers, pre-existing infrastructure receipts retained. Whole gate and M1-M40 await separate Sage CLEAR after Duckworth rebase check. No live action.
|
||||
|
||||
2026-10-22 14:46 UTC | Gander correction to the row253 focused27 entry immediately above | stack-release whole was218/0/0, not221/0. The27-file sum604/0/0 and duration583.453s are unchanged; raw files/results.json and SUMMARY.json give the exact per-file totals.
|
||||
|
||||
2026-10-21T16:04:23Z | Q195/Q196 writing editor design, #1752 / Vikunja #448 | Before: row 154 edits Markdown in a separate Docs view, with no selected-word thesaurus or document pins. After: design draft on gyro/editor-design compares three editor approaches, records WordNet source/license/size, folds the pane/pin model and specifies guarded context/proposal APIs, DesignCraft handoff and seven proposed briefs. Q196 changes the basis to a Word-like interface. Verification so far: editor/provenance checks 10 pass, 1 explicit rebuild skip (pinned esbuild absent); brief fields, unique headings and 11-line checklist checked. Product, queue and live state unchanged. WordCraft scratch evaluation is being incorporated before publication. Review and Jason choices remain open.
|
||||
|
||||
2026-10-21T16:22:36Z | Q195/Q196 design verification, #1752 / Vikunja #448 | Folded Fenton 7caf8008b and Louie 880ef19e0. Recommend bounded O3: Word-like DOM editor plus isolated headless DOCX export, with explicit feature cut and semantic loss checks. WordCraft web 44,179,239 bytes, identical twice; measured comment/footnote conversion limits recorded. Seven briefs and 12-line checklist validated. Fresh editor/provenance: 10 pass, 0 fail, 1 explicit rebuild skip (esbuild 0.28.2 absent). CI queue guard identity gyro/purpose push returned documented degraded-pass (exit 0), CANNOT_ASSERT credential-unresolvable, scratch audit gyro-q195-ci-queue-audit.jsonl; no fallback or CI-green claim. Documentation-only candidate for Mos/Fenton review, no source, queue or live changes.
|
||||
|
||||
2026-10-22T16:06:34Z | Q195/Q196 design review fixes, #1752 / Vikunja #448, mos-1300 / fenton-0004 | Before: draft 105811400 had owner-only thread wording, stale source positions, two mismatched seat/model assignments, an assumed library save boundary and 12 owner questions. After: grant-aware pin validation and stale/revoked access redaction; references refreshed against aca16404c, including public/bus.js and README offsets; Sage assigns model-only seats; unimplemented library.file.save/C2-11b brief blocks book editing; tabs explicitly cover 62-76rem; J7 stricter context choice recorded; pronouns removed; six owner questions. Static docs/source-anchor checks only, no builds, product suites, MVP gate slot or live action. Fenton re-check pending; O3 and both companion folds retained.
|
||||
|
||||
2026-10-22T16:09:56Z | Della mos-1303 / Vikunja 460 Q217/Q222 revision | Before: Q1/Q2 open and Q3-Q7 phrased as Jason questions. After: Jason-created InMotion/woltje.com ingress recorded; per-source mailboxScope defaults none with human-only CLI then Console writer and named default/change/agent-refusal tests. Q3-Q7 settings/defaults/owners documented; no new external decision required for default development, conditional provider/spend/exposure list retained. PRD/grant/data.delete/live gates preserved. Docs only, no product suite or live operation. Earlier uncommitted append-only PRD review session receipts are preserved in this docs commit. Ludwig reviews before Sage landing.
|
||||
|
||||
2026-10-22T16:12:26Z | Della ludwig-0035 / mos-1303 / Vikunja 460 focused corrections | Verified REQ-WAIT-2/3 at db1e7732a: Jason approval is required to route mail.access out of hard waits. Restored explicit Jason-approved PRD gate; no Q211 waiver inferred. Named tunable parser/attachment settings, defaults and schema/test review ownership of resource bounds; E04 checks changed values and bound refusals. Clarified Q8 extraction stays Jason choice. Docs-only checks, no product/live action; focused review before Sage handoff.
|
||||
|
||||
2026-10-22 13:06 UTC | Megavolt | Row 281 (#1786) build. Before: a fire or delete left host_grants/gitea_grants rows, the host line and the Gitea token live. After: step G in broker.mjs revokes them in a detached job per agent (the host line first, then Gitea local-first with an admin preflight); a refusal is grant.revoke.refused plus a human message; open grant decisions are in the set; a raise for a fired agent refuses instance-fired. Tests T1-T14 (bus fire-revokes-grants, lifecycle-revoke, grant-executor, gitea-grant; cli lifecycle). Gate on 7979fb41e: base 121/121 + 24/24, 29 anchors, M1 exit check rc1/17, M1-M22 22/22 killed, dewey-0840 files 76+14+23, bus 819, business 231, cli 837, ten shells rc 0 under the mos-1275 limits; skips: test-task row 244 live-provider pair, test-queue canonical-root check. Corrections: the first base run on c174f37ac went red on five first-run test defects (b3, test only); the first mutant run on 06ee5ed6b hung on M1 because T6c's held loop never ended (b4a fixed the teardown, and the runner now has timeout -k 10 180 and an exit check without --test-force-exit).
|
||||
|
||||
2026-10-22T16:36:30Z | Della row224 C2-05b #1725 preparation | Before: C2-05a queries exist at 4f3fbc25a but no broker lookup verbs or typed tools. Scope: broker/tools plus Sage-authorized runtime/bundle integration, tests and docs. Existing human-only library reads retained; five agent queries require a live holder and trusted configured source. Code/docs only under row253 gate; no Node/test/push/claim. Runtime ownership coordinated with Rocko219/Huey272.
|
||||
|
||||
2026-10-22T16:52:55Z | Rocko | Row219 prepared under sage2793/2807; explicit creative thread/default-session selection, narrow metadata route/picker U1–U5,22 static mutant sites; unrun while253 holds.
|
||||
|
||||
2026-10-22T17:42:16Z | Sage | Row 253 (#1758, Gander, Duckworth) LANDED 48e450ce8. Before: refactor at aca16404c; case-sudo calls had no supervised session check and the M21 survivor hid behind a fast-exit fixture (mos-1297). After: a fast-forward of 22 commits; manifest 591020a1 rechecked with 0 mismatches; run 5 whole gate green with M1-M40 killed, the M38 PID equals SID assertion added under mos-1298; Duckworth APPROVE rev 3252, note rev 3253, done rev 3254; #1758 comment 30701 and closed; P19 416 comment 719. N1 (fast child reported as exit 85) is DEFERRED as Vikunja 532.
|
||||
|
||||
2026-10-22T18:11:57Z | Sage | Row 275 (#1780, Morgana, Duckworth) LANDED 3410df7c3. Before: refactor at 48e450ce8; viewers had no verb list of their own and board reads were not refused to users. After: a fast-forward of 3 commits; manifest 39847b15 (4 paths) blobs match; gate 17:52:12Z-18:05:00Z green (whole files 7/22/6, bus 834, cli 861, harness 151, business 231, seat 167, 10 scripts with 3 named skips), M6 and M10 killed; Duckworth APPROVE rev 3260 (comment 30717); note and done by sage-2897; #1780 comment 30728 and closed. N1 (board refusal test as a loop over BOARD_VERBS) is non-blocking.
|
||||
|
||||
2026-10-22 18:11:58 UTC | Gander row276 #1781 prepared, gate pending | Before: row253 left5legacy Case1 AS_USER calls unsupervised across sudo pty sessions. After: candidate uses its unchanged supervisor with per-call inner/outer budgets, separate streams, strict display-only failure trailer, fake-only paired process-model cases and15unique mutants. Duckworth0182 B1 corrected the plan before product code;0183 cleared build. Parse-only Bash checks pass; no Node, behavioral test, host, unit or config action. Runtime gate and publication await Sage.
|
||||
|
||||
2026-10-22T22:51:32Z | Megavolt | Row 207 (193c, #1705): rebased onto 01983cd3f as 712f79c0a; gate green under sage-3041 (access.test 31/31, M1-M8 killed on named tests, cli 894/894, ten scripts under mos-1275 limits). Correction: the first run's kill check grepped TAP "not ok" against node's spec output and was stopped and rerun. Runs note in 9bb406c6c.
|
||||
|
||||
2026-10-22T22:51:32Z | Sage | Row 207 (#1705, Megavolt, Duckworth) LANDED c4f77373f. Before: refactor at f0e3dcdf4; mosaic access had no user verbs. After: fast-forward of 4 commits, a cherry-pick of the gated 01983cd3f..9bb406c6c (range-diff 4/4 equal, patch-ids equal, the 4 manifest blobs equal; the base moved only by the #1797 brief, which no test reads; no open branch touches the manifest). Duckworth APPROVE c30849 rev 3356; done rev after the note. N1 (any-business refusal untested) DEFERRED. No live change. Correction: my first 207 review request ran under timeout 120, which killed it while it wrote the outcome; the comment (c30841) had posted, so I removed the dead lock and resolved it at rev 3350.
|
||||
|
||||
2026-10-22T23:03:39Z | Gyro Q195 O2 rewrite, #1752 / Vikunja #448, mos-1356 | Before: landed O3 design 95e3f7166/blob 4cb59999. After: Q231/Q233 full WordCraft O2 design on gyro/editor-o2 from refactor c4f77373f; canonical git DOCX, original Markdown/wiki preservation, human cadence default 0 with instant accepted-save commits, full rich-feature first slice. Ten briefs include independent source/dependency security clearance before any build queue entry, exact editor-only CSP approval gate, restricted source/build/bridge, separate reviewed DOCX citation gate and flags-only agent access. Existing Case 2 semantics unchanged; any integration requirement change goes through Mos to Jason. Static checks: ten briefs/seven fields, independent reviewers, unique anchors, current source/base/blob pins, docs scope and append-only logs pass. No builds, browser/worker runs, code, queue or live changes. Fenton review pending; CSP and implementation gates remain closed.
|
||||
|
||||
2026-10-22T23:03:53Z | Gyro Q195 O2 push guard | CI queue guard identity gyro / purpose push returned exit 0, documented degraded-pass: CANNOT_ASSERT credential-unresolvable. Audit: /mnt/storage/scratch/gyro-q195-ci-queue-audit.jsonl. No credential fallback or CI-green claim.
|
||||
|
||||
2026-10-22T23:09:38Z | Gyro Q195 O2 fenton-0006 fixes | Before: e012bab0b left stale-source ambiguity, incomplete migration/shipping ownership, undefined typing transactions and an unmeasured CSP gate. After: D12 explicitly routes superseded-source/C2 reply notices to Mos/Jason and refuses adoption before W4b/notice path; Q2 remains open. F2-F6 add schema-edge placeholders and restore-accounting files, shipped runtime data/writing closure with no sandbox store mount, per-chapter DOCX and 2s-pause/15s-span save groups, volume/latency/growth gates, split-run clickable wikilinks and historical Obsidian graph warning, and S0 isolated existing-artifact CSP measurement before exact-header approval. Static ten-brief/ownership/settings/checklist checks pass. No build/browser run, product/queue/live change. Independent re-check pending.
|
||||
|
||||
2026-10-22T23:09:50Z | Gyro fenton-0006 push guard | identity gyro, purpose push, exit 0 documented degraded-pass CANNOT_ASSERT credential-unresolvable; audit gyro-q195-ci-queue-audit.jsonl. No fallback credentials or CI-green claim.
|
||||
|
||||
2026-10-22T23:10:14Z | Gyro mos-1358 ruling recorded | Q36 / Vikunja 562 keeps C2 superseded notices OPEN with Jason. Markdown adoption refusal until W4b PASS is now a separate settled Mos build-order ruling, not a Jason question. D12 and Q2 distinguish them; no notice build authorized.
|
||||
|
||||
2026-10-22T23:13:27Z | Gyro Q195 O2 fenton-0007 F7/F8 | Named human-only editor.saveGroupPauseMs=2000 and editor.saveGroupMaxMs=15000 with integer/range/cross-field validation and W3a UI/CLI refusal tests. W3b owns production adoption refusal until W4b; isolated fixture conversion remains testable without request-flag bypass. W4b owns adoption module/API tests and reviewed lifting only with committed-reader/citation readiness and, if Q36 approves, the separate notice row PASS. Q36 unresolved stays closed. Static ten-brief, setting-key/bounds, refusal/lift ownership and two-question checks pass. Docs only; no build, browser/worker run, product/queue/live change. Fenton checks F7/F8 on next push.
|
||||
|
||||
2026-10-22T23:13:48Z | Gyro mos-1359 / r3 push guard | D13 records save-group timing as Mos's accepted reading of Q226 F41, not Jason's ruling; both defaults remain human-only settings. Push guard identity gyro/purpose push: exit 0 documented degraded-pass, CANNOT_ASSERT credential-unresolvable; audit gyro-q195-ci-queue-audit.jsonl, no credential fallback or CI-green claim.
|
||||
|
||||
2026-10-22T23:23:42Z | Rocko, W4 #1799 | Before, D24-D26 had no separate exact DOCX citation/access contract. After, 15e91538f proposed a versioned schema, parser/story/view/refusal rules, live authorization/sharing and generic/git/session bypass closure, compatibility gates and 22 acceptance rows. Two JSON examples parse, diff check clean; no code or implementation acceptance. Megavolt review pending.
|
||||
|
||||
2026-10-22T23:55:11Z | Sage, W4 #1799 docs landing | Megavolt reviewed four rounds (CHANGES 15e91538f, 019a0ea5b, 54246cb32; APPROVE 994c3f7fb, #1799 c30868/c30870/c30876/c30884). Landed here as cherry-picks: docs/plans/2026-10-22_q195-docx-citations.md blob 2af460ab7 and docs/reviews/2026-10-22_q195-docx-citations.md blob bedde1716, both new files. 32 acceptance rows go to W4b; R4-N1 (re-migration after a pre-W4b restore keeps the rotated fence and needs owner confirmation) goes into W4b's brief and A32. W4 is design-approved only: its gate still needs Sage's W4b implementation brief, which waits for S0 (#1798) PASS. Q36 open, adoption closed. Docs only, no test reads these files.
|
||||
|
||||
2026-10-23T00:52:58Z | Gyro Q235-Q237 policy rewrite started, Vikunja 571, mos-1366/1367 | Before: approved O2 e36bce352 keeps Markdown originals at their paths and Q36 notices open; landed W4 2af460ab7 has the same boundary. Imported that byte-identical W4 baseline as 1ac76a417, from refactor 062646487, to make the policy-only revision diff explicit. Prepared P1-P6/B1-B4: human one-way per-story import, human-set source-repo archive, DOCX current reader, scoped format map/archived non-canon reads, W7 conversion publication after W4b/approved PRD/10-27 and Jason first-real-book go. Q234 exact CSP, mos-1363 and S0 M1-M14 retained. W4 locator/extractor, shares and restore-fence blocks compare byte-identical to the approved baseline. Scope/source review ongoing; Mos impact map must be folded before Fenton handoff. No build/browser/worker run, code, queue, private-book or live action.
|
||||
|
||||
2026-10-23T01:37:07Z | Gyro Vikunja571 final impact-map / mos-1372/1375 fold | Prepared parent/W4 rewrite against brain-redux d183246 impact map at stack 062646487. P1-P6/B1-B4 and engineering Q1-Q16 are mapped to eleven briefs. D9 replaces the earlier private O2-only context/per-document/share model: normal Case 2 access in any authorized thread/room, supporting writes intact, changed policy awaits PRD 1.17 approval. New DOCX story creation has the same opening gate as human per-story import. Host-only push to human-set off-host remote replaces the no-remote ban; remoteURL defaults unset and same-host bare is disallowed. W7 gates on Hermes #423 step5, W4b, PRD approval, post-10-27 and first-real-book go; owns conversion events COUNTED/--events/pre-conversion restore reconciliation, manifest order/next_chapter, creative role cite wording, archive/old-path edits and format/link/citation routing. Store+off-host acknowledgment precedes archive commit/push, then catalogue publication; post-push failures remain resumable pending with pinned source. Current checks pass: complete brief fields, policy/map coverage, exact Q234 CSP, locator/projection mechanics byte-equivalent except explicit authority wording, A01-A35 IDs, immutable map pin, four-doc scope and append-only logs. W4 authority/remote/recovery sections reopened for Fenton; older APPROVE not reused. No product/build/browser/worker/private-book/queue/live action. Earlier entry describing preserved shares/fence applies only to the pre-D9 intermediate draft; D9 now withdraws those unimplemented structures.
|
||||
|
||||
2026-10-23T01:37:55Z | Gyro 571 push guard | identity gyro/purpose push: exit 0 documented degraded-pass CANNOT_ASSERT credential-unresolvable, scratch audit gyro-q195-ci-queue-audit.jsonl; no credential fallback or CI-green claim.
|
||||
|
||||
2026-10-23T01:41:59Z | Gyro sage-3121 A1-A3 PRD alignment | Before: 8d209016b adds a current Connections graph, excludes new Markdown stories in converted books and defaults archiveFolder. After: parent/W4 align with PRD1.17 d6 sha256 886b93c571f87bfbb2f27ee3113b6800a32d8f89196d95ace33566031bee380a: clickable editor links only; graph/tests later pending J-b; new different-path Markdown in a converted book remains canon until import, only recreated converted old paths are unmapped; archive folder is human-set in library mapping with no default, missing folder refuses conversion. Static A1-A3/11-brief checks pass; W4 locator/extractor/access/remote/recovery blocks unchanged. Local commit only, push held for Sage's named gap while Gizmoduck holds 270+271 run5. No product/build/browser/worker/queue/live action. Fenton gets local SHA through shared object store.
|
||||
|
||||
2026-10-23T01:49:08Z | Gyro fenton-0012 B1/B2 and N1-N6, mos-1379 | B1: off-host remote must deny the real shared jason.woltje seat-helper credential as well as seat identities until #431; private visibility/dummy-token denial is insufficient; W3b/A16/A26 require that future fixture proof. B2 follows mos-1379: human-only editor.agentReadComments and editor.agentReadTrackedDeletions both default false, comment/original/markup reads/resolves/index/context refuse when off; final access remains D9 and no role allowlist/per-document grant. N1 staging-ref allowlist and retained private refused/published audit refs; N2 URLs literal with fidelity-report loss and confirmation; N3 future paths marked new or predecessor row; N4 rename/sharing wording fixed; N5 historical thread text not refreshed; N6 protected VM1012 backup cited in P5. Static checks pass, locator JSON/package/projection mechanics retained. Local commit only; HTTPS push still held for Sage's named gap. No credentials tested/read/printed, no product/build/browser/worker/queue/live action. Fenton gets exact local SHA/blobs.
|
||||
|
||||
2026-10-23T01:53:25Z | Gyro fenton-0013 N7 mixed-format chapter order | Fenton approved local 0f4fa4f93. D10 now explicitly orders every chapter ID regardless of Markdown/DOCX format, inserts new canon Markdown by row216 or human committed order, and preserves ID/position at import. W7 tests cover mixed traversal/insertion/import stability. Static diff/append-only checks and docs hook pass. Local commit only, narrow re-check requested, HTTPS push still held for Sage gap. No runtime, queue or live change.
|
||||
|
||||
2026-10-23T02:21:06Z | Sage, rows 270+271 landing, 571 landing, MVP rows | Before: 270 (#1775) and 271 (#1776) were approved on gizmoduck/row270-271-r4 49cee846e and 2b964a082 after combined gate C2 run 5 GREEN on 53406f3e4 (bus 873, seat 202, cli 905, ten scripts, 38/38 mutants). After: 33 commits cherry-picked onto 767bb62c7 as 7328da8ca, range-diff all "=", 40 paths identical to the candidate; 270 manifest f4174458 matches, 271 manifest 3ab1f5c8 matches on 29 paths, the other 4 moved under 270 and match its manifest. Done revs 3396/3398, #1775 c30962 and #1776 c30964 closed, P19 463 c861. 571 (Gyro, Fenton APPROVE) picked as ee5f7b9ef, 6345aae3d, 767bb62c7 (blobs 9382f85b, 7ec0897b), 1ac76a417 left out; N7 911dad2aa (Fenton-0014) picked after. Rows 293-299 added (574, FED R6, R4, R7, GitHub grant, Q228, 573), queue commit 253346e3c. Correction: the push sync step checked out O..S paths over the canonical worktree without testing for uncommitted edits, so any pending SESSIONS or BUILD-LOG line in the canonical checkout at 02:06Z would have been overwritten; the sync now skips edited paths. Schema 3n is not live (LIVE 0cbe2e9b3 at 3m).
|
||||
@@ -22,6 +22,7 @@ RUN npm ci --ignore-scripts
|
||||
# runtime adapters.
|
||||
COPY contracts /opt/mosaic/contracts
|
||||
COPY src /opt/mosaic/src
|
||||
COPY packages/processing-control/src/state.mjs packages/processing-control/src/entrypoint.mjs /opt/mosaic/processing-control/
|
||||
COPY adapters /opt/mosaic/adapters
|
||||
RUN chmod 0555 /opt/mosaic/contracts /opt/mosaic/contracts/* \
|
||||
&& chmod 0555 /opt/mosaic/src /opt/mosaic/src/*.sh \
|
||||
|
||||
+17
-1
@@ -75,7 +75,8 @@ session's workspace and its own process group. Same contract, plus:
|
||||
| `MOSAIC_POLICY_FILE`, `MOSAIC_TOOLS_FILE` | The bundle's gate policy and typed tools. |
|
||||
| `MOSAIC_TOOL_SOCKET` | The runner's tool socket, which the typed tools call. |
|
||||
| `MOSAIC_TURN_MARKER` | `pi`: the extension writes it at `agent_end`; a pi turn that exits 0 without it failed. |
|
||||
| `MOSAIC_EXTENSIONS` | `pi` only: extension files loaded with `-e`; a missing one exits 2. |
|
||||
| `MOSAIC_EXTENSIONS` | `pi` only: extension files loaded with `-e`; a missing one exits 2. The pi module names two: the gate and typed tools extension, then the unslop check's `tools/unslop-hook/extension.ts` (row 66). |
|
||||
| `MOSAIC_UNSLOP_LOG` | The unslop check's JSONL log, `<run>/unslop.jsonl`, which the runner sets for both adapters and reads after each turn (row 66). |
|
||||
| `MOSAIC_CLAUDE_SETTINGS`, `MOSAIC_CLAUDE_MCP_CONFIG` | `claude` only: the bundle's gate hook and MCP server; required. |
|
||||
| `MOSAIC_THINKING` | The route's thinking level (row 65), which the harness module's `levels()` already checked. `pi` passes `--thinking` (`off`, `minimal`, `low`, `medium`, `high`, `xhigh`, `max`) and omits it when unset, as for `run-task.sh` workers. `claude` passes `--effort` (`low`, `medium`, `high`, `xhigh`, `max`) and requires it; unset exits 2. |
|
||||
| `MOSAIC_CLAUDE_BIN` | `claude` only: absolute path of the CLI to run, from the host's environment (the bus unit pins it). Unset or empty runs `claude` from `PATH`; a relative path or a non-executable file exits 2. |
|
||||
@@ -110,3 +111,18 @@ argument, which Linux caps at 128 KiB; row 213 passes the file instead, so no
|
||||
local user reads the prompt in `/proc/<pid>/cmdline`. Pi 0.85.1 uses the path
|
||||
string itself as the prompt when the file is missing or can't be read, so the
|
||||
pi adapter exits 2 unless the path is a readable regular file.
|
||||
|
||||
### The unslop check (row 66)
|
||||
|
||||
Both adapters run the mechanical writing check from `tools/unslop-hook`,
|
||||
driven by one `lists.json`. `pi` loads it as its second `-e` extension.
|
||||
`claude` runs `claude-hook.js` from the bundle's `settings.json`: the Stop
|
||||
hook checks the turn's replies, and the UserPromptSubmit hook adds the
|
||||
correction notice as context on the next turn when the last reply had
|
||||
tells. Each hook command ends `; exit 0`, so neither blocks. Both log to
|
||||
`MOSAIC_UNSLOP_LOG`, and the runner adds a note for the operator to the
|
||||
next RESULT it sends (`packages/harness/README.md`, the runner). The
|
||||
harness modules mount the three files read-only at their own paths, and
|
||||
the manifest records their digests. `MOSAIC_UNSLOP_HOOK` and `UNSLOP_LISTS`
|
||||
aren't in the session environment's allowlist, so a managed session can't
|
||||
switch the check off or swap its lists.
|
||||
@@ -27,6 +27,11 @@ not fleet seats. Keep changes in `/mnt/storage/src/mosaic-stack`; do not modify
|
||||
| Gizmoduck | Federation design (#414) and builder of FED R1 | T3 session (Claude, Opus 5.5, thread 9312a896) | none, T3 only |
|
||||
| Webby | Reviewer: Case 2 designs, rows 192 and 194 | T3 session (Claude, Opus 5.5, thread 03086006), started by Mos (mos-0981) | none, T3 only |
|
||||
| Duckworth | Reviewer: federation designs, row 193 | T3 session (Claude, Opus 5.5, thread ffceafec), started by Mos (mos-0977) | none, T3 only |
|
||||
| Della | Builder, email plan (Vikunja 460) and row 224 (C2-05b) | T3 session (Codex, gpt-6.1-sol, thread 66735a7f), started by Mos | none, T3 only |
|
||||
| Scrooge | Builder of row 252 and reviewer of row 272 | T3 session (Claude, Opus 5.5, thread 629b6cd3), started by Mos | none, T3 only |
|
||||
| Huey | Builder, row 272 (T1 sessions) | T3 session (Codex, gpt-6.1-sol, thread cabd45ca), started by Mos | none, T3 only |
|
||||
| Louie | Builder and research, editor evaluation and row 174 | T3 session (Codex, gpt-6-luna, thread bfd13d49), started by Mos | none, T3 only |
|
||||
| Ludwig | Builder and reviewer, post-v1 email PRD and row 258 (E01) | T3 session (Claude, Opus 5.5, thread 8615b2a6), started by Mos | none, T3 only |
|
||||
| Sage | Project lead: coordination, review, integration; earlier DYOR strategy records retained | T3 session (Claude Code); Pi launcher `zai/glm-5.3:high` retained | `agents/sage/launch.sh` |
|
||||
|
||||
Each script supports `--check` and `--fresh`. Normal launches resume the agent's
|
||||
|
||||
@@ -0,0 +1,191 @@
|
||||
# Row 251 build: T27 lists no identities right after `ssh-add -t 1` (Vikunja #453)
|
||||
|
||||
Brief `docs/plans/2026-10-21_t27-ssh-add-lifetime.md` (rev 2931), Mos ruling mos-1185 item 2, assigned in
|
||||
sage-2075. Owner Darkwing, reviewer Dewey, gate owner Sage. Branch `darkwing/row251` from 3b0aef995,
|
||||
claimed in-progress at rev 2938.
|
||||
|
||||
## Step 1: the failure names its cause (e5e4b2e5a)
|
||||
|
||||
T27's two lists now carry a message that prints only when they fail. It gives the time from addKey's
|
||||
start to its resolve and to each `ssh-add -l` call, the hrtime at each with how far into its second it
|
||||
fell, `/proc/uptime` at each, and whether the agent process and its socket were still there. The checks
|
||||
themselves did not change. The commit holds nothing else.
|
||||
|
||||
## Step 2: the cause
|
||||
|
||||
ssh-agent counts a key's lifetime in whole seconds of CLOCK_BOOTTIME, at the add and at the reap. I read
|
||||
OpenSSH 10.5p1, the version on dragon-lin (`ssh -V`: OpenSSH_10.5p1), at tag V_10_5_P1 (ssh-agent.c
|
||||
sha256 873691c4, misc.c sha256 ee467f43):
|
||||
|
||||
- `misc.c:1790-1798` and `:1828`: `monotime()` returns `ts.tv_sec` of `clock_gettime(CLOCK_BOOTTIME)`,
|
||||
falling back to MONOTONIC. The fraction of the second is dropped.
|
||||
- `ssh-agent.c:1315`: the `-t` constraint sets `*deathp = monotime() + seconds`. Lines 1410 and 1598
|
||||
do the same for the agent's default lifetime.
|
||||
- `ssh-agent.c:1064`: the reaper drops a key when `now >= id->death`, `now` being `monotime()` again.
|
||||
- `ssh-agent.c:2650`: the main loop runs `reaper()` after every poll, before it reads requests. A list
|
||||
that arrives after the boundary sees the key gone.
|
||||
|
||||
So a key added at second s plus a fraction f dies at s + N, and `-t N` keeps it N - f seconds, between
|
||||
N - 1 and N. With `-t 1`, an add late in a second leaves the key milliseconds to live. That matches
|
||||
Sage's probe in the brief: 8 of 80 `-t 1` adds missed, each one made at 0.9947-0.9973 of a monotonic
|
||||
second and finished at 0.998-0.0008, and none earlier in the second missed. It also matches proof 5's
|
||||
failure, where the first list ran 31.9 ms into the test and found no identities.
|
||||
|
||||
Node's hrtime is CLOCK_MONOTONIC. BOOTTIME differs from it by the time the host spent suspended. On
|
||||
dragon-lin the difference read 0.000001 s at 19:09Z, so a monotonic second boundary is a BOOTTIME one
|
||||
here.
|
||||
|
||||
`addKey` and the agent start are not the cause. `addKey` passes the lifetime through as `-t`
|
||||
(`host-run.mjs:90`), and the agent starts with no default lifetime (`:175`). Production adds the key
|
||||
with `timeout + 30` (`:180`), where losing up to a second makes no difference. The only caller that
|
||||
can't afford the lost fraction is T27, which asks for 1 s. The fix belongs in the test's lifetime choice,
|
||||
and `host-run.mjs` doesn't change.
|
||||
|
||||
The slot confirms this against T27 itself (below), not just from the source.
|
||||
|
||||
## Step 3: the fix (this commit)
|
||||
|
||||
T27 adds the key with `-t 2`. The agent then keeps it more than 1 s and at most 2 s. The first list
|
||||
runs milliseconds after the add, so it has over a second of margin even under load. The sleep before
|
||||
the second list grows from 2.5 s to 3.5 s, which keeps the old 1.5 s margin past the new 2 s ceiling.
|
||||
Both checks stay: listed after the add, gone after the lifetime. A comment above the add says why the
|
||||
lifetime is 2.
|
||||
|
||||
I considered `-t 3` with a 4.5 s sleep for a 2 s floor. One second of floor is far above anything the
|
||||
first list has needed (31.9 ms in proof 5), and the concurrent-suite run below tests it under load, so I
|
||||
took the smaller change.
|
||||
|
||||
## Base
|
||||
|
||||
The branch stays on 3b0aef995. By 19:15Z origin/refactor was at 6096b051b, after rows 66 and 243
|
||||
landed. `git diff 3b0aef995 6096b051b` touches neither `packages/bus/src/host-run.mjs` nor
|
||||
`packages/bus/tests/host-run.test.mjs`, so there's no rebase (sage-2084). Row 243 did change
|
||||
`packages/bus/tests/process.test.mjs`. My slot's bus suites run that file as it was at 3b0aef995, and the
|
||||
gate rerun on Sage's slot runs it as landed.
|
||||
|
||||
## Prediction for part A on e5e4b2e5a (written before the slot)
|
||||
|
||||
The hook starts `ssh-add -t 1` at the given fraction of a monotonic second. From the brief's probe, the
|
||||
agent stores the key about 3 ms later. The first list reaches the agent a few ms after addKey resolves:
|
||||
Node's exit event, the mark, and `ssh-add -l`'s own start. A red needs the add to land before the second
|
||||
boundary and the list to land after it.
|
||||
|
||||
- 0.990: green. The add and the list both land before the boundary.
|
||||
- 0.993, 0.995, 0.996, 0.997: red expected. The add lands before the boundary, the list after. At 0.993
|
||||
and 0.997 I'm less sure, because the list (at 0.993) or the add (at 0.997) can land right at the
|
||||
boundary. A green at either is in line with the cause, and so is a red.
|
||||
- 0.998: green. The add lands after the boundary, so the key gets almost a full second.
|
||||
|
||||
Every red should show "first list got" an answer with no SHA256 line. It should also show addKey
|
||||
resolving before a second boundary and the first list starting after it or within a few ms of it, with
|
||||
the agent alive and its socket present.
|
||||
|
||||
Under sage-2084's rule, on e5e4b2e5a only a red at 0.990 or 0.998 counts toward the stop, and two such
|
||||
reds stop the run. On the fix commit any red counts, and two stop it. In parts B to D, the first red stops
|
||||
the run.
|
||||
|
||||
## Slot plan
|
||||
|
||||
All scripts are in `/mnt/storage/scratch/darkwing-251-out/`, launched from `/`, each behind the busy
|
||||
checks and chained with `&&`, TMPDIR under `/mnt/storage/scratch/tmp`.
|
||||
|
||||
1. Confirmation. `align-hooks.mjs` is a load hook, outside the repo, that serves `host-run.mjs` with
|
||||
`addKey` wrapped to start `ssh-add` at a chosen fraction of a monotonic second. T27 runs unchanged
|
||||
under it, alone (`--test-name-pattern`). It runs at fractions 0.990, 0.993, 0.995, 0.996, 0.997 and
|
||||
0.998, three times each:
|
||||
- on e5e4b2e5a (step 1, `-t 1`). Expected: some first lists fail, and the step 1 message shows the
|
||||
add's resolve and the list on either side of a second boundary, with the agent alive and the
|
||||
socket present. These reds are the point of the run.
|
||||
- on the fix commit (`-t 2`). Expected: all 18 pass.
|
||||
2. `host-run.test.mjs` whole, once, on the fix commit.
|
||||
3. The bus suite whole, three times in a row.
|
||||
4. The bus suite whole in two clean worktrees at the same commit, started together.
|
||||
|
||||
## Slot results
|
||||
|
||||
Sage's CLEAR came in sage-2154 at 20:58:55Z. `slot-251.sh` ran parts A and B from 20:59:22Z to 21:01:33Z,
|
||||
on node v26.8.1 and OpenSSH_10.5p1, with TMPDIR `/mnt/storage/scratch/tmp/r251`. At the start, BOOTTIME
|
||||
minus MONOTONIC read 0.000001 s, then 0.000000 s twice (dewey-0769 N1). So the hrtime fractions below
|
||||
put the agent's second boundary in the right place.
|
||||
|
||||
### Part A: T27 alone under `align-hooks.mjs`, 3 runs per fraction
|
||||
|
||||
The fraction is when the hook started `ssh-add`. The hook logged each start within 0.0001 of its target.
|
||||
|
||||
| fraction | e5e4b2e5a (`-t 1`) | 68f2dfd4b (`-t 2`) |
|
||||
|---|---|---|
|
||||
| 0.990 | 3 pass | 3 pass |
|
||||
| 0.993 | 3 pass | 3 pass |
|
||||
| 0.995 | 3 red | 3 pass |
|
||||
| 0.996 | 3 red | 3 pass |
|
||||
| 0.997 | 3 pass | 3 pass |
|
||||
| 0.998 | 3 pass | 3 pass |
|
||||
|
||||
e5e4b2e5a went red 6 times out of 18, every time at a fraction the prediction named, so none of them
|
||||
counted toward the stop. 68f2dfd4b passed all 18. The fix runs used 68f2dfd4b, whose test blob is the same
|
||||
as c19b4167e's (280132c7).
|
||||
|
||||
Every red failed on the first list and got `"The agent has no identities.\n"`, with the agent alive and
|
||||
its socket present. The step 1 message gave these hrtime fractions. "addKey start" is the mark before the
|
||||
hook's wait, so its fraction is earlier than the ssh-add start.
|
||||
|
||||
| run | addKey resolved | first list mark |
|
||||
|---|---|---|
|
||||
| 0.995 rep 1 | 0.9992 (+317.6 ms) | 0.9993 |
|
||||
| 0.995 rep 2 | 0.9991 (+846.5 ms) | 0.9991 |
|
||||
| 0.995 rep 3 | 0.9988 (+845.0 ms) | 0.9988 |
|
||||
| 0.996 rep 1 | 0.9999 (+839.8 ms) | 1.0000 |
|
||||
| 0.996 rep 2 | 0.0004 (+845.0 ms) | 0.0004 |
|
||||
| 0.996 rep 3 | 0.0002 (+835.9 ms) | 0.0002 |
|
||||
|
||||
At 0.995 the add finished about 4 ms in, before the boundary, and the list mark came just before it. The
|
||||
`ssh-add -l` process then reached the agent after the boundary. At 0.996 the agent stored the key before
|
||||
the boundary, and addKey resolved just after it. In both cases the key's whole second ended between the
|
||||
add and the list, which is the cause step 2 gives. The two edge fractions came out green on the first
|
||||
build. At 0.993 the list still reached the agent before the boundary, and at 0.997 the add landed after
|
||||
it, so the key got almost a full second. The prediction allowed either result at those two.
|
||||
|
||||
### Part B: `host-run.test.mjs` whole on 68f2dfd4b
|
||||
|
||||
24 tests, 24 passed (21:01:18Z, 14.0 s).
|
||||
|
||||
### The stop before C1, and the resume
|
||||
|
||||
At 21:01:33Z the script stopped before C1, with exit 4 and no red. My own `busy.sh` matched two `sleep 60`
|
||||
processes, mine, in `darkwing-r251/packages/bus`. Part B left them. They come from T27 "the start sweep
|
||||
keeps a live bus dir and kills only a matching live process" (`host-run.test.mjs:528` and `:536`). Its
|
||||
`t.after` SIGKILLs the `/bin/sh -c 'sleep 60; :'` parent, but the `sleep` child lives on for up to 60 s.
|
||||
That code is outside this row's diff, so the row leaves it alone, and it's recorded below as a follow-up.
|
||||
Sage confirmed (sage-2159) that the right move is to resume only the scope that hadn't run.
|
||||
|
||||
`slot-251-cd.sh` runs C and D as `slot-251.sh` has them, with the same two busy checks. Before each check,
|
||||
it waits up to 75 s for those orphans to exit: my uid, my trees, a command line of exactly `sleep 60`.
|
||||
It logs them as it waits. Any other process still trips the checks.
|
||||
|
||||
### Parts C and D: the bus suite whole on 68f2dfd4b
|
||||
|
||||
| run | start | tests | pass | fail | time |
|
||||
|---|---|---|---|---|---|
|
||||
| C1 | 21:02:48Z | 598 | 598 | 0 | 21.6 s |
|
||||
| C2 | 21:04:06Z | 598 | 598 | 0 | 21.4 s |
|
||||
| C3 | 21:05:26Z | 598 | 598 | 0 | 22.1 s |
|
||||
| D1, darkwing-r251 | 21:06:44Z | 598 | 598 | 0 | 24.2 s |
|
||||
| D2, darkwing-r251b, TMPDIR `r251-b` | 21:06:44Z | 598 | 598 | 0 | 24.2 s |
|
||||
|
||||
The script waited 33 s before C2, 34 s before C3, 33 s before D and 32 s before the sweep. Each time it
|
||||
was waiting for that run's `sleep 60` orphans (two per suite, four after D), and nothing else. After the
|
||||
wait, the sweep of my trees, the out dir and TMPDIR found 0 processes left (21:08:04Z). Sage confirmed
|
||||
(sage-2159, sage-2160) that the short gitea-api and `node --check` runs they made during the slot weren't
|
||||
stops. None of my busy checks refused on any of them.
|
||||
|
||||
These runs used the bus files as they were at 3b0aef995. Since then, origin/refactor (666173292, then
|
||||
7247d80c7 and c3d88840c with row 196) has changed `broker.mjs`, `runtime.mjs` and `server.mjs`, which T27's
|
||||
file imports, along with other bus files. None of those commits touch this row's two paths or
|
||||
`host-run.mjs`, and `git merge-tree` of c3d88840c with 68f2dfd4b is clean. The gate rerun in
|
||||
a clean worktree on Sage's slot runs T27 against them.
|
||||
|
||||
### Follow-up, not in this row
|
||||
|
||||
T27's start-sweep test leaves the `sleep 60` child of each planted shell running for up to 60 s after
|
||||
the test. Killing the process group (`process.kill(-pid)`; both shells are spawned `detached`) or
|
||||
`exec sleep 60` in the shell would end the child along with its parent.
|
||||
@@ -0,0 +1,113 @@
|
||||
# Row 273 (#1778): activate --send and --no-sso
|
||||
|
||||
Darkwing, 2026-10-22. Brief: `docs/plans/2026-10-22_activate-send-nosso.md` (blob in f0d0b31e9), approved by
|
||||
Mos in mos-1246 (F39). Base: origin/refactor 0042f713d. Reviewer: Filbert. Gate owner: Sage.
|
||||
|
||||
## What changed
|
||||
|
||||
Only `scripts/stack-release.sh` and its two node test files.
|
||||
|
||||
- `activate --send` puts `--send` into the run's Console flags after `--sso` and before the tester
|
||||
flags, where webui-service.sh renders it. It refuses `send-needs-sso` unless those flags hold `--sso`,
|
||||
given or carried. The plan line is `send: on; --send was given`, or `send: carried` when the pointer
|
||||
already holds it. `check_target` lets it name the pointer's copy only when the pointer holds no `--send`,
|
||||
so a second `--send` on the same copy refuses `already-active`.
|
||||
- `activate --no-sso` refuses `sso-not-on` when the pointer holds no `--sso`. Otherwise it takes the
|
||||
Console flags from a rollback set (below) and keeps the pointer's tester flags. `send_for_target`
|
||||
drops `--send`, whether it came from the set or the pointer. It is the only place that does, so one
|
||||
mutant there (M3) shows the drop is tested. The plan prints `sso: off; Console flags from <set>/<file>; restores <flags>`
|
||||
and a send line, `send: dropped; --no-sso drops --send (F39)` or `send: off; --no-sso was given and the
|
||||
pointer holds no --send`. The steps log gets `drop --send; --no-sso was given` and
|
||||
`turn off --sso; the Console flags come from <set>/<file>`.
|
||||
- Usage errors: `--send` with `--no-send`; `--no-sso` with `--sso`, `--send`, a proof pair or
|
||||
`--no-proof`; either flag on any verb but activate; either flag under `--units external`.
|
||||
`--no-sso --no-send` is allowed, since the brief doesn't forbid it and both drop the same flag.
|
||||
- The set read that `sso_base` did inline for a rollback to a Console without `--sso` moved into
|
||||
`set_flags`, which both paths call. Its three messages are unchanged, and T57 still pins them.
|
||||
- `from_log` has a new mode, `sets`: the activation of each ok activate and rollback line, newest first,
|
||||
stopping at the adopt line, which took no rollback set.
|
||||
|
||||
## The consequential choice: which set --no-sso reads
|
||||
|
||||
The brief says the flags come from "the rollback set of the activation that turned `--sso` on", and that
|
||||
"a set whose Console already ran with `--sso`" refuses. Each set holds the Console unit from before its
|
||||
run. So the activation that turned `--sso` on is the newest one whose set holds a Console without
|
||||
`--sso`: every activation after it ran with `--sso`, and so did every set it left.
|
||||
|
||||
`no_sso_base` walks the log's sets newest first and stops at the first set whose Console has no `--sso`.
|
||||
It refuses `sso-off-flags` at the first set it can't read (missing, failing its SHA256SUMS, or with no
|
||||
argv the script can parse), since it can't tell whether that set was the one. If every set ran with
|
||||
`--sso`, it refuses with `the Console in <set>/<file> already ran with --sso, and the log names no
|
||||
earlier activation`. A log with no set at all refuses with `the log names no activation with a rollback
|
||||
set`.
|
||||
|
||||
The tradeoff: a later same-copy re-pin that carried `--sso` (a `--no-send`, or a re-pin onto a newer
|
||||
copy) doesn't break `--no-sso`, which the phase 2 window needs if a re-pin lands between step 5 and a
|
||||
rollback. The cost is that "a set that ran with `--sso` refuses" now applies only when no older set
|
||||
without `--sso` exists. A tampered set on the walk still refuses, even one newer than the set the walk
|
||||
would have used. Filbert, please rule on this reading.
|
||||
|
||||
## Filbert's early look: B1 and N1 (sage-2315)
|
||||
|
||||
Filbert accepted the walk. Sage ruled both findings into this row.
|
||||
|
||||
- B1: row 200's rollback to a copy whose Console has no `--sso` took the flags from the set and kept
|
||||
the pointer's `--send`. From an `--sso --send` pointer, which this row's `--send` can now make, that
|
||||
gave a Console with `--send` and no `--sso`, which F39 b forbids. `send_for_target` now drops `--send`
|
||||
whenever the run drops the pointer's `--sso`, so it is still the one place that drops it. The plan
|
||||
line reads `send: dropped; the run drops --sso, and --send needs it (F39)`, and the steps log gets
|
||||
`drop --send; the run drops --sso`. Row 200's sso line now names only the tester as following the
|
||||
pointer.
|
||||
- Changed existing assertion, for the review to approve by name: T57 item 3 (sage-1389), "the
|
||||
plain case", ends with `assert.deepEqual(pointer(g).console,[...noSend(gbase),...pair(f)])`. It
|
||||
used to expect `'--send'` at the end. The case seeds a legacy `--send` pointer, turns `--sso` on
|
||||
(which carries `--send`), then rolls back to B, whose Console has no `--sso`. A carried `--send`
|
||||
that ends without `--sso` breaks F39 b whatever its source, so the old pin asserted the wrong
|
||||
outcome (Sage accepted this in sage-2321). Row 200's two sso plan strings also lose "--send and"
|
||||
(`ROLLBACK_PLAN` and the round 3 named-instance case), since `--send` no longer follows the pointer
|
||||
on that path.
|
||||
- N1: the walk skipped an ok line with no activation. Skipping it could land on an older set that
|
||||
isn't the right one, so it now refuses `sso-off-flags` with `an ok line in the log names no
|
||||
activation`. The walk reads the log through `mapfile`. That gives no entry for an empty log, so a
|
||||
log with no set still gets its own message.
|
||||
|
||||
## test-release.sh
|
||||
|
||||
The window plan says test-release.sh "gets cases for both". The brief lists it only as a file to run
|
||||
whole. test-release.sh is release.sh's Docker selftest and doesn't call stack-release.sh, so the cases
|
||||
live in the node tests and test-release.sh runs unchanged.
|
||||
|
||||
## Tests (T58 in stack-release.test.mjs)
|
||||
|
||||
- T1: `--sso --send` from B onto C1 with a tester port: plan, pointer, unit and steps. `--send` beside a
|
||||
carried `--sso` re-pins C1 once; a second `--send` refuses `already-active`; C carries it.
|
||||
- T2: `--send` without `--sso` refuses on another copy and on the pointer's copy, also when the pointer
|
||||
carries `--send` alone; `--plan` lists the refusal.
|
||||
- T2 (sage-2315 B1): `--sso --send` onto C1, then a rollback to B, whose Console has no `--sso`. The
|
||||
pointer and the unit end with neither flag, and the plan and steps name the drop.
|
||||
- T2 and T4 usage: every forbidden pairing and verb, checked against the full usage text.
|
||||
- T3: from an `--sso --send` pointer, `--no-sso` on the same copy gives back the pre-`--sso` ExecStart
|
||||
line byte for byte, without `--send`. A second case walks past a `--no-send` re-pin that ran with
|
||||
`--sso` and keeps the pointer's tester port (7334), which differs from the set's (7333). A third
|
||||
(sage-2305 a) turns `--sso` on, then re-pins twice with `--send` and `--no-send`, so the two newest
|
||||
sets both hold `--sso`. `--no-sso` then gives back the arrival's ExecStart line byte for byte.
|
||||
- T4 (sage-2305 b): two sets, both edited or written to hold `--sso` with sums intact, refuse
|
||||
`sso-off-flags` through `refused()`.
|
||||
- T4: `sso-not-on`; an ok line with no activation; a set that fails its sums, ran with `--sso`, has no
|
||||
argv or is missing; a log with no set. Each runs through `refused()`, so nothing stops and nothing else changes.
|
||||
- T5: stack-release-external.test.mjs adds `--send` and `--no-sso` to the row 232 usage list.
|
||||
- T55 test 5 and the T57 usage test match the new usage line.
|
||||
|
||||
## Mutants
|
||||
|
||||
| # | Change | Expected killer |
|
||||
|---|---|---|
|
||||
| M1 | `set_flags` skips the SHA256SUMS comparison when `--no-sso` is given | T4 tampered set |
|
||||
| M2 | `no_sso_base` skips the `sso-not-on` refusal | T4 `sso-not-on` |
|
||||
| M3 | the `--no-sso` branch of `send_for_target` keeps `--send` | T3 |
|
||||
| M4 | `--send` skips the `send-needs-sso` refusal | T2 |
|
||||
| M5 | parse_opts drops the `--send`/`--no-send` rule | T2 and T4 usage |
|
||||
| M6 | a rollback to a Console without `--sso` keeps `--send` (B1) | T2 (sage-2315 B1) |
|
||||
| M7 | the walk skips an ok line with no activation (N1) | T4 no-activation line |
|
||||
|
||||
Runs and results go in the round's notes once Sage clears the slot.
|
||||
@@ -0,0 +1,2 @@
|
||||
chief r148e72c8895d claude-code since 2026-10-22T20:16:24.301Z
|
||||
# exit 0
|
||||
@@ -0,0 +1,2 @@
|
||||
r148e72c8895d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T20:16:24.291Z running
|
||||
# exit 0
|
||||
@@ -0,0 +1,6 @@
|
||||
W1 threads --tester: 5 thread(s), threads.json sha256 07c154d75d929028
|
||||
W1 thread d0ba7a66-aa3f-4918-9518-94132bce6b28 messages 2 sha256 985ac61ca9220f2f
|
||||
W1 thread 446201de-e8b5-4df3-9356-d0d5422cc899 messages 2 sha256 7e7e9eeeaa8c1e09
|
||||
W1 thread b89fcca4-6b82-48bd-9310-fb82c5ae8518 messages 2 sha256 f4e4916b9656a403
|
||||
W1 thread d9bb7ff3-7a8b-4bb8-ba12-03ca094cee4e messages 2 sha256 728ff36f3e003c63
|
||||
W1 thread b85a57fe-84f9-4785-a596-135af39e334a messages 2 sha256 727de0d9c809a41a
|
||||
@@ -0,0 +1,2 @@
|
||||
chief r148e72c8895d claude-code since 2026-10-22T20:16:24.301Z
|
||||
# exit 0
|
||||
@@ -0,0 +1,2 @@
|
||||
r148e72c8895d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T20:16:24.291Z running
|
||||
# exit 0
|
||||
@@ -0,0 +1,2 @@
|
||||
chief r28dbbc5c6b4d claude-code since 2026-10-23T03:46:01.235Z
|
||||
# exit 0
|
||||
@@ -0,0 +1,6 @@
|
||||
W6 threads --tester: 5 thread(s), threads.json sha256 07c154d75d929028
|
||||
W6 thread d0ba7a66-aa3f-4918-9518-94132bce6b28 messages 2 sha256 985ac61ca9220f2f
|
||||
W6 thread 446201de-e8b5-4df3-9356-d0d5422cc899 messages 2 sha256 7e7e9eeeaa8c1e09
|
||||
W6 thread b89fcca4-6b82-48bd-9310-fb82c5ae8518 messages 2 sha256 f4e4916b9656a403
|
||||
W6 thread d9bb7ff3-7a8b-4bb8-ba12-03ca094cee4e messages 2 sha256 728ff36f3e003c63
|
||||
W6 thread b85a57fe-84f9-4785-a596-135af39e334a messages 2 sha256 727de0d9c809a41a
|
||||
@@ -0,0 +1,2 @@
|
||||
chief r28dbbc5c6b4d claude-code since 2026-10-23T03:46:01.235Z
|
||||
# exit 0
|
||||
@@ -0,0 +1,7 @@
|
||||
PASS markdown-preview.js is served and equals the copy's
|
||||
PASS /api/config on loopback: send=false edit=false
|
||||
PASS project.files through the Console: head=ae0b17c9586e51da7bc1b7e548c6acf913a55665 files=2 spec=true error=none
|
||||
PASS project.file spec/north-star.md through the Console: commit=ae0b17c9586e51da7bc1b7e548c6acf913a55665 length=99 error=none
|
||||
PASS loopback save refused: HTTP 403 error=read-only sent=false
|
||||
CONSOLE_PASS
|
||||
# exit 0
|
||||
@@ -0,0 +1,19 @@
|
||||
[
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"instance": "chief",
|
||||
"run": "r28dbbc5c6b4d",
|
||||
"launchedBy": "jason",
|
||||
"harness": "claude-code",
|
||||
"model": "claude-opus-5-5",
|
||||
"provider": "anthropic",
|
||||
"modelKey": "opus",
|
||||
"pid": 3811352,
|
||||
"startTime": "82835140",
|
||||
"runnerPid": 3811353,
|
||||
"runnerStartTime": "82835140",
|
||||
"runDir": "/home/jwoltje/.mosaic-dev/launches/mosaic-stack/r28dbbc5c6b4d",
|
||||
"startedAt": "2026-10-23T03:46:01.221Z",
|
||||
"live": true
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,2 @@
|
||||
r28dbbc5c6b4d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-23T03:46:01.221Z running
|
||||
# exit 0
|
||||
@@ -0,0 +1,21 @@
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"464010fbe4c6925b077b9b8182a209ee2177eb9d","business":"mosaic-stack","pm":true,"claude":"/home/jwoltje/.local/bin/claude","console":["--port","7332","--public-host","mosaic.woltje.com","--auth-header","X-authentik-username","--allow-user","jason.woltje","--tester-socket"],"schema":"3n","activation":"20261023T034557Z-464010fbe4c6","at":"2026-10-23T03:46:02Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-22T15:06:00Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":"20261022T150555Z-84f53540dd0d","activation":"20261022T150555Z-84f53540dd0d","result":"ok"}
|
||||
{"at":"2026-10-22T20:16:21Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":null,"activation":"20261022T201621Z-0cbe2e9b35e5","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T20:16:24Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":"20261022T201621Z-0cbe2e9b35e5","activation":"20261022T201621Z-0cbe2e9b35e5","result":"ok"}
|
||||
{"at":"2026-10-23T03:45:57Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":null,"activation":"20261023T034557Z-464010fbe4c6","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-23T03:46:02Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":"20261023T034557Z-464010fbe4c6","activation":"20261023T034557Z-464010fbe4c6","result":"ok"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3811005, running, since 2026-10-23T03:45:59.548Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3811049
|
||||
boot: organization file loaded at 2026-10-23T03:45:59.547Z
|
||||
unit flags: match the pointer
|
||||
drift: 0 commit(s) on refactor since the pointer's copy
|
||||
# exit 0
|
||||
@@ -0,0 +1,21 @@
|
||||
B0 (3n) start 2026-10-23T03:47:25.189Z
|
||||
/home/jwoltje/.mosaic-dev/backups/b0-20261023T034725Z:
|
||||
total 24
|
||||
drwx------ 3 jwoltje jwoltje 4096 Oct 22 22:47 .
|
||||
drwx------ 16 jwoltje jwoltje 4096 Oct 22 22:47 ..
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 22:47 bus
|
||||
-rw------- 1 jwoltje jwoltje 37 Oct 22 22:47 CHECK
|
||||
-rw------- 1 jwoltje jwoltje 3 Oct 22 22:47 SCHEMA
|
||||
-rw------- 1 jwoltje jwoltje 77 Oct 22 22:47 SHA256SUMS
|
||||
|
||||
/home/jwoltje/.mosaic-dev/backups/b0-20261023T034725Z/bus:
|
||||
total 3032
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 22:47 .
|
||||
drwx------ 3 jwoltje jwoltje 4096 Oct 22 22:47 ..
|
||||
-rw------- 1 jwoltje jwoltje 3096576 Oct 22 22:47 bus.sqlite
|
||||
SHA256SUMS: 69702ac9a74ec7d52a7377565c1aa2a2db605fa1f5b9e9f6b38631df3acffebf bus.sqlite
|
||||
SCHEMA: 3n
|
||||
CHECK: ok events 2202 maxSeq 2202 schema 3n
|
||||
B0 path /home/jwoltje/.mosaic-dev/backups/b0-20261023T034725Z
|
||||
B0 SHA256SUMS sha256 0946b66ccde18f5be8d49ed9f15cccf09f73804abdf31b3ae9c108c6c9ee9272
|
||||
B0 end 2026-10-23T03:47:25.308Z B0_PASS
|
||||
@@ -0,0 +1,3 @@
|
||||
r28dbbc5c6b4d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-23T03:46:01.221Z running
|
||||
ra38826f3c6e2 mosaic-stack/pm claude-code claude-opus-5-5 by chief since 2026-10-23T03:47:35.835Z running
|
||||
# exit 0
|
||||
@@ -0,0 +1,6 @@
|
||||
sent c66b0184 to chief
|
||||
chief (RESULT, re c66b0184) 11e140fa:
|
||||
I passed your request to the pm in your own words (message 3479e027-0099-4ce8-a106-0b1115e00dd2), with your note that it's a test and authorizes nothing. You asked for the PRD version and the number of ids in packages/tasks/requirements.json, read through its requirements read.
|
||||
|
||||
No pm session was running when I sent it, so I launched one (run ra38826f3c6e2, claude-code, claude-opus-5-5). Nothing was refused. When the pm answers, I'll pass on what it says.
|
||||
# exit 0
|
||||
@@ -0,0 +1,4 @@
|
||||
sent a2d9eeb9 to pm
|
||||
pm (RESULT, re a2d9eeb9) 4500c1dd:
|
||||
Version 1.15, 85 ids (checked 10 seconds ago with list_requirements and against packages/tasks/requirements.json at 464010f).
|
||||
# exit 0
|
||||
@@ -0,0 +1 @@
|
||||
464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
@@ -0,0 +1,69 @@
|
||||
# P1 start 2026-10-23T03:41:42.528Z, REPO HEAD 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
# plan sha256 e664fa3553f9da0bb29905763011223e69c426a56e484ecfd8181743b7628ad1, P0 recorded e664fa3553f9da0bb29905763011223e69c426a56e484ecfd8181743b7628ad1; NEW 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
# business-check.mjs sha256 eece4d4671e1ce15ba81e1654c641925ac4988b343687b062897392285a8a1a7; SCRIPTS.sha256 line: eece4d4671e1ce15ba81e1654c641925ac4988b343687b062897392285a8a1a7 business-check.mjs
|
||||
# business file sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93, mtime 2026-10-19 20:39:58.506635141 -0500
|
||||
|
||||
## P1 status
|
||||
# start 2026-10-23T03:41:42.538Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh status mosaic-stack)
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","business":"mosaic-stack","pm":true,"claude":"/home/jwoltje/.local/bin/claude","console":["--port","7332","--public-host","mosaic.woltje.com","--auth-header","X-authentik-username","--allow-user","jason.woltje","--tester-socket"],"schema":"3m","activation":"20261022T201621Z-0cbe2e9b35e5","at":"2026-10-22T20:16:24Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-22T04:03:00Z","op":"activate","from":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","to":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","backup":"20261022T040256Z-86f95bb27f6c","activation":"20261022T040256Z-86f95bb27f6c","result":"ok"}
|
||||
{"at":"2026-10-22T15:05:55Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":null,"activation":"20261022T150555Z-84f53540dd0d","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T15:06:00Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":"20261022T150555Z-84f53540dd0d","activation":"20261022T150555Z-84f53540dd0d","result":"ok"}
|
||||
{"at":"2026-10-22T20:16:21Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":null,"activation":"20261022T201621Z-0cbe2e9b35e5","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T20:16:24Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":"20261022T201621Z-0cbe2e9b35e5","activation":"20261022T201621Z-0cbe2e9b35e5","result":"ok"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 1791120, running, since 2026-10-22T20:16:23.031Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 1791164
|
||||
boot: organization file loaded at 2026-10-22T20:16:23.030Z
|
||||
unit flags: match the pointer
|
||||
drift: 94 commit(s) on refactor since the pointer's copy
|
||||
# exit 0, end 2026-10-23T03:41:42.847Z
|
||||
|
||||
## P1 values
|
||||
# start 2026-10-23T03:41:42.849Z
|
||||
# command: (cd $REPO && <clean env> node /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/p1.mjs)
|
||||
bus.tester true
|
||||
plugins kinds ["channel","harness","usage-source"]
|
||||
plugins usage-source ["transcript"]
|
||||
plugins channel ["cli","webui"]
|
||||
plugins harness ["claude-code"]
|
||||
launch.by "chief"
|
||||
launch.instances includes assistant true
|
||||
role assistant vars.harness "claude-code"
|
||||
role chief vars.harness "claude-code"
|
||||
role coder vars.harness "claude-code"
|
||||
role cto vars.harness "claude-code"
|
||||
role pm vars.harness "claude-code"
|
||||
role reviewer vars.harness "claude-code"
|
||||
roles naming pi 0
|
||||
# exit 0, end 2026-10-23T03:41:42.876Z
|
||||
|
||||
## P1 business-check OLD
|
||||
# start 2026-10-23T03:41:42.900Z
|
||||
# command: (cd $REPO && <clean env> node /mnt/storage/src/mosaic-stack/agents/sage/work/window-plan/repin-de352dfaf/business-check.mjs 0cbe2e9b35e51fe06dedde69c022b46e040f98c0)
|
||||
copy 0cbe2e9b3: roles 6, projects 1, arbiters 2
|
||||
HOLDS chief instance.name yes
|
||||
HOLDS pm instance.name no
|
||||
LOAD_OK
|
||||
# exit 0, end 2026-10-23T03:41:42.939Z
|
||||
|
||||
## P1 config.json top-level key names (C1; names only)
|
||||
configVersion dataRoot environment execution
|
||||
# C1: none of federation, compactionReadBytes, compactionStreams; console key absent
|
||||
|
||||
## P1 data console
|
||||
# dataRoot /home/jwoltje/.mosaic-dev
|
||||
# ls -ld $DATA/console:
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 15:16 /home/jwoltje/.mosaic-dev/console
|
||||
# ls rc=0
|
||||
# tester.sock path length 45 bytes (limit 107)
|
||||
# P1 end 2026-10-23T03:41:42.993Z
|
||||
@@ -0,0 +1,6 @@
|
||||
# P4 2026-10-23T03:42:14Z
|
||||
DropInPaths=
|
||||
ExecStart={ path=/home/jwoltje/.local/bin/chisel ; argv[]=/home/jwoltje/.local/bin/chisel client --fingerprint ce+ISFvMAhuoCRDuc7riIf+hYz87TLHk/C9C/H8QsUg= --keepalive 25s --max-retry-interval 10s http://10.1.1.227:8080 R:0.0.0.0:7332:127.0.0.1:7332 ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }
|
||||
# exit 0
|
||||
# R: specs (1): R:0.0.0.0:7332:127.0.0.1:7332
|
||||
P4 PASS: one R: spec R:0.0.0.0:7332:127.0.0.1:7332, DropInPaths empty
|
||||
@@ -0,0 +1,8 @@
|
||||
# P5 2026-10-23T03:42:14Z; HEAD 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
# git diff --quiet 464010fbe4c6925b077b9b8182a209ee2177eb9d HEAD -- scripts/stack-release.sh scripts/webui-service.sh scripts/bus-service.sh scripts/stack-copy.sh: exit 0
|
||||
# git status --porcelain (exit 0): []
|
||||
# scripts/stack-release.sh HEAD blob 7a8c347b2be483c8c2d25a2b75b910ae615319a6 NEW blob 7a8c347b2be483c8c2d25a2b75b910ae615319a6
|
||||
# scripts/webui-service.sh HEAD blob 1e4ca9681f4388cccf9964f8492de030209bbd2f NEW blob 1e4ca9681f4388cccf9964f8492de030209bbd2f
|
||||
# scripts/bus-service.sh HEAD blob 0b1d681f3515eceefea89d6b77e048c444e79a6e NEW blob 0b1d681f3515eceefea89d6b77e048c444e79a6e
|
||||
# scripts/stack-copy.sh HEAD blob 1b0d76daf1c59c1d875fc845bc24ddd0bd51131c NEW blob 1b0d76daf1c59c1d875fc845bc24ddd0bd51131c
|
||||
P5 PASS
|
||||
@@ -0,0 +1,193 @@
|
||||
# Migrate window 0cbe2e9b3 to the refactor tip (rows 270, 271, 203, 207, case fixes), schema 3m to 3n
|
||||
|
||||
Darkwing operates this window. Sage assigned it in sage-3135 on Mos's go mos-1385 (02:24:09Z 10-23, under
|
||||
Q173). Mos's conditions: backup first, a STATE report after, and the new activation id and the Console 200 on
|
||||
7332 in the report. The layout follows my last window's `window-migrate-0cbe2e9b3/PLAN.md`. Where a step is
|
||||
unchanged I name it and only say what differs. The window's files go on a darkwing/* branch, never local
|
||||
refactor.
|
||||
|
||||
## Who, and what nobody does
|
||||
|
||||
- I operate. Mos checks each step's output before the next one, runs P3 and gives the W5 go. Sage gives the
|
||||
slot gap: after Gander's 574 runs (row 293), before Rocko's 219 runs. Until Sage's CLEAR, only plan text, git
|
||||
reads and file prep. D3 and BZ are plain tar, cp and sha256sum and may run before the gap. B0 is python3 -B and
|
||||
runs in the gap.
|
||||
- Jason has no step. Nothing gets pruned. Nobody acts as Jason: no `--by jason`, no human shell or tmux pane,
|
||||
every bus read carries `--tester`, and `bus.tester` stays as it is. If it isn't `true`, stop at P1.
|
||||
- After W5, any Console start or restart is Mos's. I don't start, stop or restart the Console, the bus or
|
||||
mosaic-webui by hand.
|
||||
- Nothing new goes on: no `mosaic access` (row 207's `user add|remove` included), no Gitea grant run, no
|
||||
`--send`, no `--sso`, no proof pair, no pi (#383), no federation key. dragon-lin only; .53 and .54 take
|
||||
nothing.
|
||||
- Decision 96 condition 2: NEW's `--plan` prints `needs: Jason present for this run (decision 96 condition 2)`
|
||||
(`scripts/stack-release.sh:1413` at NEW). Q173 overrides it for this business, as at the last three windows.
|
||||
The line is expected in W3 and doesn't stop the window.
|
||||
|
||||
## Names
|
||||
|
||||
- OLD, live: `0cbe2e9b35e51fe06dedde69c022b46e040f98c0`, schema 3m, pointer `pm: true`, activation
|
||||
`20261022T201621Z-0cbe2e9b35e5`, standing chief run `r148e72c8895d` (launched by jason at 20:16:24Z), no pm.
|
||||
The pointer's Console flags are `--port 7332 --public-host mosaic.woltje.com --auth-header
|
||||
X-authentik-username --allow-user jason.woltje --tester-socket`. P1 reads them again from `status`; nothing
|
||||
copies them from this file.
|
||||
- BASE: `253346e3c3917d4c9c0f79bc87b7db6aca73180d`, the tip when sage-3135 was sent. 88 commits past OLD.
|
||||
- NEW: the refactor tip at window start, written to `$WIN/NEW` by P0 (git reads only). P0 refuses unless OLD
|
||||
and BASE are ancestors, every path BASE..NEW is `.md`, `docs/` or `agents/`, and NEW's stack-release.sh blob is
|
||||
`7a8c347b2be4`. At 02:39Z the tip is `b23783f3951e5b750ef49cd0c2d7353640ea6899`, Sage's docs commit
|
||||
(BUILD-LOG, SESSIONS, QUEUE, queue.json, a plan doc). Once P0 writes it, NEW is frozen for the window.
|
||||
- `WIN=agents/darkwing/work/window-migrate-3n/`. `vars.sh` holds OLD, BASE, the tool blob and the four
|
||||
service scripts, and reads NEW and this file's sha256 from P0's files. Every step script sources it and is
|
||||
mode 755. `p0.sh` and `w9b.sh` are new; `w5pre.sh` is written again for this window's chief; the rest adapt
|
||||
the last window's.
|
||||
|
||||
## What NEW carries over OLD
|
||||
|
||||
The non-test paths changed from OLD to BASE (`git diff --name-only`), without tests, agents/, docs/ and `.md`.
|
||||
This covers the 276/203/207 re-pin that sage-2989 planned.
|
||||
|
||||
| Row | Commits | Paths | Live effect |
|
||||
|---|---|---|---|
|
||||
| 271 (264d, #1776) | a9884dc75, aa8fc490f, 3fc8ccef1 | packages/bus/schema.sql, src/migrations/3m-3n.sql, src/store.mjs, src/broker.mjs, src/process.mjs, src/runtime.mjs, packages/cli/src/launcher.mjs, scripts/stack-release.sh | Schema 3n adds `session_ops` and `message_cancels` (both AUTOINCREMENT, STRICT), index `session_ops_session` and 7 append-only triggers. No existing row changes. The broker gets `session.clear`, `session.cancel` and `session.operation`; no CLI verb at NEW reaches them, and only they write the two tables (the INSERTs at broker.mjs:668, 718 and 6467). stack-release.sh's COUNTED adds both tables. |
|
||||
| 270 (264c, #1775) | 5ddc36ca9, bce491715, 8c28ee731 | packages/seat/src/compactions.mjs, packages/cli/src/launcher.mjs, packages/bus/src/broker.mjs, runtime.mjs, scripts/mosaic-config.mjs | The launcher appends to `<store dir>/compactions.jsonl` at the start and end of a thread-session run (`launcher.mjs:507, 648`). A launch with no thread has no store and writes none. For a claude-code run the count is unknown, `harness-unsupported`. Two new optional system config keys, `compactionReadBytes` and `compactionStreams`. |
|
||||
| 203 (FED R2, #1701) | 93a491d73, 284d55cf2, 7c543fd4a | scripts/mosaic-config.mjs, scripts/stack-release.sh, scripts/test-config.sh | An optional `federation` key in the system config, and stack-release.sh's config_checks now run on a console or a federation key. The live config has no federation key (P1 checks). |
|
||||
| 207 (#1705) | 721268b08 | packages/cli/src/access.mjs | `mosaic access user add|remove`. Nothing in the window runs it. |
|
||||
| case fixes | b96b4e303, 537ce2dd4, 47906e4fd, 931fab079 | scripts/case1-accept.sh, scripts/case2-unit.sh | Case-run harness fixes. Nothing live runs these on dragon-lin. |
|
||||
|
||||
bus-service.sh, webui-service.sh, discord-service.sh, stack-copy.sh, common.sh, package.json and
|
||||
package-lock.json haven't changed from OLD (`git diff --stat` empty). packages/seat/src/session.mjs is the same
|
||||
blob at OLD and NEW. packages/tasks/requirements.json is still PRD 1.15 with 85 requirements.
|
||||
|
||||
stack-release.sh changed only in COUNTED (`:420`) and config_checks, so W3's line formats are the last window's:
|
||||
`store schema:`, `target schema:`, `migration: X to Y, after a backup of the stopped store`, `migration steps:`,
|
||||
`needs: --migrate (given)`, the Jason line, and `commits: the run adds N`.
|
||||
|
||||
### Config keys (C1)
|
||||
|
||||
OLD's loader takes only configVersion, environment, dataRoot, execution and console (`mosaic-config.mjs:246` at
|
||||
OLD). NEW's adds federation, compactionReadBytes and compactionStreams (`:304`). OLD runs on the live config now,
|
||||
so none of the three can be there. P1 prints the live config's top-level key names (names only, no values) and
|
||||
stops on any of the three. W0 runs NEW's `mosaic-config.mjs validate` from the NEW copy and needs exit 0.
|
||||
|
||||
## Schema and backups
|
||||
|
||||
- `SCHEMA_VERSION` is 3n at NEW (`packages/bus/src/store.mjs:17`) and 3m at OLD and in the live store. The chain
|
||||
runs one step, 3m to 3n. W3 must show `migration: 3m to 3n, after a backup of the stopped store`,
|
||||
`migration steps: 3m to 3n`, `needs: --migrate (given)` and the Jason line. Any other migration text stops W3.
|
||||
- Counts. The live 3m store has 24 rows of type `table` in sqlite_master (sqlite_sequence included), 90
|
||||
triggers, 5 views and 25 indexes (the last window's W6 and P3). 3m-3n.sql adds 2 tables, 7 triggers and 3
|
||||
indexes: `session_ops_session` plus one autoindex for each UNIQUE (`session_ops (thread, op, stage,
|
||||
attempt)`, `message_cancels.message`). So W6 expects 26, 97, 5 and 28. schema.test pins `count('table') - 1`
|
||||
at 25 and triggers at 96 (`packages/bus/tests/schema.test.mjs:527-528`) after it drops
|
||||
`task_snapshots_no_update` at `:512`, which agrees: 26 - 1 and 97 - 1. 96 on live would mean a trigger is
|
||||
missing.
|
||||
- The migration writes no row, so sqlite_sequence doesn't change. Both new tables stay at 0 rows in the window,
|
||||
since nobody runs `session.clear` or `session.cancel`.
|
||||
- Restore guard at NEW counts events plus 16 tables (`COUNTED`, `stack-release.sh:420`); session_ops and
|
||||
message_cancels are the new ones. T45's LISTED and T46 cover them. The gate run 5 GREEN on 53406f3e4
|
||||
(gizmoduck, 7328da8ca) ran on the same code tree as NEW.
|
||||
- D3 (`d3.sh`): the data-root tar, same exclusions as last time (backups/, the live store and its -wal and -shm,
|
||||
sockets, `discord/searxng`, `launches/*/*/tmp`). It now expects `bus-host/sessions.json` at sessionsVersion 2,
|
||||
which it has been since the last window. Plain tar; may run before the gap.
|
||||
- BZ (`bz.sh`): the business file copy, sha256 must be 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93
|
||||
as at the last two windows. cp and sha256sum only; never read.
|
||||
- B0 (`b0.sh 3m`), in Sage's gap: the online sqlite backup-API copy laid out for `rehearse --backup PATH`.
|
||||
`SCHEMA` must say 3m. Its path and SHA256SUMS sha256 go to Mos with D3's before P3. This is Mos's "backup
|
||||
first".
|
||||
- W5 takes the stopped-store backup every migrating activate takes, before the migration. That backup is the
|
||||
store's rollback point. If W5's gate fails after the migration, the in-run rollback restores it by itself
|
||||
(`TAKEN`), which still counts as a restore and ends the window.
|
||||
- Disk: /home has 36G free. The data root is 2.0G without backups/ and rehearsals/, 6.7G with them. The last
|
||||
D3 is 1.5G.
|
||||
|
||||
## Before the window (nothing stopped)
|
||||
|
||||
| # | Who | Step |
|
||||
|---|-----|------|
|
||||
| P0 | operator, git only | `p0.sh <this file's sha256>`: writes `$WIN/NEW` and `$WIN/PLAN.sha256` (see Names). NEW's full sha and this file's sha256 go to Mos. |
|
||||
| D3 | operator | `d3.sh`, above. |
|
||||
| BZ | operator | `bz.sh`, above. |
|
||||
| B0 | operator, in Sage's gap | `b0.sh 3m`, above. |
|
||||
| P1 | operator | `p1.sh`: `status` shows pointer OLD, activation `20261022T201621Z-0cbe2e9b35e5`, 3m, the Console flags, unit flags match. Business file sha256 1e49bdf0 and `business-check.mjs` LOAD_OK for OLD. `$DATA/console` 0700, `tester.sock` 0600, `bus.tester` `true`. C1's key names. |
|
||||
| W0 | operator | `w0.sh`: `scripts/stack-copy.sh copy $NEW`, `business-check.mjs` LOAD_OK for NEW, and NEW's `mosaic-config.mjs validate` exit 0. |
|
||||
| P2 | operator, in Sage's gap | `p2.sh` and `p2units.sh`: the two stub runs against NEW's copy, then both units rendered from REPO's service scripts and diffed against the live units. The copy path is the only difference allowed. |
|
||||
| P3 | Mos, in Sage's gap | `stack-release.sh rehearse $NEW mosaic-stack --backup <B0 path> --port 7341`, no `--migrate` (`:138` accepts it for activate only; rehearse migrates by itself when the schemas differ). Expect `PASS new-refuses-old-store`, `PASS migrate: 3m to 3n`, `PASS new-opens-migrated`, `PASS migrate-again`, `PASS old-refuses-migrated` (0cbe2e9b3's copy refusing the 3n store), `PASS gate`, `PASS no-session`, `REHEARSAL_PASS`. Then `python3 -B p3/counts.py <B0>/bus/bus.sqlite <rehearsal>/data/bus/bus.sqlite`: every 3m table equal, session_ops and message_cancels `None -> 0`, sqlite_sequence equal. `p3/hand-console.sh <rehearsal dir>` if Mos wants the hand Console read again; it now takes the directory as its argument and refuses one that isn't NEW's. |
|
||||
| P4 | operator | `p456.sh p4`: the tunnel read. |
|
||||
| P5 | operator | `p456.sh p5`: the four service scripts held at NEW with empty porcelain. |
|
||||
| P6 | operator | `p456.sh p6` as `matrix-old.txt` and `p456.sh tester` as `tester-old.txt`: the 7332 matrix (a)-(g) and the two tester-http reads, for W10. |
|
||||
|
||||
## The window
|
||||
|
||||
| # | Who | Step |
|
||||
|---|-----|------|
|
||||
| W0b | operator | `wsteps.sh` runs W0b to W4 in one go and stops at the first failed check. W0b is the business file copy again. |
|
||||
| W1 | operator | Idle check (`agents --tester`, `launches list`), start stamp from `date -u`, S1 with window-repin-84f53540d's snapshot.mjs at 639fd28a, `--held`. The only live launch allowed is the standing chief r148e72c8895d; any other, a pm included, stops and goes to Mos. Then `d3.sh` again, so the rollback source is as of just before W5. |
|
||||
| W2 | operator | `status`: pointer OLD, `pm: true`, 3m, unit flags match. |
|
||||
| W3 | operator | `stack-release.sh activate $NEW mosaic-stack --pm --migrate --tester-socket --plan`. It must show OLD to NEW, the migration lines above, the backup line, and a Console line with exactly OLD's flags: `--tester-socket`, no `--send`, no `--sso`, no proof pair, no drop line. Any other difference stops here. |
|
||||
| W4 | operator | The unit reads. W3 and W4 go to Mos for the W5 go. |
|
||||
| W5 | operator, on Mos's go | `w5pre.sh` right before: agents and launches again with W1's rule; chief or pm working stops. Then `w5.sh`: the same activate without `--plan`. Exit 0, `activate ok`, `gate passed`, `stopped store schema: 3m`, `migrated the store to 3n`, no drop line. Record the activation id, backup path, STAMP and the backup's SHA256SUMS sha256, and the bus journal's `launched` lines since W5's start. Then `status` (NEW, pm true, 3n, check pass) and `rollback mosaic-stack --restore <W5 activation> --plan`, read only, for the guard count. |
|
||||
| W6 | operator, after Mos checks W5 | `w6.sh`: `status` shows 3n; a read-only python3 count on the live store gives 26 tables, 97 triggers, 5 views and 28 indexes, schema_version 3n, every 3n object by name, 0 rows in both new tables; `agents --tester` answers; `tr.sh` thread reads match W1's (ids, message counts, sha256); `bus-host/sessions.json` at sessionsVersion 2. |
|
||||
| W7 | Mos | Any Console restart. I record the Console pid and `/proc/<pid>/cwd` before and after, and change nothing. |
|
||||
| W9 | operator | `w9.sh`: the last window's W9 list, with the tester pm read dropped (mos-1344 carry 1): the Console unit active, started after W5, cwd NEW's copy (mos-1338 item 4); status 3n; console-check d068fe02 CONSOLE_PASS; webui journal since W5 with one `proxy proof off` and no `Sign-in:`; `tester.sock` 0600 in a 0700 `console/`; one peercred-starts line naming NEW; no `library:` line; one running chief from this start; no pm launch; the chief not working. |
|
||||
| W9b | operator, ruled in (mos-1392) | `w9b.sh`, the pm launch proof, under the five conditions below. |
|
||||
| W10 | operator | `w10.sh`: the matrix again as `matrix-new.txt`, lines a-g the same as `matrix-old.txt` (line a is the Console 200 on 7332, `healthz 200 ok=true`); the two tester-http reads (the `/api/config` line identical, `/api/bus/agents` 200 with its count shown beside P6's count from `tester-old.txt`, mos-1344 carry 3); no listener on 7333; P4 again; Console POSTs on 7332 with no session refused (mos-1195); tester `POST /api/processing` refused 403 read-only. |
|
||||
| W11 | operator | STATE in `$WIN/STATE.md` with the activation id, W10's line a and W9b's pm marked "left live by W9b"; comments on #1776 and #1775 (`post-gitea.sh 1776 1775`, as darkwing, read back); the P19 body to Sage, with the same pm lines; the window's files and this plan revision committed and pushed to a darkwing/* branch. |
|
||||
|
||||
### W9b, the pm launch proof (ruled in, mos-1392; mos-1344 carry 2)
|
||||
|
||||
No pm is live on OLD, so the window has no pm to read. P3 can't prove a pm launch either: rehearse runs its host
|
||||
with no launches and checks `no-session` (no sessions.json, no launches under the rehearsal data root). A pm
|
||||
launch on NEW can only be proved on live, and that means writing chief and pm turns, messages and a launch.
|
||||
|
||||
The step is the last re-pin's W12c step 1 (window-repin-84f53540d/W.txt, 15:23Z 10-22), without row 66's turns:
|
||||
|
||||
1. Backup first: `b0.sh 3n`, an online copy of the held 3n store.
|
||||
2. One relay: `talk chief "[mos test] Please relay this to the pm: [mos test] read packages/tasks/requirements.json through your requirements read and reply with the PRD version and the number of ids." --wait 300 --business mosaic-stack --tester`.
|
||||
3. `launches list --json` within 120 s: exactly one live pm, `launchedBy` chief, `startedAt` after the relay.
|
||||
Its outer pid or `runnerPid` must name NEW's copy in `/proc/<pid>/cmdline` or cwd.
|
||||
4. One read: `talk pm "[mos test] read packages/tasks/requirements.json ... the version and the number of ids" --wait 300 --tester`, expecting 1.15 and 85.
|
||||
|
||||
Mos's conditions (mos-1392, through sage-3151), which `w9b.sh` follows:
|
||||
|
||||
1. `b0.sh 3n` runs first, and its online copy has to verify before the relay goes out: `B0_PASS`, which needs the
|
||||
copy's integrity_check `ok` and `sha256sum -c` on its SHA256SUMS.
|
||||
2. Only the NEW-copy match is recorded from `/proc/<pid>/cmdline` or cwd: a count of argv entries naming the
|
||||
copy and a yes or no for the cwd. Never argv itself, never the environment, nothing that holds a `--setenv`
|
||||
value.
|
||||
3. The pm's run id, pid and runner pid go into STATE.md and the P19 body, marked "left live by W9b". The launch
|
||||
log has no launch id apart from the run id: `launches list` keys each launch by `run`, so the run id stands
|
||||
for both. The next window's W1 has to expect that pm.
|
||||
4. W9b never runs while 574 is in a run phase. Sage's order puts 574 run 2 before my slot. If something
|
||||
reorders, `w9b.sh` holds: `sage-busy-now.sh` must print CLEAR first, or the script exits with `W9B_HOLD`,
|
||||
writes nothing to the bus, and waits until 574 finishes or stops.
|
||||
5. The first failure stops the step and goes to Mos and Sage. Failures are a relay timeout or failed relay, a
|
||||
live pm count other than one, `launchedBy` not chief, `startedAt` before the relay, no NEW match, or a read
|
||||
that doesn't return 1.15 and 85. If the store or the pointer is in doubt after a failure, restore per the
|
||||
rollback section below. A pm that launched and then failed its read stays live and goes in STATE as left
|
||||
live by W9b; that alone isn't a reason to restore.
|
||||
|
||||
What that costs:
|
||||
- The pm stays live into later windows.
|
||||
- Both messages carry `[mos test]` (Q134 C).
|
||||
- The relay is a launch without a thread, so it writes no `compactions.jsonl` (see row 270 above).
|
||||
|
||||
## Steps skipped, and why
|
||||
|
||||
- W8 (the last window's A6 share check) isn't needed: NEW adds no share path. 206's share verbs are unchanged
|
||||
and already on live.
|
||||
- Row 66's live check isn't run: it isn't in mos-1385, and it writes chief turns.
|
||||
- No thread create or launch, so neither 271's clear and cancel verbs nor 270's ledger are exercised on live.
|
||||
271's verbs have no CLI verb at NEW. Both rows' tests ran green in gate run 5 on 53406f3e4.
|
||||
|
||||
## Stop conditions and rollback
|
||||
|
||||
- The first failure stops the step and goes to Mos. Any restore, or a second failure, ends the window. Before W5
|
||||
there's nothing to undo. Keep every copy and prune nothing.
|
||||
- After W5, a pointer flip alone can't roll back: 0cbe2e9b3's copy refuses a 3n store (P3's
|
||||
`old-refuses-migrated`). Rollback is restore-only: the store from W5's stopped-store backup, the data-root
|
||||
files from W1's D3, and a re-pin to 0cbe2e9b3. It goes to Mos for the go, with `rollback --plan`'s guard count
|
||||
and the event types after the backup. Q173 overrides decision 96 condition 3, as before.
|
||||
- The last window's sessions.json hazard is gone. OLD and NEW have the same session.mjs, and both read
|
||||
sessionsVersion 2. A `compactions.jsonl` that a later thread launch writes on NEW is a file OLD doesn't read,
|
||||
so it stays where it is.
|
||||
- Before any real restore I take an online copy of the 3n store with `b0.sh 3n`, so the rows the restore drops
|
||||
are kept. Its path and SHA256SUMS sha256 go to Mos with the request.
|
||||
@@ -0,0 +1 @@
|
||||
e664fa3553f9da0bb29905763011223e69c426a56e484ecfd8181743b7628ad1
|
||||
@@ -0,0 +1,20 @@
|
||||
# Rulings on PLAN.md (sha256 af52429480de6629de4c8f8313d11fd875723566d8db142d2b7e67c4b04c17ac)
|
||||
|
||||
PLAN.md is left as sent, so its sha256 stays the one Sage passed to Mos. These rulings override it where they differ.
|
||||
|
||||
sage-3150 (02:42:54Z 10-23), plan accepted apart from W9b:
|
||||
1. D3 and BZ don't run early. Gander's 574 run 2 (from 02:40:35Z) has a load-sensitive band (case1-accept P10,
|
||||
Vikunja 573). They run at the start of my slot, before B0.
|
||||
2. BASE..NEW stays docs-only, since 574 lands after W11. P0 writes NEW, and that sha holds for the whole window
|
||||
even if a doc commit lands during it.
|
||||
3. Order: Gander's run 2, then Sage's claims gap, then the CLEAR, which comes with Mos's W9b ruling (sage-3149),
|
||||
then the window.
|
||||
W9b: Sage recommended ruling it in, with the pm's run id recorded in STATE.md as left live. Mos rules.
|
||||
W11: commit and push the window files to a darkwing/* branch, as planned.
|
||||
|
||||
sage-3151 (02:45:59Z 10-23): Mos ruled W9b in (mos-1392, 02:45:35Z) with five conditions and asked for them in
|
||||
the plan before the slot. PLAN.md is revised for that one change: the W9b row, the W9b section (conditions 1-5)
|
||||
and the W11 row (the pm left live, and the plan revision committed with the window files). Its sha256 changes
|
||||
from af524294...c17ac; P0 takes the new one. w9b.sh follows the conditions: a CLEAR hold first (W9B_HOLD, exit 2),
|
||||
B0_PASS before the relay, match counts only, $WIN/W9B-PM.txt with the pm's run id, pid and runner pid as left
|
||||
live by W9b, and exit 1 on each named failure, the read miss included.
|
||||
@@ -0,0 +1,269 @@
|
||||
{
|
||||
"schema": "3m",
|
||||
"tables": {
|
||||
"decision_events": {
|
||||
"rows": 22,
|
||||
"maxSeq": 22,
|
||||
"sha256": "b016d2a7cb0116252166016822c472af1cc520435a6538ecb7be5db62c6cb4b3"
|
||||
},
|
||||
"decisions": {
|
||||
"rows": 22,
|
||||
"maxSeq": 22,
|
||||
"sha256": "eafcd57d3531f7ac7c768e512632a3975df372c49ffd95abe7d858fd05ce93a8"
|
||||
},
|
||||
"deliveries": {
|
||||
"rows": 1935,
|
||||
"maxSeq": 1935,
|
||||
"sha256": "42f92c45a38f7b7fbeb8871dd78a4b963ad902c3fda93bd7c62ddb8881242c80"
|
||||
},
|
||||
"events": {
|
||||
"rows": 2200,
|
||||
"maxSeq": 2200,
|
||||
"sha256": "e7e46574bd7b737dd283c67d2bf6c3918b888c6de4cacd42a60f1f0e78a1b9a7"
|
||||
},
|
||||
"gitea_grants": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"gitea_users": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"host_grants": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"hosts": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"instance_names": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"message_threads": {
|
||||
"rows": 10,
|
||||
"maxSeq": null
|
||||
},
|
||||
"messages": {
|
||||
"rows": 635,
|
||||
"maxSeq": 635
|
||||
},
|
||||
"meta": {
|
||||
"rows": 3,
|
||||
"maxSeq": null,
|
||||
"sha256": "e2dbed747bf81f25f6aa3f50c9a456110d536582be1933e79ddc35896658b218"
|
||||
},
|
||||
"projects": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "cdf87b72ef95a2f988c242d35f1050f9e3e310637f84a645b51694daa924650f"
|
||||
},
|
||||
"role_claims": {
|
||||
"rows": 115,
|
||||
"maxSeq": 115,
|
||||
"sha256": "6e16043dbdffa2c6b1c18b43151ecac01787a94ca77c74e60a4e66ae09e803ee"
|
||||
},
|
||||
"session_defaults": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "0fa4a532b106e963e200064d7f7464412a2fd6fce5a59a35ba7097d9bdca879c"
|
||||
},
|
||||
"sessions": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "7094392718785cbaec3d5e5bd640f4b36d1e2be1fb4b7c6a9db77308de111803"
|
||||
},
|
||||
"task_comment_cursors": {
|
||||
"rows": 666,
|
||||
"maxSeq": 666,
|
||||
"sha256": "827456a5efbac1c1ddc455867a7896c33a4073930f8bb7911182713d12fb8ce1"
|
||||
},
|
||||
"task_snapshots": {
|
||||
"rows": 577,
|
||||
"maxSeq": 577,
|
||||
"sha256": "99f2aefde907be0142d8e173276add60083eae75851c11e85e9fbdd30af73386"
|
||||
},
|
||||
"thread_claims": {
|
||||
"rows": 10,
|
||||
"maxSeq": 10,
|
||||
"sha256": "925e82e219ca7d469a3d9d72bd7033b9f52a47f1da272ac7ae31832a24cd1b91"
|
||||
},
|
||||
"thread_opens": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"thread_shares": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"threads": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "6cc7fbd14dd1d8164dbeab1e2c2911ca206c283e722724ee2b0b0a8e22e0f533"
|
||||
},
|
||||
"usage_records": {
|
||||
"rows": 104,
|
||||
"maxSeq": 104,
|
||||
"sha256": "12e30281ae16ee8536c7d4ccdff50f2c3da441504b5b17810bcb0031bcca36f3",
|
||||
"byRun": [
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r8fba7e598156",
|
||||
"input": "0",
|
||||
"output": "0",
|
||||
"unknownTurns": 1
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r4a96e2142e4d",
|
||||
"input": "2",
|
||||
"output": "52",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rc78c9700c8e9",
|
||||
"input": "14",
|
||||
"output": "1519",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r293f33bcbc63",
|
||||
"input": "2",
|
||||
"output": "44",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r34520a581318",
|
||||
"input": "6",
|
||||
"output": "323",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r7e99838f9f93",
|
||||
"input": "2",
|
||||
"output": "44",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rc964611b2092",
|
||||
"input": "4",
|
||||
"output": "120",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rbb708846b605",
|
||||
"input": "12",
|
||||
"output": "2089",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rc36b17ef3788",
|
||||
"input": "16",
|
||||
"output": "5221",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r097436c91816",
|
||||
"input": "16",
|
||||
"output": "3340",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r497f1c817d4d",
|
||||
"input": "2",
|
||||
"output": "80",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rc9e993da24cf",
|
||||
"input": "30",
|
||||
"output": "5871",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r7646a7a4a2bd",
|
||||
"input": "12",
|
||||
"output": "1448",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r4004e5e09433",
|
||||
"input": "2",
|
||||
"output": "61",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rd0b8fdb4d62d",
|
||||
"input": "18",
|
||||
"output": "1714",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r62b31aae5852",
|
||||
"input": "2",
|
||||
"output": "31",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r2cf8536da2c3",
|
||||
"input": "12",
|
||||
"output": "1420",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "re6c69f1ec1f0",
|
||||
"input": "16",
|
||||
"output": "1471",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r2c62e02f8371",
|
||||
"input": "2",
|
||||
"output": "68",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r410293d04d3d",
|
||||
"input": "10",
|
||||
"output": "1105",
|
||||
"unknownTurns": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"untimed": [
|
||||
"gitea_grants",
|
||||
"gitea_users",
|
||||
"host_grants",
|
||||
"hosts",
|
||||
"message_threads",
|
||||
"meta",
|
||||
"task_comment_cursors"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
# Migrate window 0cbe2e9b3 to 464010fbe (rows 270 and 271, #1775 and #1776), schema 3m to 3n, STATE report (W11)
|
||||
|
||||
Operator and tester: Darkwing. Plan: `PLAN.md` in this directory, sha256
|
||||
e664fa3553f9da0bb29905763011223e69c426a56e484ecfd8181743b7628ad1 (the sage-3151 revision for W9b; the sage-3150 and
|
||||
sage-3151 rulings are in `RULINGS.md`). Tool blob 7a8c347b2be4 (`scripts/stack-release.sh` at NEW); P5 found the four
|
||||
release scripts the same at HEAD and NEW. OLD 0cbe2e9b35e51fe06dedde69c022b46e040f98c0, NEW
|
||||
464010fbe4c6925b077b9b8182a209ee2177eb9d, 94 commits past OLD, 6 past BASE 253346e3c with no runtime path changed.
|
||||
Every stamp below comes from `date -u` or from the transcript `W.txt` in this directory. dragon-lin only.
|
||||
|
||||
Sage assigned the window (sage-3135) on Mos's go (mos-1385), ruled the plan (sage-3150, sage-3151) and gave the slot
|
||||
(sage-3172, 03:39:53Z). Mos's gos and rulings: mos-1392 and mos-1394 (W9b in, five conditions), mos-1403 (P3 PASS, the
|
||||
W0b to W4 go), mos-1404 (the W5 go), mos-1405 (W5 checked, the W6, W9, W9b, W10 and W11 go, no W7). Q173 covers every
|
||||
step.
|
||||
|
||||
## Outcome
|
||||
|
||||
NEW is live for mosaic-stack and the store is 3n. W5's activate stopped the units, backed up the stopped 3m store,
|
||||
migrated it to 3n in one step and started both units on NEW. Every check from P0 to W10 passed. Nothing was rolled
|
||||
back or restored, and nothing was pruned.
|
||||
|
||||
- The live 3n store has 26 table rows, 97 triggers, 5 views and 28 indexes (W6). session_ops, message_cancels, the
|
||||
index session_ops_session and the seven new triggers exist; session_ops and message_cancels hold 0 rows. NEW's
|
||||
COUNTED list (`stack-release.sh:420`) names 16 tables, session_ops and message_cancels included.
|
||||
- The five tester threads read the same after W5 as before it: the same ids, message counts and sha256 of each
|
||||
`thread read --json --tester` (W1 against W6).
|
||||
- bus-host/sessions.json was already sessionsVersion 2 before the window. NEW's host rewrote it at 03:46:01Z, still
|
||||
v2 with 1 session.
|
||||
- The Console started at 03:45:59Z, after W5.start, with its cwd in NEW's copy, so nobody restarted it (W7 not run,
|
||||
mos-1405).
|
||||
- The standing chief r148e72c8895d ended with W5's restart while not working. The new standing chief is
|
||||
r28dbbc5c6b4d, launched by the new host (the bus journal's one launch line since W5.start).
|
||||
- W9b proved a pm launch on NEW, which the last window couldn't (mos-1344). The relay through the chief launched pm
|
||||
run ra38826f3c6e2, and its requirements read answered "Version 1.15, 85 ids". The pm is left live (below).
|
||||
|
||||
Nobody acted as Jason: no `--by jason`, no human pane, no auth header as jason, no pi. Nothing new went on: no
|
||||
`--send`, no `--sso`, no proof pair, no grant. W8 and W12 were not run.
|
||||
|
||||
## pm left live by W9b
|
||||
|
||||
pm run ra38826f3c6e2 (claude-code), launchedBy chief, startedAt 2026-10-23T03:47:35.835Z, pid 3831373, runner pid
|
||||
3831374: left live by W9b.
|
||||
|
||||
The run id stands in for the launch id, since `launches list` keys a launch by its run and has no other id. The next
|
||||
window's W1 has to expect this pm, live or ended, beside the chief r28dbbc5c6b4d (mos-1392 condition 3). At W10 both
|
||||
were idle.
|
||||
|
||||
W9b under the mos-1392 conditions:
|
||||
|
||||
1. b0.sh 3n ran first: `backups/b0-20261023T034725Z`, CHECK ok events 2202 maxSeq 2202 schema 3n, SHA256SUMS 0946b66c,
|
||||
B0_PASS at 03:47:25.308Z, before the relay at 03:47:25.313Z.
|
||||
2. Only the NEW-copy match is recorded: pid 3831373 has 37 argv entries naming NEW's copy, pid 3831374 has 1. Neither
|
||||
cwd is NEW's copy. No argv text, environment or `--setenv` value is recorded.
|
||||
3. This file and the P19 body name the run id and pids above.
|
||||
4. No 574 run phase was open (sage-3172); w9b.sh checked `sage-busy-now.sh` for CLEAR first.
|
||||
5. Nothing failed, so nothing was stopped or restored.
|
||||
|
||||
The chief's reply: it passed the request on as message 3479e027, found no pm session, launched one and saw nothing
|
||||
refused. The pm's reply to the direct read: "Version 1.15, 85 ids (checked 10 seconds ago with list_requirements and
|
||||
against packages/tasks/requirements.json at 464010f)."
|
||||
|
||||
## Deviation
|
||||
|
||||
1. `wsteps.sh` checks for `w0.txt`; I had written W0's output as `W0.txt`. I renamed it (`mv -n`) before wsteps ran.
|
||||
Its content is unchanged.
|
||||
2. My first `w5.sh` call left out the go argument, and the script refused on usage (`usage: w5.sh GO`) before it ran
|
||||
anything or wrote a file. The pointer stayed on OLD. I ran the pre-read again (03:45:57Z, the second pre-read in
|
||||
`W.txt`) and then `w5.sh mos-1404`. Mos accepted it (mos-1405).
|
||||
3. W10's `/api/bus/agents` read 2 agents where P6 read 1. The second is the pm W9b left live: the two rows are chief
|
||||
r28dbbc5c6b4d and pm ra38826f3c6e2, both idle.
|
||||
4. W11's first two `post-gitea.sh` runs, launched from `/`, stopped at the login check with nothing posted:
|
||||
`gitea-api.sh` needs a git working directory and failed with "not a git repository". For the second run I had
|
||||
changed the login check on a wrong guess about pipefail; I reverted it, so the script is back at 47a24e05, then
|
||||
ran it from the repo. Both outputs are kept (`post-gitea-try1.out`, `post-gitea-try2.out`).
|
||||
|
||||
## Gitea
|
||||
|
||||
`post-gitea.sh 1776 1775` as darkwing (`post-gitea.out`): #1776 comment 31009 and #1775 comment 31010, each read
|
||||
back equal to its `comments.md` body, 03:52:34Z and 03:52:35Z.
|
||||
|
||||
## Stamps and activation
|
||||
|
||||
| Step | Start (UTC) | Result |
|
||||
| --- | --- | --- |
|
||||
| P0 | 03:41:34Z | P0_PASS, NEW 464010fbe, plan e664fa35, 6 commits past BASE, no runtime paths (`p0.txt`) |
|
||||
| D3 data-root snapshot (slot start) | 03:40:56Z | `backups/d3-20261023T034056Z`, 91612 members, tar exit 0, SHA256SUMS 6e5cc745 (`d3-slot.txt`) |
|
||||
| BZ business file copy (slot start) | 03:41:29Z | `.pre-window-20261023T034129Z`, sha256 1e49bdf0 (`bz-slot.txt`) |
|
||||
| B0 store backup (3m) | 03:41:34Z | `backups/b0-20261023T034134Z`, ok events 2200, maxSeq 2200, 3m, SHA256SUMS 6589030e (`b0-3m.txt`) |
|
||||
| P1, W0, P2, P4, P5, P6 | 03:41:42Z to 03:42:14Z | all PASS; W0 copy made, LOAD_OK; P2 stubs and units PASS (`P1.txt`, `w0.txt`, `p2.txt`, `p2-units.txt`, `P4.txt`, `P5.txt`, `matrix-old.txt`, `tester-old.txt`) |
|
||||
| P3 rehearsal (Mos) | 03:43:20Z | REHEARSAL_PASS rc 0, every table count equal, session_ops and message_cancels None to 0 (`p3/p3.out`, `p3/counts.out`, mos-1403) |
|
||||
| W0b business file copy | 03:44:07Z | `.pre-window-20261023T034407Z`, sha256 1e49bdf0 |
|
||||
| W1 launches, agents, S1 | 03:44:07Z | chief r148e72c8895d standing, no other launch; S1 7e4d46f9 |
|
||||
| W1 tester thread reads | 03:44:08Z | 5 threads (`tr.sh W1`) |
|
||||
| W1 D3 again | 03:44:12Z | `backups/d3-20261023T034412Z`, 91652 members, tar exit 0, sessions.json v2, SHA256SUMS eda5be89 |
|
||||
| W2 status | 03:44:32Z | pointer OLD, pm true, 3m, check pass |
|
||||
| W3 plan | 03:44:32Z | 3m to 3n in one step, needs `--migrate` (given), 94 commits, Console line OLD's flags exactly (`W3-plan.txt` 229888d8) |
|
||||
| W4 unit read | 03:44:33Z | OLD units, DropInPaths empty, bus `--pm`, no quote or backslash |
|
||||
| W5 pre-read (mos-1404) | 03:45:42Z, 03:45:57Z | chief not working, no pm, no other launch |
|
||||
| W5 activate --pm --migrate --tester-socket | 03:45:57Z to 03:46:02Z | exit 0, stopped store 3m, migrated to 3n, gate passed, activate ok (`W5.txt`) |
|
||||
| W5 status, restore plan | 03:46:02Z | pointer NEW, pm true, 3n, check pass; restore plan exit 0, reads back to 3m, no post-backup refusal |
|
||||
| W6 | 03:46:51Z to 03:46:56Z | W6_PASS (`w6.out`, `W6-counts.txt`) |
|
||||
| W9 checks | 03:47:16Z to 03:47:17Z | W9_CHECKS_PASS (`w9.out`) |
|
||||
| W9b pm launch and read | 03:47:25Z to 03:47:51Z | W9B_PASS (`w9b.out`, `W9B-PM.txt`) |
|
||||
| W10 | 03:48:46Z to 03:48:47Z | W10_PASS (`w10.out`, `matrix-new.txt`) |
|
||||
|
||||
Activation id 20261023T034557Z-464010fbe4c6. Pointer log (`state/stack-activation-log.jsonl`): started at 03:45:57Z
|
||||
(backup null) and ok at 03:46:02Z (backup 20261023T034557Z-464010fbe4c6), the same two-line pattern as the last
|
||||
window. W5's backup: `~/.mosaic-dev/backups/stack/20261023T034557Z-464010fbe4c6`, STAMP 2026-10-23T03:45:58.274Z,
|
||||
SCHEMA 3m, SHA256SUMS sha256 480f5e556d02d3f079c07782af204c0a41e44fb4633064e1d7c302e473be1390. The bus journal since
|
||||
W5.start has one launch line, `launched chief: run r28dbbc5c6b4d`.
|
||||
|
||||
## W6, W9 and W10 detail
|
||||
|
||||
- W6 store count, python3 -B with mode=ro: `table=26 trigger=97 view=5 index=28`, schema_version 3n, nothing missing,
|
||||
session_ops 0 rows, message_cancels 0 rows, thread_shares 0 rows, events 2202, maxSeq 2202. Thread reads match W1
|
||||
(5 threads). sessions.json sessionsVersion 2, 1 session.
|
||||
- W9 Console: mosaic-webui active, MainPID 3811007, started 03:45:59Z, cwd NEW's copy. Bus active, pid 3811005, cwd
|
||||
NEW's copy. console-check.sh (d068fe02) CONSOLE_PASS. webui journal since W5: proxy proof off 1, Sign-in 0.
|
||||
`console/` 0700 and `tester.sock` 0600. peercred-starts since W5 naming NEW: 1. Bus journal `library:` lines: 0.
|
||||
One running chief from this start, r28dbbc5c6b4d; no pm before W9b.
|
||||
- W10: matrix-new.txt equals matrix-old.txt (lines a to g). Line a is `a 200 ok=true`, the healthz 200 on 7332. No
|
||||
listener on 7333. The tester `/api/config` read is identical to P6. `/api/bus/agents` is 200 with 2 agents (chief
|
||||
and the W9b pm). P4 PASS. Unsigned POSTs to `/api/seen`, `/api/reply` and `/api/processing` on 7332 get 401
|
||||
"sign-in required", and the tester-socket POST `/api/processing` gets 403 "read-only", sent false.
|
||||
|
||||
## Rollback sources (not used)
|
||||
|
||||
OLD refuses a 3n store, so a rollback now is a restore, not a pointer flip (mos-1404). The sources: W5's backup above
|
||||
(3m) for the store, W1's D3 `d3-20261023T034412Z` (SHA256SUMS eda5be89) for the rest of the data root, B0
|
||||
`b0-20261023T034134Z` (3m), and the business file copies `.pre-window-20261023T034129Z` and
|
||||
`.pre-window-20261023T034407Z`. W9b's B0 `b0-20261023T034725Z` is the 3n store after W6 and before the W9b talks.
|
||||
A rollback goes to Mos first. Nothing is pruned.
|
||||
|
||||
## Scripts
|
||||
|
||||
`p0.sh` d038e4ed, `wsteps.sh` d64828cb, `w5pre.sh` e5e6cc34, `w5.sh` 34b9ac8d, `w6.sh` 37e0d76b, `w9.sh` cca90dd0,
|
||||
`w9b.sh` e56a1c52, `w10.sh` f67bd5a8, `tr.sh` 7a56dc29, `d3.sh` b5e1ca55, `b0.sh` 41b1fdfe, `bz.sh` 0ef4b29a,
|
||||
`post-gitea.sh` 47a24e05. Thread read bodies stay in `.tr/` and are not committed.
|
||||
@@ -0,0 +1,885 @@
|
||||
# W0b-W4 start 2026-10-23T03:44:07Z
|
||||
# plan e664fa35, NEW 464010fbe4c6925b077b9b8182a209ee2177eb9d, tool blob 7a8c347b2be4, P5 four scripts at NEW and clean, business-check.mjs eece4d46: checked 2026-10-23T03:44:07Z
|
||||
# W0 copy present, w0.txt LOAD_OK
|
||||
# W0b: /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261023T034407Z, sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93, recorded in backups.txt
|
||||
|
||||
## W1 agents --tester
|
||||
# start 2026-10-23T03:44:07.945Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic agents --business mosaic-stack --tester)
|
||||
chief r148e72c8895d claude-code since 2026-10-22T20:16:24.301Z
|
||||
# exit 0, end 2026-10-23T03:44:08.158Z
|
||||
|
||||
## W1 launches list
|
||||
# start 2026-10-23T03:44:08.161Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic launches list)
|
||||
r148e72c8895d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T20:16:24.291Z running
|
||||
# exit 0, end 2026-10-23T03:44:08.272Z
|
||||
# W1 launches: chief r148e72c8895d standing (OLD's activation), no other launch
|
||||
# W1 start stamp 2026-10-23T03:44:08Z
|
||||
# SNAP sha256 639fd28a checked before S1
|
||||
|
||||
## S1 snapshot --held
|
||||
# start 2026-10-23T03:44:08.278Z
|
||||
# command: (cd $REPO && <clean env> node /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-repin-84f53540d/snapshot.mjs --store /home/jwoltje/.mosaic-dev/bus/bus.sqlite --held)
|
||||
{
|
||||
"schema": "3m",
|
||||
"tables": {
|
||||
"decision_events": {
|
||||
"rows": 22,
|
||||
"maxSeq": 22,
|
||||
"sha256": "b016d2a7cb0116252166016822c472af1cc520435a6538ecb7be5db62c6cb4b3"
|
||||
},
|
||||
"decisions": {
|
||||
"rows": 22,
|
||||
"maxSeq": 22,
|
||||
"sha256": "eafcd57d3531f7ac7c768e512632a3975df372c49ffd95abe7d858fd05ce93a8"
|
||||
},
|
||||
"deliveries": {
|
||||
"rows": 1935,
|
||||
"maxSeq": 1935,
|
||||
"sha256": "42f92c45a38f7b7fbeb8871dd78a4b963ad902c3fda93bd7c62ddb8881242c80"
|
||||
},
|
||||
"events": {
|
||||
"rows": 2200,
|
||||
"maxSeq": 2200,
|
||||
"sha256": "e7e46574bd7b737dd283c67d2bf6c3918b888c6de4cacd42a60f1f0e78a1b9a7"
|
||||
},
|
||||
"gitea_grants": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"gitea_users": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"host_grants": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"hosts": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"instance_names": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"message_threads": {
|
||||
"rows": 10,
|
||||
"maxSeq": null
|
||||
},
|
||||
"messages": {
|
||||
"rows": 635,
|
||||
"maxSeq": 635
|
||||
},
|
||||
"meta": {
|
||||
"rows": 3,
|
||||
"maxSeq": null,
|
||||
"sha256": "e2dbed747bf81f25f6aa3f50c9a456110d536582be1933e79ddc35896658b218"
|
||||
},
|
||||
"projects": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "cdf87b72ef95a2f988c242d35f1050f9e3e310637f84a645b51694daa924650f"
|
||||
},
|
||||
"role_claims": {
|
||||
"rows": 115,
|
||||
"maxSeq": 115,
|
||||
"sha256": "6e16043dbdffa2c6b1c18b43151ecac01787a94ca77c74e60a4e66ae09e803ee"
|
||||
},
|
||||
"session_defaults": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "0fa4a532b106e963e200064d7f7464412a2fd6fce5a59a35ba7097d9bdca879c"
|
||||
},
|
||||
"sessions": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "7094392718785cbaec3d5e5bd640f4b36d1e2be1fb4b7c6a9db77308de111803"
|
||||
},
|
||||
"task_comment_cursors": {
|
||||
"rows": 666,
|
||||
"maxSeq": 666,
|
||||
"sha256": "827456a5efbac1c1ddc455867a7896c33a4073930f8bb7911182713d12fb8ce1"
|
||||
},
|
||||
"task_snapshots": {
|
||||
"rows": 577,
|
||||
"maxSeq": 577,
|
||||
"sha256": "99f2aefde907be0142d8e173276add60083eae75851c11e85e9fbdd30af73386"
|
||||
},
|
||||
"thread_claims": {
|
||||
"rows": 10,
|
||||
"maxSeq": 10,
|
||||
"sha256": "925e82e219ca7d469a3d9d72bd7033b9f52a47f1da272ac7ae31832a24cd1b91"
|
||||
},
|
||||
"thread_opens": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"thread_shares": {
|
||||
"rows": 0,
|
||||
"maxSeq": null,
|
||||
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
"threads": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "6cc7fbd14dd1d8164dbeab1e2c2911ca206c283e722724ee2b0b0a8e22e0f533"
|
||||
},
|
||||
"usage_records": {
|
||||
"rows": 104,
|
||||
"maxSeq": 104,
|
||||
"sha256": "12e30281ae16ee8536c7d4ccdff50f2c3da441504b5b17810bcb0031bcca36f3",
|
||||
"byRun": [
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r8fba7e598156",
|
||||
"input": "0",
|
||||
"output": "0",
|
||||
"unknownTurns": 1
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r4a96e2142e4d",
|
||||
"input": "2",
|
||||
"output": "52",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rc78c9700c8e9",
|
||||
"input": "14",
|
||||
"output": "1519",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r293f33bcbc63",
|
||||
"input": "2",
|
||||
"output": "44",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r34520a581318",
|
||||
"input": "6",
|
||||
"output": "323",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r7e99838f9f93",
|
||||
"input": "2",
|
||||
"output": "44",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rc964611b2092",
|
||||
"input": "4",
|
||||
"output": "120",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rbb708846b605",
|
||||
"input": "12",
|
||||
"output": "2089",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rc36b17ef3788",
|
||||
"input": "16",
|
||||
"output": "5221",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r097436c91816",
|
||||
"input": "16",
|
||||
"output": "3340",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r497f1c817d4d",
|
||||
"input": "2",
|
||||
"output": "80",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rc9e993da24cf",
|
||||
"input": "30",
|
||||
"output": "5871",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r7646a7a4a2bd",
|
||||
"input": "12",
|
||||
"output": "1448",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r4004e5e09433",
|
||||
"input": "2",
|
||||
"output": "61",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "rd0b8fdb4d62d",
|
||||
"input": "18",
|
||||
"output": "1714",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r62b31aae5852",
|
||||
"input": "2",
|
||||
"output": "31",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r2cf8536da2c3",
|
||||
"input": "12",
|
||||
"output": "1420",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "re6c69f1ec1f0",
|
||||
"input": "16",
|
||||
"output": "1471",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r2c62e02f8371",
|
||||
"input": "2",
|
||||
"output": "68",
|
||||
"unknownTurns": 0
|
||||
},
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"run": "r410293d04d3d",
|
||||
"input": "10",
|
||||
"output": "1105",
|
||||
"unknownTurns": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"untimed": [
|
||||
"gitea_grants",
|
||||
"gitea_users",
|
||||
"host_grants",
|
||||
"hosts",
|
||||
"message_threads",
|
||||
"meta",
|
||||
"task_comment_cursors"
|
||||
]
|
||||
}
|
||||
# exit 0, end 2026-10-23T03:44:08.335Z
|
||||
# S1.json sha256 7e4d46f9bc094ae10f1c76dfaee54407068bf99f52f8e465f36bc0bbcd961e68
|
||||
|
||||
## W1 tester thread reads (tr.sh W1)
|
||||
W1 threads --tester: 5 thread(s), threads.json sha256 07c154d75d929028
|
||||
W1 thread d0ba7a66-aa3f-4918-9518-94132bce6b28 messages 2 sha256 985ac61ca9220f2f
|
||||
W1 thread 446201de-e8b5-4df3-9356-d0d5422cc899 messages 2 sha256 7e7e9eeeaa8c1e09
|
||||
W1 thread b89fcca4-6b82-48bd-9310-fb82c5ae8518 messages 2 sha256 f4e4916b9656a403
|
||||
W1 thread d9bb7ff3-7a8b-4bb8-ba12-03ca094cee4e messages 2 sha256 728ff36f3e003c63
|
||||
W1 thread b85a57fe-84f9-4785-a596-135af39e334a messages 2 sha256 727de0d9c809a41a
|
||||
# exit 0
|
||||
# W1 D3: /home/jwoltje/.mosaic-dev/backups/d3-20261023T034412Z, STAMP 2026-10-23T03:44:12.165Z, SHA256SUMS sha256 eda5be89461d50c49cc3c2f32a03f49d3cd6d3848371e9de2eed183cec7cb74d, members 91652 tar exit 0 sessions.json sessionsVersion 2
|
||||
|
||||
## W2 status
|
||||
# start 2026-10-23T03:44:32.643Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh status mosaic-stack)
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","business":"mosaic-stack","pm":true,"claude":"/home/jwoltje/.local/bin/claude","console":["--port","7332","--public-host","mosaic.woltje.com","--auth-header","X-authentik-username","--allow-user","jason.woltje","--tester-socket"],"schema":"3m","activation":"20261022T201621Z-0cbe2e9b35e5","at":"2026-10-22T20:16:24Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-22T04:03:00Z","op":"activate","from":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","to":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","backup":"20261022T040256Z-86f95bb27f6c","activation":"20261022T040256Z-86f95bb27f6c","result":"ok"}
|
||||
{"at":"2026-10-22T15:05:55Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":null,"activation":"20261022T150555Z-84f53540dd0d","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T15:06:00Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":"20261022T150555Z-84f53540dd0d","activation":"20261022T150555Z-84f53540dd0d","result":"ok"}
|
||||
{"at":"2026-10-22T20:16:21Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":null,"activation":"20261022T201621Z-0cbe2e9b35e5","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T20:16:24Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":"20261022T201621Z-0cbe2e9b35e5","activation":"20261022T201621Z-0cbe2e9b35e5","result":"ok"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 1791120, running, since 2026-10-22T20:16:23.031Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 1791164
|
||||
boot: organization file loaded at 2026-10-22T20:16:23.030Z
|
||||
unit flags: match the pointer
|
||||
drift: 94 commit(s) on refactor since the pointer's copy
|
||||
# exit 0, end 2026-10-23T03:44:32.916Z
|
||||
|
||||
## W3 activate NEW --pm --migrate --tester-socket --plan
|
||||
# start 2026-10-23T03:44:32.918Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh activate 464010fbe4c6925b077b9b8182a209ee2177eb9d mosaic-stack --pm --migrate --tester-socket --plan)
|
||||
plan: activate for mosaic-stack
|
||||
from: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
to: 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
store schema: 3m (read from the store the running bus holds)
|
||||
target schema: 3n
|
||||
migration: 3m to 3n, after a backup of the stopped store
|
||||
migration steps: 3m to 3n
|
||||
needs: --migrate (given)
|
||||
needs: Jason present for this run (decision 96 condition 2)
|
||||
backup: the run backs up the stopped store to /home/jwoltje/.mosaic-dev/backups/stack/<activation>/ before any migration
|
||||
commits: the run adds 94 (newest first, at most 200):
|
||||
464010fbe queue: revs 3435-3436. Row 294 (#1800): Duckworth APPROVE c30998 (3435, candidate 0b3f9c9d). Row 272 (#1777): Scrooge CHANGES c31006 (3436, candidate 0c3dc2ed); queue only
|
||||
e57bfde73 queue: revs 3407-3434. Row 293 (574, #1805): Gander in-review r1 (3407, failed pre-send 3408), Sage request c30981 (3409/3410), Filbert APPROVE c30982 (3411). Row 292 (#1797): assigned gizmoduck (mos-1387), claim 3413, in-review r1 3419 (3420 failed), Sage request c30992 (3425/3426), Duckworth APPROVE c30975 (3433). Row 294 (#1800): Launchpad claim 3418, in-review r1 3422 (3423 failed), Sage request c30993 (3427/3428). Row 295 (#1801): Morgana claim 3414, in-review r1 3416 (3417 failed), Sage request c30991 resolved (3421/3424), Dewey CHANGES c30994 (3431). Row 272 (#1777): Huey claim 3415, in-review r1 3429 (3430 failed), Sage request c30997 resolved (3432/3434); queue only
|
||||
319d9f87e sessions: Filbert row 293 (Vikunja 574) APPROVE c30982 rev 3411, plus re-added S0 re-check and 574 static review lines; docs only
|
||||
b23783f39 Rows 270+271 landing (7328da8ca), 571 landing, MVP rows 293-299: BUILD-LOG phase line and Sage SESSIONS line; docs only
|
||||
e18ad2711 docs: define mixed-format chapter ordering for conversion
|
||||
12f8c3089 queue: rows 293-299 briefed (revs 3399, 3401-3406, sage) and row 293 claimed by gander (rev 3400, gander-293-start); queue only
|
||||
253346e3c queue: rows 293-299 added (574 #1805, FED R6 #1800, FED R4 #1801, FED R7 #1802, GitHub grant method #1803, Q228 #1804, 573 #1806; mos-1371/1372), 208 after 294; 270 round 3 request c30929 and Duckworth APPROVE c30930; 270+271 done at 7328da8ca (mos-1351); queue only
|
||||
7328da8ca gizmoduck: row 270 (264c, #1775) gate results: run 3 red on case1-accept P10 band (Vikunja 573) and run 4 red on the checkout.test fixture race (Vikunja 574), both old tests unchanged in the range; run 5 GREEN on 53406f3e4 under mos-1369 and sage-3106, all phases and 38/38 mutants killed; BUILD.md only
|
||||
84002f960 gizmoduck: row 270 (264c, #1775) gate run 2 second red, fixed under mos-1364 and sage-3093: compactions-budget.test F1 (:39 input 8.5 * MiB is a whole number, now MiB + 0.5) and F2 (the 0o000 window in try/finally; the after-hook ran after setup's rm); K M22 :129, M23 :120, M22 and M15 notes; BUILD.md run 2
|
||||
f89aaf57f gizmoduck: row 270 (264c, #1775) gate run 1 red placed (mos-1272): compactions-launch.test's host wires row 271's five clear ops, as session-clear.test does; the clear test's successor never started without them; kill lines +5 in mutants.py K; BUILD.md run 1
|
||||
d3a49f301 gizmoduck: rows 270+271 combined gate (C2) record before the first run (sage-3073, sage-3086, mos-1275, mos-1351): blob table, timeout table, GREEN and RED, order; code is ac44d0de9's
|
||||
562b05b43 gizmoduck: row 270 (264c, #1775) round 4 for sage-3073 and sage-3078: rows 270 and 271 rebased onto 25c09f19f (row 203 plus the O2 docs); mosaic-config.mjs keeps 203's federation key and both compaction keys; BUILD.md round 4 with the range-diff, the three merged files and C1 after 203; not run
|
||||
8c28ee731 gizmoduck: row 270 (264c, #1775) round 3 for duckworth-0226 B4 (sage-3038): one collection opens at most the system config's compactionStreams stream files in name order (default 1024, 32 to 65536, a bad value takes the default and logs), not-collected past it with no cursor for an unopened stream; the missing-stream check uses a Set; readStreams, cap and launcher tests; mutants M22-M24, M10 anchor moved; docs/TOOLS.md has both keys and C1 (N4); BUILD.md round 3 with stream counts, the 231 KB bound, C1 and N5; not run
|
||||
bce491715 gizmoduck: row 270 (264c, #1775) round 2 for duckworth-0223 B1-B3 (sage-3030, sage-3031, mos-1352, sage-3033): pi streams read in 1 MiB chunks under a budget from the system config's compactionReadBytes (default 64 MiB, 1 MiB to 1 GiB, a bad value takes the default and logs), not-collected past it; Claude history from before the ledger is harness-unsupported for good; launcher, runtime reader, clear and legacy tests; mutants M13-M21; BUILD.md round 2 with sizes, schema change, rollback hazard, N1-N3; not run
|
||||
01b57f48b gizmoduck: row 270 (264c, #1775) round 1 for review (sage-3024): mutants.py M1-M12 with anchors at 7d199f033, each matching once, kills read from the tests; run plan with broker.mjs reruns; launcher and runtime wiring named as untested; not run
|
||||
54ec0005e row 271 (264d, #1776): BUILD.md r3 gate on 9e18a9aaf (sage-3017): cli and bus session-clear.test whole green (5/5, 19/19), cli suite 874/874, M14 killed by the T6 test's first lines() assertion at :365; no first-run red. Doc only.
|
||||
61e262b7c row 271 (264d, #1776): r3 packet carries mutants.py, M1-M14 with their anchors, as the gate applies them (duckworth-0212 C1). Doc and harness only; no src or test change.
|
||||
540b6f16b row 271 (264d, #1776): r3, T6 per sage-3001. New cli test: a bus unavailable (broker-exited) at the exit proof, then at retirement, holds the clear with no retirement, successor launch or slot handed on, logs once, and resumes when the bus answers. BUILD.md maps the halt case to session-launch.test.mjs:372 and launcher.mjs:824, binds the Q198 hold to row 257 with duckworth-0210's carry, and names M14 (drop clearPass's try/catch) and its kill. No src change. Not run (no CLEAR).
|
||||
e6a675ee8 row 271 (264d, #1776): BUILD.md gate results on e8af389e6 (sage-2991): 18 touched files, bus/seat/cli suites and every test-*.sh green, M1-M13 killed by assertions in the named tests; the row gate's T6 coverage open to Sage. Doc only.
|
||||
e77635ceb row 271 (264d, #1776): BUILD.md run limits for the e567f949c gate (mos-1275, sage-2991); mutant lines moved one down past the B1 comment. Doc only.
|
||||
3fc8ccef1 row 271 (264d, #1776): duckworth-0201 B1: #ownerRefusal passes 'session.clear' to #granted, so the project and instance sit in their own slots and a live collaborator grant passes the retirement recheck. N4 setup shared; a second N4 test keeps the grant and expects retired plus the successor; M13 restores the defect. 264e carry noted at the N4 tests. Not run (no CLEAR).
|
||||
27d3266ff row 271 (264d, #1776): BUILD.md records mos-1336, Mos's approval under mos-1292 of the later3l, rows() and thread-shares migration test changes on the 3m to 3n rebase, with its conditions
|
||||
6bd67225b row 271 (264d, #1776): BUILD.md states the post-rebase '3m' grep result as measured
|
||||
14715d644 row 271 (264d, #1776): r2 on 0cbe2e9b3 (sage-2968): 3m to 3n migration and 3m engine tests from fixtures/schema-3m.sql; BUILD.md records the label change, the old-test changes (later3l, rows() and the thread-shares migration test outside the mos-1315 list, for Mos) and the mutant lines on the rebased tree
|
||||
f9a9c9b5a row 271 (264d, #1776): BUILD.md defines M1-M12 with their expected kills
|
||||
34388223d row 271 (264d, #1776): launcher uncertain-path test with test-driven ticks and a stopped runner; start() takes stopTimeoutMs
|
||||
3adb391b5 row 271 (264d, #1776): N4 failed-clear test on a user's thread with raw first rows; BUILD.md notes the failed path has no verb route yet
|
||||
4da907cd5 row 271 (264d, #1776): T4 tests round 1, not run (slot held). Bus session-clear.test.mjs (15), cli session-clear.test.mjs (3, bwrap) with clear-adapter.mjs; BUILD.md maps each T4 item and names what is still open (failed clear, launcher uncertain path, mutants)
|
||||
aa8fc490f row 271 (264d, #1776): clear context build round 1, not run (slot held). Broker: session.clear, session.cancel and session.operation, the fence on send/open/claim, cancel at arrival for routed messages, the drained receive and the end drain, trusted ops sessionClears and sessionClearExited/Uncertain/Retire/Start. Launcher: clearPass before the threads loop (stop, proof, retire, successor start through check()/start()), waiting on a live row 269 survivor. Old tests per mos-1315, rebased on row 206 (sage-2968): label 3m to 3n, future step 3n to 3o, 3m-3n.sql in the engine copies and file lists, ready lines, later3l and the rows() exclusions gain both tables as 206 did for thread_shares (mos-1292, approved in mos-1336), schema.test counts 25 tables and 96 triggers, COUNTED and T45 LISTED gain both tables after thread_shares (mos-1318, mos-1319), TESTER_VERBS pin (mos-1325), fixtures/schema-3m.sql
|
||||
a9884dc75 row 271 (264d, #1776): schema step 3m to 3n (rebased on row 206's 3l to 3m, sage-2968), session_ops and message_cancels with 7 triggers; successor id pinned as a lowercase version 8 UUID for Huey (gizmoduck-0274)
|
||||
25c2c1a56 gizmoduck: row 271 design: duckworth-0171 C1 (start stages keyed on a report counter, work attempt in its own column) and C2 (cancelled in the stage CHECK at attempt 0 and closing the op, claim and cancels untouched by a pre-retire cancel, post-retire successor reading stated, race and held tests); N1 grep at build
|
||||
4f827a5e8 gizmoduck: row 271 design: session.cancel and the cancelled stage built in 271 (sage-2828 re-rules Q3 per D7:263-264), pre- and post-retire paths, cancel tests and the fence-release mutant; N2 refuses session-name-too-long at accept
|
||||
7dc8ff1bf gizmoduck: row 271 design: T45 LISTED gains session_ops and message_cancels to match COUNTED (mos-1319)
|
||||
61df3061e gizmoduck: row 271 design: duckworth-0170 B1-B4 folded (cancel at arrival for routed messages, claim refused while clearing, op namespace both ways, attempt key on start stages) and N1-N8 answered; cancel recorded as a departure from D7:263-264
|
||||
b212182ed gizmoduck: row 271 design: both new tables join COUNTED in stack-release.sh, so T46 passes unchanged; schema.test count pins name the 2 tables and 7 triggers; T45 LISTED question to Mos (mos-1318)
|
||||
dac64ff31 gizmoduck: row 271 (264d) design draft 2: drained acknowledged by the run's own receive at a turn boundary (a landing turn has unread 0 with a child running), SIGTERM only after it; successor <old>-N bound at request with a deterministic id; no cancel (sage-2826); pre-existing test change list per mos-1315
|
||||
b329ad69f gizmoduck: row 271 (264d) design draft 1 in the packet: the threadIdle fence as the drain, the idle stop as the only signal, a session_ops journal and message_cancels in one schema step; Q1-Q4 for Sage and Mos
|
||||
8d4d4ec59 gizmoduck: row 270: the bus legacy test inserts its legacy thread by hand (sessions is append-only) and the test business has the assistant thread.create needs; not run
|
||||
5ddc36ca9 gizmoduck: row 270 (264c, #1775): completed Pi compactions counted into a host ledger beside the session store, keyed (entry id, timestamp) store-wide (sage-2806, sage-2814); launcher collects at run start and end under the workspace lock; session.list rows gain compactions through a runtime-injected reader; not run (slot held)
|
||||
f510d7367 gizmoduck: rows 270 and 271 packets: the 264c count and 264d clear contracts pinned for row 272 (Huey), and the Pi 0.85.1 compaction source contract
|
||||
767bb62c7 docs: close remote credential and private review access findings
|
||||
6345aae3d docs: align editor graph, Markdown transition and archive with PRD d6
|
||||
ee5f7b9ef docs: align O2 chapter conversion and Case 2 access with owner rulings
|
||||
0b923a275 MVP readiness briefs (mos-1371/1372): FED R6 #1800, FED R4 #1801, FED R7 #1802, GitHub grant method #1803, Q228 grant scope #1804, 574 #1805, 573 #1806; docs only
|
||||
b0a6838ca SESSIONS: Filbert Q195 O2 S0 review (#1798, c30914); doc only
|
||||
062646487 Q195 O2 W4 (#1799): log lines for the W4 design and review landing, row 203 and O2 landing; docs only
|
||||
66299eeef Q195 O2 W4 (#1799): Megavolt's round 4 review of 994c3f7fb (blob 2af460ab7): APPROVE, R3-B1 and R3-B2 closed, R4-N1 (re-migration after a pre-W4b restore) non-blocking for W4b; doc only
|
||||
569bb6b17 Q195 O2 W4 (#1799): Megavolt's round 3 review of 54246cb32 (blob 0c4f55826): CHANGES, R2-B1 projection and R2-B2 closed, R3-B1 (reserved notes keyed on negative IDs) and R3-B2 (fence initial state and confirmation scope undefined); doc only
|
||||
fb404c909 Q195 O2 W4 (#1799): Megavolt's round 2 review of 019a0ea5b (blob 14dfe92d9): CHANGES, B1-B9 and M1 closed, R2-B1 (paragraph-mark revisions, reserved-note leaves) and R2-B2 (release backup/restore keeps O2 text and revives revocations); doc only
|
||||
4c0a2c4fd Q195 O2 W4 (#1799): Megavolt's review of the DOCX citation design at 15e91538f (blob 662abdb7c): CHANGES, B1-B9 and M1 (Case 2 narrowing in O2-context turns goes to Mos/Jason); doc only
|
||||
2f06aad3f docs: define reserved notes and initial O2 restore fence
|
||||
6863d4c85 docs: specify O2 projection marks and restore revocation fence
|
||||
9ef5798ac docs: close W4 locator and access review gaps
|
||||
4897520c3 docs: define committed DOCX citation and access contract
|
||||
4ca270307 queue: revs 3360-3368. Row 203 (#1701): Sage brief re-pin to 8adfb261f (3360, Webby N2), Quackerjack claim, in-review r2 and outcome (3361-3363), Sage request as jarvis (3364-3365), Webby approve record (3366), Sage landing note and done (3367-3368).
|
||||
25c09f19f docs: name save-group settings and enforce adoption gates
|
||||
a6da8718c docs: fix O2 review gates, shipping and save semantics
|
||||
ee26cfbad docs: redesign Q195 for full WordCraft O2 editor
|
||||
a4da4e6df row 203: gate results on the rebased tip (c7b754d7b): stack-release 219/0, test-config 51/0, mutants 17/17, cli 895/0, ten scripts green with named skips; code tree unchanged from 7309260ae
|
||||
7309260ae row 203: gate record on the rebased tip (c7b754d7b): blob table and timeout table, written before the first run
|
||||
7c543fd4a row 203 FED R2: cases for missing self, peer id and label (webby-0191 B3)
|
||||
284d55cf2 row 203 FED R2: stack-release probe reads federation; a refusal case per federation check
|
||||
93a491d73 row 203 FED R2: federation key in the system config (#1701)
|
||||
c7b754d7b queue: revs 3339-3359. Row 292 (#1797, Gander) added and briefed (Sage, 3339-3340). Row 291: Gosalyn claim and in-review r1 (3341, 3344-3345), Sage request as jarvis (3353-3354), Webby approve record (3357). Row 207: Megavolt in-review (3342), Sage abandon and request as jarvis, resolved on c30841 (3347, 3349-3350), Duckworth approve record (3356), Sage landing note and done (3358-3359). Row 270: Gizmoduck claim and in-review r3 (3343, 3346), Sage abandon and request as jarvis (3348, 3351-3352), Duckworth approve record (3355).
|
||||
a94c95522 docs: row 207 landing records (SESSIONS, BUILD-LOG, Megavolt's lines), DEFERRED 207 N1 (duckworth-0230) and 270 N6 bound to row 272 (duckworth-0228)
|
||||
c4f77373f row 207 (#1705): BUILD.md Runs records the gate on 712f79c0a (sage-3041): access.test 31/31, M1-M8 killed on their named tests, cli 894/894, ten scripts green under the mos-1275 limits, and the stopped first run's kill-check correction; doc only
|
||||
c7e77202d row 207 (#1705): BUILD.md records sage-2810 (Q1 no reload, cited to broker.mjs:384; Q2 refuse with user-has-grants) and the usage/help pin sweep: access.test.mjs is the only reader, no hash pin; doc only
|
||||
a0094633f row 207 (#1705): access.test.mjs T1-T9 for user add|remove; BUILD.md pins M7/M8 as edits and records the row 275 path check (bus only, morgana/row275 empty); not yet run, waits for Sage's CLEAR (sage-2790)
|
||||
721268b08 row 207 (#1705): mosaic access user add|remove on R5's path (proof, lock, revision, checkAccess, receipt user.add/user.remove); remove refuses user-has-grants; --level viewer already in R5; BUILD.md records Q1-Q5 (no access.reload, R4's) and the tests and mutants; tests held for the row 275 manifest check (sage-2790)
|
||||
f0e3dcdf4 plans: brief for the config_checks follow-up (row 270 rollback hazard, duckworth-0226, sage-3038)
|
||||
01983cd3f queue: rev 3338. Row 224 waits on row 216 (Sage, mos-1351: della/row224 carries row 216's commit 4f3fbc25a).
|
||||
626c19e78 queue: revs 3325-3337. Row 271: Gizmoduck claim and in-review r3 (3325-3327), Sage review request as jarvis (3328-3329), Duckworth approve record (3330). Row 276: Gander in-review r1 (3331-3332), Sage review request as jarvis (3333-3334), Duckworth approve record (3335), Sage landing note and done (3336-3337).
|
||||
f32b867f3 docs(row276): record green run5 gate and all seventeen assertion kills
|
||||
826e8fd7f docs(row276): refresh mos-1350 baseline cleanup packet and limits
|
||||
e06130fc0 test(case): require baseline session cleanup per mos-1350 review
|
||||
466562ba0 docs(row276): pin mos-1350 baseline candidate and timing audit
|
||||
931fab079 perf(case): remove duplicate head validation per mos-1350
|
||||
135bb8fae test(case): isolate P10 timing with per-mode baseline per mos-1350
|
||||
cf228eabc docs(row276): record run4 stop and mos-1349 timing pairs
|
||||
41f8bd197 docs(row276): packet stdout spool and M17 per mos-1345
|
||||
47906e4fd fix(case): isolate legacy stdout after outer timeout per mos-1345
|
||||
c2b845c76 docs(row276): preserve run3 whole-file stop for placement
|
||||
74635fc60 fix(row276): correct multi-file driver path per mos-1337 review
|
||||
257003ba1 test(row276): record mos-1337 N5 delta and both-copy mutant
|
||||
537ce2dd4 fix(case): silence vanished stat opens per mos-1337 N5
|
||||
3b9042802 docs(row276): record run2 stop for Mos placement
|
||||
859ae3708 docs(row276): void setup-red run and pin first fixture correction
|
||||
88179d6de test(row276): define read helper for new legacy fixtures
|
||||
ccfa17eef docs(row276): integrate schema3m base and record dependency drift
|
||||
b5d9efa1b docs(row276): pin integration on 94c33a43c and preserve upstream docs
|
||||
69979bb8a docs(row276): record static approval and upstream deferred drift
|
||||
155f64322 docs(row276): pin supervised-call candidate and fifteen mutants
|
||||
b96b4e303 fix(case1): supervise legacy user calls across sudo sessions
|
||||
f2735bb6a queue: revs 3317-3324. Row 206: Launchpad claim and in-review (3317-3319), Sage review request (3320-3321), Duckworth approve record (3322), Sage landing note and done (3323-3324).
|
||||
bus: scripts/bus-service.sh install --copy 464010fbe4c6925b077b9b8182a209ee2177eb9d --copies /home/jwoltje/.local/share/mosaic-stack/copies --pm --claude /home/jwoltje/.local/bin/claude
|
||||
proof: off
|
||||
send: off
|
||||
Console: scripts/webui-service.sh install --copy 464010fbe4c6925b077b9b8182a209ee2177eb9d --copies /home/jwoltje/.local/share/mosaic-stack/copies --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket
|
||||
CLI: scripts/stack-copy.sh wrapper 464010fbe4c6925b077b9b8182a209ee2177eb9d --copies /home/jwoltje/.local/share/mosaic-stack/copies --bin /home/jwoltje/.npm-global/bin
|
||||
interpreter: {"path":"/usr/bin/python3.14","version":[3,14,6],"dev":66308,"ino":3968163,"sha256":"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc"}
|
||||
# exit 0, end 2026-10-23T03:44:33.188Z
|
||||
# W3-plan.txt sha256 229888d8d03a3be1a46ad505ed50f85c435aec580a161cbb2e7bceba03ae866b
|
||||
# W3 commit list lines left out of the flag checks: 94
|
||||
# W3 plan checks: OLD to NEW, 3m to 3n in one step, 94 commits, needs --migrate (given) and the decision 96 line, backup line, Console line OLD's flags exactly, proof off, send off, no drop/sso/send/proof, bus --pm: PASS
|
||||
|
||||
## W4 bus unit (Environment omitted from the transcript)
|
||||
# start 2026-10-23T03:44:33.206Z
|
||||
# command: (cd $REPO && <clean env> systemctl --user show [email protected] -p ExecStart -p WorkingDirectory -p DropInPaths)
|
||||
DropInPaths=
|
||||
ExecStart={ path=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/scripts/mosaic ; argv[]=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/scripts/mosaic bus start mosaic-stack --pm ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }
|
||||
WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
# exit 0, end 2026-10-23T03:44:33.212Z
|
||||
|
||||
## W4 webui unit
|
||||
# start 2026-10-23T03:44:33.214Z
|
||||
# command: (cd $REPO && <clean env> systemctl --user show mosaic-webui.service -p ExecStart -p WorkingDirectory -p DropInPaths)
|
||||
DropInPaths=
|
||||
ExecStart={ path=/usr/bin/node ; argv[]=/usr/bin/node /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/packages/webui/src/cli.mjs serve --checkout /mnt/storage/src/mosaic-stack --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }
|
||||
WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
# exit 0, end 2026-10-23T03:44:33.219Z
|
||||
# W4 checks: DropInPaths empty on both, both ExecStart name the OLD copy, bus has --pm, no quote or backslash in either ExecStart
|
||||
# W4 bus Environment: 2 assignments; quote or backslash: none (values not recorded)
|
||||
# W0b-W4 end 2026-10-23T03:44:33Z
|
||||
# W5 pre-read start 2026-10-23T03:45:42Z
|
||||
|
||||
## W5 pre agents --tester
|
||||
# start 2026-10-23T03:45:42.086Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic agents --business mosaic-stack --tester)
|
||||
chief r148e72c8895d claude-code since 2026-10-22T20:16:24.301Z
|
||||
# exit 0, end 2026-10-23T03:45:42.304Z
|
||||
|
||||
## W5 pre launches list
|
||||
# start 2026-10-23T03:45:42.307Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic launches list)
|
||||
r148e72c8895d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T20:16:24.291Z running
|
||||
# exit 0, end 2026-10-23T03:45:42.424Z
|
||||
# W5 pre-read PASS 2026-10-23T03:45:42Z: chief r148e72c8895d standing, not working; no pm, no other launch
|
||||
# W5 pre-read start 2026-10-23T03:45:57Z
|
||||
|
||||
## W5 pre agents --tester
|
||||
# start 2026-10-23T03:45:57.395Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic agents --business mosaic-stack --tester)
|
||||
chief r148e72c8895d claude-code since 2026-10-22T20:16:24.301Z
|
||||
# exit 0, end 2026-10-23T03:45:57.606Z
|
||||
|
||||
## W5 pre launches list
|
||||
# start 2026-10-23T03:45:57.610Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic launches list)
|
||||
r148e72c8895d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T20:16:24.291Z running
|
||||
# exit 0, end 2026-10-23T03:45:57.720Z
|
||||
# W5 pre-read PASS 2026-10-23T03:45:57Z: chief r148e72c8895d standing, not working; no pm, no other launch
|
||||
# W5 go mos-1404, start 2026-10-23T03:45:57Z
|
||||
# condition 3 recheck: tool blob 7a8c347b2be4, plan e664fa35, four scripts clean, pointer on OLD, P2 stubs and units PASS
|
||||
# W5 exit 0, W5.start 2026-10-23T03:45:57Z, end 2026-10-23T03:46:02Z
|
||||
# W5: activation 20261023T034557Z-464010fbe4c6, backup /home/jwoltje/.mosaic-dev/backups/stack/20261023T034557Z-464010fbe4c6, STAMP 2026-10-23T03:45:58.274Z, SCHEMA 3m, SHA256SUMS sha256 480f5e556d02d3f079c07782af204c0a41e44fb4633064e1d7c302e473be1390 (sums check OK)
|
||||
# W5 launched lines in the bus journal since W5.start: 1: launched chief: run r28dbbc5c6b4d, claude-code claude-opus-5-5
|
||||
|
||||
## W5 status
|
||||
# start 2026-10-23T03:46:02.315Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh status mosaic-stack)
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"464010fbe4c6925b077b9b8182a209ee2177eb9d","business":"mosaic-stack","pm":true,"claude":"/home/jwoltje/.local/bin/claude","console":["--port","7332","--public-host","mosaic.woltje.com","--auth-header","X-authentik-username","--allow-user","jason.woltje","--tester-socket"],"schema":"3n","activation":"20261023T034557Z-464010fbe4c6","at":"2026-10-23T03:46:02Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-22T15:06:00Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":"20261022T150555Z-84f53540dd0d","activation":"20261022T150555Z-84f53540dd0d","result":"ok"}
|
||||
{"at":"2026-10-22T20:16:21Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":null,"activation":"20261022T201621Z-0cbe2e9b35e5","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T20:16:24Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":"20261022T201621Z-0cbe2e9b35e5","activation":"20261022T201621Z-0cbe2e9b35e5","result":"ok"}
|
||||
{"at":"2026-10-23T03:45:57Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":null,"activation":"20261023T034557Z-464010fbe4c6","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-23T03:46:02Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":"20261023T034557Z-464010fbe4c6","activation":"20261023T034557Z-464010fbe4c6","result":"ok"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3811005, running, since 2026-10-23T03:45:59.548Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3811049
|
||||
boot: organization file loaded at 2026-10-23T03:45:59.547Z
|
||||
unit flags: match the pointer
|
||||
drift: 0 commit(s) on refactor since the pointer's copy
|
||||
# exit 0, end 2026-10-23T03:46:02.590Z
|
||||
# W5 status: pointer NEW, pm true, 3n, check pass, unit flags match. W5_PASS 2026-10-23T03:46:02Z
|
||||
|
||||
## W5 rollback --restore 20261023T034557Z-464010fbe4c6 --plan (read only)
|
||||
# start 2026-10-23T03:46:02.596Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh rollback mosaic-stack --restore 20261023T034557Z-464010fbe4c6 --plan)
|
||||
plan: rollback for mosaic-stack
|
||||
from: 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
to: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
store schema: 3n (read from the store the running bus holds)
|
||||
target schema: 3m
|
||||
restore: the store must go back to 3m; needs --restore 20261023T034557Z-464010fbe4c6
|
||||
commits: the run takes away 94 (newest first, at most 200):
|
||||
464010fbe queue: revs 3435-3436. Row 294 (#1800): Duckworth APPROVE c30998 (3435, candidate 0b3f9c9d). Row 272 (#1777): Scrooge CHANGES c31006 (3436, candidate 0c3dc2ed); queue only
|
||||
e57bfde73 queue: revs 3407-3434. Row 293 (574, #1805): Gander in-review r1 (3407, failed pre-send 3408), Sage request c30981 (3409/3410), Filbert APPROVE c30982 (3411). Row 292 (#1797): assigned gizmoduck (mos-1387), claim 3413, in-review r1 3419 (3420 failed), Sage request c30992 (3425/3426), Duckworth APPROVE c30975 (3433). Row 294 (#1800): Launchpad claim 3418, in-review r1 3422 (3423 failed), Sage request c30993 (3427/3428). Row 295 (#1801): Morgana claim 3414, in-review r1 3416 (3417 failed), Sage request c30991 resolved (3421/3424), Dewey CHANGES c30994 (3431). Row 272 (#1777): Huey claim 3415, in-review r1 3429 (3430 failed), Sage request c30997 resolved (3432/3434); queue only
|
||||
319d9f87e sessions: Filbert row 293 (Vikunja 574) APPROVE c30982 rev 3411, plus re-added S0 re-check and 574 static review lines; docs only
|
||||
b23783f39 Rows 270+271 landing (7328da8ca), 571 landing, MVP rows 293-299: BUILD-LOG phase line and Sage SESSIONS line; docs only
|
||||
e18ad2711 docs: define mixed-format chapter ordering for conversion
|
||||
12f8c3089 queue: rows 293-299 briefed (revs 3399, 3401-3406, sage) and row 293 claimed by gander (rev 3400, gander-293-start); queue only
|
||||
253346e3c queue: rows 293-299 added (574 #1805, FED R6 #1800, FED R4 #1801, FED R7 #1802, GitHub grant method #1803, Q228 #1804, 573 #1806; mos-1371/1372), 208 after 294; 270 round 3 request c30929 and Duckworth APPROVE c30930; 270+271 done at 7328da8ca (mos-1351); queue only
|
||||
7328da8ca gizmoduck: row 270 (264c, #1775) gate results: run 3 red on case1-accept P10 band (Vikunja 573) and run 4 red on the checkout.test fixture race (Vikunja 574), both old tests unchanged in the range; run 5 GREEN on 53406f3e4 under mos-1369 and sage-3106, all phases and 38/38 mutants killed; BUILD.md only
|
||||
84002f960 gizmoduck: row 270 (264c, #1775) gate run 2 second red, fixed under mos-1364 and sage-3093: compactions-budget.test F1 (:39 input 8.5 * MiB is a whole number, now MiB + 0.5) and F2 (the 0o000 window in try/finally; the after-hook ran after setup's rm); K M22 :129, M23 :120, M22 and M15 notes; BUILD.md run 2
|
||||
f89aaf57f gizmoduck: row 270 (264c, #1775) gate run 1 red placed (mos-1272): compactions-launch.test's host wires row 271's five clear ops, as session-clear.test does; the clear test's successor never started without them; kill lines +5 in mutants.py K; BUILD.md run 1
|
||||
d3a49f301 gizmoduck: rows 270+271 combined gate (C2) record before the first run (sage-3073, sage-3086, mos-1275, mos-1351): blob table, timeout table, GREEN and RED, order; code is ac44d0de9's
|
||||
562b05b43 gizmoduck: row 270 (264c, #1775) round 4 for sage-3073 and sage-3078: rows 270 and 271 rebased onto 25c09f19f (row 203 plus the O2 docs); mosaic-config.mjs keeps 203's federation key and both compaction keys; BUILD.md round 4 with the range-diff, the three merged files and C1 after 203; not run
|
||||
8c28ee731 gizmoduck: row 270 (264c, #1775) round 3 for duckworth-0226 B4 (sage-3038): one collection opens at most the system config's compactionStreams stream files in name order (default 1024, 32 to 65536, a bad value takes the default and logs), not-collected past it with no cursor for an unopened stream; the missing-stream check uses a Set; readStreams, cap and launcher tests; mutants M22-M24, M10 anchor moved; docs/TOOLS.md has both keys and C1 (N4); BUILD.md round 3 with stream counts, the 231 KB bound, C1 and N5; not run
|
||||
bce491715 gizmoduck: row 270 (264c, #1775) round 2 for duckworth-0223 B1-B3 (sage-3030, sage-3031, mos-1352, sage-3033): pi streams read in 1 MiB chunks under a budget from the system config's compactionReadBytes (default 64 MiB, 1 MiB to 1 GiB, a bad value takes the default and logs), not-collected past it; Claude history from before the ledger is harness-unsupported for good; launcher, runtime reader, clear and legacy tests; mutants M13-M21; BUILD.md round 2 with sizes, schema change, rollback hazard, N1-N3; not run
|
||||
01b57f48b gizmoduck: row 270 (264c, #1775) round 1 for review (sage-3024): mutants.py M1-M12 with anchors at 7d199f033, each matching once, kills read from the tests; run plan with broker.mjs reruns; launcher and runtime wiring named as untested; not run
|
||||
54ec0005e row 271 (264d, #1776): BUILD.md r3 gate on 9e18a9aaf (sage-3017): cli and bus session-clear.test whole green (5/5, 19/19), cli suite 874/874, M14 killed by the T6 test's first lines() assertion at :365; no first-run red. Doc only.
|
||||
61e262b7c row 271 (264d, #1776): r3 packet carries mutants.py, M1-M14 with their anchors, as the gate applies them (duckworth-0212 C1). Doc and harness only; no src or test change.
|
||||
540b6f16b row 271 (264d, #1776): r3, T6 per sage-3001. New cli test: a bus unavailable (broker-exited) at the exit proof, then at retirement, holds the clear with no retirement, successor launch or slot handed on, logs once, and resumes when the bus answers. BUILD.md maps the halt case to session-launch.test.mjs:372 and launcher.mjs:824, binds the Q198 hold to row 257 with duckworth-0210's carry, and names M14 (drop clearPass's try/catch) and its kill. No src change. Not run (no CLEAR).
|
||||
e6a675ee8 row 271 (264d, #1776): BUILD.md gate results on e8af389e6 (sage-2991): 18 touched files, bus/seat/cli suites and every test-*.sh green, M1-M13 killed by assertions in the named tests; the row gate's T6 coverage open to Sage. Doc only.
|
||||
e77635ceb row 271 (264d, #1776): BUILD.md run limits for the e567f949c gate (mos-1275, sage-2991); mutant lines moved one down past the B1 comment. Doc only.
|
||||
3fc8ccef1 row 271 (264d, #1776): duckworth-0201 B1: #ownerRefusal passes 'session.clear' to #granted, so the project and instance sit in their own slots and a live collaborator grant passes the retirement recheck. N4 setup shared; a second N4 test keeps the grant and expects retired plus the successor; M13 restores the defect. 264e carry noted at the N4 tests. Not run (no CLEAR).
|
||||
27d3266ff row 271 (264d, #1776): BUILD.md records mos-1336, Mos's approval under mos-1292 of the later3l, rows() and thread-shares migration test changes on the 3m to 3n rebase, with its conditions
|
||||
6bd67225b row 271 (264d, #1776): BUILD.md states the post-rebase '3m' grep result as measured
|
||||
14715d644 row 271 (264d, #1776): r2 on 0cbe2e9b3 (sage-2968): 3m to 3n migration and 3m engine tests from fixtures/schema-3m.sql; BUILD.md records the label change, the old-test changes (later3l, rows() and the thread-shares migration test outside the mos-1315 list, for Mos) and the mutant lines on the rebased tree
|
||||
f9a9c9b5a row 271 (264d, #1776): BUILD.md defines M1-M12 with their expected kills
|
||||
34388223d row 271 (264d, #1776): launcher uncertain-path test with test-driven ticks and a stopped runner; start() takes stopTimeoutMs
|
||||
3adb391b5 row 271 (264d, #1776): N4 failed-clear test on a user's thread with raw first rows; BUILD.md notes the failed path has no verb route yet
|
||||
4da907cd5 row 271 (264d, #1776): T4 tests round 1, not run (slot held). Bus session-clear.test.mjs (15), cli session-clear.test.mjs (3, bwrap) with clear-adapter.mjs; BUILD.md maps each T4 item and names what is still open (failed clear, launcher uncertain path, mutants)
|
||||
aa8fc490f row 271 (264d, #1776): clear context build round 1, not run (slot held). Broker: session.clear, session.cancel and session.operation, the fence on send/open/claim, cancel at arrival for routed messages, the drained receive and the end drain, trusted ops sessionClears and sessionClearExited/Uncertain/Retire/Start. Launcher: clearPass before the threads loop (stop, proof, retire, successor start through check()/start()), waiting on a live row 269 survivor. Old tests per mos-1315, rebased on row 206 (sage-2968): label 3m to 3n, future step 3n to 3o, 3m-3n.sql in the engine copies and file lists, ready lines, later3l and the rows() exclusions gain both tables as 206 did for thread_shares (mos-1292, approved in mos-1336), schema.test counts 25 tables and 96 triggers, COUNTED and T45 LISTED gain both tables after thread_shares (mos-1318, mos-1319), TESTER_VERBS pin (mos-1325), fixtures/schema-3m.sql
|
||||
a9884dc75 row 271 (264d, #1776): schema step 3m to 3n (rebased on row 206's 3l to 3m, sage-2968), session_ops and message_cancels with 7 triggers; successor id pinned as a lowercase version 8 UUID for Huey (gizmoduck-0274)
|
||||
25c2c1a56 gizmoduck: row 271 design: duckworth-0171 C1 (start stages keyed on a report counter, work attempt in its own column) and C2 (cancelled in the stage CHECK at attempt 0 and closing the op, claim and cancels untouched by a pre-retire cancel, post-retire successor reading stated, race and held tests); N1 grep at build
|
||||
4f827a5e8 gizmoduck: row 271 design: session.cancel and the cancelled stage built in 271 (sage-2828 re-rules Q3 per D7:263-264), pre- and post-retire paths, cancel tests and the fence-release mutant; N2 refuses session-name-too-long at accept
|
||||
7dc8ff1bf gizmoduck: row 271 design: T45 LISTED gains session_ops and message_cancels to match COUNTED (mos-1319)
|
||||
61df3061e gizmoduck: row 271 design: duckworth-0170 B1-B4 folded (cancel at arrival for routed messages, claim refused while clearing, op namespace both ways, attempt key on start stages) and N1-N8 answered; cancel recorded as a departure from D7:263-264
|
||||
b212182ed gizmoduck: row 271 design: both new tables join COUNTED in stack-release.sh, so T46 passes unchanged; schema.test count pins name the 2 tables and 7 triggers; T45 LISTED question to Mos (mos-1318)
|
||||
dac64ff31 gizmoduck: row 271 (264d) design draft 2: drained acknowledged by the run's own receive at a turn boundary (a landing turn has unread 0 with a child running), SIGTERM only after it; successor <old>-N bound at request with a deterministic id; no cancel (sage-2826); pre-existing test change list per mos-1315
|
||||
b329ad69f gizmoduck: row 271 (264d) design draft 1 in the packet: the threadIdle fence as the drain, the idle stop as the only signal, a session_ops journal and message_cancels in one schema step; Q1-Q4 for Sage and Mos
|
||||
8d4d4ec59 gizmoduck: row 270: the bus legacy test inserts its legacy thread by hand (sessions is append-only) and the test business has the assistant thread.create needs; not run
|
||||
5ddc36ca9 gizmoduck: row 270 (264c, #1775): completed Pi compactions counted into a host ledger beside the session store, keyed (entry id, timestamp) store-wide (sage-2806, sage-2814); launcher collects at run start and end under the workspace lock; session.list rows gain compactions through a runtime-injected reader; not run (slot held)
|
||||
f510d7367 gizmoduck: rows 270 and 271 packets: the 264c count and 264d clear contracts pinned for row 272 (Huey), and the Pi 0.85.1 compaction source contract
|
||||
767bb62c7 docs: close remote credential and private review access findings
|
||||
6345aae3d docs: align editor graph, Markdown transition and archive with PRD d6
|
||||
ee5f7b9ef docs: align O2 chapter conversion and Case 2 access with owner rulings
|
||||
0b923a275 MVP readiness briefs (mos-1371/1372): FED R6 #1800, FED R4 #1801, FED R7 #1802, GitHub grant method #1803, Q228 grant scope #1804, 574 #1805, 573 #1806; docs only
|
||||
b0a6838ca SESSIONS: Filbert Q195 O2 S0 review (#1798, c30914); doc only
|
||||
062646487 Q195 O2 W4 (#1799): log lines for the W4 design and review landing, row 203 and O2 landing; docs only
|
||||
66299eeef Q195 O2 W4 (#1799): Megavolt's round 4 review of 994c3f7fb (blob 2af460ab7): APPROVE, R3-B1 and R3-B2 closed, R4-N1 (re-migration after a pre-W4b restore) non-blocking for W4b; doc only
|
||||
569bb6b17 Q195 O2 W4 (#1799): Megavolt's round 3 review of 54246cb32 (blob 0c4f55826): CHANGES, R2-B1 projection and R2-B2 closed, R3-B1 (reserved notes keyed on negative IDs) and R3-B2 (fence initial state and confirmation scope undefined); doc only
|
||||
fb404c909 Q195 O2 W4 (#1799): Megavolt's round 2 review of 019a0ea5b (blob 14dfe92d9): CHANGES, B1-B9 and M1 closed, R2-B1 (paragraph-mark revisions, reserved-note leaves) and R2-B2 (release backup/restore keeps O2 text and revives revocations); doc only
|
||||
4c0a2c4fd Q195 O2 W4 (#1799): Megavolt's review of the DOCX citation design at 15e91538f (blob 662abdb7c): CHANGES, B1-B9 and M1 (Case 2 narrowing in O2-context turns goes to Mos/Jason); doc only
|
||||
2f06aad3f docs: define reserved notes and initial O2 restore fence
|
||||
6863d4c85 docs: specify O2 projection marks and restore revocation fence
|
||||
9ef5798ac docs: close W4 locator and access review gaps
|
||||
4897520c3 docs: define committed DOCX citation and access contract
|
||||
4ca270307 queue: revs 3360-3368. Row 203 (#1701): Sage brief re-pin to 8adfb261f (3360, Webby N2), Quackerjack claim, in-review r2 and outcome (3361-3363), Sage request as jarvis (3364-3365), Webby approve record (3366), Sage landing note and done (3367-3368).
|
||||
25c09f19f docs: name save-group settings and enforce adoption gates
|
||||
a6da8718c docs: fix O2 review gates, shipping and save semantics
|
||||
ee26cfbad docs: redesign Q195 for full WordCraft O2 editor
|
||||
a4da4e6df row 203: gate results on the rebased tip (c7b754d7b): stack-release 219/0, test-config 51/0, mutants 17/17, cli 895/0, ten scripts green with named skips; code tree unchanged from 7309260ae
|
||||
7309260ae row 203: gate record on the rebased tip (c7b754d7b): blob table and timeout table, written before the first run
|
||||
7c543fd4a row 203 FED R2: cases for missing self, peer id and label (webby-0191 B3)
|
||||
284d55cf2 row 203 FED R2: stack-release probe reads federation; a refusal case per federation check
|
||||
93a491d73 row 203 FED R2: federation key in the system config (#1701)
|
||||
c7b754d7b queue: revs 3339-3359. Row 292 (#1797, Gander) added and briefed (Sage, 3339-3340). Row 291: Gosalyn claim and in-review r1 (3341, 3344-3345), Sage request as jarvis (3353-3354), Webby approve record (3357). Row 207: Megavolt in-review (3342), Sage abandon and request as jarvis, resolved on c30841 (3347, 3349-3350), Duckworth approve record (3356), Sage landing note and done (3358-3359). Row 270: Gizmoduck claim and in-review r3 (3343, 3346), Sage abandon and request as jarvis (3348, 3351-3352), Duckworth approve record (3355).
|
||||
a94c95522 docs: row 207 landing records (SESSIONS, BUILD-LOG, Megavolt's lines), DEFERRED 207 N1 (duckworth-0230) and 270 N6 bound to row 272 (duckworth-0228)
|
||||
c4f77373f row 207 (#1705): BUILD.md Runs records the gate on 712f79c0a (sage-3041): access.test 31/31, M1-M8 killed on their named tests, cli 894/894, ten scripts green under the mos-1275 limits, and the stopped first run's kill-check correction; doc only
|
||||
c7e77202d row 207 (#1705): BUILD.md records sage-2810 (Q1 no reload, cited to broker.mjs:384; Q2 refuse with user-has-grants) and the usage/help pin sweep: access.test.mjs is the only reader, no hash pin; doc only
|
||||
a0094633f row 207 (#1705): access.test.mjs T1-T9 for user add|remove; BUILD.md pins M7/M8 as edits and records the row 275 path check (bus only, morgana/row275 empty); not yet run, waits for Sage's CLEAR (sage-2790)
|
||||
721268b08 row 207 (#1705): mosaic access user add|remove on R5's path (proof, lock, revision, checkAccess, receipt user.add/user.remove); remove refuses user-has-grants; --level viewer already in R5; BUILD.md records Q1-Q5 (no access.reload, R4's) and the tests and mutants; tests held for the row 275 manifest check (sage-2790)
|
||||
f0e3dcdf4 plans: brief for the config_checks follow-up (row 270 rollback hazard, duckworth-0226, sage-3038)
|
||||
01983cd3f queue: rev 3338. Row 224 waits on row 216 (Sage, mos-1351: della/row224 carries row 216's commit 4f3fbc25a).
|
||||
626c19e78 queue: revs 3325-3337. Row 271: Gizmoduck claim and in-review r3 (3325-3327), Sage review request as jarvis (3328-3329), Duckworth approve record (3330). Row 276: Gander in-review r1 (3331-3332), Sage review request as jarvis (3333-3334), Duckworth approve record (3335), Sage landing note and done (3336-3337).
|
||||
f32b867f3 docs(row276): record green run5 gate and all seventeen assertion kills
|
||||
826e8fd7f docs(row276): refresh mos-1350 baseline cleanup packet and limits
|
||||
e06130fc0 test(case): require baseline session cleanup per mos-1350 review
|
||||
466562ba0 docs(row276): pin mos-1350 baseline candidate and timing audit
|
||||
931fab079 perf(case): remove duplicate head validation per mos-1350
|
||||
135bb8fae test(case): isolate P10 timing with per-mode baseline per mos-1350
|
||||
cf228eabc docs(row276): record run4 stop and mos-1349 timing pairs
|
||||
41f8bd197 docs(row276): packet stdout spool and M17 per mos-1345
|
||||
47906e4fd fix(case): isolate legacy stdout after outer timeout per mos-1345
|
||||
c2b845c76 docs(row276): preserve run3 whole-file stop for placement
|
||||
74635fc60 fix(row276): correct multi-file driver path per mos-1337 review
|
||||
257003ba1 test(row276): record mos-1337 N5 delta and both-copy mutant
|
||||
537ce2dd4 fix(case): silence vanished stat opens per mos-1337 N5
|
||||
3b9042802 docs(row276): record run2 stop for Mos placement
|
||||
859ae3708 docs(row276): void setup-red run and pin first fixture correction
|
||||
88179d6de test(row276): define read helper for new legacy fixtures
|
||||
ccfa17eef docs(row276): integrate schema3m base and record dependency drift
|
||||
b5d9efa1b docs(row276): pin integration on 94c33a43c and preserve upstream docs
|
||||
69979bb8a docs(row276): record static approval and upstream deferred drift
|
||||
155f64322 docs(row276): pin supervised-call candidate and fifteen mutants
|
||||
b96b4e303 fix(case1): supervise legacy user calls across sudo sessions
|
||||
f2735bb6a queue: revs 3317-3324. Row 206: Launchpad claim and in-review (3317-3319), Sage review request (3320-3321), Duckworth approve record (3322), Sage landing note and done (3323-3324).
|
||||
bus: scripts/bus-service.sh install --copy 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 --copies /home/jwoltje/.local/share/mosaic-stack/copies --pm --claude /home/jwoltje/.local/bin/claude
|
||||
proof: off
|
||||
send: off
|
||||
Console: scripts/webui-service.sh install --copy 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 --copies /home/jwoltje/.local/share/mosaic-stack/copies --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket
|
||||
CLI: scripts/stack-copy.sh wrapper 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 --copies /home/jwoltje/.local/share/mosaic-stack/copies --bin /home/jwoltje/.npm-global/bin
|
||||
interpreter: {"path":"/usr/bin/python3.14","version":[3,14,6],"dev":66308,"ino":3968163,"sha256":"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc"}
|
||||
# exit 0, end 2026-10-23T03:46:02.897Z
|
||||
# W5 restore plan exit 0: restore: the store must go back to 3m; needs --restore 20261023T034557Z-464010fbe4c6
|
||||
# W6 start 2026-10-23T03:46:51Z
|
||||
|
||||
## W6 status
|
||||
# start 2026-10-23T03:46:51.686Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh status mosaic-stack)
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"464010fbe4c6925b077b9b8182a209ee2177eb9d","business":"mosaic-stack","pm":true,"claude":"/home/jwoltje/.local/bin/claude","console":["--port","7332","--public-host","mosaic.woltje.com","--auth-header","X-authentik-username","--allow-user","jason.woltje","--tester-socket"],"schema":"3n","activation":"20261023T034557Z-464010fbe4c6","at":"2026-10-23T03:46:02Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-22T15:06:00Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":"20261022T150555Z-84f53540dd0d","activation":"20261022T150555Z-84f53540dd0d","result":"ok"}
|
||||
{"at":"2026-10-22T20:16:21Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":null,"activation":"20261022T201621Z-0cbe2e9b35e5","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T20:16:24Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":"20261022T201621Z-0cbe2e9b35e5","activation":"20261022T201621Z-0cbe2e9b35e5","result":"ok"}
|
||||
{"at":"2026-10-23T03:45:57Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":null,"activation":"20261023T034557Z-464010fbe4c6","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-23T03:46:02Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":"20261023T034557Z-464010fbe4c6","activation":"20261023T034557Z-464010fbe4c6","result":"ok"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3811005, running, since 2026-10-23T03:45:59.548Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3811049
|
||||
boot: organization file loaded at 2026-10-23T03:45:59.547Z
|
||||
unit flags: match the pointer
|
||||
drift: 0 commit(s) on refactor since the pointer's copy
|
||||
# exit 0, end 2026-10-23T03:46:51.968Z
|
||||
# W6 status: "copy":"464010fbe4c6925b077b9b8182a209ee2177eb9d" "pm":true "schema":"3n"
|
||||
|
||||
## W6 live store count (python3 -B, mode=ro)
|
||||
types table=26 trigger=97 view=5 index=28
|
||||
schema_version 3n
|
||||
missing none
|
||||
new_table_rows session_ops=0 message_cancels=0 thread_shares 0
|
||||
events 2202 maxSeq 2202
|
||||
COUNTS_OK
|
||||
# exit 0
|
||||
|
||||
## W6 agents --tester
|
||||
# start 2026-10-23T03:46:52.031Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic agents --business mosaic-stack --tester)
|
||||
chief r28dbbc5c6b4d claude-code since 2026-10-23T03:46:01.235Z
|
||||
# exit 0, end 2026-10-23T03:46:52.240Z
|
||||
# W6 agents: chief r28dbbc5c6b4d claude-code since 2026-10-23T03:46:01.235Z;
|
||||
|
||||
## W6 tester thread reads (tr.sh W6)
|
||||
W6 threads --tester: 5 thread(s), threads.json sha256 07c154d75d929028
|
||||
W6 thread d0ba7a66-aa3f-4918-9518-94132bce6b28 messages 2 sha256 985ac61ca9220f2f
|
||||
W6 thread 446201de-e8b5-4df3-9356-d0d5422cc899 messages 2 sha256 7e7e9eeeaa8c1e09
|
||||
W6 thread b89fcca4-6b82-48bd-9310-fb82c5ae8518 messages 2 sha256 f4e4916b9656a403
|
||||
W6 thread d9bb7ff3-7a8b-4bb8-ba12-03ca094cee4e messages 2 sha256 728ff36f3e003c63
|
||||
W6 thread b85a57fe-84f9-4785-a596-135af39e334a messages 2 sha256 727de0d9c809a41a
|
||||
# exit 0
|
||||
# W6 thread reads match W1: 5 threads, same ids, message counts and sha256
|
||||
# W6 bus-host/sessions.json: sessionsVersion and session count: 2 1; mtime 2026-10-23T03:46:01Z
|
||||
# W6_PASS 2026-10-23T03:46:56Z
|
||||
# W9 after W5, W5.start 2026-10-23T03:45:57Z, start 2026-10-23T03:47:16Z
|
||||
# plan e664fa35, tool blob 7a8c347b2be4, console-check.sh d068fe02, wrapper on NEW: checked
|
||||
|
||||
## W9 Console unit (mos-1338 item 4)
|
||||
is-active active, MainPID 3811007
|
||||
ExecMainStartTimestamp Thu 2026-10-22 22:45:59 CDT (2026-10-23T03:45:59Z), ps lstart Thu Oct 22 22:45:58 2026
|
||||
cwd -> /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
# Console: unit active, pid 3811007, started 2026-10-23T03:45:59Z, cwd /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
# bus: unit active, pid 3811005, cwd /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
|
||||
## W9 status
|
||||
# start 2026-10-23T03:47:16.472Z
|
||||
# command: (cd $REPO && <clean env> /mnt/storage/src/mosaic-stack/scripts/stack-release.sh status mosaic-stack)
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"464010fbe4c6925b077b9b8182a209ee2177eb9d","business":"mosaic-stack","pm":true,"claude":"/home/jwoltje/.local/bin/claude","console":["--port","7332","--public-host","mosaic.woltje.com","--auth-header","X-authentik-username","--allow-user","jason.woltje","--tester-socket"],"schema":"3n","activation":"20261023T034557Z-464010fbe4c6","at":"2026-10-23T03:46:02Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-22T15:06:00Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":"20261022T150555Z-84f53540dd0d","activation":"20261022T150555Z-84f53540dd0d","result":"ok"}
|
||||
{"at":"2026-10-22T20:16:21Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":null,"activation":"20261022T201621Z-0cbe2e9b35e5","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T20:16:24Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":"20261022T201621Z-0cbe2e9b35e5","activation":"20261022T201621Z-0cbe2e9b35e5","result":"ok"}
|
||||
{"at":"2026-10-23T03:45:57Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":null,"activation":"20261023T034557Z-464010fbe4c6","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-23T03:46:02Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":"20261023T034557Z-464010fbe4c6","activation":"20261023T034557Z-464010fbe4c6","result":"ok"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3811005, running, since 2026-10-23T03:45:59.548Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3811049
|
||||
boot: organization file loaded at 2026-10-23T03:45:59.547Z
|
||||
unit flags: match the pointer
|
||||
drift: 0 commit(s) on refactor since the pointer's copy
|
||||
# exit 0, end 2026-10-23T03:47:16.746Z
|
||||
|
||||
## W9 console-check NEW (/mnt/storage/src/mosaic-stack/agents/sage/work/window-plan/repin-de352dfaf/console-check.sh, d068fe02)
|
||||
# start 2026-10-23T03:47:16.752Z
|
||||
# command: (cd $REPO && <clean env> bash /mnt/storage/src/mosaic-stack/agents/sage/work/window-plan/repin-de352dfaf/console-check.sh 464010fbe4c6925b077b9b8182a209ee2177eb9d)
|
||||
PASS markdown-preview.js is served and equals the copy's
|
||||
PASS /api/config on loopback: send=false edit=false
|
||||
PASS project.files through the Console: head=ae0b17c9586e51da7bc1b7e548c6acf913a55665 files=2 spec=true error=none
|
||||
PASS project.file spec/north-star.md through the Console: commit=ae0b17c9586e51da7bc1b7e548c6acf913a55665 length=99 error=none
|
||||
PASS loopback save refused: HTTP 403 error=read-only sent=false
|
||||
CONSOLE_PASS
|
||||
# exit 0, end 2026-10-23T03:47:17.019Z
|
||||
|
||||
## W9 webui journal since 2026-10-23 03:45:57 UTC: 'Proxy: proxy proof off' and 'Sign-in:' counts
|
||||
proxy proof off 1, Sign-in 0
|
||||
# journal since W5: proxy proof off 1, Sign-in 0
|
||||
|
||||
## W9 tester socket
|
||||
console/ drwx------ jwoltje directory
|
||||
tester.sock srw------- jwoltje socket
|
||||
# console/ drwx------ jwoltje directory; tester.sock srw------- jwoltje socket
|
||||
|
||||
## W9 peercred-starts.jsonl lines since W5 naming NEW
|
||||
1 (file lines 5)
|
||||
# peercred-starts lines since W5 naming NEW: 1
|
||||
|
||||
## W9 bus journal 'library:' lines since W5
|
||||
library: 0
|
||||
# bus journal library: 0
|
||||
|
||||
## W9 launches list
|
||||
# start 2026-10-23T03:47:17.086Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic launches list)
|
||||
r28dbbc5c6b4d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-23T03:46:01.221Z running
|
||||
# exit 0, end 2026-10-23T03:47:17.196Z
|
||||
|
||||
## W9 launches list --json
|
||||
# start 2026-10-23T03:47:17.198Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic launches list --json)
|
||||
[
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"instance": "chief",
|
||||
"run": "r28dbbc5c6b4d",
|
||||
"launchedBy": "jason",
|
||||
"harness": "claude-code",
|
||||
"model": "claude-opus-5-5",
|
||||
"provider": "anthropic",
|
||||
"modelKey": "opus",
|
||||
"pid": 3811352,
|
||||
"startTime": "82835140",
|
||||
"runnerPid": 3811353,
|
||||
"runnerStartTime": "82835140",
|
||||
"runDir": "/home/jwoltje/.mosaic-dev/launches/mosaic-stack/r28dbbc5c6b4d",
|
||||
"startedAt": "2026-10-23T03:46:01.221Z",
|
||||
"live": true
|
||||
}
|
||||
]
|
||||
# exit 0, end 2026-10-23T03:47:17.310Z
|
||||
# one running chief from this start: run r28dbbc5c6b4d
|
||||
# pm: no pm launch is listed, as expected (none live since the last window; mos-1344)
|
||||
|
||||
## W9 agents --tester
|
||||
# start 2026-10-23T03:47:17.340Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic agents --business mosaic-stack --tester)
|
||||
chief r28dbbc5c6b4d claude-code since 2026-10-23T03:46:01.235Z
|
||||
# exit 0, end 2026-10-23T03:47:17.551Z
|
||||
# W9 end 2026-10-23T03:47:17Z W9_CHECKS_PASS
|
||||
# W9b start 2026-10-23T03:47:25Z
|
||||
# before the relay: chief r28dbbc5c6b4d live, no pm
|
||||
|
||||
## W9b backup first (b0.sh 3n)
|
||||
B0 (3n) start 2026-10-23T03:47:25.189Z
|
||||
/home/jwoltje/.mosaic-dev/backups/b0-20261023T034725Z:
|
||||
total 24
|
||||
drwx------ 3 jwoltje jwoltje 4096 Oct 22 22:47 .
|
||||
drwx------ 16 jwoltje jwoltje 4096 Oct 22 22:47 ..
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 22:47 bus
|
||||
-rw------- 1 jwoltje jwoltje 37 Oct 22 22:47 CHECK
|
||||
-rw------- 1 jwoltje jwoltje 3 Oct 22 22:47 SCHEMA
|
||||
-rw------- 1 jwoltje jwoltje 77 Oct 22 22:47 SHA256SUMS
|
||||
|
||||
/home/jwoltje/.mosaic-dev/backups/b0-20261023T034725Z/bus:
|
||||
total 3032
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 22:47 .
|
||||
drwx------ 3 jwoltje jwoltje 4096 Oct 22 22:47 ..
|
||||
-rw------- 1 jwoltje jwoltje 3096576 Oct 22 22:47 bus.sqlite
|
||||
SHA256SUMS: 69702ac9a74ec7d52a7377565c1aa2a2db605fa1f5b9e9f6b38631df3acffebf bus.sqlite
|
||||
SCHEMA: 3n
|
||||
CHECK: ok events 2202 maxSeq 2202 schema 3n
|
||||
B0 path /home/jwoltje/.mosaic-dev/backups/b0-20261023T034725Z
|
||||
B0 SHA256SUMS sha256 0946b66ccde18f5be8d49ed9f15cccf09f73804abdf31b3ae9c108c6c9ee9272
|
||||
B0 end 2026-10-23T03:47:25.308Z B0_PASS
|
||||
# exit 0
|
||||
# backup /home/jwoltje/.mosaic-dev/backups/b0-20261023T034725Z, SHA256SUMS 0946b66ccde18f5be8d49ed9f15cccf09f73804abdf31b3ae9c108c6c9ee9272
|
||||
|
||||
## W9b talk chief --wait 300 --tester (relay to pm)
|
||||
# start 2026-10-23T03:47:25.313Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic talk chief [mos test] Please relay this to the pm: [mos test] read packages/tasks/requirements.json through your requirements read and reply with the PRD version and the number of ids. --wait 300 --business mosaic-stack --tester)
|
||||
sent c66b0184 to chief
|
||||
chief (RESULT, re c66b0184) 11e140fa:
|
||||
I passed your request to the pm in your own words (message 3479e027-0099-4ce8-a106-0b1115e00dd2), with your note that it's a test and authorizes nothing. You asked for the PRD version and the number of ids in packages/tasks/requirements.json, read through its requirements read.
|
||||
|
||||
No pm session was running when I sent it, so I launched one (run ra38826f3c6e2, claude-code, claude-opus-5-5). Nothing was refused. When the pm answers, I'll pass on what it says.
|
||||
# exit 0, end 2026-10-23T03:47:40.496Z
|
||||
|
||||
## W9b launches list
|
||||
# start 2026-10-23T03:47:40.615Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic launches list)
|
||||
r28dbbc5c6b4d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-23T03:46:01.221Z running
|
||||
ra38826f3c6e2 mosaic-stack/pm claude-code claude-opus-5-5 by chief since 2026-10-23T03:47:35.835Z running
|
||||
# exit 0, end 2026-10-23T03:47:40.731Z
|
||||
# pm run ra38826f3c6e2 (claude-code), launchedBy chief, startedAt 2026-10-23T03:47:35.835Z, pid 3831373, runner pid 3831374: left live by W9b
|
||||
# pm launched by chief after the relay: run ra38826f3c6e2 (claude-code), pid 3831373, runner pid 3831374
|
||||
# pid 3831373: argv entries naming NEW's copy 37, cwd names NEW's copy no
|
||||
# pid 3831374: argv entries naming NEW's copy 1, cwd names NEW's copy no
|
||||
# the pm runs from NEW's copy
|
||||
|
||||
## W9b pm read talk pm --wait 300 --tester
|
||||
# start 2026-10-23T03:47:40.822Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic talk pm [mos test] read packages/tasks/requirements.json through your requirements read and reply with one line: the version and the number of ids --wait 300 --business mosaic-stack --tester)
|
||||
sent a2d9eeb9 to pm
|
||||
pm (RESULT, re a2d9eeb9) 4500c1dd:
|
||||
Version 1.15, 85 ids (checked 10 seconds ago with list_requirements and against packages/tasks/requirements.json at 464010f).
|
||||
# exit 0, end 2026-10-23T03:47:51.812Z
|
||||
# pm read: 1.15 and 85 found in the reply
|
||||
# W9b end 2026-10-23T03:47:51Z W9B_PASS
|
||||
# W10 start 2026-10-23T03:48:46Z, TMPDIR /mnt/storage/scratch/tmp/gKMdQdA
|
||||
|
||||
## W10 matrix-new.txt vs matrix-old.txt (header lines differ by stamp)
|
||||
(diff exit 0)
|
||||
# matrix: a-g unchanged expected: FAIL=0
|
||||
|
||||
## W10 listeners on :7333
|
||||
count 0
|
||||
# listeners on 7333: 0
|
||||
|
||||
## W10 tester reads through /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d/packages/cli/src/tester-http.mjs
|
||||
/api/config 200 73 bytes sha256 e7ef9a40a725f356 keys ["board","tester","send","edit"] body {"board":"http://127.0.0.1:7331","tester":true,"send":false,"edit":false} (exit 0)
|
||||
/api/bus/agents 200 709 bytes sha256 bc90ef3c3ae1a464 keys ["rows","at"] agents 2 (exit 0)
|
||||
# tester /api/bus/agents 200, agents 2 (P6: agents 1; the hash moves with the at field)
|
||||
# tester /api/config line identical to tester-old.txt
|
||||
|
||||
## W10 P4 again
|
||||
# P4 2026-10-23T03:48:46Z
|
||||
DropInPaths=
|
||||
ExecStart={ path=/home/jwoltje/.local/bin/chisel ; argv[]=/home/jwoltje/.local/bin/chisel client --fingerprint ce+ISFvMAhuoCRDuc7riIf+hYz87TLHk/C9C/H8QsUg= --keepalive 25s --max-retry-interval 10s http://10.1.1.227:8080 R:0.0.0.0:7332:127.0.0.1:7332 ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }
|
||||
# exit 0
|
||||
# R: specs (1): R:0.0.0.0:7332:127.0.0.1:7332
|
||||
P4 PASS: one R: spec R:0.0.0.0:7332:127.0.0.1:7332, DropInPaths empty
|
||||
(p4 exit 0)
|
||||
|
||||
## W10 unsigned writes through the main port (no session, no proxy header; must be refused)
|
||||
POST /api/seen 401 error="sign-in required"
|
||||
POST /api/reply 401 error="sign-in required"
|
||||
POST /api/processing 401 error="sign-in required"
|
||||
tester POST /api/processing 403 error="read-only" sent=false (exit 2)
|
||||
# W10 end 2026-10-23T03:48:47Z FAIL=0
|
||||
@@ -0,0 +1,17 @@
|
||||
plan: activate for mosaic-stack
|
||||
from: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
to: 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
store schema: 3m (read from the store the running bus holds)
|
||||
target schema: 3n
|
||||
migration: 3m to 3n, after a backup of the stopped store
|
||||
migration steps: 3m to 3n
|
||||
needs: --migrate (given)
|
||||
needs: Jason present for this run (decision 96 condition 2)
|
||||
backup: the run backs up the stopped store to /home/jwoltje/.mosaic-dev/backups/stack/<activation>/ before any migration
|
||||
commits: the run adds 94 (newest first, at most 200):
|
||||
bus: scripts/bus-service.sh install --copy 464010fbe4c6925b077b9b8182a209ee2177eb9d --copies /home/jwoltje/.local/share/mosaic-stack/copies --pm --claude /home/jwoltje/.local/bin/claude
|
||||
proof: off
|
||||
send: off
|
||||
Console: scripts/webui-service.sh install --copy 464010fbe4c6925b077b9b8182a209ee2177eb9d --copies /home/jwoltje/.local/share/mosaic-stack/copies --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket
|
||||
CLI: scripts/stack-copy.sh wrapper 464010fbe4c6925b077b9b8182a209ee2177eb9d --copies /home/jwoltje/.local/share/mosaic-stack/copies --bin /home/jwoltje/.npm-global/bin
|
||||
interpreter: {"path":"/usr/bin/python3.14","version":[3,14,6],"dev":66308,"ino":3968163,"sha256":"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc"}
|
||||
@@ -0,0 +1,111 @@
|
||||
plan: activate for mosaic-stack
|
||||
from: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
to: 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
store schema: 3m (read from the store the running bus holds)
|
||||
target schema: 3n
|
||||
migration: 3m to 3n, after a backup of the stopped store
|
||||
migration steps: 3m to 3n
|
||||
needs: --migrate (given)
|
||||
needs: Jason present for this run (decision 96 condition 2)
|
||||
backup: the run backs up the stopped store to /home/jwoltje/.mosaic-dev/backups/stack/<activation>/ before any migration
|
||||
commits: the run adds 94 (newest first, at most 200):
|
||||
464010fbe queue: revs 3435-3436. Row 294 (#1800): Duckworth APPROVE c30998 (3435, candidate 0b3f9c9d). Row 272 (#1777): Scrooge CHANGES c31006 (3436, candidate 0c3dc2ed); queue only
|
||||
e57bfde73 queue: revs 3407-3434. Row 293 (574, #1805): Gander in-review r1 (3407, failed pre-send 3408), Sage request c30981 (3409/3410), Filbert APPROVE c30982 (3411). Row 292 (#1797): assigned gizmoduck (mos-1387), claim 3413, in-review r1 3419 (3420 failed), Sage request c30992 (3425/3426), Duckworth APPROVE c30975 (3433). Row 294 (#1800): Launchpad claim 3418, in-review r1 3422 (3423 failed), Sage request c30993 (3427/3428). Row 295 (#1801): Morgana claim 3414, in-review r1 3416 (3417 failed), Sage request c30991 resolved (3421/3424), Dewey CHANGES c30994 (3431). Row 272 (#1777): Huey claim 3415, in-review r1 3429 (3430 failed), Sage request c30997 resolved (3432/3434); queue only
|
||||
319d9f87e sessions: Filbert row 293 (Vikunja 574) APPROVE c30982 rev 3411, plus re-added S0 re-check and 574 static review lines; docs only
|
||||
b23783f39 Rows 270+271 landing (7328da8ca), 571 landing, MVP rows 293-299: BUILD-LOG phase line and Sage SESSIONS line; docs only
|
||||
e18ad2711 docs: define mixed-format chapter ordering for conversion
|
||||
12f8c3089 queue: rows 293-299 briefed (revs 3399, 3401-3406, sage) and row 293 claimed by gander (rev 3400, gander-293-start); queue only
|
||||
253346e3c queue: rows 293-299 added (574 #1805, FED R6 #1800, FED R4 #1801, FED R7 #1802, GitHub grant method #1803, Q228 #1804, 573 #1806; mos-1371/1372), 208 after 294; 270 round 3 request c30929 and Duckworth APPROVE c30930; 270+271 done at 7328da8ca (mos-1351); queue only
|
||||
7328da8ca gizmoduck: row 270 (264c, #1775) gate results: run 3 red on case1-accept P10 band (Vikunja 573) and run 4 red on the checkout.test fixture race (Vikunja 574), both old tests unchanged in the range; run 5 GREEN on 53406f3e4 under mos-1369 and sage-3106, all phases and 38/38 mutants killed; BUILD.md only
|
||||
84002f960 gizmoduck: row 270 (264c, #1775) gate run 2 second red, fixed under mos-1364 and sage-3093: compactions-budget.test F1 (:39 input 8.5 * MiB is a whole number, now MiB + 0.5) and F2 (the 0o000 window in try/finally; the after-hook ran after setup's rm); K M22 :129, M23 :120, M22 and M15 notes; BUILD.md run 2
|
||||
f89aaf57f gizmoduck: row 270 (264c, #1775) gate run 1 red placed (mos-1272): compactions-launch.test's host wires row 271's five clear ops, as session-clear.test does; the clear test's successor never started without them; kill lines +5 in mutants.py K; BUILD.md run 1
|
||||
d3a49f301 gizmoduck: rows 270+271 combined gate (C2) record before the first run (sage-3073, sage-3086, mos-1275, mos-1351): blob table, timeout table, GREEN and RED, order; code is ac44d0de9's
|
||||
562b05b43 gizmoduck: row 270 (264c, #1775) round 4 for sage-3073 and sage-3078: rows 270 and 271 rebased onto 25c09f19f (row 203 plus the O2 docs); mosaic-config.mjs keeps 203's federation key and both compaction keys; BUILD.md round 4 with the range-diff, the three merged files and C1 after 203; not run
|
||||
8c28ee731 gizmoduck: row 270 (264c, #1775) round 3 for duckworth-0226 B4 (sage-3038): one collection opens at most the system config's compactionStreams stream files in name order (default 1024, 32 to 65536, a bad value takes the default and logs), not-collected past it with no cursor for an unopened stream; the missing-stream check uses a Set; readStreams, cap and launcher tests; mutants M22-M24, M10 anchor moved; docs/TOOLS.md has both keys and C1 (N4); BUILD.md round 3 with stream counts, the 231 KB bound, C1 and N5; not run
|
||||
bce491715 gizmoduck: row 270 (264c, #1775) round 2 for duckworth-0223 B1-B3 (sage-3030, sage-3031, mos-1352, sage-3033): pi streams read in 1 MiB chunks under a budget from the system config's compactionReadBytes (default 64 MiB, 1 MiB to 1 GiB, a bad value takes the default and logs), not-collected past it; Claude history from before the ledger is harness-unsupported for good; launcher, runtime reader, clear and legacy tests; mutants M13-M21; BUILD.md round 2 with sizes, schema change, rollback hazard, N1-N3; not run
|
||||
01b57f48b gizmoduck: row 270 (264c, #1775) round 1 for review (sage-3024): mutants.py M1-M12 with anchors at 7d199f033, each matching once, kills read from the tests; run plan with broker.mjs reruns; launcher and runtime wiring named as untested; not run
|
||||
54ec0005e row 271 (264d, #1776): BUILD.md r3 gate on 9e18a9aaf (sage-3017): cli and bus session-clear.test whole green (5/5, 19/19), cli suite 874/874, M14 killed by the T6 test's first lines() assertion at :365; no first-run red. Doc only.
|
||||
61e262b7c row 271 (264d, #1776): r3 packet carries mutants.py, M1-M14 with their anchors, as the gate applies them (duckworth-0212 C1). Doc and harness only; no src or test change.
|
||||
540b6f16b row 271 (264d, #1776): r3, T6 per sage-3001. New cli test: a bus unavailable (broker-exited) at the exit proof, then at retirement, holds the clear with no retirement, successor launch or slot handed on, logs once, and resumes when the bus answers. BUILD.md maps the halt case to session-launch.test.mjs:372 and launcher.mjs:824, binds the Q198 hold to row 257 with duckworth-0210's carry, and names M14 (drop clearPass's try/catch) and its kill. No src change. Not run (no CLEAR).
|
||||
e6a675ee8 row 271 (264d, #1776): BUILD.md gate results on e8af389e6 (sage-2991): 18 touched files, bus/seat/cli suites and every test-*.sh green, M1-M13 killed by assertions in the named tests; the row gate's T6 coverage open to Sage. Doc only.
|
||||
e77635ceb row 271 (264d, #1776): BUILD.md run limits for the e567f949c gate (mos-1275, sage-2991); mutant lines moved one down past the B1 comment. Doc only.
|
||||
3fc8ccef1 row 271 (264d, #1776): duckworth-0201 B1: #ownerRefusal passes 'session.clear' to #granted, so the project and instance sit in their own slots and a live collaborator grant passes the retirement recheck. N4 setup shared; a second N4 test keeps the grant and expects retired plus the successor; M13 restores the defect. 264e carry noted at the N4 tests. Not run (no CLEAR).
|
||||
27d3266ff row 271 (264d, #1776): BUILD.md records mos-1336, Mos's approval under mos-1292 of the later3l, rows() and thread-shares migration test changes on the 3m to 3n rebase, with its conditions
|
||||
6bd67225b row 271 (264d, #1776): BUILD.md states the post-rebase '3m' grep result as measured
|
||||
14715d644 row 271 (264d, #1776): r2 on 0cbe2e9b3 (sage-2968): 3m to 3n migration and 3m engine tests from fixtures/schema-3m.sql; BUILD.md records the label change, the old-test changes (later3l, rows() and the thread-shares migration test outside the mos-1315 list, for Mos) and the mutant lines on the rebased tree
|
||||
f9a9c9b5a row 271 (264d, #1776): BUILD.md defines M1-M12 with their expected kills
|
||||
34388223d row 271 (264d, #1776): launcher uncertain-path test with test-driven ticks and a stopped runner; start() takes stopTimeoutMs
|
||||
3adb391b5 row 271 (264d, #1776): N4 failed-clear test on a user's thread with raw first rows; BUILD.md notes the failed path has no verb route yet
|
||||
4da907cd5 row 271 (264d, #1776): T4 tests round 1, not run (slot held). Bus session-clear.test.mjs (15), cli session-clear.test.mjs (3, bwrap) with clear-adapter.mjs; BUILD.md maps each T4 item and names what is still open (failed clear, launcher uncertain path, mutants)
|
||||
aa8fc490f row 271 (264d, #1776): clear context build round 1, not run (slot held). Broker: session.clear, session.cancel and session.operation, the fence on send/open/claim, cancel at arrival for routed messages, the drained receive and the end drain, trusted ops sessionClears and sessionClearExited/Uncertain/Retire/Start. Launcher: clearPass before the threads loop (stop, proof, retire, successor start through check()/start()), waiting on a live row 269 survivor. Old tests per mos-1315, rebased on row 206 (sage-2968): label 3m to 3n, future step 3n to 3o, 3m-3n.sql in the engine copies and file lists, ready lines, later3l and the rows() exclusions gain both tables as 206 did for thread_shares (mos-1292, approved in mos-1336), schema.test counts 25 tables and 96 triggers, COUNTED and T45 LISTED gain both tables after thread_shares (mos-1318, mos-1319), TESTER_VERBS pin (mos-1325), fixtures/schema-3m.sql
|
||||
a9884dc75 row 271 (264d, #1776): schema step 3m to 3n (rebased on row 206's 3l to 3m, sage-2968), session_ops and message_cancels with 7 triggers; successor id pinned as a lowercase version 8 UUID for Huey (gizmoduck-0274)
|
||||
25c2c1a56 gizmoduck: row 271 design: duckworth-0171 C1 (start stages keyed on a report counter, work attempt in its own column) and C2 (cancelled in the stage CHECK at attempt 0 and closing the op, claim and cancels untouched by a pre-retire cancel, post-retire successor reading stated, race and held tests); N1 grep at build
|
||||
4f827a5e8 gizmoduck: row 271 design: session.cancel and the cancelled stage built in 271 (sage-2828 re-rules Q3 per D7:263-264), pre- and post-retire paths, cancel tests and the fence-release mutant; N2 refuses session-name-too-long at accept
|
||||
7dc8ff1bf gizmoduck: row 271 design: T45 LISTED gains session_ops and message_cancels to match COUNTED (mos-1319)
|
||||
61df3061e gizmoduck: row 271 design: duckworth-0170 B1-B4 folded (cancel at arrival for routed messages, claim refused while clearing, op namespace both ways, attempt key on start stages) and N1-N8 answered; cancel recorded as a departure from D7:263-264
|
||||
b212182ed gizmoduck: row 271 design: both new tables join COUNTED in stack-release.sh, so T46 passes unchanged; schema.test count pins name the 2 tables and 7 triggers; T45 LISTED question to Mos (mos-1318)
|
||||
dac64ff31 gizmoduck: row 271 (264d) design draft 2: drained acknowledged by the run's own receive at a turn boundary (a landing turn has unread 0 with a child running), SIGTERM only after it; successor <old>-N bound at request with a deterministic id; no cancel (sage-2826); pre-existing test change list per mos-1315
|
||||
b329ad69f gizmoduck: row 271 (264d) design draft 1 in the packet: the threadIdle fence as the drain, the idle stop as the only signal, a session_ops journal and message_cancels in one schema step; Q1-Q4 for Sage and Mos
|
||||
8d4d4ec59 gizmoduck: row 270: the bus legacy test inserts its legacy thread by hand (sessions is append-only) and the test business has the assistant thread.create needs; not run
|
||||
5ddc36ca9 gizmoduck: row 270 (264c, #1775): completed Pi compactions counted into a host ledger beside the session store, keyed (entry id, timestamp) store-wide (sage-2806, sage-2814); launcher collects at run start and end under the workspace lock; session.list rows gain compactions through a runtime-injected reader; not run (slot held)
|
||||
f510d7367 gizmoduck: rows 270 and 271 packets: the 264c count and 264d clear contracts pinned for row 272 (Huey), and the Pi 0.85.1 compaction source contract
|
||||
767bb62c7 docs: close remote credential and private review access findings
|
||||
6345aae3d docs: align editor graph, Markdown transition and archive with PRD d6
|
||||
ee5f7b9ef docs: align O2 chapter conversion and Case 2 access with owner rulings
|
||||
0b923a275 MVP readiness briefs (mos-1371/1372): FED R6 #1800, FED R4 #1801, FED R7 #1802, GitHub grant method #1803, Q228 grant scope #1804, 574 #1805, 573 #1806; docs only
|
||||
b0a6838ca SESSIONS: Filbert Q195 O2 S0 review (#1798, c30914); doc only
|
||||
062646487 Q195 O2 W4 (#1799): log lines for the W4 design and review landing, row 203 and O2 landing; docs only
|
||||
66299eeef Q195 O2 W4 (#1799): Megavolt's round 4 review of 994c3f7fb (blob 2af460ab7): APPROVE, R3-B1 and R3-B2 closed, R4-N1 (re-migration after a pre-W4b restore) non-blocking for W4b; doc only
|
||||
569bb6b17 Q195 O2 W4 (#1799): Megavolt's round 3 review of 54246cb32 (blob 0c4f55826): CHANGES, R2-B1 projection and R2-B2 closed, R3-B1 (reserved notes keyed on negative IDs) and R3-B2 (fence initial state and confirmation scope undefined); doc only
|
||||
fb404c909 Q195 O2 W4 (#1799): Megavolt's round 2 review of 019a0ea5b (blob 14dfe92d9): CHANGES, B1-B9 and M1 closed, R2-B1 (paragraph-mark revisions, reserved-note leaves) and R2-B2 (release backup/restore keeps O2 text and revives revocations); doc only
|
||||
4c0a2c4fd Q195 O2 W4 (#1799): Megavolt's review of the DOCX citation design at 15e91538f (blob 662abdb7c): CHANGES, B1-B9 and M1 (Case 2 narrowing in O2-context turns goes to Mos/Jason); doc only
|
||||
2f06aad3f docs: define reserved notes and initial O2 restore fence
|
||||
6863d4c85 docs: specify O2 projection marks and restore revocation fence
|
||||
9ef5798ac docs: close W4 locator and access review gaps
|
||||
4897520c3 docs: define committed DOCX citation and access contract
|
||||
4ca270307 queue: revs 3360-3368. Row 203 (#1701): Sage brief re-pin to 8adfb261f (3360, Webby N2), Quackerjack claim, in-review r2 and outcome (3361-3363), Sage request as jarvis (3364-3365), Webby approve record (3366), Sage landing note and done (3367-3368).
|
||||
25c09f19f docs: name save-group settings and enforce adoption gates
|
||||
a6da8718c docs: fix O2 review gates, shipping and save semantics
|
||||
ee26cfbad docs: redesign Q195 for full WordCraft O2 editor
|
||||
a4da4e6df row 203: gate results on the rebased tip (c7b754d7b): stack-release 219/0, test-config 51/0, mutants 17/17, cli 895/0, ten scripts green with named skips; code tree unchanged from 7309260ae
|
||||
7309260ae row 203: gate record on the rebased tip (c7b754d7b): blob table and timeout table, written before the first run
|
||||
7c543fd4a row 203 FED R2: cases for missing self, peer id and label (webby-0191 B3)
|
||||
284d55cf2 row 203 FED R2: stack-release probe reads federation; a refusal case per federation check
|
||||
93a491d73 row 203 FED R2: federation key in the system config (#1701)
|
||||
c7b754d7b queue: revs 3339-3359. Row 292 (#1797, Gander) added and briefed (Sage, 3339-3340). Row 291: Gosalyn claim and in-review r1 (3341, 3344-3345), Sage request as jarvis (3353-3354), Webby approve record (3357). Row 207: Megavolt in-review (3342), Sage abandon and request as jarvis, resolved on c30841 (3347, 3349-3350), Duckworth approve record (3356), Sage landing note and done (3358-3359). Row 270: Gizmoduck claim and in-review r3 (3343, 3346), Sage abandon and request as jarvis (3348, 3351-3352), Duckworth approve record (3355).
|
||||
a94c95522 docs: row 207 landing records (SESSIONS, BUILD-LOG, Megavolt's lines), DEFERRED 207 N1 (duckworth-0230) and 270 N6 bound to row 272 (duckworth-0228)
|
||||
c4f77373f row 207 (#1705): BUILD.md Runs records the gate on 712f79c0a (sage-3041): access.test 31/31, M1-M8 killed on their named tests, cli 894/894, ten scripts green under the mos-1275 limits, and the stopped first run's kill-check correction; doc only
|
||||
c7e77202d row 207 (#1705): BUILD.md records sage-2810 (Q1 no reload, cited to broker.mjs:384; Q2 refuse with user-has-grants) and the usage/help pin sweep: access.test.mjs is the only reader, no hash pin; doc only
|
||||
a0094633f row 207 (#1705): access.test.mjs T1-T9 for user add|remove; BUILD.md pins M7/M8 as edits and records the row 275 path check (bus only, morgana/row275 empty); not yet run, waits for Sage's CLEAR (sage-2790)
|
||||
721268b08 row 207 (#1705): mosaic access user add|remove on R5's path (proof, lock, revision, checkAccess, receipt user.add/user.remove); remove refuses user-has-grants; --level viewer already in R5; BUILD.md records Q1-Q5 (no access.reload, R4's) and the tests and mutants; tests held for the row 275 manifest check (sage-2790)
|
||||
f0e3dcdf4 plans: brief for the config_checks follow-up (row 270 rollback hazard, duckworth-0226, sage-3038)
|
||||
01983cd3f queue: rev 3338. Row 224 waits on row 216 (Sage, mos-1351: della/row224 carries row 216's commit 4f3fbc25a).
|
||||
626c19e78 queue: revs 3325-3337. Row 271: Gizmoduck claim and in-review r3 (3325-3327), Sage review request as jarvis (3328-3329), Duckworth approve record (3330). Row 276: Gander in-review r1 (3331-3332), Sage review request as jarvis (3333-3334), Duckworth approve record (3335), Sage landing note and done (3336-3337).
|
||||
f32b867f3 docs(row276): record green run5 gate and all seventeen assertion kills
|
||||
826e8fd7f docs(row276): refresh mos-1350 baseline cleanup packet and limits
|
||||
e06130fc0 test(case): require baseline session cleanup per mos-1350 review
|
||||
466562ba0 docs(row276): pin mos-1350 baseline candidate and timing audit
|
||||
931fab079 perf(case): remove duplicate head validation per mos-1350
|
||||
135bb8fae test(case): isolate P10 timing with per-mode baseline per mos-1350
|
||||
cf228eabc docs(row276): record run4 stop and mos-1349 timing pairs
|
||||
41f8bd197 docs(row276): packet stdout spool and M17 per mos-1345
|
||||
47906e4fd fix(case): isolate legacy stdout after outer timeout per mos-1345
|
||||
c2b845c76 docs(row276): preserve run3 whole-file stop for placement
|
||||
74635fc60 fix(row276): correct multi-file driver path per mos-1337 review
|
||||
257003ba1 test(row276): record mos-1337 N5 delta and both-copy mutant
|
||||
537ce2dd4 fix(case): silence vanished stat opens per mos-1337 N5
|
||||
3b9042802 docs(row276): record run2 stop for Mos placement
|
||||
859ae3708 docs(row276): void setup-red run and pin first fixture correction
|
||||
88179d6de test(row276): define read helper for new legacy fixtures
|
||||
ccfa17eef docs(row276): integrate schema3m base and record dependency drift
|
||||
b5d9efa1b docs(row276): pin integration on 94c33a43c and preserve upstream docs
|
||||
69979bb8a docs(row276): record static approval and upstream deferred drift
|
||||
155f64322 docs(row276): pin supervised-call candidate and fifteen mutants
|
||||
b96b4e303 fix(case1): supervise legacy user calls across sudo sessions
|
||||
f2735bb6a queue: revs 3317-3324. Row 206: Launchpad claim and in-review (3317-3319), Sage review request (3320-3321), Duckworth approve record (3322), Sage landing note and done (3323-3324).
|
||||
bus: scripts/bus-service.sh install --copy 464010fbe4c6925b077b9b8182a209ee2177eb9d --copies /home/jwoltje/.local/share/mosaic-stack/copies --pm --claude /home/jwoltje/.local/bin/claude
|
||||
proof: off
|
||||
send: off
|
||||
Console: scripts/webui-service.sh install --copy 464010fbe4c6925b077b9b8182a209ee2177eb9d --copies /home/jwoltje/.local/share/mosaic-stack/copies --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket
|
||||
CLI: scripts/stack-copy.sh wrapper 464010fbe4c6925b077b9b8182a209ee2177eb9d --copies /home/jwoltje/.local/share/mosaic-stack/copies --bin /home/jwoltje/.npm-global/bin
|
||||
interpreter: {"path":"/usr/bin/python3.14","version":[3,14,6],"dev":66308,"ino":3968163,"sha256":"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc"}
|
||||
@@ -0,0 +1 @@
|
||||
launched chief: run r28dbbc5c6b4d, claude-code claude-opus-5-5
|
||||
@@ -0,0 +1,107 @@
|
||||
plan: rollback for mosaic-stack
|
||||
from: 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
to: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
store schema: 3n (read from the store the running bus holds)
|
||||
target schema: 3m
|
||||
restore: the store must go back to 3m; needs --restore 20261023T034557Z-464010fbe4c6
|
||||
commits: the run takes away 94 (newest first, at most 200):
|
||||
464010fbe queue: revs 3435-3436. Row 294 (#1800): Duckworth APPROVE c30998 (3435, candidate 0b3f9c9d). Row 272 (#1777): Scrooge CHANGES c31006 (3436, candidate 0c3dc2ed); queue only
|
||||
e57bfde73 queue: revs 3407-3434. Row 293 (574, #1805): Gander in-review r1 (3407, failed pre-send 3408), Sage request c30981 (3409/3410), Filbert APPROVE c30982 (3411). Row 292 (#1797): assigned gizmoduck (mos-1387), claim 3413, in-review r1 3419 (3420 failed), Sage request c30992 (3425/3426), Duckworth APPROVE c30975 (3433). Row 294 (#1800): Launchpad claim 3418, in-review r1 3422 (3423 failed), Sage request c30993 (3427/3428). Row 295 (#1801): Morgana claim 3414, in-review r1 3416 (3417 failed), Sage request c30991 resolved (3421/3424), Dewey CHANGES c30994 (3431). Row 272 (#1777): Huey claim 3415, in-review r1 3429 (3430 failed), Sage request c30997 resolved (3432/3434); queue only
|
||||
319d9f87e sessions: Filbert row 293 (Vikunja 574) APPROVE c30982 rev 3411, plus re-added S0 re-check and 574 static review lines; docs only
|
||||
b23783f39 Rows 270+271 landing (7328da8ca), 571 landing, MVP rows 293-299: BUILD-LOG phase line and Sage SESSIONS line; docs only
|
||||
e18ad2711 docs: define mixed-format chapter ordering for conversion
|
||||
12f8c3089 queue: rows 293-299 briefed (revs 3399, 3401-3406, sage) and row 293 claimed by gander (rev 3400, gander-293-start); queue only
|
||||
253346e3c queue: rows 293-299 added (574 #1805, FED R6 #1800, FED R4 #1801, FED R7 #1802, GitHub grant method #1803, Q228 #1804, 573 #1806; mos-1371/1372), 208 after 294; 270 round 3 request c30929 and Duckworth APPROVE c30930; 270+271 done at 7328da8ca (mos-1351); queue only
|
||||
7328da8ca gizmoduck: row 270 (264c, #1775) gate results: run 3 red on case1-accept P10 band (Vikunja 573) and run 4 red on the checkout.test fixture race (Vikunja 574), both old tests unchanged in the range; run 5 GREEN on 53406f3e4 under mos-1369 and sage-3106, all phases and 38/38 mutants killed; BUILD.md only
|
||||
84002f960 gizmoduck: row 270 (264c, #1775) gate run 2 second red, fixed under mos-1364 and sage-3093: compactions-budget.test F1 (:39 input 8.5 * MiB is a whole number, now MiB + 0.5) and F2 (the 0o000 window in try/finally; the after-hook ran after setup's rm); K M22 :129, M23 :120, M22 and M15 notes; BUILD.md run 2
|
||||
f89aaf57f gizmoduck: row 270 (264c, #1775) gate run 1 red placed (mos-1272): compactions-launch.test's host wires row 271's five clear ops, as session-clear.test does; the clear test's successor never started without them; kill lines +5 in mutants.py K; BUILD.md run 1
|
||||
d3a49f301 gizmoduck: rows 270+271 combined gate (C2) record before the first run (sage-3073, sage-3086, mos-1275, mos-1351): blob table, timeout table, GREEN and RED, order; code is ac44d0de9's
|
||||
562b05b43 gizmoduck: row 270 (264c, #1775) round 4 for sage-3073 and sage-3078: rows 270 and 271 rebased onto 25c09f19f (row 203 plus the O2 docs); mosaic-config.mjs keeps 203's federation key and both compaction keys; BUILD.md round 4 with the range-diff, the three merged files and C1 after 203; not run
|
||||
8c28ee731 gizmoduck: row 270 (264c, #1775) round 3 for duckworth-0226 B4 (sage-3038): one collection opens at most the system config's compactionStreams stream files in name order (default 1024, 32 to 65536, a bad value takes the default and logs), not-collected past it with no cursor for an unopened stream; the missing-stream check uses a Set; readStreams, cap and launcher tests; mutants M22-M24, M10 anchor moved; docs/TOOLS.md has both keys and C1 (N4); BUILD.md round 3 with stream counts, the 231 KB bound, C1 and N5; not run
|
||||
bce491715 gizmoduck: row 270 (264c, #1775) round 2 for duckworth-0223 B1-B3 (sage-3030, sage-3031, mos-1352, sage-3033): pi streams read in 1 MiB chunks under a budget from the system config's compactionReadBytes (default 64 MiB, 1 MiB to 1 GiB, a bad value takes the default and logs), not-collected past it; Claude history from before the ledger is harness-unsupported for good; launcher, runtime reader, clear and legacy tests; mutants M13-M21; BUILD.md round 2 with sizes, schema change, rollback hazard, N1-N3; not run
|
||||
01b57f48b gizmoduck: row 270 (264c, #1775) round 1 for review (sage-3024): mutants.py M1-M12 with anchors at 7d199f033, each matching once, kills read from the tests; run plan with broker.mjs reruns; launcher and runtime wiring named as untested; not run
|
||||
54ec0005e row 271 (264d, #1776): BUILD.md r3 gate on 9e18a9aaf (sage-3017): cli and bus session-clear.test whole green (5/5, 19/19), cli suite 874/874, M14 killed by the T6 test's first lines() assertion at :365; no first-run red. Doc only.
|
||||
61e262b7c row 271 (264d, #1776): r3 packet carries mutants.py, M1-M14 with their anchors, as the gate applies them (duckworth-0212 C1). Doc and harness only; no src or test change.
|
||||
540b6f16b row 271 (264d, #1776): r3, T6 per sage-3001. New cli test: a bus unavailable (broker-exited) at the exit proof, then at retirement, holds the clear with no retirement, successor launch or slot handed on, logs once, and resumes when the bus answers. BUILD.md maps the halt case to session-launch.test.mjs:372 and launcher.mjs:824, binds the Q198 hold to row 257 with duckworth-0210's carry, and names M14 (drop clearPass's try/catch) and its kill. No src change. Not run (no CLEAR).
|
||||
e6a675ee8 row 271 (264d, #1776): BUILD.md gate results on e8af389e6 (sage-2991): 18 touched files, bus/seat/cli suites and every test-*.sh green, M1-M13 killed by assertions in the named tests; the row gate's T6 coverage open to Sage. Doc only.
|
||||
e77635ceb row 271 (264d, #1776): BUILD.md run limits for the e567f949c gate (mos-1275, sage-2991); mutant lines moved one down past the B1 comment. Doc only.
|
||||
3fc8ccef1 row 271 (264d, #1776): duckworth-0201 B1: #ownerRefusal passes 'session.clear' to #granted, so the project and instance sit in their own slots and a live collaborator grant passes the retirement recheck. N4 setup shared; a second N4 test keeps the grant and expects retired plus the successor; M13 restores the defect. 264e carry noted at the N4 tests. Not run (no CLEAR).
|
||||
27d3266ff row 271 (264d, #1776): BUILD.md records mos-1336, Mos's approval under mos-1292 of the later3l, rows() and thread-shares migration test changes on the 3m to 3n rebase, with its conditions
|
||||
6bd67225b row 271 (264d, #1776): BUILD.md states the post-rebase '3m' grep result as measured
|
||||
14715d644 row 271 (264d, #1776): r2 on 0cbe2e9b3 (sage-2968): 3m to 3n migration and 3m engine tests from fixtures/schema-3m.sql; BUILD.md records the label change, the old-test changes (later3l, rows() and the thread-shares migration test outside the mos-1315 list, for Mos) and the mutant lines on the rebased tree
|
||||
f9a9c9b5a row 271 (264d, #1776): BUILD.md defines M1-M12 with their expected kills
|
||||
34388223d row 271 (264d, #1776): launcher uncertain-path test with test-driven ticks and a stopped runner; start() takes stopTimeoutMs
|
||||
3adb391b5 row 271 (264d, #1776): N4 failed-clear test on a user's thread with raw first rows; BUILD.md notes the failed path has no verb route yet
|
||||
4da907cd5 row 271 (264d, #1776): T4 tests round 1, not run (slot held). Bus session-clear.test.mjs (15), cli session-clear.test.mjs (3, bwrap) with clear-adapter.mjs; BUILD.md maps each T4 item and names what is still open (failed clear, launcher uncertain path, mutants)
|
||||
aa8fc490f row 271 (264d, #1776): clear context build round 1, not run (slot held). Broker: session.clear, session.cancel and session.operation, the fence on send/open/claim, cancel at arrival for routed messages, the drained receive and the end drain, trusted ops sessionClears and sessionClearExited/Uncertain/Retire/Start. Launcher: clearPass before the threads loop (stop, proof, retire, successor start through check()/start()), waiting on a live row 269 survivor. Old tests per mos-1315, rebased on row 206 (sage-2968): label 3m to 3n, future step 3n to 3o, 3m-3n.sql in the engine copies and file lists, ready lines, later3l and the rows() exclusions gain both tables as 206 did for thread_shares (mos-1292, approved in mos-1336), schema.test counts 25 tables and 96 triggers, COUNTED and T45 LISTED gain both tables after thread_shares (mos-1318, mos-1319), TESTER_VERBS pin (mos-1325), fixtures/schema-3m.sql
|
||||
a9884dc75 row 271 (264d, #1776): schema step 3m to 3n (rebased on row 206's 3l to 3m, sage-2968), session_ops and message_cancels with 7 triggers; successor id pinned as a lowercase version 8 UUID for Huey (gizmoduck-0274)
|
||||
25c2c1a56 gizmoduck: row 271 design: duckworth-0171 C1 (start stages keyed on a report counter, work attempt in its own column) and C2 (cancelled in the stage CHECK at attempt 0 and closing the op, claim and cancels untouched by a pre-retire cancel, post-retire successor reading stated, race and held tests); N1 grep at build
|
||||
4f827a5e8 gizmoduck: row 271 design: session.cancel and the cancelled stage built in 271 (sage-2828 re-rules Q3 per D7:263-264), pre- and post-retire paths, cancel tests and the fence-release mutant; N2 refuses session-name-too-long at accept
|
||||
7dc8ff1bf gizmoduck: row 271 design: T45 LISTED gains session_ops and message_cancels to match COUNTED (mos-1319)
|
||||
61df3061e gizmoduck: row 271 design: duckworth-0170 B1-B4 folded (cancel at arrival for routed messages, claim refused while clearing, op namespace both ways, attempt key on start stages) and N1-N8 answered; cancel recorded as a departure from D7:263-264
|
||||
b212182ed gizmoduck: row 271 design: both new tables join COUNTED in stack-release.sh, so T46 passes unchanged; schema.test count pins name the 2 tables and 7 triggers; T45 LISTED question to Mos (mos-1318)
|
||||
dac64ff31 gizmoduck: row 271 (264d) design draft 2: drained acknowledged by the run's own receive at a turn boundary (a landing turn has unread 0 with a child running), SIGTERM only after it; successor <old>-N bound at request with a deterministic id; no cancel (sage-2826); pre-existing test change list per mos-1315
|
||||
b329ad69f gizmoduck: row 271 (264d) design draft 1 in the packet: the threadIdle fence as the drain, the idle stop as the only signal, a session_ops journal and message_cancels in one schema step; Q1-Q4 for Sage and Mos
|
||||
8d4d4ec59 gizmoduck: row 270: the bus legacy test inserts its legacy thread by hand (sessions is append-only) and the test business has the assistant thread.create needs; not run
|
||||
5ddc36ca9 gizmoduck: row 270 (264c, #1775): completed Pi compactions counted into a host ledger beside the session store, keyed (entry id, timestamp) store-wide (sage-2806, sage-2814); launcher collects at run start and end under the workspace lock; session.list rows gain compactions through a runtime-injected reader; not run (slot held)
|
||||
f510d7367 gizmoduck: rows 270 and 271 packets: the 264c count and 264d clear contracts pinned for row 272 (Huey), and the Pi 0.85.1 compaction source contract
|
||||
767bb62c7 docs: close remote credential and private review access findings
|
||||
6345aae3d docs: align editor graph, Markdown transition and archive with PRD d6
|
||||
ee5f7b9ef docs: align O2 chapter conversion and Case 2 access with owner rulings
|
||||
0b923a275 MVP readiness briefs (mos-1371/1372): FED R6 #1800, FED R4 #1801, FED R7 #1802, GitHub grant method #1803, Q228 grant scope #1804, 574 #1805, 573 #1806; docs only
|
||||
b0a6838ca SESSIONS: Filbert Q195 O2 S0 review (#1798, c30914); doc only
|
||||
062646487 Q195 O2 W4 (#1799): log lines for the W4 design and review landing, row 203 and O2 landing; docs only
|
||||
66299eeef Q195 O2 W4 (#1799): Megavolt's round 4 review of 994c3f7fb (blob 2af460ab7): APPROVE, R3-B1 and R3-B2 closed, R4-N1 (re-migration after a pre-W4b restore) non-blocking for W4b; doc only
|
||||
569bb6b17 Q195 O2 W4 (#1799): Megavolt's round 3 review of 54246cb32 (blob 0c4f55826): CHANGES, R2-B1 projection and R2-B2 closed, R3-B1 (reserved notes keyed on negative IDs) and R3-B2 (fence initial state and confirmation scope undefined); doc only
|
||||
fb404c909 Q195 O2 W4 (#1799): Megavolt's round 2 review of 019a0ea5b (blob 14dfe92d9): CHANGES, B1-B9 and M1 closed, R2-B1 (paragraph-mark revisions, reserved-note leaves) and R2-B2 (release backup/restore keeps O2 text and revives revocations); doc only
|
||||
4c0a2c4fd Q195 O2 W4 (#1799): Megavolt's review of the DOCX citation design at 15e91538f (blob 662abdb7c): CHANGES, B1-B9 and M1 (Case 2 narrowing in O2-context turns goes to Mos/Jason); doc only
|
||||
2f06aad3f docs: define reserved notes and initial O2 restore fence
|
||||
6863d4c85 docs: specify O2 projection marks and restore revocation fence
|
||||
9ef5798ac docs: close W4 locator and access review gaps
|
||||
4897520c3 docs: define committed DOCX citation and access contract
|
||||
4ca270307 queue: revs 3360-3368. Row 203 (#1701): Sage brief re-pin to 8adfb261f (3360, Webby N2), Quackerjack claim, in-review r2 and outcome (3361-3363), Sage request as jarvis (3364-3365), Webby approve record (3366), Sage landing note and done (3367-3368).
|
||||
25c09f19f docs: name save-group settings and enforce adoption gates
|
||||
a6da8718c docs: fix O2 review gates, shipping and save semantics
|
||||
ee26cfbad docs: redesign Q195 for full WordCraft O2 editor
|
||||
a4da4e6df row 203: gate results on the rebased tip (c7b754d7b): stack-release 219/0, test-config 51/0, mutants 17/17, cli 895/0, ten scripts green with named skips; code tree unchanged from 7309260ae
|
||||
7309260ae row 203: gate record on the rebased tip (c7b754d7b): blob table and timeout table, written before the first run
|
||||
7c543fd4a row 203 FED R2: cases for missing self, peer id and label (webby-0191 B3)
|
||||
284d55cf2 row 203 FED R2: stack-release probe reads federation; a refusal case per federation check
|
||||
93a491d73 row 203 FED R2: federation key in the system config (#1701)
|
||||
c7b754d7b queue: revs 3339-3359. Row 292 (#1797, Gander) added and briefed (Sage, 3339-3340). Row 291: Gosalyn claim and in-review r1 (3341, 3344-3345), Sage request as jarvis (3353-3354), Webby approve record (3357). Row 207: Megavolt in-review (3342), Sage abandon and request as jarvis, resolved on c30841 (3347, 3349-3350), Duckworth approve record (3356), Sage landing note and done (3358-3359). Row 270: Gizmoduck claim and in-review r3 (3343, 3346), Sage abandon and request as jarvis (3348, 3351-3352), Duckworth approve record (3355).
|
||||
a94c95522 docs: row 207 landing records (SESSIONS, BUILD-LOG, Megavolt's lines), DEFERRED 207 N1 (duckworth-0230) and 270 N6 bound to row 272 (duckworth-0228)
|
||||
c4f77373f row 207 (#1705): BUILD.md Runs records the gate on 712f79c0a (sage-3041): access.test 31/31, M1-M8 killed on their named tests, cli 894/894, ten scripts green under the mos-1275 limits, and the stopped first run's kill-check correction; doc only
|
||||
c7e77202d row 207 (#1705): BUILD.md records sage-2810 (Q1 no reload, cited to broker.mjs:384; Q2 refuse with user-has-grants) and the usage/help pin sweep: access.test.mjs is the only reader, no hash pin; doc only
|
||||
a0094633f row 207 (#1705): access.test.mjs T1-T9 for user add|remove; BUILD.md pins M7/M8 as edits and records the row 275 path check (bus only, morgana/row275 empty); not yet run, waits for Sage's CLEAR (sage-2790)
|
||||
721268b08 row 207 (#1705): mosaic access user add|remove on R5's path (proof, lock, revision, checkAccess, receipt user.add/user.remove); remove refuses user-has-grants; --level viewer already in R5; BUILD.md records Q1-Q5 (no access.reload, R4's) and the tests and mutants; tests held for the row 275 manifest check (sage-2790)
|
||||
f0e3dcdf4 plans: brief for the config_checks follow-up (row 270 rollback hazard, duckworth-0226, sage-3038)
|
||||
01983cd3f queue: rev 3338. Row 224 waits on row 216 (Sage, mos-1351: della/row224 carries row 216's commit 4f3fbc25a).
|
||||
626c19e78 queue: revs 3325-3337. Row 271: Gizmoduck claim and in-review r3 (3325-3327), Sage review request as jarvis (3328-3329), Duckworth approve record (3330). Row 276: Gander in-review r1 (3331-3332), Sage review request as jarvis (3333-3334), Duckworth approve record (3335), Sage landing note and done (3336-3337).
|
||||
f32b867f3 docs(row276): record green run5 gate and all seventeen assertion kills
|
||||
826e8fd7f docs(row276): refresh mos-1350 baseline cleanup packet and limits
|
||||
e06130fc0 test(case): require baseline session cleanup per mos-1350 review
|
||||
466562ba0 docs(row276): pin mos-1350 baseline candidate and timing audit
|
||||
931fab079 perf(case): remove duplicate head validation per mos-1350
|
||||
135bb8fae test(case): isolate P10 timing with per-mode baseline per mos-1350
|
||||
cf228eabc docs(row276): record run4 stop and mos-1349 timing pairs
|
||||
41f8bd197 docs(row276): packet stdout spool and M17 per mos-1345
|
||||
47906e4fd fix(case): isolate legacy stdout after outer timeout per mos-1345
|
||||
c2b845c76 docs(row276): preserve run3 whole-file stop for placement
|
||||
74635fc60 fix(row276): correct multi-file driver path per mos-1337 review
|
||||
257003ba1 test(row276): record mos-1337 N5 delta and both-copy mutant
|
||||
537ce2dd4 fix(case): silence vanished stat opens per mos-1337 N5
|
||||
3b9042802 docs(row276): record run2 stop for Mos placement
|
||||
859ae3708 docs(row276): void setup-red run and pin first fixture correction
|
||||
88179d6de test(row276): define read helper for new legacy fixtures
|
||||
ccfa17eef docs(row276): integrate schema3m base and record dependency drift
|
||||
b5d9efa1b docs(row276): pin integration on 94c33a43c and preserve upstream docs
|
||||
69979bb8a docs(row276): record static approval and upstream deferred drift
|
||||
155f64322 docs(row276): pin supervised-call candidate and fifteen mutants
|
||||
b96b4e303 fix(case1): supervise legacy user calls across sudo sessions
|
||||
f2735bb6a queue: revs 3317-3324. Row 206: Launchpad claim and in-review (3317-3319), Sage review request (3320-3321), Duckworth approve record (3322), Sage landing note and done (3323-3324).
|
||||
bus: scripts/bus-service.sh install --copy 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 --copies /home/jwoltje/.local/share/mosaic-stack/copies --pm --claude /home/jwoltje/.local/bin/claude
|
||||
proof: off
|
||||
send: off
|
||||
Console: scripts/webui-service.sh install --copy 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 --copies /home/jwoltje/.local/share/mosaic-stack/copies --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket
|
||||
CLI: scripts/stack-copy.sh wrapper 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 --copies /home/jwoltje/.local/share/mosaic-stack/copies --bin /home/jwoltje/.npm-global/bin
|
||||
interpreter: {"path":"/usr/bin/python3.14","version":[3,14,6],"dev":66308,"ino":3968163,"sha256":"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc"}
|
||||
@@ -0,0 +1,20 @@
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"464010fbe4c6925b077b9b8182a209ee2177eb9d","business":"mosaic-stack","pm":true,"claude":"/home/jwoltje/.local/bin/claude","console":["--port","7332","--public-host","mosaic.woltje.com","--auth-header","X-authentik-username","--allow-user","jason.woltje","--tester-socket"],"schema":"3n","activation":"20261023T034557Z-464010fbe4c6","at":"2026-10-23T03:46:02Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-22T15:06:00Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":"20261022T150555Z-84f53540dd0d","activation":"20261022T150555Z-84f53540dd0d","result":"ok"}
|
||||
{"at":"2026-10-22T20:16:21Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":null,"activation":"20261022T201621Z-0cbe2e9b35e5","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T20:16:24Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":"20261022T201621Z-0cbe2e9b35e5","activation":"20261022T201621Z-0cbe2e9b35e5","result":"ok"}
|
||||
{"at":"2026-10-23T03:45:57Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":null,"activation":"20261023T034557Z-464010fbe4c6","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-23T03:46:02Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":"20261023T034557Z-464010fbe4c6","activation":"20261023T034557Z-464010fbe4c6","result":"ok"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3811005, running, since 2026-10-23T03:45:59.548Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3811049
|
||||
boot: organization file loaded at 2026-10-23T03:45:59.547Z
|
||||
unit flags: match the pointer
|
||||
drift: 0 commit(s) on refactor since the pointer's copy
|
||||
@@ -0,0 +1 @@
|
||||
2026-10-23T03:45:57Z
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
## W5 activate NEW --pm --migrate --tester-socket (mos-1404)
|
||||
# start 2026-10-23T03:45:57.740Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh activate 464010fbe4c6925b077b9b8182a209ee2177eb9d mosaic-stack --pm --migrate --tester-socket)
|
||||
stack-release: interpreter: {"path":"/usr/bin/python3.14","version":[3,14,6],"dev":66308,"ino":3968163,"sha256":"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc"}
|
||||
stack-release: captured the rollback set: /home/jwoltje/.mosaic-dev/state/stack-rollback/20261023T034557Z-464010fbe4c6
|
||||
stack-release: stopped both units
|
||||
stack-release: stopped store schema: 3m
|
||||
stack-release: backup: /home/jwoltje/.mosaic-dev/backups/stack/20261023T034557Z-464010fbe4c6
|
||||
stack-release: migrated the store to 3n
|
||||
stack-release: installed 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
stack-release: gate passed on 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
stack-release: activate ok: 464010fbe4c6925b077b9b8182a209ee2177eb9d is live for mosaic-stack
|
||||
# exit 0, end 2026-10-23T03:46:02.293Z
|
||||
@@ -0,0 +1,6 @@
|
||||
types table=26 trigger=97 view=5 index=28
|
||||
schema_version 3n
|
||||
missing none
|
||||
new_table_rows session_ops=0 message_cancels=0 thread_shares 0
|
||||
events 2202 maxSeq 2202
|
||||
COUNTS_OK
|
||||
@@ -0,0 +1,21 @@
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"464010fbe4c6925b077b9b8182a209ee2177eb9d","business":"mosaic-stack","pm":true,"claude":"/home/jwoltje/.local/bin/claude","console":["--port","7332","--public-host","mosaic.woltje.com","--auth-header","X-authentik-username","--allow-user","jason.woltje","--tester-socket"],"schema":"3n","activation":"20261023T034557Z-464010fbe4c6","at":"2026-10-23T03:46:02Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-22T15:06:00Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":"20261022T150555Z-84f53540dd0d","activation":"20261022T150555Z-84f53540dd0d","result":"ok"}
|
||||
{"at":"2026-10-22T20:16:21Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":null,"activation":"20261022T201621Z-0cbe2e9b35e5","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T20:16:24Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":"20261022T201621Z-0cbe2e9b35e5","activation":"20261022T201621Z-0cbe2e9b35e5","result":"ok"}
|
||||
{"at":"2026-10-23T03:45:57Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":null,"activation":"20261023T034557Z-464010fbe4c6","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-23T03:46:02Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":"20261023T034557Z-464010fbe4c6","activation":"20261023T034557Z-464010fbe4c6","result":"ok"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3811005, running, since 2026-10-23T03:45:59.548Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3811049
|
||||
boot: organization file loaded at 2026-10-23T03:45:59.547Z
|
||||
unit flags: match the pointer
|
||||
drift: 0 commit(s) on refactor since the pointer's copy
|
||||
# exit 0
|
||||
@@ -0,0 +1 @@
|
||||
pm run ra38826f3c6e2 (claude-code), launchedBy chief, startedAt 2026-10-23T03:47:35.835Z, pid 3831373, runner pid 3831374: left live by W9b
|
||||
@@ -0,0 +1,21 @@
|
||||
B0 (3m) start 2026-10-23T03:41:34.519Z
|
||||
/home/jwoltje/.mosaic-dev/backups/b0-20261023T034134Z:
|
||||
total 24
|
||||
drwx------ 3 jwoltje jwoltje 4096 Oct 22 22:41 .
|
||||
drwx------ 14 jwoltje jwoltje 4096 Oct 22 22:41 ..
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 22:41 bus
|
||||
-rw------- 1 jwoltje jwoltje 37 Oct 22 22:41 CHECK
|
||||
-rw------- 1 jwoltje jwoltje 3 Oct 22 22:41 SCHEMA
|
||||
-rw------- 1 jwoltje jwoltje 77 Oct 22 22:41 SHA256SUMS
|
||||
|
||||
/home/jwoltje/.mosaic-dev/backups/b0-20261023T034134Z/bus:
|
||||
total 3008
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 22:41 .
|
||||
drwx------ 3 jwoltje jwoltje 4096 Oct 22 22:41 ..
|
||||
-rw------- 1 jwoltje jwoltje 3072000 Oct 22 22:41 bus.sqlite
|
||||
SHA256SUMS: 36f3579265b8fbb8c14e8e4734aab073bc9bc128720856799fd98b405221b114 bus.sqlite
|
||||
SCHEMA: 3m
|
||||
CHECK: ok events 2200 maxSeq 2200 schema 3m
|
||||
B0 path /home/jwoltje/.mosaic-dev/backups/b0-20261023T034134Z
|
||||
B0 SHA256SUMS sha256 6589030ed82a53941e17b44f9010064dac044ec5f720119d37213d9692f16e57
|
||||
B0 end 2026-10-23T03:41:34.861Z B0_PASS
|
||||
Executable
+53
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), B0 (PLAN.md "Schema and backups"). window-migrate-0cbe2e9b3/b0.sh
|
||||
# with WIN changed and the expected schema an argument: 3m before the window, 3n before W9b. An online copy of the
|
||||
# held live store through sqlite's backup API, read-only on the source, as in window-repin-7247d80c7/w12.sh. Laid
|
||||
# out the way `rehearse --backup PATH` reads it (stack-release.sh:2232-2235 at OLD):
|
||||
# $DATA/backups/b0-<STAMP>/bus/bus.sqlite the copy, and nothing else in bus/ (rehearse copies bus/*)
|
||||
# $DATA/backups/b0-<STAMP>/SHA256SUMS written from inside bus/, so it names bus.sqlite
|
||||
# $DATA/backups/b0-<STAMP>/SCHEMA the copy's meta schema_version, which must read the argument
|
||||
# $DATA/backups/b0-<STAMP>/CHECK integrity_check, the event count and maxSeq
|
||||
# Nothing live changes. A failed check stops the script.
|
||||
# usage: b0.sh 3m|3n
|
||||
set -uo pipefail
|
||||
WIN=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n
|
||||
WANT=${1:?usage: b0.sh 3m|3n}
|
||||
case $WANT in 3m|3n) ;; *) echo "usage: b0.sh 3m|3n"; exit 2 ;; esac
|
||||
DATA=$HOME/.mosaic-dev
|
||||
sha() { sha256sum < "$1" | cut -c1-64; }
|
||||
stop() { echo "STOP: $*"; exit 1; }
|
||||
|
||||
echo "B0 ($WANT) start $(date -u +%FT%T.%3NZ)"
|
||||
[ -f "$DATA/bus/bus.sqlite" ] || stop "no live store"
|
||||
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
|
||||
B=$DATA/backups/b0-$STAMP
|
||||
[ ! -e "$B" ] || stop "$B exists"
|
||||
( umask 077; mkdir -p "$B/bus" ) || stop "backup dir"
|
||||
python3 -B -c '
|
||||
import sqlite3,sys
|
||||
src=sqlite3.connect("file:"+sys.argv[1]+"?mode=ro",uri=True)
|
||||
dst=sqlite3.connect(sys.argv[2])
|
||||
src.backup(dst)
|
||||
ok=dst.execute("pragma integrity_check").fetchone()[0]
|
||||
n=dst.execute("select count(*), max(seq) from events").fetchone()
|
||||
sv=dst.execute("select value from meta where key=?",("schema_version",)).fetchone()
|
||||
dst.close(); src.close()
|
||||
print(ok, "events", n[0], "maxSeq", n[1], "schema", sv[0] if sv else None)
|
||||
open(sys.argv[3],"w").write((sv[0] if sv else "")+"\n")
|
||||
sys.exit(0 if ok=="ok" else 1)' "$DATA/bus/bus.sqlite" "$B/bus/bus.sqlite" "$B/SCHEMA" > "$B/CHECK" || stop "backup or integrity_check failed: $(cat "$B/CHECK" 2>/dev/null)"
|
||||
[ "$(cat "$B/SCHEMA")" = "$WANT" ] || stop "SCHEMA reads $(cat "$B/SCHEMA"), not $WANT"
|
||||
left=$(ls -A "$B/bus")
|
||||
[ "$left" = bus.sqlite ] || stop "bus/ holds more than bus.sqlite: $(tr '\n' ' ' <<< "$left")"
|
||||
chmod 600 "$B/bus/bus.sqlite" "$B/CHECK" "$B/SCHEMA"
|
||||
( cd "$B/bus" && sha256sum bus.sqlite > ../SHA256SUMS ) || stop "SHA256SUMS"
|
||||
chmod 600 "$B/SHA256SUMS"
|
||||
# The same check rehearse makes before it reads the set.
|
||||
( cd "$B/bus" && sha256sum -c --quiet ../SHA256SUMS ) || stop "the set fails rehearse's SHA256SUMS check"
|
||||
echo "B0 ($WANT) $(date -u +%FT%TZ) store backup $B ($(cat "$B/CHECK")), SHA256SUMS sha256 $(sha "$B/SHA256SUMS")" >> $WIN/backups.txt
|
||||
ls -la "$B" "$B/bus"
|
||||
echo "SHA256SUMS: $(cat "$B/SHA256SUMS")"
|
||||
echo "SCHEMA: $(cat "$B/SCHEMA")"
|
||||
echo "CHECK: $(cat "$B/CHECK")"
|
||||
echo "B0 path $B"
|
||||
echo "B0 SHA256SUMS sha256 $(sha "$B/SHA256SUMS")"
|
||||
echo "B0 end $(date -u +%FT%T.%3NZ) B0_PASS"
|
||||
@@ -0,0 +1,7 @@
|
||||
D3 2026-10-23T03:41:25Z data-root snapshot /home/jwoltje/.mosaic-dev/backups/d3-20261023T034056Z (STAMP 2026-10-23T03:40:56.998Z, 91612 members, tar exit 0, 0 warning line(s)), SHA256SUMS sha256 6e5cc74553d32e85b4d1d081764ff5bed22b6ac6265ea304913fe0f617f37ee8
|
||||
BZ 2026-10-23T03:41:29Z business file copy /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261023T034129Z sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93 (source /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93)
|
||||
B0 (3m) 2026-10-23T03:41:34Z store backup /home/jwoltje/.mosaic-dev/backups/b0-20261023T034134Z (ok events 2200 maxSeq 2200 schema 3m), SHA256SUMS sha256 6589030ed82a53941e17b44f9010064dac044ec5f720119d37213d9692f16e57
|
||||
W0b 2026-10-23T03:44:07Z business file copy /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261023T034407Z sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93 (source /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93)
|
||||
D3 2026-10-23T03:44:32Z data-root snapshot /home/jwoltje/.mosaic-dev/backups/d3-20261023T034412Z (STAMP 2026-10-23T03:44:12.165Z, 91652 members, tar exit 0, 0 warning line(s)), SHA256SUMS sha256 eda5be89461d50c49cc3c2f32a03f49d3cd6d3848371e9de2eed183cec7cb74d
|
||||
W5 2026-10-23T03:46:02Z activation 20261023T034557Z-464010fbe4c6 backup /home/jwoltje/.mosaic-dev/backups/stack/20261023T034557Z-464010fbe4c6 STAMP 2026-10-23T03:45:58.274Z SCHEMA 3m SHA256SUMS sha256 480f5e556d02d3f079c07782af204c0a41e44fb4633064e1d7c302e473be1390
|
||||
B0 (3n) 2026-10-23T03:47:25Z store backup /home/jwoltje/.mosaic-dev/backups/b0-20261023T034725Z (ok events 2202 maxSeq 2202 schema 3n), SHA256SUMS sha256 0946b66ccde18f5be8d49ed9f15cccf09f73804abdf31b3ae9c108c6c9ee9272
|
||||
@@ -0,0 +1,2 @@
|
||||
-rw------- 1 jwoltje jwoltje 4304 Oct 19 20:39 /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261023T034129Z
|
||||
BZ copy /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261023T034129Z sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93 BZ_PASS
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), the business file copy that goes with B0 (as sage-2967 A2). Plain cp and
|
||||
# sha256sum, as window-migrate-0cbe2e9b3/bz.sh. Nothing reads the file's values.
|
||||
# usage: bz.sh
|
||||
set -uo pipefail
|
||||
WIN=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n
|
||||
BIZ=$HOME/.config/mosaic-dev/businesses/mosaic-stack.json
|
||||
sha() { sha256sum < "$1" | cut -c1-64; }
|
||||
stop() { echo "STOP: $*"; exit 1; }
|
||||
|
||||
[ -f "$BIZ" ] || stop "no business file"
|
||||
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
|
||||
COPY=$BIZ.pre-window-$STAMP
|
||||
[ ! -e "$COPY" ] || stop "$COPY exists"
|
||||
before=$(sha "$BIZ")
|
||||
cp -p "$BIZ" "$COPY" || stop "cp"
|
||||
[ "$(sha "$COPY")" = "$before" ] && [ "$(sha "$BIZ")" = "$before" ] || stop "copy sha256 differs, or the file changed during the copy"
|
||||
echo "BZ $(date -u +%FT%TZ) business file copy $COPY sha256 $(sha "$COPY") (source $BIZ sha256 $before)" >> $WIN/backups.txt
|
||||
ls -la "$COPY"
|
||||
echo "BZ copy $COPY sha256 $(sha "$COPY") BZ_PASS"
|
||||
@@ -0,0 +1,13 @@
|
||||
# W11 comment text (migrate window 0cbe2e9b3 to 464010fbe). Gitea post: Darkwing. P19 post: Sage, as last window (sage-2425).
|
||||
|
||||
## Gitea #1776 (row 271)
|
||||
|
||||
Live as of the migrate window to 464010fbe (activation 20261023T034557Z-464010fbe4c6, 2026-10-23 03:46:02Z UTC), Darkwing operating under Q173 with Mos's W5 go (mos-1404). W5 stopped the units, backed up the stopped 3m store and ran 3m-3n.sql in one step. The backup is SCHEMA 3m, SHA256SUMS 480f5e55. The live 3n store has 26 table rows, 97 triggers, 5 views and 28 indexes; session_ops, message_cancels and session_ops_session exist, and both new tables hold 0 rows. NEW's COUNTED list names 16 tables, the two new ones included. The five tester threads read the same after W5 as before, by id, message count and sha256. The Console started after W5 on NEW's copy, so nobody restarted it. The new chief is r28dbbc5c6b4d. W9b (mos-1392) proved a pm launch on NEW: the relay through the chief launched pm run ra38826f3c6e2 (pid 3831373, runner pid 3831374), and its requirements read answered 1.15 and 85 ids. That pm is left live by W9b. P0 to P6, B0, W0 to W6, W9, W9b and W10 passed, with no rollback, restore or prune. STATE report: `agents/darkwing/work/window-migrate-3n/STATE.md`.
|
||||
|
||||
## Gitea #1775 (row 270)
|
||||
|
||||
Live as of the migrate window to 464010fbe (activation 20261023T034557Z-464010fbe4c6, 2026-10-23 03:46:02Z UTC), Darkwing operating under Q173 with Mos's W5 go (mos-1404). Row 270 landed with 271 in 7328da8ca, and this window put that landing live: the store is 3n and both units run from NEW's copy. W6 read 26 tables, 97 triggers, 5 views and 28 indexes, nothing missing, events 2202. bus-host/sessions.json is sessionsVersion 2 with 1 session, written by NEW's host at 03:46:01Z. The chief r28dbbc5c6b4d and the pm ra38826f3c6e2 that W9b left live both run on NEW; the pm answered its requirements read with 1.15 and 85 ids. The W10 matrix on 7332 equals the pre-window one, line a healthz 200 ok=true. No rollback, restore or prune. STATE report: `agents/darkwing/work/window-migrate-3n/STATE.md`.
|
||||
|
||||
## P19 (for Sage)
|
||||
|
||||
Migrate window 0cbe2e9b3 to 464010fbe (rows 270 and 271, #1775 and #1776) done on dragon-lin, 2026-10-23, with Darkwing operating under Q173. Activation 20261023T034557Z-464010fbe4c6, pointer at 03:46:02Z UTC. W5 migrated the store 3m to 3n; the backup is SCHEMA 3m, SHA256SUMS 480f5e55. The live store reads 26 tables, 97 triggers, 5 views, 28 indexes, session_ops and message_cancels 0 rows (COUNTED 16), and the tester thread reads match the pre-W5 baseline. The Console on 7332 answers healthz 200 ok=true, and the W10 matrix equals the pre-window one. P0 to P6, B0, W0 to W6, W9, W9b and W10 passed with no rollback, restore or prune. The old chief r148e72c8895d ended with W5's restart; the new chief is r28dbbc5c6b4d. W9b (mos-1392) proved a pm launch on NEW: pm run ra38826f3c6e2 (claude-code), launched by the chief at 03:47:35Z, pid 3831373, runner pid 3831374, left live by W9b. Its requirements read answered 1.15 and 85 ids. The next window's W1 has to expect that pm. STATE: `agents/darkwing/work/window-migrate-3n/STATE.md`.
|
||||
@@ -0,0 +1,16 @@
|
||||
D3 start 2026-10-23T03:40:56.998Z
|
||||
total 1574104
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 22:41 .
|
||||
drwx------ 13 jwoltje jwoltje 4096 Oct 22 22:40 ..
|
||||
-rw------- 1 jwoltje jwoltje 1611837440 Oct 22 22:41 data-root.tar
|
||||
-rw------- 1 jwoltje jwoltje 57 Oct 22 22:41 MEMBERS
|
||||
-rw------- 1 jwoltje jwoltje 80 Oct 22 22:41 SHA256SUMS
|
||||
-rw------- 1 jwoltje jwoltje 25 Oct 22 22:40 STAMP
|
||||
-rw------- 1 jwoltje jwoltje 0 Oct 22 22:40 WARNINGS
|
||||
size 1.6G
|
||||
MEMBERS: members 91612 tar exit 0 sessions.json sessionsVersion 2
|
||||
WARNINGS: 0 line(s)
|
||||
D3 path /home/jwoltje/.mosaic-dev/backups/d3-20261023T034056Z
|
||||
D3 STAMP 2026-10-23T03:40:56.998Z
|
||||
D3 SHA256SUMS sha256 6e5cc74553d32e85b4d1d081764ff5bed22b6ac6265ea304913fe0f617f37ee8
|
||||
D3 end 2026-10-23T03:41:25.271Z D3_PASS
|
||||
@@ -0,0 +1,16 @@
|
||||
D3 start 2026-10-23T03:44:12.165Z
|
||||
total 1580208
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 22:44 .
|
||||
drwx------ 15 jwoltje jwoltje 4096 Oct 22 22:44 ..
|
||||
-rw------- 1 jwoltje jwoltje 1618083840 Oct 22 22:44 data-root.tar
|
||||
-rw------- 1 jwoltje jwoltje 57 Oct 22 22:44 MEMBERS
|
||||
-rw------- 1 jwoltje jwoltje 80 Oct 22 22:44 SHA256SUMS
|
||||
-rw------- 1 jwoltje jwoltje 25 Oct 22 22:44 STAMP
|
||||
-rw------- 1 jwoltje jwoltje 0 Oct 22 22:44 WARNINGS
|
||||
size 1.6G
|
||||
MEMBERS: members 91652 tar exit 0 sessions.json sessionsVersion 2
|
||||
WARNINGS: 0 line(s)
|
||||
D3 path /home/jwoltje/.mosaic-dev/backups/d3-20261023T034412Z
|
||||
D3 STAMP 2026-10-23T03:44:12.165Z
|
||||
D3 SHA256SUMS sha256 eda5be89461d50c49cc3c2f32a03f49d3cd6d3848371e9de2eed183cec7cb74d
|
||||
D3 end 2026-10-23T03:44:32.637Z D3_PASS
|
||||
Executable
+70
@@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), D3: a data-root snapshot (PLAN.md "Schema and backups"), as
|
||||
# window-migrate-0cbe2e9b3/d3.sh. Plain tar and sha256sum, so it runs outside a slot gap (sage-2970). No node, no python, no
|
||||
# store read. The live store isn't in it: a tar of a store the bus is writing isn't a consistent copy, so the
|
||||
# store comes from B0 (before the window) and from W5's own stopped-store backup (after it).
|
||||
# $DATA/backups/d3-<STAMP>/data-root.tar ~/.mosaic-dev without backups/, bus/bus.sqlite{,-wal,-shm},
|
||||
# sockets (tar skips sockets), discord/searxng (a container's
|
||||
# volume, owned by systemd-network, 4.0K) and launches/*/*/tmp
|
||||
# (old runs' sandbox scratch, which holds write-only test files)
|
||||
# $DATA/backups/d3-<STAMP>/SHA256SUMS written from inside the directory, names data-root.tar
|
||||
# $DATA/backups/d3-<STAMP>/STAMP the snapshot's start, from date -u
|
||||
# $DATA/backups/d3-<STAMP>/WARNINGS tar's stderr; "file changed as we read it" lines go to Mos
|
||||
# $DATA/backups/d3-<STAMP>/MEMBERS the member count and the checks below
|
||||
# Nothing live changes. A failed check stops the script.
|
||||
# usage: d3.sh
|
||||
set -uo pipefail
|
||||
umask 077
|
||||
WIN=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n
|
||||
DATA=$HOME/.mosaic-dev
|
||||
sha() { sha256sum < "$1" | cut -c1-64; }
|
||||
stop() { echo "STOP: $*"; exit 1; }
|
||||
|
||||
START=$(date -u +%FT%T.%3NZ)
|
||||
echo "D3 start $START"
|
||||
[ -d "$DATA" ] || stop "no data root"
|
||||
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
|
||||
D=$DATA/backups/d3-$STAMP
|
||||
[ ! -e "$D" ] || stop "$D exists"
|
||||
mkdir -p "$D" || stop "snapshot dir"
|
||||
echo "$START" > "$D/STAMP"
|
||||
# --anchored makes each pattern match only that member path, so a rehearsal's own bus.sqlite stays in.
|
||||
# The last window's first run (d3-20261022T195816Z) stopped on tar exit 2 for 36 unreadable paths under the last
|
||||
# two excludes; that directory is kept, not removed (prune nothing).
|
||||
( tar --create --file "$D/data-root.tar" -C "$HOME" --anchored \
|
||||
--exclude=.mosaic-dev/backups \
|
||||
--exclude=.mosaic-dev/bus/bus.sqlite \
|
||||
--exclude=.mosaic-dev/bus/bus.sqlite-wal \
|
||||
--exclude=.mosaic-dev/bus/bus.sqlite-shm \
|
||||
--exclude=.mosaic-dev/discord/searxng \
|
||||
--exclude='.mosaic-dev/launches/*/*/tmp' \
|
||||
--warning=no-file-ignored \
|
||||
.mosaic-dev ) 2> "$D/WARNINGS"
|
||||
rc=$?
|
||||
# GNU tar: 0 ok, 1 some file changed while read (the archive is still written), 2 fatal.
|
||||
[ "$rc" -le 1 ] || stop "tar exit $rc: $(head -5 "$D/WARNINGS")"
|
||||
tar --list --file "$D/data-root.tar" > "$D/.list" || stop "tar --list"
|
||||
n=$(wc -l < "$D/.list")
|
||||
bad=$(grep -E '^\.mosaic-dev/(backups/|bus/bus\.sqlite(-wal|-shm)?$|discord/searxng|launches/[^/]+/[^/]+/tmp/)' "$D/.list" | head -3)
|
||||
[ -z "$bad" ] || stop "excluded member in the archive: $bad"
|
||||
for m in .mosaic-dev/bus-host/sessions.json .mosaic-dev/state/stack-active.json .mosaic-dev/state/stack-activation-log.jsonl; do
|
||||
grep -qxF "$m" "$D/.list" || stop "member missing: $m"
|
||||
done
|
||||
v=$(tar --extract --to-stdout --file "$D/data-root.tar" .mosaic-dev/bus-host/sessions.json | grep -oE '"sessionsVersion": *[0-9]+' | grep -oE '[0-9]+$')
|
||||
# 0cbe2e9b3's host wrote v2 at the last window's W5; session.mjs is the same at OLD and NEW, so both read it.
|
||||
[ "$v" = 2 ] || stop "the snapshot's sessions.json is sessionsVersion ${v:-unreadable}, not 2"
|
||||
{ echo "members $n"; echo "tar exit $rc"; echo "sessions.json sessionsVersion $v"; } > "$D/MEMBERS"
|
||||
rm -f "$D/.list"
|
||||
chmod 600 "$D/data-root.tar" "$D/STAMP" "$D/WARNINGS" "$D/MEMBERS"
|
||||
( cd "$D" && sha256sum data-root.tar > SHA256SUMS ) || stop "SHA256SUMS"
|
||||
chmod 600 "$D/SHA256SUMS"
|
||||
( cd "$D" && sha256sum -c --quiet SHA256SUMS ) || stop "SHA256SUMS check"
|
||||
echo "D3 $(date -u +%FT%TZ) data-root snapshot $D (STAMP $START, $n members, tar exit $rc, $(wc -l < "$D/WARNINGS") warning line(s)), SHA256SUMS sha256 $(sha "$D/SHA256SUMS")" >> $WIN/backups.txt
|
||||
ls -la "$D"
|
||||
echo "size $(du -h "$D/data-root.tar" | cut -f1)"
|
||||
echo "MEMBERS: $(tr '\n' ' ' < "$D/MEMBERS")"
|
||||
echo "WARNINGS: $(wc -l < "$D/WARNINGS") line(s)"; head -20 "$D/WARNINGS"
|
||||
echo "D3 path $D"
|
||||
echo "D3 STAMP $START"
|
||||
echo "D3 SHA256SUMS sha256 $(sha "$D/SHA256SUMS")"
|
||||
echo "D3 end $(date -u +%FT%T.%3NZ) D3_PASS"
|
||||
@@ -0,0 +1,8 @@
|
||||
# W10 matrix 2026-10-23T03:48:46Z
|
||||
a 200 ok=true
|
||||
b 401 error="sign-in required"
|
||||
c 401 error="sign-in required"
|
||||
d 403 error="proxy Host refused"
|
||||
e 403 error="tester listener required"
|
||||
f 000 non-json 0 bytes
|
||||
g 000 non-json 0 bytes
|
||||
@@ -0,0 +1,7 @@
|
||||
a 200 ok=true
|
||||
b 401 error="sign-in required"
|
||||
c 401 error="sign-in required"
|
||||
d 403 error="proxy Host refused"
|
||||
e 403 error="tester listener required"
|
||||
f 000 non-json 0 bytes
|
||||
g 000 non-json 0 bytes
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), P0 (PLAN.md P0 row; sage-3135, mos-1385). Git reads and sha256sum
|
||||
# only, so it runs before the gap. NEW is the local refactor tip at window start. It must be 253346e3c or a
|
||||
# descendant whose diff from 253346e3c touches no runtime file (only .md, docs/, agents/), and its stack-release.sh
|
||||
# blob must be 7a8c347b2. The plan sha256 Sage and Mos were sent is the argument; PLAN.md must match it. Writes
|
||||
# $WIN/NEW and $WIN/PLAN.sha256 once; refuses if either exists.
|
||||
# usage: p0.sh PLAN_SHA256
|
||||
set -uo pipefail
|
||||
REPO=/mnt/storage/src/mosaic-stack
|
||||
WIN=$REPO/agents/darkwing/work/window-migrate-3n
|
||||
OLD=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
BASE=253346e3c3917d4c9c0f79bc87b7db6aca73180d
|
||||
TOOL_BLOB=7a8c347b2be483c8c2d25a2b75b910ae615319a6
|
||||
WANT=${1:?usage: p0.sh PLAN_SHA256}
|
||||
stop() { echo "STOP: $*"; exit 1; }
|
||||
[ ! -e $WIN/NEW ] && [ ! -e $WIN/PLAN.sha256 ] || stop "NEW or PLAN.sha256 already written"
|
||||
{
|
||||
echo "# P0 $(date -u +%FT%TZ)"
|
||||
have=$(sha256sum < $WIN/PLAN.md | cut -c1-64)
|
||||
echo "plan sha256 $have"
|
||||
[ "$have" = "$WANT" ] || stop "PLAN.md is not $WANT"
|
||||
NEW=$(git -C $REPO rev-parse refactor) || stop "rev-parse refactor"
|
||||
echo "refactor tip $NEW ($(git -C $REPO log -1 --format='%cI %s' $NEW | cut -c1-120))"
|
||||
git -C $REPO merge-base --is-ancestor $BASE $NEW || stop "253346e3c is not an ancestor of $NEW"
|
||||
git -C $REPO merge-base --is-ancestor $OLD $NEW || stop "OLD is not an ancestor of $NEW"
|
||||
run=$(git -C $REPO diff --name-only $BASE $NEW | grep -v -e '\.md$' -e '^docs/' -e '^agents/')
|
||||
echo "commits past 253346e3c: $(git -C $REPO rev-list --count $BASE..$NEW); runtime paths changed since: ${run:-none}"
|
||||
[ -z "$run" ] || stop "NEW changes a runtime path past 253346e3c: $(tr '\n' ' ' <<< "$run")"
|
||||
[ "$(git -C $REPO rev-parse $NEW:scripts/stack-release.sh)" = "$TOOL_BLOB" ] || stop "NEW's stack-release.sh is not 7a8c347b2"
|
||||
echo "commits OLD..NEW: $(git -C $REPO rev-list --count $OLD..$NEW)"
|
||||
echo "$NEW" > $WIN/NEW && echo "$WANT" > $WIN/PLAN.sha256 || stop "write"
|
||||
echo "P0_PASS NEW $NEW"
|
||||
} 2>&1 | tee -a $WIN/p0.txt
|
||||
exit ${PIPESTATUS[0]}
|
||||
@@ -0,0 +1,6 @@
|
||||
# P0 2026-10-23T03:41:34Z
|
||||
plan sha256 e664fa3553f9da0bb29905763011223e69c426a56e484ecfd8181743b7628ad1
|
||||
refactor tip 464010fbe4c6925b077b9b8182a209ee2177eb9d (2026-10-22T22:39:36-05:00 queue: revs 3435-3436. Row 294 (#1800): Duckworth APPROVE c30998 (3435, candidate 0b3f9c9d). R)
|
||||
commits past 253346e3c: 6; runtime paths changed since: none
|
||||
commits OLD..NEW: 94
|
||||
P0_PASS NEW 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
@@ -0,0 +1,21 @@
|
||||
// Migrate window 0cbe2e9b3 to NEW (3m to 3n) (PLAN.md), P1: the live business file, read only. Prints the plan's P1 values and nothing else:
|
||||
// bus.tester, the plug-in lists, launch.by, whether launch.instances includes assistant, and each role's
|
||||
// vars.harness and vars["fallback.harness"]. No other value from the file.
|
||||
import { readFileSync } from 'node:fs';
|
||||
const f = `${process.env.HOME}/.config/mosaic-dev/businesses/mosaic-stack.json`;
|
||||
const b = JSON.parse(readFileSync(f, 'utf8'));
|
||||
console.log(`bus.tester ${JSON.stringify(b.vars?.['bus.tester'])}`);
|
||||
const p = b.plugins ?? {};
|
||||
console.log(`plugins kinds ${JSON.stringify(Object.keys(p).sort())}`);
|
||||
for (const k of ['usage-source', 'channel', 'harness']) console.log(`plugins ${k} ${JSON.stringify(p[k])}`);
|
||||
console.log(`launch.by ${JSON.stringify(b.launch?.by)}`);
|
||||
const inst = b.launch?.instances;
|
||||
const names = Array.isArray(inst) ? inst.map((i) => (typeof i === 'string' ? i : i?.name)) : Object.keys(inst ?? {});
|
||||
console.log(`launch.instances includes assistant ${names.includes('assistant')}`);
|
||||
let pi = 0;
|
||||
for (const [r, v] of Object.entries(b.roles ?? {}).sort()) {
|
||||
const h = v?.vars?.harness, fh = v?.vars?.['fallback.harness'];
|
||||
if (h === 'pi' || fh === 'pi') pi++;
|
||||
console.log(`role ${r} vars.harness ${JSON.stringify(h)}${fh === undefined ? '' : ` fallback.harness ${JSON.stringify(fh)}`}`);
|
||||
}
|
||||
console.log(`roles naming pi ${pi}`);
|
||||
Executable
+33
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), P1 (PLAN.md P1 row; sage-3135). Read only; nothing stopped.
|
||||
# business-check.mjs runs from the repo copy, checked against SCRIPTS.sha256. From the system config this
|
||||
# prints dataRoot and the top-level key names only. Row 270's C1: OLD's loader (0cbe2e9b3's mosaic-config.mjs:246)
|
||||
# accepts configVersion, environment, dataRoot, execution and console and refuses any other key, so federation,
|
||||
# compactionReadBytes or compactionStreams on disk would break a rollback. Either one, or a bus.tester other than
|
||||
# true, stops the window here. A console key is recorded, not stopped on: both loaders accept it.
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
S=$REPO/agents/sage/work/window-plan/repin-de352dfaf BC=$S/business-check.mjs
|
||||
B=$HOME/.config/mosaic-dev/businesses/mosaic-stack.json
|
||||
{ echo "# P1 start $(date -u +%FT%T.%3NZ), REPO HEAD $(git -C $REPO rev-parse HEAD)"
|
||||
echo "# plan sha256 $(sha $PLAN), P0 recorded $PLAN_SHA; NEW $NEW"
|
||||
echo "# business-check.mjs sha256 $(sha256sum < $BC | cut -c1-64); SCRIPTS.sha256 line: $(grep ' business-check.mjs$' $S/SCRIPTS.sha256)"
|
||||
echo "# business file sha256 $(sha256sum < $B | cut -c1-64), mtime $(stat -c %y $B)"; } | tee -a $WIN/P1.txt
|
||||
(cd $S && grep ' business-check.mjs$' SCRIPTS.sha256 | sha256sum -c -) || { echo "STOP business-check.mjs sha mismatch" | tee -a $WIN/P1.txt; exit 1; }
|
||||
$WIN/w.sh P1.txt "P1 status" scripts/stack-release.sh status mosaic-stack
|
||||
$WIN/w.sh P1.txt "P1 values" node $WIN/p1.mjs
|
||||
grep -qx 'bus.tester true' <(node $WIN/p1.mjs) || { echo "STOP bus.tester is not true" | tee -a $WIN/P1.txt; exit 2; }
|
||||
$WIN/w.sh P1.txt "P1 business-check OLD" node $BC $OLD
|
||||
[ "$(sha $PLAN)" = "$PLAN_SHA" ] || { echo "STOP plan sha256 is not P0's" | tee -a $WIN/P1.txt; exit 1; }
|
||||
KEYS=$(node -e 'const c=JSON.parse(require("fs").readFileSync(process.env.HOME+"/.config/mosaic-dev/config.json","utf8"));process.stdout.write(Object.keys(c).sort().join(" "))')
|
||||
{ echo; echo "## P1 config.json top-level key names (C1; names only)"; echo "$KEYS"; } | tee -a $WIN/P1.txt
|
||||
for k in federation compactionReadBytes compactionStreams; do
|
||||
grep -qw -- "$k" <<< "$KEYS" && { echo "STOP config.json holds $k (C1; OLD's loader refuses it, so a rollback would fail)" | tee -a $WIN/P1.txt; exit 3; }
|
||||
done
|
||||
echo "# C1: none of federation, compactionReadBytes, compactionStreams; console key $(grep -qw console <<< "$KEYS" && echo present || echo absent)" | tee -a $WIN/P1.txt
|
||||
DATA=$(node -e 'const c=JSON.parse(require("fs").readFileSync(process.env.HOME+"/.config/mosaic-dev/config.json","utf8"));process.stdout.write(String(c.dataRoot))')
|
||||
DATA=${DATA/#\~/$HOME}
|
||||
{ echo; echo "## P1 data console"; echo "# dataRoot $DATA"
|
||||
echo "# ls -ld \$DATA/console:"; ls -ld "$DATA/console" 2>&1; echo "# ls rc=$?"
|
||||
sock="$DATA/console/tester.sock"; echo "# tester.sock path length $(printf %s "$sock" | wc -c) bytes (limit 107)"
|
||||
echo "# P1 end $(date -u +%FT%T.%3NZ)"; } | tee -a $WIN/P1.txt
|
||||
@@ -0,0 +1,49 @@
|
||||
# P2 unit diffs 2026-10-23T03:42:00Z, REPO HEAD 464010fbe; webui-service.sh and bus-service.sh blobs equal NEW's (P5)
|
||||
## webui: scripts/webui-service.sh render --copy 464010fbe4c6925b077b9b8182a209ee2177eb9d --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket
|
||||
# render rc=0
|
||||
2c2
|
||||
< # Rendered by scripts/webui-service.sh from packages/webui/systemd/; /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0,
|
||||
---
|
||||
> # Rendered by scripts/webui-service.sh from packages/webui/systemd/; /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d,
|
||||
4c4
|
||||
< # /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0 is the read-only copy `install --copy ID` names, and the flags
|
||||
---
|
||||
> # /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d is the read-only copy `install --copy ID` names, and the flags
|
||||
18c18
|
||||
< Documentation=file:///home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/packages/webui/README.md
|
||||
---
|
||||
> Documentation=file:///home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d/packages/webui/README.md
|
||||
24c24
|
||||
< WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
---
|
||||
> WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
29c29
|
||||
< ExecStart=/usr/bin/node /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/packages/webui/src/cli.mjs serve --checkout /mnt/storage/src/mosaic-stack --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket
|
||||
---
|
||||
> ExecStart=/usr/bin/node /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d/packages/webui/src/cli.mjs serve --checkout /mnt/storage/src/mosaic-stack --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket
|
||||
# diff live vs render rc=1
|
||||
## webui diff with the copy path normalized (OLD id -> NEW id in the live unit)
|
||||
# normalized diff rc=0
|
||||
## bus: scripts/bus-service.sh render --copy 464010fbe4c6925b077b9b8182a209ee2177eb9d --pm --claude /home/jwoltje/.local/bin/claude
|
||||
# render rc=0
|
||||
2c2
|
||||
< # Rendered by scripts/bus-service.sh from packages/cli/systemd/; /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0,
|
||||
---
|
||||
> # Rendered by scripts/bus-service.sh from packages/cli/systemd/; /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d,
|
||||
8c8
|
||||
< Documentation=file:///home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/packages/cli/README.md
|
||||
---
|
||||
> Documentation=file:///home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d/packages/cli/README.md
|
||||
14c14
|
||||
< WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
---
|
||||
> WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
30c30
|
||||
< ExecStart=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/scripts/mosaic bus start %i --pm
|
||||
---
|
||||
> ExecStart=/home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d/scripts/mosaic bus start %i --pm
|
||||
# diff live vs render rc=1
|
||||
## bus diff with the copy path normalized (OLD id -> NEW id in the live unit)
|
||||
# normalized diff rc=0
|
||||
# end 2026-10-23T03:42:00Z rc=0
|
||||
P2_UNITS_PASS
|
||||
Executable
+54
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), P2 stub runs (PLAN.md P2 row), as window-migrate-0cbe2e9b3/p2.sh. Launch from /.
|
||||
# Run 1: console-stub.mjs (NEW's startServer, no tester), console-check.sh NEW PORT. Run 2: console-stub-tester.mjs
|
||||
# adds NEW's startTesterSocket on $D/console/tester.sock under a fresh scratch data root; console-check.sh again,
|
||||
# then the socket checks. Both stubs must report CALLS [] on SIGTERM. console-check.sh reads NEW's copy under
|
||||
# the real HOME (W0 made it there) and only reads. Kills only the stub pids it started.
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
S=$REPO/agents/sage/work/window-plan/repin-de352dfaf
|
||||
C=$HOME/.local/share/mosaic-stack/copies/$NEW
|
||||
[ -n "${TMPDIR:-}" ] && [[ "$TMPDIR" == /mnt/storage/scratch/tmp/* ]] || { echo "STOP TMPDIR must be under /mnt/storage/scratch/tmp"; exit 9; }
|
||||
echo "start $(date -u +%FT%TZ)"
|
||||
(cd $S && grep -E ' (console-check.sh)$' SCRIPTS.sha256 | sha256sum -c -) || { echo "STOP console-check.sh sha"; exit 1; }
|
||||
(cd $S/fixture && sha256sum -c SHA256SUMS) || { echo "STOP fixture sha"; exit 1; }
|
||||
rc=0
|
||||
start_stub() { # out-file, then node args; sets spid and port
|
||||
local o="$1"; shift
|
||||
node "$@" > "$o.out" 2> "$o.err" &
|
||||
spid=$!
|
||||
for _ in $(seq 1 50); do grep -q '^PORT ' "$o.out" && break; sleep 0.1; done
|
||||
port=$(sed -n 's/^PORT //p' "$o.out")
|
||||
[ -n "$port" ] || { echo "STOP stub did not start"; cat "$o.err"; kill -TERM $spid 2>/dev/null; wait $spid 2>/dev/null; exit 1; }
|
||||
}
|
||||
stop_stub() { kill -TERM $spid; wait $spid 2>/dev/null; cat "$1.out"; grep -qx 'CALLS \[\]' "$1.out" && echo "PASS CALLS []" || { echo "FAIL CALLS not []"; rc=1; }; }
|
||||
|
||||
echo "## run 1: console-stub.mjs, no tester"
|
||||
O1=$TMPDIR/p2-run1
|
||||
start_stub $O1 $S/fixture/console-stub.mjs $C
|
||||
echo "stub pid $spid port $port"
|
||||
out=$(bash $S/console-check.sh $NEW $port); r=$?; echo "$out"; echo "console-check rc=$r"; [ $r = 0 ] || rc=1
|
||||
stop_stub $O1
|
||||
|
||||
echo "## run 2: console-stub-tester.mjs with --tester-socket's listener under a scratch data root"
|
||||
D=$(mktemp -d /mnt/storage/scratch/tmp/p2tXXXXXX); echo "data root $D"
|
||||
O2=$TMPDIR/p2-run2
|
||||
node $S/fixture/console-stub-tester.mjs $C $D > $O2.out 2> $O2.err &
|
||||
spid=$!
|
||||
for _ in $(seq 1 50); do grep -q '^SOCK ' $O2.out && break; sleep 0.1; done
|
||||
port=$(sed -n 's/^PORT //p' $O2.out); sock=$(sed -n 's/^SOCK //p' $O2.out)
|
||||
[ -n "$port" ] && [ -n "$sock" ] || { echo "STOP tester stub did not start"; cat $O2.err; kill -TERM $spid 2>/dev/null; wait $spid 2>/dev/null; exit 1; }
|
||||
echo "stub pid $spid port $port sock $sock"
|
||||
out=$(bash $S/console-check.sh $NEW $port); r=$?; echo "$out"; echo "console-check rc=$r"; [ $r = 0 ] || rc=1
|
||||
[ "$sock" = "$D/console/tester.sock" ] && echo "PASS SOCK is \$D/console/tester.sock" || { echo "FAIL SOCK $sock"; rc=1; }
|
||||
st=$(stat -c '%F %a' "$sock"); [ "$st" = "socket 600" ] && echo "PASS sock: $st" || { echo "FAIL sock: $st"; rc=1; }
|
||||
dt=$(stat -c '%F %a' "$D/console"); [ "$dt" = "directory 700" ] && echo "PASS console dir: $dt" || { echo "FAIL console dir: $dt"; rc=1; }
|
||||
code=$(curl -s -o /dev/null -w '%{http_code}' --unix-socket "$sock" http://mosaic-tester.invalid/api/config)
|
||||
[ "$code" = 200 ] && echo "PASS tester /api/config over the socket: 200" || { echo "FAIL tester /api/config: $code"; rc=1; }
|
||||
stop_stub $O2
|
||||
[ ! -e "$sock" ] && echo "PASS socket gone after SIGTERM" || { echo "FAIL socket still there"; rc=1; }
|
||||
[ -s $O1.err ] || [ -s $O2.err ] && { echo "# stub stderr:"; cat $O1.err $O2.err; }
|
||||
left=0; for p in /proc/[0-9]*; do c=$(tr '\0' ' ' < $p/cmdline 2>/dev/null); [[ "$c" == *fixture/console-stub* ]] && { echo "LEFT ${p#/proc/} $c"; left=1; }; done
|
||||
[ $left = 0 ] && echo "sweep: no console-stub process left"
|
||||
echo "end $(date -u +%FT%TZ) rc=$rc"; [ $rc = 0 ] && echo P2_STUBS_PASS || echo P2_STUBS_FAIL
|
||||
exit $rc
|
||||
@@ -0,0 +1,38 @@
|
||||
start 2026-10-23T03:41:59Z
|
||||
console-check.sh: OK
|
||||
console-stub.mjs: OK
|
||||
console-stub-tester.mjs: OK
|
||||
## run 1: console-stub.mjs, no tester
|
||||
stub pid 3772158 port 44245
|
||||
PASS markdown-preview.js is served and equals the copy's
|
||||
PASS /api/config on loopback: send=false edit=false
|
||||
PASS project.files through the Console: head=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa files=2 spec=true error=none
|
||||
PASS project.file spec/north-star.md through the Console: commit=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa length=4 error=none
|
||||
PASS loopback save refused: HTTP 403 error=read-only sent=false
|
||||
CONSOLE_PASS
|
||||
console-check rc=0
|
||||
PORT 44245
|
||||
CALLS []
|
||||
PASS CALLS []
|
||||
## run 2: console-stub-tester.mjs with --tester-socket's listener under a scratch data root
|
||||
data root /mnt/storage/scratch/tmp/p2t2B6RcZ
|
||||
stub pid 3772267 port 42563 sock /mnt/storage/scratch/tmp/p2t2B6RcZ/console/tester.sock
|
||||
PASS markdown-preview.js is served and equals the copy's
|
||||
PASS /api/config on loopback: send=false edit=false
|
||||
PASS project.files through the Console: head=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa files=2 spec=true error=none
|
||||
PASS project.file spec/north-star.md through the Console: commit=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa length=4 error=none
|
||||
PASS loopback save refused: HTTP 403 error=read-only sent=false
|
||||
CONSOLE_PASS
|
||||
console-check rc=0
|
||||
PASS SOCK is $D/console/tester.sock
|
||||
PASS sock: socket 600
|
||||
PASS console dir: directory 700
|
||||
PASS tester /api/config over the socket: 200
|
||||
PORT 42563
|
||||
SOCK /mnt/storage/scratch/tmp/p2t2B6RcZ/console/tester.sock
|
||||
CALLS []
|
||||
PASS CALLS []
|
||||
PASS socket gone after SIGTERM
|
||||
sweep: no console-stub process left
|
||||
end 2026-10-23T03:42:00Z rc=0
|
||||
P2_STUBS_PASS
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), P2 second half (PLAN.md P2 row): render both units from REPO's service
|
||||
# scripts for NEW with the pointer's flags, diff against the live units, then diff again with the live copy id
|
||||
# swapped OLD to NEW. The only difference allowed is the copy path, so the swapped diff must be empty.
|
||||
# Output follows last window's p2-units.txt. Render writes nothing and starts nothing; it only looks up node's path.
|
||||
# usage: p2units.sh > p2-units.txt
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
U=${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user
|
||||
rc=0
|
||||
cd $REPO || exit 1
|
||||
git diff --quiet $NEW HEAD -- scripts/webui-service.sh scripts/bus-service.sh || { echo "STOP service scripts differ from NEW"; exit 1; }
|
||||
echo "# P2 unit diffs $(date -u +%FT%TZ), REPO HEAD $(git rev-parse --short=9 HEAD); webui-service.sh and bus-service.sh blobs equal NEW's (P5)"
|
||||
one() { # name, live unit file, render command...
|
||||
local name=$1 live=$2; shift 2
|
||||
local r; r=$(mktemp /mnt/storage/scratch/tmp/p2uXXXXXX)
|
||||
echo "## $name: $*"
|
||||
"$@" > "$r"; local x=$?; echo "# render rc=$x"; [ $x = 0 ] || rc=1
|
||||
diff "$live" "$r"; echo "# diff live vs render rc=$?"
|
||||
echo "## $name diff with the copy path normalized (OLD id -> NEW id in the live unit)"
|
||||
sed "s/$OLD/$NEW/g" "$live" | diff - "$r"; x=$?; echo "# normalized diff rc=$x"; [ $x = 0 ] || rc=1
|
||||
rm -f "$r"
|
||||
}
|
||||
one webui $U/mosaic-webui.service scripts/webui-service.sh render --copy $NEW --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket
|
||||
one bus $U/[email protected] scripts/bus-service.sh render --copy $NEW --pm --claude $HOME/.local/bin/claude
|
||||
echo "# end $(date -u +%FT%TZ) rc=$rc"; [ $rc = 0 ] && echo P2_UNITS_PASS || echo P2_UNITS_FAIL
|
||||
exit $rc
|
||||
@@ -0,0 +1,29 @@
|
||||
decision_events: 22 -> 22
|
||||
decisions: 22 -> 22
|
||||
deliveries: 1935 -> 1935
|
||||
events: 2200 -> 2200
|
||||
gitea_grants: 0 -> 0
|
||||
gitea_users: 0 -> 0
|
||||
host_grants: 0 -> 0
|
||||
hosts: 0 -> 0
|
||||
instance_names: 0 -> 0
|
||||
message_cancels: None -> 0 CHANGED
|
||||
message_threads: 10 -> 10
|
||||
messages: 635 -> 635
|
||||
meta: 3 -> 3
|
||||
projects: 5 -> 5
|
||||
role_claims: 115 -> 115
|
||||
session_defaults: 5 -> 5
|
||||
session_ops: None -> 0 CHANGED
|
||||
sessions: 5 -> 5
|
||||
sqlite_sequence: 14 -> 14
|
||||
task_comment_cursors: 666 -> 666
|
||||
task_snapshots: 577 -> 577
|
||||
thread_claims: 10 -> 10
|
||||
thread_opens: 0 -> 0
|
||||
thread_shares: 0 -> 0
|
||||
threads: 5 -> 5
|
||||
usage_records: 104 -> 104
|
||||
lookalike_action_allowed backup 0 rehearsal 0
|
||||
any_grant_event backup 0 rehearsal 0
|
||||
rc=0
|
||||
@@ -0,0 +1,16 @@
|
||||
import sqlite3, sys, json
|
||||
def counts(p):
|
||||
c = sqlite3.connect(f"file:{p}?mode=ro", uri=True)
|
||||
t = [r[0] for r in c.execute("select name from sqlite_master where type='table' order by name")]
|
||||
out = {n: c.execute(f'select count(*) from "{n}"').fetchone()[0] for n in t}
|
||||
la = c.execute("""select count(*) from events where json_extract(body,'$.action')='action.allowed' and (
|
||||
coalesce(json_extract(body,'$.body.action'),'') like 'grant.%' or coalesce(json_extract(body,'$.body.operation'),'') like 'grant.%'
|
||||
or instr(body,'hostLineLeft')>0)""").fetchone()[0] if 'events' in t else None
|
||||
la2 = c.execute("""select count(*) from events where (json_extract(body,'$.action') like 'grant.%' or json_extract(body,'$.operation') like 'grant.%' or instr(body,'hostLineLeft')>0)""").fetchone()[0]
|
||||
return out, la, la2
|
||||
a, laa, la2a = counts(sys.argv[1]); b, lab, la2b = counts(sys.argv[2])
|
||||
for k in sorted(set(a) | set(b)):
|
||||
mark = '' if a.get(k) == b.get(k) else ' CHANGED'
|
||||
print(f"{k}: {a.get(k)} -> {b.get(k)}{mark}")
|
||||
print("lookalike_action_allowed backup", laa, "rehearsal", lab)
|
||||
print("any_grant_event backup", la2a, "rehearsal", la2b)
|
||||
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), P3 hand check: start the rehearsal store's host (--no-launch) and a
|
||||
# Console on 7341 from NEW's copy against the rehearsal config, read healthz, /api/config and the tester socket,
|
||||
# then stop both and count the receipts. Touches only the rehearsal dir P3 made.
|
||||
# usage: p3/hand-console.sh REHEARSAL_DIR
|
||||
set -u
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
R=${1:?usage: p3/hand-console.sh REHEARSAL_DIR}
|
||||
case "$R" in "$DATA"/rehearsals/*-"${NEW:0:12}") ;; *) echo "STOP: $R is not a rehearsal dir for NEW"; exit 1 ;; esac
|
||||
[ -f "$R/config/config.json" ] || { echo "STOP: no $R/config/config.json"; exit 1; }
|
||||
C=$HOME/.local/share/mosaic-stack/copies/$NEW
|
||||
[ -d "$C" ] || { echo "STOP: no copy for NEW at $C"; exit 1; }
|
||||
E=(env -i HOME="$HOME" PATH="$PATH" MOSAIC_CONFIG="$R/config/config.json")
|
||||
date -u +%FT%TZ
|
||||
echo "receipt lines before: $(wc -l < "$R/data/bus/peercred-starts.jsonl")"
|
||||
"${E[@]}" "$C/scripts/mosaic" bus start mosaic-stack --no-launch > "$R/hand-host.log" 2>&1 & HP=$!
|
||||
for i in $(seq 1 30); do [ -S "$R/data/bus/broker.sock" ] && break; sleep 0.5; done
|
||||
"${E[@]}" node "$C/packages/webui/src/cli.mjs" serve --port 7341 --business mosaic-stack --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket > "$R/hand-console.log" 2>&1 & CP=$!
|
||||
for i in $(seq 1 30); do curl -s -o /dev/null http://127.0.0.1:7341/healthz && [ -S "$R/data/console/tester.sock" ] && break; sleep 0.5; done
|
||||
echo "host pid $HP console pid $CP"
|
||||
echo "healthz: $(curl -s -w ' %{http_code}' http://127.0.0.1:7341/healthz)"
|
||||
echo "api/config: $(curl -s -w ' %{http_code}' http://127.0.0.1:7341/api/config)"
|
||||
echo "api/config Host public: $(curl -s -w ' %{http_code}' -H 'Host: mosaic.woltje.com' http://127.0.0.1:7341/api/config)"
|
||||
stat -c 'socket %a %U %n' "$R/data/console/tester.sock"; stat -c 'dir %a %U %n' "$R/data/console"
|
||||
echo "tester GET /api/config: $("${E[@]}" node "$C/packages/cli/src/tester-http.mjs" GET /api/config 2>&1; echo " rc=$?")"
|
||||
echo "tester GET /api/bus/agents: $("${E[@]}" node "$C/packages/cli/src/tester-http.mjs" GET /api/bus/agents 2>&1 | cut -c1-400; echo " rc=${PIPESTATUS[0]}")"
|
||||
kill -TERM "$CP"; wait "$CP"; echo "console exit $?"
|
||||
kill -TERM "$HP"; wait "$HP"; echo "host exit $?"
|
||||
[ -e "$R/data/bus/writer.lock" ] && echo "writer.lock present" || echo "writer.lock released"
|
||||
echo "receipt lines after: $(wc -l < "$R/data/bus/peercred-starts.jsonl")"
|
||||
echo "library lines: $(grep -c 'library:' "$R/hand-host.log")"
|
||||
date -u +%FT%TZ
|
||||
@@ -0,0 +1,26 @@
|
||||
PASS copy: 464010fbe4c6925b077b9b8182a209ee2177eb9d, schema 3n
|
||||
PASS port: 127.0.0.1:7341 is free
|
||||
PASS backup: /home/jwoltje/.mosaic-dev/backups/b0-20261023T034134Z matches its SHA256SUMS
|
||||
PASS scratch-root: /home/jwoltje/.mosaic-dev/rehearsals/20261023T034320Z-464010fbe4c6/data from the backup, config and business file under /home/jwoltje/.mosaic-dev/rehearsals/20261023T034320Z-464010fbe4c6/config, business.diff beside them
|
||||
PASS data-root-live: /home/jwoltje/.mosaic-dev/rehearsals/20261023T034320Z-464010fbe4c6/data is not the live data root
|
||||
PASS sessions-live: no running session named in the data root
|
||||
PASS data-root-scratch
|
||||
PASS notify-off: binding null, so no Discord bridge
|
||||
PASS tracker-configured: bootConfig sets no trackers
|
||||
PASS credential-ref-live: 9 reference(s), each a placeholder
|
||||
BACKUP_STORE /home/jwoltje/.mosaic-dev/backups/b0-20261023T034134Z schema 3m
|
||||
PASS new-refuses-old-store: 464010fbe4c6925b077b9b8182a209ee2177eb9d refuses the 3m store at a normal open
|
||||
PASS migrate: 3m to 3n
|
||||
PASS new-opens-migrated
|
||||
PASS migrate-again: a second run is a no-op
|
||||
PASS old-refuses-migrated: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 refuses the 3n store
|
||||
PASS gate: host-up, bus-status, console-up, healthz and copy-match on 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
PASS no-session: no sessions.json and no launches under /home/jwoltje/.mosaic-dev/rehearsals/20261023T034320Z-464010fbe4c6/data
|
||||
PASS console-stopped: pid 3785792
|
||||
PASS host-stopped: pid 3785790
|
||||
PASS host-released-store
|
||||
PASS backup-unchanged
|
||||
PASS live-config-unchanged
|
||||
REHEARSAL_PASS
|
||||
rehearsal directory: /home/jwoltje/.mosaic-dev/rehearsals/20261023T034320Z-464010fbe4c6
|
||||
rc=0
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env bash
|
||||
# P4-P6 of agents/darkwing/work/window-migrate-3n/PLAN.md, from window-migrate-0cbe2e9b3/p456.sh, read only.
|
||||
# P4 the tunnel unit, P5 the four REPO scripts against NEW, P6 the 7332 matrix on OLD (matrix-old.txt).
|
||||
# usage: p456.sh p4|p5|p6|tester
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
FILES=("${FOUR[@]}")
|
||||
# The plan's <32 letters>: a fixed dummy, not a secret. matrix-new.txt uses the same value.
|
||||
PROOF=abcdefghijklmnopqrstuvwxyzabcdef
|
||||
|
||||
p4() {
|
||||
echo "# P4 $(date -u +%FT%TZ)"
|
||||
local out; out="$(systemctl --user show mosaic-preview-tunnel.service -p ExecStart -p DropInPaths)"; local rc=$?
|
||||
printf '%s\n' "$out"; echo "# exit $rc"
|
||||
local specs; specs="$(grep -oE 'R:[^ ;]+' <<<"$out")"
|
||||
local n; n="$(grep -c . <<<"$specs")"
|
||||
echo "# R: specs ($n): $(tr '\n' ' ' <<<"$specs")"
|
||||
local drop; drop="$(sed -n 's/^DropInPaths=//p' <<<"$out")"
|
||||
if [[ $rc -eq 0 && $n -eq 1 && "$specs" == "R:0.0.0.0:7332:127.0.0.1:7332" && -z "$drop" ]]; then
|
||||
echo "P4 PASS: one R: spec R:0.0.0.0:7332:127.0.0.1:7332, DropInPaths empty"
|
||||
else
|
||||
echo "P4 FAIL"; return 3
|
||||
fi
|
||||
}
|
||||
|
||||
p5() {
|
||||
echo "# P5 $(date -u +%FT%TZ); HEAD $(git -C $REPO rev-parse HEAD)"
|
||||
git -C $REPO diff --quiet $NEW HEAD -- "${FILES[@]}"; local d=$?
|
||||
echo "# git diff --quiet $NEW HEAD -- ${FILES[*]}: exit $d"
|
||||
local st; st="$(git -C $REPO status --porcelain -- "${FILES[@]}")"; local s=$?
|
||||
echo "# git status --porcelain (exit $s): [${st}]"
|
||||
for f in "${FILES[@]}"; do echo "# $f HEAD blob $(git -C $REPO rev-parse HEAD:$f) NEW blob $(git -C $REPO rev-parse $NEW:$f)"; done
|
||||
if [[ $d -eq 0 && $s -eq 0 && -z "$st" ]]; then echo "P5 PASS"; else echo "P5 FAIL"; return 3; fi
|
||||
}
|
||||
|
||||
# one matrix line: label, then curl arguments; prints "<label> <code> <error or ok field>"
|
||||
req() {
|
||||
local label="$1"; shift
|
||||
local body; body="$(mktemp -p "${TMPDIR:-/tmp}")"
|
||||
local code; code="$(curl -s -m 10 -o "$body" -w '%{http_code}' "$@")"
|
||||
local field; field="$(node -e '
|
||||
let s = require("fs").readFileSync(process.argv[1], "utf8"), j;
|
||||
try { j = JSON.parse(s); } catch { console.log("non-json " + s.length + " bytes"); process.exit(0); }
|
||||
console.log(j.error !== undefined ? "error=" + JSON.stringify(j.error) : "ok=" + JSON.stringify(j.ok));
|
||||
' "$body")"
|
||||
rm -f "$body"
|
||||
echo "$label $code $field"
|
||||
}
|
||||
|
||||
p6() {
|
||||
req a http://127.0.0.1:7332/healthz
|
||||
req b -H 'Host: mosaic.woltje.com' http://127.0.0.1:7332/
|
||||
req c -H 'Host: mosaic.woltje.com' -H "X-Mosaic-Proof: $PROOF" http://127.0.0.1:7332/
|
||||
req d -H 'X-authentik-username: tester-probe' http://127.0.0.1:7332/
|
||||
req e -H 'x-mosaic-tester: 1' http://127.0.0.1:7332/
|
||||
req f -H 'X-authentik-username: tester-probe' http://127.0.0.1:7333/
|
||||
req g -H "X-Mosaic-Proof: $PROOF" http://127.0.0.1:7333/
|
||||
}
|
||||
|
||||
# The two tester reads on OLD, through OLD's tester-http.mjs on $DATA/console/tester.sock (7333 has no listener
|
||||
# since row 196; DEVIATIONS item 1 of the 86f95bb27 window), for W10's reads through NEW's to compare against.
|
||||
# OLD comes from vars.sh: 0cbe2e9b3, the live copy.
|
||||
# Same line shape as w10.sh: status, byte count and sha256 of the body, and for /api/config the whole body
|
||||
# (board, tester, send, edit). /api/bus/agents prints its top-level shape and the agent count only.
|
||||
tread() {
|
||||
local path="$1" out rc
|
||||
out=$(node $HOME/.local/share/mosaic-stack/copies/$OLD/packages/cli/src/tester-http.mjs GET "$path"); rc=$?
|
||||
printf '%s' "$out" | node -e '
|
||||
const r=JSON.parse(require("fs").readFileSync(0,"utf8")),s=r.text,h=require("crypto").createHash("sha256").update(s).digest("hex");
|
||||
const j=r.body,shape=Array.isArray(j)?`array(${j.length})`:j?`keys ${JSON.stringify(Object.keys(j))}`:"non-json";
|
||||
const list=j&&(Array.isArray(j)?j:Array.isArray(j.rows)?j.rows:null);
|
||||
console.log(`${process.argv[1]} ${r.status} ${Buffer.byteLength(s)} bytes sha256 ${h.slice(0,16)} ${shape}`+
|
||||
(process.argv[1]==="/api/config"?` body ${s.trim()}`:list?` agents ${list.length}`:""));' "$path" 2>&1
|
||||
echo "# exit $rc"
|
||||
}
|
||||
|
||||
case "${1:-}" in
|
||||
p4) p4 ;;
|
||||
p5) p5 ;;
|
||||
p6) p6 ;;
|
||||
tester) echo "# P6 tester reads on OLD through the socket $(date -u +%FT%TZ)"; tread /api/config; tread /api/bus/agents ;;
|
||||
*) echo "usage: p456.sh p4|p5|p6|tester" >&2; exit 2 ;;
|
||||
esac
|
||||
@@ -0,0 +1,2 @@
|
||||
STOP: login is not darkwing
|
||||
exit 1
|
||||
@@ -0,0 +1,2 @@
|
||||
STOP: login is not darkwing
|
||||
exit 1
|
||||
@@ -0,0 +1,4 @@
|
||||
login darkwing ok
|
||||
#1776 comment 31009 posted, read back equal 2026-10-23T03:52:34Z
|
||||
#1775 comment 31010 posted, read back equal 2026-10-23T03:52:35Z
|
||||
exit 0
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n) W11: post comments.md's Gitea body on each issue named (the PLAN's W11
|
||||
# row names #1776 for 271's 3m-3n.sql and #1775 for 270) as darkwing, and read each back. Stops at the first miss.
|
||||
# usage: post-gitea.sh N [N ...]
|
||||
set -uo pipefail
|
||||
REPO=/mnt/storage/src/mosaic-stack
|
||||
WIN=$REPO/agents/darkwing/work/window-migrate-3n
|
||||
[ $# -ge 1 ] || { echo "usage: post-gitea.sh N [N ...]"; exit 2; }
|
||||
export MOSAIC_GITEA_CREDENTIAL_FILE=$HOME/.mosaic/fleet/agents/darkwing/secrets/gitea-mosaicstack-darkwing.token
|
||||
G=$REPO/scripts/gitea-api.sh
|
||||
$G GET user 2>/dev/null | grep -q '"login":"darkwing"' || { echo "STOP: login is not darkwing"; exit 1; }
|
||||
echo "login darkwing ok"
|
||||
for N in "$@"; do
|
||||
BODY=$(python3 -B -c '
|
||||
import re,sys
|
||||
s=open(sys.argv[1]).read()
|
||||
m=re.search(r"^## Gitea #"+sys.argv[2]+r" [^\n]*\n\n(.*?)(?=\n## |\Z)",s,re.S|re.M)
|
||||
print(m.group(1).strip().replace("\n"," "),end="")' $WIN/comments.md $N) || { echo "STOP: no body for #$N"; exit 1; }
|
||||
[ -n "$BODY" ] || { echo "STOP: empty body #$N"; exit 1; }
|
||||
J=$(node -e 'process.stdout.write(JSON.stringify({body:process.argv[1]}))' "$BODY")
|
||||
OUT=$($G POST repos/mosaicstack/stack/issues/$N/comments "$J" 2>&1) || { echo "STOP: POST #$N: $(echo "$OUT" | grep -oE 'HTTP [0-9]+')"; exit 1; }
|
||||
CID=$(echo "$OUT" | grep -oE '^\{"id":[0-9]+' | grep -oE '[0-9]+$')
|
||||
[ -n "$CID" ] || CID=$(echo "$OUT" | node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>{const i=d.indexOf("{");process.stdout.write(String(JSON.parse(d.slice(i,d.lastIndexOf("}")+1)).id))})')
|
||||
BACK=$($G GET repos/mosaicstack/stack/issues/comments/$CID 2>/dev/null | node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>process.stdout.write(JSON.parse(d).body))')
|
||||
[ "$BACK" = "$BODY" ] && echo "#$N comment $CID posted, read back equal $(date -u +%FT%TZ)" || { echo "STOP: #$N comment $CID read-back differs"; exit 1; }
|
||||
done
|
||||
@@ -0,0 +1,5 @@
|
||||
# P6 tester reads on OLD through the socket 2026-10-23T03:42:14Z
|
||||
/api/config 200 73 bytes sha256 e7ef9a40a725f356 keys ["board","tester","send","edit"] body {"board":"http://127.0.0.1:7331","tester":true,"send":false,"edit":false}
|
||||
# exit 0
|
||||
/api/bus/agents 200 320 bytes sha256 45b7a973397d13f9 keys ["rows","at"] agents 1
|
||||
# exit 0
|
||||
Executable
+31
@@ -0,0 +1,31 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), the tester thread reads (PLAN.md W6: `threads --tester` and
|
||||
# `thread read --json --tester` on each existing thread). W1 takes them before W5 as the baseline, W6 again after,
|
||||
# and W6 compares. Both verbs only read: thread read pages thread.messages and writes no thread_opens row
|
||||
# (thread.mjs:146, broker.mjs thread.open is the only thread_opens writer). The bodies stay in $WIN/.tr/, which is
|
||||
# not committed; W.txt gets one line per thread: id, message count and the sha256 of the --json output.
|
||||
# usage: tr.sh W1|W6 prints the summary, exits 1 if a read fails
|
||||
set -uo pipefail
|
||||
WIN=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n
|
||||
MOSAIC=$HOME/.npm-global/bin/mosaic
|
||||
BZ=(--business mosaic-stack)
|
||||
P=${1:?usage: tr.sh W1|W6}
|
||||
D=$WIN/.tr/$P
|
||||
[ ! -e "$D" ] || { echo "STOP $D exists"; exit 1; }
|
||||
( umask 077; mkdir -p "$D" ) || exit 1
|
||||
E=(env -i HOME="$HOME" PATH="$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin" LANG=C.UTF-8
|
||||
XDG_RUNTIME_DIR="$XDG_RUNTIME_DIR" DBUS_SESSION_BUS_ADDRESS="${DBUS_SESSION_BUS_ADDRESS:-unix:path=$XDG_RUNTIME_DIR/bus}")
|
||||
cd /mnt/storage/src/mosaic-stack || exit 1
|
||||
"${E[@]}" $MOSAIC threads "${BZ[@]}" --json --tester > "$D/threads.json" 2> "$D/threads.err" || { echo "STOP threads --json --tester: $(head -3 "$D/threads.err")"; exit 1; }
|
||||
ids=$(node -e 'for (const t of JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"))) console.log(t.id)' "$D/threads.json") || { echo "STOP threads.json unreadable"; exit 1; }
|
||||
echo "$P threads --tester: $(grep -c . <<< "$ids") thread(s), threads.json sha256 $(sha256sum < "$D/threads.json" | cut -c1-16)"
|
||||
rc=0
|
||||
for id in $ids; do
|
||||
if "${E[@]}" $MOSAIC thread read "$id" "${BZ[@]}" --json --tester > "$D/$id.json" 2> "$D/$id.err"; then
|
||||
n=$(node -e 'console.log(JSON.parse(require("fs").readFileSync(process.argv[1],"utf8")).length)' "$D/$id.json")
|
||||
echo "$P thread $id messages $n sha256 $(sha256sum < "$D/$id.json" | cut -c1-16)"
|
||||
else
|
||||
echo "$P thread $id READ FAILED: $(head -3 "$D/$id.err")"; rc=1
|
||||
fi
|
||||
done
|
||||
exit $rc
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), the names every step script sources (PLAN.md "Names").
|
||||
# NEW and the plan sha come from the files P0 writes ($WIN/NEW, $WIN/PLAN.sha256); a missing or malformed one stops.
|
||||
REPO=/mnt/storage/src/mosaic-stack
|
||||
WIN=$REPO/agents/darkwing/work/window-migrate-3n
|
||||
OLD=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
BASE=253346e3c3917d4c9c0f79bc87b7db6aca73180d
|
||||
TOOL_BLOB=7a8c347b2be483c8c2d25a2b75b910ae615319a6
|
||||
DATA=$HOME/.mosaic-dev
|
||||
PLAN=$WIN/PLAN.md
|
||||
MOSAIC=$HOME/.npm-global/bin/mosaic
|
||||
FOUR=(scripts/stack-release.sh scripts/webui-service.sh scripts/bus-service.sh scripts/stack-copy.sh)
|
||||
NEW=$(cat $WIN/NEW 2>/dev/null)
|
||||
[[ "$NEW" =~ ^[0-9a-f]{40}$ ]] || { echo "STOP: $WIN/NEW is not a full sha (P0 writes it)"; exit 1; }
|
||||
PLAN_SHA=$(cat $WIN/PLAN.sha256 2>/dev/null)
|
||||
[[ "$PLAN_SHA" =~ ^[0-9a-f]{64}$ ]] || { echo "STOP: $WIN/PLAN.sha256 is not a sha256 (P0 writes it)"; exit 1; }
|
||||
sha() { sha256sum < "$1" | cut -c1-64; }
|
||||
Executable
+16
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n) step wrapper (sage-3135): w.sh FILE TITLE CMD... runs CMD in REPO under a clean env (no ANTHROPIC_*, CLAUDE_*,
|
||||
# MOSAIC_* or pi variables), appends the title, command, output, exit code and date -u stamps to window/FILE,
|
||||
# prints the output, and exits with CMD's exit code.
|
||||
set -uo pipefail
|
||||
W=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n
|
||||
f="$W/$1"; title="$2"; shift 2
|
||||
E=(env -i HOME="$HOME" PATH="$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin" LANG=C.UTF-8
|
||||
XDG_RUNTIME_DIR="$XDG_RUNTIME_DIR" DBUS_SESSION_BUS_ADDRESS="${DBUS_SESSION_BUS_ADDRESS:-unix:path=$XDG_RUNTIME_DIR/bus}")
|
||||
t0=$(date -u +%FT%T.%3NZ)
|
||||
{ echo; echo "## $title"; echo "# start $t0"; echo "# command: (cd \$REPO && <clean env> $*)"; } >> "$f"
|
||||
out=$(cd /mnt/storage/src/mosaic-stack && "${E[@]}" "$@" 2>&1); rc=$?
|
||||
printf '%s\n' "$out" >> "$f"
|
||||
echo "# exit $rc, end $(date -u +%FT%T.%3NZ)" >> "$f"
|
||||
printf '%s\n# exit %s\n' "$out" "$rc"
|
||||
exit $rc
|
||||
@@ -0,0 +1,9 @@
|
||||
npm warn deprecated [email protected]: Use your platform's native DOMException instead
|
||||
|
||||
added 128 packages in 1s
|
||||
npm warn install-scripts 3 packages had install scripts blocked because they are not covered by allowScripts:
|
||||
npm warn install-scripts @google/[email protected] (preinstall: echo 'preinstall: no-op')
|
||||
npm warn install-scripts [email protected] (postinstall: node install.js)
|
||||
npm warn install-scripts [email protected] (postinstall: node scripts/postinstall)
|
||||
npm warn install-scripts
|
||||
npm warn install-scripts Run `npm install-scripts ls` to review, or `npm install-scripts approve <pkg>` to allow.
|
||||
@@ -0,0 +1 @@
|
||||
copied: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
Executable
+29
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), W0 (PLAN.md W0 row): make NEW's copy, then check it, as
|
||||
# window-migrate-0cbe2e9b3/w0.sh. Added: NEW's own loader validates the live system config (row 203 and 270 keys),
|
||||
# stdout discarded as config_checks does. Creates files under copies/ only; nothing live changes. Launch from /.
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
C=$HOME/.local/share/mosaic-stack/copies/$NEW
|
||||
BC=$REPO/agents/sage/work/window-plan/repin-de352dfaf/business-check.mjs
|
||||
fail=0
|
||||
echo "start $(date -u +%FT%TZ)"
|
||||
[ ! -e "$C" ] || { echo "STOP copy $C already exists"; exit 8; }
|
||||
(cd "$REPO" && scripts/stack-copy.sh copy $NEW) > $WIN/w0-copy.out 2> $WIN/w0-copy.err; rc=$?
|
||||
echo "stack-copy rc=$rc"; cat $WIN/w0-copy.out; cat $WIN/w0-copy.err
|
||||
[ "$rc" = 0 ] || { echo "STOP stack-copy failed"; exit 1; }
|
||||
d=$(diff <(git -C "$REPO" show $NEW:package-lock.json) "$C/package-lock.json") && echo "LOCK_MATCH (package-lock diff empty)" || { echo "LOCK_DIFF"; printf '%s\n' "$d" | sed -n 1,20p; fail=1; }
|
||||
[ -d "$C/packages/processing-control" ] && echo "processing-control present: $(ls "$C/packages/processing-control" | tr '\n' ' ')" || { echo "processing-control MISSING"; fail=1; }
|
||||
[ -d "$C/tools/unslop-hook" ] && echo "unslop-hook present: $(ls "$C/tools/unslop-hook" | tr '\n' ' ')" || { echo "unslop-hook MISSING"; fail=1; }
|
||||
want=$(git -C "$REPO" ls-tree $NEW packages/library/bin/askpass | awk '{print $1}')
|
||||
have=$(stat -c %a "$C/packages/library/bin/askpass" 2>&1)
|
||||
echo "askpass tree mode $want, copy mode $have"
|
||||
case "$want:$have" in 100755:[57][0-7][0-7]|100644:[46][0-7][0-7]) echo "ASKPASS_MODE_OK";; *) echo "ASKPASS_MODE_BAD"; fail=1;; esac
|
||||
[ -x "$C/packages/library/bin/askpass" ] && echo "askpass executable bit set" || echo "askpass executable bit not set"
|
||||
(cd "$C" && node -e 'import("oauth4webapi").then(()=>{console.log("oauth4webapi "+require("./node_modules/oauth4webapi/package.json").version);console.log("IMPORT_OK")},(e)=>{console.log("IMPORT_FAIL "+e.message);process.exit(1)})') || fail=1
|
||||
du -sh "$C"; df -h /home | tail -1
|
||||
node $BC $NEW || fail=1
|
||||
v=$(cd "$C" && node scripts/mosaic-config.mjs validate 2>&1 >/dev/null); x=$?
|
||||
[ $x = 0 ] && echo "NEW_LOADER_OK (scripts/mosaic-config.mjs validate on the live config, exit 0)" || { echo "NEW_LOADER_FAIL exit $x: $(head -1 <<< "$v")"; fail=1; }
|
||||
echo "end $(date -u +%FT%TZ) fail=$fail"
|
||||
exit $fail
|
||||
@@ -0,0 +1,28 @@
|
||||
start 2026-10-23T03:41:48Z
|
||||
stack-copy rc=0
|
||||
copied: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
npm warn deprecated [email protected]: Use your platform's native DOMException instead
|
||||
|
||||
added 128 packages in 1s
|
||||
npm warn install-scripts 3 packages had install scripts blocked because they are not covered by allowScripts:
|
||||
npm warn install-scripts @google/[email protected] (preinstall: echo 'preinstall: no-op')
|
||||
npm warn install-scripts [email protected] (postinstall: node install.js)
|
||||
npm warn install-scripts [email protected] (postinstall: node scripts/postinstall)
|
||||
npm warn install-scripts
|
||||
npm warn install-scripts Run `npm install-scripts ls` to review, or `npm install-scripts approve <pkg>` to allow.
|
||||
LOCK_MATCH (package-lock diff empty)
|
||||
processing-control present: package.json README.md src tests
|
||||
unslop-hook present: claude-hook.js extension.ts lists.json README.md test-unslop-check.js unslop-check.js
|
||||
askpass tree mode 100755, copy mode 555
|
||||
ASKPASS_MODE_OK
|
||||
askpass executable bit set
|
||||
oauth4webapi 3.8.8
|
||||
IMPORT_OK
|
||||
164M /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
/dev/nvme1n1p5 458G 401G 34G 93% /home
|
||||
copy 464010fbe: roles 6, projects 1, arbiters 2
|
||||
HOLDS chief instance.name yes
|
||||
HOLDS pm instance.name no
|
||||
LOAD_OK
|
||||
NEW_LOADER_OK (scripts/mosaic-config.mjs validate on the live config, exit 0)
|
||||
end 2026-10-23T03:41:49Z fail=0
|
||||
@@ -0,0 +1,18 @@
|
||||
# W10 start 2026-10-23T03:48:46Z, TMPDIR /mnt/storage/scratch/tmp/gKMdQdA
|
||||
|
||||
## W10 matrix-new.txt vs matrix-old.txt (header lines differ by stamp)
|
||||
(diff exit 0)
|
||||
# matrix: a-g unchanged expected: FAIL=0
|
||||
# listeners on 7333: 0
|
||||
/api/config 200 73 bytes sha256 e7ef9a40a725f356 keys ["board","tester","send","edit"] body {"board":"http://127.0.0.1:7331","tester":true,"send":false,"edit":false} (exit 0)
|
||||
/api/bus/agents 200 709 bytes sha256 bc90ef3c3ae1a464 keys ["rows","at"] agents 2 (exit 0)
|
||||
# tester /api/bus/agents 200, agents 2 (P6: agents 1; the hash moves with the at field)
|
||||
# tester /api/config line identical to tester-old.txt
|
||||
P4 PASS: one R: spec R:0.0.0.0:7332:127.0.0.1:7332, DropInPaths empty
|
||||
POST /api/seen 401 error="sign-in required"
|
||||
POST /api/reply 401 error="sign-in required"
|
||||
POST /api/processing 401 error="sign-in required"
|
||||
tester POST /api/processing 403 error="read-only" sent=false (exit 2)
|
||||
# W10 end 2026-10-23T03:48:47Z FAIL=0
|
||||
W10_PASS
|
||||
w10 exit 0
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), W10 (PLAN.md W10 row), from window-migrate-0cbe2e9b3/w10.sh: the 7332 matrix again as matrix-new.txt against
|
||||
# P6's matrix-old.txt, the two tester reads through NEW's tester-http.mjs against P6's tester-old.txt, no listener
|
||||
# on 7333, P4 again, and the unsigned-write refusal baseline (mos-1195): Console POSTs through the main port with
|
||||
# no session must be refused, /api/processing included. Then POST /api/processing through the tester socket must be
|
||||
# refused 403 read-only (PLAN.md W10): without a session the main port answers 401 before the processing route
|
||||
# runs, so the socket is the path that reaches the read-only refusal. Reads only, apart from the refused POSTs.
|
||||
# Runs after w9.sh. The agents count is compared with the one P6 read into tester-old.txt, not a fixed number
|
||||
# (mos-1344: the old text said "P6: agents 1" where P6 had read 2).
|
||||
# usage: w10.sh
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
C=$HOME/.local/share/mosaic-stack/copies/$NEW
|
||||
W=$WIN/W.txt
|
||||
export TMPDIR=$(mktemp -d /mnt/storage/scratch/tmp/gXXXXXX)
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
stop() { note "STOP: $*"; exit 1; }
|
||||
FAIL=0
|
||||
|
||||
note "W10 start $(date -u +%FT%TZ), TMPDIR $TMPDIR"
|
||||
{ echo "# W10 matrix $(date -u +%FT%TZ)"; bash $WIN/p456.sh p6; } > $WIN/matrix-new.txt
|
||||
{ echo; echo "## W10 matrix-new.txt vs matrix-old.txt (header lines differ by stamp)"; diff <(grep -v '^#' $WIN/matrix-old.txt) <(grep -v '^#' $WIN/matrix-new.txt); echo "(diff exit $?)"; } | tee -a "$W"
|
||||
# Expected: a-g all unchanged. OLD already had the socket, so f and g were 000 at P6 too; no line is named.
|
||||
for l in a b c d e f g; do
|
||||
[ "$(grep "^$l " $WIN/matrix-old.txt)" = "$(grep "^$l " $WIN/matrix-new.txt)" ] || { note "matrix line $l changed"; FAIL=1; }
|
||||
done
|
||||
note "matrix: a-g unchanged expected: FAIL=$FAIL"
|
||||
|
||||
L=$(ss -ltnH 'sport = :7333' | grep -c .)
|
||||
{ echo; echo "## W10 listeners on :7333"; ss -ltnH 'sport = :7333'; echo "count $L"; } >> "$W"
|
||||
note "listeners on 7333: $L"
|
||||
[ "$L" = 0 ] || FAIL=1
|
||||
|
||||
{ echo; echo "## W10 tester reads through $C/packages/cli/src/tester-http.mjs"; } >> "$W"
|
||||
for p in /api/config /api/bus/agents; do
|
||||
out=$(node $C/packages/cli/src/tester-http.mjs GET $p); rc=$?
|
||||
# Same line shape as p456.sh tread (tester-old.txt), computed over the response text.
|
||||
line=$(printf '%s' "$out" | node -e '
|
||||
const r=JSON.parse(require("fs").readFileSync(0,"utf8")),s=r.text,h=require("crypto").createHash("sha256").update(s).digest("hex");
|
||||
const j=r.body,shape=Array.isArray(j)?`array(${j.length})`:j?`keys ${JSON.stringify(Object.keys(j))}`:"non-json";
|
||||
const list=j&&(Array.isArray(j)?j:Array.isArray(j.rows)?j.rows:null);
|
||||
console.log(`${process.argv[1]} ${r.status} ${Buffer.byteLength(s)} bytes sha256 ${h.slice(0,16)} ${shape}`+
|
||||
(process.argv[1]==="/api/config"?` body ${s.trim()}`:list?` agents ${list.length}`:""));' $p 2>&1)
|
||||
echo "$line (exit $rc)" | tee -a "$W"
|
||||
[ $rc = 0 ] || FAIL=1
|
||||
done
|
||||
NEWCFG=$(grep '^/api/config' "$W" | tail -1 | sed 's/ (exit .*//')
|
||||
OLDCFG=$(grep '^/api/config 200 ' $WIN/tester-old.txt)
|
||||
NEWAG=$(grep '^/api/bus/agents' "$W" | tail -1)
|
||||
OLDAG=$(grep '^/api/bus/agents 200 ' $WIN/tester-old.txt | sed -n 's/.* agents \([0-9]*\).*/\1/p')
|
||||
case "$NEWAG" in "/api/bus/agents 200 "*) note "tester /api/bus/agents 200, $(sed -n 's/.* agents \([0-9]*\).*/agents \1/p' <<< "$NEWAG") (P6: agents ${OLDAG:-unread}; the hash moves with the at field)" ;; *) note "tester /api/bus/agents is not 200"; FAIL=1 ;; esac
|
||||
[ "$NEWCFG" = "$OLDCFG" ] && note "tester /api/config line identical to tester-old.txt" || { note "tester /api/config differs from tester-old.txt"; FAIL=1; }
|
||||
|
||||
P4=$(bash $WIN/p456.sh p4); rc=$?
|
||||
{ echo; echo "## W10 P4 again"; echo "$P4"; echo "(p4 exit $rc)"; } >> "$W"
|
||||
echo "$P4" | tail -1
|
||||
[ $rc = 0 ] || FAIL=1
|
||||
|
||||
{ echo; echo "## W10 unsigned writes through the main port (no session, no proxy header; must be refused)"; } >> "$W"
|
||||
for p in /api/seen /api/reply /api/processing; do
|
||||
code=$(curl -s -m 10 -o $TMPDIR/body -w '%{http_code}' -X POST -H 'Host: mosaic.woltje.com' -H 'Content-Type: application/json' --data '{}' http://127.0.0.1:7332$p)
|
||||
err=$(node -e 'try{const j=JSON.parse(require("fs").readFileSync(process.argv[1],"utf8"));console.log("error="+JSON.stringify(j.error))}catch{console.log("non-json")}' $TMPDIR/body)
|
||||
echo "POST $p $code $err" | tee -a "$W"
|
||||
case $code in 401|403) ;; *) FAIL=1 ;; esac
|
||||
done
|
||||
out=$(echo '{}' | node $C/packages/cli/src/tester-http.mjs POST /api/processing); rc=$?
|
||||
line=$(printf '%s' "$out" | node -e '
|
||||
try{const r=JSON.parse(require("fs").readFileSync(0,"utf8"));console.log(`${r.status} error=${JSON.stringify(r.body?.error)} sent=${JSON.stringify(r.body?.sent)}`)}catch{console.log("unreadable")}')
|
||||
echo "tester POST /api/processing $line (exit $rc)" | tee -a "$W"
|
||||
case "$line" in '403 error="read-only" '*) ;; *) FAIL=1 ;; esac
|
||||
rm -rf "$TMPDIR"
|
||||
note "W10 end $(date -u +%FT%TZ) FAIL=$FAIL"
|
||||
[ $FAIL = 0 ] && echo W10_PASS || echo W10_CHECK
|
||||
@@ -0,0 +1,17 @@
|
||||
# W5 go mos-1404, start 2026-10-23T03:45:57Z
|
||||
# condition 3 recheck: tool blob 7a8c347b2be4, plan e664fa35, four scripts clean, pointer on OLD, P2 stubs and units PASS
|
||||
stack-release: interpreter: {"path":"/usr/bin/python3.14","version":[3,14,6],"dev":66308,"ino":3968163,"sha256":"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc"}
|
||||
stack-release: captured the rollback set: /home/jwoltje/.mosaic-dev/state/stack-rollback/20261023T034557Z-464010fbe4c6
|
||||
stack-release: stopped both units
|
||||
stack-release: stopped store schema: 3m
|
||||
stack-release: backup: /home/jwoltje/.mosaic-dev/backups/stack/20261023T034557Z-464010fbe4c6
|
||||
stack-release: migrated the store to 3n
|
||||
stack-release: installed 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
stack-release: gate passed on 464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
stack-release: activate ok: 464010fbe4c6925b077b9b8182a209ee2177eb9d is live for mosaic-stack
|
||||
# exit 0
|
||||
# W5 exit 0, W5.start 2026-10-23T03:45:57Z, end 2026-10-23T03:46:02Z
|
||||
# W5: activation 20261023T034557Z-464010fbe4c6, backup /home/jwoltje/.mosaic-dev/backups/stack/20261023T034557Z-464010fbe4c6, STAMP 2026-10-23T03:45:58.274Z, SCHEMA 3m, SHA256SUMS sha256 480f5e556d02d3f079c07782af204c0a41e44fb4633064e1d7c302e473be1390 (sums check OK)
|
||||
# W5 launched lines in the bus journal since W5.start: 1: launched chief: run r28dbbc5c6b4d, claude-code claude-opus-5-5
|
||||
# W5 status: pointer NEW, pm true, 3n, check pass, unit flags match. W5_PASS 2026-10-23T03:46:02Z
|
||||
# W5 restore plan exit 0: restore: the store must go back to 3m; needs --restore 20261023T034557Z-464010fbe4c6
|
||||
Executable
+59
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), W5 (PLAN.md W5 row; window-migrate-0cbe2e9b3/w5.sh). Runs only on Mos's W5 go and Sage's
|
||||
# CLEAR, after P2 passed. Rechecks the tool blob and the plan sha first; if either moved, stop (W3 runs again and goes
|
||||
# to Mos). Then W3's command without --plan, --migrate included, through w.sh into W5.txt. Needs exit 0, "activate
|
||||
# ok", "gate passed" (the gate's last check is pm-launch-unconfirmed, so a pass covers pm_launched), "stopped store
|
||||
# schema: 3m" and "migrated the store to 3n". Records the activation id, backup path, STAMP and the backup's
|
||||
# SHA256SUMS sha256, then status (schema 3n), then `rollback --restore <ACT> --plan`, which only reads, for the
|
||||
# guard's post-backup count. That plan refuses post-backup-events when the count is nonzero; the script records it
|
||||
# and doesn't stop. A failure stops here and goes to Mos before any rollback.
|
||||
# usage: w5.sh GO (GO is Mos's W5 go label, e.g. mos-NNNN)
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
W=$WIN/W.txt
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
stop() { note "STOP: $*"; exit 1; }
|
||||
|
||||
GO=${1:?usage: w5.sh GO}
|
||||
note "W5 go $GO, start $(date -u +%FT%TZ)"
|
||||
grep -q P2_STUBS_PASS $WIN/p2.txt 2>/dev/null || stop "p2.txt has no P2_STUBS_PASS"
|
||||
grep -q P2_UNITS_PASS $WIN/p2-units.txt 2>/dev/null || stop "p2-units.txt has no P2_UNITS_PASS"
|
||||
grep -q 'W5 pre-read PASS' $W || stop "W.txt has no W5 pre-read PASS (w5pre.sh)"
|
||||
[ "$(git -C $REPO rev-parse HEAD:scripts/stack-release.sh)" = "$TOOL_BLOB" ] || stop "condition 3: tool blob moved; run W3 again and send it to Mos"
|
||||
[ "$(sha $PLAN)" = "$PLAN_SHA" ] || stop "condition 3: plan is not P0's ${PLAN_SHA:0:8}; run W3 again and send it to Mos"
|
||||
[ -z "$(git -C $REPO status --porcelain -- "${FOUR[@]}")" ] || stop "the four scripts are dirty"
|
||||
grep -q "\"copy\":\"$OLD\"" $DATA/state/stack-active.json || stop "the pointer is not on OLD"
|
||||
note "condition 3 recheck: tool blob ${TOOL_BLOB:0:12}, plan ${PLAN_SHA:0:8}, four scripts clean, pointer on OLD, P2 stubs and units PASS"
|
||||
|
||||
date -u +%FT%TZ > $WIN/W5.start
|
||||
$WIN/w.sh W5.txt "W5 activate NEW --pm --migrate --tester-socket ($GO)" scripts/stack-release.sh activate $NEW mosaic-stack --pm --migrate --tester-socket; rc=$?
|
||||
note "W5 exit $rc, W5.start $(cat $WIN/W5.start), end $(date -u +%FT%TZ)"
|
||||
[ $rc = 0 ] || stop "W5 exit $rc; to Mos before any rollback"
|
||||
grep -q "activate ok: $NEW is live for mosaic-stack" $WIN/W5.txt || stop "W5: no activate ok line"
|
||||
grep -q "gate passed on $NEW" $WIN/W5.txt || stop "W5: no gate passed line"
|
||||
grep -qx "stack-release: stopped store schema: 3m" $WIN/W5.txt || stop "W5: no stopped store schema: 3m line"
|
||||
grep -qx "stack-release: migrated the store to 3n" $WIN/W5.txt || stop "W5: no migrated the store to 3n line"
|
||||
grep -q -- 'drop --' $WIN/W5.txt && stop "W5: a drop line"
|
||||
|
||||
ACT=$(sed -n 's/.*"activation":"\([^"]*\)".*/\1/p' $DATA/state/stack-active.json)
|
||||
BK=$(sed -n 's/^stack-release: backup: //p' $WIN/W5.txt)
|
||||
[ -n "$ACT" ] && [ "$BK" = "$DATA/backups/stack/$ACT" ] || stop "W5: activation $ACT and backup $BK disagree"
|
||||
[ "$(cat $BK/SCHEMA)" = 3m ] || stop "W5 backup SCHEMA is not 3m"
|
||||
( cd "$BK/bus" && sha256sum -c --quiet ../SHA256SUMS ) || stop "W5 backup fails its SHA256SUMS"
|
||||
echo "W5 $(date -u +%FT%TZ) activation $ACT backup $BK STAMP $(cat $BK/STAMP) SCHEMA $(cat $BK/SCHEMA) SHA256SUMS sha256 $(sha $BK/SHA256SUMS)" >> $WIN/backups.txt
|
||||
note "W5: activation $ACT, backup $BK, STAMP $(cat $BK/STAMP), SCHEMA $(cat $BK/SCHEMA), SHA256SUMS sha256 $(sha $BK/SHA256SUMS) (sums check OK)"
|
||||
|
||||
journalctl --user -u [email protected] --since "@$(date -d "$(cat $WIN/W5.start)" +%s)" -o cat 2>/dev/null | grep '^launched ' > $WIN/W5-launched.txt
|
||||
note "W5 launched lines in the bus journal since W5.start: $(wc -l < $WIN/W5-launched.txt): $(cat $WIN/W5-launched.txt)"
|
||||
|
||||
$WIN/w.sh W.txt "W5 status" scripts/stack-release.sh status mosaic-stack > $WIN/W5-status.txt || stop "W5 status"
|
||||
sed -i '$d' $WIN/W5-status.txt
|
||||
grep -q "\"copy\":\"$NEW\"" $WIN/W5-status.txt || stop "status: pointer is not NEW"
|
||||
grep -q '"pm":true' $WIN/W5-status.txt && grep -q '"schema":"3n"' $WIN/W5-status.txt || stop "status: pm or schema"
|
||||
grep -qx ' result: pass' $WIN/W5-status.txt && grep -qx 'unit flags: match the pointer' $WIN/W5-status.txt || stop "status: check or unit flags"
|
||||
note "W5 status: pointer NEW, pm true, 3n, check pass, unit flags match. W5_PASS $(date -u +%FT%TZ)"
|
||||
|
||||
# The restore guard's count, read only. Any real restore goes to Mos first (PLAN.md, Stop conditions).
|
||||
$WIN/w.sh W.txt "W5 rollback --restore $ACT --plan (read only)" scripts/stack-release.sh rollback mosaic-stack --restore $ACT --plan > $WIN/W5-restore-plan.txt; rrc=$?
|
||||
sed -i '$d' $WIN/W5-restore-plan.txt
|
||||
note "W5 restore plan exit $rrc: $(grep '^restore: \|post-backup-events' $WIN/W5-restore-plan.txt | tr '\n' ' ')"
|
||||
@@ -0,0 +1,4 @@
|
||||
# W5 pre-read start 2026-10-23T03:45:42Z
|
||||
# W5 pre-read PASS 2026-10-23T03:45:42Z: chief r148e72c8895d standing, not working; no pm, no other launch
|
||||
# W5 pre-read start 2026-10-23T03:45:57Z
|
||||
# W5 pre-read PASS 2026-10-23T03:45:57Z: chief r148e72c8895d standing, not working; no pm, no other launch
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), the read right before W5 (as mos-1342 condition 1): agents --tester
|
||||
# and launches list again, with W1's rule. Stops on the chief working, the pm working, or any live launch other
|
||||
# than the standing chief r148e72c8895d. Starts and stops nothing.
|
||||
# usage: w5pre.sh
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
W=$WIN/W.txt
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
stop() { note "STOP: $*"; exit 1; }
|
||||
CHIEF_RUN=r148e72c8895d
|
||||
|
||||
note "W5 pre-read start $(date -u +%FT%TZ)"
|
||||
$WIN/w.sh W.txt "W5 pre agents --tester" $MOSAIC agents --business mosaic-stack --tester > $WIN/.w5pre-agents.txt || stop "W5 pre agents"
|
||||
grep -E '(^|[[:space:]])chief[[:space:]].*working' $WIN/.w5pre-agents.txt && stop "W5 pre: the chief is working (mos-1340 item 2)"
|
||||
grep -E '(^|[[:space:]])pm[[:space:]].*working' $WIN/.w5pre-agents.txt && stop "W5 pre: the pm is working (mos-1340 item 3)"
|
||||
$WIN/w.sh W.txt "W5 pre launches list" $MOSAIC launches list > $WIN/.w5pre-launches.txt || stop "W5 pre launches list"
|
||||
other=$(grep -v '^# ' $WIN/.w5pre-launches.txt | grep -v -e "^$CHIEF_RUN " | grep .)
|
||||
[ -z "$other" ] || stop "W5 pre: a live launch other than the standing chief $CHIEF_RUN (mos-1340 item 1): $other"
|
||||
grep -q "^$CHIEF_RUN mosaic-stack/chief " $WIN/.w5pre-launches.txt || stop "W5 pre: the standing chief launch $CHIEF_RUN is not listed"
|
||||
note "W5 pre-read PASS $(date -u +%FT%TZ): chief $CHIEF_RUN standing, not working; no pm, no other launch"
|
||||
@@ -0,0 +1,18 @@
|
||||
# W6 start 2026-10-23T03:46:51Z
|
||||
# W6 status: "copy":"464010fbe4c6925b077b9b8182a209ee2177eb9d" "pm":true "schema":"3n"
|
||||
types table=26 trigger=97 view=5 index=28
|
||||
schema_version 3n
|
||||
missing none
|
||||
new_table_rows session_ops=0 message_cancels=0 thread_shares 0
|
||||
events 2202 maxSeq 2202
|
||||
COUNTS_OK
|
||||
# W6 agents: chief r28dbbc5c6b4d claude-code since 2026-10-23T03:46:01.235Z;
|
||||
W6 threads --tester: 5 thread(s), threads.json sha256 07c154d75d929028
|
||||
W6 thread d0ba7a66-aa3f-4918-9518-94132bce6b28 messages 2 sha256 985ac61ca9220f2f
|
||||
W6 thread 446201de-e8b5-4df3-9356-d0d5422cc899 messages 2 sha256 7e7e9eeeaa8c1e09
|
||||
W6 thread b89fcca4-6b82-48bd-9310-fb82c5ae8518 messages 2 sha256 f4e4916b9656a403
|
||||
W6 thread d9bb7ff3-7a8b-4bb8-ba12-03ca094cee4e messages 2 sha256 728ff36f3e003c63
|
||||
W6 thread b85a57fe-84f9-4785-a596-135af39e334a messages 2 sha256 727de0d9c809a41a
|
||||
# W6 thread reads match W1: 5 threads, same ids, message counts and sha256
|
||||
# W6 bus-host/sessions.json: sessionsVersion and session count: 2 1; mtime 2026-10-23T03:46:01Z
|
||||
# W6_PASS 2026-10-23T03:46:56Z
|
||||
Executable
+80
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), W6 (PLAN.md W6 row; window-migrate-0cbe2e9b3/w6.sh with the 3n
|
||||
# counts; mos-1342 condition 3 lets it run straight after a W5 pass). Everything here only reads:
|
||||
# status shows the pointer on NEW at 3n
|
||||
# a python3 -B read-only count of the live store: 26 tables, 97 triggers, 5 views, 28 indexes (3m's 24/90/5/25
|
||||
# plus 3m-3n.sql: session_ops and message_cancels, 7 triggers, session_ops_session and the two UNIQUE
|
||||
# autoindexes), meta schema_version 3n, every 3n object by name and 3m's thread_shares set, and 0 rows in
|
||||
# session_ops and message_cancels (only session.clear and session.cancel write them; nobody runs those here)
|
||||
# agents --tester answers
|
||||
# tr.sh W6 against W1: the same thread ids, message counts and sha256 of each thread read --json
|
||||
# bus-host/sessions.json sessionsVersion 2 (it was 2 before the window; session.mjs is the same OLD to NEW);
|
||||
# only the version and the count
|
||||
# Since nothing changes, every check runs and the script lists each FAIL, then exits 1 if any failed. A failure
|
||||
# goes to Mos; nothing restores from here.
|
||||
# usage: w6.sh
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
W=$WIN/W.txt
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
fails=0
|
||||
fail() { note "W6 FAIL: $*"; fails=$((fails + 1)); }
|
||||
|
||||
note "W6 start $(date -u +%FT%TZ)"
|
||||
grep -q 'W5_PASS' $W || { note "STOP: W.txt has no W5_PASS"; exit 1; }
|
||||
|
||||
$WIN/w.sh W.txt "W6 status" scripts/stack-release.sh status mosaic-stack > $WIN/W6-status.txt || fail "status exit nonzero"
|
||||
grep -q "\"copy\":\"$NEW\"" $WIN/W6-status.txt || fail "status: pointer is not NEW"
|
||||
grep -q '"schema":"3n"' $WIN/W6-status.txt || fail "status: schema is not 3n"
|
||||
grep -qx ' result: pass' $WIN/W6-status.txt || fail "status: check is not pass"
|
||||
note "W6 status: $(grep -o '"copy":"[^"]*"\|"schema":"[^"]*"\|"pm":[a-z]*' $WIN/W6-status.txt | tr '\n' ' ')"
|
||||
|
||||
python3 -B - "$DATA/bus/bus.sqlite" > $WIN/W6-counts.txt 2>&1 <<'PY'
|
||||
import sqlite3, sys
|
||||
c = sqlite3.connect("file:" + sys.argv[1] + "?mode=ro", uri=True)
|
||||
types = dict(c.execute("select type, count(*) from sqlite_master group by type").fetchall())
|
||||
names = {r[0] for r in c.execute("select name from sqlite_master")}
|
||||
sv = c.execute("select value from meta where key='schema_version'").fetchone()
|
||||
want = ["thread_shares", "thread_shares_thread", "thread_shares_no_update", "thread_shares_no_delete", "thread_shares_no_replace",
|
||||
"session_ops", "message_cancels", "session_ops_session",
|
||||
"session_ops_no_update", "session_ops_no_delete", "session_ops_no_replace", "session_ops_one_open",
|
||||
"message_cancels_no_update", "message_cancels_no_delete", "message_cancels_no_replace"]
|
||||
def rc(t):
|
||||
return c.execute(f"select count(*) from {t}").fetchone()[0] if t in names else None
|
||||
rows = {t: rc(t) for t in ("session_ops", "message_cancels")}
|
||||
ev = c.execute("select count(*), max(seq) from events").fetchone()
|
||||
print("types", " ".join(f"{k}={types.get(k)}" for k in ("table", "trigger", "view", "index")))
|
||||
print("schema_version", sv[0] if sv else None)
|
||||
print("missing", " ".join(n for n in want if n not in names) or "none")
|
||||
print("new_table_rows", " ".join(f"{k}={v}" for k, v in rows.items()), "thread_shares", rc("thread_shares"))
|
||||
print("events", ev[0], "maxSeq", ev[1])
|
||||
ok = (types.get("table"), types.get("trigger"), types.get("view"), types.get("index")) == (26, 97, 5, 28) \
|
||||
and sv and sv[0] == "3n" and all(n in names for n in want) and all(v == 0 for v in rows.values())
|
||||
print("COUNTS_OK" if ok else "COUNTS_BAD")
|
||||
PY
|
||||
crc=$?
|
||||
{ echo; echo "## W6 live store count (python3 -B, mode=ro)"; cat $WIN/W6-counts.txt; echo "# exit $crc"; } >> $W
|
||||
cat $WIN/W6-counts.txt
|
||||
grep -qx COUNTS_OK $WIN/W6-counts.txt || fail "store count: $(grep -v '^COUNTS' $WIN/W6-counts.txt | tr '\n' ';')"
|
||||
|
||||
$WIN/w.sh W.txt "W6 agents --tester" $MOSAIC agents --business mosaic-stack --tester > $WIN/.w6-agents.txt || fail "agents --tester exit nonzero"
|
||||
note "W6 agents: $(grep -v '^# ' $WIN/.w6-agents.txt | tr '\n' ';')"
|
||||
|
||||
bash $WIN/tr.sh W6 > $WIN/.w6-tr.txt 2>&1; trc=$?
|
||||
{ echo; echo "## W6 tester thread reads (tr.sh W6)"; cat $WIN/.w6-tr.txt; echo "# exit $trc"; } >> $W; cat $WIN/.w6-tr.txt
|
||||
[ $trc = 0 ] || fail "tr.sh W6 exit $trc"
|
||||
a=$(sed -n 's/^W1 thread //p' $WIN/.w1-tr.txt | sort); b=$(sed -n 's/^W6 thread //p' $WIN/.w6-tr.txt | sort)
|
||||
if [ -n "$a" ] && [ "$a" = "$b" ]; then
|
||||
note "W6 thread reads match W1: $(grep -c . <<< "$a") threads, same ids, message counts and sha256"
|
||||
else
|
||||
fail "thread reads differ from W1: $(diff <(echo "$a") <(echo "$b") | grep '^[<>]' | tr '\n' ';')"
|
||||
fi
|
||||
|
||||
sv=$(python3 -B -c '
|
||||
import json, sys
|
||||
d = json.load(open(sys.argv[1]))
|
||||
print(d.get("sessionsVersion"), len(d.get("sessions") or []))' $DATA/bus-host/sessions.json 2>&1)
|
||||
note "W6 bus-host/sessions.json: sessionsVersion and session count: $sv; mtime $(date -u -r $DATA/bus-host/sessions.json +%FT%TZ)"
|
||||
case "$sv" in "2 "*) ;; *) fail "sessions.json is not version 2: $sv" ;; esac
|
||||
|
||||
if [ $fails = 0 ]; then note "W6_PASS $(date -u +%FT%TZ)"; else note "W6 end $(date -u +%FT%TZ): $fails FAIL(s), to Mos"; exit 1; fi
|
||||
@@ -0,0 +1,63 @@
|
||||
# W9 after W5, W5.start 2026-10-23T03:45:57Z, start 2026-10-23T03:47:16Z
|
||||
# plan e664fa35, tool blob 7a8c347b2be4, console-check.sh d068fe02, wrapper on NEW: checked
|
||||
# Console: unit active, pid 3811007, started 2026-10-23T03:45:59Z, cwd /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
# bus: unit active, pid 3811005, cwd /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"464010fbe4c6925b077b9b8182a209ee2177eb9d","business":"mosaic-stack","pm":true,"claude":"/home/jwoltje/.local/bin/claude","console":["--port","7332","--public-host","mosaic.woltje.com","--auth-header","X-authentik-username","--allow-user","jason.woltje","--tester-socket"],"schema":"3n","activation":"20261023T034557Z-464010fbe4c6","at":"2026-10-23T03:46:02Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-22T15:06:00Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":"20261022T150555Z-84f53540dd0d","activation":"20261022T150555Z-84f53540dd0d","result":"ok"}
|
||||
{"at":"2026-10-22T20:16:21Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":null,"activation":"20261022T201621Z-0cbe2e9b35e5","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T20:16:24Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":"20261022T201621Z-0cbe2e9b35e5","activation":"20261022T201621Z-0cbe2e9b35e5","result":"ok"}
|
||||
{"at":"2026-10-23T03:45:57Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":null,"activation":"20261023T034557Z-464010fbe4c6","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-23T03:46:02Z","op":"activate","from":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","to":"464010fbe4c6925b077b9b8182a209ee2177eb9d","backup":"20261023T034557Z-464010fbe4c6","activation":"20261023T034557Z-464010fbe4c6","result":"ok"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/464010fbe4c6925b077b9b8182a209ee2177eb9d
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3811005, running, since 2026-10-23T03:45:59.548Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3811049
|
||||
boot: organization file loaded at 2026-10-23T03:45:59.547Z
|
||||
unit flags: match the pointer
|
||||
drift: 0 commit(s) on refactor since the pointer's copy
|
||||
# exit 0
|
||||
PASS markdown-preview.js is served and equals the copy's
|
||||
PASS /api/config on loopback: send=false edit=false
|
||||
PASS project.files through the Console: head=ae0b17c9586e51da7bc1b7e548c6acf913a55665 files=2 spec=true error=none
|
||||
PASS project.file spec/north-star.md through the Console: commit=ae0b17c9586e51da7bc1b7e548c6acf913a55665 length=99 error=none
|
||||
PASS loopback save refused: HTTP 403 error=read-only sent=false
|
||||
CONSOLE_PASS
|
||||
# exit 0
|
||||
# journal since W5: proxy proof off 1, Sign-in 0
|
||||
# console/ drwx------ jwoltje directory; tester.sock srw------- jwoltje socket
|
||||
# peercred-starts lines since W5 naming NEW: 1
|
||||
# bus journal library: 0
|
||||
r28dbbc5c6b4d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-23T03:46:01.221Z running
|
||||
# exit 0
|
||||
[
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"instance": "chief",
|
||||
"run": "r28dbbc5c6b4d",
|
||||
"launchedBy": "jason",
|
||||
"harness": "claude-code",
|
||||
"model": "claude-opus-5-5",
|
||||
"provider": "anthropic",
|
||||
"modelKey": "opus",
|
||||
"pid": 3811352,
|
||||
"startTime": "82835140",
|
||||
"runnerPid": 3811353,
|
||||
"runnerStartTime": "82835140",
|
||||
"runDir": "/home/jwoltje/.mosaic-dev/launches/mosaic-stack/r28dbbc5c6b4d",
|
||||
"startedAt": "2026-10-23T03:46:01.221Z",
|
||||
"live": true
|
||||
}
|
||||
]
|
||||
# exit 0
|
||||
# one running chief from this start: run r28dbbc5c6b4d
|
||||
# pm: no pm launch is listed, as expected (none live since the last window; mos-1344)
|
||||
chief r28dbbc5c6b4d claude-code since 2026-10-23T03:46:01.235Z
|
||||
# exit 0
|
||||
# W9 end 2026-10-23T03:47:17Z W9_CHECKS_PASS
|
||||
Executable
+96
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), W9 (PLAN.md W9 row). Taken from window-migrate-0cbe2e9b3/w9.sh with
|
||||
# the mos-1344 carry: the tester pm read is gone, since no pm is live (a pm launch on NEW is W9b, only on Mos's
|
||||
# ruling). The checks are the same: mos-1338 item 4 (the Console's unit state, MainPID, start time and cwd; a miss
|
||||
# stops and goes to Mos, who restarts it, never me), status at 3n, console-check, the webui journal counts, the
|
||||
# tester socket modes, peercred-starts, the bus library: lines, one running chief from this start, no pm launch,
|
||||
# and the chief not working. Every call goes through w.sh into W.txt; every bus call carries --tester. A failed
|
||||
# check stops the script.
|
||||
# usage: w9.sh
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
W5_ISO=$(cat $WIN/W5.start) || exit 1
|
||||
W5_STAMP="$(date -u -d "$W5_ISO" '+%F %T') UTC"
|
||||
W5_S=$(date -d "$W5_ISO" +%s)
|
||||
CC=$REPO/agents/sage/work/window-plan/repin-de352dfaf/console-check.sh
|
||||
CC_SHA=d068fe02da897b700110a162d13d9671fe5994f053c45aff99113fade737094c
|
||||
COPY=$HOME/.local/share/mosaic-stack/copies/$NEW
|
||||
BZ=(--business mosaic-stack)
|
||||
W=$WIN/W.txt
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
stop() { note "STOP: $*"; exit 1; }
|
||||
step() { local f="$1"; shift; $WIN/w.sh W.txt "$@" > "$WIN/$f"; local rc=$?; cat "$WIN/$f"; return $rc; }
|
||||
|
||||
note "W9 after W5, W5.start $W5_ISO, start $(date -u +%FT%TZ)"
|
||||
[ "$(sha $PLAN)" = "$PLAN_SHA" ] || stop "the plan file is not P0's ${PLAN_SHA:0:8}"
|
||||
git -C $REPO rev-parse HEAD:scripts/stack-release.sh | grep -q "^$TOOL_BLOB" || stop "tool blob moved"
|
||||
[ "$(sha $CC)" = "$CC_SHA" ] || stop "console-check.sh is not d068fe02"
|
||||
grep -q "/copies/$NEW/scripts/mosaic" "$MOSAIC" || stop "the wrapper is not pinned to NEW"
|
||||
note "plan ${PLAN_SHA:0:8}, tool blob ${TOOL_BLOB:0:12}, console-check.sh d068fe02, wrapper on NEW: checked"
|
||||
|
||||
# mos-1338 item 4: the Console unit, pid, start time and cwd. A miss stops here and goes to Mos.
|
||||
U_ACTIVE=$(systemctl --user is-active mosaic-webui.service)
|
||||
CONSOLE_PID=$(systemctl --user show -p MainPID --value mosaic-webui.service)
|
||||
U_START=$(systemctl --user show -p ExecMainStartTimestamp --value mosaic-webui.service)
|
||||
U_START_S=$(date -d "$U_START" +%s 2>/dev/null || echo 0)
|
||||
P_START=$(ps -o lstart= -p "$CONSOLE_PID" 2>/dev/null)
|
||||
CWD=$(readlink /proc/$CONSOLE_PID/cwd 2>/dev/null)
|
||||
{ echo; echo "## W9 Console unit (mos-1338 item 4)"; echo "is-active $U_ACTIVE, MainPID $CONSOLE_PID"
|
||||
echo "ExecMainStartTimestamp $U_START ($(date -u -d @$U_START_S +%FT%TZ)), ps lstart $P_START"; echo "cwd -> $CWD"; } >> "$W"
|
||||
note "Console: unit $U_ACTIVE, pid $CONSOLE_PID, started $(date -u -d @$U_START_S +%FT%TZ), cwd $CWD"
|
||||
[ "$U_ACTIVE" = active ] || stop "mosaic-webui is $U_ACTIVE, not active (mos-1338 item 4; to Mos, who restarts it)"
|
||||
[ -n "$CONSOLE_PID" ] && [ "$CONSOLE_PID" != 0 ] || stop "no Console MainPID (to Mos)"
|
||||
[ "$U_START_S" -ge "$W5_S" ] || stop "the Console started $(date -u -d @$U_START_S +%FT%TZ), before W5.start $W5_ISO (mos-1338 item 4; to Mos)"
|
||||
[ "$CWD" = "$COPY" ] || stop "Console cwd is not the NEW copy (mos-1338 item 4; to Mos)"
|
||||
BUS_PID=$(systemctl --user show -p MainPID --value [email protected])
|
||||
BUS_CWD=$(readlink /proc/$BUS_PID/cwd 2>/dev/null)
|
||||
note "bus: unit $(systemctl --user is-active [email protected]), pid $BUS_PID, cwd $BUS_CWD"
|
||||
[ "$BUS_CWD" = "$COPY" ] || stop "bus cwd is not the NEW copy"
|
||||
|
||||
# The last window's W9 checks.
|
||||
step .w9-status.txt "W9 status" $REPO/scripts/stack-release.sh status mosaic-stack || stop "W9 status exit"
|
||||
grep -q "\"copy\":\"$NEW\"" $WIN/.w9-status.txt && grep -q '"pm":true' $WIN/.w9-status.txt && grep -q '"schema":"3n"' $WIN/.w9-status.txt || stop "W9 status: pointer not on NEW, pm true, 3n"
|
||||
grep -q 'unit flags: match the pointer' $WIN/.w9-status.txt || stop "W9 status: unit flags"
|
||||
grep -q 'result: pass' $WIN/.w9-status.txt || stop "W9 status: check result"
|
||||
step .w9-cc.txt "W9 console-check NEW ($CC, d068fe02)" bash $CC $NEW || stop "console-check exit"
|
||||
grep -qx CONSOLE_PASS $WIN/.w9-cc.txt || stop "console-check not CONSOLE_PASS"
|
||||
J=$(journalctl --user -u mosaic-webui.service --since "$W5_STAMP" --no-pager)
|
||||
N=$(printf '%s\n' "$J" | grep -c 'Proxy: proxy proof off'); S=$(printf '%s\n' "$J" | grep -c 'Sign-in:')
|
||||
{ echo; echo "## W9 webui journal since $W5_STAMP: 'Proxy: proxy proof off' and 'Sign-in:' counts"; echo "proxy proof off $N, Sign-in $S"; } >> "$W"
|
||||
note "journal since W5: proxy proof off $N, Sign-in $S"
|
||||
[ "$N" = 1 ] || stop "proxy proof off count is $N, not 1 (one Console start since W5)"
|
||||
[ "$S" = 0 ] || stop "Sign-in count is $S, not 0"
|
||||
SOCK_LINE=$(stat -c '%A %U %F' $DATA/console/tester.sock); DIR_LINE=$(stat -c '%A %U %F' $DATA/console)
|
||||
{ echo; echo "## W9 tester socket"; echo "console/ $DIR_LINE"; echo "tester.sock $SOCK_LINE"; } >> "$W"
|
||||
note "console/ $DIR_LINE; tester.sock $SOCK_LINE"
|
||||
[ "$SOCK_LINE" = "srw------- $USER socket" ] || stop "tester.sock is not a 0600 socket"
|
||||
[ "$DIR_LINE" = "drwx------ $USER directory" ] || stop "console/ is not 0700"
|
||||
R=$(python3 -B -c '
|
||||
import json,sys
|
||||
n=0
|
||||
for l in open(sys.argv[1]):
|
||||
d=json.loads(l)
|
||||
if d["at"]>=sys.argv[2] and sys.argv[3] in d["copy"]: n+=1
|
||||
print(n)' $DATA/bus/peercred-starts.jsonl $W5_ISO $NEW) || stop "peercred-starts.jsonl unreadable"
|
||||
{ echo; echo "## W9 peercred-starts.jsonl lines since W5 naming NEW"; echo "$R (file lines $(wc -l < $DATA/bus/peercred-starts.jsonl))"; } >> "$W"
|
||||
note "peercred-starts lines since W5 naming NEW: $R"
|
||||
[ "$R" = 1 ] || stop "peercred-starts has $R lines for this start, not 1"
|
||||
BJ=$(journalctl --user -u [email protected] --since "$W5_STAMP" --no-pager -o cat)
|
||||
L=$(printf '%s\n' "$BJ" | grep -c 'library:')
|
||||
{ echo; echo "## W9 bus journal 'library:' lines since W5"; echo "library: $L"; } >> "$W"
|
||||
note "bus journal library: $L"
|
||||
[ "$L" = 0 ] || stop "bus journal has $L library: lines"
|
||||
step .w9-launches.txt "W9 launches list" $MOSAIC launches list || stop "launches list"
|
||||
step .w9-launches.json "W9 launches list --json" $MOSAIC launches list --json || stop "launches list --json"
|
||||
sed -i '$d' $WIN/.w9-launches.json
|
||||
CHIEF=$(node -e '
|
||||
const l=JSON.parse(require("fs").readFileSync(process.argv[1],"utf8")),since=Number(process.argv[2]);
|
||||
const c=l.filter(x=>x.business==="mosaic-stack"&&x.instance==="chief"&&x.live===true);
|
||||
if(c.length!==1||!(Date.parse(c[0].startedAt)>=since)){console.error(`running chiefs ${c.length}`);process.exit(1)}
|
||||
process.stdout.write(c[0].run)' $WIN/.w9-launches.json "${W5_S}000") || stop "launches: not one running chief from this start"
|
||||
note "one running chief from this start: run $CHIEF"
|
||||
grep -q 'mosaic-stack/pm ' $WIN/.w9-launches.txt && stop "pm: a pm launch is listed; none was live before the window and nothing here starts one (to Mos)"
|
||||
note "pm: no pm launch is listed, as expected (none live since the last window; mos-1344)"
|
||||
step .w9-agents.txt "W9 agents --tester" $MOSAIC agents "${BZ[@]}" --tester || stop "agents"
|
||||
grep -E '(^|[[:space:]])chief[[:space:]].*working' $WIN/.w9-agents.txt && stop "the chief is working"
|
||||
note "W9 end $(date -u +%FT%TZ) W9_CHECKS_PASS"
|
||||
@@ -0,0 +1,25 @@
|
||||
# W9b start 2026-10-23T03:47:25Z
|
||||
# before the relay: chief r28dbbc5c6b4d live, no pm
|
||||
# backup /home/jwoltje/.mosaic-dev/backups/b0-20261023T034725Z, SHA256SUMS 0946b66ccde18f5be8d49ed9f15cccf09f73804abdf31b3ae9c108c6c9ee9272
|
||||
sent c66b0184 to chief
|
||||
chief (RESULT, re c66b0184) 11e140fa:
|
||||
I passed your request to the pm in your own words (message 3479e027-0099-4ce8-a106-0b1115e00dd2), with your note that it's a test and authorizes nothing. You asked for the PRD version and the number of ids in packages/tasks/requirements.json, read through its requirements read.
|
||||
|
||||
No pm session was running when I sent it, so I launched one (run ra38826f3c6e2, claude-code, claude-opus-5-5). Nothing was refused. When the pm answers, I'll pass on what it says.
|
||||
# exit 0
|
||||
r28dbbc5c6b4d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-23T03:46:01.221Z running
|
||||
ra38826f3c6e2 mosaic-stack/pm claude-code claude-opus-5-5 by chief since 2026-10-23T03:47:35.835Z running
|
||||
# exit 0
|
||||
# pm run ra38826f3c6e2 (claude-code), launchedBy chief, startedAt 2026-10-23T03:47:35.835Z, pid 3831373, runner pid 3831374: left live by W9b
|
||||
# pm launched by chief after the relay: run ra38826f3c6e2 (claude-code), pid 3831373, runner pid 3831374
|
||||
# pid 3831373: argv entries naming NEW's copy 37, cwd names NEW's copy no
|
||||
# pid 3831374: argv entries naming NEW's copy 1, cwd names NEW's copy no
|
||||
# the pm runs from NEW's copy
|
||||
sent a2d9eeb9 to pm
|
||||
pm (RESULT, re a2d9eeb9) 4500c1dd:
|
||||
Version 1.15, 85 ids (checked 10 seconds ago with list_requirements and against packages/tasks/requirements.json at 464010f).
|
||||
# exit 0
|
||||
# pm read: 1.15 and 85 found in the reply
|
||||
# W9b end 2026-10-23T03:47:51Z W9B_PASS
|
||||
W9B_PASS
|
||||
w9b exit 0
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), W9b: the pm launch proof on NEW (PLAN.md W9b section). Mos ruled
|
||||
# it in (mos-1392, through sage-3151); it is the one step that writes chief and pm turns, messages and a pm launch.
|
||||
# Taken from window-repin-84f53540d/w12c.sh step 1, without row 66's turns, under Mos's five conditions:
|
||||
# 4. Hold first: sage-busy-now.sh must print CLEAR (574 not in a run phase), or W9B_HOLD with no bus write.
|
||||
# 1. Backup first: b0.sh 3n, the online copy of the held 3n store; its B0_PASS (integrity_check ok and
|
||||
# sha256sum -c) comes before the relay.
|
||||
# One `talk chief --tester` relay that gives the pm real work, tagged [mos test] (Q134 C), with no staffing ask
|
||||
# and no authorization text.
|
||||
# launches list --json within 120 s: exactly one live pm, launchedBy chief, startedAt at or after the relay.
|
||||
# 2. Its outer pid's or runnerPid's /proc cmdline or cwd must name NEW's copy. Only the match is written down
|
||||
# (a count and a yes or no), never argv, never the environment.
|
||||
# One `talk pm --tester` read, expecting 1.15 and 85 ids.
|
||||
# 3. Once the pm is seen, its run id, pid and runner pid are written as "left live by W9b" for STATE.md and
|
||||
# the P19 body ($WIN/W9B-PM.txt), whatever happens after.
|
||||
# 5. The first failure stops with exit 1, for Mos and Sage. A pm that launched and failed its read stays live.
|
||||
# Every bus call carries --tester.
|
||||
# usage: w9b.sh
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
C=$HOME/.local/share/mosaic-stack/copies/$NEW
|
||||
BZ=(--business mosaic-stack)
|
||||
W=$WIN/W.txt
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
stop() { note "STOP: $*"; exit 1; }
|
||||
step() { local f="$1"; shift; $WIN/w.sh W.txt "$@" > "$WIN/$f"; local rc=$?; cat "$WIN/$f"; return $rc; }
|
||||
|
||||
if ! bash /mnt/storage/scratch/sage-busy-now.sh 2>/dev/null | head -3 | grep -q '^CLEAR'; then
|
||||
note "W9b hold $(date -u +%FT%TZ): the busy check isn't CLEAR, so a run phase may be on; nothing sent (condition 4) W9B_HOLD"
|
||||
exit 2
|
||||
fi
|
||||
note "W9b start $(date -u +%FT%TZ)"
|
||||
grep -q 'W9_CHECKS_PASS' $W || stop "W.txt has no W9_CHECKS_PASS"
|
||||
grep -q "/copies/$NEW/scripts/mosaic" "$MOSAIC" || stop "the wrapper is not pinned to NEW"
|
||||
CHIEF=$($MOSAIC launches list --json 2>/dev/null | node -e '
|
||||
const l=JSON.parse(require("fs").readFileSync(0,"utf8"));
|
||||
const c=l.filter(x=>x.business==="mosaic-stack"&&x.instance==="chief"&&x.live===true);
|
||||
const p=l.filter(x=>x.business==="mosaic-stack"&&x.instance==="pm"&&x.live===true);
|
||||
if(c.length!==1||p.length!==0)process.exit(1); process.stdout.write(c[0].run)') || stop "not one live chief and no live pm before the relay"
|
||||
note "before the relay: chief $CHIEF live, no pm"
|
||||
|
||||
bash $WIN/b0.sh 3n > $WIN/.w9b-b0.txt 2>&1; brc=$?
|
||||
{ echo; echo "## W9b backup first (b0.sh 3n)"; cat $WIN/.w9b-b0.txt; echo "# exit $brc"; } >> "$W"
|
||||
[ $brc = 0 ] && grep -q B0_PASS $WIN/.w9b-b0.txt || stop "b0.sh 3n: $(tail -1 $WIN/.w9b-b0.txt)"
|
||||
note "backup $(sed -n 's/^B0 path //p' $WIN/.w9b-b0.txt), SHA256SUMS $(sed -n 's/^B0 SHA256SUMS sha256 //p' $WIN/.w9b-b0.txt)"
|
||||
|
||||
MARK_MS=$(date +%s%3N)
|
||||
step .w9b-talk-chief.txt "W9b talk chief --wait 300 --tester (relay to pm)" $MOSAIC talk chief "[mos test] Please relay this to the pm: [mos test] read packages/tasks/requirements.json through your requirements read and reply with the PRD version and the number of ids." --wait 300 "${BZ[@]}" --tester || stop "talk chief relay failed or timed out (to Mos and Sage)"
|
||||
# Poll until any live pm shows, then judge it once (condition 5 names each failure).
|
||||
PMJ=""
|
||||
for i in $(seq 1 24); do
|
||||
PMJ=$($MOSAIC launches list --json 2>/dev/null | node -e '
|
||||
const l=JSON.parse(require("fs").readFileSync(0,"utf8"));
|
||||
const p=l.filter(x=>x.business==="mosaic-stack"&&x.instance==="pm"&&x.live===true);
|
||||
if(p.length)process.stdout.write(JSON.stringify(p.map(x=>({run:x.run,harness:x.harness,launchedBy:x.launchedBy,startedAt:x.startedAt,pid:x.pid,runnerPid:x.runnerPid}))))')
|
||||
[ -n "$PMJ" ] && break
|
||||
sleep 5
|
||||
done
|
||||
step .w9b-launches.txt "W9b launches list" $MOSAIC launches list || stop "launches list"
|
||||
[ -n "$PMJ" ] || stop "live pm count 0 within 120 s of the relay; no more chief turns for it (to Mos and Sage) W9B_OPEN"
|
||||
N=$(node -e 'process.stdout.write(String(JSON.parse(process.argv[1]).length))' "$PMJ")
|
||||
# Condition 3: every live pm seen is written down as left live, before any other check.
|
||||
node -e '
|
||||
for (const x of JSON.parse(process.argv[1])) console.log(`pm run ${x.run} (${x.harness}), launchedBy ${x.launchedBy}, startedAt ${x.startedAt}, pid ${x.pid}, runner pid ${x.runnerPid}: left live by W9b`)' "$PMJ" > $WIN/W9B-PM.txt
|
||||
while read -r l; do note "$l"; done < $WIN/W9B-PM.txt
|
||||
[ "$N" = 1 ] || stop "live pm count $N, not 1 (to Mos and Sage)"
|
||||
read -r PMRUN PMH BY SA OPID RPID < <(node -e '
|
||||
const x=JSON.parse(process.argv[1])[0]; process.stdout.write(`${x.run} ${x.harness} ${x.launchedBy} ${x.startedAt} ${x.pid} ${x.runnerPid}`)' "$PMJ")
|
||||
[ "$BY" = chief ] || stop "pm run $PMRUN launchedBy $BY, not chief (to Mos and Sage)"
|
||||
SA_MS=$(node -e 'const t=Date.parse(process.argv[1]); process.stdout.write(Number.isFinite(t)?String(t):"NaN")' "$SA")
|
||||
[ "$SA_MS" != NaN ] && [ "$SA_MS" -ge "$MARK_MS" ] || stop "pm run $PMRUN startedAt $SA is before the relay ($(date -u -d @$((MARK_MS/1000)) +%FT%TZ)) (to Mos and Sage)"
|
||||
note "pm launched by chief after the relay: run $PMRUN ($PMH), pid $OPID, runner pid $RPID"
|
||||
hit=0
|
||||
for P in $OPID $RPID; do
|
||||
a=$(tr '\0' '\n' < /proc/$P/cmdline 2>/dev/null | grep -c "/copies/$NEW\(/\|\$\)"); c=$(readlink /proc/$P/cwd 2>/dev/null)
|
||||
case "$c" in */copies/$NEW|*/copies/$NEW/*) cw=yes ;; *) cw=no ;; esac
|
||||
note "pid $P: argv entries naming NEW's copy ${a:-0}, cwd names NEW's copy $cw"
|
||||
{ [ "${a:-0}" -gt 0 ] || [ $cw = yes ]; } && hit=1
|
||||
done
|
||||
[ $hit = 1 ] || stop "neither pm process names NEW's copy path (to Mos and Sage)"
|
||||
note "the pm runs from NEW's copy"
|
||||
|
||||
step .w9b-talk-pm.txt "W9b pm read talk pm --wait 300 --tester" $MOSAIC talk pm "[mos test] read packages/tasks/requirements.json through your requirements read and reply with one line: the version and the number of ids" --wait 300 "${BZ[@]}" --tester || stop "talk pm failed or timed out; the pm stays live (to Mos and Sage)"
|
||||
grep -q '1\.15' $WIN/.w9b-talk-pm.txt && grep -qw '85' $WIN/.w9b-talk-pm.txt || stop "pm read: the reply does not show 1.15 and 85, see .w9b-talk-pm.txt; the pm stays live (to Mos and Sage)"
|
||||
note "pm read: 1.15 and 85 found in the reply"
|
||||
note "W9b end $(date -u +%FT%TZ) W9B_PASS"
|
||||
echo W9B_PASS
|
||||
@@ -0,0 +1,50 @@
|
||||
# W0b-W4 start 2026-10-23T03:44:07Z
|
||||
# plan e664fa35, NEW 464010fbe4c6925b077b9b8182a209ee2177eb9d, tool blob 7a8c347b2be4, P5 four scripts at NEW and clean, business-check.mjs eece4d46: checked 2026-10-23T03:44:07Z
|
||||
# W0 copy present, w0.txt LOAD_OK
|
||||
# W0b: /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261023T034407Z, sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93, recorded in backups.txt
|
||||
# W1 launches: chief r148e72c8895d standing (OLD's activation), no other launch
|
||||
# W1 start stamp 2026-10-23T03:44:08Z
|
||||
# SNAP sha256 639fd28a checked before S1
|
||||
# S1.json sha256 7e4d46f9bc094ae10f1c76dfaee54407068bf99f52f8e465f36bc0bbcd961e68
|
||||
W1 threads --tester: 5 thread(s), threads.json sha256 07c154d75d929028
|
||||
W1 thread d0ba7a66-aa3f-4918-9518-94132bce6b28 messages 2 sha256 985ac61ca9220f2f
|
||||
W1 thread 446201de-e8b5-4df3-9356-d0d5422cc899 messages 2 sha256 7e7e9eeeaa8c1e09
|
||||
W1 thread b89fcca4-6b82-48bd-9310-fb82c5ae8518 messages 2 sha256 f4e4916b9656a403
|
||||
W1 thread d9bb7ff3-7a8b-4bb8-ba12-03ca094cee4e messages 2 sha256 728ff36f3e003c63
|
||||
W1 thread b85a57fe-84f9-4785-a596-135af39e334a messages 2 sha256 727de0d9c809a41a
|
||||
# W1 D3: /home/jwoltje/.mosaic-dev/backups/d3-20261023T034412Z, STAMP 2026-10-23T03:44:12.165Z, SHA256SUMS sha256 eda5be89461d50c49cc3c2f32a03f49d3cd6d3848371e9de2eed183cec7cb74d, members 91652 tar exit 0 sessions.json sessionsVersion 2
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","business":"mosaic-stack","pm":true,"claude":"/home/jwoltje/.local/bin/claude","console":["--port","7332","--public-host","mosaic.woltje.com","--auth-header","X-authentik-username","--allow-user","jason.woltje","--tester-socket"],"schema":"3m","activation":"20261022T201621Z-0cbe2e9b35e5","at":"2026-10-22T20:16:24Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-22T04:03:00Z","op":"activate","from":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","to":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","backup":"20261022T040256Z-86f95bb27f6c","activation":"20261022T040256Z-86f95bb27f6c","result":"ok"}
|
||||
{"at":"2026-10-22T15:05:55Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":null,"activation":"20261022T150555Z-84f53540dd0d","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T15:06:00Z","op":"activate","from":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","to":"84f53540dd0d21ef179ca29697e172b0246e78d1","backup":"20261022T150555Z-84f53540dd0d","activation":"20261022T150555Z-84f53540dd0d","result":"ok"}
|
||||
{"at":"2026-10-22T20:16:21Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":null,"activation":"20261022T201621Z-0cbe2e9b35e5","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"at":"2026-10-22T20:16:24Z","op":"activate","from":"84f53540dd0d21ef179ca29697e172b0246e78d1","to":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0","backup":"20261022T201621Z-0cbe2e9b35e5","activation":"20261022T201621Z-0cbe2e9b35e5","result":"ok"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 1791120, running, since 2026-10-22T20:16:23.031Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 1791164
|
||||
boot: organization file loaded at 2026-10-22T20:16:23.030Z
|
||||
unit flags: match the pointer
|
||||
drift: 94 commit(s) on refactor since the pointer's copy
|
||||
# exit 0
|
||||
# W3-plan.txt sha256 229888d8d03a3be1a46ad505ed50f85c435aec580a161cbb2e7bceba03ae866b
|
||||
# W3 commit list lines left out of the flag checks: 94
|
||||
# W3 plan checks: OLD to NEW, 3m to 3n in one step, 94 commits, needs --migrate (given) and the decision 96 line, backup line, Console line OLD's flags exactly, proof off, send off, no drop/sso/send/proof, bus --pm: PASS
|
||||
DropInPaths=
|
||||
ExecStart={ path=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/scripts/mosaic ; argv[]=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/scripts/mosaic bus start mosaic-stack --pm ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }
|
||||
WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
# exit 0
|
||||
DropInPaths=
|
||||
ExecStart={ path=/usr/bin/node ; argv[]=/usr/bin/node /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/packages/webui/src/cli.mjs serve --checkout /mnt/storage/src/mosaic-stack --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }
|
||||
WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
# exit 0
|
||||
# W4 checks: DropInPaths empty on both, both ExecStart name the OLD copy, bus has --pm, no quote or backslash in either ExecStart
|
||||
# W4 bus Environment: 2 assignments; quote or backslash: none (values not recorded)
|
||||
# W0b-W4 end 2026-10-23T03:44:33Z
|
||||
+119
@@ -0,0 +1,119 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 to NEW (3m to 3n), W0b-W4 (PLAN.md, sha256 in PLAN.sha256 from P0; sage-3135, mos-1385).
|
||||
# W0 ran in prep (w0.txt). Adapted from window-migrate-0cbe2e9b3/wsteps.sh: W1's launch rule now expects the one
|
||||
# standing chief from OLD's activation and no pm (any other launch goes to Mos), and W3 checks 3m to 3n in one step
|
||||
# with the commit count read from git. W1-W4 start nothing, but S1, W2 and W3 read the store, so the script runs
|
||||
# only on Sage's CLEAR. W3 and W4 go to Mos for the W5 go.
|
||||
# Nothing is stopped. Each step goes through w.sh into W.txt; a failed check stops the script.
|
||||
# usage: wsteps.sh
|
||||
set -uo pipefail
|
||||
. /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-3n/vars.sh
|
||||
BC=$REPO/agents/sage/work/window-plan/repin-de352dfaf/business-check.mjs
|
||||
BC_SHA=eece4d4671e1ce15ba81e1654c641925ac4988b343687b062897392285a8a1a7
|
||||
BIZ=$HOME/.config/mosaic-dev/businesses/mosaic-stack.json
|
||||
BIZ_SHA=1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93
|
||||
SNAP=$REPO/agents/darkwing/work/window-repin-84f53540d/snapshot.mjs
|
||||
SNAP_SHA=639fd28a2674aaa03ce824e3394b4052f21cdef7d6fa49bae61a9927ed341e67
|
||||
W=$WIN/W.txt
|
||||
NCOMMITS=$(git -C $REPO rev-list --count $OLD..$NEW)
|
||||
CHIEF_RUN=r148e72c8895d
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
stop() { note "STOP: $*"; exit 1; }
|
||||
|
||||
note "W0b-W4 start $(date -u +%FT%TZ)"
|
||||
[ "$(sha $PLAN)" = "$PLAN_SHA" ] || stop "the plan file is not P0's ${PLAN_SHA:0:8}"
|
||||
[ "$(git -C $REPO rev-parse HEAD:scripts/stack-release.sh)" = "$TOOL_BLOB" ] || stop "tool blob moved"
|
||||
git -C $REPO diff --quiet $NEW HEAD -- "${FOUR[@]}" || stop "P5: the four scripts differ from NEW"
|
||||
[ -z "$(git -C $REPO status --porcelain -- "${FOUR[@]}")" ] || stop "P5: the four scripts are dirty"
|
||||
[ "$(sha $BC)" = "$BC_SHA" ] || stop "business-check.mjs sha"
|
||||
note "plan ${PLAN_SHA:0:8}, NEW $NEW, tool blob ${TOOL_BLOB:0:12}, P5 four scripts at NEW and clean, business-check.mjs eece4d46: checked $(date -u +%FT%TZ)"
|
||||
|
||||
# W0 ran in prep (w0.txt): the copy must still be there with LOAD_OK recorded.
|
||||
[ -f "$HOME/.local/share/mosaic-stack/copies/$NEW/scripts/mosaic" ] || stop "W0 copy missing"
|
||||
grep -q LOAD_OK $WIN/w0.txt || stop "w0.txt has no LOAD_OK"
|
||||
note "W0 copy present, w0.txt LOAD_OK"
|
||||
|
||||
# W0b
|
||||
[ "$(sha $BIZ)" = "$BIZ_SHA" ] || stop "business file sha256 is not P1's 1e49bdf0"
|
||||
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
|
||||
COPY=$BIZ.pre-window-$STAMP
|
||||
[ ! -e "$COPY" ] || stop "$COPY exists"
|
||||
cp -p "$BIZ" "$COPY" || stop "W0b cp"
|
||||
[ "$(sha "$COPY")" = "$BIZ_SHA" ] || stop "W0b copy sha256"
|
||||
echo "W0b $(date -u +%FT%TZ) business file copy $COPY sha256 $(sha "$COPY") (source $BIZ sha256 $(sha "$BIZ"))" >> $WIN/backups.txt
|
||||
note "W0b: $COPY, sha256 $(sha "$COPY"), recorded in backups.txt"
|
||||
|
||||
# W1
|
||||
$WIN/w.sh W.txt "W1 agents --tester" $MOSAIC agents --business mosaic-stack --tester > $WIN/.w1-agents.txt || stop "W1 agents"
|
||||
grep -E '(^|[[:space:]])chief[[:space:]].*working' $WIN/.w1-agents.txt && stop "W1: the chief is working (mos-1340 item 2)"
|
||||
grep -E '(^|[[:space:]])pm[[:space:]].*working' $WIN/.w1-agents.txt && stop "W1: the pm is working (mos-1340 item 3)"
|
||||
$WIN/w.sh W.txt "W1 launches list" $MOSAIC launches list > $WIN/.w1-launches.txt || stop "W1 launches list"
|
||||
# mos-1340's rule with this window's runs: r148e72c8895d is the standing chief launch from OLD's activation (the
|
||||
# last window's W5-launched.txt and .w9-launches.json). No pm was live at the last window's end. Any other live
|
||||
# launch, a pm included, goes to Mos before S1.
|
||||
other=$(grep -v '^# ' $WIN/.w1-launches.txt | grep -v -e "^$CHIEF_RUN " | grep .)
|
||||
[ -z "$other" ] || stop "W1: a live launch other than the standing chief $CHIEF_RUN (mos-1340 item 1): $other"
|
||||
grep -q "^$CHIEF_RUN mosaic-stack/chief " $WIN/.w1-launches.txt || stop "W1: the standing chief launch $CHIEF_RUN is not listed"
|
||||
note "W1 launches: chief $CHIEF_RUN standing (OLD's activation), no other launch"
|
||||
note "W1 start stamp $(date -u +%FT%TZ)"
|
||||
[ "$(sha $SNAP)" = "$SNAP_SHA" ] || stop "SNAP sha before S1"
|
||||
note "SNAP sha256 639fd28a checked before S1"
|
||||
$WIN/w.sh W.txt "S1 snapshot --held" node $SNAP --store "$DATA/bus/bus.sqlite" --held > $WIN/S1.json || stop "S1"
|
||||
sed -i '$d' $WIN/S1.json # w.sh prints "# exit N" last; S1.json keeps the snapshot only
|
||||
note "S1.json sha256 $(sha $WIN/S1.json)"
|
||||
# W6's baseline: the tester thread reads before W5 (tr.sh; bodies in $WIN/.tr/W1, not committed).
|
||||
bash $WIN/tr.sh W1 > $WIN/.w1-tr.txt 2>&1; trc=$?
|
||||
{ echo; echo "## W1 tester thread reads (tr.sh W1)"; cat $WIN/.w1-tr.txt; echo "# exit $trc"; } >> "$W"; cat $WIN/.w1-tr.txt
|
||||
[ $trc = 0 ] || stop "W1 tester thread reads failed"
|
||||
# The rollback source for the data-root files as they are just before W5 (PLAN.md W1).
|
||||
bash $WIN/d3.sh > $WIN/d3-w1.txt 2>&1; drc=$?
|
||||
grep -q D3_PASS $WIN/d3-w1.txt && [ $drc = 0 ] || stop "W1 d3.sh rc $drc: $(tail -3 $WIN/d3-w1.txt)"
|
||||
note "W1 D3: $(sed -n 's/^D3 path //p' $WIN/d3-w1.txt), STAMP $(sed -n 's/^D3 STAMP //p' $WIN/d3-w1.txt), SHA256SUMS sha256 $(sed -n 's/^D3 SHA256SUMS sha256 //p' $WIN/d3-w1.txt), $(sed -n 's/^MEMBERS: //p' $WIN/d3-w1.txt)"
|
||||
|
||||
# W2
|
||||
$WIN/w.sh W.txt "W2 status" scripts/stack-release.sh status mosaic-stack || stop "W2 status"
|
||||
|
||||
# W3
|
||||
$WIN/w.sh W.txt "W3 activate NEW --pm --migrate --tester-socket --plan" scripts/stack-release.sh activate $NEW mosaic-stack --pm --migrate --tester-socket --plan > $WIN/W3-plan.txt || stop "W3 plan exit"
|
||||
sed -i '$d' $WIN/W3-plan.txt
|
||||
note "W3-plan.txt sha256 $(sha $WIN/W3-plan.txt)"
|
||||
# The plan's W3 row: OLD to NEW, the migration lines (3m to 3n in one step), the backup line, and a Console line with OLD's flags exactly
|
||||
# (--tester-socket, no --send, no --sso, no proof pair, no drop line). Any other difference stops here.
|
||||
P3L=$WIN/W3-plan.txt
|
||||
# The commit list holds subjects that name --sso and --send (row 273), so the flag checks read the plan without it.
|
||||
P3N=$WIN/W3-plan-nocommits.txt
|
||||
grep -v '^ [0-9a-f]\{9\} ' $P3L > $P3N
|
||||
note "W3 commit list lines left out of the flag checks: $(grep -c '^ [0-9a-f]\{9\} ' $P3L)"
|
||||
CONSOLE_WANT="Console: scripts/webui-service.sh install --copy $NEW --copies $HOME/.local/share/mosaic-stack/copies --port 7332 --public-host mosaic.woltje.com --auth-header X-authentik-username --allow-user jason.woltje --tester-socket"
|
||||
grep -qx "from: $OLD" $P3L || stop "W3: from is not OLD"
|
||||
grep -qx "to: $NEW" $P3L || stop "W3: to is not NEW"
|
||||
grep -qx "store schema: 3m (read from the store the running bus holds)" $P3L || stop "W3: store schema line"
|
||||
grep -qx "target schema: 3n" $P3L || stop "W3: target schema is not 3n"
|
||||
grep -qx "migration: 3m to 3n, after a backup of the stopped store" $P3L || stop "W3: migration line is not 3m to 3n"
|
||||
grep -qx "migration steps: 3m to 3n" $P3L || stop "W3: migration steps are not 3m to 3n"
|
||||
grep -qx "needs: --migrate (given)" $P3L || stop "W3: needs --migrate (given) line"
|
||||
# The Jason line is expected; Q173 overrides decision 96 condition 2 for this business (sage-2703 item 2; PLAN.md P3 row).
|
||||
grep -qx "needs: Jason present for this run (decision 96 condition 2)" $P3L || stop "W3: the decision 96 line is missing"
|
||||
[ "$(grep -c '^needs: ' $P3N)" = 2 ] || stop "W3: a needs: line other than the two above"
|
||||
[ "$(grep -c '^migration' $P3N)" = 2 ] || stop "W3: a migration line other than the two above"
|
||||
grep -q '^restore: \|^note: ' $P3N && stop "W3: a restore or note line"
|
||||
grep -qx "commits: the run adds $NCOMMITS (newest first, at most 200):" $P3L || stop "W3: commit count is not $NCOMMITS (git rev-list --count OLD..NEW)"
|
||||
grep -qx "backup: the run backs up the stopped store to $DATA/backups/stack/<activation>/ before any migration" $P3L || stop "W3: backup line"
|
||||
grep -qx -- "$CONSOLE_WANT" $P3L || stop "W3: Console line is not OLD's flags exactly"
|
||||
[ "$(grep -c '^Console: ' $P3L)" = 1 ] || stop "W3: more than one Console line"
|
||||
grep -q '^drop \|^sso: \|--send\|--sso\|--proof-header\|--proof-file' $P3N && stop "W3: a drop, sso, send or proof line or flag"
|
||||
grep -qx 'proof: off' $P3L && grep -qx 'send: off' $P3L || stop "W3: proof and send lines are not off"
|
||||
grep -q "^bus: scripts/bus-service.sh install --copy $NEW .* --pm " $P3L || stop "W3: bus line has no --pm on NEW"
|
||||
note "W3 plan checks: OLD to NEW, 3m to 3n in one step, $NCOMMITS commits, needs --migrate (given) and the decision 96 line, backup line, Console line OLD's flags exactly, proof off, send off, no drop/sso/send/proof, bus --pm: PASS"
|
||||
|
||||
# W4
|
||||
$WIN/w.sh W.txt "W4 bus unit (Environment omitted from the transcript)" systemctl --user show [email protected] -p ExecStart -p WorkingDirectory -p DropInPaths || stop "W4 bus"
|
||||
$WIN/w.sh W.txt "W4 webui unit" systemctl --user show mosaic-webui.service -p ExecStart -p WorkingDirectory -p DropInPaths || stop "W4 webui"
|
||||
BUSL=$(systemctl --user show [email protected] -p ExecStart -p DropInPaths -p WorkingDirectory)
|
||||
WEBL=$(systemctl --user show mosaic-webui.service -p ExecStart -p DropInPaths -p WorkingDirectory)
|
||||
for u in BUSL WEBL; do v=${!u}; grep -qx 'DropInPaths=' <<< "$v" || stop "W4 $u DropInPaths not empty"; grep '^ExecStart=' <<< "$v" | grep -q "copies/$OLD/" || stop "W4 $u ExecStart does not name the OLD copy"; grep '^ExecStart=' <<< "$v" | grep -q "copies/$NEW" && stop "W4 $u ExecStart names NEW"; grep '^ExecStart=' <<< "$v" | grep -q "[\"'\\\\]" && stop "W4 $u ExecStart has a quote or backslash"; done
|
||||
grep '^ExecStart=' <<< "$BUSL" | grep -q -- ' --pm' || stop "W4 bus ExecStart has no --pm"
|
||||
note "W4 checks: DropInPaths empty on both, both ExecStart name the OLD copy, bus has --pm, no quote or backslash in either ExecStart"
|
||||
ENVL=$(systemctl --user show [email protected] -p Environment)
|
||||
note "W4 bus Environment: $(tr ' ' '\n' <<< "${ENVL#Environment=}" | grep -c =) assignments; quote or backslash: $(grep -q "[\"'\\\\]" <<< "$ENVL" && echo FOUND || echo none) (values not recorded)"
|
||||
note "W0b-W4 end $(date -u +%FT%TZ)"
|
||||
@@ -0,0 +1,8 @@
|
||||
# Della
|
||||
|
||||
Builder seat, Codex gpt-6.1-sol, started by Mos for the email plan (Vikunja 460). Owns row 224 (C2-05b) under Q220.
|
||||
|
||||
No launcher in this directory. The seat runs as a T3 thread (thread 66735a7f) and works in its own worktree. It has no
|
||||
credentials of its own; it pushes only its own `della/*` branches through the repository credential helper (mos-0981),
|
||||
never `refactor`, `main` or another seat's branch. Registered by Sage on 2026-10-22 so the queue can name the seat as
|
||||
row owner under Q220 (mos-1301).
|
||||
@@ -0,0 +1,711 @@
|
||||
{
|
||||
"base": "c3d88840c",
|
||||
"stage": "pre-implementation; not the passing final static check",
|
||||
"occurrences": [
|
||||
{
|
||||
"file": "scripts/case2-unit.sh",
|
||||
"line": 25,
|
||||
"text": "# optional --tester-port N (1024..65535, never --port). Only factory takes"
|
||||
},
|
||||
{
|
||||
"file": "scripts/case2-unit.sh",
|
||||
"line": 163,
|
||||
"text": " --tester-port) [ \"$PROFILE\" = factory ] || die \"the library profile refuses --tester-port: the tester listener takes writes from loopback with no sign-in\" ;;"
|
||||
},
|
||||
{
|
||||
"file": "scripts/case2-unit.sh",
|
||||
"line": 193,
|
||||
"text": " --tester-port) tester_port=\"$value\""
|
||||
},
|
||||
{
|
||||
"file": "scripts/case2-unit.sh",
|
||||
"line": 194,
|
||||
"text": " [[ \"$value\" =~ ^[1-9][0-9]{3,4}$ ]] && [ \"$value\" -ge 1024 ] && [ \"$value\" -le 65535 ] || die \"--tester-port must be 1024..65535: $value\" ;;"
|
||||
},
|
||||
{
|
||||
"file": "scripts/case2-unit.sh",
|
||||
"line": 204,
|
||||
"text": " [ -z \"$tester_port\" ] || [ \"$tester_port\" -ne \"$port\" ] || die \"--tester-port must differ from --port\""
|
||||
},
|
||||
{
|
||||
"file": "scripts/instance.sh",
|
||||
"line": 114,
|
||||
"text": "# this instance's, whose ExecStart takes PORT as --port or --tester-port."
|
||||
},
|
||||
{
|
||||
"file": "scripts/instance.sh",
|
||||
"line": 132,
|
||||
"text": " --tester-port) [[ \"$tok\" =~ ^[0-9]{1,5}$ ]] && ports+=(\"$((10#$tok))\") ;;"
|
||||
},
|
||||
{
|
||||
"file": "scripts/case1-accept.sh",
|
||||
"line": 65,
|
||||
"text": " case \"$a\" in --port) PORT=\"$v\"; i=$((i + 1)) ;; --tester-port) TESTER_PORT=\"$v\"; i=$((i + 1)) ;; esac"
|
||||
},
|
||||
{
|
||||
"file": "scripts/case1-accept.sh",
|
||||
"line": 88,
|
||||
"text": " refuse \"$ARGS_FILE lacks a numeric --port or --tester-port after --\""
|
||||
},
|
||||
{
|
||||
"file": "scripts/webui-service.sh",
|
||||
"line": 43,
|
||||
"text": "# Console), --tester-socket (private Unix tester), or legacy --tester-port N"
|
||||
},
|
||||
{
|
||||
"file": "scripts/webui-service.sh",
|
||||
"line": 74,
|
||||
"text": "# --tester-port that another installed Console unit in the unit directory"
|
||||
},
|
||||
{
|
||||
"file": "scripts/webui-service.sh",
|
||||
"line": 96,
|
||||
"text": " FLAGS: [--port N] [--business ID] [--board URL] [--sso [--send] | --public-host NAME --auth-header HEADER --allow-user ID [--send]] [--tester-socket | --tester-port N (legacy copies)] [--proof-header NAME --proof-file PATH]"
|
||||
},
|
||||
{
|
||||
"file": "scripts/webui-service.sh",
|
||||
"line": 97,
|
||||
"text": " --tester-port: legacy copies only; 1024..65535, different from --port and never 7332; loopback tester listener."
|
||||
},
|
||||
{
|
||||
"file": "scripts/webui-service.sh",
|
||||
"line": 137,
|
||||
"text": " --tester-port) [ $# -ge 2 ] || usage; TESTER_PORT=\"$2\"; TESTER_SET=1; SERVE_SET=1; shift 2 ;;"
|
||||
},
|
||||
{
|
||||
"file": "scripts/webui-service.sh",
|
||||
"line": 182,
|
||||
"text": " echo \"webui-service: --tester-port must be 1024..65535, different from --port and never 7332: $TESTER_PORT\" >&2"
|
||||
},
|
||||
{
|
||||
"file": "scripts/webui-service.sh",
|
||||
"line": 266,
|
||||
"text": " [ \"$TESTER_SET\" = 0 ] || flags=\"$flags --tester-port $TESTER_PORT\""
|
||||
},
|
||||
{
|
||||
"file": "scripts/webui-service.sh",
|
||||
"line": 462,
|
||||
"text": " if grep -Eq '^ExecStart=.*( --allow-user [^ ][^ ]*( --proof-header [^ ]+ --proof-file /[^ ]+)?| --sso) --send( --tester-port [0-9]+| --tester-socket)?$' \"$target\"; then"
|
||||
},
|
||||
{
|
||||
"file": "scripts/webui-service.sh",
|
||||
"line": 467,
|
||||
"text": " if grep -Eq '^ExecStart=.* --sso( --send)?( --tester-port [0-9]+)?$' \"$target\"; then"
|
||||
},
|
||||
{
|
||||
"file": "scripts/webui-service.sh",
|
||||
"line": 471,
|
||||
"text": " tester_port=\"$(sed -n 's/^ExecStart=.* --tester-port \\([0-9][0-9]*\\)$/\\1/p' \"$target\")\""
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 47,
|
||||
"text": " stack-release.sh activate ID BUSINESS [--pm | --pm-after-harness] [--migrate] [--tester-socket | --tester-port N (legacy copies)]"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 63,
|
||||
"text": "activate and rollback --plan take --expect-from OLD. --pm, --pm-after-harness, --tester-port, the"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 126,
|
||||
"text": " --tester-port) [ \"$OP\" = activate ] && [ $# -ge 2 ] && [ -n \"$2\" ] || usage; TESTER_PORT=\"$2\"; shift 2 ;;"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 797,
|
||||
"text": " elif grep -q -- '--tester-port' \"$cli\"; then supported=1; fi"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 800,
|
||||
"text": " --tester-port) i=$((i + 1)); inherited=\"${BASE_CONSOLE[i]:-}\" ;;"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 814,
|
||||
"text": " [ -z \"$inherited\" ] || DROP_TESTER=\"--tester-port $inherited (replaced by private Unix socket)\""
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 830,
|
||||
"text": " check_refuse tester-port-invalid \"--tester-port $TESTER_PORT is not a whole port from 1024 to 65535 other than 7332$other\""
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 832,
|
||||
"text": " [ \"$supported\" = 1 ] || check_refuse tester-port-target \"$TO's Console does not support --tester-port\""
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 833,
|
||||
"text": " RUN_CONSOLE=(\"${without_tester[@]}\" --tester-port \"$TESTER_PORT\")"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 837,
|
||||
"text": " RUN_CONSOLE=(\"${without_tester[@]}\") DROP_TESTER=\"--tester-port $inherited\""
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 878,
|
||||
"text": " # --send and --tester-port follow the pointer, so a --no-send or a tester port set after that"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 885,
|
||||
"text": " --tester-port) i=$((i + 1)) ;;"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 893,
|
||||
"text": " --tester-port) i=$((i + 1)); BASE_CONSOLE+=(--tester-port \"${P_CONSOLE[i]:-}\") ;;"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 897,
|
||||
"text": " SSO_PLAN=\"sso: dropped; $TO's Console does not support --sso, so the rollback takes the Console flags from $set/$f, with --send and --tester-port as the pointer has them\""
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 903,
|
||||
"text": "# --tester-port. Sets SSO_DROP (the plan's dropped preview flags), PROOF_PLAN and PROOF_STEP."
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 919,
|
||||
"text": " case \"${kept[i]}\" in --send | --tester-port | --tester-socket) break ;; esac"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 1076,
|
||||
"text": " case \"${without_proof[i]}\" in --send | --tester-port | --tester-socket) break ;; esac"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 1134,
|
||||
"text": "# Row 190: the target Console's --port (7332 when absent) and --tester-port against every other"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 1142,
|
||||
"text": " --tester-port) ports+=(\"${RUN_CONSOLE[i + 1]:-}\") ;;"
|
||||
},
|
||||
{
|
||||
"file": "scripts/stack-release.sh",
|
||||
"line": 2106,
|
||||
"text": " for ((i = 0; i < ${#P_CONSOLE[@]}; i++)); do [ \"${P_CONSOLE[i]}\" != --tester-port ] || reserved+=(\"${P_CONSOLE[i + 1]:-}\"); done"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/case2-unit.test.mjs",
|
||||
"line": 80,
|
||||
"text": "const factoryFlags = () => [\"--port\", \"443\", \"--business\", \"acme\", \"--tester-port\", \"7333\"];"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/case2-unit.test.mjs",
|
||||
"line": 328,
|
||||
"text": " [\"--tester-port\", \"7333\", /the library profile refuses --tester-port/],"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/case2-unit.test.mjs",
|
||||
"line": 364,
|
||||
"text": " refuses(unit(h, { profile: \"factory\", flags: [\"--port\", \"443\", \"--business\", \"acme\", \"--tester-port\", \"443\"] }), /--tester-port must be 1024\\.\\.65535|--tester-port must differ from --port/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/case2-unit.test.mjs",
|
||||
"line": 365,
|
||||
"text": " refuses(unit(h, { profile: \"factory\", flags: [\"--port\", \"443\", \"--business\", \"acme\", \"--tester-port\", \"1443\", \"--port\", \"1443\"] }), /given twice/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/case2-unit.test.mjs",
|
||||
"line": 378,
|
||||
"text": " refuses(unit(h, { profile: \"factory\", flags: [\"--port\", \"443\", \"--business\", \"acme\", \"--tester-port\", \"443\"] }), /--tester-port must be 1024\\.\\.65535/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/case2-unit.test.mjs",
|
||||
"line": 380,
|
||||
"text": " assert.match(read(UNIT), /--tester-port must differ from --port/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release-fixture.mjs",
|
||||
"line": 306,
|
||||
"text": " for(const [f,text,mode] of [['scripts/mosaic',script(mosaicStub),0o755],['packages/webui/src/cli.mjs',[B,C1,C].includes(id)?`// fixture Console, never run\\n// serve accepts '--tester-port'\\n// serve accepts '--proof-header' (row 178)\\n${[C1,C].includes(id)?\"// serve accepts '--sso' (row 192)\\n\":''}`:'// fixture Console before tester listener, never run\\n',0o644],['packages/bus/src/store.mjs',store,0o644],['packages/bus/src/migrate-schema.mjs',`(${migrateStub})();\\n`,0o644],['packages/plugins/src/kinds.mjs',[C1,C].includes(id)?KINDS_NEW:KINDS_OLD,0o644],...ssoFiles(id).map(([f,text])=>[f,text,0o644])]){"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 681,
|
||||
"text": "const testerFlags=(e,port='7333')=>['--port',e.port,'--business','acme','--tester-port',port];"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 687,
|
||||
"text": " let r=await run(e,'activate',C1,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 688,
|
||||
"text": " assert.deepEqual(pointer(e).console,testerFlags(e));assert.match(consoleText(e),/--tester-port 7333(?:\\n|$)/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 690,
|
||||
"text": " r=await run(e,'activate',B,'acme','--tester-port','7334');assert.equal(r.code,0,r.out+r.err);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 692,
|
||||
"text": " assert.match(consoleText(e),/--tester-port 7334(?:\\n|$)/);assert.doesNotMatch(consoleText(e),/--tester-port 7333/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 693,
|
||||
"text": " assert.equal((consoleText(e).match(/--tester-port/g)||[]).length,1);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 694,
|
||||
"text": " r=await run(e,'activate',C1,'acme','--plan');assert.equal(r.code,0,r.out+r.err);assert.match(r.out,/Console: .*--tester-port 7334/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 697,
|
||||
"text": " assert.deepEqual(pointer(e).console,testerFlags(e,'7334'));assert.match(consoleText(e),/--tester-port 7334(?:\\n|$)/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 702,
|
||||
"text": " let r=await run(e,'activate',B,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 705,
|
||||
"text": " assert.match(r.out,/drop[^\\n]*--tester-port 7333/i);assert.doesNotMatch(r.out.split('\\n').find((l)=>l.startsWith('Console: ')),/--tester-port/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 708,
|
||||
"text": " assert.deepEqual(pointer(e).console,['--port',e.port,'--business','acme']);assert.doesNotMatch(consoleText(e),/--tester-port/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 709,
|
||||
"text": " assert.match(stepText(e),/drop[^\\n]*--tester-port 7333/i);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 714,
|
||||
"text": " const r=await run(e,'activate',A,'acme','--tester-port','7333');assert.equal(r.code,3,r.out+r.err);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 718,
|
||||
"text": " assert.match(readFileSync(join(repo,'packages/webui/src/cli.mjs'),'utf8'),/--tester-port/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 724,
|
||||
"text": " const r=await run(e,'activate',C1,'acme','--tester-port',value);assert.equal(r.code,4,`${value}: ${r.out}${r.err}`);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 731,
|
||||
"text": " let r=await run(e,'activate',C1,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 732,
|
||||
"text": " r=await run(e,'activate',A,'acme','--plan');assert.equal(r.code,0,r.out+r.err);assert.match(r.out,/drop[^\\n]*--tester-port 7333/i);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 736,
|
||||
"text": " edit(join(e.units,CON),'--tester-port 7333','--tester-port 7334');const n=calls(e).length;"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 738,
|
||||
"text": " edit(join(e.units,CON),'--tester-port 7334','--tester-port 7333');"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 740,
|
||||
"text": " assert.deepEqual(pointer(e).console,['--port',e.port,'--business','acme']);assert.doesNotMatch(consoleText(e),/--tester-port/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 741,
|
||||
"text": " assert.match(stepText(e),/drop[^\\n]*--tester-port 7333/i);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 746,
|
||||
"text": " let r=await run(e,'activate',C1,'acme','--pm-after-harness','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 749,
|
||||
"text": " assert.deepEqual(pointer(e).console,testerFlags(e));assert.match(consoleText(e),/--tester-port 7333(?:\\n|$)/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 821,
|
||||
"text": " const rule=(port,main)=>`--tester-port ${port} is not a whole port from 1024 to 65535 other than 7332${main?` and the Console's --port ${main}`:''}`;"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 827,
|
||||
"text": " const r=await run(e,'activate',C1,'acme','--pm-after-harness','--plan','--tester-port',port);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 830,
|
||||
"text": " const u=await run(e,'activate',C1,'acme','--pm-after-harness','--tester-port',port);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 839,
|
||||
"text": " const n=calls(e).length,u=await run(e,'activate',C1,'acme','--tester-port','80');"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 843,
|
||||
"text": " await t.test('a target Console without --tester-port',async(t)=>{"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 846,
|
||||
"text": " const r=await run(e,'activate',A,'acme','--tester-port','7333','--plan');"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 848,
|
||||
"text": " assert.deepEqual(r.out.split('\\n').filter((l)=>l.startsWith('refuses ')),[`refuses tester-port-target: ${A}'s Console does not support --tester-port`,`refuses unknown-kind-for-target: the business file names plug-in kind(s) harness, which ${A} does not know`]);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 850,
|
||||
"text": " await refused(e,['activate',A,'acme','--tester-port','7333'],'tester-port-target',`${A}'s Console does not support --tester-port`);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1056,
|
||||
"text": " const r=await run(e,'activate',C1,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1057,
|
||||
"text": " assert.deepEqual(pointer(e).console,[...expected,'--tester-port','7333']);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1058,
|
||||
"text": " assert.ok(consoleText(e).includes([...expected,'--tester-port','7333'].join(' ')));"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1129,
|
||||
"text": " await t.test('tests 1 and 9: the pair goes after the preview flags, before --send and the kept --tester-port, as the unit renders it; a new pair replaces it',async(t)=>{"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1132,
|
||||
"text": " let r=await prun(e,'activate',C1,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1135,
|
||||
"text": " assert.ok(out.find((l)=>l.startsWith('Console: ')).endsWith(` ${PREVIEW.join(' ')} ${pair(f).join(' ')} --send --tester-port 7333`));"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1137,
|
||||
"text": " assert.deepEqual(pointer(e).console,[...pre,...pair(f),'--send','--tester-port','7333']);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1138,
|
||||
"text": " assert.ok(conExec(e).endsWith(` --checkout ${repo} ${[...pre,...pair(f),'--send','--tester-port','7333'].join(' ')}`),conExec(e));"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1141,
|
||||
"text": " assert.deepEqual(pointer(e).console,[...pre,...pair(g,'X-Proof-Two'),'--send','--tester-port','7333']);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1162,
|
||||
"text": " await refused(e,['activate',B,'acme','--tester-port','7333'],'already-active',`${B} is the pointer's copy`);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1351,
|
||||
"text": " const e=await mk(t),base=await seedPreview(e,undefined,['--send','--tester-port','7333']),want=noSend(base);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1352,
|
||||
"text": " assert.deepEqual(want.slice(-2),['--tester-port','7333']);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1367,
|
||||
"text": " await refused(e,['activate',B,'acme','--tester-port','7333'],'already-active',`${B} is the pointer's copy`);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1468,
|
||||
"text": "const ROLLBACK_PLAN=(set)=>`sso: dropped; ${B}'s Console does not support --sso, so the rollback takes the Console flags from ${set}/${SHOW}, with --send and --tester-port as the pointer has them`;"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1480,
|
||||
"text": " let r=await prun(e,'activate',B,'acme','--tester-port','7333',...pair(f));assert.equal(r.code,0,r.out+r.err);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1481,
|
||||
"text": " assert.deepEqual(pointer(e).console,[...pre,...pair(f),'--send','--tester-port','7333']);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1483,
|
||||
"text": " const want=['--port',e.port,'--business','acme','--sso','--send','--tester-port','7333'];"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1486,
|
||||
"text": " `sso: on; drops ${DROPS}; carries --port ${e.port} --business acme --send --tester-port 7333`]);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1563,
|
||||
"text": " const out=await planOnly(e,3,'activate',C,'acme','--sso','--tester-port','80');"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1564,
|
||||
"text": " assert.deepEqual(out.filter((l)=>l.startsWith('refuses ')),[`refuses tester-port-invalid: --tester-port 80 is not a whole port from 1024 to 65535 other than 7332 and the Console's --port ${e.port}`,`refuses sso-slot: ${bad('is inside the repository or the copies')}`]);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1584,
|
||||
"text": " const e=await mk(t),base=await seedPreview(e,undefined,['--send','--tester-port','7333']);await ssoConfig(e);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1594,
|
||||
"text": " const want=[...noSend(base.slice(0,-2)),'--tester-port','7333'];"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1682,
|
||||
"text": " assert.deepEqual(ssoLines(await planOnly(a,0,'rollback','acme')),[`sso: dropped; ${B}'s Console does not support --sso, so the rollback takes the Console flags from ${set}/${show}, with --send and --tester-port as the pointer has them`]);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 1811,
|
||||
"text": " writeFileSync(e.pointer,JSON.stringify({copy,business:'acme',pm:true,claude:e.claude,console:['--port',e.port,'--business','acme','--tester-port',TESTER],schema:store,activation:'manual',at:'2026-10-20T00:00:00Z'})+'\\n');"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 2198,
|
||||
"text": " ['beta\\'s tester port on alpha\\'s port',b,['--port',free,'--tester-port',a.port],1,`webui-service: refusing port-claimed: ${held}; nothing was changed\\n`],"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 2202,
|
||||
"text": " ['beta\\'s tester port on 7333',b,['--port',free,'--tester-port','7333'],4,'webui-service: port-reserved: 7333 is reserved for the default instance (7330 7332 7333)\\n'],"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 2217,
|
||||
"text": " await refused('--tester-port','--tester-port',a.port);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 2280,
|
||||
"text": " let r=await run(e,'activate',B,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 2290,
|
||||
"text": " r=await run(e,'activate',C1,'acme','--tester-socket','--plan');assert.equal(r.code,0,r.out+r.err);assert.match(r.out,/--tester-socket/);assert.match(r.out,/drop.*--tester-port 7333/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 2292,
|
||||
"text": " assert.deepEqual(pointer(e).console,[...base,...pair(proof),'--tester-socket']);assert.match(consoleText(e),/--tester-socket/);assert.doesNotMatch(consoleText(e),/--tester-port/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 2319,
|
||||
"text": " assert.doesNotMatch(conExec(e),/ --send(?: |$)|--tester-port|--public-host|--proof-header/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release.test.mjs",
|
||||
"line": 2388,
|
||||
"text": " assert.equal(context.argv.includes('--tester-socket'),marked);assert.equal(context.argv.includes('--tester-port'),false);"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/case1-accept.test.mjs",
|
||||
"line": 28,
|
||||
"text": " \"--node\", NODE, \"--claude\", CLAUDE, \"--pm\", \"--\", \"--port\", \"732\", \"--business\", \"mosaic-stack\", \"--tester-port\", \"7333\"];"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/case1-accept.test.mjs",
|
||||
"line": 477,
|
||||
"text": " \"no tester port\": [(h) => put(h.args, ARGS.slice(0, -2).join(\"\\n\") + \"\\n\", 0o644), /lacks a numeric --port or --tester-port after --$/],"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/case1-hostcheck.test.mjs",
|
||||
"line": 68,
|
||||
"text": " \"[Service]\\nExecStart=/opt/mosaic-stack/node/bin/node /srv/mosaic/copies/x/packages/webui/src/cli.mjs serve --port 732 --business mosaic-stack --tester-port 7333\\n\");"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/case1-hostcheck.test.mjs",
|
||||
"line": 215,
|
||||
"text": " put(join(h.root, \"etc\", \"systemd\", \"system\", \"mosaic-webui.service\"), \"[Service]\\nExecStart=/x serve --business mosaic-stack --tester-port 7333\\n\");"
|
||||
},
|
||||
{
|
||||
"file": "packages/cli/tests/stack-release-external.test.mjs",
|
||||
"line": 75,
|
||||
"text": " for(const a of [['activate',C1,'acme','--pm'],['activate',C1,'acme','--tester-port','7444'],['activate',C1,'acme','--no-proof'],['activate',C1,'acme','--no-send'],['activate',C1,'acme','--sso'],['activate',C1,'acme','--proof-header','X','--proof-file','/p'],['rollback','acme'],['gate',B,'acme'],['activate',C1,'acme','--expect-from',B],['confirm',C1,'acme','--rollback',B],['confirm',C1,'acme','--cause','A5']]){"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/README.md",
|
||||
"line": 128,
|
||||
"text": "need `--port`, and 7330, 7332 or 7333 as `--port` or `--tester-port` exits 4"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/README.md",
|
||||
"line": 130,
|
||||
"text": "`--tester-port` that another installed Console unit in the unit directory"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/README.md",
|
||||
"line": 144,
|
||||
"text": "`serve --sso [--send] [--tester-port N]` makes the Console an OpenID Connect"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/README.md",
|
||||
"line": 176,
|
||||
"text": "- With `--tester-port`, the tester listener refuses any request carrying an"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/README.md",
|
||||
"line": 1001,
|
||||
"text": "There is no tester TCP listener. `--tester-port` is retired for this copy."
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/tester-cli.test.mjs",
|
||||
"line": 25,
|
||||
"text": " for (const flags of [['--tester-port', '7332'], ['--port', '7444', '--tester-port', '7444'], ['--tester-port', '7444', '--port', '7444'], ...['1023', '65536', '1.5', '-1', 'nope'].map(p => ['--tester-port', p])]) {"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 125,
|
||||
"text": " const r = await run(dir, ['render', '--tester-port', port, ...PREVIEW, '--send']);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 127,
|
||||
"text": " assert.match(execStart(r.stdout), new RegExp(` --tester-port ${port}( |$)`));"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 129,
|
||||
"text": " assert.ok(execStart(r.stdout).endsWith(` ${PREVIEW_FLAGS} --send --tester-port ${port}`));"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 136,
|
||||
"text": " const r = await run(dir, ['render', '--port', main, '--tester-port', '7332']);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 150,
|
||||
"text": " ['--tester-port', ''], ['--tester-port', '1023'], ['--tester-port', '65536'],"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 151,
|
||||
"text": " ['--tester-port', '-1'], ['--tester-port', '3.5'], ['--tester-port', '1e4'],"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 152,
|
||||
"text": " ['--tester-port', 'abc'], ['--tester-port', '7333 '], ['--tester-port', '7333\\n'],"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 153,
|
||||
"text": " ['--port', '7444', '--tester-port', '7444'],"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 154,
|
||||
"text": " ['--tester-port', '7444', '--port', '7444'],"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 164,
|
||||
"text": " assert.equal((await run(dir, ['render', '--tester-port'])).status, 4);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 172,
|
||||
"text": " const six = await run(dir, ['render', '--tester-port', '007333']);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 175,
|
||||
"text": " assert.equal(six.stderr, 'webui-service: --tester-port must be 1024..65535, different from --port and never 7332: 007333\\n');"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 176,
|
||||
"text": " const five = await run(dir, ['render', '--tester-port', '07333']);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 178,
|
||||
"text": " assert.ok(execStart(five.stdout).endsWith(' --tester-port 07333'), execStart(five.stdout));"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 186,
|
||||
"text": " const installed = await run(dir, ['install', ...INSTALL, '--dir', unitDir, '--no-reload', '--port', String(port), '--tester-port', '1024', ...PREVIEW, '--send'], bin);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 188,
|
||||
"text": " assert.match(installed.stdout, /^serve: .* --tester-port 1024( |$)/m);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 189,
|
||||
"text": " assert.match(execStart(readFileSync(join(unitDir, 'mosaic-webui.service'), 'utf8')), / --tester-port 1024( |$)/);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 199,
|
||||
"text": " const refused = await run(dir, [verb, '--dir', unitDir, '--tester-port', '7333'], bin);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 799,
|
||||
"text": " const r = await run(dir, ['install', ...INSTALL, '--dir', unitDir, '--no-reload', '--port', String(port), ...PREVIEW, '--send', '--tester-port', '1024', '--proof-header', 'x-console-proof', '--proof-file', file], bin);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/tests/service.test.mjs",
|
||||
"line": 813,
|
||||
"text": " const both=await run(dir,['render','--tester-socket','--tester-port','7333']);"
|
||||
},
|
||||
{
|
||||
"file": "packages/webui/src/cli.mjs",
|
||||
"line": 30,
|
||||
"text": " if (flag === '--tester-port') throw new Error('--tester-port retired; activate explicitly with --tester-socket');"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,313 @@
|
||||
# Row253 build record
|
||||
|
||||
2026-10-21 design stage. Read brief Static check and Gate before starting. Busy check was CLEAR; claimant gander-253-start recorded rev2995. Branch gander/row253 starts from origin/refactor c3d88840c, after196 landed7247d80c7. Plain linked node_modules retained.
|
||||
|
||||
Only DESIGN.md and this record/inventory are written. No product code, tests, host config, units or slot files changed. BASE-PORT-INVENTORY.json records the initial source hits; it is not a passing final static check. The final check must classify every remaining hit after implementation.
|
||||
|
||||
Design r1 proposes configured dataRoot resolution as the target user, socket metadata plus an isolated system-Python SO_PEERCRED observation, unchanged hardening, P8 migration and honest unnamed P10 same-uid evidence. Duckworth approval is required before implementation. No test slot requested until the final static check passes; every single/pattern run also needs the slot under sage-2142.
|
||||
|
||||
## Implementation before slot
|
||||
|
||||
Duckworth-0100 approved design r1 with C1-C5. Code and new tests were written after that approval. Tests are written but unrun: sage-2142 requires a slot even for patterns, and the row253 brief requests static preparation before the slot request. Syntax checks and static source inspection only have run. No behavioral passing claim is made.
|
||||
|
||||
C1: component containment, dot/dotdot/double/trailing slash rejection and a no-follow component walk. T4 includes middle symlink and sibling-prefix homes, plus protected/private roots. C2: conservative ASCII path alphabet without whitespace; LC_ALL=C makes pathname length a byte count. C3: bash accepts only the canonical two-key string/boolean JSON. Root never imports the copy. C4: GNU timeout owns a process group; output is capped and the wrapper kills remaining group members and waits for its direct child on success, failure or signal. Tests cover a TERM-ignoring reader and a child that closes stdout before its parent returns. C5: both headers name the new unprivileged config query.
|
||||
|
||||
N1: deferred the optional broader MainPID TCP inventory. P8 retains the approved main listener plus 7331/7333 check. N2: removed accepted mos-1101 from MARKS and P_PASS.P10; healthy and failed observations both stay unnamed, per sage-2173. N3: sudo resolves through PATH, matching case1's existing fake seam. N4: F11 retains the default DATA_ROOT Discord check; generalizing it to configured dataRoot is a separate F11 follow-up.
|
||||
|
||||
The README had three obsolete current-usage passages. They now show the socket marker; the remaining mention explicitly says TCP is retired. No deliberate legacy source or test changed. Acceptance still runs F9's existing builtin-only settings parser as root under its existing pinned-path checks; the new query and fixed-system-Python observation run only as the stack user with env -i. P10 separately checks its parent, final socket, process uids, stable MainPID and metadata snapshots. Its probe sends no application bytes. Hostile same-uid changes before or after that snapshot remain the stated residual.
|
||||
|
||||
Static checks: bash -n on both scripts, node --check on both test files, git diff --check, Python AST parsing on the record drivers, all 33 variant shell syntax checks and unique-target validation. All passed. These are not behavioral tests. Five source/test/doc blobs are frozen in CANDIDATE-SHAS.json for the requested slot. UNIQUENESS.json records original and changed hashes for every definition. No suites or checks have run. Driver names, wrapper argv and controller.log avoid the busy detector's patterns; actual commands are loaded from structured JSON only after the busy guard succeeds. Every run uses bash pipefail and tee.
|
||||
|
||||
## Every remaining retired-port hit
|
||||
|
||||
Static source audit, not a test run. Each remaining hit and its reason follows.
|
||||
|
||||
- `packages/cli/tests/case1-accept.test.mjs:594`: New negative saved-argument fixture asserting the migration refusal. Text: `"retired TCP": [(h) => put(h.args, [...ARGS.slice(0,-1),'--tester-port','7333'].join('\n')+'\n',0o644), /case1-accept.sh retires tester TCP; use --tester-socket$/],`
|
||||
- `packages/cli/tests/case1-hostcheck.test.mjs:68`: Deliberate legacy hostcheck fixture; brief step 5 leaves it unchanged. Text: `"[Service]\nExecStart=/opt/mosaic-stack/node/bin/node /srv/mosaic/copies/x/packages/webui/src/cli.mjs serve --port 732 --business mosaic-stack --tester-port 7333\n");`
|
||||
- `packages/cli/tests/case1-hostcheck.test.mjs:215`: Deliberate legacy hostcheck fixture; brief step 5 leaves it unchanged. Text: `put(join(h.root, "etc", "systemd", "system", "mosaic-webui.service"), "[Service]\nExecStart=/x serve --business mosaic-stack --tester-port 7333\n");`
|
||||
- `packages/cli/tests/case2-unit.test.mjs:445`: New negative factory/library fixtures asserting the migration refusal. Text: `["--tester-port", "7333", /case2-unit.sh retires tester TCP; use --tester-socket/],`
|
||||
- `packages/cli/tests/case2-unit.test.mjs:496`: New negative factory/library fixtures asserting the migration refusal. Text: `refuses(unit(h, { profile: "factory", flags: ['--port','443','--business','acme','--tester-port','7333'] }), /case2-unit.sh retires tester TCP; use --tester-socket/);`
|
||||
- `packages/cli/tests/stack-release-external.test.mjs:75`: Legacy stack-release external refusal fixture, excluded by brief step 5. Text: `for(const a of [['activate',C1,'acme','--pm'],['activate',C1,'acme','--tester-port','7444'],['activate',C1,'acme','--no-proof'],['activate',C1,'acme','--no-send'],['activate',C1,'acme','--sso'],['activate',C1,'acme','--proof-header','X','--proof-file','/p'],['rollback','acme'],['gate',B,'acme'],['activate',C1,'acme','--expect-from',B],['confirm',C1,'acme','--rollback',B],['confirm',C1,'acme','--cause','A5']]){`
|
||||
- `packages/cli/tests/stack-release-fixture.mjs:306`: Retained pre-196 copy fixture for legacy activation and rollback. Text: `for(const [f,text,mode] of [['scripts/mosaic',script(mosaicStub),0o755],['packages/webui/src/cli.mjs',[B,C1,C].includes(id)?`// fixture Console, never run\n// serve accepts '--tester-port'\n// serve accepts '--proof-header' (row 178)\n${[C1,C].includes(id)?"// serve accepts '--sso' (row 192)\n":''}`:'// fixture Console before tester listener, never run\n',0o644],['packages/bus/src/store.mjs',store,0o644],['packages/bus/src/migrate-schema.mjs',`(${migrateStub})();\n`,0o644],['packages/plugins/src/kinds.mjs',[C1,C].includes(id)?KINDS_NEW:KINDS_OLD,0o644],...ssoFiles(id).map(([f,text])=>[f,text,0o644])]){`
|
||||
- `packages/cli/tests/stack-release.test.mjs:681`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const testerFlags=(e,port='7333')=>['--port',e.port,'--business','acme','--tester-port',port];`
|
||||
- `packages/cli/tests/stack-release.test.mjs:687`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `let r=await run(e,'activate',C1,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:688`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(pointer(e).console,testerFlags(e));assert.match(consoleText(e),/--tester-port 7333(?:\n|$)/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:690`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `r=await run(e,'activate',B,'acme','--tester-port','7334');assert.equal(r.code,0,r.out+r.err);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:692`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.match(consoleText(e),/--tester-port 7334(?:\n|$)/);assert.doesNotMatch(consoleText(e),/--tester-port 7333/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:693`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.equal((consoleText(e).match(/--tester-port/g)||[]).length,1);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:694`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `r=await run(e,'activate',C1,'acme','--plan');assert.equal(r.code,0,r.out+r.err);assert.match(r.out,/Console: .*--tester-port 7334/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:697`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(pointer(e).console,testerFlags(e,'7334'));assert.match(consoleText(e),/--tester-port 7334(?:\n|$)/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:702`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `let r=await run(e,'activate',B,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:705`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.match(r.out,/drop[^\n]*--tester-port 7333/i);assert.doesNotMatch(r.out.split('\n').find((l)=>l.startsWith('Console: ')),/--tester-port/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:708`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(pointer(e).console,['--port',e.port,'--business','acme']);assert.doesNotMatch(consoleText(e),/--tester-port/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:709`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.match(stepText(e),/drop[^\n]*--tester-port 7333/i);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:714`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const r=await run(e,'activate',A,'acme','--tester-port','7333');assert.equal(r.code,3,r.out+r.err);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:718`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.match(readFileSync(join(repo,'packages/webui/src/cli.mjs'),'utf8'),/--tester-port/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:724`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const r=await run(e,'activate',C1,'acme','--tester-port',value);assert.equal(r.code,4,`${value}: ${r.out}${r.err}`);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:731`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `let r=await run(e,'activate',C1,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:732`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `r=await run(e,'activate',A,'acme','--plan');assert.equal(r.code,0,r.out+r.err);assert.match(r.out,/drop[^\n]*--tester-port 7333/i);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:736`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `edit(join(e.units,CON),'--tester-port 7333','--tester-port 7334');const n=calls(e).length;`
|
||||
- `packages/cli/tests/stack-release.test.mjs:738`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `edit(join(e.units,CON),'--tester-port 7334','--tester-port 7333');`
|
||||
- `packages/cli/tests/stack-release.test.mjs:740`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(pointer(e).console,['--port',e.port,'--business','acme']);assert.doesNotMatch(consoleText(e),/--tester-port/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:741`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.match(stepText(e),/drop[^\n]*--tester-port 7333/i);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:746`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `let r=await run(e,'activate',C1,'acme','--pm-after-harness','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:749`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(pointer(e).console,testerFlags(e));assert.match(consoleText(e),/--tester-port 7333(?:\n|$)/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:821`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const rule=(port,main)=>`--tester-port ${port} is not a whole port from 1024 to 65535 other than 7332${main?` and the Console's --port ${main}`:''}`;`
|
||||
- `packages/cli/tests/stack-release.test.mjs:827`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const r=await run(e,'activate',C1,'acme','--pm-after-harness','--plan','--tester-port',port);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:830`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const u=await run(e,'activate',C1,'acme','--pm-after-harness','--tester-port',port);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:839`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const n=calls(e).length,u=await run(e,'activate',C1,'acme','--tester-port','80');`
|
||||
- `packages/cli/tests/stack-release.test.mjs:843`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `await t.test('a target Console without --tester-port',async(t)=>{`
|
||||
- `packages/cli/tests/stack-release.test.mjs:846`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const r=await run(e,'activate',A,'acme','--tester-port','7333','--plan');`
|
||||
- `packages/cli/tests/stack-release.test.mjs:848`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(r.out.split('\n').filter((l)=>l.startsWith('refuses ')),[`refuses tester-port-target: ${A}'s Console does not support --tester-port`,`refuses unknown-kind-for-target: the business file names plug-in kind(s) harness, which ${A} does not know`]);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:850`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `await refused(e,['activate',A,'acme','--tester-port','7333'],'tester-port-target',`${A}'s Console does not support --tester-port`);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1056`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const r=await run(e,'activate',C1,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1057`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(pointer(e).console,[...expected,'--tester-port','7333']);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1058`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.ok(consoleText(e).includes([...expected,'--tester-port','7333'].join(' ')));`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1129`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `await t.test('tests 1 and 9: the pair goes after the preview flags, before --send and the kept --tester-port, as the unit renders it; a new pair replaces it',async(t)=>{`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1132`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `let r=await prun(e,'activate',C1,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1135`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.ok(out.find((l)=>l.startsWith('Console: ')).endsWith(` ${PREVIEW.join(' ')} ${pair(f).join(' ')} --send --tester-port 7333`));`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1137`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(pointer(e).console,[...pre,...pair(f),'--send','--tester-port','7333']);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1138`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.ok(conExec(e).endsWith(` --checkout ${repo} ${[...pre,...pair(f),'--send','--tester-port','7333'].join(' ')}`),conExec(e));`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1141`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(pointer(e).console,[...pre,...pair(g,'X-Proof-Two'),'--send','--tester-port','7333']);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1162`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `await refused(e,['activate',B,'acme','--tester-port','7333'],'already-active',`${B} is the pointer's copy`);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1351`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const e=await mk(t),base=await seedPreview(e,undefined,['--send','--tester-port','7333']),want=noSend(base);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1352`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(want.slice(-2),['--tester-port','7333']);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1367`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `await refused(e,['activate',B,'acme','--tester-port','7333'],'already-active',`${B} is the pointer's copy`);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1468`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const ROLLBACK_PLAN=(set)=>`sso: dropped; ${B}'s Console does not support --sso, so the rollback takes the Console flags from ${set}/${SHOW}, with --send and --tester-port as the pointer has them`;`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1480`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `let r=await prun(e,'activate',B,'acme','--tester-port','7333',...pair(f));assert.equal(r.code,0,r.out+r.err);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1481`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(pointer(e).console,[...pre,...pair(f),'--send','--tester-port','7333']);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1483`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const want=['--port',e.port,'--business','acme','--sso','--send','--tester-port','7333'];`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1486`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: ``sso: on; drops ${DROPS}; carries --port ${e.port} --business acme --send --tester-port 7333`]);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1563`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const out=await planOnly(e,3,'activate',C,'acme','--sso','--tester-port','80');`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1564`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(out.filter((l)=>l.startsWith('refuses ')),[`refuses tester-port-invalid: --tester-port 80 is not a whole port from 1024 to 65535 other than 7332 and the Console's --port ${e.port}`,`refuses sso-slot: ${bad('is inside the repository or the copies')}`]);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1584`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const e=await mk(t),base=await seedPreview(e,undefined,['--send','--tester-port','7333']);await ssoConfig(e);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1594`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `const want=[...noSend(base.slice(0,-2)),'--tester-port','7333'];`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1682`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(ssoLines(await planOnly(a,0,'rollback','acme')),[`sso: dropped; ${B}'s Console does not support --sso, so the rollback takes the Console flags from ${set}/${show}, with --send and --tester-port as the pointer has them`]);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:1811`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `writeFileSync(e.pointer,JSON.stringify({copy,business:'acme',pm:true,claude:e.claude,console:['--port',e.port,'--business','acme','--tester-port',TESTER],schema:store,activation:'manual',at:'2026-10-20T00:00:00Z'})+'\n');`
|
||||
- `packages/cli/tests/stack-release.test.mjs:2198`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `['beta\'s tester port on alpha\'s port',b,['--port',free,'--tester-port',a.port],1,`webui-service: refusing port-claimed: ${held}; nothing was changed\n`],`
|
||||
- `packages/cli/tests/stack-release.test.mjs:2202`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `['beta\'s tester port on 7333',b,['--port',free,'--tester-port','7333'],4,'webui-service: port-reserved: 7333 is reserved for the default instance (7330 7332 7333)\n'],`
|
||||
- `packages/cli/tests/stack-release.test.mjs:2217`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `await refused('--tester-port','--tester-port',a.port);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:2280`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `let r=await run(e,'activate',B,'acme','--tester-port','7333');assert.equal(r.code,0,r.out+r.err);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:2290`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `r=await run(e,'activate',C1,'acme','--tester-socket','--plan');assert.equal(r.code,0,r.out+r.err);assert.match(r.out,/--tester-socket/);assert.match(r.out,/drop.*--tester-port 7333/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:2292`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.deepEqual(pointer(e).console,[...base,...pair(proof),'--tester-socket']);assert.match(consoleText(e),/--tester-socket/);assert.doesNotMatch(consoleText(e),/--tester-port/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:2319`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.doesNotMatch(conExec(e),/ --send(?: |$)|--tester-port|--public-host|--proof-header/);`
|
||||
- `packages/cli/tests/stack-release.test.mjs:2388`: Legacy release compatibility, rollback, pointer and migration assertions; brief step 5. Text: `assert.equal(context.argv.includes('--tester-socket'),marked);assert.equal(context.argv.includes('--tester-port'),false);`
|
||||
- `packages/webui/README.md:1001`: Current retirement notice explicitly states no tester TCP listener. Text: `There is no tester TCP listener. `--tester-port` is retired for this copy.`
|
||||
- `packages/webui/src/cli.mjs:30`: Current CLI explicit retirement refusal, not an activation path. Text: `if (flag === '--tester-port') throw new Error('--tester-port retired; activate explicitly with --tester-socket');`
|
||||
- `packages/webui/tests/service.test.mjs:125`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `const r = await run(dir, ['render', '--tester-port', port, ...PREVIEW, '--send']);`
|
||||
- `packages/webui/tests/service.test.mjs:127`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `assert.match(execStart(r.stdout), new RegExp(` --tester-port ${port}( |$)`));`
|
||||
- `packages/webui/tests/service.test.mjs:129`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `assert.ok(execStart(r.stdout).endsWith(` ${PREVIEW_FLAGS} --send --tester-port ${port}`));`
|
||||
- `packages/webui/tests/service.test.mjs:136`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `const r = await run(dir, ['render', '--port', main, '--tester-port', '7332']);`
|
||||
- `packages/webui/tests/service.test.mjs:150`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `['--tester-port', ''], ['--tester-port', '1023'], ['--tester-port', '65536'],`
|
||||
- `packages/webui/tests/service.test.mjs:151`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `['--tester-port', '-1'], ['--tester-port', '3.5'], ['--tester-port', '1e4'],`
|
||||
- `packages/webui/tests/service.test.mjs:152`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `['--tester-port', 'abc'], ['--tester-port', '7333 '], ['--tester-port', '7333\n'],`
|
||||
- `packages/webui/tests/service.test.mjs:153`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `['--port', '7444', '--tester-port', '7444'],`
|
||||
- `packages/webui/tests/service.test.mjs:154`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `['--tester-port', '7444', '--port', '7444'],`
|
||||
- `packages/webui/tests/service.test.mjs:164`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `assert.equal((await run(dir, ['render', '--tester-port'])).status, 4);`
|
||||
- `packages/webui/tests/service.test.mjs:172`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `const six = await run(dir, ['render', '--tester-port', '007333']);`
|
||||
- `packages/webui/tests/service.test.mjs:175`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `assert.equal(six.stderr, 'webui-service: --tester-port must be 1024..65535, different from --port and never 7332: 007333\n');`
|
||||
- `packages/webui/tests/service.test.mjs:176`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `const five = await run(dir, ['render', '--tester-port', '07333']);`
|
||||
- `packages/webui/tests/service.test.mjs:178`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `assert.ok(execStart(five.stdout).endsWith(' --tester-port 07333'), execStart(five.stdout));`
|
||||
- `packages/webui/tests/service.test.mjs:186`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `const installed = await run(dir, ['install', ...INSTALL, '--dir', unitDir, '--no-reload', '--port', String(port), '--tester-port', '1024', ...PREVIEW, '--send'], bin);`
|
||||
- `packages/webui/tests/service.test.mjs:188`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `assert.match(installed.stdout, /^serve: .* --tester-port 1024( |$)/m);`
|
||||
- `packages/webui/tests/service.test.mjs:189`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `assert.match(execStart(readFileSync(join(unitDir, 'mosaic-webui.service'), 'utf8')), / --tester-port 1024( |$)/);`
|
||||
- `packages/webui/tests/service.test.mjs:199`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `const refused = await run(dir, [verb, '--dir', unitDir, '--tester-port', '7333'], bin);`
|
||||
- `packages/webui/tests/service.test.mjs:799`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `const r = await run(dir, ['install', ...INSTALL, '--dir', unitDir, '--no-reload', '--port', String(port), ...PREVIEW, '--send', '--tester-port', '1024', '--proof-header', 'x-console-proof', '--proof-file', file], bin);`
|
||||
- `packages/webui/tests/service.test.mjs:813`: Legacy unit renderer/parser compatibility and mixed-flag refusal fixtures; brief step 5. Text: `const both=await run(dir,['render','--tester-socket','--tester-port','7333']);`
|
||||
- `packages/webui/tests/tester-cli.test.mjs:25`: Explicit current-CLI negative calls; brief step 5. Text: `for (const flags of [['--tester-port', '7332'], ['--port', '7444', '--tester-port', '7444'], ['--tester-port', '7444', '--port', '7444'], ...['1023', '65536', '1.5', '-1', 'nope'].map(p => ['--tester-port', p])]) {`
|
||||
- `scripts/case1-accept.sh:71`: New explicit migration refusal for saved old arguments. Text: `--tester-port) refuse "case1-accept.sh retires tester TCP; use --tester-socket" ;;`
|
||||
- `scripts/case2-unit.sh:215`: New explicit migration refusal before rendering units. Text: `--tester-port) die "case2-unit.sh retires tester TCP; use --tester-socket" ;;`
|
||||
- `scripts/instance.sh:114`: Legacy installed-unit port inventory/parser retained by brief step 5. Text: `# this instance's, whose ExecStart takes PORT as --port or --tester-port.`
|
||||
- `scripts/instance.sh:132`: Legacy installed-unit port inventory/parser retained by brief step 5. Text: `--tester-port) [[ "$tok" =~ ^[0-9]{1,5}$ ]] && ports+=("$((10#$tok))") ;;`
|
||||
- `scripts/stack-release.sh:47`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `stack-release.sh activate ID BUSINESS [--pm | --pm-after-harness] [--migrate] [--tester-socket | --tester-port N (legacy copies)]`
|
||||
- `scripts/stack-release.sh:63`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `activate and rollback --plan take --expect-from OLD. --pm, --pm-after-harness, --tester-port, the`
|
||||
- `scripts/stack-release.sh:126`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `--tester-port) [ "$OP" = activate ] && [ $# -ge 2 ] && [ -n "$2" ] || usage; TESTER_PORT="$2"; shift 2 ;;`
|
||||
- `scripts/stack-release.sh:797`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `elif grep -q -- '--tester-port' "$cli"; then supported=1; fi`
|
||||
- `scripts/stack-release.sh:800`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `--tester-port) i=$((i + 1)); inherited="${BASE_CONSOLE[i]:-}" ;;`
|
||||
- `scripts/stack-release.sh:814`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `[ -z "$inherited" ] || DROP_TESTER="--tester-port $inherited (replaced by private Unix socket)"`
|
||||
- `scripts/stack-release.sh:830`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `check_refuse tester-port-invalid "--tester-port $TESTER_PORT is not a whole port from 1024 to 65535 other than 7332$other"`
|
||||
- `scripts/stack-release.sh:832`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `[ "$supported" = 1 ] || check_refuse tester-port-target "$TO's Console does not support --tester-port"`
|
||||
- `scripts/stack-release.sh:833`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `RUN_CONSOLE=("${without_tester[@]}" --tester-port "$TESTER_PORT")`
|
||||
- `scripts/stack-release.sh:837`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `RUN_CONSOLE=("${without_tester[@]}") DROP_TESTER="--tester-port $inherited"`
|
||||
- `scripts/stack-release.sh:878`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `# --send and --tester-port follow the pointer, so a --no-send or a tester port set after that`
|
||||
- `scripts/stack-release.sh:885`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `--tester-port) i=$((i + 1)) ;;`
|
||||
- `scripts/stack-release.sh:893`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `--tester-port) i=$((i + 1)); BASE_CONSOLE+=(--tester-port "${P_CONSOLE[i]:-}") ;;`
|
||||
- `scripts/stack-release.sh:897`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `SSO_PLAN="sso: dropped; $TO's Console does not support --sso, so the rollback takes the Console flags from $set/$f, with --send and --tester-port as the pointer has them"`
|
||||
- `scripts/stack-release.sh:903`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `# --tester-port. Sets SSO_DROP (the plan's dropped preview flags), PROOF_PLAN and PROOF_STEP.`
|
||||
- `scripts/stack-release.sh:919`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `case "${kept[i]}" in --send | --tester-port | --tester-socket) break ;; esac`
|
||||
- `scripts/stack-release.sh:1076`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `case "${without_proof[i]}" in --send | --tester-port | --tester-socket) break ;; esac`
|
||||
- `scripts/stack-release.sh:1134`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `# Row 190: the target Console's --port (7332 when absent) and --tester-port against every other`
|
||||
- `scripts/stack-release.sh:1142`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `--tester-port) ports+=("${RUN_CONSOLE[i + 1]:-}") ;;`
|
||||
- `scripts/stack-release.sh:2106`: Legacy-copy activation/rollback, port inventory and migration retained by brief step 5. Text: `for ((i = 0; i < ${#P_CONSOLE[@]}; i++)); do [ "${P_CONSOLE[i]}" != --tester-port ] || reserved+=("${P_CONSOLE[i + 1]:-}"); done`
|
||||
- `scripts/webui-service.sh:43`: Legacy unit renderer/parser and port inventory retained by brief step 5. Text: `# Console), --tester-socket (private Unix tester), or legacy --tester-port N`
|
||||
- `scripts/webui-service.sh:74`: Legacy unit renderer/parser and port inventory retained by brief step 5. Text: `# --tester-port that another installed Console unit in the unit directory`
|
||||
- `scripts/webui-service.sh:96`: Legacy unit renderer/parser and port inventory retained by brief step 5. Text: `FLAGS: [--port N] [--business ID] [--board URL] [--sso [--send] | --public-host NAME --auth-header HEADER --allow-user ID [--send]] [--tester-socket | --tester-port N (legacy copies)] [--proof-header NAME --proof-file PATH]`
|
||||
- `scripts/webui-service.sh:97`: Legacy unit renderer/parser and port inventory retained by brief step 5. Text: `--tester-port: legacy copies only; 1024..65535, different from --port and never 7332; loopback tester listener.`
|
||||
- `scripts/webui-service.sh:137`: Legacy unit renderer/parser and port inventory retained by brief step 5. Text: `--tester-port) [ $# -ge 2 ] || usage; TESTER_PORT="$2"; TESTER_SET=1; SERVE_SET=1; shift 2 ;;`
|
||||
- `scripts/webui-service.sh:182`: Legacy unit renderer/parser and port inventory retained by brief step 5. Text: `echo "webui-service: --tester-port must be 1024..65535, different from --port and never 7332: $TESTER_PORT" >&2`
|
||||
- `scripts/webui-service.sh:266`: Legacy unit renderer/parser and port inventory retained by brief step 5. Text: `[ "$TESTER_SET" = 0 ] || flags="$flags --tester-port $TESTER_PORT"`
|
||||
- `scripts/webui-service.sh:462`: Legacy unit renderer/parser and port inventory retained by brief step 5. Text: `if grep -Eq '^ExecStart=.*( --allow-user [^ ][^ ]*( --proof-header [^ ]+ --proof-file /[^ ]+)?| --sso) --send( --tester-port [0-9]+| --tester-socket)?$' "$target"; then`
|
||||
- `scripts/webui-service.sh:467`: Legacy unit renderer/parser and port inventory retained by brief step 5. Text: `if grep -Eq '^ExecStart=.* --sso( --send)?( --tester-port [0-9]+)?$' "$target"; then`
|
||||
- `scripts/webui-service.sh:471`: Legacy unit renderer/parser and port inventory retained by brief step 5. Text: `tester_port="$(sed -n 's/^ExecStart=.* --tester-port \([0-9][0-9]*\)$/\1/p' "$target")"`
|
||||
|
||||
Sage-2191 accepted the requested scope and queued it behind the re-pin, 194, 202 and 254 windows. No CLEAR yet. TMPDIR will be created with `mktemp -d /mnt/storage/scratch/tmp/gXXXXXX`. STATIC.json records final syntax/diff results; no behavioral tests have run. No product commit or push has been made before the applicable suites pass.
|
||||
|
||||
Grant sage-2279 run1: both intended RED cases observed. First installer GREEN file 35/1 in 17.231 s: EEXIST in the pre-existing outside-secrets test because the shared hub now creates dataRoot. Changed only that mkdir to recursive; its refusal assertion stays unchanged. No product bytes changed. Recorded old/new test SHA in run1/fixture-fix.json. Harness now explicitly selects TAP for machine counts and supports GREEN-only resume. This is the first unexpected failure; a second ends the window.
|
||||
|
||||
Grant sage-2279 run1 ended on unexpected failure 2, reported to Sage and Mos as gander-0073, slot returned 2026-10-22T00:34:10Z. Acceptance whole 27/1 in 41.962 s: the broad new od fake intercepted F3 random-token generation as well as the ELF header read. Narrowed only that fake to -An -tx1 -N4; all other calls exec /usr/bin/od. The 12-hex assertion stays unchanged. Product blobs have not changed during the window. No tests run after the stop, and no checks/full suites/shell files started. run1/SUMMARY.json sums all raw logs; sweep count 0. Need a new CLEAR before any rerun.
|
||||
|
||||
Sage-2287 approves both test-only fixture fixes and requests their commit with unchanged assertions. Commit contains the two prepared row253 test files and packet, including both old/new test SHA pairs and raw run1 results. Product scripts, README and root BUILD-LOG remain uncommitted. PORT-AUDIT.md/json refresh current line numbers after the od fake grew two lines. The earlier audit above describes the pre-fix candidate. Next CLEAR scope: both whole touched files, M1-M33, cli and webui whole and ten shell scripts. Intended RED carries under unchanged product bytes; no further test has run.
|
||||
|
||||
## C4 static gap and addendum
|
||||
|
||||
Grant sage-2297: installer whole36/0 in16.449s, acceptance whole28/0 in37.550s, M1-M33 killed33/33 (bases11.808s, changed runs41.202s), CLI whole755/0 in597.084s. Webui was deliberately interrupted after4.736s for a static C4 gap; it is not a failed test under sage-2307 item5 and has no completed total. Ten shells never started. Slot returned with sweep0 as gander-0076. run2/SUMMARY.json is script-summed from the preserved results and raw logs.
|
||||
|
||||
The current outer GNU timeout kills its own group, but sudo(8) Process model documents a pty monitor creating a different terminal session. Signal handling says SIGKILL cannot be relayed. The exec fake does not cover that path. No host experiment ran. Duckworth-0109/0110 at2c49dd80c confirms the static gap. DESIGN.md remains unchanged; DESIGN-C4.md proposes the after-uid supervisor and independent outer bound, states the stalled-supervisor residual, compares runtime options and records the old talk watchdog as a proposed bounded follow-up.
|
||||
|
||||
Sage-2307/2312 authorizes writing the fake and addendum without tests. The shared case-sudo-fixture.mjs is now imported by both host-script tests. It preserves exec mode and offers a parent/setsid/catchable-signal hop mode with PID/SID records. A new installer counterexample blocks a TERM/HUP-resistant copy under both modes and checks session/PID cleanup; its explicit fixture cleanup only kills recorded fixture PIDs. This draft fake has not run, and no syntax execution is claimed for it. The two script product blobs remain exactly the granted bytes; test bytes now differ for the draft counterexample and shared seam. No repair is implemented.
|
||||
|
||||
The next action is Duckworth's static ruling on DESIGN-C4.md and the fake commit, not a test run. If product changes, the completed gate results are historical only and the whole gate reruns on Sage's next CLEAR. C4 now means killed at the inner bound and root never waits past the outer bound; a stopped/killed supervisor and setsid escape remain the same-uid residual. No root cross-session killer is proposed.
|
||||
|
||||
For the static pass, c4/*.sh.txt are non-executable snapshots of the exact granted product source. FROZEN-PRODUCT.json pins their equality to the uncommitted source blobs. They are review records, not an implemented repair or a product commit.
|
||||
|
||||
## C4 repair prepared for static review
|
||||
|
||||
Duckworth-0111 approves DESIGN-C4.md with C1-C5. The repaired scripts now contain the same inline supervisor payload after the uid drop. It uses fixed validated system binaries, starts a query session without setsid -f/-w, confirms SID equals the child PID from the kernel, reads whole stat files, scans every process group in that session, and reaps its direct child. Query bounds are inner 5 s / outer 7 s; peer bounds are 2 s / 4 s. Separate trusted timeout notices distinguish the outer refusal from a child exit status. Both headers name the bounds and tools.
|
||||
|
||||
The shared fake retains exec mode and a separate-session parent mode. Exact inner, outer and output-limit reasons are asserted in both modes. The setpgid child has a comm containing a closing parenthesis, space and newline. Session cleanup checks all members of recorded self-led sessions as well as exact recorded PIDs; exec mode never scans the runner's session. Every fixture cleanup kill checks the recorded SID against the kernel immediately before signalling. The stalled-supervisor case deliberately records the same-uid residual, refuses without using stdout, and performs explicit fixture cleanup. The outer timing slack is 2 s. The post-return polling budget remains 50 x 10 ms.
|
||||
|
||||
M1-M33 were retargeted where the repair changed source, with M34-M39 for absent inner/outer supervision, group-only cleanup, unbounded read, dropped setsid and one-copy payload drift. All 39 target strings occur exactly once in a static byte check. These are proposed checks, not kill results. The old runs remain historical evidence only: product bytes changed, so the entire gate must rerun on Sage's next CLEAR after the short static pass. No repaired-source syntax check, test, probe or host experiment has run. git diff --check reports no whitespace errors.
|
||||
|
||||
F5 now names row 276 / #1781 in docs/plans/DEFERRED.md (sage-2331). That path will be in the row253 manifest. c4/UPSTREAM-PATHS.json records the requested 968db0bcd..ddfb29af7 comparison and the branch-base comparison. Only DEFERRED.md overlaps upstream since c3d88840c; its current upstream text was preserved before appending this row's entry. The branch-to-refactor comparison also lists the unlanded test files on our side. No rebase was performed.
|
||||
|
||||
c4/REPAIR.diff, *.repair.txt and REPAIR-SHAS.json freeze the complete repair for Duckworth's C1/C3/C5 static look. The original c4/*.sh.txt and FROZEN-PRODUCT.json stay unchanged. The runnable product and test files remain uncommitted pending the applicable gate; this packet commit is records only. No node_modules path is included.
|
||||
|
||||
2026-10-22 02:13:30 UTC: sage-2335 publishes b64aa316a and explicitly requires a committed runnable candidate before the gate. Accordingly the seven repaired source/test/doc paths, the existing BUILD-LOG append and this record are committed now. All seven bytes still match c4/REPAIR-SHAS.json; this commit changes no reviewed packet source. CANDIDATE-SHAS.json is refreshed for the new gate. MANIFEST.sha256 covers the eight product/test/doc/log paths, including DEFERRED.md. No repaired-source verification ran; the static verdict and CLEAR remain pending, and all old results are historical only.
|
||||
|
||||
## duckworth-0112 delta, no runs
|
||||
|
||||
B1: both supervisor copies use fork-free IFS= read -r -d '' with content-based EOF/error handling. The 250 ms confirmation budget starts after the first full inventory pass. A deterministic stand-in clock test pins this placement without wall timing or real signals; M40 moves the budget back before pass one. All 40 proposed targets statically occur once. No test or syntax execution ran.
|
||||
|
||||
M1: BUILD-LOG.md is removed from MANIFEST.sha256. Its row253 phase lines land as a separate doc-only append after code, preserving newer upstream lines, under sage-2342. The manifest now has seven entries. The initial eight-entry manifest is superseded.
|
||||
|
||||
N4: SID confirmation now waits within the existing inner watchdog budget rather than only 100 sleeps. It still refuses a vanished/unreadable child or unconfirmed session, and the independent outer bound remains. N1/N2 are explicitly deferred in the existing F5 entry to row276 / #1781, as Sage rules. No case1 analogue checks were added in this delta.
|
||||
|
||||
The required gate base is the refactor tip Sage names at CLEAR, 378a76b85 or later. This delta is prepared on the current seat branch for static review only; no old-base gate is authorized. The final integrated gate candidate will get fresh hashes and integration records before execution. c4/delta-0112/ freezes the seven source/test/doc paths, the delta from aa81ca390, and static uniqueness. Prior frozen packets remain unchanged.
|
||||
|
||||
Duckworth-0113 approves 761893dac after git reads only (8d3fa3f20). B1 and M1 are closed; real timing remains unverified until the gate. N5 is harmless diagnostic noise on a vanished stat entry: the input redirection can report before stderr is redirected, and tester_capture discards supervisor stderr. No source change is made for it. N6 is recorded with R3: if the inner watchdog expires before kernel SID confirmation, finish has only the known child PID and kills that PID, not an unverified session. Other members may remain. Root still refuses, discards stdout and waits only within the outer bound. This is an explicit limit of cleanup before session identity is established, not a claim that the session was swept. The independent outer bound does not prove cross-session cleanup. Source/test bytes and the seven-entry manifest remain exactly those approved at 761893dac.
|
||||
|
||||
Sage-2463 integration onto 0fa7bf421: new gander/row253-0fa7 preserves both earlier branches. Only BUILD-LOG append conflicted; current upstream remains an exact prefix. README auto-merged with row191 processing controls. Focused row253 tests do not read the changed Console/processing code, but WebUI whole covers it on this base. Only README changed in the manifest; refreshed digest 24b6a01b2ede6f025ec898fa4ec830bb9585ce6151d6298e713e31c7430a502b. integration-0fa7/ records source-only dependency inspection, range-diff and every commit patch-id. No test/syntax/probe ran.
|
||||
|
||||
## Re-integration under sage-2659, no runs
|
||||
|
||||
New branch gander/row253-385a on385a7194c, rebased source141b79c29. Only the BUILD-LOG append conflicted; kept upstream as exact prefix. Runtime scripts, focused tests and shared fixture match8de88458d byte for byte. DEFERRED/README absorb upstream additions; manifest72a70e99ba0416ceb1f63ed737132ebbeb212332d1441c362b3dfa6c8b00209c. integration-385a/ holds the range-diff, full and no-log patch-ids, upstream manifest diff, test import/read drift and40 unique targets. No test or Node ran.
|
||||
|
||||
The focused tests indirectly import Store through CLI helpers, so they read/hash-check current schema.sql and migrations. 264a changes3k-to-3l ahead of this gate and needs a dependency re-check before CLEAR, even if its manifest overlap is empty. Whole stack-release T46 also reads current schema. case2 sandbox availability skip remains named under Duckworth0116 N9. The real Console files moved in278, but the focused tests write Console/config stand-ins; wholeWebUI covers the real changes.
|
||||
|
||||
SHELL-LIMITS.json now includes fresh278 run3 receipts. Same ceil(3*longest)+120 formula; foundation maximum39.901s gives240s. window.py uses each recorded whole-shell limit, and driver.py classifies GNUtimeout124/137 as timeout, never kill. No script/product/assertion changed. Historical row253 results carry nothing after C4.
|
||||
|
||||
| Shell | Longest recorded seconds | Limit seconds |
|
||||
|---|---:|---:|
|
||||
| scripts/test-auth.sh | 1.908123 | 126 |
|
||||
| scripts/test-conductor.sh | 8.057174 | 145 |
|
||||
| scripts/test-config.sh | 3.167892 | 130 |
|
||||
| scripts/test-discord.sh | 8.776728 | 147 |
|
||||
| scripts/test-extension-package.sh | 3.012857 | 130 |
|
||||
| scripts/test-foundation.sh | 39.901000 | 240 |
|
||||
| scripts/test-land-work.sh | 12.623263 | 158 |
|
||||
| scripts/test-queue.sh | 23.443742 | 191 |
|
||||
| scripts/test-release.sh | 12.168674 | 157 |
|
||||
| scripts/test-task.sh | 36.783798 | 231 |
|
||||
|
||||
## Post264a integration, sage-2698, no runs
|
||||
|
||||
New gander/row253-264a rebases eleven commits onto84f53540d without conflicts; every pair and patch-id equals the385a branch. Rebased sourceb9d3d4c75c78aa6b06aefd734da781bef9b7f1da. Only DEFERRED absorbs upstream changes; seven-path manifest735fa2d7405d01ace8eb7aab366753fa5b1877cf8044b0151cb2113a0502bc1f. All runnable253 blobs unchanged. Store now loads schema3l and3k-3l migration from the landed base. integration-264a/ records the exact upstream drift and27 whole runnable test-file union (upstream-changed tests plus own focused files). Shared fixture is covered by importers. No carried result. Ask Sage for focused CLEAR, then publish after those whole files pass, then Duckworth rebase read, then whole gate on another CLEAR. N9 exact sandbox skip reason must be copied from the case2 log. No execution or push ran during integration.
|
||||
|
||||
## Corrected docs base, sage-2700/2702, no runs
|
||||
|
||||
New gander/row253-b789 rebases ontob78918850. Sourcec75c9bbd3339cb2343467715a14455044c2e4aea. Only append conflicts in BUILD-LOG and DEFERRED: current base remains exact byte prefix,253 entries appended. No old entry edited or removed. Manifest573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae. Five runnable blobs and README match preceding candidate; only DEFERRED hash changes.27-file whole union unchanged, no result carries. Hold branch local: final Gizmoduck docs tip must land first, then rebase/publish and focused CLEAR. No tests/Node/push. integration-b789/ records the resolution and hashes.
|
||||
|
||||
## Final base aca16404c, sage-2705, before execution
|
||||
|
||||
New gander/row253-aca1 rebases13 commits ontoaca16404c without conflicts; all13 final-hop pairs equal. Sourceed3bb376cdd5128dc58b3aa193282e1c2bfcf57d. Seven blobs unchanged, manifest573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae. Both append paths retain the full base prefix. Final upstream docs/queue changes touch no focused read.27-file union remains unchanged.
|
||||
|
||||
Step2 file bounds: every file listed in integration-aca1/FILE-LIMITS.json runs whole as timeout -k10 300 node --test --test-reporter=tap FILE, outer harness330s. Own case1/case2 first, then25 others. Busy check before each start, pipefail and tee, TMPDIR from mktemp-d /mnt/storage/scratch/tmp/gXXXXXX. First unexpected failure or timeout stops to Sage/Mos unplaced; no retry. Print HEAD and manifest digest first. No test has run. Expect10-15min; status at15min. Whole-suite limits are separate and will be written before whole-gate CLEAR.
|
||||
|
||||
Whole-shell limits remain as in the earlier table and SHELL-LIMITS.json:auth126,conductor145,config130,discord147,extension130,foundation240,land-work158,queue191,release157,task231. Each is at least3x its longest recorded successful whole run. No script changed.
|
||||
|
||||
## Focused27 green under sage-2709
|
||||
|
||||
Fresh candidate0604d91fc onaca16404c, manifest573c51cf. HEAD and digest are the first controller-log line, followed by the full900s CLI/300s bus-WebUI limit header before any test. Actual run14:30:03Z to2026-10-22T14:44:57Z, 894.0 wall seconds. All27 files whole604/0/0, timeout0, no retry or busy refusal. Commands use timeout-k10 per file, pipefail/tee and scratch gXXXXXX TMPDIR. No product/test/assertion changed. Entire seven-path manifest verifies after the run.
|
||||
|
||||
N9 did not skip. Verbatim case2 result: `ok 43 - inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds`. There are no skip lines in any focused file. Later wholeWebUI and shell skips are not measured by this focused scope.
|
||||
|
||||
Every measured file duration and its later3x basis follows. The last column is ceil(3*measured whole-file wall)+120, not a completed whole-gate result. Historical C4 gates carry nothing. The whole gate still awaits separate CLEAR and Duckworth rebase review.
|
||||
|
||||
# Focused27 whole-file results
|
||||
|
||||
| Whole file | Pass/fail/skip | Wall seconds | Command limit seconds | Next3x plus120 basis |
|
||||
|---|---:|---:|---:|---:|
|
||||
| packages/cli/tests/case1-accept.test.mjs | 34/0/0 | 99.281 | 900 | 418 |
|
||||
| packages/cli/tests/case2-unit.test.mjs | 43/0/0 | 66.418 | 900 | 320 |
|
||||
| packages/bus/tests/account-migration.test.mjs | 3/0/0 | 0.415 | 300 | 122 |
|
||||
| packages/bus/tests/chief-of-staff.test.mjs | 42/0/0 | 2.168 | 300 | 127 |
|
||||
| packages/bus/tests/comment-migration.test.mjs | 5/0/0 | 0.565 | 300 | 122 |
|
||||
| packages/bus/tests/end-launch.test.mjs | 7/0/0 | 0.415 | 300 | 122 |
|
||||
| packages/bus/tests/fire-revokes-grants.test.mjs | 22/0/0 | 3.271 | 300 | 130 |
|
||||
| packages/bus/tests/gitea-grant.test.mjs | 49/0/0 | 8.634 | 300 | 146 |
|
||||
| packages/bus/tests/gitea-migration.test.mjs | 5/0/0 | 0.415 | 300 | 122 |
|
||||
| packages/bus/tests/grant-executor.test.mjs | 42/0/0 | 21.562 | 300 | 185 |
|
||||
| packages/bus/tests/grant-migration.test.mjs | 6/0/0 | 0.465 | 300 | 122 |
|
||||
| packages/bus/tests/lifecycle-revoke.test.mjs | 8/0/0 | 0.665 | 300 | 122 |
|
||||
| packages/bus/tests/message-filter.test.mjs | 6/0/0 | 0.515 | 300 | 122 |
|
||||
| packages/bus/tests/name-migration.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
|
||||
| packages/bus/tests/schema.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
|
||||
| packages/bus/tests/sessions.test.mjs | 7/0/0 | 0.615 | 300 | 122 |
|
||||
| packages/bus/tests/spec-migration.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
|
||||
| packages/bus/tests/tester-writes.test.mjs | 8/0/0 | 0.565 | 300 | 122 |
|
||||
| packages/bus/tests/thread-claims.test.mjs | 6/0/0 | 0.264 | 300 | 121 |
|
||||
| packages/bus/tests/thread-migration.test.mjs | 3/0/0 | 0.365 | 300 | 122 |
|
||||
| packages/bus/tests/threads.test.mjs | 17/0/0 | 1.216 | 300 | 124 |
|
||||
| packages/bus/tests/usage-migration.test.mjs | 1/0/0 | 0.214 | 300 | 121 |
|
||||
| packages/cli/tests/lifecycle.test.mjs | 24/0/0 | 13.296 | 900 | 160 |
|
||||
| packages/cli/tests/stack-release.test.mjs | 218/0/0 | 583.453 | 900 | 1871 |
|
||||
| packages/cli/tests/thread-cli.test.mjs | 11/0/0 | 1.876 | 900 | 126 |
|
||||
| packages/cli/tests/thread-launch.test.mjs | 11/0/0 | 16.603 | 900 | 170 |
|
||||
| packages/webui/tests/chat.test.mjs | 23/0/0 | 0.515 | 300 | 122 |
|
||||
|
||||
N9 verbatim: ok 43 - inside a session's sandbox a bind below 1024 fails with EACCES, and a bind on a free high port succeeds
|
||||
|
||||
|
||||
Sweep0 run-created leftovers. Initial broad sweep found nine current MCP/npm/code-mode infrastructure processes, all started14:20:57-14:21:07Z before this run14:30:03Z. UTC ps and /proc start ticks are retained; initial output saved, no signalling. Deleted cwd under run TMPDIR is included. No old-PID assumption replaces the receipt check.
|
||||
|
||||
Sage2711/2714 reported unrelated queue reads/write and Python reads by other seats. First and subsequent busy checks passed; no retry was needed and no effect is attributed to those processes. No live data was read by this seat. Raw command/log paths and all27 totals live in run3-focused/files/results.json and SUMMARY.json. Return slot after the record publication; no whole suite or M1-M40 batch starts here.
|
||||
|
||||
## Whole gate2737/2739, before execution
|
||||
|
||||
HEAD34401e7c9, product0604d91fc, manifest573c51cf. Outside agents/gander the record-tip diff is only BUILD-LOG.md, skipped by gate-lane-auth SKIP_COPY per Sage2739. Full lists/counts are printed in run3-gate/HEADER.json before first test. Serial CLI whole55 files,WebUI whole58 files, plus the20 bus files in the rebase union (subset coverage, not a bus-whole claim). Every Node call including RED/controls/changes is timeout-k10 with its killer/whole file measured bound, or900 for an unmeasured file, outerwait+30. WHOLE-GATE-LIMITS.json pins this. The two touched case files also run whole after intended REDs. M1-M40 then serial package/union files and10 shells; every mutation restores exact bytes/status before next. Shell table unchanged. First unexpected pre-existing red/product suspect/loosened assertion/timeout/second red stops unplaced. First-run own new-test red may be placed under2737, but no automatic loosening. No whole-gate test run yet.
|
||||
|
||||
## Whole gate2737 stopped unplaced atM21
|
||||
|
||||
Run started14:59:22Z. Two intendedREDs observed, exact restoration. Touched whole case243/0/0 in66.112s; case134/0/0 in93.721s. N9 ran and passed. M1-M20 killed;M21survived1/0 in8.581s against8.532s base.9controls passed,0timeouts. M22-M40 and all full-package/union/shell stages NOTRUN. Driver restored bytes/status; all7manifest checks pass, packages/scripts diff empty. Sweep0run-created leftovers. Stopped and returned slot as0106 before any retry/edit.
|
||||
|
||||
M21 drops only the peer regex end anchor. peer-malformed already writes a valid three-number prefix plus extra text, but the aggregate passingTAP does not expose the returnedreason. No loggedP10line can be quoted fromM21 orM17-base. Static trace shows onlyP10peerprobe executes PYTHON_STUB; configandearlierchecks useNode/shell, while tester_python reads metadata/ELF only. See run3-gate/STATIC-TRACE.md.
|
||||
|
||||
Mos1293requires a scratch-base diagnostic onSagegap, all17P10lines, then exactdesignreasonassertions. peer-malformed expectsprobe. Unexpecteddesignreason or anyproductchange goes toMosbeforeedits. No diagnostic or repair yet. Newcandidate/manifest/review and entiregatefromstart, no carry. Stop packet committed locally; helperpushwaitsforgap.
|
||||
|
||||
## Fixture-only M21 repair, mos1297, not run
|
||||
|
||||
Diagnostic(a) on0604 observed probe-inner-session for peer-malformed andpeer-error, not their designed probe/probe-inner-command. Mos confirmed instant shell output exits before session verification; product fails closed. Authorized option1 uses the same system Python exec for peer-output bytes/status; no delay and no product change. Sourcecommit362ec674c9e7aa8cef0c26f4d7448f459171dbd4 names1297 andquotesoldline100.
|
||||
|
||||
All17faults now assert exact reason with following space and anchoredP10prefix, from the accepted draft. Every old assertion retained. C4overflow andpeer-hang test bodies are byte-identical; overflow must remain probe-output-limit. Peer-hang looseprefixoutofscope unchanged. STATIC-PRESERVATION.json andREPAIR.diff in repair-1297/.
|
||||
|
||||
Seven-path manifesta2ac57342d9c59ddaebddade0fa475a9568719fed50c132bd7bb141167c7e72e; onlycase1testhashchanges. No repaired-source test/syntax/Node execution. Whole gate from start, no carry, after Duckworth review and SageCLEAR. M21survival orwrongmalformed/errorreason goes toMosbeforeanychange. Product fast-exit issue isVikunja532post10-27; SageownsDEFERREDentry.
|
||||
|
||||
|
||||
### mos-1297 fresh gate under sage-2768, stopped
|
||||
|
||||
Ran on pushed e1bc766d8, manifest a2ac5734, no carry. Both intendedREDs observed; touched whole43/0/0 and34/0/0,17fresh controls passed. M1-M37 killed including M21 by named P10 assertion; M38 survived (drop setsid, signals killer). M39-M40 and full package/union/shell stages NOTRUN. Wall404.837s,0timeouts,0skips,N9passed. Exact restoration and all7manifest checks pass; sweep0run-created leftovers. Stopped unplaced to Sage/Mos/Duckworth as gander-0116 and returned slot; no repair or rerun. run4-gate/ preserves raw logs,commands,counts and timing.
|
||||
|
||||
|
||||
### mos-1298: pin the direct query session
|
||||
|
||||
M38 drops setsid but a blocking signals query can still fail closed with inner-timeout; the old kill rule was wrong. The named killer stays row253 C4 signals query. Every sleep/signals/member case in both exec/hop modes now reads the first query-pids line and asserts exact equality of its numeric PID and kernel SID. M38 must fail this new assertion, never a timeout or a cleanup-only assertion. Every old line of the C4 query test is preserved byte for byte. Product scripts remain byte-identical. No test or Node preflight run; fresh whole gate from start follows new candidate review and Sage CLEAR, with nothing carried. Base assertion failure, another survivor or any mismatch goes to Mos before a further change.
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"docs/plans/DEFERRED.md": "f8ad28aa8dc0f12b2c6dddb3b5dc805da05a97c7723e0525905456c064d0cfa3",
|
||||
"packages/cli/tests/case-sudo-fixture.mjs": "b259b8c7926e49829c8a956674021cb0cc85ddd65aebdc786d05cc08d7790008",
|
||||
"packages/cli/tests/case1-accept.test.mjs": "27378eb1297dc6115b4b1ce849de6ffdb3adccf5249783106fa0570c9d696e8a",
|
||||
"packages/cli/tests/case2-unit.test.mjs": "9ca67403d8614266061624ab5fbf4ea8e8a54cbd08f5b569c95592ab5ed40472",
|
||||
"packages/webui/README.md": "ce9054060867120798c6b26737ac7d910d8cfbc7aa4ad614f4295619c7605e46",
|
||||
"scripts/case1-accept.sh": "c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd",
|
||||
"scripts/case2-unit.sh": "d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b"
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
# Row253 C4 addendum: the supervisor belongs after sudo
|
||||
|
||||
Draft for Duckworth's static ruling. DESIGN.md remains unchanged. Authority:
|
||||
duckworth-0109/0110, RULING-c4.md at 2c49dd80c, and sage-2307/2312.
|
||||
No repaired product code or new test has run. Product scripts still have the
|
||||
original frozen bytes; this addendum does not claim they satisfy C4.
|
||||
|
||||
## Finding and evidence
|
||||
|
||||
The current tester_capture puts GNU timeout --signal=KILL outside sudo, then
|
||||
kills that timeout's process group. It works for the exec-style sudo fake.
|
||||
sudo(8), **Process model**, says the pty monitor creates a new terminal session
|
||||
and forks the command there. **Signal handling** (called Signals in the local
|
||||
rendering) says SIGKILL cannot be caught and relayed. Therefore an outer group
|
||||
kill does not establish that the query in the new session is killed.
|
||||
|
||||
Evidence was a static read of the installed sudo(8)/sudoers(5) documentation,
|
||||
then Duckworth's independent ruling against sudo 1.9.17p2. No real sudo, host
|
||||
experiment, live unit or live-port experiment ran. The shared fake below is
|
||||
written but unrun. It models the session boundary, not authentication or a pty.
|
||||
|
||||
## Proposed trusted supervisor and runtime trade
|
||||
|
||||
Recommend a reviewed inline Bash supervisor, run **after the uid drop**, using
|
||||
root-validated fixed system Bash, setsid, sleep and kill/builtins. These are
|
||||
host tools, never binaries or scripts from the selected copy. Resolve system
|
||||
symlinks to their real targets; require executable root-owned ELF files and
|
||||
safe root-owned ancestors, outside homes. Do not use PATH lookup for these
|
||||
supervisor tools. env -i removes BASH_ENV and other injected runtime settings.
|
||||
Add setsid to the documented host dependencies. No new configuration knob.
|
||||
|
||||
This is a proposal under R1's root-validated system-binary option, pending
|
||||
Duckworth's approval of Bash rather than the example GNU timeout. The exact
|
||||
inline supervisor must be identical in both host scripts, with budgets and
|
||||
command argv passed separately. No helper is imported from the copy.
|
||||
|
||||
Alternatives weighed:
|
||||
|
||||
- GNU timeout alone inside sudo fixes the session hop but kills one process
|
||||
group. It misses a grandchild that uses setpgid without setsid. It needs the
|
||||
same owned-session cleanup as the proposed supervisor.
|
||||
- Validated --node with inline builtins can implement the same supervisor.
|
||||
The installer already validates it. Acceptance deliberately reports unsafe
|
||||
--node paths through F9/F10; making that binary a required trusted supervisor
|
||||
would change those existing outcomes or need another pinned runtime.
|
||||
- Fixed root-validated system Python can fork a session, multiplex bounded
|
||||
output and scan /proc cleanly. It is already used for P10, but making it
|
||||
mandatory for the config query changes missing/unsafe Python from a failed
|
||||
P10 observation into a preflight refusal. Preserve that behavior here.
|
||||
|
||||
## R1: own a query session, not sudo's group
|
||||
|
||||
The supervisor starts in sudo's possibly separate session as the stack uid.
|
||||
It forks the query child, then setsid occurs in that child through the fixed
|
||||
system setsid binary. The supervisor itself may already be a group leader,
|
||||
so it must not attempt setsid in its own process. Disable Bash job control;
|
||||
the newly forked child is not a group leader, so setsid need not fork again.
|
||||
The child's PID from $! is the kernel session id. No PID comes from copy output.
|
||||
|
||||
Run a separate five-second watchdog inside the uid boundary. On expiry, on a
|
||||
supervisor catchable signal, on output refusal, and after normal query exit:
|
||||
|
||||
1. Scan numeric /proc/*/stat entries for the owned session id. Parse after the
|
||||
final closing parenthesis, so spaces, parentheses and newlines in comm do
|
||||
not shift the kernel fields. Use the kernel session field, not ancestry.
|
||||
2. SIGKILL every live PID in that session, including different process groups.
|
||||
Repeat until no running members remain or a fixed 250 ms cleanup budget
|
||||
expires. Never select a process from a different session.
|
||||
3. Wait for the direct child and the watchdog. Refuse on a cleanup limit or
|
||||
read/parse error that prevents establishing cleanup. Zombies are not running;
|
||||
only direct children can be reaped here. Tests pin that distinction.
|
||||
|
||||
A five-second deadline concerns the inner query. The root-side deadline is
|
||||
independent. Query bytes are accepted only after success and completed cleanup.
|
||||
The query can never authorize a root kill: its stdout supplies no PID/session.
|
||||
The supervisor runs without root authority and kills only its owned session.
|
||||
|
||||
## R2: independent root bound and bounded output
|
||||
|
||||
Root waits at most seven seconds for the metadata sudo call. Keep GNU timeout
|
||||
outside sudo for this separate purpose. Keep the 4096-byte cap plus one-byte
|
||||
overflow detection. All partial output is discarded on any refusal.
|
||||
|
||||
Give outer timeout its own operator reason, distinct from inner timeout,
|
||||
child failure, output limit and cleanup refusal. A child-supplied exit value
|
||||
alone must not masquerade as proof the outer timer fired. Capture GNU timeout's
|
||||
trusted verbose signal notice separately, with sudo/helper stderr redirected
|
||||
away from that channel. The root-owned notice file is outside the user's
|
||||
home. Validate the combination of notice and status; no eval or source.
|
||||
|
||||
Apply the same primitive to the new P10 peer probe, with inner two seconds,
|
||||
outer four seconds, a 128-byte output cap and the existing one-second socket
|
||||
connect timeout. Preserve its fixed system-Python safety check and failed-P10
|
||||
behavior. All observed stdout still requires successful cleanup and exact
|
||||
pid/uid/gid validation. Neither path sends application bytes to the socket.
|
||||
|
||||
## R3: narrowed claim and residual
|
||||
|
||||
C4 now means: killed at the inner bound, and root never waits past the outer
|
||||
bound. A hostile same-uid query can kill/stop the supervisor or setsid away.
|
||||
A hang in the trusted supervisor has the same outer-bound outcome. In that
|
||||
case root refuses and discards stdout; the separate session may remain.
|
||||
This is the existing DESIGN.md:97-99 same-uid limit, not a new closure claim.
|
||||
No root-side cross-session killer is added. It would require another row.
|
||||
|
||||
The stalled-supervisor fake must prove outer timing, its own refusal reason
|
||||
and no use of partial stdout. It then explicitly kills its recorded leftover
|
||||
session as fixture cleanup, naming that step as the R3 residual. It must not
|
||||
claim the product cleaned that session. Other normal-supervisor cases assert
|
||||
no running members of the recorded query session remain after the call.
|
||||
|
||||
## R4 and F5: headers and remaining legacy calls
|
||||
|
||||
Both headers will name the inner supervisor, its runtime/tool validation,
|
||||
five/seven-second query bounds and two/four-second peer-probe bounds.
|
||||
|
||||
The old F3 talk path (currently timeout 330 around AS_USER talk) has the same
|
||||
sudo session-hop issue. Propose recording it as a bounded follow-up, rather
|
||||
than changing it in this slice: it predates the socket metadata/probe helpers,
|
||||
drives a 300-second functional conversation and simultaneous F5 scan, and has
|
||||
existing stdout/stderr diagnostics. It is not part of the new five-second
|
||||
config query. This is an explicit F5 scope choice for Duckworth/Sage to accept
|
||||
or reject, not a claim the old talk timer kills a separate session. Likewise,
|
||||
the other legacy AS_USER diagnostics are not newly supervised by this row.
|
||||
|
||||
## Shared fake and next evidence
|
||||
|
||||
packages/cli/tests/case-sudo-fixture.mjs provides the one process-model seam.
|
||||
Both existing test files import it. Mode exec retains the prior fake. Mode
|
||||
hop keeps a parent, forks through setsid, records kernel PID and SID, and
|
||||
relays TERM/HUP/INT only. It cannot relay KILL. The installer draft case makes
|
||||
the copy ignore TERM/HUP and block; it checks recorded query PIDs and the
|
||||
separate fake session, then explicitly cleans fixture-owned PIDs on failure.
|
||||
This is written but not run, and is expected to expose the old product gap.
|
||||
|
||||
Before the next whole gate, complete both-mode cases for timeout, TERM/HUP,
|
||||
setpgid grandchild, overflow, and the distinct stalled-supervisor residual.
|
||||
Both host-script paths use this seam. Add changes for absent inner supervisor,
|
||||
absent outer bound, leader-group-only cleanup and unbounded read. The setpgid
|
||||
case must kill the group-only change. Record every restore and raw log.
|
||||
|
||||
Duckworth reviews this addendum and fake statically first. Product code then
|
||||
implements the approved mechanism. All product changes void prior results
|
||||
under sage-2307/mos-1200. Only Sage's next CLEAR permits a diagnostic or gate
|
||||
run. The next gate is both whole touched files, all checks, CLI/WebUI whole
|
||||
and all ten shell files. Existing RED evidence carries only if applicable
|
||||
product bytes remain equal. No host deployment is authorized by this packet.
|
||||
@@ -0,0 +1,248 @@
|
||||
# Row 253: private tester socket in the host scripts
|
||||
|
||||
Gander, 2026-10-21. F27, #1758. Base c3d88840c, after row196 landing
|
||||
7247d80c7. Brief: docs/plans/2026-10-21_tester-socket-scripts.md at
|
||||
0cdead66c. Reviewer Duckworth; gate owner Sage. Status: proposed, no product
|
||||
code or tests changed. Claim gander-253-start is queue rev2995.
|
||||
|
||||
## Outcome and scope
|
||||
|
||||
The factory installer renders a bare --tester-socket flag instead of a TCP
|
||||
port. Case1 acceptance consumes that saved form and examines the private
|
||||
listener without claiming that a private pathname defeats hostile same-uid
|
||||
processes. The library profile still has no tester. No .53 or .54 host may
|
||||
take a copy carrying196 before253 lands, per mos-1198.
|
||||
|
||||
Change scripts/case2-unit.sh, scripts/case1-accept.sh and their two existing
|
||||
CLI test files. Their comments/usage and fixture docs move with the code.
|
||||
Do not edit the deliberate legacy paths named in the brief. No runtime bus,
|
||||
Console, role, grant, control-board, dependency or systemd-template change.
|
||||
No live installer or acceptance run, provider, home/config, unit or host access.
|
||||
|
||||
## Choices
|
||||
|
||||
1. Recommended: resolve the configured dataRoot as the stack user, preserve
|
||||
hardening, check the final pathname's metadata and use SO_PEERCRED on a
|
||||
connection to identify its listener. This supports custom roots within the
|
||||
unit's existing writable home and matches196's kernel-peer approach.
|
||||
2. Assume <home>/.mosaic-dev and inspect a pathname in /proc/net/unix. This
|
||||
misses a custom config and is not a reliable final-path ownership check:
|
||||
196 binds a temporary name and renames it. A socket's filesystem inode also
|
||||
must not be confused with its kernel socket inode. Do not use this option.
|
||||
3. Add a TCP relay, relax hardening or give acceptance a configurable probe
|
||||
executable. All widen the surface or trust inputs and are outside this row.
|
||||
|
||||
There is no second bus principal verifier. The acceptance probe observes an
|
||||
OS endpoint; it grants no capability and sends no HTTP or bus request.
|
||||
|
||||
## Installer arguments and preflight
|
||||
|
||||
Factory keeps required --port (1..1023) and --business; tester remains optional
|
||||
for the installer. --tester-socket is a single marker, takes no value and keeps
|
||||
its position in the rendered flags. The existing duplicate-flag check applies.
|
||||
A following stray value is an unknown flag. --tester-port always refuses in
|
||||
serve arguments, for both profiles, before unit writes or systemctl actions:
|
||||
|
||||
case2-unit: case2-unit.sh retires tester TCP; use --tester-socket
|
||||
|
||||
Library rejects --tester-socket with an explicit library-profile refusal. Its
|
||||
other flags, proof-file checks and install behavior are unchanged. No legacy
|
||||
conversion or fallback to TCP is introduced in this installer.
|
||||
|
||||
When the factory socket marker is present, a small inline metadata query runs
|
||||
the selected copy's config loader under the target uid with sudo -u USER -H,
|
||||
env -i, explicit HOME and the same pinned-node-first PATH used by the unit.
|
||||
Root never imports user-writable copy code as root. It invokes the previously
|
||||
validated --node path after dropping uid, with the copy module path as a
|
||||
separate argument. This resolves the default instance just as the rendered
|
||||
unit does; no MOSAIC_CONFIG or named-instance override is inherited.
|
||||
|
||||
The query returns only dataRoot and whether that copy's Console carries the
|
||||
MOSAIC_TESTER_SOCKET_V1 marker. It prints no config values, credentials or child
|
||||
diagnostics. Bound it to five seconds and 4096 output bytes; reject errors,
|
||||
extra output/keys, malformed results, missing config and unsupported targets.
|
||||
No root process opens a config or credential under the user's home. Existing
|
||||
root metadata checks remain root metadata checks. Both script headers explain
|
||||
the new, explicitly unprivileged config query.
|
||||
|
||||
Before any unit writes, validate the socket location:
|
||||
|
||||
- dataRoot is an absolute normalized plain path, below the declared home,
|
||||
with no symlink in its existing path. Never expand the unit's writable scope.
|
||||
- Neither home nor dataRoot is under /home, /root, /run/user, /tmp or /var/tmp.
|
||||
These roots conflict with the existing ProtectHome/PrivateTmp contract.
|
||||
- <dataRoot>/console/tester.sock is at most 107 ASCII bytes, matching196.
|
||||
- A missing console parent is allowed; runtime creates it. An existing parent
|
||||
must be a real directory, not a symlink, owned by the target uid with no
|
||||
group/other permissions. A foreign owner, non-directory or unsafe mode refuses.
|
||||
- Do not create/chmod the parent or inspect/delete an existing tester entry in
|
||||
the installer. A running Console may own it during a re-pin. Runtime196 owns
|
||||
binding and cleanup. Reinstall still does not restart running units.
|
||||
|
||||
The dataRoot query and all refusal families get fake-only tests. A failed
|
||||
preflight leaves both units and the systemctl log unchanged.
|
||||
|
||||
## How the rendered unit reaches the socket
|
||||
|
||||
The unit still has User/Group for the stack account, ProtectSystem=strict,
|
||||
ReadWritePaths=<home>, ProtectHome=yes and PrivateTmp=yes, in the same order.
|
||||
Its ExecStart contains --tester-socket, with no pathname argument. The Console
|
||||
loads dataRoot and derives console/tester.sock itself. Case1/2's /srv/mosaic
|
||||
home is outside ProtectHome's protected hierarchies; the allowed dataRoot is
|
||||
inside the existing writable home, and the socket is outside private /tmp.
|
||||
No extra capability or writable directory is added. Systemd's documented
|
||||
namespace rules motivate the location refusals, rather than a hardening change.
|
||||
[systemd.exec](https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html)
|
||||
|
||||
A mutable same-uid config can change between preflight and start. The unit's
|
||||
writable boundary is still home; runtime's own config/socket checks still
|
||||
refuse unsafe state. This row does not promise an immutable same-uid config.
|
||||
The host window must verify the rendered unit actually starts under its
|
||||
namespace; scratch tests inspect its directives, not a real systemd namespace.
|
||||
|
||||
## Acceptance arguments and endpoint observation
|
||||
|
||||
The saved args must contain one --tester-socket and the numeric --port.
|
||||
Reject a missing/duplicate marker, a marker with an old numeric value, and
|
||||
--tester-port with the same migration wording naming case1-accept.sh. Preserve
|
||||
all existing pre-- argument validation and the default-instance contract.
|
||||
Malformed saved inputs still refuse with exit2 before functional checks.
|
||||
|
||||
Acceptance resolves the actual configured tester dataRoot with the same
|
||||
unprivileged, bounded query. It does not silently use the default path. An
|
||||
unreadable/invalid config or a root outside the unit's allowed home refuses
|
||||
before the functional talk. The old DATA_ROOT used by F11 remains unchanged;
|
||||
generalizing that separate Discord check is outside this row.
|
||||
|
||||
P10 independently requires the Console's systemd MainPID to be positive and
|
||||
stable, and its four /proc uid fields to be the stack uid. Check the private
|
||||
parent's type, owner and mode, and the final entry's non-symlink socket type,
|
||||
owner and exact 0600 mode. Snapshot parent/socket dev+ino and metadata before
|
||||
and after the peer probe; a replacement or MainPID change fails observation.
|
||||
The port floor must still be numeric and above the privileged main Console
|
||||
port, retaining that existing part of the observation.
|
||||
|
||||
The bounded probe runs as the stack user with an empty inherited environment,
|
||||
the fixed system /usr/bin/python3 resolved to a root-owned ELF, safe root-owned
|
||||
ancestors, and -I -S. This is the system Python dependency already required by
|
||||
196; never use PATH python, a home shim or a configurable helper. Unsafe/missing
|
||||
Python is a failed P10 observation, not a fallback. Resolve/check the system
|
||||
entry and target using metadata and the ELF header; do not run copy Python code
|
||||
as root. Test seams emulate these root facts and the system executable.
|
||||
|
||||
The probe opens AF_UNIX/SOCK_STREAM, uses a one-second connect timeout, reads
|
||||
SO_PEERCRED and closes. An outer three-second process-group bound applies. It
|
||||
returns only pid/uid/gid, with exact structure, bounded output and numeric
|
||||
validation. pid must equal MainPID and uid the stack uid; gid is validated but
|
||||
not an identity grant. No application bytes, cookies, credentials or proof
|
||||
envelope are sent. Linux supplies the peer credentials for the connected
|
||||
stream, so the check does not depend on the temporary bind pathname.
|
||||
[unix(7), SO_PEERCRED](https://man7.org/linux/man-pages/man7/unix.7.html)
|
||||
|
||||
This is a snapshot. Hostile same-uid processes can alter same-uid state or
|
||||
interfere with the unprivileged probe. Root, ptrace and later pathname changes
|
||||
are not defeated here. The probe does not prove another uid is denied; that
|
||||
remains a host-window observation, not a fake test claim.
|
||||
|
||||
## P8 and P10 outcome lines
|
||||
|
||||
P8 must change with removal of TESTER_PORT. It checks the main Console port is
|
||||
loopback-only and held only by MainPID, and that nothing listens on TCP7331 or
|
||||
the retired TCP7333. Socket ownership belongs to P10. Its healthy line is:
|
||||
|
||||
P8 lan-listeners closed <port> is on 127.0.0.1 only by MainPID <pid>; no TCP listener on 7331 or 7333; tester uses <socket>
|
||||
|
||||
An unexpected listener, missing main listener or wrong owner produces P8
|
||||
lan-listeners unnamed with the observed listener summaries, as today.
|
||||
|
||||
Do not reuse accepted mos-1101 for a new Unix-socket claim: that ruling named a
|
||||
TCP-port condition. Proposed safe default pending any new Mos classification:
|
||||
|
||||
P10 tester-socket-squat unnamed boundary=observed path=<socket> parent=0700 owner=<uid> socket=0600 peer_pid=<pid> peer_uid=<uid> floor=<floor> port=<port>; hostile same-uid substitution remains
|
||||
|
||||
Any missing/unsafe metadata, wrong peer, unsafe interpreter, malformed/timeout
|
||||
probe, floor miss or changed snapshot produces one P10 line instead:
|
||||
|
||||
P10 tester-socket-squat unnamed boundary=failed reason=<bounded-code> path=<socket> MainPID=<pid>; hostile same-uid substitution remains
|
||||
|
||||
Healthy observation does not mark the same-uid squat path closed or invent an
|
||||
accepted ruling. P checks still never change exit status. Tests pin the reason
|
||||
and observed/failed distinction, so validation cannot disappear behind an
|
||||
always-unnamed mark. Sage/Mos may supply a new classification at design review;
|
||||
it must be explicit before changing this proposed mark. No Jason question is
|
||||
needed merely to retain unnamed evidence.
|
||||
|
||||
## Evidence and planned checks
|
||||
|
||||
Keep the existing scratch fixtures, fake account database/systemctl/curl/ss/
|
||||
sudo/stat and fake interpreter. Add copy config/marker fixtures and probe
|
||||
metadata under those same roots. No test connects to a live socket or runs the
|
||||
real host scripts without their existing seams. Fixture fakes verify the
|
||||
unprivileged command argv; no test claims a real uid drop or namespace.
|
||||
The fake system interpreter executes the actual probe payload against a fake
|
||||
Python socket API, checking AF_UNIX/SOCK_STREAM, timeout, connect, getsockopt
|
||||
arguments and returned peer bytes. This catches errors in the inline probe
|
||||
without opening an OS listener. The metadata query is tested with nonzero
|
||||
status plus valid-looking output as well as malformed output, so removing its
|
||||
status refusal cannot hide behind a later parse error.
|
||||
|
||||
| Checks | Required observations |
|
||||
|---|---|
|
||||
| T1 factory render | Bare marker exactly once, argument order retained, no TCP flag, hardening unchanged; duplicate/stray value refuses |
|
||||
| T2 profile/migration | Both profiles refuse retired TCP; library refuses socket; all refuse before writes/start |
|
||||
| T3 config/target | Invalid/missing/noisy/timed-out metadata and unmarked target refuse; query uses target uid and clean environment |
|
||||
| T4 location | Default and custom in-home roots work; outside-home, protected/private hierarchies, symlinks and >107-byte pathname refuse |
|
||||
| T5 parent | Missing parent allowed; file/symlink/foreign owner/group-other mode refuse without mutation or systemctl calls |
|
||||
| T6 saved args | Required socket marker; missing/duplicate/stray value and retired TCP refuse exit2 before talk |
|
||||
| T7 P8 | Main-only loopback succeeds; LAN/wrong owner/7331 or7333 listener gives unnamed |
|
||||
| T8 P10 | Exact metadata, stable MainPID and matching peer produce boundary=observed; custom configured root used |
|
||||
| T9 failed P10 | Parent/socket faults, wrong PID/uid, malformed/timeout probe, unsafe Python, bad floor and changed snapshot each give failed reason |
|
||||
| T10 preserved behavior | Functional checks, their exit semantics, library behavior and all other P paths retained |
|
||||
|
||||
Planned checks to kill, one target change at a time in isolated snapshots:
|
||||
|
||||
| IDs | Removed requirement |
|
||||
|---|---|
|
||||
| M1-M3 | Installer TCP refusal, library socket refusal, duplicate socket refusal |
|
||||
| M4-M5 | Config-query failure refusal, unsupported-target refusal |
|
||||
| M6-M8 | Home containment, protected/private path refusal,107-byte limit |
|
||||
| M9-M11 | Existing parent type/symlink, uid, mode checks |
|
||||
| M12-M15 | Acceptance TCP refusal, required marker, duplicate/stray marker rejection, config-query refusal |
|
||||
| M16 | P8 retired TCP7333 check |
|
||||
| M17-M18 | P10 parent and final socket metadata checks |
|
||||
| M19-M21 | Peer PID, peer uid, malformed/timeout probe refusal |
|
||||
| M22-M23 | Safe fixed system interpreter, stable metadata/MainPID snapshot |
|
||||
| M24-M25 | Target-uid invocation in installer and acceptance metadata/probe paths |
|
||||
| M26 | Privileged main-port floor observation |
|
||||
| M27 | Probe returns its own PID rather than the connected peer's credentials |
|
||||
|
||||
Before execution, give every definition one unique source target and a named
|
||||
killer test. Preserve raw logs, base times, syntax preflight and byte-identical
|
||||
SHA/Git restoration. A timeout counts only under Sage's explicit rules and
|
||||
must kill the process group. Refusal variants in T1-T9 must not be merely
|
||||
assertions of a generic nonzero exit.
|
||||
|
||||
## Static inventory and gate
|
||||
|
||||
After implementation, enumerate every --tester-port hit in scripts/packages
|
||||
in BUILD.md and a machine-readable file. The only permitted hits are the brief's
|
||||
deliberate legacy producers/parsers/tests and this row's explicit refusals and
|
||||
negative fixtures. Inspect arguments and generated units, not just filenames.
|
||||
Readmes must describe retirement rather than produce old argv. No modification
|
||||
to webui-service, stack-release, instance, their tests/fixture, case1-hostcheck
|
||||
or tester-cli negative calls is planned. Stop and ask Sage if one is needed.
|
||||
|
||||
Then request Sage's slot. Under that grant, run CLI whole, WebUI whole, every
|
||||
shell test suite whole and all named checks above. Use an isolated candidate,
|
||||
plain linked node_modules, a short gXXX TMPDIR under /mnt/storage/scratch/tmp,
|
||||
busy &&, pipefail and tee. Single/pattern runs need the slot too, per sage-2142.
|
||||
No harness/helper/log argument may match the busy detector pattern, per
|
||||
mos-1205. Two failures end the window; report any stop to Sage/Mos before a
|
||||
retry. Return the slot with script-summed counts/timings and a leftover sweep.
|
||||
|
||||
Design approval precedes code. The manifest, immutable candidate hashes,
|
||||
static inventory and gate evidence go to Duckworth before Sage's landing.
|
||||
Queue moves use the helper, with a coordinated queue-write gap. Sage posts the
|
||||
jarvis review request after the in-review move. BUILD-LOG/session history stays
|
||||
append-only; Sage continues session registration. No host deployment is part
|
||||
of row253 acceptance.
|
||||
@@ -0,0 +1,26 @@
|
||||
# Row253 committed C4 candidate manifest
|
||||
|
||||
MANIFEST.sha256 names seven source/test/doc landing paths and pins their bytes. Its digest is the review identifier. BUILD-LOG.md is excluded: land the row253 phase lines as a doc-only append after the code, preserving upstream appends (duckworth-0112 M1, sage-2342).
|
||||
|
||||
Base before the required gate integration: c3d88840c. Initial static repair packet: b64aa316a; initial runnable candidate: aa81ca390. The delta packet is c4/delta-0112/. Full records live under agents/gander/work/queue-253/ as review evidence. DEFERRED.md preserves upstream entries and names row276 / #1781 for F5 and N1/N2.
|
||||
|
||||
Sage-2335 authorizes the runnable commit before the whole gate. No repaired-source syntax check, test, probe or host experiment has run. No results from 8a8df4171 carry. After Duckworth's delta static verdict, the gate must use the candidate integrated onto the refactor tip named by Sage at CLEAR (378a76b85 or later under sage-2342), never this old base. Fresh integration records and hashes will identify that final gate candidate.
|
||||
|
||||
Superseding integration under sage-2463: gander/row253-0fa7 on 0fa7bf421. See integration-0fa7/. Only README changed among the seven landing entries, retaining row191 processing-control documentation; the refreshed manifest digest is 24b6a01b2ede6f025ec898fa4ec830bb9585ce6151d6298e713e31c7430a502b. No gate has run.
|
||||
|
||||
Superseding integration under sage-2659: gander/row253-385a on385a7194c, source141b79c29, digest72a70e99ba0416ceb1f63ed737132ebbeb212332d1441c362b3dfa6c8b00209c. Only README and DEFERRED hashes change. See integration-385a/ for drift, patch-ids and dependency reads. No gate run;264a schema dependency must be re-checked before CLEAR.
|
||||
|
||||
Post264a supersedes the385a preview: gander/row253-264a on84f53540d, rebased sourceb9d3d4c75c78aa6b06aefd734da781bef9b7f1da, manifest735fa2d7405d01ace8eb7aab366753fa5b1877cf8044b0151cb2113a0502bc1f. Only DEFERRED differs from the preview. See integration-264a/ for all11 equal pairs, patch-ids and whole-file union. Focused whole-file runs, publication, rebase review and full gate are pending Sage CLEAR.
|
||||
|
||||
Corrected interim integration2700/2702: gander/row253-b789 onb78918850, sourcec75c9bbd3339cb2343467715a14455044c2e4aea, digest573c51cf72f2398532a6ea768536f04e3c1681997cb8b9a6f14a8aef884870ae.27-file scope unchanged. Pending final docs tip, rebase and CLEAR; no gate run.
|
||||
|
||||
Final base under sage-2705: gander/row253-aca1 onaca16404c, sourceed3bb376cdd5128dc58b3aa193282e1c2bfcf57d, digest573c51cf unchanged. integration-aca1/ is the final-hop packet. No runs yet.
|
||||
|
||||
Focused27 under sage-2709 now passed on0604d91fc:604/0/0, no timeouts, no retries, N9 executed and passed (exact line in run3-focused/SUMMARY.json). All7 blobs unchanged;573c51cf remains the review digest. run3-focused/ contains every raw whole-file log/command, HEAD/digest/limits preamble, timings and3x basis. No full gate or mutation-batch result is claimed.
|
||||
|
||||
Whole gate2737 stopped atM21 survivor after20kills. No final acceptance. run3-gate/STOP-SUMMARY.json andSTATIC-TRACE.md preserve the stop. Mos1293requires diagnostic thennewcandidate/review/fullgatefromstart. Current7sourceblobs remain573c51cf; no test/product repair made.
|
||||
|
||||
Mos1297 supersedes573c51cf after one fixture-only repair and17exactreasonassertions: source362ec674c9e7aa8cef0c26f4d7448f459171dbd4, digesta2ac57342d9c59ddaebddade0fa475a9568719fed50c132bd7bb141167c7e72e. Onlycase1testchanges. repair-1297/ is the new review packet. Tests unrun; Duckworthreview and fullfreshgatepending.
|
||||
|
||||
|
||||
mos-1298 candidate source 14e46006171ef700a72f971fda5cb3a0b8dcc4f2, seven-path manifest 591020a1096a1606c11f2ee34b37243acddf83d91c69922ccc5cfe22d6180d3a. Only case2-unit.test.mjs changes among manifest paths from e1bc766d8. Pending review and fresh full gate; no carry.
|
||||
@@ -0,0 +1,7 @@
|
||||
f8ad28aa8dc0f12b2c6dddb3b5dc805da05a97c7723e0525905456c064d0cfa3 docs/plans/DEFERRED.md
|
||||
b259b8c7926e49829c8a956674021cb0cc85ddd65aebdc786d05cc08d7790008 packages/cli/tests/case-sudo-fixture.mjs
|
||||
27378eb1297dc6115b4b1ce849de6ffdb3adccf5249783106fa0570c9d696e8a packages/cli/tests/case1-accept.test.mjs
|
||||
9ca67403d8614266061624ab5fbf4ea8e8a54cbd08f5b569c95592ab5ed40472 packages/cli/tests/case2-unit.test.mjs
|
||||
ce9054060867120798c6b26737ac7d910d8cfbc7aa4ad614f4295619c7605e46 packages/webui/README.md
|
||||
c02bef6b3495e5a4548d7b4e89675ed52be26a0c9ccce4d9d5cfc5fe2ce437bd scripts/case1-accept.sh
|
||||
d7670bdb049ae41ba3774fc83de633636859b6723be858cfb31ea106b0e8812b scripts/case2-unit.sh
|
||||
Loaded 100 of 1754 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user