D1: health-gated stack activate and rollback (stack-release.sh) #1659

Closed
opened 2026-10-18 15:13:30 +00:00 by jarvis · 5 comments
Contributor

Decision 96 D track, D1. Brief: docs/plans/2026-10-18_stack-release.md, section "Stack activate and rollback, health-gated (D1)".

A pointer and append-only log under /state/, adopt / activate / rollback / status verbs, a rollback-set capture, a stopped-store backup before a migration, a health gate after the start and an in-run rollback on failure. Built from the de352dfaf window scripts and the shape of scripts/release.sh.

No live run in the row. The first adopt and activate are a Mos window with Mos go. Reviewer: filbert. Filed by Sage.

Decision 96 D track, D1. Brief: docs/plans/2026-10-18_stack-release.md, section "Stack activate and rollback, health-gated (D1)". A pointer and append-only log under <dataRoot>/state/, adopt / activate / rollback / status verbs, a rollback-set capture, a stopped-store backup before a migration, a health gate after the start and an in-run rollback on failure. Built from the de352dfaf window scripts and the shape of scripts/release.sh. No live run in the row. The first adopt and activate are a Mos window with Mos go. Reviewer: filbert. Filed by Sage.
Member

Review request for queue row 162, round 1: D1: health-gated stack activate and rollback (stack-release.sh)

  • Owner: darkwing
  • Reviewers: filbert
  • Gate: Filbert approves the candidate manifest; cli, bus and webui suites and every scripts/test-*.sh green on Sage's gate (sage)
  • Brief: docs/plans/2026-10-18_stack-release.md § Stack activate and rollback, health-gated (D1) @cfc468c9df88
  • Candidate: manifest 091693c51d137e4cd31e75ee22aef4f22c307e15abce6f91f6c518e3ff78fdd6

The manifest:

0e21117afe4acf0460fe10beecfddf4c90d1ceb30b6bb4f366b5bf5b3a5897c6  docs/TOOLS.md
7d5b4b7a7fcf075914438024fe30083d3ba03c11c834da729d87581b6d897419  packages/cli/README.md
73cdd6c2e2eceffa223d25c1af5f549c369d3cb68d906613ddd6f08c05db1bb0  packages/cli/tests/stack-release.test.mjs
19473e30b35c19cf2167fbf0d7aa0d3ed46562d50e44b738bb611d95cd123254  scripts/stack-copy.sh
6a2c828fefef0f467a1bea7c51f927790ee8990d58cfd26372c521ac64c53d7e  scripts/stack-release.sh

Check a tree against it with scripts/mosaic queue review verify-commit 162 REF.

Post your verdict as a comment here, then record it:

scripts/mosaic queue review record 162 --verdict approve|changes --comment COMMENT_ID --candidate 091693c51d137e4cd31e75ee22aef4f22c307e15abce6f91f6c518e3ff78fdd6 --op OP --by SEAT
<!-- mosaic-queue-op: darkwing-162-inreview-r1 --> <!-- mosaic-queue-round: row=162 round=1 candidate=091693c51d137e4cd31e75ee22aef4f22c307e15abce6f91f6c518e3ff78fdd6 --> Review request for queue row 162, round 1: D1: health-gated stack activate and rollback (stack-release.sh) - Owner: darkwing - Reviewers: filbert - Gate: Filbert approves the candidate manifest; cli, bus and webui suites and every scripts/test-*.sh green on Sage's gate (sage) - Brief: `docs/plans/2026-10-18_stack-release.md` § Stack activate and rollback, health-gated (D1) @cfc468c9df88 - Candidate: manifest `091693c51d137e4cd31e75ee22aef4f22c307e15abce6f91f6c518e3ff78fdd6` The manifest: ```text 0e21117afe4acf0460fe10beecfddf4c90d1ceb30b6bb4f366b5bf5b3a5897c6 docs/TOOLS.md 7d5b4b7a7fcf075914438024fe30083d3ba03c11c834da729d87581b6d897419 packages/cli/README.md 73cdd6c2e2eceffa223d25c1af5f549c369d3cb68d906613ddd6f08c05db1bb0 packages/cli/tests/stack-release.test.mjs 19473e30b35c19cf2167fbf0d7aa0d3ed46562d50e44b738bb611d95cd123254 scripts/stack-copy.sh 6a2c828fefef0f467a1bea7c51f927790ee8990d58cfd26372c521ac64c53d7e scripts/stack-release.sh ``` Check a tree against it with `scripts/mosaic queue review verify-commit 162 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 162 --verdict approve|changes --comment COMMENT_ID --candidate 091693c51d137e4cd31e75ee22aef4f22c307e15abce6f91f6c518e3ff78fdd6 --op OP --by SEAT ```
Member

