fix(wake): #913 installer adoption gaps — _lib dep-check fail-loud + mosaic-wake.service systemd-search-path link+validate #930

Merged
Mos merged 2 commits from fix/wake-913-adoption-gaps into main 2026-07-26 12:37:30 +00:00
Owner

Closes #913; Part of #892.

Two non-blocking wake-canon adoption gaps in the A10 component installer (wake-install.sh), surfaced by the wake-pilot pilot. Both fixes are ADDITIVE per #869: framework-manifest.txt ownership, the install-ordering-guard, and the bash/TS manifest parity contract are all UNCHANGED.

(a) _lib dependency-check — fail loud, not a bare source error. wake-install.sh sourced the shared framework-manifest reader (_lib/manifest.sh) unconditionally, so an older host seed that predates that helper aborted with an obscure source: No such file or directory. It now checks the library FIRST and FAILS LOUD naming the missing file + the remedy (re-seed the framework, then retry --component wake). The dependency is genuinely required (Gate A cannot be skipped on an enforcement path), so it fails loud rather than degrading.

(b) systemd search-path link + post-install validate. wi_install copies mosaic-wake.service under mosaic home (systemd/user/, framework-owned) but systemctl --user searches ~/.config/systemd/user/, so the unit was invisible and could not be enabled/started. install now LINKS the unit into the user systemd search path (symlink -> the mosaic-home SSOT copy, so upgrades propagate) and post-install VALIDATES it resolves (search-path entry exists, dereferences to a readable, well-formed unit; an opportunistic systemctl --user cat probe runs only behind a guard, since the installer may run where no user manager is live). Both steps are idempotent (a re-install neither duplicates nor breaks the link).

#869 additive / single ownership authority. The link target (~/.config/systemd/user/<unit>) lives OUTSIDE mosaic home, so it is NOT a framework-manifest path (the manifest is mosaic-home-relative). Ownership of the SSOT unit stays systemd/** in the single framework-manifest.txt authority — NO new owned path, NO second ownership authority, so framework-manifest.txt + the parity tests need no change.

Red-first. test-wake-install.sh gains I9 (a: missing _lib/manifest.sh fails loud naming dep + remedy, not a bare source error; positive control installs normally) and I10 (b: install links the unit into the search path + validate resolves; negative control catches a not-in-path unit; idempotent re-install). Both go RED against the prior code and GREEN after.

Gates. shellcheck 0.11.0 clean on changed shell files; verify-sanitized PASS; test:framework-shell rc=0 (normal + openssl-masked); install-ordering-guard (19) + manifest-parity (17) vitest specs green (untouched). Wake component manifest.txt bumped 0.6.6 -> 0.6.7 (VERSION metadata only).

Closes #913; Part of #892. Two non-blocking wake-canon adoption gaps in the A10 component installer (wake-install.sh), surfaced by the wake-pilot pilot. Both fixes are ADDITIVE per #869: framework-manifest.txt ownership, the install-ordering-guard, and the bash/TS manifest parity contract are all UNCHANGED. **(a) _lib dependency-check — fail loud, not a bare source error.** wake-install.sh sourced the shared framework-manifest reader (`_lib/manifest.sh`) unconditionally, so an older host seed that predates that helper aborted with an obscure `source: No such file or directory`. It now checks the library FIRST and FAILS LOUD naming the missing file + the remedy (re-seed the framework, then retry `--component wake`). The dependency is genuinely required (Gate A cannot be skipped on an enforcement path), so it fails loud rather than degrading. **(b) systemd search-path link + post-install validate.** wi_install copies mosaic-wake.service under mosaic home (`systemd/user/`, framework-owned) but `systemctl --user` searches `~/.config/systemd/user/`, so the unit was invisible and could not be enabled/started. install now LINKS the unit into the user systemd search path (symlink -> the mosaic-home SSOT copy, so upgrades propagate) and post-install VALIDATES it resolves (search-path entry exists, dereferences to a readable, well-formed unit; an opportunistic `systemctl --user cat` probe runs only behind a guard, since the installer may run where no user manager is live). Both steps are idempotent (a re-install neither duplicates nor breaks the link). **#869 additive / single ownership authority.** The link target (`~/.config/systemd/user/<unit>`) lives OUTSIDE mosaic home, so it is NOT a framework-manifest path (the manifest is mosaic-home-relative). Ownership of the SSOT unit stays `systemd/**` in the single framework-manifest.txt authority — NO new owned path, NO second ownership authority, so framework-manifest.txt + the parity tests need no change. **Red-first.** test-wake-install.sh gains I9 (a: missing `_lib/manifest.sh` fails loud naming dep + remedy, not a bare source error; positive control installs normally) and I10 (b: install links the unit into the search path + validate resolves; negative control catches a not-in-path unit; idempotent re-install). Both go RED against the prior code and GREEN after. **Gates.** shellcheck 0.11.0 clean on changed shell files; verify-sanitized PASS; `test:framework-shell` rc=0 (normal + openssl-masked); install-ordering-guard (19) + manifest-parity (17) vitest specs green (untouched). Wake component manifest.txt bumped 0.6.6 -> 0.6.7 (VERSION metadata only).
jason.woltje added 1 commit 2026-07-26 12:17:47 +00:00
Two non-blocking wake-canon adoption gaps surfaced by the dragon-lin pilot in
the A10 component installer (wake-install.sh). Both fixes are ADDITIVE per #869:
framework-manifest.txt ownership, the install-ordering-guard, and the bash/TS
manifest parity contract are all UNCHANGED.

