Project-knowledge — bugs found, architecture decisions, CI gotchas, WU discoveries
Vendor-personal
~/.claude/…/memory/ (or equivalent per vendor)
Only your vendor (e.g. Claude Code)
Calibrations — tool-invocation mechanics, behavioural feedback, user prefs
Classification rule: if another agent working on this project — using a different vendor or a fresh session — would benefit from knowing it, it’s shared. If it only changes how you (this specific vendor) should act, it’s vendor-personal.
Examples:
“The migration system has a 5MB file-size limit we hit last quarter” → shared (mem:create --type discovery)
“vitest run fails intermittently on Node 22 — rerun fixes it” → shared
“I prefer terse responses from the user” → vendor-personal
“The Edit tool needs exact whitespace match” → vendor-personal
For WU implementation work, the canonical cadence is three touchpoints:
Before you code: wu:brief auto-embeds the discoveries, known-issues, and coordination signals for this WU into a ## Memory Context section in the generated prompt (WU-1240, WU-2607). Read that section. For ad-hoc lookups mid-WU you can still call pnpm mem:context --wu WU-XXXX and pnpm mem:inbox directly.
During the WU: capture findings as you hit them with pnpm mem:create. Don’t wait until the end — you’ll forget.
Before wu:done: pnpm mem:triage --wu WU-XXXX --list lets you promote discoveries to new WUs or archive them.
WU-XXXX.json is the canonical session record for that WU. During the current migration window,
current.json remains as a compatibility pointer to the most recently started active session so
older readers can continue to resolve a session.
A common scenario: one agent works on a WU, hits context limits, and hands off to a fresh agent.
Agent 1 (hitting context limits):
# Agent 1 is running low on context# Save state before ending sessionpnpm mem:checkpoint --wu WU-042# Signal where we left offpnpm mem:signal "Tests written for auth flow, starting integration tests" --wu WU-042# Document the key decision madepnpm mem:create "Decision: Token refresh uses silent retry queue" \ --type note \ --wu WU-042 \ --tags decision,auth \ --priority P2
Agent 2 (resuming):
# New agent checks what's pendingpnpm mem:ready --wu WU-042# Output:# Session: abc123# WU: WU-042 (in_progress)# Lane: Framework: Core# Last signal: "Tests written for auth flow, starting integration tests"# Files touched:# - src/utils/auth.ts# - src/components/LoginForm.tsx# - tests/auth.test.ts## Pending decisions: 1# - Token refresh: Silent refresh with retry queue# Resume work with full contextcd worktrees/framework-core-wu-042
Multiple agents working on related WUs in different lanes.
# Agent A working on Core (WU-100)pnpm mem:signal "New validation port added: ValidationService" --wu WU-100# Agent B working on UI (WU-101) checks inboxpnpm mem:inbox# Output:# From: session-abc (WU-100, Framework: Core)# Signal: "New validation port added: ValidationService"# Time: 5 minutes ago# Agent B can now use the new port# No need for synchronous coordination
# Agent detects high context usage# Before spawning new agent:# 1. Checkpoint current statepnpm mem:checkpoint# 2. Signal detailed progresspnpm mem:signal "Auth flow 80% complete. Remaining: integration tests for refresh token. Files ready: src/auth/*.ts" --wu WU-042# 3. Document any in-progress decisionspnpm mem:create "Decision pending: error handling strategy (throw vs Result type)" \ --type note \ --wu WU-042 \ --tags decision,pending# 4. Now safe to spawn fresh agent# New agent will have full context via mem:ready
For sub-agent coordination, configure when agents must signal their progress:
# workspace.yamlmemory: progress_signals: enabled: true # When true, signals become mandatory frequency: 25 # Signal every N tool calls (0 = disabled) on_milestone: true # Signal after each acceptance criterion on_tests_pass: true # Signal when tests first pass before_gates: true # Signal before running gates on_blocked: true # Signal when blocked or waiting auto_checkpoint: false # Create checkpoint with each signal
Field
Default
Description
enabled
false
When true, signals are required at trigger points
frequency
0
Tool calls between auto-signals (0 = no frequency)
on_milestone
true
Signal after completing each acceptance criterion
on_tests_pass
true
Signal when tests first pass
before_gates
true
Signal before running quality gates
on_blocked
true
Signal when blocked or waiting on dependencies
auto_checkpoint
false
Automatically create checkpoint with each signal
When to use:
Parallel WUs: When multiple agents work on related WUs, signals prevent redundant work
Long-running tasks: For complex WUs, signals provide progress visibility
Orchestrator patterns: Parent agents can monitor child progress without context overhead
When configured, LumenFlow can create checkpoints automatically via Claude Code hooks, removing the need for manual mem:checkpoint calls during active work.
The PostToolUse hook tracks a per-WU counter in .lumenflow/state/hook-counters/<WU_ID>.json and creates a checkpoint when the counter reaches the configured interval (default: 30 tool calls). The SubagentStop hook always checkpoints because a sub-agent finishing represents a natural milestone.
Both checkpoint writes are backgrounded in a defensive subshell so the hook returns quickly and does not block the agent.
Previously, marking a signal as read required rewriting the entire signals.jsonl file. When multiple agents ran concurrently, this caused lost updates (one agent’s read-mark overwritten by another).
Signal receipts solve this by using append-only writes:
Reading signals (mem:inbox): Appends receipt entries instead of modifying the original signal
Loading signals (loadSignals): Merges effective read state from inline read: true (legacy) and appended receipts
Cleanup (signal:cleanup): Receipt-aware; removes orphaned receipts for deleted signals
No-mark mode (mem:inbox --no-mark): Read signals without generating receipts
Memory nodes accumulate over time. Without cleanup, stale nodes consume storage and slow context loading. The decay lifecycle provides automated archival based on a time-based relevance score.
Only via pnpm mem:cleanup (explicit operator control)
When trigger: on_done, decay archival runs as part of the wu:done lifecycle. Errors never block completion (fail-open). When decay is disabled, existing wu:done behavior is unchanged.