LearnNewsExamplesServices
Frontmatter
id14246
titlev13.1 release-gate: no proactive ''backup is verified-restorable'' check — add a backup-restore canary (the #13999 discovery-point, automated)
stateClosed
labels
aitestingarchitecture
assignees[]
createdAtJun 27, 2026, 5:09 PM
updatedAtJun 28, 2026, 9:52 PM
githubUrlhttps://github.com/neomjs/neo/issues/14246
authorneo-opus-vega
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJun 28, 2026, 9:52 PM

v13.1 release-gate: no proactive 'backup is verified-restorable' check — add a backup-restore canary (the #13999 discovery-point, automated)

Closed v13.1.0/archive-v13-1-0-chunk-7 aitestingarchitecture
neo-opus-vega
neo-opus-vega commented on Jun 27, 2026, 5:09 PM

Problem

The v13.1 release-gate bar (Epic #14039) includes "a backup is verified-restorable." Nothing proactively verifies that:

  • restore.mjs/validateBundle validates a bundle's structure (subdir presence, first-line JSONL parseability) — not a full restore-roundtrip.
  • restore-hardening (#11150/#11151) tests the restore path works, not that a given backup is restorable.
  • #14027 dated the specific 06-18→20 vector-loss (one-off audit, now closed) — not a recurring capability.

This is the #13999 discovery-point inverted: the ~60% Memory Core vector loss surfaced ONLY when a canonical backup failed to restore — reactively, after ~weeks. A proactive backup-restore canary catches that class at first verify, not at a hand-run restore.

Fix shape

A scheduled backup-restore canary (orchestrator lane or CI): restore the latest backup into an ISOLATED store (fs.mkdtemp, never live) + run auditChromaVectorCoverage (+ row-count / no-metadata-only-row checks) on the restored snapshot → fail-loud (heal-event record / alarm) when the backup is not cleanly restorable. Closes the release-gate's verified-restorable clause.

Acceptance Criteria

  • A backup-restore canary restores the latest backup into an isolated store + verifies coverage / counts / no-metadata-only-rows.
  • An unrestorable or gutted backup fails loud (recorded + surfaced) — the #13999 class caught at verify-time, not at a failed hand-run restore.
  • Recurring (scheduled), not one-off; reuses auditChromaVectorCoverage + the restore path (no parallel harness).

Avoided traps

  • NOT just structure-validation (validateBundle) — a gutted store passes structure-validation but fails the coverage audit; the canary must do a real restore-roundtrip + coverage check.
  • Isolated store only (fs.mkdtemp) — never touches live data (mirrors the CorruptionRecoveryGate injector).

Related: Epic #14039 (the release gate — "a backup is verified-restorable"), #13999 (the incident, discovered via a failed backup), #14027 (the one-off 06-18→20 audit), #14165 (the self-heal soak — sibling release-gate proof), restore.mjs/validateBundle.

Authored by Vega (@neo-opus-vega · Claude Opus 4.8); guardian release-gate-completeness sweep (the Forensics / verified-restorable layer). Filed via gh relay (gh-author neo-opus-ada = shared-token artifact).

tobiu unassigned from @neo-opus-vega on Jun 28, 2026, 5:11 PM