| name | aim-content-drift |
| description | Detect content drift of an operator's scaffolded sanctum files (BOND, CAPABILITIES, CREED, INDEX, LORE, MEMORY, PERSONA, PULSE) against the evolving reference templates, and surface recommended add/remove WITH rationale — never a silent overwrite. Use on a session-start drift check, after the reference templates change, or when the operator asks whether their sanctum is current. |
| allowed-tools | Bash, Read |
aim-content-drift — Sanctum Content-Drift Detection
When an operator's already-scaffolded sanctum files drift from the evolving reference
templates, the operator must see a recommended add/remove with rationale — never a
silent overwrite, never a hard-default to stale content. This generalizes the
langfuse-guard version-drift pattern (recorded reference, offline detection,
surface→human-decides, never auto-apply) from version drift to content drift.
The deterministic mechanics (unit parsing, anchored-fingerprint comparison,
classification, ack bookkeeping) live in scripts/content_drift.py, invoked by
path. This file decides when to run and how to read the recommendations.
v1 is detect + acknowledge, and is READ-ONLY for sanctum content — it never
writes a sanctum file or a template. Applying a recommendation is the operator's
manual edit (an --apply path is deferred). The only files the skill writes are its
own per-project ack sidecar (via --ack / --prune-ack).
Known v1 limitation (the ORPHAN remove heuristic). ORPHAN — the only class that
recommends removing a section — fires only when the operator's section is a pristine
scaffold remnant: the reference framing kept verbatim with each {placeholder}
resolved to a short value (a name, a date, a language). The remnant test is a bounded
heuristic, so a short, value-shaped fill that still preserves the full reference
framing can read as pristine even if the operator meant it as content. This is safe by
design: detect is read-only and the operator always decides, so a borderline ORPHAN is
only ever a suggestion to consider removing, never an automatic edit. Longer or
punctuation-joined fills exceed the bound and classify CUSTOMIZED (kept). A confirming
--apply path is deferred to v1.1.
When to use
- A session-start sanctum drift check, or after the reference templates change.
- The operator asks whether their sanctum is current with the standard.
Steps
-
Resolve the sanctum path: {project-root}/_ai-memory/sanctum/{agent_id}/.
-
Detect (DEFAULT — read-only):
python3 scripts/content_drift.py <sanctum-path>
Reports batched, severity-ranked recommendations (HIGH first), each with its
class (MISSING / SUPERSEDED / ORPHAN), rationale, and an --ack pointer. The
notify is a cheap count + pointer (index-not-log); add --show-diff for the full
previewable detail.
-
Read the recommendations. Each is explainable (which reference unit changed
and why) and previewable. CUSTOMIZED operator content is never recommended for
removal — only reference-owned units are ever surfaced. Nothing changes until the
operator chooses; apply by hand.
-
Acknowledge intentional divergence (writes the ack sidecar only):
python3 scripts/content_drift.py <sanctum-path> --ack LORE.md::system-architecture
An ack suppresses that recommendation until the reference unit changes again.
Drop entries whose unit no longer drifts with --prune-ack.
-
Verify: re-run detect. Acknowledged units no longer surface; a clean sanctum
reports no recommendations.
References
- The section/unit schema for the sanctum family:
references/unit-schema.md
- The MATCH/MISSING/SUPERSEDED/ORPHAN/CUSTOMIZED decision rule:
references/classification-rule.md