Skip to content

Memory system evolution — what we borrowed and why

Set: 22 May 2026. Trigger: Sush surfaced obsidian-memory-for-ai and asked: "anything from this usable for our memory system?"

This doc captures the honest evaluation, the patterns we adopted, the patterns we explicitly rejected, and the reasoning chain — so future-Atlas doesn't re-litigate the decision.

The system we already had (pre-22 May 2026)

Tier What Where Size / load policy
1 — Identity & rules copilot-instructions.md ~/.copilot/ Always loaded · target 25 KB · was 50.9 KB
1 — Operational reference copilot-instructions-reference.md ~/.copilot/ Always loaded · target 30 KB · 23.7 KB
2 — Recent episodic session-journal.md ~/.copilot/ Always loaded · target 60 KB · 106.4 KB
2 — Older episodic session-journal-archive.md ~/.copilot/ Read on demand · unbounded
3 — Deep playbooks learning-docs/docs/reference/*.md C:\ssClawy\learning-docs\docs\reference\ Read on demand · ~40 docs
4 — Per-session scratch plan.md, files/, checkpoints/ ~/.copilot/session-state/<id>/ Ephemeral · garbage-collected
5 — Long-term facts (Clawpilot only) m_remember/m_recall SQLite store Clawpilot internal Clawpilot-only, CLI Atlas is blind to it
6 — Cross-session search session_store SQLite + FTS5 Read-only global Queried on demand

Known pain points: 1. Tier 1 is 2× over budget and growing every session. 2. Rules get added on single occurrences (one-off frustrations become permanent rules). 3. The inline routing table inside the soul file (every learn-doc path hardcoded) grows linearly with the playbook count. 4. Tier 5 (m_remember) is invisible to CLI Atlas — same memory across surfaces is a co-founder hard rule, but the substrate doesn't enforce it.

The system we evaluated

obsidian-memory-for-ai v3.1 (MIT, daily-driven since March 2026). Same core philosophy as ours — plain Markdown, file-system, no vector DB, portable across AIs. Three-layer split (sources/ raw inputs, memory/ LLM-maintained wiki, CLAUDE.md schema), four operations (Ingest / Query / Lint / Log), atomic facts in v3.

Evaluation matrix (Honest Idea Review)

Applied the 4 Principles (on-brand · client-side · zero-cost · low-maintenance) plus our 🔴 Honest Idea Review rule.

Pattern from their system Verdict Reasoning
Promote-on-2+-occurrences for CLAUDE.md ADOPT Direct fix for our soul-file bloat. Single-session frustration ≠ permanent rule. Zero infrastructure.
triggers.md — keyword → file routing externalised ADOPT Removes inline routing table from always-loaded soul file. Lets the playbook count grow without taxing every session.
Atomic files for Self-Reminders / Deadlines 🟡 DEFER to August audit Real win (~3–5 KB off soul file) but requires generator + per-reminder migration. Only worth doing if the August quarterly memory audit still shows Tier 1 bloated.
Reflect-after-session ritual 🟡 PARTIAL — pairs with promote-on-2+ Our Session End Checklist already covers reflection. The named addition is the 2+ guard, which we adopt via #1 above.
Bi-temporal frontmatter (valid_from/valid_to/recorded_at) REJECT We never run "what did I believe in March" queries. Overkill. Adds frontmatter discipline cost for zero retrieval value.
_inbox/ + operation envelopes for cooperative multi-agent writes REJECT Solves a problem we don't have. CLI and Clawpilot run one-at-a-time. Our parallel-git rules already cover the only concurrency we hit.
Full v3.1 atomic-facts vault reorg REJECT Too disruptive. We're not in Obsidian. A year of structure works. Migration cost > expected benefit.
Anthropic Memory Tool as runtime (/memories view/create/str_replace) REJECT (for now) Useful only inside pure Claude Code. We're a hybrid (Clawpilot + Copilot CLI). Revisit if/when one surface dominates.
linter.py regression suite for memory files REJECT Our quarterly audit reminder is enough at our scale (~50 files, single user). Adds maintenance burden.
Three-layer split (sources/wiki/schema) ☑️ ALREADY HAVE Maps cleanly: ~/.copilot/*.md = schema, learning-docs/docs/reference/*.md = wiki, session-state = ephemeral sources. No change.
Four operations (Ingest / Query / Lint / Log) ☑️ ALREADY HAVE (informal) Our Session Start + Session End checklists are Ingest + Log. Lint = quarterly audit. Query = ad-hoc reads. No formal naming change needed.

What we adopted (22 May 2026)

1. Promote-on-2+-Occurrences Rule

Added to copilot-instructions.md as a new section right after the Learn-Doc-First Rule.

Mechanism: - A "pattern" = a candidate rule, preference, or behaviour Sush expresses. - Default destination = current session's journal entry (Tier 2), not the soul file (Tier 1). - Soul-file promotion requires either: - The pattern observed in 2+ separate sessions (3+ for "strong" / blocking rules), OR - Sush explicitly says "make this a permanent rule" (express bypass — mirrors the outbound-comms bypass pattern). - Pending candidates live in a journal section: ## Rule candidates (pending promotion) — pinned at top, preserved across trim cycles.

Why this is the highest-ROI borrow: every rule in the soul file currently has a (set YYYY-MM-DD) tag. A scan of those dates against our journal shows roughly half came from single-session frustrations. The 2+ guard prevents that pattern from continuing.

2. triggers.md — routing externalised

Created C:\ssClawy\learning-docs\docs\reference\triggers.md. Contains: - Keyword → learn-doc(s) routing table (~25 rows). - Implicit triggers (no keyword, fires by action — e.g., "about to touch a practice exam file → read SLA section"). - Maintenance rule: new playbooks add a row here, not in the soul file.

Soul-file change: the inline routing table (lines 173–182 of copilot-instructions.md) collapsed to a single pointer at triggers.md.

Net size impact on Tier 1: ~1.2 KB freed immediately, plus prevents future growth as we add playbooks.

What we explicitly rejected and why (record for future-Atlas)

Don't re-evaluate these unless something material changes:

  • Bi-temporal frontmatter — rejected for retrieval-pattern mismatch. Re-evaluate if we ever build a "what did we believe at time X" feature.
  • Operation envelopes / _inbox/ cooperative writes — rejected because we're single-agent-at-a-time. Re-evaluate if CLI Atlas and Clawpilot Atlas ever genuinely write concurrently to the same files (they currently don't — Phase Queue protocol already serialises PAC work).
  • Anthropic Memory Tool runtime — rejected because we're hybrid. Re-evaluate if Copilot CLI gains a /memories tool or if we switch to pure Claude Code for daily work.
  • Vector DB / RAG layer — rejected on the same grounds the obsidian project rejects it: portability, transparency, git diff as audit, sub-500-files scale.

Cross-references

  • memory-system-architecture.md — the 6-tier diagram, when each tier is read, what NOT to add.
  • triggers.md — the new routing table this evaluation produced.
  • copilot-instructions.md § Promote-on-2+-Occurrences Rule — the soul-file rule this evaluation produced.
  • Session journal entry for 22 May 2026 — the conversational origin.

Last reviewed

22 May 2026. Re-evaluate during the August 2026 quarterly memory audit (already in soul-file Self-Reminders).