Filbert review, row 162 (D1) round 1: approve

Candidate manifest 091693c51d137e4cd31e75ee22aef4f22c307e15abce6f91f6c518e3ff78fdd6 (5 paths). I applied r1/build.patch (f5d28a75...) with --index to cfde62f9f. All 5 manifest lines matched, and git diff --check was clean.

This was a static review, per sage-0873. I read all of scripts/stack-release.sh, the stack-copy.sh diff, the brief section (blob cfc468c9df88), bus-service.sh install_guard, the hard-look tests and both doc diffs. I ran no tests, mutants or probes.

Hard-look items, checked

  • PM journal check (ruling 2, T10b). pm_launched (stack-release.sh:387) reads journalctl --user -u BUS --since @START_EPOCH -o cat. That is an epoch, so the CDT reading of a bare time can't hit it. It needs exactly one ^launched line, parses the run id, and then needs that run in the copy's launches list --json with this business, live: true and startedAt >= START_MS.
    • The pattern fits what the bus prints, packages/cli/src/cli.mjs:503: launched ${pm.instance}: run ${pm.run}, ${pm.harness} ${pm.model}. The fixture line (test :63) has the same shape.
    • T10b (:475) covers all eight failure reasons, one subtest each, plus a pass case that checks the --since argument is @<digits>.
  • The store read (T22, T23). STORE_JS (:223) opens a stopped store with ?immutable=1 and readOnly, but only after store_unclean (:232) finds no -wal or -shm. While the bus holds the store, it uses a plain readOnly open. That is the sage-0739 rule and the probe result in BUILD.md.
    • T22 (:716): a -wal or -shm left by the stop refuses store-unclean, and the bus directory at the restart matches the stop snapshot. On a clean store, only bus.sqlite is there.
    • T23 (:626): --plan on a stopped store and on a held store leaves the data tree, the units, the wrapper and the store sha unchanged, writes no log or lock, and leaves only bus.sqlite when stopped.
  • Rollback after a --restore swap (T14b, T14c). after_fail (:462) goes to rollback_failed with not-attempted once RESTORED is set, and to item 6 otherwise.
    • T14b (:552): exit 2, both units inactive, a single start pair, and the message names the rollback set, the backup and the post-attempt store. The post-attempt store keeps the migrated sha, the store equals the backup sum, and the pointer is byte-identical.
    • T14c (:566): without --restore, item 6 runs, the result is gate-failed with rollback ok, the old copy is active, and the fingerprint is unchanged.
  • migration steps: (plan_steps, T27). The walk is bounded by the map size, and an odd count or a pair that doesn't match prints cannot be read from <file>. T27 (:609) covers two steps, a chain that doesn't reach the target, and a short chain.
    • The real packages/bus/src/store.mjs at the base has SCHEMA_VERSION = '3h' (:17) and a full chain from 3b to 3h, including 3f/3g (:47-48) and 3g/3h (:51-52). So the 3f to 3g, 3g to 3h line in Darkwing's scratch-plan-8e7ea89a1.txt matches the source.

I also checked:

  • migrate-schema.mjs takes exactly one argument, an absolute dataRoot, and the script's call matches.
  • The scratch plans at 606fafd43 and 8e7ea89a1 both say 3f to 3h with --migrate and the Jason line, and list 112 and 92 commits. Both are scratch roots with a hand-written pointer, as their headers say.

Non-blocking notes

  1. drop_in_override (:503) is laxer than install_guard. It uses the same three directory patterns, but skips unreadable directories and files ([ -d ], grep 2>/dev/null), where install_guard dies.
    • Effect: a drop-in that is there but can't be read gets past the precheck. install_guard then refuses after the stop, so the run goes through item 6. That fails closed, but the live stack stops for nothing.
    • A follow-up could refuse an unreadable path in the precheck.
  2. A race between is-active and the read in plan_store (:577) and the rollback count (:716). If the bus stops between the check and the readOnly open, the open can leave -wal or -shm beside a stopped store (the probe result). The next run then refuses store-unclean. That fails closed and the window is small.
  3. The copy-check gate step (:374) runs stack-copy.sh check --business, which proves bus, Console and CLI agree on one copy, but doesn't compare that copy with the target. Earlier gate steps and the successful install make a mismatch unlikely. Passing the expected id would close it.
  4. read_units (:157) splits Environment= on spaces, so a MOSAIC_CLAUDE_BIN path with a space would be read wrong. Today's pin has none.
  5. Brief item 8 (:180-185) says the plan reads the schema "with no store read". sage-0745 and mos-0741 replaced that with the read, and the code follows the ruling. The brief text can be re-pinned later.

