Memory

Curation Coverage — what LifeOS autonomic systems touch

Last synced: Oct 27, 2026

Curation Coverage — what LifeOS autonomic systems touch

LifeOS has several autonomic curation pipelines, each with its own SLA and write boundary. This document is the canonical matrix of which files are touched by which pipeline, and what’s left to manual writes.

The principle is: anything that matters for LifeOS’s context should be managed and curated, with different SLAs for different content types. Hot-layer memory loads every turn; identity-doctrine proposals fire on conversation cadence; TELOS reviews fire on a slower cron; manual files remain manual until promoted.

The four mutation tiers (memory subsystem)

Defined in LIFEOS/TOOLS/MutationTier.ts as a closed allowlist (default-deny):

TierBehaviorFiles
AAuto, set-overwritePRINCIPAL_MEMORY.md, DA_MEMORY.md
BLogged append + auditPROJECTS.md, CONTACTS.md, MEMORY/KNOWLEDGE/**, MEMORY/IDEAS/**
CPropose-only (queues for the principal’s yes unless its kind has a numeric auto-apply threshold in memory-review.json; the shipped template queues identity and operational-rule always, and this install maps every kind to null, so nothing auto-applies here, since 2026-10-08)PRINCIPAL_IDENTITY.md, DA_IDENTITY.md, WRITINGSTYLE.md, DEFINITIONS.md, CANONICAL_CONTENT.md, RESUME.md
DUntouchable by memory subsystemEverything else, including OPERATIONAL_PREFERENCES.md: operational-rule proposals name it as their target and wait in the queue for the principal’s yes, but MutationTier.ts does not list it

A new file added to ~/.claude/ is Tier D by default until a code change promotes it.

Coverage matrix

Curated by the memory subsystem (Reviewer + MutationTier)

FileTierCadenceSubtypeCurrently emitting?
USER/PRINCIPAL/PRINCIPAL_MEMORY.mdA8 turns / 30 min / 2 idlememory (actor=the principal’s name)✓ live (set-overwrite)
USER/DIGITAL_ASSISTANT/DA_MEMORY.mdASamememory (actor=the DA’s name)✓ live (set-overwrite)
USER/PROJECTS.mdBSameproposal (kind=projects) — propose-firstP1 extends
USER/CONTACTS.mdBSameproposal (kind=contacts) — propose-firstP1 extends
MEMORY/KNOWLEDGE/**BSameknowledge (append with related: merge)✓ live
MEMORY/IDEAS/**BSameidea (append)✓ live
USER/PRINCIPAL/PRINCIPAL_IDENTITY.mdCSameproposal (kind=identity)✓ live
USER/DIGITAL_ASSISTANT/DA_IDENTITY.mdCSameproposal (kind=identity)✓ live
USER/PRINCIPAL/WRITINGSTYLE.mdCSameproposal (kind=style)P1 extends
USER/DEFINITIONS.mdCSameproposal (kind=definition)P1 extends
USER/CANONICAL_CONTENT.mdCSameproposal (kind=canonical-content)P1 extends
USER/PRINCIPAL/RESUME.mdCSameproposal (kind=resume)P1 extends
USER/CONFIG/OPERATIONAL_PREFERENCES.mdD (proposal target)Sameproposal (kind=operational-rule)P1 extends

Curated by OTHER autonomic pipelines (orthogonal to MutationTier)

These files are Tier D from the memory subsystem’s POV (untouchable by the reviewer) but have their own dedicated writer:

FileWriterTriggerCadence
USER/TELOS/PRINCIPAL_TELOS.mdLIFEOS/TOOLS/GenerateTelosSummary.tsTELOS source-file changeManual run; planned cron in P2
USER/TELOS/LIFEOS_STATE.jsonLIFEOS/TOOLS/UpdateLifeosState.ts (measured progress from IdealState.ts reconcile first)DerivedSync / daily ideal-reconcileDaily
DOCUMENTATION/ARCHITECTURE_SUMMARY.mdLIFEOS/TOOLS/ArchitectureSummaryGenerator.tsDocIntegrity.hook.ts on SessionEndPer session end
LIFEOS/MEMORY/WORK/**/ISA.mdhooks/ISASync.hook.tsAlgorithm phase transitionsPer Edit (debounced 30s)
MEMORY/LEARNING/**WorkCompletionLearning and SatisfactionCapture hooks; SatisfactionCapture calls the FailureCapture.ts toolSessionEnd, UserPromptSubmitPer event
MEMORY/WISDOM/**Algorithm LEARN phase; otherwise hand-curated (no writer tool since 2026-10-14)Algorithm LEARN phasePer LEARN
MEMORY/SECURITY/**Safety.hook.ts (PermissionRequest path)Tool callsPer event
MEMORY/OBSERVABILITY/**Many hooks (EventLogger, MemoryReviewer, etc.)Tool eventsContinuous
MEMORY/STATE/work.jsonhooks/ISASync.hook.tsPhase transitionsPer change
MEMORY/STATE/session-names.jsonLIFEOS/TOOLS/SessionRename.ts (manual), the PromptProcessing hook’s naming step through hooks/lib/session-identity.ts (auto-name)First prompt at session start; manual renameOne-shot per session
MEMORY/VOICE/voice-events.jsonlhooks/handlers/VoiceNotification.ts, hooks/lib/notification-channel.tsVoice eventPer fire

Manual-only (no autonomic pipeline)

These files are Tier D AND have no other writer. The principal writes directly; the autonomic system never proposes changes.

File / DirectoryWhy manual
USER/TELOS/TELOS.md (the single unified source)Belief revision is deep-conviction work; planned P2 TELOS Reviewer will propose changes via the Telos skill Update intent, not direct edit
USER/PRINCIPAL/PRONUNCIATIONS.jsonVoice-server runtime config; principal-curated
USER/CONFIG/memory-review.jsonCadence config for the memory system itself; principal-curated to avoid recursive auto-tuning
USER/CONFIG/CREDENTIALS/**Security boundary — credentials never autonomic
USER/GEAR.md, USER/SECURITY/SecurityPosture.mdManually curated documentation (GEAR.md also skill-updated by gear-aware skills)
USER/BUSINESS/**, USER/HEALTH/**, USER/FINANCES/**Domain-specific, principal-curated
USER/INTEGRATIONS/*.yamlPer-skill config; principal-curated
USER/WORK/config.yamlWork-hub config; principal-curated
USER/CUSTOMIZATIONS/**Per-skill customizations; principal-curated
All of LIFEOS/DOCUMENTATION/ source files (except auto-generated summary)Architecture docs; principal-curated (the ArchitectureSummary derives FROM these)
CLAUDE.md, LIFEOS_SYSTEM_PROMPT.mdConstitutional layer; principal-curated
hooks/, skills/, Algorithm/, Tools/ sourceCode; principal-curated (the system has no auto-codegen path)
.env, settings.json, settings.system.jsonOperational config; principal-curated

SLAs per content type

Different content types update at fundamentally different rates. The cadence per autonomic surface:

Content classCadenceReason
Hot-layer memory (memory items)Per-turn-batched (8 / 30 min / 2 idle)Loads every turn; needs freshness
Knowledge graph (knowledge, idea)SameBM25 retrieval; freshness matters less
Identity / style / definition / canonical / resume / operational-rule proposalsSameQueued for the principal’s approval unless the kind has a numeric threshold in confidence_threshold_by_kind. The shipped template queues identity and operational-rule always; this install maps every proposal kind to null, so none auto-applies here (USER/CONFIG/memory-review.json, 2026-10-08). Logged in pending-proposals.jsonl
TELOS reviews (planned P2)Weekly cronBelief revision; deep observation window
Wisdom frame synthesis (planned P3)Monthly cronCompounding wisdom; long observation window
Architecture summaryPer-session-end (DocIntegrity hook on SessionEnd)Tracks source LifeosSystemArchitecture.md changes
Work / ISA / phase trackingPer Edit (debounced 30s)Mirror of in-flight Algorithm runs
Observability streamsContinuous (per event)Append-only telemetry

Roadmap

  • P1 (this build, 2026-05-25) — extend reviewer prompt with 7 new proposal subtypes (style, definition, canonical-content, resume, operational-rule, projects, contacts); persist target_kind on queue rows; render [kind] badge in Telegram; group pending by subtype in the memory-status CLI. (Telegram integration since removed 2026-07-15.)
  • Ideal-state loop (built 2026-10-07) — daily ideal-reconcile measures bound targets; weekly ideal-recommend proposes at most 3 IDEAL_STATE rows and 2 watchers, each applied only on the principal’s yes (IdealState.ts accept).
  • P2 (named follow-up ISA) — TELOS autonomic loop. Weekly TelosReviewer.ts cron that reads recent ISAs + LEARNING + WISDOM + recent PRINCIPAL_MEMORY snapshots, emits TELOS-change proposals (goal-deferral, new-strategy, mission-drift) routed via the Telos skill Update intent.
  • P3 (named follow-up ISA) — WISDOM autonomic loop. Monthly synthesis pass extracts new WISDOM frames from accumulated LEARNING signals; surfaces principle candidates via the Pulse dashboard for principal review-and-graduate.
  • P4 (named follow-up ISA) — On-demand LLM-agent retrieval tier (recall "<question>" CLI command) for deep questions that need tool-using LLM loops over KNOWLEDGE. Different latency budget, different use case from per-turn BM25.

Adding a new file to the curation system

The closed-allowlist posture means new files default to Tier D (untouchable). To bring a new file under autonomic curation:

  1. Add the absolute path to the appropriate Tier set in LIFEOS/TOOLS/MutationTier.ts (Tier A / B / C).
  2. If Tier C — add an entry to PROPOSAL_KIND_TO_FILES in LIFEOS/TOOLS/MemoryTypes.ts with a new target_kind value.
  3. Extend the reviewer prompt in LIFEOS/TOOLS/MemoryReviewer.ts with subtype guidance describing when to emit a proposal targeting the new kind.
  4. Add a row to the matrix above.
  5. Regenerate ARCHITECTURE_SUMMARY.md (or let the DocIntegrity hook do it on next SessionEnd).
  6. Run the MemoryTypes + MemoryReviewer smoke tests; they should still pass.

The principle: code is the source of truth; documentation mirrors. The MutationTier file is the authoritative list — this document is the human-readable view of it.

Examples

One conversation, four destinations

The whole matrix comes alive when you watch a single conversation get sorted. Suppose in one working session a user reveals four different things. Each is a different kind of fact, so each lands in a different place under a different SLA:

  • “I always want measurements in metric.” A durable operating preference → the reviewer emits a Tier C proposal (operational-rule). It queues and waits for the principal’s yes. The mechanism is the confidence_threshold_by_kind map in memory-review.json: kind → a number (that kind’s own auto-apply threshold) or null (never auto-apply; always queue). An install that sets every kind to null auto-applies nothing; the live values are whatever memory-review.json holds. A kind the map leaves out, or a missing map, falls back to confidence_threshold, and any value other than a number reads as null. The shipped template also sets identity and operational-rule to null, so edits to the always-loaded identity and rules files wait for review. (GHSA-xjxj-cqpp-gf82, @mj-deving; discussion #2229, @Steffen025)
  • A new collaborator named three times, with role and why they matter. → Tier B (contacts): a logged append to the contacts file, with an audit row. Additive, reversible, no approval gate.
  • “I’m currently deep in a migration.” Fast-moving current-state → Tier A (memory): auto set-overwrite into hot-layer memory, loaded on every future turn until it goes stale.
  • A change to a credentials file. → Tier D: untouchable. The memory system never proposes, never writes. It isn’t in the allowlist, so default-deny holds.

Same conversation, four fates — decided entirely by what kind of fact it is and which file it targets, never by how important it felt in the moment.

Why default-deny is the safe posture

The reason a new file is Tier D until code promotes it: silence is the safe failure. If the classifier is unsure where something belongs, the worst outcome is that nothing is written and a human curates it later — never that an autonomic pipeline mutates a file it was never meant to touch. Coverage is opt-in, one allowlist entry at a time.

Routing one captured fact

flowchart TD
    F[A fact appears in conversation] --> K{What kind of fact?}
    K -->|durable identity or rule| C[Tier C: propose-only]
    K -->|contact or knowledge| B[Tier B: logged append]
    K -->|current-state memory| A[Tier A: auto overwrite]
    K -->|not in the allowlist| D[Tier D: untouched]
    C --> P[Waits for the principal's yes]
    B --> W[Write plus audit row]
    A --> H[Loads every turn]

The diagram is the coverage decision in one frame: type and target decide the tier, the tier decides the behavior, and anything the allowlist doesn’t name falls through to Tier D and is left alone.