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
/memoriestool 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 diffas 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).