|
| 1 | +--- |
| 2 | +type: memory |
| 3 | +title: AUDIT 2026-07-10: cross-session memory persistence root-caused + fixed; SP_SPINE live leak found |
| 4 | +description: Memory-not-persisting = broken launcher flags (set VAR with no =1 is a batch NO-OP; no registry; L5 off) + 13/17 registry rows pointing at deleted dirs (silently skipped, no log) + 43 orphaned episode dirs (no disk rescan). Fixed launchers + new tools/memory_doctor.py; live-verified grow->restart->recall 4/5. NEW: SP_SPINE=1 leaks persona record on foreign questions (A/B proven) - keep SPINE off in serve until gated. |
| 5 | +timestamp: 2026-07-10T00:52:39Z |
| 6 | +resource: engine working tree 2026-07-10 |
| 7 | +sp_status: GREEN |
| 8 | +sp_gate: persist-after-restart probe 4/5 + foreign clean (inline path) |
| 9 | +sp_commit: engine working tree 2026-07-10 |
| 10 | +sp_repro: run_console_reason.bat; python tools/memory_doctor.py audit; python _faithful_corpus/b4_grow_recall_gate.py grow; restart; persist probe |
| 11 | +mem_kind: agent |
| 12 | +mem_addr: 1264a8623b7c6c0e |
| 13 | +mem_verified: unverified |
| 14 | +mem_lifecycle: active |
| 15 | +tags: [audit-2026-07-10, memory persistence, cross-session, SP_NIGHTSHIFT_PERSIST, batch set no-op, registry rot, dead rows, orphan episodes, memory_doctor, SP_SPINE leak, run_console_reason, launcher fix, silent reload, agent, tier-2] |
| 16 | +mem_tier: full |
| 17 | +--- |
| 18 | + |
| 19 | +AUDIT 2026-07-10 (memory persistence across sessions): user-reported "memory does not persist across sessions" root-caused to THREE stacked failures, all fixed + live-verified on the reason model serve. |
| 20 | +(1) run_console_reason.bat was memory-broken: `set "SP_NIGHTSHIFT_PERSIST"` with NO =1 is a batch NO-OP (flag never set), no SP_RECALL_REGISTRY (recall chain never arms - daemon loads None), SP_RECALL_L5=0 + SP_AUTO_RECALL_DEFAULT=0. Net: B4 captured episodes into _nightshift_live as ORPHANS (no registry row), nothing survived restart. LESSON (binding): in .bat, `set "VAR"` does not set VAR - always `set "VAR=1"`; audit launchers for value-less set lines. |
| 21 | +(2) Registry rot: 13/17 rows in _memory_live/registry.jsonl pointed at DELETED episode dirs. load_registry() rehydrates missing dirs with EMPTY gk/l5key via unwrap_or_default (recall.rs ~555-557) and the L5 selector silently skips l5key.len()!=512 (routes.rs ~2186) with NO log - dead memories are invisible. Capture is gated+logged; reload failures are silent = asymmetry. |
| 22 | +(3) Orphan blindness: daemon never scans _nightshift_live on disk; episodes captured while SP_NIGHTSHIFT_PERSIST was unset are never rediscovered (43 orphans found, mix of real user facts + leaked test corpus). |
| 23 | +FIXES: run_console_reason.bat rewritten (registry bootstrap + PERSIST=1 + L5=1 + AUTO_RECALL_DEFAULT=1 + QKEY_MINT=1 + MEM_CLASSIFY=1 + MEM_POLICY=1 + plain + veto head); run_console_everything_reason.bat gains QKEY_MINT/MEM_CLASSIFY/MEM_POLICY; NEW engine tools/memory_doctor.py (audit / prune-dead / adopt orphans / remint via store verb; sig_bits dummy is safe - L5 path never reads it, precedent build_sne_registry.py); RUNBOOK-ONE-CONFIG launcher map updated same change-set. |
| 24 | +LIVE VERIFICATION (reason model, fixed launcher): remint 2/2 real facts -> recall "what is my cat's name?" -> "Tuffy."; FULL RESTART -> reload 11 episodes -> persist probe 4/5 (cat/door/sister/foreign ok; dog = known same-template cross-pick). Cross-session persistence WORKS under the fixed launcher. |
| 25 | +NEW FINDING - SP_SPINE LIVE LEAK (one-variable A/B): with SP_SPINE=1 + small personal registry, foreign question "capital of Spain?" delivered the persona record ("Knack.") - off-topic leak past attr-gate/veto. SP_SPINE=0 (inline path): foreign clean ("Madrid."). The proven serve composition (G-B4-GROW-RECALL-L5, run_console_everything*) is the INLINE path; SPINE serve composition is UNGATED - keep SP_SPINE off in daily drivers until it earns a live gate. |
| 26 | +Known residuals (documented, NOT persistence): same-template cross-pick (L5 structure>subject collapse, fix = learned relevance head, deferred); absent-record questions can confabulate (door "1234") or cross-pick instead of declining. |
0 commit comments