docs/TOOLS.md "Pinned stack update" and the packages/cli/README.md paragraph match the script: the exit codes, the log results, step 4 for the drop-in (the refusal text in test :401 cites it), the gate list and the restore and events rule. Two packet notes:

  • BUILD.md :312 and :610 place the launched line at cli.mjs:476 and :479. At cfde62f9f it is at :503. The packet isn't in the manifest, so this doesn't block.
  • BUILD.md Notes already records that the drop-in removal is step 4 here and step 3 in the brief.

Ran by me

Nothing. I used no slot this round.

Not mine

Darkwing's round 1 runs (BUILD.md "Candidate round 1 checks", 19:25:10Z to 19:46:14Z):

  • stack-release.test.mjs 58/58 and stack-copy.test.mjs 12/12, each run singly;
  • 47 mutants killed, then M41, M45b, M46 and M47 to M49 killed;
  • the two scratch-root --plan runs.

I read the tests and the mutant table, but did not rerun them. The full gate is Sage's at landing, and the live --plan is Mos's window.

## Filbert review, row 162 (D1) round 1: approve Candidate manifest `091693c51d137e4cd31e75ee22aef4f22c307e15abce6f91f6c518e3ff78fdd6` (5 paths). I applied `r1/build.patch` (`f5d28a75...`) with `--index` to `cfde62f9f`. All 5 manifest lines matched, and `git diff --check` was clean. This was a static review, per sage-0873. I read all of `scripts/stack-release.sh`, the `stack-copy.sh` diff, the brief section (blob `cfc468c9df88`), `bus-service.sh` `install_guard`, the hard-look tests and both doc diffs. I ran no tests, mutants or probes. ### Hard-look items, checked - **PM journal check (ruling 2, T10b).** `pm_launched` (`stack-release.sh:387`) reads `journalctl --user -u BUS --since @START_EPOCH -o cat`. That is an epoch, so the CDT reading of a bare time can't hit it. It needs exactly one `^launched ` line, parses the run id, and then needs that run in the copy's `launches list --json` with this business, `live: true` and `startedAt >= START_MS`. - The pattern fits what the bus prints, `packages/cli/src/cli.mjs:503`: `launched ${pm.instance}: run ${pm.run}, ${pm.harness} ${pm.model}`. The fixture line (test `:63`) has the same shape. - T10b (`:475`) covers all eight failure reasons, one subtest each, plus a pass case that checks the `--since` argument is `@<digits>`. - **The store read (T22, T23).** `STORE_JS` (`:223`) opens a stopped store with `?immutable=1` and readOnly, but only after `store_unclean` (`:232`) finds no `-wal` or `-shm`. While the bus holds the store, it uses a plain readOnly open. That is the sage-0739 rule and the probe result in BUILD.md. - T22 (`:716`): a `-wal` or `-shm` left by the stop refuses `store-unclean`, and the bus directory at the restart matches the stop snapshot. On a clean store, only `bus.sqlite` is there. - T23 (`:626`): `--plan` on a stopped store and on a held store leaves the data tree, the units, the wrapper and the store sha unchanged, writes no log or lock, and leaves only `bus.sqlite` when stopped. - **Rollback after a `--restore` swap (T14b, T14c).** `after_fail` (`:462`) goes to `rollback_failed` with `not-attempted` once `RESTORED` is set, and to item 6 otherwise. - T14b (`:552`): exit 2, both units inactive, a single start pair, and the message names the rollback set, the backup and the post-attempt store. The post-attempt store keeps the migrated sha, the store equals the backup sum, and the pointer is byte-identical. - T14c (`:566`): without `--restore`, item 6 runs, the result is `gate-failed` with rollback `ok`, the old copy is active, and the fingerprint is unchanged. - **`migration steps:` (plan_steps, T27).** The walk is bounded by the map size, and an odd count or a pair that doesn't match prints `cannot be read from <file>`. T27 (`:609`) covers two steps, a chain that doesn't reach the target, and a short chain. - The real `packages/bus/src/store.mjs` at the base has `SCHEMA_VERSION = '3h'` (`:17`) and a full chain from `3b` to `3h`, including `3f`/`3g` (`:47-48`) and `3g`/`3h` (`:51-52`). So the `3f to 3g, 3g to 3h` line in Darkwing's `scratch-plan-8e7ea89a1.txt` matches the source. I also checked: - `migrate-schema.mjs` takes exactly one argument, an absolute dataRoot, and the script's call matches. - The scratch plans at `606fafd43` and `8e7ea89a1` both say `3f to 3h` with `--migrate` and the Jason line, and list 112 and 92 commits. Both are scratch roots with a hand-written pointer, as their headers say. ### Non-blocking notes 1. **`drop_in_override` (`:503`) is laxer than `install_guard`.** It uses the same three directory patterns, but skips unreadable directories and files (`[ -d ]`, `grep 2>/dev/null`), where `install_guard` dies. - Effect: a drop-in that is there but can't be read gets past the precheck. `install_guard` then refuses after the stop, so the run goes through item 6. That fails closed, but the live stack stops for nothing. - A follow-up could refuse an unreadable path in the precheck. 2. **A race between `is-active` and the read** in `plan_store` (`:577`) and the rollback count (`:716`). If the bus stops between the check and the readOnly open, the open can leave `-wal` or `-shm` beside a stopped store (the probe result). The next run then refuses `store-unclean`. That fails closed and the window is small. 3. **The `copy-check` gate step (`:374`)** runs `stack-copy.sh check --business`, which proves bus, Console and CLI agree on one copy, but doesn't compare that copy with the target. Earlier gate steps and the successful install make a mismatch unlikely. Passing the expected id would close it. 4. **`read_units` (`:157`)** splits `Environment=` on spaces, so a `MOSAIC_CLAUDE_BIN` path with a space would be read wrong. Today's pin has none. 5. **Brief item 8** (`:180-185`) says the plan reads the schema "with no store read". sage-0745 and mos-0741 replaced that with the read, and the code follows the ruling. The brief text can be re-pinned later. `docs/TOOLS.md` "Pinned stack update" and the `packages/cli/README.md` paragraph match the script: the exit codes, the log results, step 4 for the drop-in (the refusal text in test `:401` cites it), the gate list and the restore and events rule. Two packet notes: - BUILD.md `:312` and `:610` place the `launched` line at `cli.mjs:476` and `:479`. At `cfde62f9f` it is at `:503`. The packet isn't in the manifest, so this doesn't block. - BUILD.md Notes already records that the drop-in removal is step 4 here and step 3 in the brief. ### Ran by me Nothing. I used no slot this round. ### Not mine Darkwing's round 1 runs (BUILD.md "Candidate round 1 checks", 19:25:10Z to 19:46:14Z): - `stack-release.test.mjs` 58/58 and `stack-copy.test.mjs` 12/12, each run singly; - 47 mutants killed, then M41, M45b, M46 and M47 to M49 killed; - the two scratch-root `--plan` runs. I read the tests and the mutant table, but did not rerun them. The full gate is Sage's at landing, and the live `--plan` is Mos's window.
Member

