5.4 KiB
Memory Architecture
How Timmy remembers, recalls, and learns — without hallucinating.
Refs: Epic #367 | Sub-issues #368, #369, #370, #371, #372
Overview
Timmy's memory system uses a Memory Palace architecture — a structured, file-backed knowledge store organized into rooms and drawers. When faced with a recall question, the agent checks its palace before generating from scratch.
This document defines the retrieval order, storage layers, and data flow that make this work.
Retrieval Order (L0–L5)
When the agent receives a prompt that looks like a recall question ("what did we do?", "what's the status of X?"), the retrieval enforcer intercepts it and walks through layers in order:
| Layer | Source | Question Answered | Short-circuits? |
|---|---|---|---|
| L0 | identity.txt |
Who am I? What are my mandates? | No (always loaded) |
| L1 | Palace rooms/drawers | What do I know about this topic? | Yes, if hit |
| L2 | Session scratchpad | What have I learned this session? | Yes, if hit |
| L3 | Artifact retrieval (Gitea API) | Can I fetch the actual issue/file/log? | Yes, if hit |
| L4 | Procedures/playbooks | Is there a documented way to do this? | Yes, if hit |
| L5 | Free generation | (Only when L0–L4 are exhausted) | N/A |
Key principle: The agent never reaches L5 (free generation) if any prior layer has relevant data. This eliminates hallucination for recall-style queries.
Storage Layout
~/.mempalace/
identity.txt # L0: Who I am, mandates, personality
rooms/
projects/
timmy-config.md # What I know about timmy-config
hermes-agent.md # What I know about hermes-agent
people/
alexander.md # Working relationship context
architecture/
fleet.md # Fleet system knowledge
mempalace.md # Self-knowledge about this system
config/
mempalace.yaml # Palace configuration
~/.hermes/
scratchpad/
{session_id}.json # L2: Ephemeral session context
Components
1. Memory Palace Skill (mempalace.py) — #368
Core data structures:
PalaceRoom: A named collection of drawers (topics)Mempalace: The top-level palace with room management- Factory constructors:
for_issue_analysis(),for_health_check(),for_code_review()
2. Retrieval Enforcer (retrieval_enforcer.py) — #369
Middleware that intercepts recall-style prompts:
- Detects recall patterns ("what did", "status of", "last time we")
- Walks L0→L4 in order, short-circuiting on first hit
- Only allows free generation (L5) when all layers return empty
- Produces an honest fallback: "I don't have this in my memory palace."
3. Session Scratchpad (scratchpad.py) — #370
Ephemeral, session-scoped working memory:
- Write-append only during a session
- Entries have TTL (default: 1 hour)
- Queried at L2 in retrieval chain
- Never auto-promoted to palace
4. Memory Promotion — #371
Explicit promotion from scratchpad to palace:
- Agent must call
promote_to_palace()with a reason - Dedup check against target drawer
- Summary required (raw tool output never stored)
- Conflict detection when new memory contradicts existing
5. Wake-Up Protocol (wakeup.py) — #372
Boot sequence for new sessions:
Session Start
│
├─ L0: Load identity.txt
├─ L1: Scan palace rooms for active context
├─ L1.5: Surface promoted memories from last session
├─ L2: Load surviving scratchpad entries
│
└─ Ready: agent knows who it is, what it was doing, what it learned
Data Flow
┌──────────────────┐
│ User Prompt │
└────────┬─────────┘
│
┌────────┴─────────┐
│ Recall Detector │
└────┬───────┬─────┘
│ │
[recall] [not recall]
│ │
┌───────┴────┐ ┌──┬─┴───────┐
│ Retrieval │ │ Normal Flow │
│ Enforcer │ └─────────────┘
│ L0→L1→L2 │
│ →L3→L4→L5│
└──────┬─────┘
│
┌──────┴─────┐
│ Response │
│ (grounded) │
└────────────┘
Anti-Patterns
| Don't | Do Instead |
|---|---|
| Generate from vibes when palace has data | Check palace first (L1) |
| Auto-promote everything to palace | Require explicit promote_to_palace() with reason |
| Store raw API responses as memories | Summarize before storing |
| Hallucinate when palace is empty | Say "I don't have this in my memory palace" |
| Dump entire palace on wake-up | Selective loading based on session context |
Status
| Component | Issue | PR | Status |
|---|---|---|---|
| Skill port | #368 | #374 | In Review |
| Retrieval enforcer | #369 | #374 | In Review |
| Session scratchpad | #370 | #374 | In Review |
| Memory promotion | #371 | — | Open |
| Wake-up protocol | #372 | #374 | In Review |