Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8708927e5e |
No files matched your search
@@ -5380,12 +5380,3 @@ Gander: after Duckworth-0100 design approval with C1-C5, prepared the two host-s
|
||||
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).
|
||||
2026-10-23T03:59:52Z | Sage, row 293 (Vikunja 574) landing and 3m-3n live window | Before: live 0cbe2e9b3 at schema 3m; 574 approved by Filbert (c30982, cdda41f5) on gander/v574-r2 a9cae2bd6 after run 2 GREEN on 6bfab273b (four files 153/0, seat 202/0, cli 905/0, 312 flagged commits with 0 maintenance children). After: Darkwing's window put live on 464010fbe at 3n (activation 20261023T034557Z-464010fbe4c6, 26/97/5/28, Console 7332 200, W9b pm ra38826f3c6e2 left live, STATE darkwing/window-migrate-3n 8708927e5); 574's six commits cherry-picked onto 464010fbe as e51d11640, range-diff all =, patch-ids equal, only docs differ from a9cae2bd6. #1805 closed c31013, P19 386 c887 and 574 c888. Residual: queue store.mjs, discord git.mjs, harness tools.mjs commit without the maintenance flags; no whole-root test covers them yet.
|
||||
2026-10-23T05:47:17Z | Sage, row 292 (#1797) landing, idle-stop race row 302, rows 300/301, row 294 rounds 2-3 | Before: refactor 4a9c536e8; 292's gate on 0d0021454 hit one red at compactions-launch.test.mjs:229, ['session-invalid',22,null] where ['stopped',0,null] was expected, product and test unchanged. Gizmoduck read it as a race: threadIdle releases the claim, then the launcher sends SIGTERM, and a runner call in between gets not-holder and exits 22. Mos (mos-1411) rejected loosening :229, let 292 count one whole unedited green cli rerun, and allowed one rerun for that exact signature on other gates until the race row lands (hits logged on Vikunja 588). The 10-run diagnostic passed 10/10, but one runner log (r846b8d083502) showed not-holder then exit 22. After: the cli rerun was 910/910. 292 LANDED 6aab979e6 05:18Z (7 cherry-picks, range-diff all =, patch-ids equal), done rev 3447, #1797 closed c31038, Vikunja 588 c891. Briefs 86d5ac69b (R6-N1 #1807, R6-N4 #1808, rows 300/301) and e3ef1eaf6/fdedc56e2 (race, #1809, row 302). Row 302 design d1/d2 approved by Dewey with D1 (role.claim refuses a released run), c31044. Mos ruled landRelease folded in, code launcher-released, and four old-test lines moved to exact values (mos-1414/1415/1416): threads.test:394, runner.test:771-772, land.test:464. Row 294 round 2 stopped at webui G5 granted-user.test:269: max(seq) over an empty events table is NULL. Round 3 is one line, coalesce(max(seq),0) (mos-1417), Duckworth APPROVE c31045 rev 3462, gate pending. Queue commit 756284e8e (revs 3448-3456). Correction: two review-request attempts this window ran without MOSAIC_GITEA_CREDENTIAL_FILE exported and failed (3450 Launchpad, 3451/3452 Sage); the posted request was 3453/3454.
|
||||
2026-10-23T07:11:43Z | Sage, row 294 (#1800) rounds 3-4 and landing, row 219 edits 2-3, R9 transient and row 303 | Before: refactor 09d0d6faf; 294 run 3 on cb1648f3 stopped with 20 cli reds from two causes. A: the stack-release rehearsal fixture copies lacked cli access.mjs and transport.mjs, which 294's config.mjs now imports. B: the B1-B3 boot tests read warnings that now carry the fixture tracker line. Mos ruled A as two copy-list entries and B as a full pin, no filter: a TRACKER const and deepEqual (mos-1419). After: round 4 8616b9a4f, manifest a1ff5d67, Duckworth APPROVE c31053 rev 3469 with C1/C2. Run 4 from npm ci green: webui 365, cli 909, bus 873, 10 scripts, M1-M11 killed. Merged tree d3059c2c3 (11 cherry-picks, range-diff all =, patch-id 8371405a equal): stack-release-external 25/25, stack-upgrade 21/21. stack-release 223/224 on the first run, R9 at :2178: TypeError on join(r.dir) with r.dir null, so rehearse stopped before its directory and the output was lost. R9 passed 6/6 run alone on d3059c2c3, 09d0d6faf and 24b745447. Mos (mos-1422) allowed one unedited whole rerun: 224/224. 294 LANDED d3059c2c3 07:04Z, done rev 3471, #1800 closed c31068, P19 269 c895. Row 303 (#1810, Vikunja 589, brief ad6ca7930) adds an r.dir guard in R9 only. Queue commit 80793d824 (revs 3464-3473). Row 219: Rocko's second edit 7cbd839d0 (mos-1418, Dewey dewey-0883) restarted and went red at thread-launch C2-09a :489 on a legacy history path. The third edit 5f2ef92e5 (mos-1420, Dewey dewey-0885) reads the native session path. 219 now rebases onto 80793d824, because 294 overlaps its webui files. Correction: the first merged-tree check counted on the 292 drift and found an unrelated transient, and my P19 placeholder sed also rewrote the script's own guard line; the guard refused to post, and I restored the line before posting.
|
||||
|
||||
Row 299 (573, #1806, Gander, Filbert): before, the P10 band test timed a fault run minus a separate baseline run, and a loaded whole-suite run went red. Mos approved direct timing from host /proc/uptime stamps with ambient load only (mos-1409). After: rebased onto 80793d824 as ffa93b054 (range-diff 3/3 =, manifest 277ace0b unchanged). Gate 07:26Z-07:50Z: case1 whole 3x 53/0/0, cli whole 917/0/0 (59 files, load 1.54-7.17), P10 inner 2.27 s, outer 4.01 s, M1-M6 killed. M4's planned guard return then exact outer-reason failure counts as its kill (sage-3271, mos-1426). Filbert APPROVE c31084 rev 3485, N1 M1 margin 0.02 s. 299 LANDED ffb2fedfb 08:03Z, done rev 3487, #1806 closed c31087; queue commit 8a35ffadb (revs 3474-3487). Row 303: Duckworth APPROVE c31079 rev 3480 with C1, the whole-file gate. Rows 219 (bfa421b6c) and 295 r2 (b16cef1d0) rebases: Dewey static clean. Corrections: Launchpad and Gander have no token, and the CLI refuses another seat's token file, so I posted both requests as sage (c31082, c31083). My sage-3265 wording led Duckworth to poll queue show into Gander's slot (07:20Z-07:26Z); I ruled it ambient load (sage-3274).
|
||||
2026-10-23T10:48:40Z | Sage, rows 302, 295 and 219 landings, the Docker pool diagnostic, rows for Vikunja 590 and 591 | Before: refactor 1ac655005. 302 (#1809, Gizmoduck, Dewey) LANDED 3ed9fd754 08:49Z: 7 commits onto 1ac655005, range-diff all =, tree = gated merge 783602e06; queue commit 07802dc57 (revs 3488-3494). Row 219's gate went 11/3 in test-release.sh: release activate's health check failed because Docker could not create sage-diag1437_default, since all predefined address pools were used up. Under mos-1437 I reproduced it on clean 07802dc57 (11/3, the same stderr). I then removed 18 unused gate _default networks, and the rerun went 14/0 with the run-task marker ok. Mos accepted the removal and ruled that a probe that can create something waits for the go and a removal waits for the report (mos-1438). 295 (#1801, Morgana, Dewey) round 2 gate on d68b4300d (manifest e94c9aeb) was green. It LANDED 2efd127ce 10:10Z: 9 commits onto 07802dc57, HEAD~1 tree = gated a86592ffc. Done rev 3502, #1801 c31105, P19 414 c911. 219 (#1720, Rocko, Dewey): the restart on the post-295 merge 054da642f (manifest 4a2271dd, my mos-1439 call) passed node 2523/0/2 and shells 449/0, with 24 mutants killed. It LANDED 5fdfd7275 10:40Z (8 row commits plus packet-only evidence, tree e86a84a85 = gated). Done rev 3509, #1720 c31110, P19 416 c913. Queue commit 90633c864 (revs 3495-3510). Brief docs/plans/2026-10-23_gate-env-rows.md names rows for 590 (claude-session slug) and 591 (compose network cleanup), and DEFERRED.md gets 219 N1 (U6). Row 272 (Huey) conflicts with 5fdfd7275 in code, so it moves back to in-progress for a rebase. Its new fallback is bounded to a session.list access-refused on an omitted-session route (sage-3357). Corrections: my network create probe ran before Mos's go, and the removal ran before the report. My first slot-order line put the diag start at 09:44Z; it was about 09:41Z. My 219 push piped its output through grep, but the after-fetch confirmed origin. Queue commit 90633c864 also carries Huey's rev 3510 (272 back to in-progress), and its message names only 3495-3509.
|
||||
|
||||
|
||||
2026-10-23T11:03:46Z | Gyro Vikunja571 mos-1444 PRD d8 follow-on | Branch gyro/editor-571-d8 from origin/refactor c16e943b9. Both designs now keep library.convert outside ACTIONS/ROUTED and broker processing, retain REQ-WAIT-1/hard-wait test unchanged, constrain unmarked story eligibility to mapped book/playground scope, and add whole-host pre-import restore recovery from remote import manifests plus the Gitea archive commit. Lookups refuse until one current version is proven; VM1012 restore needs Jason present under Q185. W7 no longer owns hard-waits.test.mjs. Canonical queue next gyro returned nothing; direct Mos assignment governs. Static diff, exact replacement and append-only checks pass. No code, tests, build, browser, private-file or live action. Fenton re-check requested after authorized branch push.
|
||||
@@ -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)"
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"base": "01983cd3f",
|
||||
"test": "packages/cli/tests/stack-release.test.mjs",
|
||||
"base_is_byte_exact_prefix": true,
|
||||
"old_assertions_changed": 0,
|
||||
"old_console_refusal_text_unchanged": true
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
# Target config validation for every key implementation plan
|
||||
|
||||
Goal: #1797, mos-1353, brief f0e3dcdf4:docs/plans/2026-10-22_config-checks-any-key-brief.md. Base01983cd3f, branchgander/config-checks-any-key. Reviewer Duckworth. Queue number pending Sage; packet moves to queue-N when assigned. No Node, test or push before Sage gap/CLEAR. Rows270/271/203 land first; rebase under a new branch name before the gate.
|
||||
|
||||
Architecture: config_checks classifies missing/parseable/unreadable config independently of console presence. With a loader, every existing parseable config goes through the target's own validate. Missing config passes. Malformed JSON refuses. With no loader, allow only the oldest four top-level keys: configVersion, environment, dataRoot, execution. Evidence: c3d29e796:scripts/mosaic-config.mjs:114, the first loader commit, rejectUnknownKeys; row200 fixture's LOADER_OLD has the same list. A missing loader plus a later key refuses and names that key, without inventing validation support. The legacy public refusal code config-console-key and existing console-specific message stay byte-identical; new non-console refusals name the loader's first diagnostic and preserve restore-config-backup instruction. The target loader's resolved stdout is discarded. Its first stderr diagnostic is reported and may echo an invalid value.
|
||||
|
||||
Files: scripts/stack-release.sh config_checks/comment only; packages/cli/tests/stack-release.test.mjs appended regression coverage only; docs/TOOLS.md broadens the current console-only release-check description. Existing row200 tests and assertions stay unchanged. No fixture-module edit, flags, pointers, migration, schema, data, live unit or host change.
|
||||
|
||||
Tests to write before implementation, unrun until CLEAR:
|
||||
- A target loader rejecting a non-console key refuses activate and rollback before any unit stop/start, pointer/unit/store mutation; one refused log entry; --plan preserves state and lists refusal. Reuse refused() and planOnly(). Use execution, already known to the current loader, to prove console-free dispatch before row270 integration; add compactionReadBytes/compactionStreams cases on final post270 base if needed.
|
||||
- An accepting target loader is actually called with validate and the selected MOSAIC_CONFIG, succeeds activate/rollback without console, and resolved stdout is not leaked.
|
||||
- Missing-loader target permits oldest-key config but rejects a later key with backup instruction. A stand-in rejecting the existing execution key exercises the generic target-validation branch; missing-loader later-key test may use console until final post270 base supplies non-console new keys.
|
||||
- Missing file passes the isolated real config_checks function; malformed JSON refuses there, since load_config otherwise exits before this function. Tests extract only that function and provide copies/path/check_refuse stand-ins, never live state.
|
||||
- Existing console-key row200 tests and malformed-load test run whole unchanged.
|
||||
|
||||
Mutants, each unique target, syntax preflight and byte-identical restore:
|
||||
M1 restores the console-only skip, killed by the named non-console activate/rollback refusal test.
|
||||
M2 ignores failed target validation, killed by the same refusal assertions.
|
||||
M3 allows a missing-loader target with a later key, killed by the explicit missing-loader regression.
|
||||
M4 treats malformed JSON as absence, killed by isolated parse guard test.
|
||||
M5 skips the loader for an oldest-key config, killed by accepting-loader invocation witness.
|
||||
|
||||
Gate after static review and required rebases: intended RED/GREEN; touched stack-release.test.mjs whole, CLI suite whole and every scripts/test-*.sh whole; M1-M5 with fresh passing controls, no timeout counted as kill, restored bytes/status before next. TMPDIR mktemp-d /mnt/storage/scratch/tmp/gXXX; pipefail/tee and busy check before each start. Node timeout-k10 uses at least3x measured duration plus margin; stack-release prior full receipt around584s implies at least1871s, to be recorded from actual receipts before CLEAR. Shell3x table retained with receipts. No test ran and no behavior passes claimed.
|
||||
|
||||
Review focus: parser races after load_config; target stderr naming only the refused key, stdout never persisted; current versus target loader selection; unknown key with no console; missing loader compatibility set from immutable history; upcoming row270 loader-list fixture drift. Final integration audits every test dependency and hash pin against the named base. Session registration remains Sage's.
|
||||
|
||||
|
||||
Implementation ready, unrun. Four appended tests cover full activate/rollback refusal and plan; actual accepting validate witness/configpath and stdout nonleak; oldest-only missing loader with both compaction keys; missing/invalid JSON isolated realfunction. Stand-in loaders are ESM, matching .mjs. Every old test byte is preserved as a prefix. Existing console refusal text including missing-loader diagnostic is unchanged. Missing-loader compatibility is top-level key compatibility only; current load_config still validates the whole config before normal release operations. Three-path manifest, no fixture-module changes. Static target uniqueness M1-M5 passes. No Node parse, Bash execution or behavior run. Exact full compaction activate/rollback cases must be added against post270 loader, before final gate.
|
||||
|
||||
|
||||
Execution state:
|
||||
- [x] Read brief, config_checks and row200 assertions.
|
||||
- [x] Pin oldest key set from immutable loader history.
|
||||
- [x] Write regression tests, implement bounded scope, prepare unique mutants.
|
||||
- [ ] Duckworth static review.
|
||||
- [ ] Move packet to queue-N on assignment, rebase after270/271/203 and add full compaction-key cases.
|
||||
- [ ] On CLEAR run intendedRED/GREEN, touched whole file, CLI whole, M1-M5, ten shells; commit/push records only when authorized.
|
||||
|
||||
|
||||
## Duckworth0229 static approval, gate conditions
|
||||
|
||||
Source0585b3213, packet e7371025f, manifestd6226d28 approved by static read, note a5a717391:agents/duckworth/work/row1797/ROUND1-0585b3213.md. No runtime proof yet.
|
||||
|
||||
C1: after270/271/203 land, rebase under a new branch name and open a new static round. Add exact compactionReadBytes and compactionStreams full activate/rollback refusals. The existing LOADER_OLD uses the current loader plus concat after270, so it is not a pre270 witness; the new test requires its own pre270 stand-in. Reviewer checks the integrated manifest/test before CLEAR. N3 joins that delta: compactionStreams fixture value1024, matching the real type, instead of ['messages'].
|
||||
|
||||
C2: every existing B/C1/C release now validates its copied real loader, including external/upgrade suites. Any old CLI red is a change-related suspect and goes to Mos/Sage under mos-1272; no automatic placement as an unrelated fixture.
|
||||
|
||||
N1 console plus another refused key retains the old console text by design. N2 missing-loader wording is retained pending final integration review. N4 corrected above: only resolved stdout is suppressed; first stderr may echo a value, so no blanket secrecy claim. No runtime/Node/queue/push authorization is inferred from static approval.
|
||||
@@ -1,3 +0,0 @@
|
||||
eea06caad07c746d194f793603052b210e437b7184009f8b1617c88db49a5517 docs/TOOLS.md
|
||||
a35c49c5703e02f35073450e4a98e1b90cffcda581490f97a70cbdc6d2afee59 packages/cli/tests/stack-release.test.mjs
|
||||
f8fe1348796d40a096362fb0c6d5072c15ca68ff8fe10384a3eaa708eb92c150 scripts/stack-release.sh
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"reviewer": "duckworth",
|
||||
"verdict": "static approve, conditions C1-C2",
|
||||
"message": "duckworth-0229",
|
||||
"source": "0585b3213",
|
||||
"manifest": "d6226d28",
|
||||
"note": "a5a717391:agents/duckworth/work/row1797/ROUND1-0585b3213.md",
|
||||
"next": "wait for row number and post270/271/203 base, new integration static round before gate"
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"docs/TOOLS.md": "eea06caad07c746d194f793603052b210e437b7184009f8b1617c88db49a5517",
|
||||
"packages/cli/tests/stack-release.test.mjs": "a35c49c5703e02f35073450e4a98e1b90cffcda581490f97a70cbdc6d2afee59",
|
||||
"scripts/stack-release.sh": "f8fe1348796d40a096362fb0c6d5072c15ca68ff8fe10384a3eaa708eb92c150"
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"issue": 1797,
|
||||
"row": "pending Sage assignment",
|
||||
"branch": "gander/config-checks-any-key",
|
||||
"base": "01983cd3f",
|
||||
"source": "0585b321309e4d8a199afb1a1024cf6091f56770",
|
||||
"manifest": "d6226d281c778677a45e90993bbd9c985de89ba0f870d4a3ca12b6923a497e4a",
|
||||
"runtime": "NOT RUN; no Node, tests or push authorized",
|
||||
"after": [
|
||||
270,
|
||||
271,
|
||||
203
|
||||
]
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "M1",
|
||||
"occurrences": 1,
|
||||
"before": "f8fe1348796d40a096362fb0c6d5072c15ca68ff8fe10384a3eaa708eb92c150",
|
||||
"after": "804a86442527f2728f633f485eaeca02552df66a34350eac5101127046415188"
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"occurrences": 1,
|
||||
"before": "f8fe1348796d40a096362fb0c6d5072c15ca68ff8fe10384a3eaa708eb92c150",
|
||||
"after": "1c2acb6397e29ab898d8a89bc5bc691a294be749ca7d7f7897c83ec1b3e9f9ef"
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"occurrences": 1,
|
||||
"before": "f8fe1348796d40a096362fb0c6d5072c15ca68ff8fe10384a3eaa708eb92c150",
|
||||
"after": "954c9a9735904e1c566d844001b2e85c13cd16eb16e7b4b91b752974bb6dc754"
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"occurrences": 1,
|
||||
"before": "f8fe1348796d40a096362fb0c6d5072c15ca68ff8fe10384a3eaa708eb92c150",
|
||||
"after": "953d91bf28073b11e4bc5a6da516a0db1b8dfff892083cd3e6fcebe9c47b6bbf"
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"occurrences": 1,
|
||||
"before": "f8fe1348796d40a096362fb0c6d5072c15ca68ff8fe10384a3eaa708eb92c150",
|
||||
"after": "310c32b16f0fc554d5a7ffeeb0742ea7dd9fc84e1ddafabb25d7ca3f449865ef"
|
||||
}
|
||||
]
|
||||
@@ -1,37 +0,0 @@
|
||||
[
|
||||
{
|
||||
"id": "M1",
|
||||
"file": "scripts/stack-release.sh",
|
||||
"old": " [ \"$key\" != 1 ] || return 0\n if [ \"$key\" != 0 ]; then",
|
||||
"new": " [ \"$key\" != 1 ] || return 0\n [ \"$extra\" = '\"console\"' ] || return 0\n if [ \"$key\" != 0 ]; then",
|
||||
"killer": "config-any-key: a non-console target refusal"
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"file": "scripts/stack-release.sh",
|
||||
"old": "elif out=\"$(MOSAIC_CONFIG=\"$cfg\" node \"$loader\" validate 2>&1 >/dev/null)\"; then return 0",
|
||||
"new": "elif out=\"$(MOSAIC_CONFIG=\"$cfg\" node \"$loader\" validate 2>&1 >/dev/null)\" || true; then return 0",
|
||||
"killer": "config-any-key: a non-console target refusal"
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"file": "scripts/stack-release.sh",
|
||||
"old": " [ -n \"$extra\" ] || return 0",
|
||||
"new": " return 0 # drop missing-loader later-key refusal",
|
||||
"killer": "config-any-key: missing-loader copies"
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"file": "scripts/stack-release.sh",
|
||||
"old": " if [ \"$key\" != 0 ]; then\n check_refuse config-console-key",
|
||||
"new": " if [ \"$key\" = 99 ]; then\n check_refuse config-console-key",
|
||||
"killer": "config-any-key: missing config passes but malformed JSON refuses"
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"file": "scripts/stack-release.sh",
|
||||
"old": " if [ ! -f \"$loader\" ]; then",
|
||||
"new": " [ -n \"$extra\" ] || return 0\n if [ ! -f \"$loader\" ]; then",
|
||||
"killer": "config-any-key: accepting loaders run validate"
|
||||
}
|
||||
]
|
||||
@@ -1,47 +0,0 @@
|
||||
{
|
||||
"authority": "mos-1409 via sage-3181",
|
||||
"base": "4a9c536e8",
|
||||
"path": "packages/cli/tests/case1-accept.test.mjs",
|
||||
"old_line_replacements": [
|
||||
{
|
||||
"old": " if(fault==='inner')assert.ok(probeSeconds>=1.25&&probeSeconds<2.75,`${mode}: probe ${probeSeconds}s after baseline ${baselineSeconds}s`);",
|
||||
"new": " if(fault==='inner')assert.ok(probeSeconds>=1.25&&probeSeconds<2.75,`${mode}: direct probe ${probeSeconds}s; baseline ${baselineSeconds}s is diagnostic only`);",
|
||||
"change": "diagnostic message only; numeric comparisons and strictness unchanged"
|
||||
},
|
||||
{
|
||||
"old": " assert.ok(probeSeconds>=3.25&&probeSeconds<4.75,`${mode}: probe ${probeSeconds}s after baseline ${baselineSeconds}s`);",
|
||||
"new": " assert.ok(probeSeconds>=3.25&&probeSeconds<4.75,`${mode}: direct probe ${probeSeconds}s; baseline ${baselineSeconds}s is diagnostic only`);",
|
||||
"change": "diagnostic message only; numeric comparisons and strictness unchanged"
|
||||
},
|
||||
{
|
||||
"old": " const probeSeconds=seconds-baselineSeconds;",
|
||||
"new": " let probeSeconds=seconds;\n if(timingFile)assert.doesNotThrow(()=>{probeSeconds=readProbeSeconds(read(timingFile));},'P10 observer pair is required');",
|
||||
"change": "approved observer plumbing or probeSeconds source"
|
||||
},
|
||||
{
|
||||
"old": "function run(h, extra = {}, argv = [\"--business\", \"mosaic-stack\", \"--args\", \"/etc/mosaic-stack/dev.args\", \"--claude-pin\", CLAUDE_PIN, \"--node-pin\", NODE_PIN, \"--root\", h.root]) {",
|
||||
"new": "function run(h, extra = {}, argv = [\"--business\", \"mosaic-stack\", \"--args\", \"/etc/mosaic-stack/dev.args\", \"--claude-pin\", CLAUDE_PIN, \"--node-pin\", NODE_PIN, \"--root\", h.root], script = SCRIPT) {",
|
||||
"change": "approved observer plumbing or probeSeconds source"
|
||||
},
|
||||
{
|
||||
"old": " const r = spawnSync(SCRIPT, argv, {",
|
||||
"new": " const r = spawnSync(script, argv, {",
|
||||
"change": "approved observer plumbing or probeSeconds source"
|
||||
},
|
||||
{
|
||||
"old": " const start=performance.now(),r=run(h),seconds=(performance.now()-start)/1000;capture();",
|
||||
"new": " const start=performance.now(),r=run(h,timingFile?{ROW299_TIMING_FILE:timingFile}:{},undefined,observedScript),seconds=(performance.now()-start)/1000;capture();",
|
||||
"change": "fault run selects private copy only for inner/outer; default SCRIPT and overflow remain"
|
||||
}
|
||||
],
|
||||
"only_removed_assertion_lines_are_two_diagnostic_messages": true,
|
||||
"numeric_bands_unchanged": {
|
||||
"inner": "[1.25,2.75)",
|
||||
"outer": "[3.25,4.75)"
|
||||
},
|
||||
"baseline_status_and_clean_session_lines_byte_identical": true,
|
||||
"all_other_original_assertion_lines_preserved": true,
|
||||
"guard_7000_unchanged": true,
|
||||
"new_assertions": "copy reversal, observer variable isolation, stream/status/EXIT preservation, strict records, required pair",
|
||||
"runtime_status": "NOT RUN; no Node or test until CLEAR"
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
{
|
||||
"row": 299,
|
||||
"issue": 1806,
|
||||
"vikunja": 573,
|
||||
"base": "4a9c536e861f1d9f9a018019b3ac4519d65eccf0",
|
||||
"branch": "gander/row299-p10",
|
||||
"status": "IMPLEMENTED STATIC; source 1ec2b9765; no Node/test/push",
|
||||
"authority": "mos-1409, sage-3181; Filbert implementation review pending",
|
||||
"files": [
|
||||
{
|
||||
"path": "packages/cli/tests/case1-accept.test.mjs",
|
||||
"git_blob": "c196b40981056963ed924a09f649cfe8e99b34c6",
|
||||
"sha256": "1e8af0656707d93dedade923bf60556022dc7121c43761876a5d7e02731c14aa"
|
||||
},
|
||||
{
|
||||
"path": "packages/cli/tests/case-sudo-fixture.mjs",
|
||||
"git_blob": "866c6c0d229a1fc1e9401ee8bb5522ac8cb01ebc",
|
||||
"sha256": "eac5c83f43056bdeb5781101307e17d4bc01f03e97e02f4f5e930436d7e43535"
|
||||
},
|
||||
{
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"git_blob": "05cb249ea2217d1a542438b597d382669acf8a9b",
|
||||
"sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2"
|
||||
}
|
||||
],
|
||||
"source": "1ec2b97650849b90f41a8e1d1190f609de312d49",
|
||||
"execution": "HELD for Sage CLEAR; no stress process; ambient load >=4 is target only"
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
# Row 299 / Vikunja 573: direct P10 timing
|
||||
|
||||
> Execution method: Gander implements inline after Mos's old-test ruling and Filbert's static read. No delegation. Static implementation authorized by mos-1409 / sage-3181. Every runtime step remains held for CLEAR.
|
||||
|
||||
**Goal:** Measure whether P10 takes its two-second inner path or four-second outer path under load, without subtracting unrelated work from another run.
|
||||
|
||||
**Architecture:** Add a test helper that makes a private, instrumented copy of the current acceptance script. Two root-side observer statements bracket only the P10 capture's actual bounded wait. Read a complete monotonic begin/end pair from a separate fixture file, while all existing refusal, residual and cleanup assertions still examine the real acceptance output.
|
||||
|
||||
**Tech stack:** Existing Node test runner, Bash builtins, Linux /proc/uptime. No new package, interpreter, product hook or live host action.
|
||||
|
||||
**Spec:** docs/plans/2026-10-23_mvp-readiness-rows.md, "Brief: 573, the P10 hop band"; sage-3175. Base 4a9c536e8, branch gander/row299-p10. Reviewer Filbert; gate owner Sage. Row 293 is done. Queue claim is held because it executes Node, forbidden in the present slot.
|
||||
|
||||
## Constraints and current status
|
||||
|
||||
- Static implementation only, authorized by mos-1409. No Node, tests, HTTPS Git, queue call or push has run for 299. No production edit.
|
||||
- Mos approved the measurement semantics in mos-1409 via sage-3181 under mos-1272. The numeric bands stay unchanged.
|
||||
- All script/supervisor bytes, 2/4-second budgets, 128-byte cap, exact reason assertions, no-observed assertion, hop residual assertion and cleanup assertions remain authoritative.
|
||||
- Keep the same healthy baseline status and `baseline leaves no session` assertions. It may remain as an independent healthy control and diagnostic; it no longer supplies the clock value being asserted.
|
||||
- No extra retry, smoothing, percentile selection, ignored red, clock fallback, or widened band. Missing clock evidence fails.
|
||||
- Tests use a short TMPDIR directly under /mnt/storage/scratch/tmp/gXXXXXX, never /tmp. No live units, ports, credentials or instance state.
|
||||
|
||||
## Source of the band and evidence
|
||||
|
||||
1. The original row 253 test timed the full acceptance run. Row 276 exposed it after adding stdout spooling: the old inner `<4 s` whole-run bound already failed 2/5 before that delta and 5/5 after it. Mos's mos-1350 ruled that tests 9 and 10 must measure the probe's cost, offering probe stamps or a same-mode no-fault baseline. See agents/gander/work/queue-276/BUILD.md:120-145 and ASSERTION-PRESERVATION.json.
|
||||
2. We chose baseline subtraction in 135bb8fae (original source 6f8c5653a). e06130fc0 added the required clean baseline check. Current test lines 371-388 measure two separate full runs and compute `probeSeconds=seconds-baselineSeconds`.
|
||||
3. The adopted windows are inner [1.25,2.75) and outer [3.25,4.75): 0.75 s around the configured 2/4 s budgets, with 0.5 s between windows. Duckworth-0218 accepted them; the isolated proof in queue-276/BUILD.md reported inner exec 2.033..2.171, inner hop 2.055..2.135, outer exec 3.758..3.961, outer hop 3.736..3.911. Those are historical evidence, not a new run or carried result.
|
||||
4. The recorded failure is agents/gizmoduck/work/queue-270/BUILD.md:629-636: run 3 on 53406f3e4 had CLI 904/905, inner hop estimate 1.08 below 1.25. The file was unchanged. Its isolated whole rerun passed 50/50 at load 3.19 (mos-1367). No other seat's scratch has been read for this packet.
|
||||
5. Production is scripts/case1-accept.sh:744, `tester_capture 2 4 128`. Its inner timer is after the uid drop; its outer timeout is started at :238 and waited at :244. The capture validates tools and creates its private files at :233-235, before the timer is armed. Exact refusal mapping is :224-229. The stalled-supervisor case remains an explicit same-uid residual.
|
||||
|
||||
Static mechanism: let H be the healthy probe cost, I the true faulty wait and U the rest of the full run, including scheduling delays. The current estimate is `(I + U_fault) - (H + U_baseline)`. It contains `U_fault-U_baseline-H`, so it can underestimate I when the baseline gets more delay. The 1.08 report is consistent with that mechanism; we do not invent the separate component timings absent from the committed record. A direct bracket removes the unrelated subtraction; execution must still establish its margins under the agreed load.
|
||||
|
||||
## Approaches considered
|
||||
|
||||
- Repeat baselines or use a median: reduces some noise but still subtracts two unrelated schedules and adds work to every whole-file gate. Reject as the fix.
|
||||
- Stamp in the peer Python or sudo fake: the inner/outer timer is already armed before a delayed child reaches the stamp, so it can measure only the remaining budget and undercount again. Reject.
|
||||
- **Recommend a direct root-side bracket in a private script copy.** Begin immediately before the actual outer timeout launch, after validation; end immediately after its wait, before unrelated post-checks. Includes sudo dispatch, the inner wait and its cleanup, or the outer timeout. Excludes preceding functional checks, the healthy run, metadata work before capture, and tool-validation cost. It measures the same timing distinction, using both existing fake sudo modes.
|
||||
|
||||
Mos approved this approach in mos-1409. Timing still includes kernel scheduling and inner cleanup. Arbitrary starvation cannot be given a hard wall-time guarantee; an overshoot remains a red for placement, not permission to retune.
|
||||
|
||||
## Proposed files and interfaces
|
||||
|
||||
- New packages/cli/tests/case-p10-timing-fixture.mjs: `instrumentP10Probe(source)` returns a copy of the current script with exactly two observer blocks; `readProbeSeconds(text)` returns `(end-begin)` in seconds from two validated centisecond readings.
|
||||
- Existing packages/cli/tests/case1-accept.test.mjs: an optional script-path argument to run(), defaulting to SCRIPT for every current caller. Only inner/outer P10 fault runs execute the private copy. The baseline still uses SCRIPT. Overflow stays on SCRIPT and unchanged.
|
||||
- agents/gander/work/queue-299/: plan, assertion-preservation record, manifest, raw logs, load/timing receipts and mutant records after authorization. No production path in the candidate manifest.
|
||||
|
||||
Observer details:
|
||||
|
||||
1. Locate exactly one `tester_capture() (` function, scoped before the unique row276-legacy marker. Each insertion anchor must occur once within that slice. Never apply an unscoped global replace.
|
||||
2. Just before :238 and just after :244, use shell `read` on /proc/uptime plus `printf` to append `begin <uptime>` / `end <uptime>` to ROW299_TIMING_FILE, only when `maximum` is 128. Selecting the existing probe cap, rather than the 2/4 budgets, keeps the observer active when a timer mutant changes a budget. Config query uses 4096 and emits no probe pair.
|
||||
3. Read and printf are Bash builtins: no new process or Python/Node startup inside the timed span. Preserve `$rc` and every original command, redirection and heredoc byte. Do not emit observer bytes on stdout/stderr. The file is private fixture evidence, not a product authority channel.
|
||||
4. The copy retains the original absolute /proc reads and the --root fixture seam. The script has no relative self-path imports. Write the copy under h.dir with executable mode and pass the private timing path only to that run. No product script is rewritten.
|
||||
5. Reverse the two recorded insertions and assert byte equality with freshly read SCRIPT. This applies to the current script, including a deliberately mutated source, rather than a stale frozen healthy copy. The same source/copy comparison and unique anchors fail closed on drift.
|
||||
6. Parser requires exactly one newline-terminated begin and end pair, in that order, each `<integer>.<two digits>`, and end strictly above begin. No extra pair, missing value, NaN or negative interval is accepted. Use integer centiseconds before converting to seconds. A 10 ms clock resolution is much smaller than the existing 0.5 s window gap.
|
||||
7. Keep inner [1.25,2.75) and outer [3.25,4.75) exactly. Change only the source of probeSeconds and its diagnostic description. Preserve every existing status/reason/no-observed/residual/cleanup assertion, including the healthy baseline checks. The existing 7 s fixture safety guard stays unchanged and remains cleanup only, never proof of an outer timeout. If it intervenes or masks a measurement, stop for Sage/Mos; do not silently extend it.
|
||||
|
||||
## Review focus
|
||||
|
||||
- A delayed healthy baseline cannot change the measured interval: it is diagnostic only. No baseline value enters readProbeSeconds or a timing assertion.
|
||||
- A child delayed after timer arming is not used as the start observer. The begin read precedes timer launch in the root-side capture copy.
|
||||
- Missing/duplicated/reversed records fail before a band assertion. Add named observer-record tests; no fallback to the old arithmetic.
|
||||
- A timer mutant reaches the actual observer copy. Source reconstruction and cap-based selection prevent budgets changed to 1/3 seconds from disabling observation.
|
||||
- Observer code must not change stdout, refusal status, cleanup or trust. Preserve original source bytes by inverse comparison and all original non-timing assertion lines by an assertion-preservation receipt.
|
||||
|
||||
## Implementation and evidence sequence (held)
|
||||
|
||||
- [x] Proposal sent in gander-0183; mos-1409 / sage-3181 approve the measurement change. Filbert accepts the observation points and supplies implementation checks I1-I5.
|
||||
- [x] Source 1ec2b9765 adds the helper and observer wiring, plus source/variable, streams/status/trap, and record-validation tests. ASSERTION-PRESERVATION.json lists all six old line replacements; only two original assertion messages change. No runtime or syntax claim.
|
||||
- [ ] Static review on the committed candidate and manifest. Prove scripts/case1-accept.sh and scripts/case2-unit.sh are byte-identical to the approved base, and no unrelated assertion moved. Finalize all mutant anchors with exactly-one checks.
|
||||
- [ ] On Sage CLEAR, first record a passing named base for each killer and then M1-M6 from MUTANT-PLAN.json. Report the actual assertion killed. Every restore is byte-identical and git status is checked. A timeout or survivor stops for placement, not a kill.
|
||||
- [ ] Run case1-accept.test.mjs whole at least three times under load, then CLI whole, as the brief requires. Record ambient load at each of the three starts and throughout each file; >=4 is a target, never a wait condition (mos-1409). No stress process. The whole CLI suite is the required loaded proof; record its load and all exec/hop direct intervals, plus min/max. Do not hold the slot for load.
|
||||
- [ ] Record all timeout limits before launch: per-node-file timeout -k 10; use at least ceil(3x longest receipt)+120, with 900 s for an unknown file. Whole case1 gets 1200 s from the row293 receipt; stack-release 2400 s from its 683.647 s historical receipt; recheck measured maxima before the current gate. Print the full CLI file list and run the package whole with its normal test-file concurrency, so the suite itself supplies the required loaded proof. Use timeout -k 10 5400 around that whole invocation: 3x the row293 1367.764 s CLI receipt plus 120 is 4224 s, below 5400. TMPDIR is fresh short scratch. No runs are authorized now.
|
||||
- [ ] Any old-test red, reason mismatch, fixture-guard intervention, timeout, or survivor goes to Sage/Mos before edits or retry. No carried result from row293. Commit and publish records only in Sage's gap, claimant review move only in a queue gap. Filbert reviews; Sage gates and lands.
|
||||
|
||||
## Static self-review
|
||||
|
||||
The proposal meets the brief's source/fix/mutant items and preserves the 2/4 s distinction and separated numeric windows. No runtime or load-stability claim is made. Timing-copy instrumentation is the main review risk: Filbert must approve the two exact observation points and source-byte reconstruction before execution. Mos approved the changed old-test measurement semantics in mos-1409. The 7 s whole-run fixture guard and scheduling overshoot remain explicit risks to measure, not hidden assertions to relax. No other test or supervisor repair is bundled.
|
||||
|
||||
|
||||
## Implemented static: mos-1409 / sage-3181 and Filbert I1-I5
|
||||
|
||||
Source 1ec2b9765 on base 4a9c536e8. The two observers use `read -r row299_up row299_spare < /proc/uptime`, never the fixture root. Both guard cap 128 and a nonempty `${ROW299_TIMING_FILE-}`. printf is redirected to that absolute private fixture file; grouped stderr goes to /dev/null; errors leave absent evidence which the parser refuses. No observer assigns a production capture variable, changes rc, or touches a trap. New tests assert row299-only read targets and no other assignment; preserve explicit stdout/stderr bytes, exit 87 and the EXIT trap; and reject missing begin/end, duplicate pair, reversed order, nonnumeric/equal/backward readings, and a missing/extra final newline.
|
||||
|
||||
Only inner/outer fault runs receive the absolute timing path and executable 0700 private copy. Every such run reverses its two insertions and compares to a fresh read of SCRIPT, including any timer mutant. Baseline and overflow use SCRIPT; baseline status and clean-session assertions remain unchanged. The clock pair is required by assert.doesNotThrow before applying the unchanged bands. baselineSeconds stays diagnostic only. Capture launch insertion keys on its unique LC_ALL=C prefix rather than the timeout command itself, so M4 (outer removal) reaches execution instead of an anchor refusal.
|
||||
|
||||
M1-M6 have one target each in their defined scope. M5 now suppresses only the begin printf, preserving the constant block and reversal check so the named inner test must reject an end-only record. M6 admits equal readings so the record-validation test must catch it. M1 retains the known startup-overhead risk: save its interval and stop on a survivor, without changing the ruled bands. All production/shared fixture bytes are unchanged. Manifest is the two test/helper paths only. No Node, syntax preflight, test, mutant, queue call, or HTTPS operation has run. The implementation is unverified until Filbert's static read and Sage CLEAR.
|
||||
|
||||
|
||||
## sage-3255 integration, static only
|
||||
|
||||
Rebased all three commits from 4a9c536e8 onto 80793d824 under new branch gander/row299-8079, preserving gander/row299-p10. No conflict. The range-diff has three equal pairs and all per-commit stable patch-ids match. Source is e6751ecab; both manifest blobs equal the approved 1ec2b9765 blobs, so digest 277ace0b is unchanged. Direct test/helper, product case1 script, shared CLI helper and sudo-fixture paths have zero drift over 4a9c536e8..80793d824. Row294's CLI config/access and stack-release-test changes are in the new base and covered by the required full CLI suite. No package/source/test implementation changed in this integration. Full records in integration-8079/.
|
||||
|
||||
Gate remains held for CLEAR. Ambient load >=4 remains a target, not a wait condition under mos-1409; no stress process. Record each of three whole case1 starts and the whole CLI suite's load and per-mode direct timings. Numeric windows and the 7 s guard remain fixed. Any red, guard intervention, timeout, survivor or overshoot stops to Sage for Mos before edits or retry.
|
||||
|
||||
## Gate run 1: sage-3268, 2026-10-23
|
||||
|
||||
GREEN on ffa93b054 / 277ace0b. Three whole case1 runs 53/0/0 each; whole CLI 917/0/0 across 59 files. Total 1076/0/0, no cancelled/todo. M1-M6 all killed at their intended assertions, with byte-identical clean restores. No unmutated guard intervention, external timeout, retry or carry. UTC run 07:26:52–07:50:16 (1404 s). CLI load reached 7.17; direct CLI intervals inner exec/hop 2.27/2.27, outer exec/hop 4.01/4.01.
|
||||
|
||||
M4 follows sage-3273 / mos-1426: the 7 s fixture guard returned, then exact outer-reason assertion at case1-accept.test.mjs:445 failed on probe-inner-command. No timeout or cleanup-only kill. M1 measured 1.23 s, preserving the noted narrow kill margin. Sweep found zero gate residuals; four MCP harness processes predate this run. Full records, load samples, assertion locations and named base evidence are in run1/RESULTS.md and run1/results.json. Manifest remains unchanged.
|
||||
@@ -1,2 +0,0 @@
|
||||
7ac9d29281d4076bf2e00b7a07294cd4519d7ae9f97c4f6ddc1d22440c9b071a packages/cli/tests/case-p10-timing-fixture.mjs
|
||||
685cf69c741540240c5b414e1907e624cbc59656541316f178d377472fad34a2 packages/cli/tests/case1-accept.test.mjs
|
||||
@@ -1,73 +0,0 @@
|
||||
{
|
||||
"status": "Static definitions finalized; no mutant executed",
|
||||
"mutants": [
|
||||
{
|
||||
"id": "M1",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"old": "tester_capture 2 4 128",
|
||||
"new": "tester_capture 1 4 128",
|
||||
"killer": "row253 C4 P10 inner reason holds under both sudo models",
|
||||
"expected": "exact inner-timeout reason remains valid, but direct probe interval is below 1.25 s; ERR_ASSERTION on the existing lower-band check",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2",
|
||||
"receipt_requirement": "Record direct interval even if it survives; startup overhead can erase the 0.25 s kill margin. Survivor stops to Sage/Mos; bands unchanged."
|
||||
},
|
||||
{
|
||||
"id": "M2",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"old": "tester_capture 2 4 128",
|
||||
"new": "tester_capture 3 4 128",
|
||||
"killer": "row253 C4 P10 inner reason holds under both sudo models",
|
||||
"expected": "exact inner-timeout reason remains valid, but direct interval exceeds the unchanged 2.75 s top; ERR_ASSERTION on upper-band check",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2"
|
||||
},
|
||||
{
|
||||
"id": "M3",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"old": "tester_capture 2 4 128",
|
||||
"new": "tester_capture 2 3 128",
|
||||
"killer": "row253 C4 P10 outer reason holds under both sudo models",
|
||||
"expected": "stalled supervisor still gives exact outer-timeout, but direct interval falls below 3.25 s; ERR_ASSERTION on outer lower-band check",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2"
|
||||
},
|
||||
{
|
||||
"id": "M4",
|
||||
"path": "scripts/case1-accept.sh",
|
||||
"scope": "tester_capture function only",
|
||||
"description": "Remove the trusted outer GNU timeout from the capture invocation, keeping the fixture guard",
|
||||
"killer": "row253 C4 P10 outer reason holds under both sudo models",
|
||||
"expected": "the fixture safety guard permits return but the exact probe-outer-timeout assertion fails; never count external command timeout or cleanup alone as a kill",
|
||||
"scope_begin": "tester_capture() (\n",
|
||||
"scope_end": "# row276-legacy-begin",
|
||||
"old": "LC_ALL=C \"$TS_TIMEOUT\" --verbose --signal=KILL \"${outer}s\" \"$TS_BASH\" -c ",
|
||||
"new": "LC_ALL=C \"$TS_BASH\" -c ",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "89b45bb84e8365f32f08fd055c7db8a0259533f23fe7ab03f484acb25bee92c2"
|
||||
},
|
||||
{
|
||||
"id": "M5",
|
||||
"path": "packages/cli/tests/case-p10-timing-fixture.mjs",
|
||||
"description": "Suppress the begin printf while retaining the inserted begin block and reversal check",
|
||||
"killer": "row253 C4 P10 inner reason holds under both sudo models",
|
||||
"expected": "the existing inner test requires a valid pair with assert.doesNotThrow; end-only evidence fails ERR_ASSERTION",
|
||||
"old": "printf 'begin %s\\\\n' \"$row299_up\" >> \"$ROW299_TIMING_FILE\";",
|
||||
"new": ":;",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "7ac9d29281d4076bf2e00b7a07294cd4519d7ae9f97c4f6ddc1d22440c9b071a"
|
||||
},
|
||||
{
|
||||
"id": "M6",
|
||||
"path": "packages/cli/tests/case-p10-timing-fixture.mjs",
|
||||
"description": "Accept an equal begin/end clock pair",
|
||||
"killer": "row299 P10 observer records are complete and ordered",
|
||||
"expected": "the equal-readings case in the named record test expects refusal and fails ERR_ASSERTION",
|
||||
"old": "end <= begin",
|
||||
"new": "end < begin",
|
||||
"static_anchor_count": 1,
|
||||
"source_sha256": "7ac9d29281d4076bf2e00b7a07294cd4519d7ae9f97c4f6ddc1d22440c9b071a"
|
||||
}
|
||||
],
|
||||
"restore": "Restore byte-identical source/test/helper files and require clean git status between cases. Timeout is a stop, never a kill."
|
||||
}
|
||||
Loaded 100 of 852 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user