MVP T1.1: several Mosaic Stack instances on one host (per-instance config, data root, units, ports) #1688

Closed
opened 2026-10-20 18:42:26 +00:00 by jarvis · 7 comments
Contributor

Mos order mos-0974, DECISIONS Q176-Q178, Vikunja #414. Blocks both MVP cases. Brief: docs/plans/2026-10-20_multi-instance.md. Owner Darkwing, reviewer Filbert, gate Sage. Design first.

Mos order mos-0974, DECISIONS Q176-Q178, Vikunja #414. Blocks both MVP cases. Brief: docs/plans/2026-10-20_multi-instance.md. Owner Darkwing, reviewer Filbert, gate Sage. Design first.
Member

Review request for queue row 190, round 1: several Mosaic Stack instances on one host: per-instance config, data root, units and ports (MVP T1.1, mos-0974, Vikunja #414)

  • Owner: darkwing
  • Reviewers: filbert
  • Gate: Filbert approves DESIGN.md then the manifest; cli suite and every scripts/test-*.sh green on Sage's gate; the design mutants killed (sage)
  • Brief: docs/plans/2026-10-20_multi-instance.md § Brief: several Mosaic Stack instances on one host @4e8f1e052894
  • Candidate: commit 8862feccc9c6c96088ce934d984e00731da0b425

Check a prospective commit against it with scripts/mosaic queue review verify-commit 190 REF.

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

scripts/mosaic queue review record 190 --verdict approve|changes --comment COMMENT_ID --candidate 8862feccc9c6c96088ce934d984e00731da0b425 --op OP --by SEAT
<!-- mosaic-queue-op: darkwing-190-inreview-r1 --> <!-- mosaic-queue-round: row=190 round=1 candidate=8862feccc9c6c96088ce934d984e00731da0b425 --> Review request for queue row 190, round 1: several Mosaic Stack instances on one host: per-instance config, data root, units and ports (MVP T1.1, mos-0974, Vikunja #414) - Owner: darkwing - Reviewers: filbert - Gate: Filbert approves DESIGN.md then the manifest; cli suite and every scripts/test-*.sh green on Sage's gate; the design mutants killed (sage) - Brief: `docs/plans/2026-10-20_multi-instance.md` § Brief: several Mosaic Stack instances on one host @4e8f1e052894 - Candidate: commit `8862feccc9c6c96088ce934d984e00731da0b425` Check a prospective commit against it with `scripts/mosaic queue review verify-commit 190 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 190 --verdict approve|changes --comment COMMENT_ID --candidate 8862feccc9c6c96088ce934d984e00731da0b425 --op OP --by SEAT ```
Member

Row 190 (#1688) manifest round 1: CHANGES (Filbert)

Static review of candidate commit 8862feccc9c6c96088ce934d984e00731da0b425 (base da230ca48, brief blob 4e8f1e0528, DESIGN.md rev 3 75b21f7561cb). I ran no tests or mutants this round. The gate and mutant figures in BUILD.md are Darkwing's receipts, not mine.

Verified:

  • candidate-manifest.sha256 (068828bcb5c7): all 24 digests match the commit's blobs, and the path set equals git diff --name-only da230ca48 8862feccc. build.patch (6389af4fe8fb) equals my own diff.
  • No test pins a changed path by sha256. The 64-hex grep over packages//tests and scripts/test-.sh gives 14 hits, none on the 24 paths.
  • Every test that runs an entry point sets HOME and XDG_CONFIG_HOME or a scratch MOSAIC_CONFIG (host, stack-copy, stack-release, stack-instances, webui service and pinned-copy, discord copy-service, test-discord.sh). None reads ~/.config/mosaic-dev.
  • The default bus session env path stays pinned through the README check at host.test.mjs:855.
  • Read: instance.sh, mosaic-config.mjs, bootstrap.sh, the five entry points, the three templates, guard.mjs, AGENTS.md, docs/TOOLS.md and the fixture test diffs. The test names cover T-I1 to T-I10, except T-I8 (N2).

Blocking:

B1. Base drift. Row 189 ace27dc5e (activate --no-send) landed after da230ca48 on docs/TOOLS.md, packages/cli/tests/stack-release.test.mjs and scripts/stack-release.sh. git merge-tree --write-tree refactor 8862feccc (refactor 088087ac9) reports CONFLICT (content) in scripts/stack-release.sh. The other two auto-merge. BUILD.md doesn't mention row 189. Rebase onto current refactor, rerun the full gate and every mutant on the new base, and open round 2.

Notes (not blocking alone; fold them into the rebase round or file follow-ups):

N1. TOOLS.md against the real flags:

  • The bus-service.sh block (TOOLS.md:273-275) and the discord-service.sh line (:776) don't show [--instance NAME], though both usage lines (bus-service.sh:39, discord-service.sh:31) do.
  • The webui block comment says render, install, uninstall and status take it. webui-service.sh:85's usage also puts it before copy, and webui-service.sh --instance NAME copy X runs the claim check, then copies. stack-copy.sh copy --instance exits 4 (stack-copy.sh:131). Either refuse --instance on webui copy or document it.
  • The stack-release and stack-copy lines match.

N2. T-I8 is a one-shot in ti8/, not a committed test. DESIGN.md:170 says "A test (T-I8) compares them". The reason (it reads da230ca48 from git) is sound, and webui service.test.mjs and discord copy-service.test.mjs keep full default-render comparisons for those two units. The bus unit has no committed full-render comparison; host.test.mjs checks named lines only. List the one-shot as a numbered deviation in BUILD.md. A bus render golden is optional.

N3. Deviation 8: the comment at mosaic-webui.service.in:15 is rendered into the unit, so changing it would break the default's byte identity. Leaving it is right. A named unit now carries a comment that is false for it. The named branch of INSTANCE_SED could rewrite that line for named instances only. Sage's call.

N4. instance_port_holder reads --port and --tester-port from the unit file's last ExecStart= only. serve takes --port N as a separate token only (packages/webui/src/cli.mjs:26), so --port=N is moot, but an ExecStart override in a drop-in is missed. The TOOLS.md port-claimed paragraph could say "in the unit file".

N5. bootstrapNamed's mkdir of the config dir ignores EEXIST (mosaic-config.mjs:366-368), so an existing ~/.config/mosaic-NAME keeps whatever mode it has. TOOLS.md says "directory 0700". Either refuse a looser directory or reword.

N6. stack-copy.sh check --instance NAME doesn't verify that the named wrapper's export MOSAIC_CONFIG= line names NAME's config.

N7. discord-service.sh status for the default reads ${XDG_CONFIG_HOME:-$HOME/.config}/mosaic-dev/config.json (:162) even when MOSAIC_CONFIG is set. That is base behavior, but D1 row 2 says MOSAIC_CONFIG alone is that config. Use MOSAIC_INSTANCE_CONFIG for every instance, or note it.

**Row 190 (#1688) manifest round 1: CHANGES** (Filbert) Static review of candidate commit 8862feccc9c6c96088ce934d984e00731da0b425 (base da230ca48, brief blob 4e8f1e052894, DESIGN.md rev 3 75b21f7561cb). I ran no tests or mutants this round. The gate and mutant figures in BUILD.md are Darkwing's receipts, not mine. Verified: - candidate-manifest.sha256 (068828bcb5c7): all 24 digests match the commit's blobs, and the path set equals `git diff --name-only da230ca48 8862feccc`. build.patch (6389af4fe8fb) equals my own diff. - No test pins a changed path by sha256. The 64-hex grep over packages/*/tests and scripts/test-*.sh gives 14 hits, none on the 24 paths. - Every test that runs an entry point sets HOME and XDG_CONFIG_HOME or a scratch MOSAIC_CONFIG (host, stack-copy, stack-release, stack-instances, webui service and pinned-copy, discord copy-service, test-discord.sh). None reads ~/.config/mosaic-dev. - The default bus session env path stays pinned through the README check at host.test.mjs:855. - Read: instance.sh, mosaic-config.mjs, bootstrap.sh, the five entry points, the three templates, guard.mjs, AGENTS.md, docs/TOOLS.md and the fixture test diffs. The test names cover T-I1 to T-I10, except T-I8 (N2). Blocking: B1. Base drift. Row 189 ace27dc5e (activate --no-send) landed after da230ca48 on docs/TOOLS.md, packages/cli/tests/stack-release.test.mjs and scripts/stack-release.sh. `git merge-tree --write-tree refactor 8862feccc` (refactor 088087ac9) reports CONFLICT (content) in scripts/stack-release.sh. The other two auto-merge. BUILD.md doesn't mention row 189. Rebase onto current refactor, rerun the full gate and every mutant on the new base, and open round 2. Notes (not blocking alone; fold them into the rebase round or file follow-ups): N1. TOOLS.md against the real flags: - The bus-service.sh block (TOOLS.md:273-275) and the discord-service.sh line (:776) don't show `[--instance NAME]`, though both usage lines (bus-service.sh:39, discord-service.sh:31) do. - The webui block comment says render, install, uninstall and status take it. webui-service.sh:85's usage also puts it before copy, and `webui-service.sh --instance NAME copy X` runs the claim check, then copies. `stack-copy.sh copy --instance` exits 4 (stack-copy.sh:131). Either refuse `--instance` on webui copy or document it. - The stack-release and stack-copy lines match. N2. T-I8 is a one-shot in ti8/, not a committed test. DESIGN.md:170 says "A test (T-I8) compares them". The reason (it reads da230ca48 from git) is sound, and webui service.test.mjs and discord copy-service.test.mjs keep full default-render comparisons for those two units. The bus unit has no committed full-render comparison; host.test.mjs checks named lines only. List the one-shot as a numbered deviation in BUILD.md. A bus render golden is optional. N3. Deviation 8: the comment at mosaic-webui.service.in:15 is rendered into the unit, so changing it would break the default's byte identity. Leaving it is right. A named unit now carries a comment that is false for it. The named branch of INSTANCE_SED could rewrite that line for named instances only. Sage's call. N4. instance_port_holder reads `--port` and `--tester-port` from the unit file's last `ExecStart=` only. serve takes `--port N` as a separate token only (packages/webui/src/cli.mjs:26), so `--port=N` is moot, but an ExecStart override in a drop-in is missed. The TOOLS.md port-claimed paragraph could say "in the unit file". N5. bootstrapNamed's mkdir of the config dir ignores EEXIST (mosaic-config.mjs:366-368), so an existing ~/.config/mosaic-NAME keeps whatever mode it has. TOOLS.md says "directory 0700". Either refuse a looser directory or reword. N6. `stack-copy.sh check --instance NAME` doesn't verify that the named wrapper's `export MOSAIC_CONFIG=` line names NAME's config. N7. `discord-service.sh status` for the default reads `${XDG_CONFIG_HOME:-$HOME/.config}/mosaic-dev/config.json` (:162) even when MOSAIC_CONFIG is set. That is base behavior, but D1 row 2 says MOSAIC_CONFIG alone is that config. Use MOSAIC_INSTANCE_CONFIG for every instance, or note it.
Member

Review request for queue row 190, round 2: several Mosaic Stack instances on one host: per-instance config, data root, units and ports (MVP T1.1, mos-0974, Vikunja #414)

  • Owner: darkwing
  • Reviewers: filbert
  • Gate: Filbert approves DESIGN.md then the manifest; cli suite and every scripts/test-*.sh green on Sage's gate; the design mutants killed (sage)
  • Brief: docs/plans/2026-10-20_multi-instance.md § Brief: several Mosaic Stack instances on one host @4e8f1e052894
  • Candidate: commit 537a02392bf5eeecf3f55dbfec5162565b786456

Check a prospective commit against it with scripts/mosaic queue review verify-commit 190 REF.

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

scripts/mosaic queue review record 190 --verdict approve|changes --comment COMMENT_ID --candidate 537a02392bf5eeecf3f55dbfec5162565b786456 --op OP --by SEAT
<!-- mosaic-queue-op: darkwing-190-inreview-r2 --> <!-- mosaic-queue-round: row=190 round=2 candidate=537a02392bf5eeecf3f55dbfec5162565b786456 --> Review request for queue row 190, round 2: several Mosaic Stack instances on one host: per-instance config, data root, units and ports (MVP T1.1, mos-0974, Vikunja #414) - Owner: darkwing - Reviewers: filbert - Gate: Filbert approves DESIGN.md then the manifest; cli suite and every scripts/test-*.sh green on Sage's gate; the design mutants killed (sage) - Brief: `docs/plans/2026-10-20_multi-instance.md` § Brief: several Mosaic Stack instances on one host @4e8f1e052894 - Candidate: commit `537a02392bf5eeecf3f55dbfec5162565b786456` Check a prospective commit against it with `scripts/mosaic queue review verify-commit 190 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 190 --verdict approve|changes --comment COMMENT_ID --candidate 537a02392bf5eeecf3f55dbfec5162565b786456 --op OP --by SEAT ```
Member

Row 190 (#1688) manifest round 2: CHANGES (Filbert)

Static review of candidate commit 537a02392b (base 088087ac9, brief blob 4e8f1e0528). I ran no tests or mutants. The gate (1206 node, 422 selftests, 0 fail) and the 19 of 19 killed mutants are Darkwing's receipts in BUILD.md "## Round 2".

Verified:

  • build-r2.patch (0ba1aa3ec6b4) equals my own git diff 088087ac9 537a02392. All 25 digests in candidate-manifest-r2.sha256 (2296e9cb130e) match the commit, and the path set equals the diff's.
  • git range-diff da230ca48..8862feccc 088087ac9..ceaf93837: the rebase changes only what row 189 brings in (NO_SEND, SEND_PLAN and SEND_STEP kept beside $flags in plan()). Round 1's code is otherwise intact.
  • Round 2 delta, read in full:
    • N1: the TOOLS.md bus and discord lines; webui-service.sh copy refuses --instance with exit 4 before instance_select; a T-I2 subtest covers both copy verbs in both positions.
    • N3: the named-only sed rewrites the Console comment, and T56 T-I3 pins both the default and the named line.
    • N5: TOOLS.md reworded.
    • N6: check compares wrapper line 4 with what wrapper_instance writes; the stack-copy test covers a good wrapper, another config and a missing line.
  • I accept deviations 10 to 12, and N4 and N7 as follow-ups.

Blocking:

B1. Base drift, again, not caused by this round. Row 192 (4429a104f, Q175 phase 1 SSO) landed on refactor at 2026-10-20T21:21:29Z, after this candidate (20:48:52Z) and its gate. It touches scripts/mosaic-config.mjs, scripts/webui-service.sh, packages/webui/tests/service.test.mjs and packages/webui/README.md. git merge-tree --write-tree refactor 537a02392 reports CONFLICT (content) in scripts/mosaic-config.mjs and scripts/webui-service.sh. Rebase onto current refactor on a new branch name, then rerun the full gate and all 19 mutants on the new base. Note that row 192 adds a dependency (oauth4webapi 3.8.8), so the worktree needs npm ci.

Merge hazards to check in round 3:

  • Row 192 makes validate and load async. Every row 190 call to load (bootstrapNamed, selected, loadSelected and any checkClaim caller) must be awaited. An unawaited load returns a Promise, its .dataRoot reads undefined, and the claim check could then crash, or pass when it should refuse.
  • Row 190's top-level try { switch ... } catch (Failure) must await every async call inside it. A Failure thrown from inside row 192's async validateConsole must still exit with its own code (2), not as an unhandled rejection.
  • webui-service.sh needs both row 192's --sso comment and flags and row 190's instance block, plus one combined USAGE line. Row 192 also edits service.test.mjs, which round 1 changed for @CONFIG_ENV@.
  • The Console reads console.sso through loadSystem (MOSAIC_CONFIG) and its slots through business.mjs configDir() (dirname of MOSAIC_CONFIG). A named unit's Environment=MOSAIC_CONFIG= therefore gives each instance its own SSO config and slots. A T56 assertion that a named render with --sso carries both --sso and the instance's MOSAIC_CONFIG line would pin that. I'm asking for it, but it doesn't block alone.

Round 2's own changes need nothing more. A round 3 that is only this rebase, with a green gate, the 19 mutants and those merge points checked, should be a short review.

**Row 190 (#1688) manifest round 2: CHANGES** (Filbert) Static review of candidate commit 537a02392bf5eeecf3f55dbfec5162565b786456 (base 088087ac9, brief blob 4e8f1e052894). I ran no tests or mutants. The gate (1206 node, 422 selftests, 0 fail) and the 19 of 19 killed mutants are Darkwing's receipts in BUILD.md "## Round 2". Verified: - build-r2.patch (0ba1aa3ec6b4) equals my own `git diff 088087ac9 537a02392`. All 25 digests in candidate-manifest-r2.sha256 (2296e9cb130e) match the commit, and the path set equals the diff's. - `git range-diff da230ca48..8862feccc 088087ac9..ceaf93837`: the rebase changes only what row 189 brings in (NO_SEND, SEND_PLAN and SEND_STEP kept beside `$flags` in plan()). Round 1's code is otherwise intact. - Round 2 delta, read in full: - N1: the TOOLS.md bus and discord lines; `webui-service.sh copy` refuses `--instance` with exit 4 before instance_select; a T-I2 subtest covers both copy verbs in both positions. - N3: the named-only sed rewrites the Console comment, and T56 T-I3 pins both the default and the named line. - N5: TOOLS.md reworded. - N6: check compares wrapper line 4 with what wrapper_instance writes; the stack-copy test covers a good wrapper, another config and a missing line. - I accept deviations 10 to 12, and N4 and N7 as follow-ups. Blocking: B1. Base drift, again, not caused by this round. Row 192 (4429a104f, Q175 phase 1 SSO) landed on refactor at 2026-10-20T21:21:29Z, after this candidate (20:48:52Z) and its gate. It touches scripts/mosaic-config.mjs, scripts/webui-service.sh, packages/webui/tests/service.test.mjs and packages/webui/README.md. `git merge-tree --write-tree refactor 537a02392` reports CONFLICT (content) in scripts/mosaic-config.mjs and scripts/webui-service.sh. Rebase onto current refactor on a new branch name, then rerun the full gate and all 19 mutants on the new base. Note that row 192 adds a dependency (oauth4webapi 3.8.8), so the worktree needs `npm ci`. Merge hazards to check in round 3: - Row 192 makes `validate` and `load` async. Every row 190 call to `load` (bootstrapNamed, selected, loadSelected and any checkClaim caller) must be awaited. An unawaited `load` returns a Promise, its `.dataRoot` reads undefined, and the claim check could then crash, or pass when it should refuse. - Row 190's top-level `try { switch ... } catch (Failure)` must await every async call inside it. A Failure thrown from inside row 192's async `validateConsole` must still exit with its own code (2), not as an unhandled rejection. - webui-service.sh needs both row 192's `--sso` comment and flags and row 190's instance block, plus one combined USAGE line. Row 192 also edits service.test.mjs, which round 1 changed for `@CONFIG_ENV@`. - The Console reads console.sso through loadSystem (MOSAIC_CONFIG) and its slots through business.mjs configDir() (dirname of MOSAIC_CONFIG). A named unit's `Environment=MOSAIC_CONFIG=` therefore gives each instance its own SSO config and slots. A T56 assertion that a named render with `--sso` carries both `--sso` and the instance's MOSAIC_CONFIG line would pin that. I'm asking for it, but it doesn't block alone. Round 2's own changes need nothing more. A round 3 that is only this rebase, with a green gate, the 19 mutants and those merge points checked, should be a short review.
Member

Review request for queue row 190, round 3: several Mosaic Stack instances on one host: per-instance config, data root, units and ports (MVP T1.1, mos-0974, Vikunja #414)

  • Owner: darkwing
  • Reviewers: filbert
  • Gate: Filbert approves DESIGN.md then the manifest; cli suite and every scripts/test-*.sh green on Sage's gate; the design mutants killed (sage)
  • Brief: docs/plans/2026-10-20_multi-instance.md § Brief: several Mosaic Stack instances on one host @4e8f1e052894
  • Candidate: commit df65a3d4c8fec64ba3aba20a481c244f9d73a84d

Check a prospective commit against it with scripts/mosaic queue review verify-commit 190 REF.

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

scripts/mosaic queue review record 190 --verdict approve|changes --comment COMMENT_ID --candidate df65a3d4c8fec64ba3aba20a481c244f9d73a84d --op OP --by SEAT
<!-- mosaic-queue-op: darkwing-190-inreview-r3 --> <!-- mosaic-queue-round: row=190 round=3 candidate=df65a3d4c8fec64ba3aba20a481c244f9d73a84d --> Review request for queue row 190, round 3: several Mosaic Stack instances on one host: per-instance config, data root, units and ports (MVP T1.1, mos-0974, Vikunja #414) - Owner: darkwing - Reviewers: filbert - Gate: Filbert approves DESIGN.md then the manifest; cli suite and every scripts/test-*.sh green on Sage's gate; the design mutants killed (sage) - Brief: `docs/plans/2026-10-20_multi-instance.md` § Brief: several Mosaic Stack instances on one host @4e8f1e052894 - Candidate: commit `df65a3d4c8fec64ba3aba20a481c244f9d73a84d` Check a prospective commit against it with `scripts/mosaic queue review verify-commit 190 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 190 --verdict approve|changes --comment COMMENT_ID --candidate df65a3d4c8fec64ba3aba20a481c244f9d73a84d --op OP --by SEAT ```
Member

Filbert, row 190 (#1688) manifest round 3: APPROVE

Candidate: commit df65a3d4c8 on darkwing/row190-r3, base refactor 176a6bf4b. Request 29710.

What I checked (static, no test slot used):

  • build-r3.patch sha256 efe898c2ce2d... equals git diff 176a6bf4b df65a3d4c | sha256sum.
  • All 25 digests in candidate-manifest-r3.sha256 (cc0ea9e8f352...) match the commit's blobs. The path set equals the diff's.
  • Drift: git log 176a6bf4b..refactor (refactor at 4385b9ec1) touches none of the 25 paths. git merge-tree --write-tree refactor df65a3d4c is clean.
  • Rebase: git range-diff 088087ac9..537a02392 176a6bf4b..cdac7ba92 shows only the async/await fold-in from row 192 in scripts/mosaic-config.mjs, plus context shifts in webui-service.sh. git diff cdac7ba92 df65a3d4c is the 6 T-I3 lines in stack-release.test.mjs and nothing else.

Round 2 B1 merge hazards, on df65a3d4c:

  1. Every load is awaited. bootstrapDefault (:350, :356, :359), bootstrapNamed (:368, :394, :398), selected (:415, :420) and loadSelected (:442) are async, and the switch awaits each one (:457-483). checkClaim stays sync and always gets a dataRoot from an awaited load.
  2. The top-level try/catch (:449-491) awaits every call inside it, so a Failure from validateConsole reaches the catch and exits with its own code. selected's default branch catch (:421) still rethrows anything that isn't a Failure.
  3. webui-service.sh keeps the --sso comment (:52), flag (:143), refusals (:221-227) and unit flag (:260) next to the instance block (:83-91) and the copy --instance refusal (:87-89). USAGE has one FLAGS line with --sso.
  4. Note 4 is done. T-I3 renders alpha with --sso and asserts --sso on ExecStart and alpha's Environment=MOSAIC_CONFIG= line. M20 kills it.

Pins: two test files hold a 64-hex string and name a changed path: the fake UID at service.test.mjs:21 and a history digest in queue-marked.md:119. Neither is a pin, which matches BUILD.md:516.

Receipts I didn't produce: the gate (17 steps rc=0, 2042 passed) and the 20 mutants (20 killed) are Darkwing's, run in Sage's slot sage-1512. I accept the M4 explanation: the 122 s T-I6 timeouts show up in rounds 1 and 2 as well, so the W5 activate isn't the cause. Deviation 13 (20 mutants instead of 19) is accepted.

Follow-ups, unchanged: N4, N7, PATH_RE with @ paths, and the row 230 token carry. One small gap, not blocking: no test sends a bad console body through a named instance. It's the same loadSelected to load to validate chain, and test-config.sh covers the default.

Landing needs Sage's own gate on df65a3d4c from a git worktree, with npm ci or node_modules linked for oauth4webapi.

2026-10-20T22:15:18Z

**Filbert, row 190 (#1688) manifest round 3: APPROVE** Candidate: commit df65a3d4c8fec64ba3aba20a481c244f9d73a84d on darkwing/row190-r3, base refactor 176a6bf4b. Request 29710. **What I checked (static, no test slot used):** - build-r3.patch sha256 efe898c2ce2d... equals `git diff 176a6bf4b df65a3d4c | sha256sum`. - All 25 digests in candidate-manifest-r3.sha256 (cc0ea9e8f352...) match the commit's blobs. The path set equals the diff's. - Drift: `git log 176a6bf4b..refactor` (refactor at 4385b9ec1) touches none of the 25 paths. `git merge-tree --write-tree refactor df65a3d4c` is clean. - Rebase: `git range-diff 088087ac9..537a02392 176a6bf4b..cdac7ba92` shows only the async/await fold-in from row 192 in scripts/mosaic-config.mjs, plus context shifts in webui-service.sh. `git diff cdac7ba92 df65a3d4c` is the 6 T-I3 lines in stack-release.test.mjs and nothing else. **Round 2 B1 merge hazards, on df65a3d4c:** 1. Every load is awaited. bootstrapDefault (:350, :356, :359), bootstrapNamed (:368, :394, :398), selected (:415, :420) and loadSelected (:442) are async, and the switch awaits each one (:457-483). checkClaim stays sync and always gets a dataRoot from an awaited load. 2. The top-level try/catch (:449-491) awaits every call inside it, so a Failure from validateConsole reaches the catch and exits with its own code. selected's default branch catch (:421) still rethrows anything that isn't a Failure. 3. webui-service.sh keeps the --sso comment (:52), flag (:143), refusals (:221-227) and unit flag (:260) next to the instance block (:83-91) and the copy --instance refusal (:87-89). USAGE has one FLAGS line with --sso. 4. Note 4 is done. T-I3 renders alpha with --sso and asserts --sso on ExecStart and alpha's `Environment=MOSAIC_CONFIG=` line. M20 kills it. **Pins:** two test files hold a 64-hex string and name a changed path: the fake UID at service.test.mjs:21 and a history digest in queue-marked.md:119. Neither is a pin, which matches BUILD.md:516. **Receipts I didn't produce:** the gate (17 steps rc=0, 2042 passed) and the 20 mutants (20 killed) are Darkwing's, run in Sage's slot sage-1512. I accept the M4 explanation: the 122 s T-I6 timeouts show up in rounds 1 and 2 as well, so the W5 activate isn't the cause. Deviation 13 (20 mutants instead of 19) is accepted. **Follow-ups, unchanged:** N4, N7, PATH_RE with @ paths, and the row 230 token carry. One small gap, not blocking: no test sends a bad console body through a named instance. It's the same loadSelected to load to validate chain, and test-config.sh covers the default. Landing needs Sage's own gate on df65a3d4c from a git worktree, with npm ci or node_modules linked for oauth4webapi. 2026-10-20T22:15:18Z
Author
Contributor

Landed 00d4cc1f6 on refactor and pushed (99a406ed3..00d4cc1f6). Row 190, several Mosaic Stack instances on one host: squash of Darkwing's 176a6bf4b..df65a3d4c on the 25 manifest paths, manifest cc0ea9e8, Filbert approve round 3 (29713), patch-id 5ec610a7 matches the branch diff. Gate on d0bbc5c1c with the patch: 15 package suites 2664 pass 0 fail, 10 scripts/test-*.sh suites 429 pass 0 fail. Mutants 20 of 20 killed. No live change: the live stack runs pinned copy 4429a104f until a re-pin. Follow-ups not blocking: N4, N7, PATH_RE with @ paths, a test sending a bad console body through a named instance's validate, and the row 230 tokens (whichever of 190 and 230 lands second adds them; 190 is first, so row 230 carries them). Row 190 is done in the queue (rev 2508). Closing.

Landed 00d4cc1f6 on refactor and pushed (99a406ed3..00d4cc1f6). Row 190, several Mosaic Stack instances on one host: squash of Darkwing's 176a6bf4b..df65a3d4c on the 25 manifest paths, manifest cc0ea9e8, Filbert approve round 3 (29713), patch-id 5ec610a7 matches the branch diff. Gate on d0bbc5c1c with the patch: 15 package suites 2664 pass 0 fail, 10 scripts/test-*.sh suites 429 pass 0 fail. Mutants 20 of 20 killed. No live change: the live stack runs pinned copy 4429a104f until a re-pin. Follow-ups not blocking: N4, N7, PATH_RE with @ paths, a test sending a bad console body through a named instance's validate, and the row 230 tokens (whichever of 190 and 230 lands second adds them; 190 is first, so row 230 carries them). Row 190 is done in the queue (rev 2508). Closing.
Sign in to join this conversation.
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#1688