v4.15.0 — Hardening I: single-repo first-class + e2e breadth
MINOR. The harness now runs on a single repo with zero Obsidian / Google Drive / vault dependency — opt in with install.sh --local-state (or agentm_config.py --state-mode local) and harness state lives in <repo>/.harness/ instead of a MemoryVault. This is the first front of Hardening I ("know when we break things"): single-repo mode is now a tested, first-class path, the cross-repo (crickets) install residue that produced the "N fragment(s) skipped" boot error is gone, and a first substantial batch of end-to-end tests exercises whole phases, every memory hook, and the memory engine round-trip in both state modes — so a regression in any of these surfaces before release.
Added
- First-class repo-local (vault-less) state —
install.sh --local-state/install.ps1 -LocalState. Writes"state_mode": "local"to the on-host.agentm-config.jsonand skips vault wiring; every phase write lands in<repo>/.harness/with noValueError. A per-repo<repo>/.harness/.project-modemarker overrides the device default for one repo. agentm_config.py --state-mode {local,vault}— flip the device-level run mode post-install without re-running the installer.
Changed
- State-mode configuration is on-host only (ADR 0009).
.agentm-config.jsonis the single source of truth for how agentm runs (a newstate_modekey); the vault holds data, never configuration. Resolution is two on-host layers — repo-local marker → devicestate_mode— and the mode is never inferred from a missingvault_path(which is ambiguous between never-configured and transiently-unreachable). Removed the former in-vault.project-modemarker + a deadharness_state_moderegistry field. - Retired the
install-state-syncSessionStart hook — redundant in standalone agentm, couldn't unregister removed hooks, and was the live source of the boot-time "N fragment(s) skipped" error. Retiring it also removed the last chunk of crickets install coupling.
Internal
- End-to-end test breadth (the regression net). Three new hermetic e2e scripts (
verify-phases.sh— phase lifecycle in both state modes;verify-memory-roundtrip.sh— engine round-trip embed→save→recall→reflect→vec-index→lint) plus three subprocess hook-firing tests proving each memory hook fires + graceful-skips + never blocks. All wired intoscripts/check-all.sh(11 gates) + the Linux/Mac CI workflows.
Builds on v4.14.0 (decouple from crickets). Full notes: CHANGELOG.md.