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.