Second half of #29. The index was hand-maintained and had already drifted once: dream and experiment-spec shipped with no row, their rows lost to a squash-merge after a directory reorg. bin/check-index caught that after the fact; generating removes the class. The curated summary and trigger move into each SKILL.md as `summary:` and `use_when:`, carried over verbatim from the existing table rather than derived from `description:` — description is a paragraph written for model selection, and truncating it would have produced a worse table than the one it replaced. Knowledge now lives once, next to the skill it describes, which is the argument that made a hand-maintained index the wrong shape to begin with. The table is written between markers, so the wiring docs, the relationships tree and the trigger table below it are untouched — those are prose, not data. Rows are alphabetical now; the conceptual grouping the old order carried lives in the relationships tree, which is the better place for it. A fourth column shows each skill's surfaces, which is what makes #29's field visible rather than merely enforced. bin/check-index and its test are deleted: a generated table cannot drift in either direction, so `generate-index --check` subsumes both of its assertions. Verified by mutation — deleting the tdd row turns `task check` red with "SKILLS_INDEX.md is out of date". Closes #29 Bump-Type: minor
6.1 KiB
name, surfaces, summary, use_when, description
| name | surfaces | summary | use_when | description | |||
|---|---|---|---|---|---|---|---|
| dream |
|
Reflective consolidation pass over an agent's memory directory | Pruning/merging memory files, rebuilding a memory index | Run a "dream" — a reflective memory consolidation pass over an agent's memory directory. Use this skill whenever the user says "dream", "run a dream", "consolidate my memory files", "clean up my MEMORY.md", or asks Claude to do a memory maintenance pass, prune stale notes, or reorganize topic files. Also trigger when the user wants to rebuild a memory index, merge duplicate facts, or convert relative dates in notes to absolute ones. This is an agentic, multi-phase workflow — always use this skill rather than improvising the steps. |
Dream — Memory Consolidation Skill
You are performing a dream: a reflective, agentic pass over a memory directory. Your goal is to synthesize recent signal into durable, well-organized memory so that future sessions can orient quickly.
Pre-flight
Before starting, confirm:
- Where is the memory directory? Ask the user if not obvious from context.
Common locations:~/memory/,~/.agent/memory/,./memory/, a path in an env var like$MEMORY_DIR. - Are there transcripts or daily logs to scan? Ask if not obvious.
- Any topics to skip or treat as sensitive?
Once confirmed, proceed through the four phases in order. Narrate each phase briefly as you go.
Phase 1 — Orient
Goal: Get a map of what exists before touching anything.
ls -la <memory_dir>/
cat <memory_dir>/MEMORY.md
For each file listed (excluding MEMORY.md):
- Read or skim it (first 40–60 lines is usually enough unless it's small).
- Note: topic, approximate recency, any obvious staleness or duplication.
Build a mental inventory:
- Files present, rough line counts
- Topics covered
- Any files that look abandoned, mislabeled, or overlapping
Phase 2 — Gather Recent Signal
Goal: Find new facts, corrections, and drift since the last dream.
Check in this order:
-
Daily logs — read recent entries (last 7–14 days).
Look for: new decisions, changed preferences, completed projects, new relationships/tools. -
Drifted facts — scan existing topic files for statements that may now be false.
Examples: "currently evaluating X" (did they pick one?), "planning to do Y" (done or dropped?), relative dates like "last week" or "recently". -
Transcripts — only grep narrowly if there's a specific gap.
Avoid bulk-reading transcripts; it's slow and noisy. Use targeted patterns:grep -r "decided\|switched to\|no longer\|now using\|moved to" <transcripts_dir>/ | tail -40
Collect a list of updates to make: new facts, corrections, removals.
Phase 3 — Consolidate
Goal: Apply the updates. Leave memory files cleaner and more accurate than you found them.
For each topic file:
- Merge duplicates: if the same fact appears in two files, keep it in the more specific one and remove from the general one.
- Convert relative dates: replace "last week", "recently", "a few months ago" with an absolute date (use the current date as reference; estimate if necessary and note the uncertainty).
- Delete contradicted facts: if a new fact supersedes an old one, remove the old one outright — don't leave both.
- Tighten language: convert vague hedges ("probably uses", "might be") to definite statements where the evidence supports it, or remove if genuinely unknown.
- Add new facts from Phase 2 to the appropriate topic file. Create a new topic file if no good home exists.
After editing files, do a final pass:
grep -n "last week\|recently\|a few months\|soon\|currently planning" <memory_dir>/*.md
Clean up any remaining relative time references.
Phase 4 — Prune and Index
Goal: Rebuild MEMORY.md as a clean, navigable index under 200 lines.
MEMORY.md structure:
# Memory Index
_Last updated: YYYY-MM-DD_
## Overview
One short paragraph: who this agent is, primary context, most important standing facts.
## Topic Files
| File | Contents | Last updated |
|------|----------|-------------|
| person.md | Identity, preferences, background | YYYY-MM-DD |
| projects.md | Active and recent projects | YYYY-MM-DD |
| tools.md | Stack, infra, dev environment | YYYY-MM-DD |
| ... | ... | ... |
## Quick Facts
- Bullet list of the 10–15 most frequently-needed facts (role, location, key tools, etc.)
## Recent Changes
- Bullet list of what changed in this dream (so the next session knows what's fresh)
Rules:
- Remove any pointers to files that no longer exist.
- Add pointers for any new files created in Phase 3.
- Keep Quick Facts ≤ 15 bullets — this is for speed, not completeness.
- Recent Changes section replaces itself each dream (don't accumulate).
- Total MEMORY.md length: 200 lines max.
Output
After completing all four phases, return a dream summary to the user:
## Dream complete — YYYY-MM-DD
### What changed
- [file]: [what was updated]
- MEMORY.md: rebuilt index, N topic files indexed
### Facts added
- ...
### Facts removed / corrected
- ...
### Files created
- ...
### Files deleted or merged
- ...
### Still uncertain / needs follow-up
- ...
Keep it concise — a few bullets per section, not exhaustive diffs. The goal is for the user to quickly confirm the dream went well and catch any mistakes.
Tips and Edge Cases
- No MEMORY.md exists yet: create one from scratch using the structure above. Treat all existing files as "first time indexed".
- Memory dir is empty: create MEMORY.md and a starter
scratch.mdnoting the date and that the memory system is new. - Conflicting facts with no clear resolution: note both in the file with a date stamp and flag in "Still uncertain" section of the summary.
- Large transcript dumps: resist reading them in full. Grep is your friend. If you must read, read the last N lines only.
- Files with sensitive content: if the user flagged topics to skip, skip them entirely — don't even open them.