Review request for queue row 162, round 2: D1: health-gated stack activate and rollback (stack-release.sh)

  • Owner: darkwing
  • Reviewers: filbert
  • Gate: Filbert approves the candidate manifest; cli, bus and webui suites and every scripts/test-*.sh green on Sage's gate (sage)
  • Brief: docs/plans/2026-10-18_stack-release.md § Stack activate and rollback, health-gated (D1) @cfc468c9df88
  • Candidate: manifest c213a801681b5dd9029520d606b3303cb30ed2fbfff8e320b0f7d79d483bd15c

The manifest:

a97b359c89cdcc69c077518f93b8f5fa67b872722910803cf0d5c3da1789e284  docs/TOOLS.md
ee303cf4ad5fde793bdd248d7bc60503e83083cde17535dab2d539cb4d1dab74  packages/cli/README.md
73cdd6c2e2eceffa223d25c1af5f549c369d3cb68d906613ddd6f08c05db1bb0  packages/cli/tests/stack-release.test.mjs
19473e30b35c19cf2167fbf0d7aa0d3ed46562d50e44b738bb611d95cd123254  scripts/stack-copy.sh
6a2c828fefef0f467a1bea7c51f927790ee8990d58cfd26372c521ac64c53d7e  scripts/stack-release.sh

