beadboard/.agents/skills/create-beads-orchestration/docs/memory-architecture.md

115 lines
4.2 KiB
Markdown
Raw Normal View History

# Memory Architecture
## Overview
Beads orchestration includes a passive knowledge capture system. As agents work, their insights can be voluntarily recorded into a persistent knowledge base that grows across sessions.
## How It Works
```
Agent runs bd comment BD-001 "LEARNED: ..."
|
v
PostToolUse hook (memory-capture.sh) detects LEARNED: prefix
|
v
Extracts structured entry into .beads/memory/knowledge.jsonl
|
v
Next session: session-start.sh surfaces recent knowledge
Agents search when investigating unfamiliar code
```
## Write Path
Agents write knowledge through the existing `bd comment` interface:
| Prefix | Who writes | Purpose |
|--------|-----------|---------|
| `LEARNED:` | Any agent (voluntary) | Conventions, gotchas, patterns discovered during implementation |
Example:
```bash
bd comment BD-001 "LEARNED: TaskGroup requires @Sendable closures in strict concurrency mode."
```
An async `PostToolUse` hook on the Bash tool intercepts these commands and extracts a structured JSONL entry. No changes to the beads CLI are required.
## Storage Format
`.beads/memory/knowledge.jsonl` -- one JSON object per line:
```json
{"key":"learned-taskgroup-requires-sendable-closures","type":"learned","content":"TaskGroup requires @Sendable closures in strict concurrency mode.","source":"supervisor","tags":["learned","async","concurrency"],"ts":1706360000,"bead":"BD-001"}
```
| Field | Description |
|-------|-------------|
| `key` | Auto-generated slug from type + first 60 chars of content |
| `type` | `learned` |
| `content` | The raw insight text |
| `source` | `orchestrator` or `supervisor` (detected from CWD) |
| `tags` | Auto-detected from content via keyword scan |
| `ts` | Unix timestamp |
| `bead` | The bead ID that produced this knowledge |
Same key = latest entry wins (deduplication on read).
## Read Path
### Automatic (session start)
`session-start.sh` displays the 5 most recent deduplicated entries when a new session begins:
```
## Recent Knowledge (12 entries)
[LEARN] MenuBarExtra popup closes on NSWindow activate. Use activates:false. (supervisor)
Search: .beads/memory/recall.sh "keyword"
```
### On-demand (recall script)
```bash
.beads/memory/recall.sh "keyword" # Search by keyword
.beads/memory/recall.sh "keyword" --type learned # Filter by type
.beads/memory/recall.sh --recent 10 # Show latest entries
.beads/memory/recall.sh --stats # Entry counts
.beads/memory/recall.sh "keyword" --all # Include archived entries
```
## Voluntary Contribution
Knowledge capture is opt-in. Agents are encouraged to log insights when they discover something worth remembering, but it is not enforced. The `SubagentStop` hook verifies worktree state, push status, and bead status — not knowledge contributions.
Exempt: `worker-supervisor` (low-level tasks that don't produce architectural insight).
## Rotation
When `knowledge.jsonl` exceeds 1,000 lines, the oldest 500 are moved to `knowledge.archive.jsonl`. The archive is searchable via `recall.sh --all`.
## File Layout
```
.beads/
memory/
knowledge.jsonl # Active knowledge store
knowledge.archive.jsonl # Rotated older entries
recall.sh # On-demand search script
.claude/
hooks/
memory-capture.sh # PostToolUse async hook (captures entries)
validate-completion.sh # SubagentStop hook (verifies work completion)
log-dispatch-prompt.sh # PostToolUse async hook (logs dispatch prompts)
session-start.sh # SessionStart hook (surfaces knowledge)
```
## Design Decisions
- **JSONL over SQLite**: Simpler, append-only, human-readable, git-trackable
- **grep + jq over embeddings**: Sufficient for project-scoped knowledge; no external dependencies
- **Passive capture via hooks**: Zero friction -- agents use `bd comment` as they already do
- **Voluntary contribution**: Knowledge base grows organically from genuine insights, not forced boilerplate
- **Same key = latest wins**: No explicit update/close lifecycle; knowledge self-corrects over time