Files
neuron/docs/runbooks/2026-08-12-engram-recovery-cutover-reversal.md
T

6.3 KiB

Engram Recovery, Cutover & Build — Decisions & Reversal Runbook

Date: 2026-08-12 · Owner: Neuron (for Will) · Status: LIVING (finalized with actuals after cutover)

Per Will's standing rule: every change ships with what's happening, the decisions + rationale, and an exact path for reversal. Advance authorization (Will, 2026-08-12): promote to prod for Will's own testing — NOT the website, no customer may see any of this. Customer-facing surfaces stay frozen.


1. Scope & guardrails

  • In scope (his testing env): the local engram service :8742 on Will's Mac, and the engram-tiered-storage build. Internal testing only.
  • FROZEN — do NOT touch: the marketing website, any customer-facing Cloud Run service, any public deploy. No customer exposure. Broader prod promotion (beyond Will's local testing) requires an explicit, separate go.

2. What's changing (and why)

# Change Rationale Reversal (see §5)
1 Crash-loop stopped (launchctl bootout ai.neuron.engram) 42 crashes/day; re-running a crashing WAL-replay over the store is the only corruption risk R1
2 btree fix committed 9e28def (branch engram-tiered-storage) Root cause: int_max_keys /8 vs /16 → node overflow → stack smash R2
3 Rebuild :8742 store from :7770 working-store fresh export + fixed binary; cut over Working store (~12,825, incl. today) is the truth; bloated egm lost ~1,500 nodes R3
4 Tag engram-tiered-m8 after green cutover The fix makes M8 boot real data R4
5 (Forthcoming) M9 / M10 / M-INTEROCEPTION build The cognitive architecture; each staged + tagged separately per-milestone

3. Key decisions

  • Recover from :7770 (truth), NOT the bloated :8742 egm. The egm recovers only 11,532 nodes (dropped ~1,500 during the crash-loop). The working :7770 store has the full, current set.
  • NOT the stale snapshot.json (06:10). It predates today's ~30 design memories. Using it would silently lose today's work.
  • HARD durability gate: the recovery does NOT cut over until a fresh :7770 export is verified to contain today's memories (node IDs 5a649121, 47be987f, fcce29d0, d02ad0f6).
  • Delete nothing. All prior stores/binaries/snapshots retained as reversal assets.
  • :7770 is read/export-only during recovery — never modified, never killed.

4. Reversal assets (backups)

  • ~/.neuron/engram-incident-backup-20260812-180043/ — pre-fix egm(458MB)+wal(44MB)+snapshot(65MB), APFS-cloned.
  • ~/.neuron/engram-recovery-export-<ts>.json — fresh :7770 export (created Phase 1; the durable truth).
  • Moved-aside originals: neuron.egm/neuron.wal renamed (kept) during cutover.
  • ~/.neuron/engram/snapshot.json (06:10) · snapshot.golden.json (Aug 3) · .sync-export.json (16:50).
  • Git: branch engram-tiered-storage, fix 9e28def; prior ~/.neuron/bin/engram binary retained.

5. Reversal paths (exact)

R1 — undo "crash-loop stopped": launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/ai.neuron.engram.plist. (NOT recommended with the unfixed binary — it will crash-loop again.)

R2 — revert the code fix: git -C /tmp/engram-tiered-wt revert 9e28def. (NOT recommended — reintroduces the overflow crash. The fix is defensive and correct.)

R3 — roll back the live cutover to a safe state:

  1. launchctl bootout gui/$(id -u)/ai.neuron.engram
  2. Restore the prior store: move the freshly-imported store aside; restore the moved-aside originals OR the backup dir contents into ~/.neuron/engram/.
  3. Restore the prior binary if it was replaced: copy the retained ~/.neuron/bin/engram back.
  4. launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/ai.neuron.engram.plist; verify.
  • Note: restoring the pre-fix binary reintroduces the crash. The genuinely safe rollback state is fixed binary + the recovery export (which is the target state). To fully abort: bootout and leave :8742 DOWN — your memory is safe and served by :7770 regardless.

R4 — undo the tag: git tag -d engram-tiered-m8 (and delete remote tag if pushed).

If :7770 is ever affected (it should not be — export/read-only): it holds the truth; if needed, rebuild from ~/.neuron/engram-recovery-export-<ts>.json.

6. Validation (how Will tests "here")

After cutover: :8742 listens; node_count ≈ 12,825; today's memories findable by-id AND by-search; no crash-loop over ≥30s; write-survives-restart. Then Will can exercise retrieval/writes on his machine.

7. Customer-facing status

UNTOUCHED. No website, no customer service, no public deploy changed by any step here.


8. ACTUALS — recovery COMPLETE & VERIFIED (2026-08-12 ~19:18)

  • Durability gate PASSED. Proof the stale files were unusable: the 16:50 .sync-export.json and 06:10 snapshot.json contained zero of the 4 canary IDs. Fresh export path used: GET :7770/api/graph/edges → sidecar (never touched canonical snapshot).
  • Durable truth exports (sha256-verified): ~/.neuron/engram-recovery-export-20260812-190712.json (12,734 nodes, all canaries) and ~/.neuron/engram-recovery-export-precutover-20260812-191634.json (12,704 nodes, all canaries).
  • Fixed binary: container-capped fold of current server.el + fixed engram_store.c (9e28def), arm64, sha256 feafd0c9…, 0 errors.
  • Cutover: binary+plist backed up to ~/.neuron/backups/pre-recovery-cutover-20260812-191844; bloated originals renamed *.pre-recovery-* (NOT deleted); clean egm placed; fixed binary deployed; launchctl bootstrap.
  • Live state (independently verified): :8742 up (pid 31277), /health = ok, node_count 12,679 / edges 43,466 / embedded 4,290, all 4 design canaries findable by-id AND by-search, write-survives-restart PASS, no crash-loop (no crash reports post-cutover).
  • :7770 truth daemon: untouched (read-only GETs only), still serving.
  • Tag: engram-tiered-m8 created on 9e28def (LOCAL only — not pushed).
  • Reversal state: all backups + the moved-aside bloated egm retained. Safe abort at any time: launchctl bootout:8742 down → memory still served by :7770. Full restore per §5.

Status: incident CLOSED. Memory recovered, durable, live. Customer-facing: untouched.