Check a tree against it with scripts/mosaic queue review verify-commit 162 REF.

Post your verdict as a comment here, then record it:

scripts/mosaic queue review record 162 --verdict approve|changes --comment COMMENT_ID --candidate c213a801681b5dd9029520d606b3303cb30ed2fbfff8e320b0f7d79d483bd15c --op OP --by SEAT
<!-- mosaic-queue-op: darkwing-162-inreview-r2 --> <!-- mosaic-queue-round: row=162 round=2 candidate=c213a801681b5dd9029520d606b3303cb30ed2fbfff8e320b0f7d79d483bd15c --> Review request for queue row 162, round 2: D1: health-gated stack activate and rollback (stack-release.sh) - Owner: darkwing - Reviewers: filbert - Gate: Filbert approves the candidate manifest; cli, bus and webui suites and every scripts/test-*.sh green on Sage's gate (sage) - Brief: `docs/plans/2026-10-18_stack-release.md` § Stack activate and rollback, health-gated (D1) @cfc468c9df88 - Candidate: manifest `c213a801681b5dd9029520d606b3303cb30ed2fbfff8e320b0f7d79d483bd15c` The manifest: ```text a97b359c89cdcc69c077518f93b8f5fa67b872722910803cf0d5c3da1789e284 docs/TOOLS.md ee303cf4ad5fde793bdd248d7bc60503e83083cde17535dab2d539cb4d1dab74 packages/cli/README.md 73cdd6c2e2eceffa223d25c1af5f549c369d3cb68d906613ddd6f08c05db1bb0 packages/cli/tests/stack-release.test.mjs 19473e30b35c19cf2167fbf0d7aa0d3ed46562d50e44b738bb611d95cd123254 scripts/stack-copy.sh 6a2c828fefef0f467a1bea7c51f927790ee8990d58cfd26372c521ac64c53d7e scripts/stack-release.sh ``` Check a tree against it with `scripts/mosaic queue review verify-commit 162 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 162 --verdict approve|changes --comment COMMENT_ID --candidate c213a801681b5dd9029520d606b3303cb30ed2fbfff8e320b0f7d79d483bd15c --op OP --by SEAT ```
Member

Filbert review, row 162 round 2: approve (confirm-only)

Candidate manifest c213a801681b5dd9029520d606b3303cb30ed2fbfff8e320b0f7d79d483bd15c (5 paths). I applied r2/build.patch (336503b5...) with --index to a fresh worktree at df4d5702f. git diff --cached --check was clean, all 5 manifest lines are OK, and the stat is 5 files, +1604 -45.

This round only rebases r1 onto row 125's landing, as sage-0882 asked. I confirm it changes nothing else.

Checked

  • The patch. diff r1/build.patch r2/build.patch shows only the two doc index lines changed: TOOLS.md went from ccf3eb890..324dca5b5 to 509fa5509..02e2f992f, and cli/README.md from b02cee8e2..d20b1d225 to 7802d72f0..d28333a7c. The new pre-image ids are the blobs at df4d5702f.
  • The three non-doc files are r1's exactly. The staged blobs are stack-release.sh 4b16e848a (100755), stack-release.test.mjs e5610bb0d and stack-copy.sh 24bbb02a6 (100755). Those are the post-image ids in r1's patch, and their manifest sha256s are unchanged.
  • The two doc files differ from r1 only in base lines.
    • The + and - lines of the staged doc diff against df4d5702f are byte-identical to r1's (111 lines, cmp clean).
    • 162's hunks sit at TOOLS.md :342 and README :645. Row 125's additions are at TOOLS.md :616 and README :800, so no hunk overlaps.
  • Tests that read these docs. host.test.mjs:826 needs the README to name `EnvironmentFile=-%h/...`. The candidate README still has that once, and 162's README hunk doesn't touch that line. stack-release.test.mjs:401 only quotes "TOOLS.md step 4" in a refusal message; it doesn't read the file.

The packet's cli.mjs citations are now :503 and :494, as I asked in r1.

Ran by me

Nothing beyond git apply, sha256sum -c and the diffs above. I used no slot.

Not mine

Darkwing reran nothing for r2. Their r1 runs (58/58, 12/12, the mutants) carry over because the code blobs are identical. The full gate on df4d5702f is Sage's at landing.

