recall-context
Show what memory files are loaded and available in the current session.
Pressure-based memory cleanup. Demotes, archives, or pins entries when working memory exceeds budget.
Claude Code
$ npx -y skills add davegoldblatt/total-recall --skill recall-maintain --agent claude-code
Codex
$ npx skills add davegoldblatt/total-recall --skill recall-maintain -a codex -y
Cursor
$ npx skills add davegoldblatt/total-recall --skill recall-maintain -a cursor -y
Gemini CLI
$ npx skills add davegoldblatt/total-recall --skill recall-maintain -a gemini-cli -y
GitHub Copilot
$ npx skills add davegoldblatt/total-recall --skill recall-maintain -a github-copilot -y
OpenCode
$ npx skills add davegoldblatt/total-recall --skill recall-maintain -a opencode -y
Windsurf
$ npx skills add davegoldblatt/total-recall --skill recall-maintain -a windsurf -y
description: Pressure-based memory cleanup. Demotes, archives, or pins entries when working memory exceeds budget. disable-model-invocation: true
Run maintenance on the memory system. Primary function: pressure-based demotion when working memory exceeds the word budget. Secondary: stale entry verification, contradiction checks, open loop review.
**Check for IDs first.** Scan all managed files (CLAUDE.local.md, memory/registers/*.md, memory/archive/**/*.md) for single-line list item entries (lines starting with `- `, not inside code blocks, not placeholders).
Cannot run maintain: [N] entries are missing IDs. Run /recall-init-ids first to tag all entries.
Cannot run maintain: duplicate ID found.
ID: ^tr8f2a1c3d7e
1. CLAUDE.local.md line 15
2. registers/preferences.md line 8
Resolve manually before running maintain.If preconditions pass, proceed.
**Parse entries** from all managed files. For each entry, extract:
**Load metadata** from `memory/.recall/metadata.json`:
Count words in working memory entries only (tier=working):
Report:
Working memory: [working_words] words (target: 1500)
From working entries, exclude:
Score remaining working entries:
score = 1.0 * word_count(entry) + 0.1 * days_since(last_reviewed_at)
(If `last_reviewed_at` is missing, treat as 365 days.)
Sort by score descending. Take the top candidates until the sum of their word counts >= (working_words - 1500). This is the minimum set needed to bring working memory under budget.
Find any entry across all tiers where metadata has `status: "superseded"` and tier is NOT `archive`. These should be archived.
If no candidates (under budget and no superseded entries):
recall-maintain — all clear ━━━━━━━━━━━━━━━━━━━━━━━━━━ Working memory: [N] words (target: 1500) - under budget No superseded entries pending cleanup. No action needed.
Otherwise, present each candidate with its reason:
recall-maintain — [N] candidates ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Working memory: [working_words] words (target: 1500, over by [N]) Pressure candidates (need to free [N] words): 1. [CLAUDE.local.md] 23 words, last reviewed 45 days ago "Dave prefers concise error messages and no unnecessary logging" → [k]eep / [p]in / [s]nooze / [d]emote / [a]rchive / [m]ark superseded 2. [CLAUDE.local.md] 18 words, last reviewed 30 days ago "Current deployment target is AWS us-east-1 with fallback to us-west-2" → [k]eep / [p]in / [s]nooze / [d]emote / [a]rchive / [m]ark superseded Superseded cleanup: 3. [registers/tech-stack.md] status: superseded "Using Node 16 in production" → [a]rchive (recommended) / [k]eep Apply all / decide individually?
For each candidate, apply the chosen action:
**keep**: Update `last_reviewed_at` to now in metadata. No file changes.
**pin**: Set `pinned: true` and update `last_reviewed_at` in metadata. No file changes. Entry will be excluded from future pressure candidates.
**snooze**: Set `snoozed_until` to now + 30 days (or user-specified duration) and update `last_reviewed_at` in metadata. No file changes. Entry will be excluded from pressure candidates until the snooze expires.
**demote** (working -> register): 1. Remove the entry line from CLAUDE.local.md 2. Append the entry line (with ID) to `memory/registers/_inbox.md`
# Inbox
> Entries demoted from working memory. Review and file into appropriate registers.3. Update metadata tier to `register` and `last_reviewed_at` to now
**archive** (working or register -> archive): 1. Remove the entry line from its current file 2. Append the entry line (with ID) to `memory/archive/ARCHIVE.md`
# Archive
> Archived memory entries. Searchable but never auto-loaded.3. Update metadata: set `status: "archived"`, `tier: "archive"`, `last_reviewed_at` to now
**mark_superseded**: Set `status: "superseded"` and `last_reviewed_at` to now in metadata. No file changes. Entry will appear in superseded cleanup on next maintain run.
When moving entries between files:
After all actions are applied, write `memory/.recall/metadata
A memory system for Claude Code that remembers what matters and forgets what doesn't.
Show what memory files are loaded and available in the current session.
Mark memory entries as superseded. Preserves history, does not delete.
Add durable IDs to memory entries. Required before /recall-maintain can run.
Scaffold the Total Recall memory directory structure in this project.
Review daily logs and promote entries to registers or working memory.
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.