(a) DEP-CHECK — wake-install.sh sourced the shared framework-manifest reader
(_lib/manifest.sh) unconditionally, so an older host seed that predates that
helper aborted with a bare, obscure `source: No such file or directory`. It now
checks the library FIRST and FAILS LOUD naming the missing file + the remedy
(re-seed the framework, then retry --component wake). The dependency is genuinely
required (Gate A cannot be skipped on an enforcement path), so it fails loud
rather than degrading.

(b) SYSTEMD SEARCH PATH — wi_install copies mosaic-wake.service under mosaic
home (systemd/user/, framework-owned) but `systemctl --user` searches
~/.config/systemd/user/, so the unit was invisible and could not be
enabled/started. install now LINKS the unit into the user systemd search path
(symlink -> the mosaic-home SSOT copy, so upgrades propagate) and post-install
VALIDATES it resolves (search-path entry exists, dereferences to a readable,
well-formed unit; an opportunistic `systemctl --user cat` probe runs only behind
a guard, since the installer may run where no user manager is live). Both steps
are idempotent (a re-install neither duplicates nor breaks the link). #869
ADDITIVE: the link target lives OUTSIDE mosaic home, so it is not a
framework-manifest path — ownership of the SSOT unit stays systemd/** in the
single framework-manifest.txt authority; NO new owned path, NO second authority.

Red-first: test-wake-install.sh gains I9 (a: missing _lib/manifest.sh fails loud
naming dep + remedy, not a bare source error; positive control installs) and I10
(b: install links the unit into the search path + validate resolves; negative
control catches a not-in-path unit; idempotent re-install). Both go RED against
the prior code and GREEN after. Wake component manifest.txt bumped 0.6.6 -> 0.6.7
(VERSION metadata only).

Closes #913
Part of #892

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0158NZqN2n2ymKFeJAZ4GUCb
jason.woltje added 1 commit 2026-07-26 12:24:23 +00:00
chore(wake): genericize dragon-lin operator codename in manifest changelog — framework firewall
All checks were successful
ci/woodpecker/pr/ci Pipeline was successful
85886f338f
Shipped framework artifacts must carry ZERO operator-specific context. The wake
component manifest.txt changelog carried the operator host codename "dragon-lin"
in two entries (the pre-existing 0.6.6/#924 entry inherited from main, and the
new 0.6.7/#913 entry). The standard jason|woltje|jarvis denylist missed it.
Genericize both to "wake-pilot" (the convention #920 established when it
genericized the same codename in an earlier changelog entry). Changelog
semantics, version numbers, issue refs, and inventory are all unchanged — only
the operator codename becomes generic.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0158NZqN2n2ymKFeJAZ4GUCb
Author
Owner

Record of Review — PR #930 (issue #913): installer adoption gaps + firewall cleanup — FINAL, CI-GREEN

VERDICT: APPROVE — GO. REVIEWED-HEAD (full-40): 85886f338fd1fee912d9da125df230fc568bdc67. CI: TERMINAL-GREEN (pipeline 2081).

Review basis

Independent reviewer a5368d0f (opus, ≠ builder mosaic-coder) — APPROVE, all 6 criteria PASS, criteria 2/3/5 independently REPRODUCED:

  1. Scope/provenance — head==85886f33…; mergeable; id2 ≠ commit-author mosaic-coder; body Closes #913 + Part of #892; delta = only wake-install.sh, test-wake-install.sh, manifest.txt; manifest 0.6.6→0.6.7.
  2. (a) dep-check fail-loud (reproduced) — missing _lib/manifest.sh → rc=1 NAMING the file + a clear REMEDY (re-seed), NOT a bare source: No such file; present → installs. I9 RED-first against pre-fix (the bare source error).
  3. (b) systemd-search-path link+validate (reproduced) — idempotent symlink ~/.config/systemd/user/mosaic-wake.service→SSOT (2 re-installs = 1 entry); validate-systemd-path asserts search-path + well-formed unit; negative control (rm link)→rc=1; malformed unit→rc=1; systemctl --user cat probe only behind WAKE_VERIFY_USE_SYSTEMCTL=1 (warn-not-fail without a live manager). I10 RED-first.
  4. #869 additive / guard-untouchedframework-manifest.txt BYTE-IDENTICAL (link target is outside mosaic-home → not a manifest-owned path; SSOT unit stays owned by systemd/**; no 2nd ownership authority); install-ordering-guard 19/19 + manifest-parity 17/17 green; install.sh untouched; no lease-broker/enforcement-hook wiring touched.
  5. ★ Firewall CLEAN (broadened grep, reproduced) — the folded cleanup genericized the operator host codename dragon-linwake-pilot (a pre-existing #924 leak + #913s entry — confirmed the ONLY dragon-lin in the shipped framework). Reviewer: grep -rniE jason|woltje|jarvis|dragon-lin|web1|mos-dt-0|/home/hermes|/home/jwoltje over the 3 files = 0; grep -ni dragon manifest.txt = 0. (PR body metadata also tidied post-review.)
  6. Red-first + gates — install harness 10 groups green, I9/I10 RED→GREEN; shellcheck 0.11 clean; verify-sanitized PASS; test:framework-shell rc=0 normal. (Non-blocking caveat from reviewer: an "openssl-masked" variant is moot here — wake-install.sh has 0 openssl refs and I9/I10 are openssl-independent; the #913 delta touches no openssl/secret path.)

6-check — GO

  1. open/mergeable base main ✓ · 2. CI TERMINAL-GREEN @ full-40 85886f338fd1fee912d9da125df230fc568bdc67 ✓ · 3. reviewer(a5368d0f)≠builder durable RoR ✓ · 4. reviewed==CI==merge-head all 85886f33 ✓ · 5. body Closes #913 + Part of #892 ✓ · 6. queue-guard at merge.
    GO for id-11 + squash-merge at FULL-40 85886f338fd1fee912d9da125df230fc568bdc67. Closes #913 (installer adoption gaps: _lib dep-check fail-loud + mosaic-wake.service systemd-search-path link+validate) + folds a framework-firewall cleanup (dragon-lin→wake-pilot). Non-executor.
# Record of Review — PR #930 (issue #913): installer adoption gaps + firewall cleanup — FINAL, CI-GREEN **VERDICT: APPROVE — GO.** **REVIEWED-HEAD (full-40):** `85886f338fd1fee912d9da125df230fc568bdc67`. **CI: TERMINAL-GREEN** (pipeline 2081). ## Review basis Independent reviewer `a5368d0f` (opus, ≠ builder `mosaic-coder`) — **APPROVE, all 6 criteria PASS**, criteria 2/3/5 independently REPRODUCED: 1. **Scope/provenance** — head==`85886f33…`; mergeable; id2 ≠ commit-author `mosaic-coder`; body `Closes #913` + `Part of #892`; delta = only wake-install.sh, test-wake-install.sh, manifest.txt; manifest 0.6.6→0.6.7. 2. **(a) dep-check fail-loud (reproduced)** — missing `_lib/manifest.sh` → rc=1 NAMING the file + a clear REMEDY (re-seed), NOT a bare `source: No such file`; present → installs. I9 RED-first against pre-fix (the bare source error). 3. **(b) systemd-search-path link+validate (reproduced)** — idempotent symlink `~/.config/systemd/user/mosaic-wake.service`→SSOT (2 re-installs = 1 entry); `validate-systemd-path` asserts search-path + well-formed unit; negative control (rm link)→rc=1; malformed unit→rc=1; `systemctl --user cat` probe only behind WAKE_VERIFY_USE_SYSTEMCTL=1 (warn-not-fail without a live manager). I10 RED-first. 4. **★ #869 additive / guard-untouched** — `framework-manifest.txt` BYTE-IDENTICAL (link target is outside mosaic-home → not a manifest-owned path; SSOT unit stays owned by `systemd/**`; no 2nd ownership authority); install-ordering-guard 19/19 + manifest-parity 17/17 green; install.sh untouched; no lease-broker/enforcement-hook wiring touched. 5. **★ Firewall CLEAN (broadened grep, reproduced)** — the folded cleanup genericized the operator host codename `dragon-lin`→`wake-pilot` (a pre-existing #924 leak + #913s entry — confirmed the ONLY `dragon-lin` in the shipped framework). Reviewer: `grep -rniE jason|woltje|jarvis|dragon-lin|web1|mos-dt-0|/home/hermes|/home/jwoltje` over the 3 files = 0; `grep -ni dragon manifest.txt` = 0. (PR body metadata also tidied post-review.) 6. **Red-first + gates** — install harness 10 groups green, I9/I10 RED→GREEN; shellcheck 0.11 clean; verify-sanitized PASS; test:framework-shell rc=0 normal. (Non-blocking caveat from reviewer: an "openssl-masked" variant is moot here — wake-install.sh has 0 openssl refs and I9/I10 are openssl-independent; the #913 delta touches no openssl/secret path.) ## 6-check — GO 1. open/mergeable base main ✓ · 2. **CI TERMINAL-GREEN @ full-40 `85886f338fd1fee912d9da125df230fc568bdc67`** ✓ · 3. reviewer(`a5368d0f`)≠builder durable RoR ✓ · 4. reviewed==CI==merge-head all `85886f33` ✓ · 5. body `Closes #913` + `Part of #892` ✓ · 6. queue-guard at merge. **GO for id-11 + squash-merge at FULL-40 `85886f338fd1fee912d9da125df230fc568bdc67`. Closes #913 (installer adoption gaps: _lib dep-check fail-loud + mosaic-wake.service systemd-search-path link+validate) + folds a framework-firewall cleanup (dragon-lin→wake-pilot). Non-executor.**
Mos approved these changes 2026-07-26 12:37:28 +00:00
Mos left a comment
First-time contributor

GO — Gate-16 id-11 stamp, pinned to exact FULL head 85886f338f.
Basis: verbatim FINAL RoR (comment 19235) — independent review APPROVE 6/6 with criteria reproduced: dep-check fails loud naming the missing file and remedy; systemd-path link idempotent with post-install validation; and the BROADENED firewall sweep (names + host codenames + paths + endpoints) returns zero — the dragon-lin changelog leak genericized and confirmed the only operator artifact in the shipped framework. #869 posture additive-proven (framework-manifest byte-identical; guard 19 + parity 17 green; install.sh core untouched). Closes #913. The firewall process gap that let the leak through was self-reported by MS-LEAD and fixed at the category level in all briefs — the governance working as designed. Part of #892. Named executor: Mos (id-11), squash pinned.

GO — Gate-16 id-11 stamp, pinned to exact FULL head 85886f338fd1fee912d9da125df230fc568bdc67. Basis: verbatim FINAL RoR (comment 19235) — independent review APPROVE 6/6 with criteria reproduced: dep-check fails loud naming the missing file and remedy; systemd-path link idempotent with post-install validation; and the BROADENED firewall sweep (names + host codenames + paths + endpoints) returns zero — the dragon-lin changelog leak genericized and confirmed the only operator artifact in the shipped framework. #869 posture additive-proven (framework-manifest byte-identical; guard 19 + parity 17 green; install.sh core untouched). Closes #913. The firewall process gap that let the leak through was self-reported by MS-LEAD and fixed at the category level in all briefs — the governance working as designed. Part of #892. Named executor: Mos (id-11), squash pinned.
Mos merged commit 0ea41e848b into main 2026-07-26 12:37:30 +00:00
Mos deleted branch fix/wake-913-adoption-gaps 2026-07-26 12:37:30 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#930