fix(wake): #913 installer adoption gaps — _lib dep-check fail-loud + mosaic-wake.service systemd-search-path link+validate (#930)
All checks were successful
ci/woodpecker/push/publish Pipeline was successful
ci/woodpecker/push/ci Pipeline was successful

Co-authored-by: jason.woltje <jason@diversecanvas.com>
Co-committed-by: jason.woltje <jason@diversecanvas.com>
This commit was merged in pull request #930.
This commit is contained in:
2026-07-26 12:37:29 +00:00
committed by Mos
parent 347c1d57c1
commit 0ea41e848b
3 changed files with 232 additions and 6 deletions

View File

@@ -98,7 +98,7 @@
# seen-ledger nor observed_seq, so the source is re-enumerated next
# cycle — no obligation loss). Files changed: _wake-common.sh,
# store.sh, detector.sh (+ tests).
# 0.6.6 #924 digest.sh dead-letter QUARANTINE alarm — G2a fix (dragon-lin
# 0.6.6 #924 digest.sh dead-letter QUARANTINE alarm — G2a fix (wake-pilot
# cure-verification follow-up on #920/PR #922). The #920 per-entry
# quarantine alarm was stderr/journal-LOCAL only; a dead-lettered
# entry is STORE-ACCOUNTED (§2.3) so the reconciler never re-flags
@@ -122,8 +122,34 @@
# wedge — #920's core property is preserved). digest.sh is the
# ONLY file changed; store.sh/beacon.sh/reconcile.sh are
# UNCHANGED (beacon.sh's adapter contract is reused, not modified).
# 0.6.7 #913 wake-install.sh installer ADOPTION-GAP fixes (wake-pilot,
# non-blocking, ADDITIVE per #869). (a) DEP-CHECK: the installer
# sourced _lib/manifest.sh (the shared framework-manifest reader it
# needs for Gate A) 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 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 ownership authority. framework-manifest.txt,
# the install-ordering-guard, and the manifest parity contract are all
# UNCHANGED. Only wake-install.sh (+ test-wake-install.sh) changed.
component=wake
version=0.6.6
version=0.6.7
# Watch-list schema this component consumes, and the INCLUSIVE range of
# schema_version values it supports. A wake-watch-list.json whose schema_version
@@ -183,7 +209,11 @@ schema_max=1
# timer, the snapshot-guard (no reap without a snapshot), and
# fail-closed alarm-target + HMAC-key install-validation (the
# installer wires + install-validates the beacon target that
# beacon.sh's fail-loud primitive is designed for). (W7)
# beacon.sh's fail-loud primitive is designed for). Fails loud
# if the required _lib/manifest.sh helper is absent (older host
# seed) instead of a bare source error, and LINKS the unit into
# the user systemd search path + post-install-validates it
# resolves (#913). (W7, #913)
# Companion (framework subtree, not under tools/wake/): systemd/user/mosaic-wake.service
# — the long-lived detector daemon unit (per-class SLO lives in
# the daemon, NOT a systemd interval). (W7)