Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce0bf74401 |
No files matched your search
@@ -0,0 +1,3 @@
|
||||
chief re6c69f1ec1f0 claude-code since 2026-10-22T15:05:59.297Z
|
||||
pm r410293d04d3d claude-code since 2026-10-22T15:24:01.221Z
|
||||
# exit 0
|
||||
@@ -0,0 +1,3 @@
|
||||
re6c69f1ec1f0 mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T15:05:59.295Z running
|
||||
r410293d04d3d mosaic-stack/pm claude-code claude-opus-5-5 by chief since 2026-10-22T15:24:01.208Z 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,3 @@
|
||||
chief re6c69f1ec1f0 claude-code since 2026-10-22T15:05:59.297Z
|
||||
pm r410293d04d3d claude-code since 2026-10-22T15:24:01.221Z
|
||||
# exit 0
|
||||
@@ -0,0 +1,3 @@
|
||||
re6c69f1ec1f0 mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T15:05:59.295Z running
|
||||
r410293d04d3d mosaic-stack/pm claude-code claude-opus-5-5 by chief since 2026-10-22T15:24:01.208Z running
|
||||
# exit 0
|
||||
@@ -0,0 +1,2 @@
|
||||
chief r148e72c8895d claude-code since 2026-10-22T20:16:24.301Z
|
||||
# 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 r148e72c8895d claude-code since 2026-10-22T20:16:24.301Z
|
||||
# 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": "r148e72c8895d",
|
||||
"launchedBy": "jason",
|
||||
"harness": "claude-code",
|
||||
"model": "claude-opus-5-5",
|
||||
"provider": "anthropic",
|
||||
"modelKey": "opus",
|
||||
"pid": 1791348,
|
||||
"startTime": "80137447",
|
||||
"runnerPid": 1791349,
|
||||
"runnerStartTime": "80137447",
|
||||
"runDir": "/home/jwoltje/.mosaic-dev/launches/mosaic-stack/r148e72c8895d",
|
||||
"startedAt": "2026-10-22T20:16:24.291Z",
|
||||
"live": true
|
||||
}
|
||||
]
|
||||
@@ -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,21 @@
|
||||
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: 1 commit(s) on refactor since the pointer's copy
|
||||
# exit 0
|
||||
@@ -0,0 +1,2 @@
|
||||
mosaic: pm isn't running, so the tester's message was refused and nothing was stored
|
||||
# exit 3
|
||||
@@ -0,0 +1,65 @@
|
||||
# P1 start 2026-10-22T20:07:35.408Z, REPO HEAD 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
# plan sha256 e6d611fc15ec8b1509c7e54d3c83695a99c80d0730f496904f13679d84b9d92a (P0 mos-1338)
|
||||
# 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-22T20:07:35.418Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh status mosaic-stack)
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"84f53540dd0d21ef179ca29697e172b0246e78d1","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":"3l","activation":"20261022T150555Z-84f53540dd0d","at":"2026-10-22T15:06:00Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-21T21:59:31Z","op":"activate","from":"4429a104f6d65ccf165f6c83b5d1dce3147dfde0","to":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","backup":"20261021T215926Z-7247d80c7af7","activation":"20261021T215926Z-7247d80c7af7","result":"ok"}
|
||||
{"at":"2026-10-22T04:02:56Z","op":"activate","from":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","to":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","backup":null,"activation":"20261022T040256Z-86f95bb27f6c","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"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"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3634254, running, since 2026-10-22T15:05:57.441Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3634311
|
||||
boot: organization file loaded at 2026-10-22T15:05:57.439Z
|
||||
unit flags: match the pointer
|
||||
drift: 81 commit(s) on refactor since the pointer's copy
|
||||
# exit 0, end 2026-10-22T20:07:35.729Z
|
||||
|
||||
## P1 values
|
||||
# start 2026-10-22T20:07:35.731Z
|
||||
# command: (cd $REPO && <clean env> node /mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-0cbe2e9b3/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-22T20:07:35.755Z
|
||||
|
||||
## P1 business-check OLD
|
||||
# start 2026-10-22T20:07:35.779Z
|
||||
# command: (cd $REPO && <clean env> node /mnt/storage/src/mosaic-stack/agents/sage/work/window-plan/repin-de352dfaf/business-check.mjs 84f53540dd0d21ef179ca29697e172b0246e78d1)
|
||||
copy 84f53540d: roles 6, projects 1, arbiters 2
|
||||
HOLDS chief instance.name yes
|
||||
HOLDS pm instance.name no
|
||||
LOAD_OK
|
||||
# exit 0, end 2026-10-22T20:07:35.818Z
|
||||
|
||||
## P1 data console
|
||||
# dataRoot /home/jwoltje/.mosaic-dev
|
||||
# ls -ld $DATA/console:
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 10:05 /home/jwoltje/.mosaic-dev/console
|
||||
# ls rc=0
|
||||
# tester.sock path length 45 bytes (limit 107)
|
||||
# P1 end 2026-10-22T20:07:35.841Z
|
||||
@@ -0,0 +1,155 @@
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (rows 206, 269, 275, 253 fixes, PRD 1.15), schema 3l to 3m
|
||||
|
||||
Darkwing operates this window. Sage assigned it in sage-2967 (with the correction sage-2970), on Mos's ruling
|
||||
mos-1335. The layout follows my last window's `window-repin-84f53540d/PLAN.md` (branch
|
||||
darkwing/window-repin-84f53540d, 65edf2653). Where a step is unchanged I name it and only say what differs. Mos
|
||||
checks this file's sha256 and NEW's full sha before P0, and any change after that needs a new check (A1). The
|
||||
window's files go on a darkwing/* branch, never local refactor (sage-2762).
|
||||
|
||||
## 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. B0, P2 and P3 run only in that gap, after Gander's 276 run and ahead of 203 and 207 (A3). No repo
|
||||
node runs during another seat's slot. D3 and the business file copy are plain tar, cp and sha256sum and ran
|
||||
before the gap (sage-2970).
|
||||
- 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 (A5). I don't start, stop or restart the Console, the bus or
|
||||
mosaic-webui by hand.
|
||||
- Nothing new goes on: no `mosaic access`, no Gitea grant run, no `--send`, no `--sso`, no proof pair, no pi
|
||||
(#383). Row 285's chief gitea ref is out of scope (A8). dragon-lin only; .53 and .54 take nothing.
|
||||
- Decision 96 condition 2 asks for Jason present at a migrating activate, and NEW's `--plan` prints
|
||||
`needs: Jason present for this run (decision 96 condition 2)` (`scripts/stack-release.sh:1413` at NEW).
|
||||
Q173 overrides that condition for this business, as at the last two windows. The line is expected in W3 and
|
||||
doesn't stop the window.
|
||||
|
||||
## Names
|
||||
|
||||
- OLD, live: `84f53540dd0d21ef179ca29697e172b0246e78d1`, schema 3l, pointer `pm: true`, activation
|
||||
`20261022T150555Z-84f53540dd0d`. 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.
|
||||
- NEW: `0cbe2e9b35e51fe06dedde69c022b46e040f98c0`, row 206's landing (19:47Z, #1704), 81 commits past OLD
|
||||
(`git rev-list --count`), OLD its ancestor. NEW is frozen: it doesn't move if 276 lands, and no other row
|
||||
joins.
|
||||
- `WIN=agents/darkwing/work/window-migrate-0cbe2e9b3/`. Its scripts adapt the last window's. `d3.sh` and
|
||||
`bz.sh` are new; `b0.sh` changes WIN and SCHEMA only (3l); `p3/counts.py` is the same file.
|
||||
|
||||
## What NEW carries over OLD
|
||||
|
||||
The non-test paths changed from OLD to NEW (`git diff --name-only`), without tests, agents/, docs/ and `.md`
|
||||
files.
|
||||
|
||||
| Row | Commits | Paths | Live effect |
|
||||
|---|---|---|---|
|
||||
| 206 | d78a9cc83, 8a29f9477 | packages/bus/schema.sql, src/migrations/3l-3m.sql, src/store.mjs, src/broker.mjs, scripts/stack-release.sh | Schema 3m adds `thread_shares`, its index and 3 append-only triggers. No existing row changes, so every thread stays private. The broker gets `thread.share`, `thread.unshare` and `thread.shares` for the business human and for users with a collaborator grant; a tester or reader gets `tester-refused` or `read-only`. No CLI verb reaches them at NEW. stack-release.sh's only change is COUNTED, which adds thread_shares (`:420`). |
|
||||
| 269 (264b) | 2133c5a0c, 42fd3edd4, 6c80b1290 | packages/seat/src/session.mjs, sandbox.mjs, packages/cli/src/launcher.mjs, packages/bus/src/broker.mjs | Each non-legacy thread session gets its own store under `threads/<b>/<t>/sessions/<s>` and a workspace with a single-writer lock. `bus-host/sessions.json` goes to `sessionsVersion` 2 (`session.mjs:48`); NEW reads 1 and 2, OLD reads only 1 (see rollback). |
|
||||
| 275 | 4dd85c671 | broker | Viewer verbs and board refusals. No user grant exists on live, so tester reads see what they saw before. |
|
||||
| 253 fixes | cca936716, 950cf47f3 | scripts/case1-accept.sh, scripts/case2-unit.sh | Root-run system unit install for a hub. dragon-lin runs user units from bus-service.sh and webui-service.sh, which haven't changed, so nothing live runs these. |
|
||||
| PRD 1.15 | 71fed6281 | packages/tasks/requirements.json | The requirements file the pm reads. |
|
||||
|
||||
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 --quiet`).
|
||||
|
||||
## Schema and backups
|
||||
|
||||
- `SCHEMA_VERSION` is 3m at NEW (`packages/bus/src/store.mjs:17`) and 3l at OLD and in the live store. The
|
||||
chain runs one step, 3l to 3m. W3's plan must show `migration: 3l to 3m, after a backup of the stopped store`,
|
||||
`migration steps: 3l to 3m`, `needs: --migrate (given)` and the Jason line above. Any other migration text
|
||||
stops at W3.
|
||||
- Counts after the migration. The live 3l store has 23 rows of type `table` in sqlite_master (with
|
||||
sqlite_sequence), 87 triggers and 5 views. A fresh 3l schema.sql gives the same 23 and 87, and a fresh 3m
|
||||
schema.sql gives 24 and 90 (read with python3 sqlite on an in-memory database). schema.test's pins, 23 tables
|
||||
and 89 triggers (`packages/bus/tests/schema.test.mjs:526-527`), count after the test drops
|
||||
`task_snapshots_no_update` at `:512` and subtract one table. So on the live 3m store W6 expects 24 table rows
|
||||
(23 by the test's measure), 90 triggers and 5 views. 89 on live would mean a trigger is missing.
|
||||
- D3, done before the window: `~/.mosaic-dev/backups/d3-20261022T195931Z/`, STAMP 2026-10-22T19:59:31.330Z,
|
||||
tar exit 0, 90872 members, its `bus-host/sessions.json` at sessionsVersion 1, SHA256SUMS sha256
|
||||
a19c2bc1bd24ed7674328088a9755a54c25ec28d4a9fe05c5ba0ac94cbbe2ee2 (`d3.txt`). It leaves out `backups/`, the live
|
||||
store and its -wal and -shm (a tar of a store being written isn't consistent, so B0 and W5's backup cover
|
||||
the store), sockets, `discord/searxng` (a container volume owned by systemd-network) and
|
||||
`launches/*/*/tmp` (old runs' sandbox scratch with write-only test files). The first try,
|
||||
`d3-20261022T195816Z`, stopped on tar exit 2 for 36 unreadable paths under those last two; it's kept, not
|
||||
removed (`d3-run1.txt`).
|
||||
- The business file copy (A2), done: `~/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261022T195852Z`,
|
||||
sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93, the same as the last window's (`bz.txt`).
|
||||
- B0, in Sage's gap: `b0.sh`, the online sqlite backup-API copy laid out for `rehearse --backup PATH`:
|
||||
`$DATA/backups/b0-<STAMP>/bus/bus.sqlite`, SHA256SUMS written from inside `bus/`, `SCHEMA` (must say 3l) and
|
||||
`CHECK`. It runs python3 -B, not node. Its path and SHA256SUMS sha256 go to Mos with D3's before P3 (A2).
|
||||
- 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.
|
||||
- Restore guard at NEW counts events plus 14 tables (`stack-release.sh:420`); thread_shares is the new one.
|
||||
|
||||
## Before the window (nothing stopped)
|
||||
|
||||
| # | Who | Step |
|
||||
|---|-----|------|
|
||||
| P0 | Mos | Check NEW's full sha and this file's sha256 (A1). |
|
||||
| D3 | operator | Done, above. |
|
||||
| BZ | operator | Done, above. |
|
||||
| B0 | operator, in Sage's gap | `b0.sh`, above. D3 and B0 paths and SHA256SUMS sha256 go to Mos before P3. |
|
||||
| P1 | operator | `status`: pointer OLD, activation, 3l, Console flags, unit flags match. Business file sha256 1e49bdf0 and `business-check.mjs` LOAD_OK for OLD now and for NEW after W0. `$DATA/console` 0700, `tester.sock` 0600, `bus.tester` `true`. |
|
||||
| W0 | operator | `scripts/stack-copy.sh copy $NEW`, as last window. |
|
||||
| P2 | operator, in Sage's gap | 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 <scratch>`. As at OLD, rehearse takes no `--migrate` (`stack-release.sh:138` accepts it for activate only, at NEW too): when the backup's schema differs from the copy's it migrates by itself. P3 must show `PASS new-refuses-old-store`, `PASS migrate` 3l to 3m, `PASS new-opens-migrated`, `PASS migrate-again`, `PASS old-refuses-migrated` (84f53540d's copy refusing the 3m store), `PASS no-session`, one pm reply and no `library:` line. Then `p3/counts.py` on B0 and on the rehearsal's `data/bus/bus.sqlite`: every 3l table equal, thread_shares present with 0 rows, and no sqlite_sequence change (3l-3m writes no row). Rehearse writes no sessions.json (`no-session`), so P3 doesn't exercise 269's v2 file; the rollback section covers it. |
|
||||
| P4 | operator | The tunnel read. |
|
||||
| P5 | operator | The service scripts held at NEW with empty porcelain. |
|
||||
| P6 | operator | The 7332 matrix (a)-(g) on OLD as `$WIN/matrix-old.txt`, plus the two tester-http reads over the socket, for W10. |
|
||||
|
||||
## The window
|
||||
|
||||
| # | Who | Step |
|
||||
|---|-----|------|
|
||||
| W0b | operator | The business file copy again, as last window. |
|
||||
| W1 | operator | Idle check (`agents --tester`, `launches list`), start stamp from `date -u`, S1 with the last window's snapshot.mjs at its approved sha, `--held`. pm r410293d04d3d, if still live, goes on record as crossing; stopping it is Mos's call. Then `d3.sh` again, so the rollback source holds sessions.json as it is just before W5. Its path and sha go in W.txt. |
|
||||
| W2 | operator | `status`: pointer OLD, `pm: true`, 3l, 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 (A4). Any other difference stops here. |
|
||||
| W4 | operator | The unit reads, as last window. W3 and W4 go to Mos for the W5 go. |
|
||||
| W5 | operator, on Mos's go | The same command without `--plan`. Exit 0, `result ok`, `stopped store schema: 3l`, `migrated the store to 3m`, every gate check passing. Record the activation id, backup path, STAMP and the backup's SHA256SUMS sha256. Then `rollback mosaic-stack --restore <W5 activation> --plan`, read only, for the guard count. |
|
||||
| W6 | operator, after Mos checks W5 | Mos's checks (sage-2967): `status` shows 3m; a read-only python3 count on the live store gives 24 table rows, 90 triggers and 5 views (see "Schema and backups"); `thread_shares` present with 0 rows; the bus answers `agents --tester`; `threads --tester` and `thread read --json --tester` on each existing thread read as at P6; `bus-host/sessions.json` reads sessionsVersion 2 once the host has written it, or still 1 if no session changed. |
|
||||
| W7 | Mos | Any Console restart (A5). I record the Console pid and `/proc/<pid>/cwd` before and after, and change nothing. |
|
||||
| W8 | operator | The A6 share check, see below. |
|
||||
| W9 | operator | The last window's W9 safety list: no `Sign-in:` line in the webui journal since the W5 stamp, the Console's cwd names NEW's copy, `tester.sock` 0600 in a 0700 `console/`, no `library:` line in the bus journal. No thread create and no talk: this window adds no test data. |
|
||||
| W10 | operator | The matrix again as `matrix-new.txt`, the same as `matrix-old.txt` apart from named lines; the two tester-http reads match P6; no listener on 7333; P4 again; a Console POST on 7332 with no session refused (mos-1195); `POST /api/processing` refused 403. |
|
||||
| W11 | operator | STATE in `$WIN/STATE.md`, a P19 comment, and a comment on #1704 (A9). |
|
||||
|
||||
### A6, the share check
|
||||
|
||||
All three share verbs refuse the tester (`tester-refused`; `thread-shares.test.mjs:268`), and NEW has no CLI
|
||||
verb for them. A share's writer is the business human, which is Jason's own principal, or a user with a
|
||||
collaborator grant, and live has no user grant and may not get one (no `mosaic access`). So a live share binds
|
||||
only to Jason's principal, and per A6 I skip it on live. The record cites thread-shares.test 16/0 on 9538e0fc8
|
||||
(`agents/launchpad/work/queue-206/BUILD.md:203`), with NEW's broker and test blobs equal to 9538e0fc8's. What
|
||||
runs on live is the tester side only: W6's `thread_shares` count of 0, and the tester thread reads matching P6,
|
||||
which shows 206's read path (`broker.mjs:5888`) hides nothing a tester saw before. A tester `thread.share`
|
||||
probe would need a hand-built socket request and writes an `action.refused` event, so I don't plan one; Mos
|
||||
can ask for it.
|
||||
|
||||
## Steps skipped, and why
|
||||
|
||||
- W12 (row 66's live check) isn't run: it's not in mos-1335's list, and it writes chief and pm turns.
|
||||
- No thread create or launch, so 269's per-session store isn't exercised on live. The last window's W9 thread
|
||||
was made on the 264a store with a non-legacy default session and ran, so `threads/<b>/<t>/session` exists for
|
||||
it. Under 269 a new launch of that thread refuses `legacy-store-unmapped` (`session.mjs:113`), which Q173
|
||||
accepted (sage-2718). Reads aren't affected.
|
||||
|
||||
## Stop conditions and rollback
|
||||
|
||||
- The first failure stops the step and goes to Mos. Any restore, or a second failure, ends the window
|
||||
(mos-1253 item 5). Before W5 there's nothing to undo. Keep every copy and prune nothing (A7).
|
||||
- After W5, a pointer flip alone can't roll back: 84f53540d's copy refuses a 3m store (P3's
|
||||
`old-refuses-migrated`). Rollback is restore-only: the store from W5's stopped-store backup, the data-root
|
||||
files from D3 (W1's), and a re-pin to 84f53540d (A7). 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.
|
||||
- 269 adds a second reason. NEW's host writes `bus-host/sessions.json` as sessionsVersion 2 on its first
|
||||
session change, and W5's start ends OLD's leftover sessions, so I expect v2 on disk right after W5. OLD's
|
||||
host reads the file at start and refuses anything but version 1 ("sessions file is malformed ... move the
|
||||
file aside", `launcher.mjs:235` with `session.mjs:241` at OLD). `rollback --restore` stops the units,
|
||||
restores the store, flips the pointer and starts OLD in one run, and stack-release.sh doesn't touch
|
||||
sessions.json. So a plain `rollback --restore` would fail at OLD's bus start. The rollback needs
|
||||
sessions.json put back from W1's D3 while the bus is stopped, before OLD starts. How the bus gets stopped for
|
||||
that is Mos's ruling at the time; I don't stop a unit by hand. 269's per-session stores and session
|
||||
workspaces are new directories OLD doesn't read, so they stay where they are.
|
||||
- Before any real restore I take an online copy of the 3m store by B0's method, so the rows the restore drops
|
||||
are kept. Its path and SHA256SUMS sha256 go to Mos with the request.
|
||||
@@ -0,0 +1,264 @@
|
||||
{
|
||||
"schema": "3l",
|
||||
"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": 2080,
|
||||
"maxSeq": 2080,
|
||||
"sha256": "4e81f58e60b1cfa9136d520209c80f3d556159675c1b50a296c1a2eba26c7c76"
|
||||
},
|
||||
"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": "207b2ec9fa84801ef8a85a29f06d52bc8c4606ab7fd43e95560874f87c173f02"
|
||||
},
|
||||
"projects": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "cdf87b72ef95a2f988c242d35f1050f9e3e310637f84a645b51694daa924650f"
|
||||
},
|
||||
"role_claims": {
|
||||
"rows": 112,
|
||||
"maxSeq": 112,
|
||||
"sha256": "522be47bb8d5828354e1145d85f4a9c2082ed1c0a1a8248f8b2c1586e0d353be"
|
||||
},
|
||||
"session_defaults": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "0fa4a532b106e963e200064d7f7464412a2fd6fce5a59a35ba7097d9bdca879c"
|
||||
},
|
||||
"sessions": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "7094392718785cbaec3d5e5bd640f4b36d1e2be1fb4b7c6a9db77308de111803"
|
||||
},
|
||||
"task_comment_cursors": {
|
||||
"rows": 575,
|
||||
"maxSeq": 575,
|
||||
"sha256": "a55bb9c581f8c7e59716ae9a5a5f075949a2854c2983117c2841b9e2e8e5055f"
|
||||
},
|
||||
"task_snapshots": {
|
||||
"rows": 541,
|
||||
"maxSeq": 541,
|
||||
"sha256": "14f66f2a5d422c46d1470944ad5bf97fbb437bb3f0a33dca0317bb58294660d1"
|
||||
},
|
||||
"thread_claims": {
|
||||
"rows": 10,
|
||||
"maxSeq": 10,
|
||||
"sha256": "925e82e219ca7d469a3d9d72bd7033b9f52a47f1da272ac7ae31832a24cd1b91"
|
||||
},
|
||||
"thread_opens": {
|
||||
"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,109 @@
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (row 206, #1704), schema 3l to 3m, STATE report (W11)
|
||||
|
||||
Operator and tester: Darkwing. Plan: `PLAN.md` in this directory, sha256
|
||||
e6d611fc15ec8b1509c7e54d3c83695a99c80d0730f496904f13679d84b9d92a (A1 and P0 passed by Mos, mos-1338). Tool blob
|
||||
5bb443c19ed8 (`scripts/stack-release.sh` at NEW); P5 found the four release scripts the same at HEAD and NEW. OLD
|
||||
84f53540dd0d21ef179ca29697e172b0246e78d1, NEW 0cbe2e9b35e51fe06dedde69c022b46e040f98c0, 81 commits past OLD. Every
|
||||
stamp below comes from `date -u` or from the transcript `W.txt` in this directory. dragon-lin only (A8).
|
||||
|
||||
Sage assigned the window (sage-2967) and gave the slot for prep and P3 (sage-2977), W1 to W4 (sage-2983) and W5 to
|
||||
W11 (sage-2986). Mos's gos and rulings: mos-1335 (A1 to A9), mos-1338 (A1 PASS and rulings 1 to 5), mos-1339 (P3
|
||||
PASS, the W1 to W4 go), mos-1340 (the W1 launch rule), mos-1341 (the W9 pm read), mos-1342 (the W5 go), mos-1343 (W5
|
||||
and W6 checked, the W9 and W10 go). Q173 covers every step.
|
||||
|
||||
## Outcome
|
||||
|
||||
NEW is live for mosaic-stack and the store is 3m. W5's activate stopped the units, backed up the stopped 3l store,
|
||||
migrated it to 3m in one step and started both units on NEW. Every check from P1 to W10 passed. Nothing was rolled
|
||||
back or restored, and nothing was pruned.
|
||||
|
||||
- The live 3m store has 24 table rows, 90 triggers, 5 views and 25 indexes. thread_shares, its index
|
||||
thread_shares_thread and its three append-only triggers exist, and thread_shares holds 0 rows.
|
||||
- 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 is now sessionsVersion 2, written by NEW's host at 20:16:24Z. OLD refuses v2, so a rollback
|
||||
restores it from W1's D3 with the bus stopped (mos-1338 ruling 2). No rollback happened.
|
||||
- The Console started at 20:16:22Z, after W5.start, with its cwd in NEW's copy, so nobody restarted it (W7 not run,
|
||||
mos-1338 item 4, mos-1343).
|
||||
- The crossing pm r410293d04d3d ended with W5's restart while not working, as in the last window (mos-1343). The
|
||||
new standing chief is r148e72c8895d.
|
||||
- pm read (mos-1341): refused, `pm isn't running, so the tester's message was refused and nothing was stored`, the
|
||||
same refusal as the last window's W9 (`window-repin-84f53540d/W.txt:1056`). The chief starts the pm on demand, and
|
||||
none was live after the restart. It wrote one action.refused event, seq 2085 (code tester-target-not-running), and
|
||||
no message. It isn't a migration fault. A pm launch on 3m is still unproven. Mos owned naming the read without
|
||||
checking the last window's result (mos-1344). The next re-pin plan (276, 203, 207) drops the tester pm read while
|
||||
no pm is live, and proposes how a pm launch on NEW gets proved, or why it can't be, for Mos to rule.
|
||||
|
||||
Mos passed the window at 20:19:28Z (mos-1344).
|
||||
|
||||
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. A6 (W8) was skipped with no tester probe, because all three share verbs
|
||||
refuse the tester and a refusal writes an event (mos-1338 ruling 3). W12 was skipped: no thread create and no talk
|
||||
other than the one pm read (mos-1338 ruling 5, mos-1341).
|
||||
|
||||
## Deviation
|
||||
|
||||
1. The first W5 launch at 20:15:36Z, after the pre-read passed, exited 126 with "Permission denied": `w5.sh` was mode
|
||||
644. The shell refused it before its first line ran, so there was no W5 file and the pointer stayed on OLD. I
|
||||
recorded it in `W.txt`, set `w5.sh` and `w6.sh` to 755 (sha256 unchanged, fbb5822b), and ran the pre-read and
|
||||
W5 again at 20:16:20Z. The first output is `w5-try1.out`. Mos accepted it (mos-1343).
|
||||
2. The first D3 run in prep stopped on tar exit 2 for unreadable paths under `discord/searxng` and
|
||||
`launches/*/*/tmp`. The second run excluded them; the failed `d3-20261022T195816Z` is kept (`d3-run1.txt`).
|
||||
3. `w10.sh`'s note "(P6: agents 1)" is stale text from the last window's script. This window's P6 read 2 agents
|
||||
(chief and pm, `tester-old.txt`). W10 read 1, the chief, since the pm ended at W5. The next window's copy fixes
|
||||
the text (mos-1344).
|
||||
|
||||
## Stamps and activation
|
||||
|
||||
| Step | Start (UTC) | Result |
|
||||
| --- | --- | --- |
|
||||
| D3 data-root snapshot (prep) | 19:59:31Z | `backups/d3-20261022T195931Z`, SHA256SUMS a19c2bc1, sessions.json v1 (`d3.txt`) |
|
||||
| Business file copy (prep, A2) | 19:58:52Z | `.pre-window-20261022T195852Z`, sha256 1e49bdf0 (`bz.txt`) |
|
||||
| B0 store backup | 20:06:42Z | `backups/b0-20261022T200642Z`, integrity ok, events 2079, maxSeq 2079, 3l, SHA256SUMS 365d35e1 |
|
||||
| P1, W0, P2, P4, P5, P6 | 20:07Z to 20:08Z | all PASS; W0 LOAD_OK; P2_STUBS_PASS, P2_UNITS_PASS (`p1.txt` to `p5.txt`, `matrix-old.txt`, `tester-old.txt`) |
|
||||
| P3 rehearsal (Mos) | 20:08:49Z to 20:08:53Z | rc 0, 22 PASS / 0 FAIL, all counts equal, 24/90/5 (`p3/`, mos-1339) |
|
||||
| W0b business file copy | 20:12:06Z | `.pre-window-20261022T201206Z`, sha256 1e49bdf0 |
|
||||
| W1 launches, agents, S1 | 20:12:07Z | chief re6c69f1ec1f0 standing, pm r410293d04d3d crossing, neither working; S1 75dad65c |
|
||||
| W1 tester thread reads | 20:12:08Z | 5 threads, 2 messages each (`tr.sh W1`) |
|
||||
| W1 D3 again | 20:12:10Z | `backups/d3-20261022T201210Z`, 90912 members, tar exit 0, sessions.json v1, SHA256SUMS 21997f99 |
|
||||
| W2 status | 20:12:29Z | pointer OLD, pm true, 3l, check pass, unit flags match |
|
||||
| W3 plan | 20:12:29Z | 3l to 3m, needs `--migrate` (given), 81 commits, Console line OLD's flags exactly (`W3-plan.txt` bbd65456) |
|
||||
| W4 unit read | 20:12:30Z | OLD units, DropInPaths empty, bus `--pm`, no quote or backslash |
|
||||
| W5 pre-read (mos-1342) | 20:16:20Z | chief and pm not working, no third launch |
|
||||
| W5 activate --pm --migrate --tester-socket | 20:16:21Z to 20:16:24Z | exit 0, stopped store 3l, migrated to 3m, gate passed, activate ok (`W5.txt`) |
|
||||
| W5 status, restore plan | 20:16:24Z | pointer NEW, pm true, 3m, check pass; restore plan reads back to 3l, no post-backup-events line |
|
||||
| W6 (Mos's checks) | 20:16:35Z to 20:16:40Z | W6_PASS (`w6.out`, `W6-counts.txt`) |
|
||||
| W9 checks, pm read | 20:18:28Z to 20:18:29Z | checks pass; pm read exit 3 (`w9.out`, `.w9-talk-pm.txt`) |
|
||||
| W10 | 20:18:39Z to 20:18:40Z | W10_PASS (`w10.out`, `matrix-new.txt`) |
|
||||
|
||||
Activation id 20261022T201621Z-0cbe2e9b35e5. Pointer log (`state/stack-activation-log.jsonl`): started at 20:16:21Z
|
||||
(backup null) and ok at 20:16:24Z (backup 20261022T201621Z-0cbe2e9b35e5), the same two-line pattern as the last
|
||||
window. W5's backup: `~/.mosaic-dev/backups/stack/20261022T201621Z-0cbe2e9b35e5`, STAMP 2026-10-22T20:16:21.766Z,
|
||||
SCHEMA 3l, SHA256SUMS sha256 a90767e2dab3be8b4605d88d7e645db3ab411ce37a2373843bf8fe3711f5944e. The bus journal since
|
||||
W5.start has one launch line, `launched chief: run r148e72c8895d`.
|
||||
|
||||
## W6 and W9 detail
|
||||
|
||||
- W6 store count, python3 -B with mode=ro: `table=24 trigger=90 view=5 index=25`, schema_version 3m, nothing missing
|
||||
of thread_shares, thread_shares_thread, thread_shares_no_update, thread_shares_no_delete and
|
||||
thread_shares_no_replace, thread_shares rows 0, events 2084, maxSeq 2084.
|
||||
- W9 Console: mosaic-webui active, MainPID 1791122, ExecMainStartTimestamp 20:16:22Z, cwd NEW's copy. Bus active,
|
||||
pid 1791120, 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, r148e72c8895d, not working; no pm launch.
|
||||
- W10: matrix-new.txt equals matrix-old.txt (lines a to g), no listener on 7333, the tester `/api/config` read
|
||||
identical to P6, `/api/bus/agents` 200 with 1 agent, 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)
|
||||
|
||||
W5's backup above (3l) for the store, W1's D3 `d3-20261022T201210Z` (SHA256SUMS 21997f99) for sessions.json v1 and
|
||||
the rest of the data root, B0 `b0-20261022T200642Z` and the business file copy `.pre-window-20261022T201206Z`.
|
||||
Rollback is the D3 restore plus a re-pin, and goes to Mos first (A7). Nothing is pruned.
|
||||
|
||||
## Scripts
|
||||
|
||||
`wsteps.sh` 2cbf863a, `w5pre.sh` 2de90db0, `w5.sh` fbb5822b, `w6.sh` 01030981, `w9.sh` 3a4aa72a, `w10.sh` 34b7f2a9,
|
||||
`tr.sh` c76a9585, `d3.sh` 1507d560, `b0.sh` 86ded6a4, `bz.sh` 7a5d2e1f. Thread read bodies stay in `.tr/` and are not
|
||||
committed.
|
||||
@@ -0,0 +1,816 @@
|
||||
# W0b-W4 start 2026-10-22T20:12:06Z
|
||||
# plan e6d611fc, tool blob 5bb443c19ed8, P5 four scripts at NEW and clean, business-check.mjs eece4d46: checked 2026-10-22T20:12:06Z
|
||||
# W0 copy present, w0.txt LOAD_OK
|
||||
# W0b: /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261022T201206Z, sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93, recorded in backups.txt
|
||||
|
||||
## W1 agents --tester
|
||||
# start 2026-10-22T20:12:06.731Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic agents --business mosaic-stack --tester)
|
||||
chief re6c69f1ec1f0 claude-code since 2026-10-22T15:05:59.297Z
|
||||
pm r410293d04d3d claude-code since 2026-10-22T15:24:01.221Z
|
||||
# exit 0, end 2026-10-22T20:12:06.951Z
|
||||
|
||||
## W1 launches list
|
||||
# start 2026-10-22T20:12:06.954Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic launches list)
|
||||
re6c69f1ec1f0 mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T15:05:59.295Z running
|
||||
r410293d04d3d mosaic-stack/pm claude-code claude-opus-5-5 by chief since 2026-10-22T15:24:01.208Z running
|
||||
# exit 0, end 2026-10-22T20:12:07.061Z
|
||||
# W1 launches: chief re6c69f1ec1f0 standing (OLD's activation), pm r410293d04d3d live and recorded as crossing (mos-1338, mos-1340)
|
||||
# W1 start stamp 2026-10-22T20:12:07Z
|
||||
# SNAP sha256 639fd28a checked before S1
|
||||
|
||||
## S1 snapshot --held
|
||||
# start 2026-10-22T20:12:07.068Z
|
||||
# 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": "3l",
|
||||
"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": 2080,
|
||||
"maxSeq": 2080,
|
||||
"sha256": "4e81f58e60b1cfa9136d520209c80f3d556159675c1b50a296c1a2eba26c7c76"
|
||||
},
|
||||
"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": "207b2ec9fa84801ef8a85a29f06d52bc8c4606ab7fd43e95560874f87c173f02"
|
||||
},
|
||||
"projects": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "cdf87b72ef95a2f988c242d35f1050f9e3e310637f84a645b51694daa924650f"
|
||||
},
|
||||
"role_claims": {
|
||||
"rows": 112,
|
||||
"maxSeq": 112,
|
||||
"sha256": "522be47bb8d5828354e1145d85f4a9c2082ed1c0a1a8248f8b2c1586e0d353be"
|
||||
},
|
||||
"session_defaults": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "0fa4a532b106e963e200064d7f7464412a2fd6fce5a59a35ba7097d9bdca879c"
|
||||
},
|
||||
"sessions": {
|
||||
"rows": 5,
|
||||
"maxSeq": 5,
|
||||
"sha256": "7094392718785cbaec3d5e5bd640f4b36d1e2be1fb4b7c6a9db77308de111803"
|
||||
},
|
||||
"task_comment_cursors": {
|
||||
"rows": 575,
|
||||
"maxSeq": 575,
|
||||
"sha256": "a55bb9c581f8c7e59716ae9a5a5f075949a2854c2983117c2841b9e2e8e5055f"
|
||||
},
|
||||
"task_snapshots": {
|
||||
"rows": 541,
|
||||
"maxSeq": 541,
|
||||
"sha256": "14f66f2a5d422c46d1470944ad5bf97fbb437bb3f0a33dca0317bb58294660d1"
|
||||
},
|
||||
"thread_claims": {
|
||||
"rows": 10,
|
||||
"maxSeq": 10,
|
||||
"sha256": "925e82e219ca7d469a3d9d72bd7033b9f52a47f1da272ac7ae31832a24cd1b91"
|
||||
},
|
||||
"thread_opens": {
|
||||
"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-22T20:12:07.121Z
|
||||
# S1.json sha256 75dad65ccfd787c36b07c0815f9bc844ab111892ffafe3dcf8a715c26ff10abd
|
||||
|
||||
## 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-20261022T201210Z, STAMP 2026-10-22T20:12:10.946Z, SHA256SUMS sha256 21997f99f1f9d83da06988a208978b456b05a469932e7d0e148e29bfc9936010, members 90912 tar exit 0 sessions.json sessionsVersion 1
|
||||
|
||||
## W2 status
|
||||
# start 2026-10-22T20:12:29.991Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh status mosaic-stack)
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"84f53540dd0d21ef179ca29697e172b0246e78d1","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":"3l","activation":"20261022T150555Z-84f53540dd0d","at":"2026-10-22T15:06:00Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-21T21:59:31Z","op":"activate","from":"4429a104f6d65ccf165f6c83b5d1dce3147dfde0","to":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","backup":"20261021T215926Z-7247d80c7af7","activation":"20261021T215926Z-7247d80c7af7","result":"ok"}
|
||||
{"at":"2026-10-22T04:02:56Z","op":"activate","from":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","to":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","backup":null,"activation":"20261022T040256Z-86f95bb27f6c","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"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"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3634254, running, since 2026-10-22T15:05:57.441Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3634311
|
||||
boot: organization file loaded at 2026-10-22T15:05:57.439Z
|
||||
unit flags: match the pointer
|
||||
drift: 81 commit(s) on refactor since the pointer's copy
|
||||
# exit 0, end 2026-10-22T20:12:30.261Z
|
||||
|
||||
## W3 activate NEW --pm --migrate --tester-socket --plan
|
||||
# start 2026-10-22T20:12:30.263Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh activate 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 mosaic-stack --pm --migrate --tester-socket --plan)
|
||||
plan: activate for mosaic-stack
|
||||
from: 84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
to: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
store schema: 3l (read from the store the running bus holds)
|
||||
target schema: 3m
|
||||
migration: 3l to 3m, after a backup of the stopped store
|
||||
migration steps: 3l to 3m
|
||||
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 81 (newest first, at most 200):
|
||||
0cbe2e9b3 row 206 (#1704): BUILD.md Runs, gate GREEN on 9538e0fc8 (bus 850, cli 869, shell suites, M2-M9 and Q2 killed)
|
||||
9538e0fc8 row 206 (#1704): thread-shares trail test threads the reply into A's default session, not the thread id (first-run red, mos-1272)
|
||||
1a228f395 row 206 r4 (#1704): BUILD.md records the slot rebase onto 17f415792 (269, 282 landed) and the drift sweep
|
||||
829562260 row 206 (#1704): BUILD.md records duckworth-0179/0180, C3 met on the pushed tip 670658dd1
|
||||
ac0e4dc9b row 206 r3 (#1704): BUILD.md records the C3 rebase onto 275 at 3410df7c3 on 253's 48e450ce8, and the sweep
|
||||
c49fdb269 row 206 (#1704): BUILD.md records duckworth-0175 (round 2 meets C1/C2, APPROVE carries) and C3
|
||||
cfb86f1bd row 206 r2 (#1704): rebased on 275 r3 957a9bfe0; share verbs need collaborator, viewer reads a share (duckworth-0169 C1, C2)
|
||||
178eefd5c row 206 (#1704): BUILD.md records Duckworth's manifest APPROVE (duckworth-0169), C1/C2 for the 275 round, N1-N4
|
||||
8a29f9477 row 206 (193b2, #1704): sage-2818 rulings, only a human principal matches a share
|
||||
d78a9cc83 row 206 (193b2, #1704): thread shares, schema 3l→3m
|
||||
17f415792 queue: revs 3217-3316. Q226 gap (rows 216-229, 265-267 re-pins; 217 unblocked; 223 blocked; rows 282-290 added), rows 253, 275, 269 and 282 reviews, notes and done moves, row 291 (PRD 1.16, #1796) added, claims and in-review moves for 173, 207, 211, 214, 224, 239, 252, 258, 276 (sage, darkwing, della, dewey, gander, herb, honker, megavolt, scrooge, ludwig, gizmoduck, gosalyn, webby, duckworth, morgana); review requests posted as jarvis by Sage
|
||||
647424442 gosalyn: PRD 1.15 round 2 for Webby webby-0158 B1: requireCitation makes every reply carry a citation except the runner's four fixed notices, as the design keeps them passing, and the REQ-LIB-1 rewrap joins organization file to its sentence (N1)
|
||||
71fed6281 gosalyn: PRD 1.15 rewrites REQ-LIB-6 to Q223 and Q226 (mos-1320 item 8): agents never write story and write .md files only in supporting folders a human marks, each as a commit by their own Gitea account with a notice she can revert, chat is free text, any citation is checked, and requireCitation is a human-only setting off by default. REQ-LIB-1 and REQ-LIB-2 gain supporting folders and the canon-cite rule. The 1.12 note's residual becomes the supporting-doc residual, and the 1.15 note records the old texts and lists REQ-LIB-3, 4, 5 and 7 as unchanged. requirements.json version 1.15 with three titles changed, and the test's version pin. The id count stays 85
|
||||
86a665bdf docs: PRD 1.16 brief, library.write routes under REQ-LIB-6 (#1796, mos-1328)
|
||||
efcc9ea8d row 269 (264b, #1774): BUILD.md M11 kill line is the survivor log assertion at session-launch.test.mjs:309, not the outcome assertion (mutant run 17:49Z, duckworth-0181)
|
||||
f39508c24 row 269 (264b, #1774): the M6 halt test halts after mayLaunch answers
|
||||
d20ef317f row 269 (264b, #1774): BUILD.md names the sessioned-survivor residual in Q2 and records N1's mos-1292 allowance (duckworth-0159 N3, N4)
|
||||
6e50bd630 row 269 (264b, #1774): BUILD.md Q2 notes that a survivor's released claim doesn't prove its run has exited, and the per-leftover 5 s wait (duckworth-0158 N1, N2)
|
||||
6c80b1290 row 269 (264b, #1774): BUILD.md answers sage-2750 on the recover() change; the survivor log names its pids
|
||||
42fd3edd4 row 269 (264b, #1774): legacy-run-live gets its test (duckworth-0156)
|
||||
dc5836c7d row 269 (264b, #1774): refusedOnce in sessions.test.mjs pins actor_run, closing Duckworth N1 (DEFERRED.md:474-480)
|
||||
2133c5a0c row 269 (264b, #1774): per-session store, workspace and single-writer lock
|
||||
194dec83d row 269 (264b, #1774): BUILD.md lists thread-launch.test.mjs:182 as a second old assertion that changes. A thread.create thread's default session isn't legacy-3l, so its store takes D2's layout (t1-sessions.md:100, :294). Proposed as an exact path update, for Mos through Sage
|
||||
84b32e390 row 269 (264b, #1774): BUILD.md drops the planned bindLaunch session-running refusal. Two old tests bind a second unended run to one session and expect the claim refusal (threads.test.mjs:88-89, sessions.test.mjs:119-120), so the broker half of the fence is the existing per-session claim, thread-already-held (broker.mjs:4815)
|
||||
9d241fdcc row 269 (264b, #1774): design notes for Duckworth's early look (duckworth-0150). C1 adds the Console and R-guard sessions.json readers, the 264a refusals a v2 file causes, the /proc live check and the Console restart; C2 pins M6 to a generation change after check() with all eight start() admission calls named; C3 gives the realpath compare its own code and a symlinked workspaces root as M4's input; C4 lists the old threadsState assertions, end-launch.test:193 the only change, under mos-1285
|
||||
76a6524cf row 269 (264b, #1774): design notes for sage-2717. Rollback names the four steps past the 264a exit-3 refusal and the re-pin plan section that carries them; new M8 binds a non-default session at the legacy path, old M8 becomes M9; Duckworth's legacy-bind check
|
||||
693f7e745 row 269 (264b, #1774): design notes. D9 audit of every sessions.json reader at 84f53540d and of threadsState's consumers; sessions.json goes to v2 because recover() rebinds without session; pi 0.85.1 resumes by cwd, so the legacy session keeps its in-sandbox path; mutants M1-M8 and run limits (sage-2707)
|
||||
94c33a43c docs: row 275 landing line; Researcher session line
|
||||
a870fd85b docs: seat log lines for rows 281, 224, 219, 214, 211 and 258, the row 253 landing line, Sage's SESSIONS line, and DEFERRED for the 224 residual and the 206 sharee list
|
||||
5b1f1dc88 docs: DEFERRED gains row 253 N1 (Vikunja 532, mos-1297), row 198 N2 (/api/seen 400, sage-2867) and the stale row 203 text in access.mjs (Quackerjack)
|
||||
8c638b6f6 agents: register Della, Scrooge, Huey, Louie and Ludwig as seats so the queue can name them as row owners (Q220, mos-1301)
|
||||
a700992cd docs: 193b2 brief, the live --migrate window needs Mos's go under Q173, not Jason (mos-1310 item 4)
|
||||
d30f35e29 docs: SESSIONS line for Gizmoduck, rows 264a and 268 after-landing docs and the row 269 plan
|
||||
e5b7d1d08 row 268 (#1773): BUILD.md Runs records the r2 gate on ecd9b35eb and the r3 and r4 carry reruns with every count and skip; doc only (sage-2455)
|
||||
836b2f25c docs: preserve email hard-wait approval and tune parser limits
|
||||
73516da85 docs: apply Q217 and Q222 to email source settings
|
||||
95e3f7166 docs: address Q195 editor design review findings
|
||||
cde0cd083 docs: Q195 writing editor design and Q196 options
|
||||
100f018af gosalyn: row 229 design round 2 for Webby webby-0148: the settings.json allowlist is three keys a fresh /login writes, written in Mosaic code with httpProxy and the path and command keys refused by name and a sha256 bump test on pi's setter names, models-store.json and keybindings.json now refuse, auth.json.lock is the only allowed dir, pi-login runs --offline and --no-session in an empty temporary cwd with a 229b allowlist test, the contents check runs before preflight, and creativeHumanOnly covers the fallback (R1, R2, N1-N5)
|
||||
4a8215e3a gosalyn: row 229 design draft 1 after mos-1306: Chet's route has no fallback by default with a human-only fallback still possible through routes, and the dates note records that the live check gates every build row, not the design
|
||||
669e68036 gosalyn: row 229 design draft 1, a per-instance pi agent dir for Chet's Codex login: the host-made 0700 store per instance, a same-path rw bind with PI_CODING_AGENT_DIR through the pi module env, a contents allowlist since pi reads models.json and settings.json there, a refusal for roles with bash, a no-refresh auth check preflight, no fallback for Chet, a fresh-grant mosaic pi-login, the live check that gates the build, and rows 229a and 229b (#428, #1730)
|
||||
c06ccc9ba gosalyn: Case 2 C2-03b round 3 for Webby webby-0156 R4: the fetch fallback reads the append-only events table for any GRANT_EVIDENCE event with method gitea and agent the chief, never gitea_grants, whose row a revoke and a grant-lost delete. It names no project, since grant.applied and grant.revoked carry none, so a chief grant on any project ends the fallback and fails safe. The revoked and fired tests go through grants.revoke and instance.fire and assert the row is gone before the fetch
|
||||
136e5c1ca gosalyn: Case 2 Q226 row briefs with Webby's round webby-0151, Mos's mos-1320 and Sage's sage-2833 folded in. C2-06 rewritten and taking in C2-07: an unreadable business file resolves requireCitation to true (R2), a send over 64 KiB gets the one retry and then a fourth fixed text (R1). C2-03b falls back to slot library-gitea only while no chief grant record has ever existed and refuses library-fetch-no-grant after (R3), with library-human-missing for her save and revert. C2-02 after C2-05c, revert and save by her editor (N1). C2-21 cites mos-1320 item 2 and keeps the host-creative-role refusals, and records two Gitea facts that don't gate it (N4, item 5). C2-08b names what the chief's credential needs (N5). C2-05b restored to the brief row 224 built, which lands as built, and new row C2-05c carries the supporting scope and blob. A PRD row brief for REQ-LIB-6 (mos-1320 item 8). New briefs C2-01d, 05c, 08b, 03b, 21, 02, 11b and 12b
|
||||
cf17ab387 gosalyn: C2-06 brief Q222 round 2 for Webby webby-0144: M11 compares against the on-disk human and replyLimits on document and written and refuses agent actor shapes, an unreadable business file checks at the defaults, keys read by Object.hasOwn and Number.isInteger, the verb refuses unknown keys, the new tests, the residual line, cites at aca16404c, and the hold moves to Q30 (mos-1305, design f164dcef8)
|
||||
09948da18 gosalyn: C2-06 brief makes every M5 limit a replyLimits setting with Q219's numbers as defaults, the human's library.limits.set and mosaic limits replies, the M11 writer check, read at check time with per-key fallback to the default, the setup sheet's settings line, the settings and M11 tests, After C2-04, and the build held for Q29 (Q222, mos-1302, design df29550c9)
|
||||
35615b01b gosalyn: C2-06 brief cites the setup sheet's reply limits paragraph at :115-118 (webby-0140 N4)
|
||||
3f1f4e44f gosalyn: C2-06 brief owns the setup sheet's reply limits paragraph, which says 3 ideas of up to 120 characters and drops the lower-limits offer, and the tests paragraph is rewrapped (webby-0139 N1, N2, Q219)
|
||||
65b8c8a9b gosalyn: C2-06 brief takes Jason's idea caps, 3 items of 120 characters per reply, tested one past each boundary, and the idea-text residual line reads 360 characters closed in Q219 (mos-1299, design 2852348d2)
|
||||
271cef205 gosalyn: Case 2 design round 3 for Webby webby-0156 R4: the fetch fallback reads GRANT_EVIDENCE events with method gitea and agent the chief in the append-only events table, never gitea_grants, and names no project, so it survives a revoke, a grant-lost and a fire and fails safe. The ruling paragraph, 7.2 and section 10 steps 4 and 4b say so, cited at aca16404c
|
||||
3e5db651b gosalyn: Case 2 design ruling after r11, agents never write story (Q223, Q226, mos-1309), with Webby's round webby-0151 and Mos's mos-1320 folded in. Supporting prefix lists agents may write .md files under through library.doc.write and library.doc.delete, fenced by M12 supportingPath, plumbing commits pushed fast-forward only with a Mosaic-Agent trailer, a notice and a human revert authored by her editor on slot library-human. Chat is free text with optional citations, replyLimits keys requireCitation and citationsPerReply, and an unreadable business file resolves requireCitation to true (R2). A send over 64 KiB gets the one retry and then a fixed text (R1). The fetch falls back to slot library-gitea only while no chief grant record has ever existed, and Jason deletes the slot once status shows the chief's grant (R3). A missing editor or slot refuses before any git call (N1), runner and tools cites fixed at aca16404c (N2, N3), two record-only Gitea facts at C2-21 (N4, mos-1320 item 5), mos-1163 narrowed to gitea library projects (mos-1320 item 2), M3 at eight or ten (mos-1320 item 4). C2-05b is row 224 as built and C2-05c carries the supporting scope and blob (sage-2833). New rows C2-01d, C2-05c, C2-08b, C2-12b and C2-21
|
||||
e1c9c0993 gosalyn: Case 2 Q222 round 2 for Webby webby-0144: the M11 fence compares against the on-disk human and refuses agent actor shapes, checks document and written as M9 does, a failed business file read checks at the defaults and never skips, the fallback reads keys by Object.hasOwn and Number.isInteger with booleans, arrays and objects named, the verb refuses unknown keys, the ceilings residual line, and cites at aca16404c (R1-R3, N1-N3, N5, N6)
|
||||
aaaf45576 gosalyn: Case 2 design ruling after r11, reply limits are settings: every M5 limit is a replyLimits key in the business file with Q219's numbers as defaults, changed only by the human's library.limits.set and fenced in organizationWriter.write as M11, read at check time, with a missing or invalid value using its default. C2-06 carries it and waits on Q29 (Q222, mos-1302)
|
||||
cf6abca9c gosalyn: Case 2 design ruling after r11, idea items capped at 3 of 120 characters: M5, the B5 note, the 5.1 residual (now 360 characters per reply) and 10 step 8 closed by Jason; the rest of M5 unchanged, C2-06 builds and tests the new boundaries (Q219, mos-1299, Vikunja 465, ludwig-0014 Q4)
|
||||
3410df7c3 morgana: row 275 r3 (duckworth-0166): B1 bob asks create only, open and send on alice's own thread; N1 thread B holds a message and the viewer read asserts its id
|
||||
1e3db5343 morgana: row 275 r2 (mos-1311): downgraded viewer keeps send and open refusals with nothing stored in the R3 test; BUILD.md lists each changed assertion, old and new, with design 4.3 lines
|
||||
4dd85c671 morgana: row 275 (193b1b, #1780): viewer verbs and board refusals. VIEWER_VERBS at any grant level, collaborator for thread.create/open/send per verb, BOARD_VERBS exported and refused to users, user-side governance pin, mutants 6 and 10; FED R3 viewer-refused assertions reversed per design 4.3
|
||||
48e450ce8 docs(row253): pin mos1298 session assertion candidate
|
||||
14e460061 test(row253): assert direct query PID equals SID (mos-1298)
|
||||
a6c71e6d9 docs(row253): preserve fresh gate stop at M38 survivor
|
||||
e1bc766d8 docs(row253): pin mos1297 fixture repair for review
|
||||
362ec674c test(row253): expose peer failures and pin reasons (mos-1297)
|
||||
f5ef1c33a docs(row253): preserve single P10 diagnostic and reason mismatches
|
||||
2bef9124c docs(row253): preserve M21 survivor stop and static call trace
|
||||
34401e7c9 docs(row253): record green 27-file run and measured timeout basis
|
||||
0604d91fc docs(row253): pin final aca1 integration and focused file bounds
|
||||
ed3bb376c docs(row253): preserve doc sweep appends on corrected interim base
|
||||
cd269e733 docs(row253): record schema3l integration before final base correction
|
||||
e75ef1b19 docs(row253): integrate 385a base and record dependency drift and bounds
|
||||
72b17562d docs(row253): integrate row191 base and refresh manifest
|
||||
ad67d9595 docs(row253): record integration onto refactor 378a76b85
|
||||
3b142c9c6 docs(row253): record static approval and pre-confirmation residual
|
||||
950cf47f3 fix(row253): bound cleanup retries after initial inventory
|
||||
cca936716 fix(row253): supervise socket queries across sudo sessions
|
||||
c8cca3a68 docs(row253): store repair patch without context whitespace
|
||||
62de84882 docs(row253): freeze C4 repair for static review
|
||||
6f320b4b0 docs: propose row253 C4 session supervisor and draft hop fake
|
||||
643d16528 test: prepare row253 socket fixtures and fix gate collisions
|
||||
730a78aa9 gander: design tester socket migration for host scripts
|
||||
aca16404c queue: revs 3195-3216. Rows 278, 281 and 264a reviews, notes and done moves (sage, gizmoduck, megavolt, gander, webby, dewey, duckworth); row 264 round 1 request posted as jarvis (sage-2693, #1769)
|
||||
f7e4ec3df row 264a (#1769): BUILD.md records the r13 gate on 2cc34aef8 (phases 1-3 green, M2 thrown at the trigger) and the r13p4 rerun at 84f53540d (M1-M4 killed on assertions, M2's four edits and kill rule), and the limits row gets the measured probe time; doc only (mos-1280 item 1, sage-2701)
|
||||
b78918850 docs: row 264a landing sweep. BUILD-LOG gets Rocko's V502 rerun line and Sage's V502, rows 278/281 and row 264a landing lines; SESSIONS gets Dewey's, Rocko's and Sage's lines; DEFERRED moves the fire-keeps-grants gap to Done (row 281) and opens row 281 N1/N2 and row 264a N1 (actor_run, binds row 269) and N2 (esbuild skip) (sage-2695, #1769)
|
||||
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-22T20:12:30.516Z
|
||||
# W3-plan.txt sha256 bbd65456ad0d47c626bf095f2ecaf644411768bc693357c13bbcf4111a977eed
|
||||
# W3 commit list lines left out of the flag checks: 81
|
||||
# W3 plan checks: OLD to NEW, 3l to 3m in one step, 81 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-22T20:12:30.533Z
|
||||
# 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/84f53540dd0d21ef179ca29697e172b0246e78d1/scripts/mosaic ; argv[]=/home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1/scripts/mosaic bus start mosaic-stack --pm ; ignore_errors=no ; start_time=[Thu 2026-10-22 10:05:57 CDT] ; stop_time=[n/a] ; pid=3634254 ; code=(null) ; status=0/0 }
|
||||
WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
# exit 0, end 2026-10-22T20:12:30.539Z
|
||||
|
||||
## W4 webui unit
|
||||
# start 2026-10-22T20:12:30.541Z
|
||||
# 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/84f53540dd0d21ef179ca29697e172b0246e78d1/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=[Thu 2026-10-22 10:05:57 CDT] ; stop_time=[n/a] ; pid=3634256 ; code=(null) ; status=0/0 }
|
||||
WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
# exit 0, end 2026-10-22T20:12:30.547Z
|
||||
# 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-22T20:12:30Z
|
||||
# W5 pre-read (mos-1342 condition 1) start 2026-10-22T20:15:36Z
|
||||
|
||||
## W5 pre agents --tester
|
||||
# start 2026-10-22T20:15:36.607Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic agents --business mosaic-stack --tester)
|
||||
chief re6c69f1ec1f0 claude-code since 2026-10-22T15:05:59.297Z
|
||||
pm r410293d04d3d claude-code since 2026-10-22T15:24:01.221Z
|
||||
# exit 0, end 2026-10-22T20:15:36.847Z
|
||||
|
||||
## W5 pre launches list
|
||||
# start 2026-10-22T20:15:36.850Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic launches list)
|
||||
re6c69f1ec1f0 mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T15:05:59.295Z running
|
||||
r410293d04d3d mosaic-stack/pm claude-code claude-opus-5-5 by chief since 2026-10-22T15:24:01.208Z running
|
||||
# exit 0, end 2026-10-22T20:15:36.963Z
|
||||
# W5 pre-read PASS 2026-10-22T20:15:36Z: chief re6c69f1ec1f0 standing, not working; pm r410293d04d3d live, crossing, not working; no third launch
|
||||
# W5 first launch 2026-10-22T20:16:16Z: ./w5.sh exit 126, Permission denied (mode 644); w5.sh never started, no W5 file, pointer still OLD. chmod 755 w5.sh w6.sh (sha256 unchanged: fbb5822b6eaf91f7), pre-read and W5 run again
|
||||
# W5 pre-read (mos-1342 condition 1) start 2026-10-22T20:16:20Z
|
||||
|
||||
## W5 pre agents --tester
|
||||
# start 2026-10-22T20:16:20.864Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic agents --business mosaic-stack --tester)
|
||||
chief re6c69f1ec1f0 claude-code since 2026-10-22T15:05:59.297Z
|
||||
pm r410293d04d3d claude-code since 2026-10-22T15:24:01.221Z
|
||||
# exit 0, end 2026-10-22T20:16:21.079Z
|
||||
|
||||
## W5 pre launches list
|
||||
# start 2026-10-22T20:16:21.082Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic launches list)
|
||||
re6c69f1ec1f0 mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T15:05:59.295Z running
|
||||
r410293d04d3d mosaic-stack/pm claude-code claude-opus-5-5 by chief since 2026-10-22T15:24:01.208Z running
|
||||
# exit 0, end 2026-10-22T20:16:21.197Z
|
||||
# W5 pre-read PASS 2026-10-22T20:16:21Z: chief re6c69f1ec1f0 standing, not working; pm r410293d04d3d live, crossing, not working; no third launch
|
||||
# W5 go mos-1342, start 2026-10-22T20:16:21Z
|
||||
# condition 3 recheck: tool blob 5bb443c19ed8, plan e6d611fc, four scripts clean, pointer on OLD, P2 stubs and units PASS
|
||||
# W5 exit 0, W5.start 2026-10-22T20:16:21Z, end 2026-10-22T20:16:24Z
|
||||
# W5: activation 20261022T201621Z-0cbe2e9b35e5, backup /home/jwoltje/.mosaic-dev/backups/stack/20261022T201621Z-0cbe2e9b35e5, STAMP 2026-10-22T20:16:21.766Z, SCHEMA 3l, SHA256SUMS sha256 a90767e2dab3be8b4605d88d7e645db3ab411ce37a2373843bf8fe3711f5944e (sums check OK)
|
||||
# W5 launched lines in the bus journal since W5.start: 1: launched chief: run r148e72c8895d, claude-code claude-opus-5-5
|
||||
|
||||
## W5 status
|
||||
# start 2026-10-22T20:16:24.509Z
|
||||
# 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: 1 commit(s) on refactor since the pointer's copy
|
||||
# exit 0, end 2026-10-22T20:16:24.783Z
|
||||
# W5 status: pointer NEW, pm true, 3m, check pass, unit flags match. W5_PASS 2026-10-22T20:16:24Z
|
||||
|
||||
## W5 rollback --restore 20261022T201621Z-0cbe2e9b35e5 --plan (read only)
|
||||
# start 2026-10-22T20:16:24.789Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh rollback mosaic-stack --restore 20261022T201621Z-0cbe2e9b35e5 --plan)
|
||||
plan: rollback for mosaic-stack
|
||||
from: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
to: 84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
store schema: 3m (read from the store the running bus holds)
|
||||
target schema: 3l
|
||||
restore: the store must go back to 3l; needs --restore 20261022T201621Z-0cbe2e9b35e5
|
||||
commits: the run takes away 81 (newest first, at most 200):
|
||||
0cbe2e9b3 row 206 (#1704): BUILD.md Runs, gate GREEN on 9538e0fc8 (bus 850, cli 869, shell suites, M2-M9 and Q2 killed)
|
||||
9538e0fc8 row 206 (#1704): thread-shares trail test threads the reply into A's default session, not the thread id (first-run red, mos-1272)
|
||||
1a228f395 row 206 r4 (#1704): BUILD.md records the slot rebase onto 17f415792 (269, 282 landed) and the drift sweep
|
||||
829562260 row 206 (#1704): BUILD.md records duckworth-0179/0180, C3 met on the pushed tip 670658dd1
|
||||
ac0e4dc9b row 206 r3 (#1704): BUILD.md records the C3 rebase onto 275 at 3410df7c3 on 253's 48e450ce8, and the sweep
|
||||
c49fdb269 row 206 (#1704): BUILD.md records duckworth-0175 (round 2 meets C1/C2, APPROVE carries) and C3
|
||||
cfb86f1bd row 206 r2 (#1704): rebased on 275 r3 957a9bfe0; share verbs need collaborator, viewer reads a share (duckworth-0169 C1, C2)
|
||||
178eefd5c row 206 (#1704): BUILD.md records Duckworth's manifest APPROVE (duckworth-0169), C1/C2 for the 275 round, N1-N4
|
||||
8a29f9477 row 206 (193b2, #1704): sage-2818 rulings, only a human principal matches a share
|
||||
d78a9cc83 row 206 (193b2, #1704): thread shares, schema 3l→3m
|
||||
17f415792 queue: revs 3217-3316. Q226 gap (rows 216-229, 265-267 re-pins; 217 unblocked; 223 blocked; rows 282-290 added), rows 253, 275, 269 and 282 reviews, notes and done moves, row 291 (PRD 1.16, #1796) added, claims and in-review moves for 173, 207, 211, 214, 224, 239, 252, 258, 276 (sage, darkwing, della, dewey, gander, herb, honker, megavolt, scrooge, ludwig, gizmoduck, gosalyn, webby, duckworth, morgana); review requests posted as jarvis by Sage
|
||||
647424442 gosalyn: PRD 1.15 round 2 for Webby webby-0158 B1: requireCitation makes every reply carry a citation except the runner's four fixed notices, as the design keeps them passing, and the REQ-LIB-1 rewrap joins organization file to its sentence (N1)
|
||||
71fed6281 gosalyn: PRD 1.15 rewrites REQ-LIB-6 to Q223 and Q226 (mos-1320 item 8): agents never write story and write .md files only in supporting folders a human marks, each as a commit by their own Gitea account with a notice she can revert, chat is free text, any citation is checked, and requireCitation is a human-only setting off by default. REQ-LIB-1 and REQ-LIB-2 gain supporting folders and the canon-cite rule. The 1.12 note's residual becomes the supporting-doc residual, and the 1.15 note records the old texts and lists REQ-LIB-3, 4, 5 and 7 as unchanged. requirements.json version 1.15 with three titles changed, and the test's version pin. The id count stays 85
|
||||
86a665bdf docs: PRD 1.16 brief, library.write routes under REQ-LIB-6 (#1796, mos-1328)
|
||||
efcc9ea8d row 269 (264b, #1774): BUILD.md M11 kill line is the survivor log assertion at session-launch.test.mjs:309, not the outcome assertion (mutant run 17:49Z, duckworth-0181)
|
||||
f39508c24 row 269 (264b, #1774): the M6 halt test halts after mayLaunch answers
|
||||
d20ef317f row 269 (264b, #1774): BUILD.md names the sessioned-survivor residual in Q2 and records N1's mos-1292 allowance (duckworth-0159 N3, N4)
|
||||
6e50bd630 row 269 (264b, #1774): BUILD.md Q2 notes that a survivor's released claim doesn't prove its run has exited, and the per-leftover 5 s wait (duckworth-0158 N1, N2)
|
||||
6c80b1290 row 269 (264b, #1774): BUILD.md answers sage-2750 on the recover() change; the survivor log names its pids
|
||||
42fd3edd4 row 269 (264b, #1774): legacy-run-live gets its test (duckworth-0156)
|
||||
dc5836c7d row 269 (264b, #1774): refusedOnce in sessions.test.mjs pins actor_run, closing Duckworth N1 (DEFERRED.md:474-480)
|
||||
2133c5a0c row 269 (264b, #1774): per-session store, workspace and single-writer lock
|
||||
194dec83d row 269 (264b, #1774): BUILD.md lists thread-launch.test.mjs:182 as a second old assertion that changes. A thread.create thread's default session isn't legacy-3l, so its store takes D2's layout (t1-sessions.md:100, :294). Proposed as an exact path update, for Mos through Sage
|
||||
84b32e390 row 269 (264b, #1774): BUILD.md drops the planned bindLaunch session-running refusal. Two old tests bind a second unended run to one session and expect the claim refusal (threads.test.mjs:88-89, sessions.test.mjs:119-120), so the broker half of the fence is the existing per-session claim, thread-already-held (broker.mjs:4815)
|
||||
9d241fdcc row 269 (264b, #1774): design notes for Duckworth's early look (duckworth-0150). C1 adds the Console and R-guard sessions.json readers, the 264a refusals a v2 file causes, the /proc live check and the Console restart; C2 pins M6 to a generation change after check() with all eight start() admission calls named; C3 gives the realpath compare its own code and a symlinked workspaces root as M4's input; C4 lists the old threadsState assertions, end-launch.test:193 the only change, under mos-1285
|
||||
76a6524cf row 269 (264b, #1774): design notes for sage-2717. Rollback names the four steps past the 264a exit-3 refusal and the re-pin plan section that carries them; new M8 binds a non-default session at the legacy path, old M8 becomes M9; Duckworth's legacy-bind check
|
||||
693f7e745 row 269 (264b, #1774): design notes. D9 audit of every sessions.json reader at 84f53540d and of threadsState's consumers; sessions.json goes to v2 because recover() rebinds without session; pi 0.85.1 resumes by cwd, so the legacy session keeps its in-sandbox path; mutants M1-M8 and run limits (sage-2707)
|
||||
94c33a43c docs: row 275 landing line; Researcher session line
|
||||
a870fd85b docs: seat log lines for rows 281, 224, 219, 214, 211 and 258, the row 253 landing line, Sage's SESSIONS line, and DEFERRED for the 224 residual and the 206 sharee list
|
||||
5b1f1dc88 docs: DEFERRED gains row 253 N1 (Vikunja 532, mos-1297), row 198 N2 (/api/seen 400, sage-2867) and the stale row 203 text in access.mjs (Quackerjack)
|
||||
8c638b6f6 agents: register Della, Scrooge, Huey, Louie and Ludwig as seats so the queue can name them as row owners (Q220, mos-1301)
|
||||
a700992cd docs: 193b2 brief, the live --migrate window needs Mos's go under Q173, not Jason (mos-1310 item 4)
|
||||
d30f35e29 docs: SESSIONS line for Gizmoduck, rows 264a and 268 after-landing docs and the row 269 plan
|
||||
e5b7d1d08 row 268 (#1773): BUILD.md Runs records the r2 gate on ecd9b35eb and the r3 and r4 carry reruns with every count and skip; doc only (sage-2455)
|
||||
836b2f25c docs: preserve email hard-wait approval and tune parser limits
|
||||
73516da85 docs: apply Q217 and Q222 to email source settings
|
||||
95e3f7166 docs: address Q195 editor design review findings
|
||||
cde0cd083 docs: Q195 writing editor design and Q196 options
|
||||
100f018af gosalyn: row 229 design round 2 for Webby webby-0148: the settings.json allowlist is three keys a fresh /login writes, written in Mosaic code with httpProxy and the path and command keys refused by name and a sha256 bump test on pi's setter names, models-store.json and keybindings.json now refuse, auth.json.lock is the only allowed dir, pi-login runs --offline and --no-session in an empty temporary cwd with a 229b allowlist test, the contents check runs before preflight, and creativeHumanOnly covers the fallback (R1, R2, N1-N5)
|
||||
4a8215e3a gosalyn: row 229 design draft 1 after mos-1306: Chet's route has no fallback by default with a human-only fallback still possible through routes, and the dates note records that the live check gates every build row, not the design
|
||||
669e68036 gosalyn: row 229 design draft 1, a per-instance pi agent dir for Chet's Codex login: the host-made 0700 store per instance, a same-path rw bind with PI_CODING_AGENT_DIR through the pi module env, a contents allowlist since pi reads models.json and settings.json there, a refusal for roles with bash, a no-refresh auth check preflight, no fallback for Chet, a fresh-grant mosaic pi-login, the live check that gates the build, and rows 229a and 229b (#428, #1730)
|
||||
c06ccc9ba gosalyn: Case 2 C2-03b round 3 for Webby webby-0156 R4: the fetch fallback reads the append-only events table for any GRANT_EVIDENCE event with method gitea and agent the chief, never gitea_grants, whose row a revoke and a grant-lost delete. It names no project, since grant.applied and grant.revoked carry none, so a chief grant on any project ends the fallback and fails safe. The revoked and fired tests go through grants.revoke and instance.fire and assert the row is gone before the fetch
|
||||
136e5c1ca gosalyn: Case 2 Q226 row briefs with Webby's round webby-0151, Mos's mos-1320 and Sage's sage-2833 folded in. C2-06 rewritten and taking in C2-07: an unreadable business file resolves requireCitation to true (R2), a send over 64 KiB gets the one retry and then a fourth fixed text (R1). C2-03b falls back to slot library-gitea only while no chief grant record has ever existed and refuses library-fetch-no-grant after (R3), with library-human-missing for her save and revert. C2-02 after C2-05c, revert and save by her editor (N1). C2-21 cites mos-1320 item 2 and keeps the host-creative-role refusals, and records two Gitea facts that don't gate it (N4, item 5). C2-08b names what the chief's credential needs (N5). C2-05b restored to the brief row 224 built, which lands as built, and new row C2-05c carries the supporting scope and blob. A PRD row brief for REQ-LIB-6 (mos-1320 item 8). New briefs C2-01d, 05c, 08b, 03b, 21, 02, 11b and 12b
|
||||
cf17ab387 gosalyn: C2-06 brief Q222 round 2 for Webby webby-0144: M11 compares against the on-disk human and replyLimits on document and written and refuses agent actor shapes, an unreadable business file checks at the defaults, keys read by Object.hasOwn and Number.isInteger, the verb refuses unknown keys, the new tests, the residual line, cites at aca16404c, and the hold moves to Q30 (mos-1305, design f164dcef8)
|
||||
09948da18 gosalyn: C2-06 brief makes every M5 limit a replyLimits setting with Q219's numbers as defaults, the human's library.limits.set and mosaic limits replies, the M11 writer check, read at check time with per-key fallback to the default, the setup sheet's settings line, the settings and M11 tests, After C2-04, and the build held for Q29 (Q222, mos-1302, design df29550c9)
|
||||
35615b01b gosalyn: C2-06 brief cites the setup sheet's reply limits paragraph at :115-118 (webby-0140 N4)
|
||||
3f1f4e44f gosalyn: C2-06 brief owns the setup sheet's reply limits paragraph, which says 3 ideas of up to 120 characters and drops the lower-limits offer, and the tests paragraph is rewrapped (webby-0139 N1, N2, Q219)
|
||||
65b8c8a9b gosalyn: C2-06 brief takes Jason's idea caps, 3 items of 120 characters per reply, tested one past each boundary, and the idea-text residual line reads 360 characters closed in Q219 (mos-1299, design 2852348d2)
|
||||
271cef205 gosalyn: Case 2 design round 3 for Webby webby-0156 R4: the fetch fallback reads GRANT_EVIDENCE events with method gitea and agent the chief in the append-only events table, never gitea_grants, and names no project, so it survives a revoke, a grant-lost and a fire and fails safe. The ruling paragraph, 7.2 and section 10 steps 4 and 4b say so, cited at aca16404c
|
||||
3e5db651b gosalyn: Case 2 design ruling after r11, agents never write story (Q223, Q226, mos-1309), with Webby's round webby-0151 and Mos's mos-1320 folded in. Supporting prefix lists agents may write .md files under through library.doc.write and library.doc.delete, fenced by M12 supportingPath, plumbing commits pushed fast-forward only with a Mosaic-Agent trailer, a notice and a human revert authored by her editor on slot library-human. Chat is free text with optional citations, replyLimits keys requireCitation and citationsPerReply, and an unreadable business file resolves requireCitation to true (R2). A send over 64 KiB gets the one retry and then a fixed text (R1). The fetch falls back to slot library-gitea only while no chief grant record has ever existed, and Jason deletes the slot once status shows the chief's grant (R3). A missing editor or slot refuses before any git call (N1), runner and tools cites fixed at aca16404c (N2, N3), two record-only Gitea facts at C2-21 (N4, mos-1320 item 5), mos-1163 narrowed to gitea library projects (mos-1320 item 2), M3 at eight or ten (mos-1320 item 4). C2-05b is row 224 as built and C2-05c carries the supporting scope and blob (sage-2833). New rows C2-01d, C2-05c, C2-08b, C2-12b and C2-21
|
||||
e1c9c0993 gosalyn: Case 2 Q222 round 2 for Webby webby-0144: the M11 fence compares against the on-disk human and refuses agent actor shapes, checks document and written as M9 does, a failed business file read checks at the defaults and never skips, the fallback reads keys by Object.hasOwn and Number.isInteger with booleans, arrays and objects named, the verb refuses unknown keys, the ceilings residual line, and cites at aca16404c (R1-R3, N1-N3, N5, N6)
|
||||
aaaf45576 gosalyn: Case 2 design ruling after r11, reply limits are settings: every M5 limit is a replyLimits key in the business file with Q219's numbers as defaults, changed only by the human's library.limits.set and fenced in organizationWriter.write as M11, read at check time, with a missing or invalid value using its default. C2-06 carries it and waits on Q29 (Q222, mos-1302)
|
||||
cf6abca9c gosalyn: Case 2 design ruling after r11, idea items capped at 3 of 120 characters: M5, the B5 note, the 5.1 residual (now 360 characters per reply) and 10 step 8 closed by Jason; the rest of M5 unchanged, C2-06 builds and tests the new boundaries (Q219, mos-1299, Vikunja 465, ludwig-0014 Q4)
|
||||
3410df7c3 morgana: row 275 r3 (duckworth-0166): B1 bob asks create only, open and send on alice's own thread; N1 thread B holds a message and the viewer read asserts its id
|
||||
1e3db5343 morgana: row 275 r2 (mos-1311): downgraded viewer keeps send and open refusals with nothing stored in the R3 test; BUILD.md lists each changed assertion, old and new, with design 4.3 lines
|
||||
4dd85c671 morgana: row 275 (193b1b, #1780): viewer verbs and board refusals. VIEWER_VERBS at any grant level, collaborator for thread.create/open/send per verb, BOARD_VERBS exported and refused to users, user-side governance pin, mutants 6 and 10; FED R3 viewer-refused assertions reversed per design 4.3
|
||||
48e450ce8 docs(row253): pin mos1298 session assertion candidate
|
||||
14e460061 test(row253): assert direct query PID equals SID (mos-1298)
|
||||
a6c71e6d9 docs(row253): preserve fresh gate stop at M38 survivor
|
||||
e1bc766d8 docs(row253): pin mos1297 fixture repair for review
|
||||
362ec674c test(row253): expose peer failures and pin reasons (mos-1297)
|
||||
f5ef1c33a docs(row253): preserve single P10 diagnostic and reason mismatches
|
||||
2bef9124c docs(row253): preserve M21 survivor stop and static call trace
|
||||
34401e7c9 docs(row253): record green 27-file run and measured timeout basis
|
||||
0604d91fc docs(row253): pin final aca1 integration and focused file bounds
|
||||
ed3bb376c docs(row253): preserve doc sweep appends on corrected interim base
|
||||
cd269e733 docs(row253): record schema3l integration before final base correction
|
||||
e75ef1b19 docs(row253): integrate 385a base and record dependency drift and bounds
|
||||
72b17562d docs(row253): integrate row191 base and refresh manifest
|
||||
ad67d9595 docs(row253): record integration onto refactor 378a76b85
|
||||
3b142c9c6 docs(row253): record static approval and pre-confirmation residual
|
||||
950cf47f3 fix(row253): bound cleanup retries after initial inventory
|
||||
cca936716 fix(row253): supervise socket queries across sudo sessions
|
||||
c8cca3a68 docs(row253): store repair patch without context whitespace
|
||||
62de84882 docs(row253): freeze C4 repair for static review
|
||||
6f320b4b0 docs: propose row253 C4 session supervisor and draft hop fake
|
||||
643d16528 test: prepare row253 socket fixtures and fix gate collisions
|
||||
730a78aa9 gander: design tester socket migration for host scripts
|
||||
aca16404c queue: revs 3195-3216. Rows 278, 281 and 264a reviews, notes and done moves (sage, gizmoduck, megavolt, gander, webby, dewey, duckworth); row 264 round 1 request posted as jarvis (sage-2693, #1769)
|
||||
f7e4ec3df row 264a (#1769): BUILD.md records the r13 gate on 2cc34aef8 (phases 1-3 green, M2 thrown at the trigger) and the r13p4 rerun at 84f53540d (M1-M4 killed on assertions, M2's four edits and kill rule), and the limits row gets the measured probe time; doc only (mos-1280 item 1, sage-2701)
|
||||
b78918850 docs: row 264a landing sweep. BUILD-LOG gets Rocko's V502 rerun line and Sage's V502, rows 278/281 and row 264a landing lines; SESSIONS gets Dewey's, Rocko's and Sage's lines; DEFERRED moves the fire-keeps-grants gap to Done (row 281) and opens row 281 N1/N2 and row 264a N1 (actor_run, binds row 269) and N2 (esbuild skip) (sage-2695, #1769)
|
||||
bus: scripts/bus-service.sh install --copy 84f53540dd0d21ef179ca29697e172b0246e78d1 --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 84f53540dd0d21ef179ca29697e172b0246e78d1 --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 84f53540dd0d21ef179ca29697e172b0246e78d1 --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-22T20:16:25.094Z
|
||||
# W5 restore plan exit 0: restore: the store must go back to 3l; needs --restore 20261022T201621Z-0cbe2e9b35e5
|
||||
# W6 start 2026-10-22T20:16:35Z
|
||||
|
||||
## W6 status
|
||||
# start 2026-10-22T20:16:35.655Z
|
||||
# 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: 1 commit(s) on refactor since the pointer's copy
|
||||
# exit 0, end 2026-10-22T20:16:35.951Z
|
||||
# W6 status: "copy":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0" "pm":true "schema":"3m"
|
||||
|
||||
## W6 live store count (python3 -B, mode=ro)
|
||||
types table=24 trigger=90 view=5 index=25
|
||||
schema_version 3m
|
||||
missing none
|
||||
thread_shares_rows 0
|
||||
events 2084 maxSeq 2084
|
||||
COUNTS_OK
|
||||
# exit 0
|
||||
|
||||
## W6 agents --tester
|
||||
# start 2026-10-22T20:16:36.016Z
|
||||
# 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-22T20:16:36.230Z
|
||||
# W6 agents: chief r148e72c8895d claude-code since 2026-10-22T20:16:24.301Z;
|
||||
|
||||
## 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-22T20:16:24Z
|
||||
# W6_PASS 2026-10-22T20:16:40Z
|
||||
|
||||
## W6 launches list (record)
|
||||
# start 2026-10-22T20:16:47.964Z
|
||||
# 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-22T20:16:48.077Z
|
||||
# W9 after W5 (go mos-1343), W5.start 2026-10-22T20:16:21Z, start 2026-10-22T20:18:28Z
|
||||
# plan e6d611fc, tool blob 5bb443c19ed8, console-check.sh d068fe02, wrapper on NEW: checked
|
||||
|
||||
## W9 Console unit (mos-1338 item 4)
|
||||
is-active active, MainPID 1791122
|
||||
ExecMainStartTimestamp Thu 2026-10-22 15:16:22 CDT (2026-10-22T20:16:22Z), ps lstart Thu Oct 22 15:16:22 2026
|
||||
cwd -> /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
# Console: unit active, pid 1791122, started 2026-10-22T20:16:22Z, cwd /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
# bus: unit active, pid 1791120, cwd /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
|
||||
## W9 status
|
||||
# start 2026-10-22T20:18:28.237Z
|
||||
# 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":"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: 1 commit(s) on refactor since the pointer's copy
|
||||
# exit 0, end 2026-10-22T20:18:28.511Z
|
||||
|
||||
## W9 console-check NEW (/mnt/storage/src/mosaic-stack/agents/sage/work/window-plan/repin-de352dfaf/console-check.sh, d068fe02)
|
||||
# start 2026-10-22T20:18:28.516Z
|
||||
# command: (cd $REPO && <clean env> bash /mnt/storage/src/mosaic-stack/agents/sage/work/window-plan/repin-de352dfaf/console-check.sh 0cbe2e9b35e51fe06dedde69c022b46e040f98c0)
|
||||
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-22T20:18:28.779Z
|
||||
|
||||
## W9 webui journal since 2026-10-22 20:16:21 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 4)
|
||||
# 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-22T20:18:28.850Z
|
||||
# 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-22T20:18:28.961Z
|
||||
|
||||
## W9 launches list --json
|
||||
# start 2026-10-22T20:18:28.963Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic launches list --json)
|
||||
[
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"instance": "chief",
|
||||
"run": "r148e72c8895d",
|
||||
"launchedBy": "jason",
|
||||
"harness": "claude-code",
|
||||
"model": "claude-opus-5-5",
|
||||
"provider": "anthropic",
|
||||
"modelKey": "opus",
|
||||
"pid": 1791348,
|
||||
"startTime": "80137447",
|
||||
"runnerPid": 1791349,
|
||||
"runnerStartTime": "80137447",
|
||||
"runDir": "/home/jwoltje/.mosaic-dev/launches/mosaic-stack/r148e72c8895d",
|
||||
"startedAt": "2026-10-22T20:16:24.291Z",
|
||||
"live": true
|
||||
}
|
||||
]
|
||||
# exit 0, end 2026-10-22T20:18:29.073Z
|
||||
# one running chief from this start: run r148e72c8895d
|
||||
# pm: no pm launch is listed before the pm read (r410293d04d3d ended with W5's restart, not working; mos-1343)
|
||||
|
||||
## W9 agents --tester
|
||||
# start 2026-10-22T20:18:29.097Z
|
||||
# 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-22T20:18:29.303Z
|
||||
# W9 checks PASS 2026-10-22T20:18:29Z
|
||||
|
||||
## W9 talk pm --wait 180 --tester
|
||||
# start 2026-10-22T20:18:29.306Z
|
||||
# command: (cd $REPO && <clean env> /home/jwoltje/.npm-global/bin/mosaic talk pm [mos test] migrate window 0cbe2e9b35e51fe06dedde69c022b46e040f98c0: read packages/tasks/requirements.json through your requirements read and reply with one line: the version and the number of ids --wait 180 --business mosaic-stack --tester)
|
||||
mosaic: pm isn't running, so the tester's message was refused and nothing was stored
|
||||
# exit 3, end 2026-10-22T20:18:29.523Z
|
||||
# pm read exit 3 at 2026-10-22T20:18:29Z; expected 1.15 with 85 ids
|
||||
# W9 end 2026-10-22T20:18:29Z W9_CHECKS_PASS
|
||||
# W10 start 2026-10-22T20:18:39Z, TMPDIR /mnt/storage/scratch/tmp/gRgU5vJ
|
||||
|
||||
## 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/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/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 320 bytes sha256 3b69107b3ac00868 keys ["rows","at"] agents 1 (exit 0)
|
||||
# tester /api/bus/agents 200, agents 1 (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-22T20:18:40Z
|
||||
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-22T20:18:40Z FAIL=0
|
||||
@@ -0,0 +1,17 @@
|
||||
plan: activate for mosaic-stack
|
||||
from: 84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
to: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
store schema: 3l (read from the store the running bus holds)
|
||||
target schema: 3m
|
||||
migration: 3l to 3m, after a backup of the stopped store
|
||||
migration steps: 3l to 3m
|
||||
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 81 (newest first, at most 200):
|
||||
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,98 @@
|
||||
plan: activate for mosaic-stack
|
||||
from: 84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
to: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
store schema: 3l (read from the store the running bus holds)
|
||||
target schema: 3m
|
||||
migration: 3l to 3m, after a backup of the stopped store
|
||||
migration steps: 3l to 3m
|
||||
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 81 (newest first, at most 200):
|
||||
0cbe2e9b3 row 206 (#1704): BUILD.md Runs, gate GREEN on 9538e0fc8 (bus 850, cli 869, shell suites, M2-M9 and Q2 killed)
|
||||
9538e0fc8 row 206 (#1704): thread-shares trail test threads the reply into A's default session, not the thread id (first-run red, mos-1272)
|
||||
1a228f395 row 206 r4 (#1704): BUILD.md records the slot rebase onto 17f415792 (269, 282 landed) and the drift sweep
|
||||
829562260 row 206 (#1704): BUILD.md records duckworth-0179/0180, C3 met on the pushed tip 670658dd1
|
||||
ac0e4dc9b row 206 r3 (#1704): BUILD.md records the C3 rebase onto 275 at 3410df7c3 on 253's 48e450ce8, and the sweep
|
||||
c49fdb269 row 206 (#1704): BUILD.md records duckworth-0175 (round 2 meets C1/C2, APPROVE carries) and C3
|
||||
cfb86f1bd row 206 r2 (#1704): rebased on 275 r3 957a9bfe0; share verbs need collaborator, viewer reads a share (duckworth-0169 C1, C2)
|
||||
178eefd5c row 206 (#1704): BUILD.md records Duckworth's manifest APPROVE (duckworth-0169), C1/C2 for the 275 round, N1-N4
|
||||
8a29f9477 row 206 (193b2, #1704): sage-2818 rulings, only a human principal matches a share
|
||||
d78a9cc83 row 206 (193b2, #1704): thread shares, schema 3l→3m
|
||||
17f415792 queue: revs 3217-3316. Q226 gap (rows 216-229, 265-267 re-pins; 217 unblocked; 223 blocked; rows 282-290 added), rows 253, 275, 269 and 282 reviews, notes and done moves, row 291 (PRD 1.16, #1796) added, claims and in-review moves for 173, 207, 211, 214, 224, 239, 252, 258, 276 (sage, darkwing, della, dewey, gander, herb, honker, megavolt, scrooge, ludwig, gizmoduck, gosalyn, webby, duckworth, morgana); review requests posted as jarvis by Sage
|
||||
647424442 gosalyn: PRD 1.15 round 2 for Webby webby-0158 B1: requireCitation makes every reply carry a citation except the runner's four fixed notices, as the design keeps them passing, and the REQ-LIB-1 rewrap joins organization file to its sentence (N1)
|
||||
71fed6281 gosalyn: PRD 1.15 rewrites REQ-LIB-6 to Q223 and Q226 (mos-1320 item 8): agents never write story and write .md files only in supporting folders a human marks, each as a commit by their own Gitea account with a notice she can revert, chat is free text, any citation is checked, and requireCitation is a human-only setting off by default. REQ-LIB-1 and REQ-LIB-2 gain supporting folders and the canon-cite rule. The 1.12 note's residual becomes the supporting-doc residual, and the 1.15 note records the old texts and lists REQ-LIB-3, 4, 5 and 7 as unchanged. requirements.json version 1.15 with three titles changed, and the test's version pin. The id count stays 85
|
||||
86a665bdf docs: PRD 1.16 brief, library.write routes under REQ-LIB-6 (#1796, mos-1328)
|
||||
efcc9ea8d row 269 (264b, #1774): BUILD.md M11 kill line is the survivor log assertion at session-launch.test.mjs:309, not the outcome assertion (mutant run 17:49Z, duckworth-0181)
|
||||
f39508c24 row 269 (264b, #1774): the M6 halt test halts after mayLaunch answers
|
||||
d20ef317f row 269 (264b, #1774): BUILD.md names the sessioned-survivor residual in Q2 and records N1's mos-1292 allowance (duckworth-0159 N3, N4)
|
||||
6e50bd630 row 269 (264b, #1774): BUILD.md Q2 notes that a survivor's released claim doesn't prove its run has exited, and the per-leftover 5 s wait (duckworth-0158 N1, N2)
|
||||
6c80b1290 row 269 (264b, #1774): BUILD.md answers sage-2750 on the recover() change; the survivor log names its pids
|
||||
42fd3edd4 row 269 (264b, #1774): legacy-run-live gets its test (duckworth-0156)
|
||||
dc5836c7d row 269 (264b, #1774): refusedOnce in sessions.test.mjs pins actor_run, closing Duckworth N1 (DEFERRED.md:474-480)
|
||||
2133c5a0c row 269 (264b, #1774): per-session store, workspace and single-writer lock
|
||||
194dec83d row 269 (264b, #1774): BUILD.md lists thread-launch.test.mjs:182 as a second old assertion that changes. A thread.create thread's default session isn't legacy-3l, so its store takes D2's layout (t1-sessions.md:100, :294). Proposed as an exact path update, for Mos through Sage
|
||||
84b32e390 row 269 (264b, #1774): BUILD.md drops the planned bindLaunch session-running refusal. Two old tests bind a second unended run to one session and expect the claim refusal (threads.test.mjs:88-89, sessions.test.mjs:119-120), so the broker half of the fence is the existing per-session claim, thread-already-held (broker.mjs:4815)
|
||||
9d241fdcc row 269 (264b, #1774): design notes for Duckworth's early look (duckworth-0150). C1 adds the Console and R-guard sessions.json readers, the 264a refusals a v2 file causes, the /proc live check and the Console restart; C2 pins M6 to a generation change after check() with all eight start() admission calls named; C3 gives the realpath compare its own code and a symlinked workspaces root as M4's input; C4 lists the old threadsState assertions, end-launch.test:193 the only change, under mos-1285
|
||||
76a6524cf row 269 (264b, #1774): design notes for sage-2717. Rollback names the four steps past the 264a exit-3 refusal and the re-pin plan section that carries them; new M8 binds a non-default session at the legacy path, old M8 becomes M9; Duckworth's legacy-bind check
|
||||
693f7e745 row 269 (264b, #1774): design notes. D9 audit of every sessions.json reader at 84f53540d and of threadsState's consumers; sessions.json goes to v2 because recover() rebinds without session; pi 0.85.1 resumes by cwd, so the legacy session keeps its in-sandbox path; mutants M1-M8 and run limits (sage-2707)
|
||||
94c33a43c docs: row 275 landing line; Researcher session line
|
||||
a870fd85b docs: seat log lines for rows 281, 224, 219, 214, 211 and 258, the row 253 landing line, Sage's SESSIONS line, and DEFERRED for the 224 residual and the 206 sharee list
|
||||
5b1f1dc88 docs: DEFERRED gains row 253 N1 (Vikunja 532, mos-1297), row 198 N2 (/api/seen 400, sage-2867) and the stale row 203 text in access.mjs (Quackerjack)
|
||||
8c638b6f6 agents: register Della, Scrooge, Huey, Louie and Ludwig as seats so the queue can name them as row owners (Q220, mos-1301)
|
||||
a700992cd docs: 193b2 brief, the live --migrate window needs Mos's go under Q173, not Jason (mos-1310 item 4)
|
||||
d30f35e29 docs: SESSIONS line for Gizmoduck, rows 264a and 268 after-landing docs and the row 269 plan
|
||||
e5b7d1d08 row 268 (#1773): BUILD.md Runs records the r2 gate on ecd9b35eb and the r3 and r4 carry reruns with every count and skip; doc only (sage-2455)
|
||||
836b2f25c docs: preserve email hard-wait approval and tune parser limits
|
||||
73516da85 docs: apply Q217 and Q222 to email source settings
|
||||
95e3f7166 docs: address Q195 editor design review findings
|
||||
cde0cd083 docs: Q195 writing editor design and Q196 options
|
||||
100f018af gosalyn: row 229 design round 2 for Webby webby-0148: the settings.json allowlist is three keys a fresh /login writes, written in Mosaic code with httpProxy and the path and command keys refused by name and a sha256 bump test on pi's setter names, models-store.json and keybindings.json now refuse, auth.json.lock is the only allowed dir, pi-login runs --offline and --no-session in an empty temporary cwd with a 229b allowlist test, the contents check runs before preflight, and creativeHumanOnly covers the fallback (R1, R2, N1-N5)
|
||||
4a8215e3a gosalyn: row 229 design draft 1 after mos-1306: Chet's route has no fallback by default with a human-only fallback still possible through routes, and the dates note records that the live check gates every build row, not the design
|
||||
669e68036 gosalyn: row 229 design draft 1, a per-instance pi agent dir for Chet's Codex login: the host-made 0700 store per instance, a same-path rw bind with PI_CODING_AGENT_DIR through the pi module env, a contents allowlist since pi reads models.json and settings.json there, a refusal for roles with bash, a no-refresh auth check preflight, no fallback for Chet, a fresh-grant mosaic pi-login, the live check that gates the build, and rows 229a and 229b (#428, #1730)
|
||||
c06ccc9ba gosalyn: Case 2 C2-03b round 3 for Webby webby-0156 R4: the fetch fallback reads the append-only events table for any GRANT_EVIDENCE event with method gitea and agent the chief, never gitea_grants, whose row a revoke and a grant-lost delete. It names no project, since grant.applied and grant.revoked carry none, so a chief grant on any project ends the fallback and fails safe. The revoked and fired tests go through grants.revoke and instance.fire and assert the row is gone before the fetch
|
||||
136e5c1ca gosalyn: Case 2 Q226 row briefs with Webby's round webby-0151, Mos's mos-1320 and Sage's sage-2833 folded in. C2-06 rewritten and taking in C2-07: an unreadable business file resolves requireCitation to true (R2), a send over 64 KiB gets the one retry and then a fourth fixed text (R1). C2-03b falls back to slot library-gitea only while no chief grant record has ever existed and refuses library-fetch-no-grant after (R3), with library-human-missing for her save and revert. C2-02 after C2-05c, revert and save by her editor (N1). C2-21 cites mos-1320 item 2 and keeps the host-creative-role refusals, and records two Gitea facts that don't gate it (N4, item 5). C2-08b names what the chief's credential needs (N5). C2-05b restored to the brief row 224 built, which lands as built, and new row C2-05c carries the supporting scope and blob. A PRD row brief for REQ-LIB-6 (mos-1320 item 8). New briefs C2-01d, 05c, 08b, 03b, 21, 02, 11b and 12b
|
||||
cf17ab387 gosalyn: C2-06 brief Q222 round 2 for Webby webby-0144: M11 compares against the on-disk human and replyLimits on document and written and refuses agent actor shapes, an unreadable business file checks at the defaults, keys read by Object.hasOwn and Number.isInteger, the verb refuses unknown keys, the new tests, the residual line, cites at aca16404c, and the hold moves to Q30 (mos-1305, design f164dcef8)
|
||||
09948da18 gosalyn: C2-06 brief makes every M5 limit a replyLimits setting with Q219's numbers as defaults, the human's library.limits.set and mosaic limits replies, the M11 writer check, read at check time with per-key fallback to the default, the setup sheet's settings line, the settings and M11 tests, After C2-04, and the build held for Q29 (Q222, mos-1302, design df29550c9)
|
||||
35615b01b gosalyn: C2-06 brief cites the setup sheet's reply limits paragraph at :115-118 (webby-0140 N4)
|
||||
3f1f4e44f gosalyn: C2-06 brief owns the setup sheet's reply limits paragraph, which says 3 ideas of up to 120 characters and drops the lower-limits offer, and the tests paragraph is rewrapped (webby-0139 N1, N2, Q219)
|
||||
65b8c8a9b gosalyn: C2-06 brief takes Jason's idea caps, 3 items of 120 characters per reply, tested one past each boundary, and the idea-text residual line reads 360 characters closed in Q219 (mos-1299, design 2852348d2)
|
||||
271cef205 gosalyn: Case 2 design round 3 for Webby webby-0156 R4: the fetch fallback reads GRANT_EVIDENCE events with method gitea and agent the chief in the append-only events table, never gitea_grants, and names no project, so it survives a revoke, a grant-lost and a fire and fails safe. The ruling paragraph, 7.2 and section 10 steps 4 and 4b say so, cited at aca16404c
|
||||
3e5db651b gosalyn: Case 2 design ruling after r11, agents never write story (Q223, Q226, mos-1309), with Webby's round webby-0151 and Mos's mos-1320 folded in. Supporting prefix lists agents may write .md files under through library.doc.write and library.doc.delete, fenced by M12 supportingPath, plumbing commits pushed fast-forward only with a Mosaic-Agent trailer, a notice and a human revert authored by her editor on slot library-human. Chat is free text with optional citations, replyLimits keys requireCitation and citationsPerReply, and an unreadable business file resolves requireCitation to true (R2). A send over 64 KiB gets the one retry and then a fixed text (R1). The fetch falls back to slot library-gitea only while no chief grant record has ever existed, and Jason deletes the slot once status shows the chief's grant (R3). A missing editor or slot refuses before any git call (N1), runner and tools cites fixed at aca16404c (N2, N3), two record-only Gitea facts at C2-21 (N4, mos-1320 item 5), mos-1163 narrowed to gitea library projects (mos-1320 item 2), M3 at eight or ten (mos-1320 item 4). C2-05b is row 224 as built and C2-05c carries the supporting scope and blob (sage-2833). New rows C2-01d, C2-05c, C2-08b, C2-12b and C2-21
|
||||
e1c9c0993 gosalyn: Case 2 Q222 round 2 for Webby webby-0144: the M11 fence compares against the on-disk human and refuses agent actor shapes, checks document and written as M9 does, a failed business file read checks at the defaults and never skips, the fallback reads keys by Object.hasOwn and Number.isInteger with booleans, arrays and objects named, the verb refuses unknown keys, the ceilings residual line, and cites at aca16404c (R1-R3, N1-N3, N5, N6)
|
||||
aaaf45576 gosalyn: Case 2 design ruling after r11, reply limits are settings: every M5 limit is a replyLimits key in the business file with Q219's numbers as defaults, changed only by the human's library.limits.set and fenced in organizationWriter.write as M11, read at check time, with a missing or invalid value using its default. C2-06 carries it and waits on Q29 (Q222, mos-1302)
|
||||
cf6abca9c gosalyn: Case 2 design ruling after r11, idea items capped at 3 of 120 characters: M5, the B5 note, the 5.1 residual (now 360 characters per reply) and 10 step 8 closed by Jason; the rest of M5 unchanged, C2-06 builds and tests the new boundaries (Q219, mos-1299, Vikunja 465, ludwig-0014 Q4)
|
||||
3410df7c3 morgana: row 275 r3 (duckworth-0166): B1 bob asks create only, open and send on alice's own thread; N1 thread B holds a message and the viewer read asserts its id
|
||||
1e3db5343 morgana: row 275 r2 (mos-1311): downgraded viewer keeps send and open refusals with nothing stored in the R3 test; BUILD.md lists each changed assertion, old and new, with design 4.3 lines
|
||||
4dd85c671 morgana: row 275 (193b1b, #1780): viewer verbs and board refusals. VIEWER_VERBS at any grant level, collaborator for thread.create/open/send per verb, BOARD_VERBS exported and refused to users, user-side governance pin, mutants 6 and 10; FED R3 viewer-refused assertions reversed per design 4.3
|
||||
48e450ce8 docs(row253): pin mos1298 session assertion candidate
|
||||
14e460061 test(row253): assert direct query PID equals SID (mos-1298)
|
||||
a6c71e6d9 docs(row253): preserve fresh gate stop at M38 survivor
|
||||
e1bc766d8 docs(row253): pin mos1297 fixture repair for review
|
||||
362ec674c test(row253): expose peer failures and pin reasons (mos-1297)
|
||||
f5ef1c33a docs(row253): preserve single P10 diagnostic and reason mismatches
|
||||
2bef9124c docs(row253): preserve M21 survivor stop and static call trace
|
||||
34401e7c9 docs(row253): record green 27-file run and measured timeout basis
|
||||
0604d91fc docs(row253): pin final aca1 integration and focused file bounds
|
||||
ed3bb376c docs(row253): preserve doc sweep appends on corrected interim base
|
||||
cd269e733 docs(row253): record schema3l integration before final base correction
|
||||
e75ef1b19 docs(row253): integrate 385a base and record dependency drift and bounds
|
||||
72b17562d docs(row253): integrate row191 base and refresh manifest
|
||||
ad67d9595 docs(row253): record integration onto refactor 378a76b85
|
||||
3b142c9c6 docs(row253): record static approval and pre-confirmation residual
|
||||
950cf47f3 fix(row253): bound cleanup retries after initial inventory
|
||||
cca936716 fix(row253): supervise socket queries across sudo sessions
|
||||
c8cca3a68 docs(row253): store repair patch without context whitespace
|
||||
62de84882 docs(row253): freeze C4 repair for static review
|
||||
6f320b4b0 docs: propose row253 C4 session supervisor and draft hop fake
|
||||
643d16528 test: prepare row253 socket fixtures and fix gate collisions
|
||||
730a78aa9 gander: design tester socket migration for host scripts
|
||||
aca16404c queue: revs 3195-3216. Rows 278, 281 and 264a reviews, notes and done moves (sage, gizmoduck, megavolt, gander, webby, dewey, duckworth); row 264 round 1 request posted as jarvis (sage-2693, #1769)
|
||||
f7e4ec3df row 264a (#1769): BUILD.md records the r13 gate on 2cc34aef8 (phases 1-3 green, M2 thrown at the trigger) and the r13p4 rerun at 84f53540d (M1-M4 killed on assertions, M2's four edits and kill rule), and the limits row gets the measured probe time; doc only (mos-1280 item 1, sage-2701)
|
||||
b78918850 docs: row 264a landing sweep. BUILD-LOG gets Rocko's V502 rerun line and Sage's V502, rows 278/281 and row 264a landing lines; SESSIONS gets Dewey's, Rocko's and Sage's lines; DEFERRED moves the fire-keeps-grants gap to Done (row 281) and opens row 281 N1/N2 and row 264a N1 (actor_run, binds row 269) and N2 (esbuild skip) (sage-2695, #1769)
|
||||
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 @@
|
||||
launched chief: run r148e72c8895d, claude-code claude-opus-5-5
|
||||
@@ -0,0 +1,94 @@
|
||||
plan: rollback for mosaic-stack
|
||||
from: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
to: 84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
store schema: 3m (read from the store the running bus holds)
|
||||
target schema: 3l
|
||||
restore: the store must go back to 3l; needs --restore 20261022T201621Z-0cbe2e9b35e5
|
||||
commits: the run takes away 81 (newest first, at most 200):
|
||||
0cbe2e9b3 row 206 (#1704): BUILD.md Runs, gate GREEN on 9538e0fc8 (bus 850, cli 869, shell suites, M2-M9 and Q2 killed)
|
||||
9538e0fc8 row 206 (#1704): thread-shares trail test threads the reply into A's default session, not the thread id (first-run red, mos-1272)
|
||||
1a228f395 row 206 r4 (#1704): BUILD.md records the slot rebase onto 17f415792 (269, 282 landed) and the drift sweep
|
||||
829562260 row 206 (#1704): BUILD.md records duckworth-0179/0180, C3 met on the pushed tip 670658dd1
|
||||
ac0e4dc9b row 206 r3 (#1704): BUILD.md records the C3 rebase onto 275 at 3410df7c3 on 253's 48e450ce8, and the sweep
|
||||
c49fdb269 row 206 (#1704): BUILD.md records duckworth-0175 (round 2 meets C1/C2, APPROVE carries) and C3
|
||||
cfb86f1bd row 206 r2 (#1704): rebased on 275 r3 957a9bfe0; share verbs need collaborator, viewer reads a share (duckworth-0169 C1, C2)
|
||||
178eefd5c row 206 (#1704): BUILD.md records Duckworth's manifest APPROVE (duckworth-0169), C1/C2 for the 275 round, N1-N4
|
||||
8a29f9477 row 206 (193b2, #1704): sage-2818 rulings, only a human principal matches a share
|
||||
d78a9cc83 row 206 (193b2, #1704): thread shares, schema 3l→3m
|
||||
17f415792 queue: revs 3217-3316. Q226 gap (rows 216-229, 265-267 re-pins; 217 unblocked; 223 blocked; rows 282-290 added), rows 253, 275, 269 and 282 reviews, notes and done moves, row 291 (PRD 1.16, #1796) added, claims and in-review moves for 173, 207, 211, 214, 224, 239, 252, 258, 276 (sage, darkwing, della, dewey, gander, herb, honker, megavolt, scrooge, ludwig, gizmoduck, gosalyn, webby, duckworth, morgana); review requests posted as jarvis by Sage
|
||||
647424442 gosalyn: PRD 1.15 round 2 for Webby webby-0158 B1: requireCitation makes every reply carry a citation except the runner's four fixed notices, as the design keeps them passing, and the REQ-LIB-1 rewrap joins organization file to its sentence (N1)
|
||||
71fed6281 gosalyn: PRD 1.15 rewrites REQ-LIB-6 to Q223 and Q226 (mos-1320 item 8): agents never write story and write .md files only in supporting folders a human marks, each as a commit by their own Gitea account with a notice she can revert, chat is free text, any citation is checked, and requireCitation is a human-only setting off by default. REQ-LIB-1 and REQ-LIB-2 gain supporting folders and the canon-cite rule. The 1.12 note's residual becomes the supporting-doc residual, and the 1.15 note records the old texts and lists REQ-LIB-3, 4, 5 and 7 as unchanged. requirements.json version 1.15 with three titles changed, and the test's version pin. The id count stays 85
|
||||
86a665bdf docs: PRD 1.16 brief, library.write routes under REQ-LIB-6 (#1796, mos-1328)
|
||||
efcc9ea8d row 269 (264b, #1774): BUILD.md M11 kill line is the survivor log assertion at session-launch.test.mjs:309, not the outcome assertion (mutant run 17:49Z, duckworth-0181)
|
||||
f39508c24 row 269 (264b, #1774): the M6 halt test halts after mayLaunch answers
|
||||
d20ef317f row 269 (264b, #1774): BUILD.md names the sessioned-survivor residual in Q2 and records N1's mos-1292 allowance (duckworth-0159 N3, N4)
|
||||
6e50bd630 row 269 (264b, #1774): BUILD.md Q2 notes that a survivor's released claim doesn't prove its run has exited, and the per-leftover 5 s wait (duckworth-0158 N1, N2)
|
||||
6c80b1290 row 269 (264b, #1774): BUILD.md answers sage-2750 on the recover() change; the survivor log names its pids
|
||||
42fd3edd4 row 269 (264b, #1774): legacy-run-live gets its test (duckworth-0156)
|
||||
dc5836c7d row 269 (264b, #1774): refusedOnce in sessions.test.mjs pins actor_run, closing Duckworth N1 (DEFERRED.md:474-480)
|
||||
2133c5a0c row 269 (264b, #1774): per-session store, workspace and single-writer lock
|
||||
194dec83d row 269 (264b, #1774): BUILD.md lists thread-launch.test.mjs:182 as a second old assertion that changes. A thread.create thread's default session isn't legacy-3l, so its store takes D2's layout (t1-sessions.md:100, :294). Proposed as an exact path update, for Mos through Sage
|
||||
84b32e390 row 269 (264b, #1774): BUILD.md drops the planned bindLaunch session-running refusal. Two old tests bind a second unended run to one session and expect the claim refusal (threads.test.mjs:88-89, sessions.test.mjs:119-120), so the broker half of the fence is the existing per-session claim, thread-already-held (broker.mjs:4815)
|
||||
9d241fdcc row 269 (264b, #1774): design notes for Duckworth's early look (duckworth-0150). C1 adds the Console and R-guard sessions.json readers, the 264a refusals a v2 file causes, the /proc live check and the Console restart; C2 pins M6 to a generation change after check() with all eight start() admission calls named; C3 gives the realpath compare its own code and a symlinked workspaces root as M4's input; C4 lists the old threadsState assertions, end-launch.test:193 the only change, under mos-1285
|
||||
76a6524cf row 269 (264b, #1774): design notes for sage-2717. Rollback names the four steps past the 264a exit-3 refusal and the re-pin plan section that carries them; new M8 binds a non-default session at the legacy path, old M8 becomes M9; Duckworth's legacy-bind check
|
||||
693f7e745 row 269 (264b, #1774): design notes. D9 audit of every sessions.json reader at 84f53540d and of threadsState's consumers; sessions.json goes to v2 because recover() rebinds without session; pi 0.85.1 resumes by cwd, so the legacy session keeps its in-sandbox path; mutants M1-M8 and run limits (sage-2707)
|
||||
94c33a43c docs: row 275 landing line; Researcher session line
|
||||
a870fd85b docs: seat log lines for rows 281, 224, 219, 214, 211 and 258, the row 253 landing line, Sage's SESSIONS line, and DEFERRED for the 224 residual and the 206 sharee list
|
||||
5b1f1dc88 docs: DEFERRED gains row 253 N1 (Vikunja 532, mos-1297), row 198 N2 (/api/seen 400, sage-2867) and the stale row 203 text in access.mjs (Quackerjack)
|
||||
8c638b6f6 agents: register Della, Scrooge, Huey, Louie and Ludwig as seats so the queue can name them as row owners (Q220, mos-1301)
|
||||
a700992cd docs: 193b2 brief, the live --migrate window needs Mos's go under Q173, not Jason (mos-1310 item 4)
|
||||
d30f35e29 docs: SESSIONS line for Gizmoduck, rows 264a and 268 after-landing docs and the row 269 plan
|
||||
e5b7d1d08 row 268 (#1773): BUILD.md Runs records the r2 gate on ecd9b35eb and the r3 and r4 carry reruns with every count and skip; doc only (sage-2455)
|
||||
836b2f25c docs: preserve email hard-wait approval and tune parser limits
|
||||
73516da85 docs: apply Q217 and Q222 to email source settings
|
||||
95e3f7166 docs: address Q195 editor design review findings
|
||||
cde0cd083 docs: Q195 writing editor design and Q196 options
|
||||
100f018af gosalyn: row 229 design round 2 for Webby webby-0148: the settings.json allowlist is three keys a fresh /login writes, written in Mosaic code with httpProxy and the path and command keys refused by name and a sha256 bump test on pi's setter names, models-store.json and keybindings.json now refuse, auth.json.lock is the only allowed dir, pi-login runs --offline and --no-session in an empty temporary cwd with a 229b allowlist test, the contents check runs before preflight, and creativeHumanOnly covers the fallback (R1, R2, N1-N5)
|
||||
4a8215e3a gosalyn: row 229 design draft 1 after mos-1306: Chet's route has no fallback by default with a human-only fallback still possible through routes, and the dates note records that the live check gates every build row, not the design
|
||||
669e68036 gosalyn: row 229 design draft 1, a per-instance pi agent dir for Chet's Codex login: the host-made 0700 store per instance, a same-path rw bind with PI_CODING_AGENT_DIR through the pi module env, a contents allowlist since pi reads models.json and settings.json there, a refusal for roles with bash, a no-refresh auth check preflight, no fallback for Chet, a fresh-grant mosaic pi-login, the live check that gates the build, and rows 229a and 229b (#428, #1730)
|
||||
c06ccc9ba gosalyn: Case 2 C2-03b round 3 for Webby webby-0156 R4: the fetch fallback reads the append-only events table for any GRANT_EVIDENCE event with method gitea and agent the chief, never gitea_grants, whose row a revoke and a grant-lost delete. It names no project, since grant.applied and grant.revoked carry none, so a chief grant on any project ends the fallback and fails safe. The revoked and fired tests go through grants.revoke and instance.fire and assert the row is gone before the fetch
|
||||
136e5c1ca gosalyn: Case 2 Q226 row briefs with Webby's round webby-0151, Mos's mos-1320 and Sage's sage-2833 folded in. C2-06 rewritten and taking in C2-07: an unreadable business file resolves requireCitation to true (R2), a send over 64 KiB gets the one retry and then a fourth fixed text (R1). C2-03b falls back to slot library-gitea only while no chief grant record has ever existed and refuses library-fetch-no-grant after (R3), with library-human-missing for her save and revert. C2-02 after C2-05c, revert and save by her editor (N1). C2-21 cites mos-1320 item 2 and keeps the host-creative-role refusals, and records two Gitea facts that don't gate it (N4, item 5). C2-08b names what the chief's credential needs (N5). C2-05b restored to the brief row 224 built, which lands as built, and new row C2-05c carries the supporting scope and blob. A PRD row brief for REQ-LIB-6 (mos-1320 item 8). New briefs C2-01d, 05c, 08b, 03b, 21, 02, 11b and 12b
|
||||
cf17ab387 gosalyn: C2-06 brief Q222 round 2 for Webby webby-0144: M11 compares against the on-disk human and replyLimits on document and written and refuses agent actor shapes, an unreadable business file checks at the defaults, keys read by Object.hasOwn and Number.isInteger, the verb refuses unknown keys, the new tests, the residual line, cites at aca16404c, and the hold moves to Q30 (mos-1305, design f164dcef8)
|
||||
09948da18 gosalyn: C2-06 brief makes every M5 limit a replyLimits setting with Q219's numbers as defaults, the human's library.limits.set and mosaic limits replies, the M11 writer check, read at check time with per-key fallback to the default, the setup sheet's settings line, the settings and M11 tests, After C2-04, and the build held for Q29 (Q222, mos-1302, design df29550c9)
|
||||
35615b01b gosalyn: C2-06 brief cites the setup sheet's reply limits paragraph at :115-118 (webby-0140 N4)
|
||||
3f1f4e44f gosalyn: C2-06 brief owns the setup sheet's reply limits paragraph, which says 3 ideas of up to 120 characters and drops the lower-limits offer, and the tests paragraph is rewrapped (webby-0139 N1, N2, Q219)
|
||||
65b8c8a9b gosalyn: C2-06 brief takes Jason's idea caps, 3 items of 120 characters per reply, tested one past each boundary, and the idea-text residual line reads 360 characters closed in Q219 (mos-1299, design 2852348d2)
|
||||
271cef205 gosalyn: Case 2 design round 3 for Webby webby-0156 R4: the fetch fallback reads GRANT_EVIDENCE events with method gitea and agent the chief in the append-only events table, never gitea_grants, and names no project, so it survives a revoke, a grant-lost and a fire and fails safe. The ruling paragraph, 7.2 and section 10 steps 4 and 4b say so, cited at aca16404c
|
||||
3e5db651b gosalyn: Case 2 design ruling after r11, agents never write story (Q223, Q226, mos-1309), with Webby's round webby-0151 and Mos's mos-1320 folded in. Supporting prefix lists agents may write .md files under through library.doc.write and library.doc.delete, fenced by M12 supportingPath, plumbing commits pushed fast-forward only with a Mosaic-Agent trailer, a notice and a human revert authored by her editor on slot library-human. Chat is free text with optional citations, replyLimits keys requireCitation and citationsPerReply, and an unreadable business file resolves requireCitation to true (R2). A send over 64 KiB gets the one retry and then a fixed text (R1). The fetch falls back to slot library-gitea only while no chief grant record has ever existed, and Jason deletes the slot once status shows the chief's grant (R3). A missing editor or slot refuses before any git call (N1), runner and tools cites fixed at aca16404c (N2, N3), two record-only Gitea facts at C2-21 (N4, mos-1320 item 5), mos-1163 narrowed to gitea library projects (mos-1320 item 2), M3 at eight or ten (mos-1320 item 4). C2-05b is row 224 as built and C2-05c carries the supporting scope and blob (sage-2833). New rows C2-01d, C2-05c, C2-08b, C2-12b and C2-21
|
||||
e1c9c0993 gosalyn: Case 2 Q222 round 2 for Webby webby-0144: the M11 fence compares against the on-disk human and refuses agent actor shapes, checks document and written as M9 does, a failed business file read checks at the defaults and never skips, the fallback reads keys by Object.hasOwn and Number.isInteger with booleans, arrays and objects named, the verb refuses unknown keys, the ceilings residual line, and cites at aca16404c (R1-R3, N1-N3, N5, N6)
|
||||
aaaf45576 gosalyn: Case 2 design ruling after r11, reply limits are settings: every M5 limit is a replyLimits key in the business file with Q219's numbers as defaults, changed only by the human's library.limits.set and fenced in organizationWriter.write as M11, read at check time, with a missing or invalid value using its default. C2-06 carries it and waits on Q29 (Q222, mos-1302)
|
||||
cf6abca9c gosalyn: Case 2 design ruling after r11, idea items capped at 3 of 120 characters: M5, the B5 note, the 5.1 residual (now 360 characters per reply) and 10 step 8 closed by Jason; the rest of M5 unchanged, C2-06 builds and tests the new boundaries (Q219, mos-1299, Vikunja 465, ludwig-0014 Q4)
|
||||
3410df7c3 morgana: row 275 r3 (duckworth-0166): B1 bob asks create only, open and send on alice's own thread; N1 thread B holds a message and the viewer read asserts its id
|
||||
1e3db5343 morgana: row 275 r2 (mos-1311): downgraded viewer keeps send and open refusals with nothing stored in the R3 test; BUILD.md lists each changed assertion, old and new, with design 4.3 lines
|
||||
4dd85c671 morgana: row 275 (193b1b, #1780): viewer verbs and board refusals. VIEWER_VERBS at any grant level, collaborator for thread.create/open/send per verb, BOARD_VERBS exported and refused to users, user-side governance pin, mutants 6 and 10; FED R3 viewer-refused assertions reversed per design 4.3
|
||||
48e450ce8 docs(row253): pin mos1298 session assertion candidate
|
||||
14e460061 test(row253): assert direct query PID equals SID (mos-1298)
|
||||
a6c71e6d9 docs(row253): preserve fresh gate stop at M38 survivor
|
||||
e1bc766d8 docs(row253): pin mos1297 fixture repair for review
|
||||
362ec674c test(row253): expose peer failures and pin reasons (mos-1297)
|
||||
f5ef1c33a docs(row253): preserve single P10 diagnostic and reason mismatches
|
||||
2bef9124c docs(row253): preserve M21 survivor stop and static call trace
|
||||
34401e7c9 docs(row253): record green 27-file run and measured timeout basis
|
||||
0604d91fc docs(row253): pin final aca1 integration and focused file bounds
|
||||
ed3bb376c docs(row253): preserve doc sweep appends on corrected interim base
|
||||
cd269e733 docs(row253): record schema3l integration before final base correction
|
||||
e75ef1b19 docs(row253): integrate 385a base and record dependency drift and bounds
|
||||
72b17562d docs(row253): integrate row191 base and refresh manifest
|
||||
ad67d9595 docs(row253): record integration onto refactor 378a76b85
|
||||
3b142c9c6 docs(row253): record static approval and pre-confirmation residual
|
||||
950cf47f3 fix(row253): bound cleanup retries after initial inventory
|
||||
cca936716 fix(row253): supervise socket queries across sudo sessions
|
||||
c8cca3a68 docs(row253): store repair patch without context whitespace
|
||||
62de84882 docs(row253): freeze C4 repair for static review
|
||||
6f320b4b0 docs: propose row253 C4 session supervisor and draft hop fake
|
||||
643d16528 test: prepare row253 socket fixtures and fix gate collisions
|
||||
730a78aa9 gander: design tester socket migration for host scripts
|
||||
aca16404c queue: revs 3195-3216. Rows 278, 281 and 264a reviews, notes and done moves (sage, gizmoduck, megavolt, gander, webby, dewey, duckworth); row 264 round 1 request posted as jarvis (sage-2693, #1769)
|
||||
f7e4ec3df row 264a (#1769): BUILD.md records the r13 gate on 2cc34aef8 (phases 1-3 green, M2 thrown at the trigger) and the r13p4 rerun at 84f53540d (M1-M4 killed on assertions, M2's four edits and kill rule), and the limits row gets the measured probe time; doc only (mos-1280 item 1, sage-2701)
|
||||
b78918850 docs: row 264a landing sweep. BUILD-LOG gets Rocko's V502 rerun line and Sage's V502, rows 278/281 and row 264a landing lines; SESSIONS gets Dewey's, Rocko's and Sage's lines; DEFERRED moves the fire-keeps-grants gap to Done (row 281) and opens row 281 N1/N2 and row 264a N1 (actor_run, binds row 269) and N2 (esbuild skip) (sage-2695, #1769)
|
||||
bus: scripts/bus-service.sh install --copy 84f53540dd0d21ef179ca29697e172b0246e78d1 --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 84f53540dd0d21ef179ca29697e172b0246e78d1 --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 84f53540dd0d21ef179ca29697e172b0246e78d1 --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":"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: 1 commit(s) on refactor since the pointer's copy
|
||||
@@ -0,0 +1 @@
|
||||
2026-10-22T20:16:21Z
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
## W5 activate NEW --pm --migrate --tester-socket (mos-1342)
|
||||
# start 2026-10-22T20:16:21.215Z
|
||||
# command: (cd $REPO && <clean env> scripts/stack-release.sh activate 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 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/20261022T201621Z-0cbe2e9b35e5
|
||||
stack-release: stopped both units
|
||||
stack-release: stopped store schema: 3l
|
||||
stack-release: backup: /home/jwoltje/.mosaic-dev/backups/stack/20261022T201621Z-0cbe2e9b35e5
|
||||
stack-release: migrated the store to 3m
|
||||
stack-release: installed 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
stack-release: gate passed on 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
stack-release: activate ok: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 is live for mosaic-stack
|
||||
# exit 0, end 2026-10-22T20:16:24.487Z
|
||||
@@ -0,0 +1,6 @@
|
||||
types table=24 trigger=90 view=5 index=25
|
||||
schema_version 3m
|
||||
missing none
|
||||
thread_shares_rows 0
|
||||
events 2084 maxSeq 2084
|
||||
COUNTS_OK
|
||||
@@ -0,0 +1,21 @@
|
||||
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: 1 commit(s) on refactor since the pointer's copy
|
||||
# exit 0
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), B0 (PLAN.md "Schema and backups"; sage-2967 A2). The
|
||||
# 84f53540d window's b0.sh with WIN and SCHEMA changed. 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):
|
||||
# $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 3l
|
||||
# $DATA/backups/b0-<STAMP>/CHECK integrity_check, the event count and maxSeq
|
||||
# Nothing live changes. A failed check stops the script.
|
||||
# usage: b0.sh
|
||||
set -uo pipefail
|
||||
WIN=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
DATA=$HOME/.mosaic-dev
|
||||
sha() { sha256sum < "$1" | cut -c1-64; }
|
||||
stop() { echo "STOP: $*"; exit 1; }
|
||||
|
||||
echo "B0 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")" = 3l ] || stop "SCHEMA reads $(cat "$B/SCHEMA"), not 3l"
|
||||
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 $(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,21 @@
|
||||
B0 start 2026-10-22T20:06:42.619Z
|
||||
/home/jwoltje/.mosaic-dev/backups/b0-20261022T200642Z:
|
||||
total 24
|
||||
drwx------ 3 jwoltje jwoltje 4096 Oct 22 15:06 .
|
||||
drwx------ 11 jwoltje jwoltje 4096 Oct 22 15:06 ..
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 15:06 bus
|
||||
-rw------- 1 jwoltje jwoltje 37 Oct 22 15:06 CHECK
|
||||
-rw------- 1 jwoltje jwoltje 3 Oct 22 15:06 SCHEMA
|
||||
-rw------- 1 jwoltje jwoltje 77 Oct 22 15:06 SHA256SUMS
|
||||
|
||||
/home/jwoltje/.mosaic-dev/backups/b0-20261022T200642Z/bus:
|
||||
total 2892
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 15:06 .
|
||||
drwx------ 3 jwoltje jwoltje 4096 Oct 22 15:06 ..
|
||||
-rw------- 1 jwoltje jwoltje 2953216 Oct 22 15:06 bus.sqlite
|
||||
SHA256SUMS: cc6d5fbf46fd3e34e9041cf921d0b1b4279ce12789e747459b4e91d9a1464455 bus.sqlite
|
||||
SCHEMA: 3l
|
||||
CHECK: ok events 2079 maxSeq 2079 schema 3l
|
||||
B0 path /home/jwoltje/.mosaic-dev/backups/b0-20261022T200642Z
|
||||
B0 SHA256SUMS sha256 365d35e1b5bea8d25d7fd1d1a1b7208519777fae42dcff33e5652878cb115cc6
|
||||
B0 end 2026-10-22T20:06:42.748Z B0_PASS
|
||||
@@ -0,0 +1,6 @@
|
||||
BZ 2026-10-22T19:58:52Z business file copy /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261022T195852Z sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93 (source /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93)
|
||||
D3 2026-10-22T19:59:52Z data-root snapshot /home/jwoltje/.mosaic-dev/backups/d3-20261022T195931Z (STAMP 2026-10-22T19:59:31.330Z, 90872 members, tar exit 0, 0 warning line(s)), SHA256SUMS sha256 a19c2bc1bd24ed7674328088a9755a54c25ec28d4a9fe05c5ba0ac94cbbe2ee2
|
||||
B0 2026-10-22T20:06:42Z store backup /home/jwoltje/.mosaic-dev/backups/b0-20261022T200642Z (ok events 2079 maxSeq 2079 schema 3l), SHA256SUMS sha256 365d35e1b5bea8d25d7fd1d1a1b7208519777fae42dcff33e5652878cb115cc6
|
||||
W0b 2026-10-22T20:12:06Z business file copy /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261022T201206Z sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93 (source /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93)
|
||||
D3 2026-10-22T20:12:29Z data-root snapshot /home/jwoltje/.mosaic-dev/backups/d3-20261022T201210Z (STAMP 2026-10-22T20:12:10.946Z, 90912 members, tar exit 0, 0 warning line(s)), SHA256SUMS sha256 21997f99f1f9d83da06988a208978b456b05a469932e7d0e148e29bfc9936010
|
||||
W5 2026-10-22T20:16:24Z activation 20261022T201621Z-0cbe2e9b35e5 backup /home/jwoltje/.mosaic-dev/backups/stack/20261022T201621Z-0cbe2e9b35e5 STAMP 2026-10-22T20:16:21.766Z SCHEMA 3l SHA256SUMS sha256 a90767e2dab3be8b4605d88d7e645db3ab411ce37a2373843bf8fe3711f5944e
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3, the business file copy that goes with B0 (sage-2967 A2). Plain cp and
|
||||
# sha256sum, as the last window's W0b (window-repin-84f53540d/wsteps.sh:42-50). Nothing reads the file's values.
|
||||
# usage: bz.sh
|
||||
set -uo pipefail
|
||||
WIN=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
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,2 @@
|
||||
-rw------- 1 jwoltje jwoltje 4304 Oct 19 20:39 /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261022T195852Z
|
||||
BZ copy /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261022T195852Z sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93 BZ_PASS
|
||||
@@ -0,0 +1,11 @@
|
||||
# W11 comment text (migrate window 84f53540d to 0cbe2e9b3). Gitea post: Darkwing. P19 post: Sage, as last window (sage-2425).
|
||||
|
||||
The pm read wording is Mos's (mos-1344).
|
||||
|
||||
## Gitea #1704 (row 206)
|
||||
|
||||
Live as of the migrate window to 0cbe2e9b3 (activation 20261022T201621Z-0cbe2e9b35e5, 2026-10-22 20:16:24Z UTC), Darkwing operating under Q173 with Mos's W5 go (mos-1342). W5 stopped the units, backed up the stopped 3l store and migrated it 3l to 3m in one step. The backup is SCHEMA 3l, SHA256SUMS a90767e2. The live 3m store has 24 table rows, 90 triggers, 5 views and 25 indexes, and thread_shares with its index and three append-only triggers holds 0 rows. The five tester threads read the same after W5 as before, by id, message count and sha256. bus-host/sessions.json is now v2. The Console started after W5 on NEW's copy, so nobody restarted it. The crossing pm r410293d04d3d ended with the restart while not working, and the new chief is r148e72c8895d. The share check was skipped with no tester probe, since every share verb refuses the tester (mos-1338). pm read (mos-1341): refused, `pm isn't running, so the tester's message was refused and nothing was stored`, the same refusal as the last window's W9. The chief starts the pm on demand, and none was live after the restart. It wrote one action.refused event, seq 2085, and no message. It isn't a migration fault. A pm launch on 3m is still unproven. P1 to P6, B0, W0 to W6, W9 and W10 passed, with no rollback, restore or prune, and Mos passed the window (mos-1344). STATE report: `agents/darkwing/work/window-migrate-0cbe2e9b3/STATE.md`.
|
||||
|
||||
## P19 (for Sage)
|
||||
|
||||
Migrate window 84f53540d to 0cbe2e9b3 (row 206, #1704) done on dragon-lin, 2026-10-22, with Darkwing operating under Q173. Activation 20261022T201621Z-0cbe2e9b35e5, pointer at 20:16:24Z UTC. W5 migrated the store 3l to 3m; the backup is SCHEMA 3l, SHA256SUMS a90767e2. The live store reads 24 tables, 90 triggers, 5 views, thread_shares 0 rows, and the tester thread reads match the pre-W5 baseline. P1 to P6, B0, W0 to W6, W9 and W10 passed with no rollback, restore or prune; Mos passed the window (mos-1344). The crossing pm r410293d04d3d ended with W5's restart (mos-1343); the new chief is r148e72c8895d. pm read (mos-1341): refused, `pm isn't running, so the tester's message was refused and nothing was stored`, the same refusal as the last window's W9. The chief starts the pm on demand, and none was live after the restart. It wrote one action.refused event, seq 2085, and no message. It isn't a migration fault. A pm launch on 3m is still unproven. STATE: `agents/darkwing/work/window-migrate-0cbe2e9b3/STATE.md`.
|
||||
@@ -0,0 +1,6 @@
|
||||
D3 start 2026-10-22T19:58:16.376Z
|
||||
STOP: tar exit 2: tar: .mosaic-dev/discord/searxng: Cannot open: Permission denied
|
||||
tar: .mosaic-dev/launches/mosaic-stack/r01d35196d72c/tmp/mosaic-business-aiUDhY/s/t: Cannot open: Permission denied
|
||||
tar: .mosaic-dev/launches/mosaic-stack/r01d35196d72c/tmp/mosaic-business-7DhGto/s/t: Cannot open: Permission denied
|
||||
tar: .mosaic-dev/launches/mosaic-stack/r3004f4387cda/tmp/mosaic-business-94565L/s/t: Cannot open: Permission denied
|
||||
tar: .mosaic-dev/launches/mosaic-stack/r3004f4387cda/tmp/mosaic-business-P6N7gu/s/t: Cannot open: Permission denied
|
||||
@@ -0,0 +1,16 @@
|
||||
D3 start 2026-10-22T20:12:10.946Z
|
||||
total 1564224
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 15:12 .
|
||||
drwx------ 12 jwoltje jwoltje 4096 Oct 22 15:12 ..
|
||||
-rw------- 1 jwoltje jwoltje 1601720320 Oct 22 15:12 data-root.tar
|
||||
-rw------- 1 jwoltje jwoltje 57 Oct 22 15:12 MEMBERS
|
||||
-rw------- 1 jwoltje jwoltje 80 Oct 22 15:12 SHA256SUMS
|
||||
-rw------- 1 jwoltje jwoltje 25 Oct 22 15:12 STAMP
|
||||
-rw------- 1 jwoltje jwoltje 0 Oct 22 15:12 WARNINGS
|
||||
size 1.5G
|
||||
MEMBERS: members 90912 tar exit 0 sessions.json sessionsVersion 1
|
||||
WARNINGS: 0 line(s)
|
||||
D3 path /home/jwoltje/.mosaic-dev/backups/d3-20261022T201210Z
|
||||
D3 STAMP 2026-10-22T20:12:10.946Z
|
||||
D3 SHA256SUMS sha256 21997f99f1f9d83da06988a208978b456b05a469932e7d0e148e29bfc9936010
|
||||
D3 end 2026-10-22T20:12:29.986Z D3_PASS
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), D3: a data-root snapshot (PLAN.md "Schema and backups",
|
||||
# sage-2967 A2). 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-0cbe2e9b3
|
||||
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 first run (d3-20261022T195816Z) stopped on tar exit 2: 36 unreadable paths, all 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]+$')
|
||||
[ "$v" = 1 ] || stop "the snapshot's sessions.json is sessionsVersion ${v:-unreadable}, not 1"
|
||||
{ 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,16 @@
|
||||
D3 start 2026-10-22T19:59:31.330Z
|
||||
total 1558384
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 14:59 .
|
||||
drwx------ 10 jwoltje jwoltje 4096 Oct 22 14:59 ..
|
||||
-rw------- 1 jwoltje jwoltje 1595760640 Oct 22 14:59 data-root.tar
|
||||
-rw------- 1 jwoltje jwoltje 57 Oct 22 14:59 MEMBERS
|
||||
-rw------- 1 jwoltje jwoltje 80 Oct 22 14:59 SHA256SUMS
|
||||
-rw------- 1 jwoltje jwoltje 25 Oct 22 14:59 STAMP
|
||||
-rw------- 1 jwoltje jwoltje 0 Oct 22 14:59 WARNINGS
|
||||
size 1.5G
|
||||
MEMBERS: members 90872 tar exit 0 sessions.json sessionsVersion 1
|
||||
WARNINGS: 0 line(s)
|
||||
D3 path /home/jwoltje/.mosaic-dev/backups/d3-20261022T195931Z
|
||||
D3 STAMP 2026-10-22T19:59:31.330Z
|
||||
D3 SHA256SUMS sha256 a19c2bc1bd24ed7674328088a9755a54c25ec28d4a9fe05c5ba0ac94cbbe2ee2
|
||||
D3 end 2026-10-22T19:59:52.152Z D3_PASS
|
||||
@@ -0,0 +1,8 @@
|
||||
# W10 matrix 2026-10-22T20:18:39Z
|
||||
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,9 @@
|
||||
# P6 matrix on OLD 2026-10-22T20:07:58Z
|
||||
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
|
||||
# p6 rc=0
|
||||
@@ -0,0 +1,21 @@
|
||||
// Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m) (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}`);
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), P1 (PLAN.md, sha256 e6d611fc; sage-2967, mos-1338). Read only; nothing stopped.
|
||||
# business-check.mjs runs from the repo copy, checked against SCRIPTS.sha256. From the system config this
|
||||
# prints dataRoot only. A bus.tester other than true stops the window here.
|
||||
set -uo pipefail
|
||||
REPO=/mnt/storage/src/mosaic-stack WIN=$REPO/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
OLD=84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
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 $(sha256sum < $REPO/agents/darkwing/work/window-migrate-0cbe2e9b3/PLAN.md | cut -c1-64) (P0 mos-1338)"
|
||||
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
|
||||
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,55 @@
|
||||
# P1 start 2026-10-22T20:07:35.408Z, REPO HEAD 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
# plan sha256 e6d611fc15ec8b1509c7e54d3c83695a99c80d0730f496904f13679d84b9d92a (P0 mos-1338)
|
||||
# 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
|
||||
business-check.mjs: OK
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"84f53540dd0d21ef179ca29697e172b0246e78d1","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":"3l","activation":"20261022T150555Z-84f53540dd0d","at":"2026-10-22T15:06:00Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-21T21:59:31Z","op":"activate","from":"4429a104f6d65ccf165f6c83b5d1dce3147dfde0","to":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","backup":"20261021T215926Z-7247d80c7af7","activation":"20261021T215926Z-7247d80c7af7","result":"ok"}
|
||||
{"at":"2026-10-22T04:02:56Z","op":"activate","from":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","to":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","backup":null,"activation":"20261022T040256Z-86f95bb27f6c","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"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"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3634254, running, since 2026-10-22T15:05:57.441Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3634311
|
||||
boot: organization file loaded at 2026-10-22T15:05:57.439Z
|
||||
unit flags: match the pointer
|
||||
drift: 81 commit(s) on refactor since the pointer's copy
|
||||
# exit 0
|
||||
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
|
||||
copy 84f53540d: roles 6, projects 1, arbiters 2
|
||||
HOLDS chief instance.name yes
|
||||
HOLDS pm instance.name no
|
||||
LOAD_OK
|
||||
# exit 0
|
||||
|
||||
## P1 data console
|
||||
# dataRoot /home/jwoltje/.mosaic-dev
|
||||
# ls -ld $DATA/console:
|
||||
drwx------ 2 jwoltje jwoltje 4096 Oct 22 10:05 /home/jwoltje/.mosaic-dev/console
|
||||
# ls rc=0
|
||||
# tester.sock path length 45 bytes (limit 107)
|
||||
# P1 end 2026-10-22T20:07:35.841Z
|
||||
# P1 tester.sock 2026-10-22T20:07:40.375Z: socket 600 jwoltje
|
||||
@@ -0,0 +1,49 @@
|
||||
# P2 unit diffs 2026-10-22T20:07:51Z, REPO HEAD 0cbe2e9b3; webui-service.sh and bus-service.sh blobs equal NEW's (P5)
|
||||
## webui: scripts/webui-service.sh render --copy 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 --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/84f53540dd0d21ef179ca29697e172b0246e78d1,
|
||||
---
|
||||
> # Rendered by scripts/webui-service.sh from packages/webui/systemd/; /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0,
|
||||
4c4
|
||||
< # /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1 is the read-only copy `install --copy ID` names, and the flags
|
||||
---
|
||||
> # /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0 is the read-only copy `install --copy ID` names, and the flags
|
||||
18c18
|
||||
< Documentation=file:///home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1/packages/webui/README.md
|
||||
---
|
||||
> Documentation=file:///home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/packages/webui/README.md
|
||||
24c24
|
||||
< WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
---
|
||||
> WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
29c29
|
||||
< ExecStart=/usr/bin/node /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1/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/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
|
||||
# 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 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 --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/84f53540dd0d21ef179ca29697e172b0246e78d1,
|
||||
---
|
||||
> # Rendered by scripts/bus-service.sh from packages/cli/systemd/; /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0,
|
||||
8c8
|
||||
< Documentation=file:///home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1/packages/cli/README.md
|
||||
---
|
||||
> Documentation=file:///home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/packages/cli/README.md
|
||||
14c14
|
||||
< WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
---
|
||||
> WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
30c30
|
||||
< ExecStart=/home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1/scripts/mosaic bus start %i --pm
|
||||
---
|
||||
> ExecStart=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0/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-22T20:07:51Z rc=0
|
||||
P2_UNITS_PASS
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), P2 stub runs (PLAN.md; sage-2967). 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
|
||||
REPO=/mnt/storage/src/mosaic-stack
|
||||
S=$REPO/agents/sage/work/window-plan/repin-de352dfaf
|
||||
NEW=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
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-22T20:07:50Z
|
||||
console-check.sh: OK
|
||||
console-stub.mjs: OK
|
||||
console-stub-tester.mjs: OK
|
||||
## run 1: console-stub.mjs, no tester
|
||||
stub pid 1657707 port 44421
|
||||
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 44421
|
||||
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/p2tfHZAIz
|
||||
stub pid 1657776 port 46055 sock /mnt/storage/scratch/tmp/p2tfHZAIz/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 46055
|
||||
SOCK /mnt/storage/scratch/tmp/p2tfHZAIz/console/tester.sock
|
||||
CALLS []
|
||||
PASS CALLS []
|
||||
PASS socket gone after SIGTERM
|
||||
sweep: no console-stub process left
|
||||
end 2026-10-22T20:07:51Z rc=0
|
||||
P2_STUBS_PASS
|
||||
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), 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
|
||||
REPO=/mnt/storage/src/mosaic-stack
|
||||
OLD=84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
NEW=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
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,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,28 @@
|
||||
decision_events: 22 -> 22
|
||||
decisions: 22 -> 22
|
||||
deliveries: 1935 -> 1935
|
||||
events: 2079 -> 2079
|
||||
gitea_grants: 0 -> 0
|
||||
gitea_users: 0 -> 0
|
||||
host_grants: 0 -> 0
|
||||
hosts: 0 -> 0
|
||||
instance_names: 0 -> 0
|
||||
message_threads: 10 -> 10
|
||||
messages: 635 -> 635
|
||||
meta: 3 -> 3
|
||||
projects: 5 -> 5
|
||||
role_claims: 112 -> 112
|
||||
session_defaults: 5 -> 5
|
||||
sessions: 5 -> 5
|
||||
sqlite_sequence: 14 -> 14
|
||||
task_comment_cursors: 574 -> 574
|
||||
task_snapshots: 541 -> 541
|
||||
thread_claims: 10 -> 10
|
||||
thread_opens: 0 -> 0
|
||||
thread_shares: None -> 0 CHANGED
|
||||
threads: 5 -> 5
|
||||
usage_records: 104 -> 104
|
||||
lookalike_action_allowed backup 0 rehearsal 0
|
||||
any_grant_event backup 0 rehearsal 0
|
||||
{'table': 23, 'trigger': 87, 'view': 5, 'index': 24} ok [('decision_events', 22), ('decisions', 22), ('deliveries', 1935), ('events', 2079), ('messages', 635), ('projects', 5), ('role_claims', 112), ('session_defaults', 5), ('sessions', 5), ('task_comment_cursors', 574), ('task_snapshots', 541), ('thread_claims', 10), ('threads', 5), ('usage_records', 104)]
|
||||
{'table': 24, 'trigger': 90, 'view': 5, 'index': 25} ok [('decision_events', 22), ('decisions', 22), ('deliveries', 1935), ('events', 2079), ('messages', 635), ('projects', 5), ('role_claims', 112), ('session_defaults', 5), ('sessions', 5), ('task_comment_cursors', 574), ('task_snapshots', 541), ('thread_claims', 10), ('threads', 5), ('usage_records', 104)]
|
||||
@@ -0,0 +1 @@
|
||||
2026-10-22T20:08:53.136Z
|
||||
@@ -0,0 +1,18 @@
|
||||
2026-10-22T20:09:13Z
|
||||
receipt lines before: 1
|
||||
host pid 1678927 console pid 1678980
|
||||
healthz: {"ok":true} 200
|
||||
api/config: {"board":"http://127.0.0.1:7331","send":false,"edit":false} 200
|
||||
api/config Host public: {"error":"sign-in required"} 401
|
||||
socket 600 jwoltje /home/jwoltje/.mosaic-dev/rehearsals/20261022T200849Z-0cbe2e9b35e5/data/console/tester.sock
|
||||
dir 700 jwoltje /home/jwoltje/.mosaic-dev/rehearsals/20261022T200849Z-0cbe2e9b35e5/data/console
|
||||
tester GET /api/config: {"status":200,"text":"{\"board\":\"http://127.0.0.1:7331\",\"tester\":true,\"send\":false,\"edit\":false}","body":{"board":"http://127.0.0.1:7331","tester":true,"send":false,"edit":false}}
|
||||
rc=0
|
||||
tester GET /api/bus/agents: {"status":200,"text":"{\"rows\":[{\"seq\":111,\"at\":\"2026-10-22T15:05:59.297Z\",\"business\":\"mosaic-stack\",\"role\":\"chief\",\"op\":\"claim\",\"holder_run\":\"re6c69f1ec1f0\",\"harness\":\"claude-code\",\"address\":null,\"by\":\"re6c69f1ec1f0\",\"reason\":null,\"decision\":null,\"state\":\"idle\",\"working\":null,\"inputNeeded\":[],\"stranded\":[]},{\"seq\":112,\"at\":\"2026-10-22T15:24:01.2
|
||||
rc=0
|
||||
console exit 0
|
||||
host exit 0
|
||||
writer.lock released
|
||||
receipt lines after: 2
|
||||
library lines: 0
|
||||
2026-10-22T20:09:14Z
|
||||
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
set -u
|
||||
R=/home/jwoltje/.mosaic-dev/rehearsals/20261022T200849Z-0cbe2e9b35e5
|
||||
C=/home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
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 @@
|
||||
0
|
||||
Whitespace-only changes.
@@ -0,0 +1,25 @@
|
||||
PASS copy: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0, schema 3m
|
||||
PASS port: 127.0.0.1:7341 is free
|
||||
PASS backup: /home/jwoltje/.mosaic-dev/backups/b0-20261022T200642Z matches its SHA256SUMS
|
||||
PASS scratch-root: /home/jwoltje/.mosaic-dev/rehearsals/20261022T200849Z-0cbe2e9b35e5/data from the backup, config and business file under /home/jwoltje/.mosaic-dev/rehearsals/20261022T200849Z-0cbe2e9b35e5/config, business.diff beside them
|
||||
PASS data-root-live: /home/jwoltje/.mosaic-dev/rehearsals/20261022T200849Z-0cbe2e9b35e5/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-20261022T200642Z schema 3l
|
||||
PASS new-refuses-old-store: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 refuses the 3l store at a normal open
|
||||
PASS migrate: 3l to 3m
|
||||
PASS new-opens-migrated
|
||||
PASS migrate-again: a second run is a no-op
|
||||
PASS old-refuses-migrated: 84f53540dd0d21ef179ca29697e172b0246e78d1 refuses the 3m store
|
||||
PASS gate: host-up, bus-status, console-up, healthz and copy-match on 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
PASS no-session: no sessions.json and no launches under /home/jwoltje/.mosaic-dev/rehearsals/20261022T200849Z-0cbe2e9b35e5/data
|
||||
PASS console-stopped: pid 1669719
|
||||
PASS host-stopped: pid 1669717
|
||||
PASS host-released-store
|
||||
PASS backup-unchanged
|
||||
PASS live-config-unchanged
|
||||
REHEARSAL_PASS
|
||||
rehearsal directory: /home/jwoltje/.mosaic-dev/rehearsals/20261022T200849Z-0cbe2e9b35e5
|
||||
@@ -0,0 +1 @@
|
||||
2026-10-22T20:08:49.139Z
|
||||
@@ -0,0 +1,6 @@
|
||||
# P4 2026-10-22T20:07:58Z
|
||||
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
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env bash
|
||||
# P4-P6 of agents/darkwing/work/window-migrate-0cbe2e9b3/PLAN.md (sha256 e6d611fc; sage-2967), from window-repin-86f95bb27/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
|
||||
REPO=/mnt/storage/src/mosaic-stack
|
||||
WIN=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
NEW=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
FILES=(scripts/stack-release.sh scripts/webui-service.sh scripts/bus-service.sh scripts/stack-copy.sh)
|
||||
# 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.
|
||||
# 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.
|
||||
OLD=84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
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,8 @@
|
||||
# P5 2026-10-22T20:07:58Z; HEAD 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
# git diff --quiet 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 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 5bb443c19ed843dd67f6271016500397310dd54c NEW blob 5bb443c19ed843dd67f6271016500397310dd54c
|
||||
# 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,2 @@
|
||||
login darkwing ok
|
||||
#1704 comment 30809 posted, read back equal 2026-10-22T20:20:45Z
|
||||
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 0cbe2e9b3 W11: post comments.md's Gitea body on #1704 as darkwing, read it back.
|
||||
set -uo pipefail
|
||||
REPO=/mnt/storage/src/mosaic-stack
|
||||
WIN=$REPO/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
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 1704; 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-22T20:07:58Z
|
||||
/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 31be82ade28c2fa7 keys ["rows","at"] agents 2
|
||||
# exit 0
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3, 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-0cbe2e9b3
|
||||
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 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m) step wrapper (sage-2967): 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-0cbe2e9b3
|
||||
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 2s
|
||||
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/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), W0 (PLAN.md; sage-2967): make NEW's copy, then check it.
|
||||
# Creates files under copies/ only; nothing live changes. Launch from /.
|
||||
set -uo pipefail
|
||||
REPO=/mnt/storage/src/mosaic-stack WIN=$REPO/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
NEW=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
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
|
||||
echo "end $(date -u +%FT%TZ) fail=$fail"
|
||||
exit $fail
|
||||
@@ -0,0 +1,27 @@
|
||||
start 2026-10-22T20:07:41Z
|
||||
stack-copy rc=0
|
||||
copied: /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
npm warn deprecated [email protected]: Use your platform's native DOMException instead
|
||||
|
||||
added 128 packages in 2s
|
||||
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/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
/dev/nvme1n1p5 458G 396G 39G 92% /home
|
||||
copy 0cbe2e9b3: roles 6, projects 1, arbiters 2
|
||||
HOLDS chief instance.name yes
|
||||
HOLDS pm instance.name no
|
||||
LOAD_OK
|
||||
end 2026-10-22T20:07:43Z fail=0
|
||||
@@ -0,0 +1,18 @@
|
||||
# W10 start 2026-10-22T20:18:39Z, TMPDIR /mnt/storage/scratch/tmp/gRgU5vJ
|
||||
|
||||
## 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 320 bytes sha256 3b69107b3ac00868 keys ["rows","at"] agents 1 (exit 0)
|
||||
# tester /api/bus/agents 200, agents 1 (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-22T20:18:40Z FAIL=0
|
||||
W10_PASS
|
||||
W10_RC=0
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), W10 (PLAN.md sha256 e6d611fc, the W10 row; go mos-1343), adapted from window-repin-84f53540d/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.
|
||||
# usage: w10.sh
|
||||
set -uo pipefail
|
||||
WIN=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
NEW=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
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)
|
||||
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 1; 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,4 @@
|
||||
# W5 pre-read (mos-1342 condition 1) start 2026-10-22T20:15:36Z
|
||||
# W5 pre-read PASS 2026-10-22T20:15:36Z: chief re6c69f1ec1f0 standing, not working; pm r410293d04d3d live, crossing, not working; no third launch
|
||||
/usr/bin/bash: line 1: ./w5.sh: Permission denied
|
||||
W5_DRIVER_RC=126
|
||||
@@ -0,0 +1,20 @@
|
||||
# W5 pre-read (mos-1342 condition 1) start 2026-10-22T20:16:20Z
|
||||
# W5 pre-read PASS 2026-10-22T20:16:21Z: chief re6c69f1ec1f0 standing, not working; pm r410293d04d3d live, crossing, not working; no third launch
|
||||
# W5 go mos-1342, start 2026-10-22T20:16:21Z
|
||||
# condition 3 recheck: tool blob 5bb443c19ed8, plan e6d611fc, 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/20261022T201621Z-0cbe2e9b35e5
|
||||
stack-release: stopped both units
|
||||
stack-release: stopped store schema: 3l
|
||||
stack-release: backup: /home/jwoltje/.mosaic-dev/backups/stack/20261022T201621Z-0cbe2e9b35e5
|
||||
stack-release: migrated the store to 3m
|
||||
stack-release: installed 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
stack-release: gate passed on 0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
stack-release: activate ok: 0cbe2e9b35e51fe06dedde69c022b46e040f98c0 is live for mosaic-stack
|
||||
# exit 0
|
||||
# W5 exit 0, W5.start 2026-10-22T20:16:21Z, end 2026-10-22T20:16:24Z
|
||||
# W5: activation 20261022T201621Z-0cbe2e9b35e5, backup /home/jwoltje/.mosaic-dev/backups/stack/20261022T201621Z-0cbe2e9b35e5, STAMP 2026-10-22T20:16:21.766Z, SCHEMA 3l, SHA256SUMS sha256 a90767e2dab3be8b4605d88d7e645db3ab411ce37a2373843bf8fe3711f5944e (sums check OK)
|
||||
# W5 launched lines in the bus journal since W5.start: 1: launched chief: run r148e72c8895d, claude-code claude-opus-5-5
|
||||
# W5 status: pointer NEW, pm true, 3m, check pass, unit flags match. W5_PASS 2026-10-22T20:16:24Z
|
||||
# W5 restore plan exit 0: restore: the store must go back to 3l; needs --restore 20261022T201621Z-0cbe2e9b35e5
|
||||
W5_DRIVER_RC=0
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), W5 (PLAN.md sha256 e6d611fc, the W5 row). 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: 3l" and "migrated the store to 3m". Records the activation id, backup path, STAMP and the backup's
|
||||
# SHA256SUMS sha256, then status (schema 3m), 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
|
||||
REPO=/mnt/storage/src/mosaic-stack
|
||||
WIN=$REPO/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
OLD=84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
NEW=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
PLAN=$WIN/PLAN.md
|
||||
PLAN_SHA=e6d611fc15ec8b1509c7e54d3c83695a99c80d0730f496904f13679d84b9d92a
|
||||
TOOL_BLOB=5bb443c19ed843dd67f6271016500397310dd54c
|
||||
DATA=/home/jwoltje/.mosaic-dev
|
||||
W=$WIN/W.txt
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
stop() { note "STOP: $*"; exit 1; }
|
||||
sha() { sha256sum < "$1" | cut -c1-64; }
|
||||
|
||||
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"
|
||||
[ "$(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 e6d611fc; run W3 again and send it to Mos"
|
||||
[ -z "$(git -C $REPO status --porcelain -- scripts/stack-release.sh scripts/webui-service.sh scripts/bus-service.sh scripts/stack-copy.sh)" ] || 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 5bb443c19ed8, plan e6d611fc, 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: 3l" $WIN/W5.txt || stop "W5: no stopped store schema: 3l line"
|
||||
grep -qx "stack-release: migrated the store to 3m" $WIN/W5.txt || stop "W5: no migrated the store to 3m 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)" = 3l ] || stop "W5 backup SCHEMA is not 3l"
|
||||
( 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":"3m"' $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, 3m, 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' ' ')"
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), the read right before W5 (mos-1342 condition 1): agents --tester
|
||||
# and launches list again, with W1's rule (mos-1340). Stops on the chief working, the pm working, or a live launch
|
||||
# other than the standing chief re6c69f1ec1f0 and the crossing pm r410293d04d3d. Starts and stops nothing.
|
||||
# usage: w5pre.sh
|
||||
set -uo pipefail
|
||||
WIN=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
MOSAIC=$HOME/.npm-global/bin/mosaic
|
||||
W=$WIN/W.txt
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
stop() { note "STOP: $*"; exit 1; }
|
||||
CHIEF_RUN=re6c69f1ec1f0 PM_RUN=r410293d04d3d
|
||||
|
||||
note "W5 pre-read (mos-1342 condition 1) 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 " -e "^$PM_RUN " | grep .)
|
||||
[ -z "$other" ] || stop "W5 pre: a live launch other than $CHIEF_RUN and $PM_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"
|
||||
pm=gone; grep -q "^$PM_RUN mosaic-stack/pm " $WIN/.w5pre-launches.txt && pm="live, crossing"
|
||||
note "W5 pre-read PASS $(date -u +%FT%TZ): chief $CHIEF_RUN standing, not working; pm $PM_RUN $pm, not working; no third launch"
|
||||
@@ -0,0 +1,18 @@
|
||||
# W6 start 2026-10-22T20:16:35Z
|
||||
# W6 status: "copy":"0cbe2e9b35e51fe06dedde69c022b46e040f98c0" "pm":true "schema":"3m"
|
||||
types table=24 trigger=90 view=5 index=25
|
||||
schema_version 3m
|
||||
missing none
|
||||
thread_shares_rows 0
|
||||
events 2084 maxSeq 2084
|
||||
COUNTS_OK
|
||||
# W6 agents: chief r148e72c8895d claude-code since 2026-10-22T20:16:24.301Z;
|
||||
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-22T20:16:24Z
|
||||
# W6_PASS 2026-10-22T20:16:40Z
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), W6 (PLAN.md W6 row, Mos's checks from sage-2967; mos-1342
|
||||
# condition 3 lets it run straight after a W5 pass). Everything here only reads:
|
||||
# status shows the pointer on NEW at 3m
|
||||
# a python3 -B read-only count of the live store: 24 table rows, 90 triggers, 5 views (mos-1338 item 1), 25
|
||||
# indexes (P3's 3m rehearsal count), meta schema_version 3m, thread_shares with its index and 3 triggers by
|
||||
# name, and 0 rows in it
|
||||
# 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 once the host wrote it, or still 1); 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
|
||||
WIN=/mnt/storage/src/mosaic-stack/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
NEW=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
DATA=/home/jwoltje/.mosaic-dev
|
||||
MOSAIC=$HOME/.npm-global/bin/mosaic
|
||||
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":"3m"' $WIN/W6-status.txt || fail "status: schema is not 3m"
|
||||
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"]
|
||||
rows = c.execute("select count(*) from thread_shares").fetchone()[0] if "thread_shares" in names else None
|
||||
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("thread_shares_rows", rows)
|
||||
print("events", ev[0], "maxSeq", ev[1])
|
||||
ok = (types.get("table"), types.get("trigger"), types.get("view"), types.get("index")) == (24, 90, 5, 25) \
|
||||
and sv and sv[0] == "3m" and all(n in names for n in want) and rows == 0
|
||||
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 "*|"1 "*) ;; *) fail "sessions.json unreadable or an unknown version: $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,68 @@
|
||||
# W9 after W5 (go mos-1343), W5.start 2026-10-22T20:16:21Z, start 2026-10-22T20:18:28Z
|
||||
# plan e6d611fc, tool blob 5bb443c19ed8, console-check.sh d068fe02, wrapper on NEW: checked
|
||||
# Console: unit active, pid 1791122, started 2026-10-22T20:16:22Z, cwd /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
# bus: unit active, pid 1791120, cwd /home/jwoltje/.local/share/mosaic-stack/copies/0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
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: 1 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
|
||||
r148e72c8895d mosaic-stack/chief claude-code claude-opus-5-5 by jason since 2026-10-22T20:16:24.291Z running
|
||||
# exit 0
|
||||
[
|
||||
{
|
||||
"business": "mosaic-stack",
|
||||
"instance": "chief",
|
||||
"run": "r148e72c8895d",
|
||||
"launchedBy": "jason",
|
||||
"harness": "claude-code",
|
||||
"model": "claude-opus-5-5",
|
||||
"provider": "anthropic",
|
||||
"modelKey": "opus",
|
||||
"pid": 1791348,
|
||||
"startTime": "80137447",
|
||||
"runnerPid": 1791349,
|
||||
"runnerStartTime": "80137447",
|
||||
"runDir": "/home/jwoltje/.mosaic-dev/launches/mosaic-stack/r148e72c8895d",
|
||||
"startedAt": "2026-10-22T20:16:24.291Z",
|
||||
"live": true
|
||||
}
|
||||
]
|
||||
# exit 0
|
||||
# one running chief from this start: run r148e72c8895d
|
||||
# pm: no pm launch is listed before the pm read (r410293d04d3d ended with W5's restart, not working; mos-1343)
|
||||
chief r148e72c8895d claude-code since 2026-10-22T20:16:24.301Z
|
||||
# exit 0
|
||||
# W9 checks PASS 2026-10-22T20:18:29Z
|
||||
mosaic: pm isn't running, so the tester's message was refused and nothing was stored
|
||||
# exit 3
|
||||
# pm read exit 3 at 2026-10-22T20:18:29Z; expected 1.15 with 85 ids
|
||||
# W9 end 2026-10-22T20:18:29Z W9_CHECKS_PASS
|
||||
W9_RC=0
|
||||
+109
@@ -0,0 +1,109 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), W9 (PLAN.md sha256 e6d611fc, the W9 row; go mos-1343). Adapted
|
||||
# from window-repin-84f53540d/w9.sh. The PLAN adds no test data, so the talk chief, project create, thread create,
|
||||
# talk --thread, names and usage turns are gone. Added: mos-1338 item 4, the Console's MainPID, start time, cwd
|
||||
# and unit state, which stop and go to Mos if the start is before W5.start, the cwd isn't NEW's copy, or the unit
|
||||
# isn't active (Mos restarts it, never me). And mos-1341's one `talk pm --wait 180 --tester` requirements read,
|
||||
# expecting 1.15 with 85 ids, which reports and doesn't stop. The launches and agents checks run before the pm read,
|
||||
# since the talk wakes the pm. 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
|
||||
REPO=/mnt/storage/src/mosaic-stack
|
||||
WIN=$REPO/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
NEW=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
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)
|
||||
PLAN=$WIN/PLAN.md
|
||||
PLAN_SHA=e6d611fc15ec8b1509c7e54d3c83695a99c80d0730f496904f13679d84b9d92a
|
||||
TOOL_BLOB=5bb443c19ed8
|
||||
CC=$REPO/agents/sage/work/window-plan/repin-de352dfaf/console-check.sh
|
||||
CC_SHA=d068fe02da897b700110a162d13d9671fe5994f053c45aff99113fade737094c
|
||||
DATA=$HOME/.mosaic-dev
|
||||
COPY=$HOME/.local/share/mosaic-stack/copies/$NEW
|
||||
MOSAIC=$HOME/.npm-global/bin/mosaic
|
||||
BZ=(--business mosaic-stack)
|
||||
W=$WIN/W.txt
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
stop() { note "STOP: $*"; exit 1; }
|
||||
sha() { sha256sum < "$1" | cut -c1-64; }
|
||||
step() { local f="$1"; shift; $WIN/w.sh W.txt "$@" > "$WIN/$f"; local rc=$?; cat "$WIN/$f"; return $rc; }
|
||||
|
||||
note "W9 after W5 (go mos-1343), W5.start $W5_ISO, start $(date -u +%FT%TZ)"
|
||||
[ "$(sha $PLAN)" = "$PLAN_SHA" ] || stop "the plan file is not e6d611fc"
|
||||
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 e6d611fc, tool blob $TOOL_BLOB, 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":"3m"' $WIN/.w9-status.txt || stop "W9 status: pointer not on NEW, pm true, 3m"
|
||||
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 && note "pm: a pm launch is listed before the pm read" || note "pm: no pm launch is listed before the pm read (r410293d04d3d ended with W5's restart, not working; mos-1343)"
|
||||
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 checks PASS $(date -u +%FT%TZ)"
|
||||
|
||||
# mos-1341: the one pm read. Reports, does not stop; anything but 1.15 with 85 ids, or no answer in 180 s, goes to Mos.
|
||||
step .w9-talk-pm.txt "W9 talk pm --wait 180 --tester" $MOSAIC talk pm "[mos test] migrate window $NEW: read packages/tasks/requirements.json through your requirements read and reply with one line: the version and the number of ids" --wait 180 "${BZ[@]}" --tester
|
||||
note "pm read exit $? at $(date -u +%FT%TZ); expected 1.15 with 85 ids"
|
||||
note "W9 end $(date -u +%FT%TZ) W9_CHECKS_PASS"
|
||||
@@ -0,0 +1,50 @@
|
||||
# W0b-W4 start 2026-10-22T20:12:06Z
|
||||
# plan e6d611fc, tool blob 5bb443c19ed8, P5 four scripts at NEW and clean, business-check.mjs eece4d46: checked 2026-10-22T20:12:06Z
|
||||
# W0 copy present, w0.txt LOAD_OK
|
||||
# W0b: /home/jwoltje/.config/mosaic-dev/businesses/mosaic-stack.json.pre-window-20261022T201206Z, sha256 1e49bdf05e62607972958f5b7298cfd600c7825812370e26d7c2a842f2af9b93, recorded in backups.txt
|
||||
# W1 launches: chief re6c69f1ec1f0 standing (OLD's activation), pm r410293d04d3d live and recorded as crossing (mos-1338, mos-1340)
|
||||
# W1 start stamp 2026-10-22T20:12:07Z
|
||||
# SNAP sha256 639fd28a checked before S1
|
||||
# S1.json sha256 75dad65ccfd787c36b07c0815f9bc844ab111892ffafe3dcf8a715c26ff10abd
|
||||
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-20261022T201210Z, STAMP 2026-10-22T20:12:10.946Z, SHA256SUMS sha256 21997f99f1f9d83da06988a208978b456b05a469932e7d0e148e29bfc9936010, members 90912 tar exit 0 sessions.json sessionsVersion 1
|
||||
pointer: /home/jwoltje/.mosaic-dev/state/stack-active.json
|
||||
{"copy":"84f53540dd0d21ef179ca29697e172b0246e78d1","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":"3l","activation":"20261022T150555Z-84f53540dd0d","at":"2026-10-22T15:06:00Z"}
|
||||
log (last five lines):
|
||||
{"at":"2026-10-21T21:59:31Z","op":"activate","from":"4429a104f6d65ccf165f6c83b5d1dce3147dfde0","to":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","backup":"20261021T215926Z-7247d80c7af7","activation":"20261021T215926Z-7247d80c7af7","result":"ok"}
|
||||
{"at":"2026-10-22T04:02:56Z","op":"activate","from":"7247d80c7af7ffa70fc61557406bf491cdf3bfc7","to":"86f95bb27f6cb237bf9fa9ba53320bace6c4de0b","backup":null,"activation":"20261022T040256Z-86f95bb27f6c","result":"started","interpreter":"{\"path\":\"/usr/bin/python3.14\",\"version\":[3,14,6],\"dev\":66308,\"ino\":3968163,\"sha256\":\"8735f172622a7f8d27e293fd0fd36fc55c4cb9b663b6630d33b57870e36c24cc\"}"}
|
||||
{"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"}
|
||||
check:
|
||||
bus: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
Console: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
CLI: /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
result: pass
|
||||
bus status:
|
||||
host: mosaic-stack, pid 3634254, running, since 2026-10-22T15:05:57.441Z, notifier off
|
||||
socket: present
|
||||
writer.lock: pid 3634311
|
||||
boot: organization file loaded at 2026-10-22T15:05:57.439Z
|
||||
unit flags: match the pointer
|
||||
drift: 81 commit(s) on refactor since the pointer's copy
|
||||
# exit 0
|
||||
# W3-plan.txt sha256 bbd65456ad0d47c626bf095f2ecaf644411768bc693357c13bbcf4111a977eed
|
||||
# W3 commit list lines left out of the flag checks: 81
|
||||
# W3 plan checks: OLD to NEW, 3l to 3m in one step, 81 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/84f53540dd0d21ef179ca29697e172b0246e78d1/scripts/mosaic ; argv[]=/home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1/scripts/mosaic bus start mosaic-stack --pm ; ignore_errors=no ; start_time=[Thu 2026-10-22 10:05:57 CDT] ; stop_time=[n/a] ; pid=3634254 ; code=(null) ; status=0/0 }
|
||||
WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
# exit 0
|
||||
DropInPaths=
|
||||
ExecStart={ path=/usr/bin/node ; argv[]=/usr/bin/node /home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1/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=[Thu 2026-10-22 10:05:57 CDT] ; stop_time=[n/a] ; pid=3634256 ; code=(null) ; status=0/0 }
|
||||
WorkingDirectory=/home/jwoltje/.local/share/mosaic-stack/copies/84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
# 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-22T20:12:30Z
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
#!/usr/bin/env bash
|
||||
# Migrate window 84f53540d to 0cbe2e9b3 (3l to 3m), W0b-W4 (PLAN.md sha256 e6d611fc, P0 mos-1338; sage-2967; W go
|
||||
# mos-1339). W0 ran in prep (w0.txt). Adapted from window-repin-84f53540d/wsteps.sh: W1 takes mos-1340's launch rule
|
||||
# and runs d3.sh again after S1, and W3 checks 3l to 3m in one step. 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
|
||||
REPO=/mnt/storage/src/mosaic-stack
|
||||
WIN=$REPO/agents/darkwing/work/window-migrate-0cbe2e9b3
|
||||
OLD=84f53540dd0d21ef179ca29697e172b0246e78d1
|
||||
NEW=0cbe2e9b35e51fe06dedde69c022b46e040f98c0
|
||||
PLAN=$WIN/PLAN.md
|
||||
PLAN_SHA=e6d611fc15ec8b1509c7e54d3c83695a99c80d0730f496904f13679d84b9d92a
|
||||
TOOL_BLOB=5bb443c19ed843dd67f6271016500397310dd54c
|
||||
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
|
||||
DATA=/home/jwoltje/.mosaic-dev
|
||||
SNAP=$REPO/agents/darkwing/work/window-repin-84f53540d/snapshot.mjs
|
||||
SNAP_SHA=639fd28a2674aaa03ce824e3394b4052f21cdef7d6fa49bae61a9927ed341e67
|
||||
MOSAIC=$HOME/.npm-global/bin/mosaic
|
||||
W=$WIN/W.txt
|
||||
note() { echo "# $*" >> "$W"; echo "# $*"; }
|
||||
stop() { note "STOP: $*"; exit 1; }
|
||||
sha() { sha256sum < "$1" | cut -c1-64; }
|
||||
|
||||
note "W0b-W4 start $(date -u +%FT%TZ)"
|
||||
[ "$(sha $PLAN)" = "$PLAN_SHA" ] || stop "the plan file is not e6d611fc (P0 checked that sha)"
|
||||
[ "$(git -C $REPO rev-parse HEAD:scripts/stack-release.sh)" = "$TOOL_BLOB" ] || stop "tool blob moved"
|
||||
git -C $REPO diff --quiet $NEW HEAD -- scripts/stack-release.sh scripts/webui-service.sh scripts/bus-service.sh scripts/stack-copy.sh || stop "P5: the four scripts differ from NEW"
|
||||
[ -z "$(git -C $REPO status --porcelain -- scripts/stack-release.sh scripts/webui-service.sh scripts/bus-service.sh scripts/stack-copy.sh)" ] || stop "P5: the four scripts are dirty"
|
||||
[ "$(sha $BC)" = "$BC_SHA" ] || stop "business-check.mjs sha"
|
||||
note "plan e6d611fc, tool blob 5bb443c19ed8, 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: re6c69f1ec1f0 is the standing chief launch from OLD's activation and r410293d04d3d crosses the window.
|
||||
# Any other live launch is a third one and goes to Mos before S1.
|
||||
CHIEF_RUN=re6c69f1ec1f0 PM_RUN=r410293d04d3d
|
||||
other=$(grep -v '^# ' $WIN/.w1-launches.txt | grep -v -e "^$CHIEF_RUN " -e "^$PM_RUN " | grep .)
|
||||
[ -z "$other" ] || stop "W1: a live launch other than $CHIEF_RUN and $PM_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"
|
||||
if grep -q "^$PM_RUN mosaic-stack/pm " $WIN/.w1-launches.txt; then
|
||||
note "W1 launches: chief $CHIEF_RUN standing (OLD's activation), pm $PM_RUN live and recorded as crossing (mos-1338, mos-1340)"
|
||||
else
|
||||
note "W1 launches: chief $CHIEF_RUN standing (OLD's activation); pm $PM_RUN no longer listed"
|
||||
fi
|
||||
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, sessions.json v1 included, 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 (3l to 3m 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: 3l (read from the store the running bus holds)" $P3L || stop "W3: store schema line"
|
||||
grep -qx "target schema: 3m" $P3L || stop "W3: target schema is not 3m"
|
||||
grep -qx "migration: 3l to 3m, after a backup of the stopped store" $P3L || stop "W3: migration line is not 3l to 3m"
|
||||
grep -qx "migration steps: 3l to 3m" $P3L || stop "W3: migration steps are not 3l to 3m"
|
||||
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 81 (newest first, at most 200):" $P3L || stop "W3: commit count is not 81"
|
||||
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, 3l to 3m in one step, 81 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)"
|
||||
Reference in new issue
Block a user