Trilha 3 » 3.6 Auto-Memory & Dreams
Modulo 3.6

💭 Auto-Memory & Dreams

Dois processos background: extraction per-turn e consolidation cross-session (Dream). Recall seletivo via Sonnet e o lock file elegante.

⏱ ~50 min 📊 7 secoes 🎯 Avancado
1

Memory Directory & Four Types

Claude Code opera dois processos background: extraction per-turn (Layer 1) e consolidation cross-session (Layer 2 -- Dream). At query time, Recall seleciona memories relevantes.

~/.claude/projects/<slug>/memory/
  MEMORY.md            # index -- always in system prompt
  user_role.md         # topic files
  feedback_testing.md
  project_auth.md
  .consolidate-lock    # mtime == lastConsolidatedAt
  logs/                # KAIROS/assistant-mode only
    2026/03/2026-03-31.md
user

Profile, role, goals

feedback

Corrections + Why + How

project

Ongoing work, deadlines

reference

External pointers

2

Layer 1: Extract Memories

No fim de cada query, handleStopHooks fires executeExtractMemories(). Usa forked agent pattern compartilhando prompt cache do parent.

Closure-Scoped State

let lastMemoryMessageUuid: string   // cursor
let inProgress: boolean               // overlap guard
let pendingContext: ...                // stash for trailing run
let turnsSinceLastExtraction: number   // throttle counter

Two-Turn Extraction Strategy

Turn 1: Issue all Read calls in parallel para files a serem atualizados
Turn 2: Issue all Write/Edit calls in parallel para salvar memories

Mutual Exclusion

if (hasMemoryWritesSince(messages, lastMemoryMessageUuid)) {
  logEvent('tengu_extract_memories_skipped_direct_write')
  return  // main agent already handled it
}
flowchart TD
  A["handleStopHooks fires
executeExtractMemories()"] --> B{"inProgress?"}
  B -->|"yes"| C["Stash context in pendingContext"]
  B -->|"no"| D{"hasMemoryWritesSince
(main agent wrote)?"}
  D -->|"yes"| E["Advance cursor
Skip fork"]
  D -->|"no"| F["scanMemoryFiles()
Build manifest"]
  F --> G["buildExtractAutoOnlyPrompt()"]
  G --> H["runForkedAgent()
maxTurns=5"]
  H --> I["Turn 1: parallel Read calls"]
  I --> J["Turn 2: parallel Write/Edit calls"]
  J --> K["Advance cursor"]
  K --> L["extractWrittenPaths()"]
  L --> M{"pendingContext?"}
  M -->|"yes"| N["Run trailing extraction"]
  M -->|"no"| O["appendSystemMessage:
Saved N memories"]
                    
3

Layer 2: Auto Dream (Consolidation)

Fires via executeAutoDream() no fim do query-loop quando tres gates passam:

Gate 1: Time

Hours since lastConsolidatedAt >= 24h (default)

Gate 2: Sessions

Transcript files >= 5 sessions (default)

Gate 3: Lock

Nenhum outro processo mid-consolidation

Lock File Elegante

.consolidate-lock: body holds holder's PID. mtime IS lastConsolidatedAt -- ler o timestamp custa apenas um stat() call.

Consolidation -- 4 Phases

1 Orient: ls memory dir, read MEMORY.md, skim topic files
2 Gather: Check daily logs, grep transcripts narrowly
3 Consolidate: Write/update topic files, merge duplicates, convert relative dates
4 Prune & Index: Update MEMORY.md, keep under 200 lines / 25KB
4

Recall: findRelevantMemories

At query time, Sonnet side-query seleciona ate 5 topic files relevantes.

Selecao

  • Sonnet selector picks max 5 files
  • Reads only first 30 lines (frontmatter range)
  • Staleness caveat injected if > 1 day old

Tool Suppression

Se modelo esta usando tool ativamente (ex: mcp__X__spawn em recentTools), reference documentation desse tool e suprimida para evitar redundancia.

"This memory is 47 days old. Memories are point-in-time observations, not live state."

5

Team Memory Scope Routing

Scope routing per type e enforced via prompt guidance, nao filesystem permissions:

user

Always private

feedback

Default private; team only for project-wide conventions

project

Strongly bias toward team

reference

Usually team

6

KAIROS Mode & Cache Efficiency

KAIROS / Assistant Mode

Sessoes longas usam append-only daily logs em logs/YYYY/MM/YYYY-MM-DD.md. Separate nightly /dream skill distila logs em topic files.

Cache Efficiency

Forked agent shares parent's prompt cache. Tool list deve match main agent para cache sharing -- tools sao parte da cache key.

7

AutoDream Gate Chain

flowchart TD
  A["Post-sampling hook fires"] --> B{"isGateOpen?"}
  B -->|"kairosActive"| X["Skip -- KAIROS uses disk-skill dream"]
  B -->|"!autoMemEnabled"| Z["Skip"]
  B -->|"pass"| C{"Time gate
hoursSince >= minHours?"}
  C -->|"no"| Skip1["Return"]
  C -->|"yes"| D{"Scan throttle
lastScanMs >= 10min?"}
  D -->|"no"| Skip2["Return"]
  D -->|"yes"| E["Scan sessions since lastConsolidatedAt"]
  E --> F{"Session count >= minSessions?"}
  F -->|"no"| Skip3["Return"]
  F -->|"yes"| G["tryAcquireConsolidationLock"]
  G -->|"null -- locked"| Skip4["Return"]
  G -->|"priorMtime"| H["registerDreamTask UI"]
  H --> I["runForkedAgent -- dream prompt"]
  I --> J["completeDreamTask
appendSystemMessage"]
                    

📋 Resumo do Modulo

Extraction roda post-query como forked sub-agent com prompt cache sharing
Lock file mtime IS lastConsolidatedAt -- um stat() read
4-type taxonomy mantem memoria livre de conteudo derivavel
Recall: Sonnet picks max 5 files, suppresses reference docs for active tools
"Before recommending from memory" header outperformed abstract variants
Team memory scopes: prompt guidance, not filesystem permissions
Dream 3 gates: 24h time, 5+ sessions, lock available
KAIROS: append-only daily logs + /dream nightly distillation
3.5 Memory System Voltar a Trilha 3