Memory Index Sync
Purpose / When to Activate
Activate when:
/gaai-statusreports files on disk not registered inindex.md- After a batch of DEC files were created outside the
decision-extractionskill - As a lightweight post-delivery gate to confirm index integrity
- Before running
memory-refreshormemory-compact(ensures index accuracy first)
This skill heals drift — it does NOT create new knowledge. It only registers things that already exist on disk but are missing from index.md.
Process
Step 1 — Decision Registry Sync
- Read all registry files at
contexts/memory/root (index.md+ anyindex-*.mdsiblings such asindex-decisions.mdwhen Decision Registry has been extracted per file-size budget) — extract all registered DEC IDs from any of them - Read
archive/superseded-decisions.archive.md"Superseded DEC entries" table — extract all archived DEC IDs (column 1) - Glob
decisions/DEC-*.md— list all files on disk, extract IDs from filenames - For each DEC file on disk:
- Read its YAML frontmatter :
id,domain,level,title,status,superseded_by,archived_to(coordinated withmemory-archive-supersededskill) - If
archived_to:field is set (e.g.archive/superseded-decisions.archive.md) AND the DEC ID is present in the archive index: SKIP active registration. The DEC's active home is the archive. Do NOT add a row to the active Decision Registry. (Prevents undo of archive operation bymemory-archive-supersededskill.) - If
archived_to:is set BUT no matching archive row: flag⚠️ ARCHIVE INCONSISTENCY: DEC-{N} frontmatter declares archived_to but no row in archive index— escalate, do NOT auto-add either way - If
archived_to:is NOT set AND DEC is not in any active registry: add a row to the appropriate Decision Registry — preferindex-decisions.mdif it exists (Decision Registry has been extracted there) ; otherwise add toindex.mdDecision Registry as before. Row form is pointer-only (permemory-index-compactskill):| DEC-{N} | {domain} | {level} | {≤30-word topic from frontmatter title or essence ; never copy from DEC body §s} | {status} {YYYY-MM-DD} |. HARD CAP : ≤ 200 chars. If the frontmatter title alone exceeds 200 chars (rare), use first clause + truncate. If frontmatterstatus: supersededandsuperseded_byis set: append⚠️ SUPERSEDED by DEC-{M}AND flag in report : "consider invokingmemory-archive-supersededfor DEC-{N}".
- Read its YAML frontmatter :
- For each registered DEC with no file on disk: flag
⚠️ MISSING FILEin the sync report — do NOT delete registry rows (possible archive situation)
Step 2 — File Count Update
Re-count all DEC-*.md files on disk. Update the Shared Categories table file count in index.md to match.
Step 3 — Summary File Sync
- Read
index.mdSummaries section — extract registered summary filenames - Glob
summaries/*.summary.md— list all files on disk - For each summary on disk not registered in
index.md: read its frontmatter, add entry to Summaries section - For each registered summary with no file on disk: flag
⚠️ MISSING FILE — update pointer or delete entryin sync report
Step 4 — Supersession Reconciliation
- For each DEC file on disk with
status: supersededin frontmatter:- Check if its registry row carries the
⚠️ SUPERSEDED by DEC-{M}marker - If not: add the marker to the registry row
- Check if its registry row carries the
- Verify the Superseded/Retracted table in
index.mdis consistent with the Decision Registry (no contradictions)
Step 5 — Index Frontmatter Update
Update index.md frontmatter updated_at field:
- Format:
{YYYY-MM-DD} ({N} entries synced, {M} anomalies flagged)— or(no drift — confirmed clean)if nothing changed
Step 6 — Archive Index Symmetry Check
- For every DEC ID in
archive/superseded-decisions.archive.md"Superseded DEC entries" table : verify there is exactly one matching pointer row inindex.md§ "Superseded (archived)" pointer table. Dangling archive row (no active pointer) = anomaly. - For every pointer row in
index.md§ "Superseded (archived)" : verify there is exactly one matching archive row. Orphan pointer (no archive backing) = anomaly. - Hand off to
memory-index-lintfor full discoverability invariant validation. Ifmemory-index-lintis invokable (shell available), runpython3 scripts/validate-memory-index.pyand requireCLEANexit before declaringDRIFT_HEALED; otherwise perform the L3 prompt-based check frommemory-index-lint/SKILL.md.
Output: Sync Report (inline, after completion)
# Memory Index Sync — {date}
## Changes Applied
- Registered: DEC-{A}, DEC-{B}, ..., DEC-{Z} (10 entries added to registry)
- Supersession markers added: DEC-{X} (→ DEC-{Y})
- File count updated: N → M
## Anomalies Flagged (requires human review)
- ⚠️ MISSING FILE: DEC-{N} registered but no file on disk
- ⚠️ ORPHAN SUMMARY: decisions-80-89.summary.md on disk, not in index
## Result: CLEAN | DRIFT_HEALED | ANOMALIES_FOUND
Quality Checks
- Only registers what exists on disk — never invents registry rows
- Never deletes existing registry rows (only flags anomalies)
- Sync report is always produced, even if no changes needed (
CLEAN) - Idempotent — running twice produces no additional changes
- Does not modify any file except
index.md
Non-Goals
This skill must NOT:
- Create new DEC files (use
decision-extraction) - Ingest new knowledge (use
memory-ingest) - Compact or archive memory (use
memory-compactormemory-refresh) - Modify DEC file content
Memory-index-sync heals the registry. It does not create or delete knowledge.