06-reference/research

multi agent resumability checkpointing caf

2026-06-10·research-brief·source: deep-research
multi-agentcheckpointingresumabilitycaforchestration

Multi-Agent Resumability and Checkpointing: What Mature Frameworks Do, and What CAF Should Steal

The question

How do production multi-agent frameworks (LangGraph, CrewAI, AutoGen, Anthropic's multi-agent research system) implement resumable state / checkpointing, and which patterns port to a markdown-skill plugin like CAF?


What we already know (from the vault)


What the web says

  1. LangGraph: thread-scoped checkpoints at every super-step boundary. A StateSnapshot is persisted (SQLite, Postgres, or custom backend) after every node execution, keyed to a thread_id. Resume loads the last snapshot and hands control back to the interrupted node — but critically, the node itself re-executes (not just the next instruction), which mandates idempotency for any side-effectful node. LangGraph Persistence Docs; Durable Execution in LangGraph — Vadim's blog

  2. LangGraph HITL uses the same interrupt() primitive as scheduled pauses. A node awaiting human approval calls interrupt(); a Command(resume=True) restarts it. The checkpoint holds the draft/pending state across process crashes and deploys, making multi-day human pauses safe. Vadim's blog

  3. LangGraph checkpointing has a durability mode tradeoff: sync (safe, slower) vs async (fast, can lose state on crash) vs exit (only on completion, no mid-run recovery). Even sync mode demands deterministic nodes — branching on now() or live randomness breaks resumability. Vadim's blog

  4. CrewAI has no built-in checkpointing. Its @persist() decorator automates state at developer-chosen points but leaves restart logic entirely to the developer. If a four-agent crew fails on agent three, you restart the whole crew or build your own recovery layer. Diagrid Blog; ZenML Blog

  5. Anthropic's multi-agent research system uses external storage + lightweight references, not full state replay. Subagents store work in external systems (filesystem, memory), then pass back lightweight references to the coordinator. When context approaches 200K tokens, agents save their research plan to memory before truncation. Checkpointing + retry logic allows resume from where an error occurred rather than restarting. The coordinator waits synchronously for each subagent batch before proceeding. Anthropic Engineering — How we built our multi-agent research system

  6. "Checkpoints are not durable execution" — the structural gap. Checkpointing says "I saved your state; you handle recovery." Durable execution (e.g., Dapr Workflows) says "your workflow will complete, period." The gap: no automatic failure detection, no automatic resumption, no duplicate prevention, and single-process execution with no distributed task coordination. This is an architectural difference, not a maturity gap — adding a better checkpointer doesn't close it. Diagrid Blog

  7. The Ralph Loop pattern (Anthropic) is the closest production analog to the CAF manifest bootstrap. An Initializer Agent creates a progress file, feature list, and initial git commit; every subsequent Coding Agent reads git logs and the progress file to orient itself, picks the next incomplete item, works, commits, and writes a summary. The filesystem provides continuity across context windows — no special framework infrastructure required. [Akshay Pachaar — Anatomy of an Agent Harness (vault: [[2026-04-10-akshay-pachaar-agent-harness-anatomy]])]


Convergences and contradictions

Convergences — CAF's manifest design maps cleanly onto established patterns:

Contradictions / divergences — where CAF differs from mature frameworks, and why:


Synthesis for RDCO

Adopt: the manifest-as-checkpoint store is validated. The engagements/<client>/manifest.yaml design converges with both LangGraph's thread-scoped state and Anthropic's external-storage + lightweight-reference pattern. The key insight from the frameworks: the checkpoint's job is to be the single authoritative record of "what's done and where to resume." CAF's manifest does exactly this. The phase-level granularity (coarser than LangGraph's super-step) is appropriate — phase boundaries are natural, semantically meaningful breakpoints for a consulting workflow, not an implementation shortcut.

Adopt: the lightweight-reference pattern for artifact handling. Anthropic's research system is explicit: subagents store work externally, return references to the coordinator. CAF's contracts/contract-N.yaml + assets/*.yaml with paths recorded in manifest.yaml is this pattern. The key discipline: the synthesizer writes the artifact to disk before updating manifest.yaml. If it crashes between those two writes, the next run can detect the orphaned artifact by checking artifact path existence vs manifest status. This is worth adding as an explicit invariant in the orchestrator: "a phase is complete only when its manifest entry AND its artifact file both exist."

Adapt: add explicit failure detection at the orchestrator level. The Diagrid critique is honest: checkpointing leaves recovery to the developer. /caf:run-engagement needs to handle the case where a phase's artifact exists but manifest.yaml was not updated (partial write). The fix is a startup integrity check: compare artifact-file existence against phase status and repair the manifest if they're out of sync. This is a two-line check the orchestrator can run at startup, and it closes the gap Diagrid identifies without requiring durable-execution infrastructure.

Reject: true durable execution (Dapr / Inngest primitives) for the current CAF use case. The Diagrid blog is right that LangGraph-style checkpointing is architecturally different from durable execution — but that gap matters when you have distributed workers, multi-tenant concurrency, and process crashes to survive. CAF runs as a single Claude Code session with one consultant. The manifest on disk IS the durable state; process crashes are recoverable by re-invoking /caf:run-engagement with the same client slug. The /caf:run-batch parallel case is the one where this assumption softens — per-client manifests ensure no cross-contamination, but true parallel sub-agent runs could race on writes. Mitigation: each client's manifest is isolated to its own directory, so the race condition doesn't exist across clients; within a client, sequential phases prevent intra-client races. Full durable-execution infrastructure would be over-engineering for v1.


Open follow-ups


Related


Sources

Vault:

Web: