Agent skill
auto-dream
Background memory consolidation and learning graduation — overnight knowledge lifecycle.
Install this agent skill to your Project
npx add-skill https://github.com/notque/claude-code-toolkit/tree/main/skills/auto-dream
SKILL.md
Background memory consolidation cycle. Scans memory files, finds stale/duplicate/conflicting entries, consolidates, synthesizes cross-session insights, builds an injection-ready payload for next session start, and writes a dated dream report.
When to invoke
- User says "run dream", "consolidate memories", "clean up memories", "memory maintenance", "deduplicate memories"
- Cron job at 2 AM nightly via wrapper script:
scripts/auto-dream-cron.sh --execute - Manual trigger for testing:
./scripts/auto-dream-cron.sh(dry-run by default)
Instructions
When invoked interactively (not via cron), read skills/auto-dream/dream-prompt.md and execute its phases directly. The prompt is self-contained — it describes the full seven-phase cycle including safety constraints, file paths, and output formats.
For cron invocation: the dream prompt is passed directly to claude -p and runs as a standalone headless session with no CLAUDE.md, no hooks, no project context. All instructions are embedded in the prompt.
Phases
- SCAN — Read all memory files, query learning.db sessions (last 7 days), read recent git log. Write scan document to
~/.claude/state/dream-scan-{date}.md. - ANALYZE — Identify stale, duplicate, conflicting memories and cross-session patterns. Write analysis to
~/.claude/state/dream-analysis-{date}.md. - CONSOLIDATE — Apply consolidation actions (max 5 changes). Archive stale/merged files, update MEMORY.md atomically.
- SYNTHESIZE — Create insight memories from cross-session patterns (max 2 new memories per cycle).
- GRADUATE — Promote mature learning DB entries (confidence >= 0.9, 3+ observations) into agent/skill files as permanent anti-patterns. Commits on
dream/graduate-YYYY-MM-DDbranch for human review. Max 3 per cycle. (ADR-159) - SELECT — Build injection-ready payload for session start. Write to
~/.claude/state/dream-injection-{project-hash}.md. - REPORT — Write dream summary to
~/.claude/state/last-dream.md.
Safety constraints (always enforced)
- Never delete files — archive to
memory/archive/, neverrm - Write the REPORT before executing any CONSOLIDATE filesystem operations
- Maximum 5 memory changes per cycle — excess items deferred to next cycle
- Flag conflicts for human review, never auto-resolve
- Preserve YAML frontmatter when merging; use
merged_fromfield for provenance - In dry-run mode (the default), CONSOLIDATE, SYNTHESIZE, and GRADUATE describe proposed changes only — no filesystem writes or git operations. The wrapper script sets
DREAM_DRY_RUN_MODE=yeswhich is substituted into the prompt at runtime. - GRADUATE commits on a feature branch (
dream/graduate-*), never on main — user reviews and merges - Maximum 3 graduations per cycle — only entries with confidence >= 0.9 and 3+ observations
Testing
# Dry run (read-only, no filesystem changes — dry-run is the default)
./scripts/auto-dream-cron.sh
# Full run (execute consolidation)
./scripts/auto-dream-cron.sh --execute
# Check output
cat ~/.claude/state/last-dream.md
# Check graduation candidates (what dream would graduate)
python3 -c "
import sys; sys.path.insert(0, 'hooks/lib')
from learning_db_v2 import query_graduation_candidates
import json
candidates = query_graduation_candidates()
print(json.dumps(candidates, indent=2))
"
# Check if a graduation branch exists
git branch --list 'dream/graduate-*'
# Verify cron registration
python3 ~/.claude/scripts/crontab-manager.py list
Cost estimate
~$0.09 per nightly run with 50 memory files (~20-30K input tokens at Sonnet pricing). ~$33/year for automated overnight operation. Budget capped at $3.00/run via wrapper script.
Cron setup
Use crontab-manager.py (not raw crontab -e) to install. The wrapper script handles PATH, lockfile, logging, budget cap, and dry-run/execute toggle.
# Preview the cron entry
python3 ~/.claude/scripts/crontab-manager.py add \
--tag "auto-dream" \
--schedule "7 2 * * *" \
--command "/home/feedgen/claude-code-toolkit/scripts/auto-dream-cron.sh --execute >> /home/feedgen/claude-code-toolkit/cron-logs/auto-dream/cron.log 2>&1" \
--dry-run
# Install (after dry-run testing passes)
python3 ~/.claude/scripts/crontab-manager.py add \
--tag "auto-dream" \
--schedule "7 2 * * *" \
--command "/home/feedgen/claude-code-toolkit/scripts/auto-dream-cron.sh --execute >> /home/feedgen/claude-code-toolkit/cron-logs/auto-dream/cron.log 2>&1"
# Verify
python3 ~/.claude/scripts/crontab-manager.py verify --tag auto-dream
Note: schedule uses 2:07 AM (off-minute) per cron best practice — avoids load spikes from jobs firing at :00.
Wrapper script details
scripts/auto-dream-cron.sh follows the established headless cron pattern (see scripts/reddit-automod-cron.sh):
flocklockfile prevents concurrent runs--permission-mode auto(never--dangerously-skip-permissions)--max-budget-usd 3.00caps spend per run--no-session-persistencefor clean headless operationenvsubsttemplatesdream-prompt.mdwith project-specific paths at runtimeteeto timestamped per-run log file- Dry-run by default,
--executefor live runs - Exit code propagation via
PIPESTATUS[0]
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
voice-writer
Unified voice content generation pipeline with mandatory validation and joy-check. 9-phase pipeline: LOAD, GROUND, GENERATE, VALIDATE, REFINE, JOY-CHECK, OUTPUT, CLEANUP. Use when writing articles, blog posts, or any content that uses a voice profile. Use for "write article", "blog post", "write in voice", "generate content", "draft article", "write about".
image-auditor
Non-destructive image validation for accessibility and health.
video-editing
Video editing pipeline: cut footage, assemble clips via FFmpeg and Remotion.
comment-quality
Review and fix temporal references in code comments.
e2e-testing
Playwright-based end-to-end testing workflow.
anti-ai-editor
Remove AI-sounding patterns from content.
Didn't find tool you were looking for?