Context
Split from #13570. The #13570 PR fans out the assertConfigFresh stale-config boot-guard to the 4 overlay-MCP-servers (github-workflow, gitlab-workflow, knowledge-base, neural-link) + the neural-link bridge — each materializes its own config.mjs overlay, the clean uniform fan-out. During that work, the V-B-A (reading the actual daemon entrypoints) showed the daemons are NOT a uniform fan-out and need per-daemon analysis, so they're carved out here rather than forced into the mechanical PR.
Per-daemon findings (V-B-A 2026-06-20)
embed (ai/daemons/embed/daemon.mjs): already self-guards — getMissingMemoryWalLeaves(memoryCoreConfig.memoryWal, [...]) + --migrate-config exit at lines ~41-53. This is the bespoke prior-art that assertConfigFresh (#13560) generalizes. → verify sufficiency, optionally migrate to assertConfigFresh for consistency (low priority).
wake (ai/daemons/wake/daemon.mjs): reads config at module-load (const DB_PATH = memoryCoreConfig.storagePaths.graph at top level) → guarding requires deferring those reads into an async-guarded main() — a refactor, not a call-site add.
kb-alerting / kb-gc / kb-reconciliation: thin wrappers reading config indirectly via their Service (aiConfig.knowledgeBase.*); the relevant overlay to guard (top-level Tier-1 vs the knowledge-base server overlay) needs per-daemon analysis before a guard placement.
Acceptance Criteria
Out of Scope
- The overlay-MCP-servers + neural-link bridge (done in #13570's PR).
- The
assertConfigFresh detection logic / signature (unchanged).
Decision Record impact
none — applies the established #13568 pattern (or a daemon-shaped variant) to the remaining boot entrypoints.
Release classification
post-release / reliability hardening (not release-blocking) — boardless.
Authored by Vega (Claude Opus 4.8, Claude Code). Session 64ee317e-53b6-4f76-8241-f4eade1c084d.
Context
Split from #13570. The #13570 PR fans out the
assertConfigFreshstale-config boot-guard to the 4 overlay-MCP-servers (github-workflow, gitlab-workflow, knowledge-base, neural-link) + the neural-link bridge — each materializes its ownconfig.mjsoverlay, the clean uniform fan-out. During that work, the V-B-A (reading the actual daemon entrypoints) showed the daemons are NOT a uniform fan-out and need per-daemon analysis, so they're carved out here rather than forced into the mechanical PR.Per-daemon findings (V-B-A 2026-06-20)
embed(ai/daemons/embed/daemon.mjs): already self-guards —getMissingMemoryWalLeaves(memoryCoreConfig.memoryWal, [...])+--migrate-configexit at lines ~41-53. This is the bespoke prior-art thatassertConfigFresh(#13560) generalizes. → verify sufficiency, optionally migrate toassertConfigFreshfor consistency (low priority).wake(ai/daemons/wake/daemon.mjs): reads config at module-load (const DB_PATH = memoryCoreConfig.storagePaths.graphat top level) → guarding requires deferring those reads into an async-guardedmain()— a refactor, not a call-site add.kb-alerting/kb-gc/kb-reconciliation: thin wrappers reading config indirectly via their Service (aiConfig.knowledgeBase.*); the relevant overlay to guard (top-level Tier-1 vs the knowledge-base server overlay) needs per-daemon analysis before a guard placement.Acceptance Criteria
wake: refactor the module-load config reads behind anassertConfigFresh-guarded async entry.kb-alerting/kb-gc/kb-reconciliation: determine the relevant overlay per daemon + add the guard at theimport.meta.urlprocess-entry path (mirroring orchestrator's #13568 placement).embed: verify the bespoke guard is sufficient, or migrate toassertConfigFreshfor consistency.Out of Scope
assertConfigFreshdetection logic / signature (unchanged).Decision Record impact
none— applies the established #13568 pattern (or a daemon-shaped variant) to the remaining boot entrypoints.Release classification
post-release / reliability hardening (not release-blocking) — boardless.
Authored by Vega (Claude Opus 4.8, Claude Code). Session 64ee317e-53b6-4f76-8241-f4eade1c084d.