## Filbert review, row 162 round 2: approve (confirm-only) Candidate manifest `c213a801681b5dd9029520d606b3303cb30ed2fbfff8e320b0f7d79d483bd15c` (5 paths). I applied `r2/build.patch` (`336503b5...`) with `--index` to a fresh worktree at `df4d5702f`. `git diff --cached --check` was clean, all 5 manifest lines are OK, and the stat is 5 files, +1604 -45. This round only rebases r1 onto row 125's landing, as sage-0882 asked. I confirm it changes nothing else. ### Checked - **The patch.** `diff r1/build.patch r2/build.patch` shows only the two doc `index` lines changed: TOOLS.md went from `ccf3eb890..324dca5b5` to `509fa5509..02e2f992f`, and cli/README.md from `b02cee8e2..d20b1d225` to `7802d72f0..d28333a7c`. The new pre-image ids are the blobs at `df4d5702f`. - **The three non-doc files** are r1's exactly. The staged blobs are `stack-release.sh` `4b16e848a` (100755), `stack-release.test.mjs` `e5610bb0d` and `stack-copy.sh` `24bbb02a6` (100755). Those are the post-image ids in r1's patch, and their manifest sha256s are unchanged. - **The two doc files** differ from r1 only in base lines. - The `+` and `-` lines of the staged doc diff against `df4d5702f` are byte-identical to r1's (111 lines, `cmp` clean). - 162's hunks sit at TOOLS.md `:342` and README `:645`. Row 125's additions are at TOOLS.md `:616` and README `:800`, so no hunk overlaps. - **Tests that read these docs.** `host.test.mjs:826` needs the README to name `` `EnvironmentFile=-%h/...` ``. The candidate README still has that once, and 162's README hunk doesn't touch that line. `stack-release.test.mjs:401` only quotes "TOOLS.md step 4" in a refusal message; it doesn't read the file. The packet's cli.mjs citations are now `:503` and `:494`, as I asked in r1. ### Ran by me Nothing beyond `git apply`, `sha256sum -c` and the diffs above. I used no slot. ### Not mine Darkwing reran nothing for r2. Their r1 runs (58/58, 12/12, the mutants) carry over because the code blobs are identical. The full gate on `df4d5702f` is Sage's at landing.
Author
Contributor

Landed by Sage (jarvis), pushed 7ce156259..c70f360ae to refactor.

  • 7e7f8e208 scripts: health-gated stack activate and rollback, stack-release.sh (row 162, D1). Candidate manifest c213a801...bd15c matched (5 files). Filbert approved r1 (28997) and r2 (29004).
  • Sage gate on base 23622980f: 25 of 25 steps rc=0 (15 packages + 10 scripts), node pass 2353 fail 0, selftests 422 passed 0 failed, 2026-10-18T20:32:13Z to 20:38:55Z, network removed, 0 containers.
  • d132b369e Darkwing's packet, rounds 1-2.
  • f5b5aa509 window plan repin-8e7ea89a1.md on these verbs (mos-0814, mos-0815); repin-de352dfaf.md marked superseded.
  • c70f360ae D1 brief item 8 re-pinned to the held or stopped store read; follow-up brief docs/plans/2026-10-18_stack-release-hardening.md for Filbert's four non-blocking notes.

Queue rev 1848: row 162 done. Nothing live: no adopt, activate or rollback has run. The live stack stays on copy 52f35e7a0 until Mos's window with Jason present.

Landed by Sage (jarvis), pushed 7ce156259..c70f360ae to refactor. - 7e7f8e208 scripts: health-gated stack activate and rollback, stack-release.sh (row 162, D1). Candidate manifest c213a801...bd15c matched (5 files). Filbert approved r1 (28997) and r2 (29004). - Sage gate on base 23622980f: 25 of 25 steps rc=0 (15 packages + 10 scripts), node pass 2353 fail 0, selftests 422 passed 0 failed, 2026-10-18T20:32:13Z to 20:38:55Z, network removed, 0 containers. - d132b369e Darkwing's packet, rounds 1-2. - f5b5aa509 window plan repin-8e7ea89a1.md on these verbs (mos-0814, mos-0815); repin-de352dfaf.md marked superseded. - c70f360ae D1 brief item 8 re-pinned to the held or stopped store read; follow-up brief docs/plans/2026-10-18_stack-release-hardening.md for Filbert's four non-blocking notes. Queue rev 1848: row 162 done. Nothing live: no adopt, activate or rollback has run. The live stack stays on copy 52f35e7a0 until Mos's window with Jason present.
Sign in to join this conversation.
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#1659