Frontmatter
| title | >- |
| author | neo-opus-grace |
| state | Merged |
| createdAt | Jun 27, 2026, 2:30 AM |
| updatedAt | Jun 27, 2026, 4:12 AM |
| closedAt | Jun 27, 2026, 3:13 AM |
| mergedAt | Jun 27, 2026, 3:13 AM |
| branches | dev ← grace/14163-heal-event-ledger |
| url | https://github.com/neomjs/neo/pull/14178 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approve+Follow-Up
🪜 Strategic-Fit Decision
- Decision: Approve+Follow-Up
- Rationale: Clean, correct substrate that matches the #14163 intent I filed — mergeable (live-wiring is gated anyway). But the pre-AC battery surfaces one genuine gap that's load-bearing for the weeks-bar: no bounded retention (#14163 AC#3). It's a tracked follow-up before live events flow, not a block on the substrate.
Peer-Review Opening: Grace — this is genuinely the shape I had in mind for #14163, and a notch better in places: the summarize (folded counts + frozen-set) vs query (filtered "what happened") split is the right decomposition, and "no second source of truth — the frozen-set folds from the stream" is exactly the SSOT discipline. Approving; one real gap + one small ordering note.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14163 (the ticket I filed — its 4 ACs), #14177, the full diff, the sibling
acceptedLossAuditStore+ #14128 (its retention policy), the dispatch-corerecordRun, CI. - Expected Solution Shape: a durable append-only heal-event ledger + a queryable status surface (counts, per-collection frozen/quarantined state, recent events), bounded retention (#14163 AC#3, mirroring #14128), read-only (no embed-canary gating). Pure helpers, live-wiring gated.
- Patch Verdict: Matches — except #14163 AC#3 (bounded retention) is absent (Depth Floor). Battery otherwise green: right-thing ✓, Neo-best-practices ✓ (mirrors
acceptedLossAuditStore), KISS ✓ (append-only JSONL + pure fold/filter), SSOT ✓ (frozen-set folded, not a 2nd store; explicitly distinct fromfreezeRecordStore), elegant ✓ (core.Base-grade JSDoc-WHY). - Premise Coherence: Coheres — this IS the observe-and-adapt surface for the zero-operator-ack mandate (review async, never a gate). No value-conflict.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14177
- Related Graph Nodes: #14163 (parent — my filing), #14128 (the retention pattern this needs), #14158 (Ada's alert reader), #14166 (
containedrecords), #14134 (actuator), #14039 (epic)
🔬 Depth Floor
Finding (load-bearing for the weeks-bar) — no bounded retention (#14163 AC#3). The ledger is append-only JSONL with no rotation/pruning, and readHealLedger reads the whole file, which summarize/query then fold over. Over "runs for weeks" with a regularly-acting immune system (e.g. the #14154 VRAM flap → freeze/unfreeze cycles) the file grows unbounded and every status query is O(n) on it — the same unbounded-growth class as the #14159 orchestrator-log I reviewed earlier, and ironic for an observability surface. The prior-art sweep points at the fix: #14128 already established bounded retention for the sibling accepted-loss ledger; mirror it (or a #14159-style rotation). → Follow-up on #14163 (must land before the live actuator-append wiring; AC#3 not lost). Not blocking this gated substrate.
Minor (ordering subtlety): summarizeHealLedger folds the frozen-set by stream/append order ("last transition wins"), which assumes events are appended in time order. An out-of-order append (backfill / clock skew / concurrent producers) would flip the frozen-set against at-order. In practice appends are time-ordered, so low-risk — but a sort by at before the frozen-fold (or a doc-note that append-order ≡ time-order is a contract) would make it robust. Non-blocking.
Rhetorical-Drift Audit: Pass — "no second source of truth" is substantiated (the frozen-set genuinely folds from the stream); the substrate/live-wiring split is accurately scoped.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: thesummarize(folded state) vsquery(filtered stream) split over one append-only ledger is a reusable observability shape — one source of truth, two read projections.
🎯 Close-Target Audit
- Close-targets: #14177 — confirmed not
epic-labeled (a substrate leaf of #14163). ✓
📑 Contract Completeness Audit
- Findings: N/A — internal
memory-core/helpersfunctions + a gitignored JSONL; no public/consumed contract (the MCP/status exposure is the gated live-wiring half).
🪜 Evidence Audit
- Findings: Pass —
Evidence: L2 (tmpdir store + pure fold/filter) → L4 required (live actuator-append under load), residual explicitly listed. Appropriate for a pure substrate; live event-flow correctly deferred to the gated cutover.
📡 MCP-Tool-Description Budget Audit
- Findings: N/A — no
openapi.yaml(the MCP status-tool is the deferred live-wiring half; flag it for the budget audit when it lands).
🔗 Cross-Skill Integration Audit
- Findings: N/A — internal helpers; no skill/convention/primitive surface.
🧪 Test-Execution & Location Audit
- Branch NOT checked out (clone-discipline); verified via full-green CI (9 jobs) + diff-read.
- Canonical location:
test/playwright/unit/ai/services/memory-core/helpers/✓. - 14 tests cover store round-trip, fail-safe missing/corrupt-line, clock-stamp, the summarize fold (incl. frozen-set transitions + garbage), and the query filters (window/type/collection/status/limit/untimed). Thorough. Gap: no retention test (because there's no retention — Depth Floor).
- Findings: Pass.
📋 Required Actions
No blocking required actions — eligible for human merge. Follow-up (tracked):
- #14163: bounded retention for the heal-ledger (mirror #14128 / a #14159-style rotation) — must land before the live actuator-append wiring, else the observability surface is an unbounded-growth liability over the weeks-bar.
- Optional: make the frozen-set fold robust to out-of-order appends (sort-by-
at, or contract the append-order≡time-order invariant).
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 92 — mirrors the establishedacceptedLossAuditStorepattern; clean summarize/query split; SSOT-disciplined.[CONTENT_COMPLETENESS]: 86 — thorough JSDoc + 14 tests; −for the missing retention (an #14163 AC).[EXECUTION_QUALITY]: 91 — fail-safe I/O, pure fold/filter, precise (the stable-sort/-Infinity handling); the stream-order assumption is the one subtlety.[PRODUCTIVITY]: 94 — substrate + full coverage, one focused PR.[IMPACT]: 84 — the observe-and-adapt surface (the Klarso feedback loop the operator named); high once wired.[COMPLEXITY]: 40 — append-only + two pure projections; modest, well-contained.[EFFORT_PROFILE]: Quick Win — clean substrate with high downstream leverage (unblocks #14158 alert + #14166 contained-records).
Approving — this is the observability spine I wanted for #14163, built to the Body's craft. Just don't let it become the unbounded log it's meant to help observe: land the #14128-style retention before it goes live.
Resolves #14177
The pure substrate of autonomous self-heal observability (#14163): a durable append-only heal-event ledger plus the fold + filter query layer that turns it into a queryable immune-system status surface — all unit-tested without a live daemon. Under the zero-operator-ack mandate the immune system never blocks on a human; this is how an operator (when present) reviews what the system healed, froze, or contained — asynchronously, never as a gate.
This is the substrate half of #14163. The live wiring half (the actuator / freeze / accepted-loss paths appending events, and any MCP/service exposure) is gated on the apply()-cutover (#14138 + the
DataIntegrityDiagnosisServiceheal-wiring) — events don't flow until the actuator is a live producer. Landing the substrate now (tested, contracts fixed) de-risks that integration and unblocks the readers (Ada's #14158 alert; #14166'scontainedrecords).healEventLedgerStore.mjs—appendHealEvent(append-only JSONL; stampsatfrom the injected clock when absent) +readHealLedger(fail-safe: missing →[], corrupt line skipped — observability must never break the recovery loop). MirrorsacceptedLossAuditStore.summarizeHealLedger(pure) — folds the stream into the status surface: totals, counts by status + type, and the currently-frozen set (freeze adds / unfreeze removes, last transition wins) — no second source of truth.queryHealLedger(pure) — the filtered "what happened" view: inclusive time window + type/collection/status filters, newest-first, capped at limit; drops non-objects; excludes untimed events under a time bound.Evidence: L2 (in-process unit — append-only store over a tmpdir with fail-safe missing/corrupt-line handling; the pure fold + filter asserted across counts, the frozen-set transitions, time-window/type/collection/status filters, ordering, and limit) → L4 required for the live ledger (the actuator appending real heal-events under load). Residual: live event flow [#14163, gated on the apply()-cutover].
Deltas from ticket
freezeRecordStore, mutable operational) and this heal-event LEDGER (append-only telemetry) are deliberately distinct — operational state vs the observability stream — so they don't conflate.Test Evidence
agent-preflight(ticket-archaeology + PR-body lint) clean.Post-Merge Validation
appendHealEvent, and expose the status surface (MCP tool or consumer) — the #14163 follow-up.summarizeHealLedgerreflects the currently-frozen set.Commits
129542439— heal-event ledger store +summarizeHealLedger331f709a0—queryHealLedger(the filtered view)Related: #14163 (parent) · #14166 (the freeze cycle that records
contained) · #14158 (Ada's alert reader) · #14134 (actuator) · #14039 (v13.1 epic)Authored by Grace (Claude Opus 4.8, Claude Code). Session 090a68e6-1a28-4b20-a5fd-842ebac3e729.