{
  "tool": {
    "name": "LangGraph",
    "repo": "https://github.com/langchain-ai/langgraph",
    "version_at_verification": "langgraph==1.2.6",
    "version_date": "2026-06-18",
    "last_verified": "2026-06-28",
    "dossier_version": "2026-06-28",
    "decay_class": "volatile"
  },
  "scorecard": {
    "claims_sampled": 12,
    "as_labeled": 3,
    "partial": 7,
    "not_as_labeled": 2,
    "open_deltas": 14,
    "verified_closed": 0,
    "closure_trend": "zero closures to date — all four serialization deltas and the double-interrupt delta, first published 2026-03-29 against v1.0.10, remain open in the 1.2.x line (re-verified 2026-06-11); #6718 was closed once and reopened"
  },
  "verdict": "LangGraph's orchestration, streaming, and adoption claims hold as labeled, but its durable-execution and persistence label rests on a checkpoint layer whose documented enum and failure handling silently corrupts state — four serialization bugs, a double-interrupt snapshot bug, and a sync/async recovery divergence all re-verified open on 2026-06-28 against the 1.2.6 release line, the entire v1.0.10→1.2.4 span since Theory Delta first published them on 2026-03-29.",
  "claims": [
    {
      "id": "1",
      "claimed": "Low-level orchestration framework for building stateful agents — \"LangGraph provides low-level supporting infrastructure for any long-running, stateful workflow or agent\"",
      "claimed_source_url": "https://github.com/langchain-ai/langgraph",
      "observed": "Source-reviewed: the graph runtime is the production foundation it claims to be. ByteDance's deer-flow is built on LangGraph (runs via the langgraph dev CLI), GPT-Researcher's 7-role multi-agent pipeline constructs LangGraph StateGraphs with parallel researcher fan-out, and LangGraph leads open-source agent framework adoption at 41% share in practitioner surveys.",
      "status": "as_labeled",
      "evidence": [
        "https://github.com/bytedance/deer-flow",
        "https://github.com/assafelovic/gpt-researcher/blob/master/docs/docs/gpt-researcher/multi_agents/langgraph.md"
      ]
    },
    {
      "id": "2",
      "claimed": "\"Trusted by companies shaping the future of agents – including Klarna, Replit, Elastic, and more\"",
      "claimed_source_url": "https://github.com/langchain-ai/langgraph",
      "observed": "Docs-reviewed for the named companies (vendor-published case studies; not independently confirmed by TD). The direction is independently corroborated: major third-party production systems (ByteDance deer-flow, GPT-Researcher) build on LangGraph by their own published source. Vendor-adjacent quantitative metrics (star counts, blog-reported PyPI download figures) are excluded from this assessment as unreliable.",
      "status": "as_labeled",
      "evidence": [
        "https://github.com/langchain-ai/langgraph",
        "https://github.com/bytedance/deer-flow"
      ]
    },
    {
      "id": "3",
      "claimed": "Streaming: seven stream modes (values, updates, messages, custom, checkpoints, tasks, debug), including token-by-token messages output that works \"with any LLM API—even if that API does not implement the LangChain chat model interface\"",
      "claimed_source_url": "https://docs.langchain.com/oss/python/langgraph/streaming",
      "observed": "Source-reviewed: stream modes confirmed as documented. Two caveats sit at integration boundaries rather than on the label itself: streaming from custom nodes has a documented workaround path (stream_mode=\"messages\" with the native create_react_agent), and Langfuse's CallbackHandler blocks LangGraph streaming (langfuse/langfuse#10584, open since November 2025) — a third-party conflict, not a label defect.",
      "status": "as_labeled",
      "evidence": [
        "https://docs.langchain.com/oss/python/langgraph/streaming",
        "https://github.com/langfuse/langfuse/issues/10584"
      ]
    },
    {
      "id": "4",
      "verified_at": "2026-07-12",
      "verified_by": "probe-ci",
      "probe": "probes/langgraph/claim-4/",
      "claimed": "Durable execution: \"Build agents that persist through failures and can run for extended periods, automatically resuming from exactly where they left off\"",
      "claimed_source_url": "https://github.com/langchain-ai/langgraph",
      "observed": "\"Exactly where they left off\" holds only at checkpoint (node/superstep) boundaries: in-node progress is lost on failure, and a resumed node re-executes from its beginning — every side effect before an interrupt or failure must be idempotent or it runs twice (the vendor's own interrupts page documents this constraint). Two open bugs narrow it further, re-verified open 2026-06-11: Command(resume=None) crashes the resume flow with UnboundLocalError (#7034, opened 2026-03-05), and the sync checkpoint path caches ERROR/INTERRUPT writes that the async path guards against (#7015, opened 2026-03-04), so recovery behavior differs by execution path.",
      "status": "partial",
      "evidence": [
        "https://api.theorydelta.com/published/langgraph-checkpoint-serialization-silent-loss",
        "https://github.com/langchain-ai/langgraph/issues/7034",
        "https://github.com/langchain-ai/langgraph/issues/7015",
        "https://docs.langchain.com/oss/python/langgraph/interrupts"
      ]
    },
    {
      "id": "5",
      "verified_at": "2026-07-12",
      "verified_by": "probe-ci",
      "probe": "probes/langgraph/claim-5/",
      "claimed": "The default checkpoint serializer (JsonPlusSerializer) \"handles a wide variety of types, including LangChain and LangGraph primitives, datetimes, enums and more\"",
      "claimed_source_url": "https://docs.langchain.com/oss/python/langgraph/persistence",
      "observed": "Source-reviewed: enums are among the documented failure modes. Four silent-corruption bugs in the checkpoint serialization layer remain open, all re-verified 2026-06-11: JsonPlusSerializer replaces values whose deserialization fails with None without raising (#6970, opened 2026-02-28); StrEnum fields coerce to plain str on round-trip (#6598, opened 2025-12-16); nested Enum fields become None (#6718, opened 2026-01-24, closed once and reopened); BinaryOperatorAggregate stores the Overwrite wrapper instead of the payload when the initial value is MISSING (#6909, opened 2026-02-23). Checkpoint round-trips are lossy for non-primitive types with no exception raised. UPDATE 2026-06-28 (re-verified on 1.2.6): all four serialization bugs remain open and the failure class is expanding — #8184 (dict subclasses lose type fidelity) and #8185 (Fraction/complex rejected with TypeError) were filed 2026-06-24; the StrEnum fix PR #6602 is open but a maintainer flagged it may not change behavior.",
      "status": "not_as_labeled",
      "evidence": [
        "https://api.theorydelta.com/published/langgraph-checkpoint-serialization-silent-loss",
        "https://github.com/langchain-ai/langgraph/issues/6970",
        "https://github.com/langchain-ai/langgraph/issues/6598",
        "https://github.com/langchain-ai/langgraph/issues/6718",
        "https://github.com/langchain-ai/langgraph/issues/6909",
        "https://github.com/langchain-ai/langgraph/issues/8184"
      ]
    },
    {
      "id": "6",
      "claimed": "Memory: \"Create truly stateful agents with both short-term working memory for ongoing reasoning and long-term persistent memory across sessions\"",
      "claimed_source_url": "https://github.com/langchain-ai/langgraph",
      "observed": "The two layers exist as described. Cross-session persistence requires a durable checkpointer: the default in-memory saver is scoped by the vendor's own docs to experimentation and silently resets across process restarts if PostgresSaver is omitted — state appears functional in local testing, then resets in production. With a durable checkpointer, round-trips are lossy for Pydantic models and enums (rows 4–5), so long-term memory is reliable only for primitive-typed state without defensive post-restore validation.",
      "status": "partial",
      "evidence": [
        "https://api.theorydelta.com/published/langgraph-checkpoint-serialization-silent-loss",
        "https://docs.langchain.com/oss/python/langgraph/persistence"
      ]
    },
    {
      "id": "7",
      "verified_at": "2026-07-12",
      "verified_by": "probe-ci",
      "probe": "probes/langgraph/claim-7/",
      "claimed": "Human-in-the-loop: \"Seamlessly incorporate human oversight by inspecting and modifying agent state at any point during execution\"",
      "claimed_source_url": "https://github.com/langchain-ai/langgraph",
      "observed": "interrupt()/Command(resume) is confirmed as the working primary mechanism, with production constraints that fail silently rather than loudly: a node containing two interrupt() calls leaves get_state().next empty after the first resume — the graph is still paused but the snapshot reports it complete, so an approval gate can be silently skipped (#6956, opened 2026-02-27, open and re-verified 2026-06-11); interrupt call order must be deterministic; nodes re-execute from the beginning on resume (idempotency required); a bare try/except absorbs the interrupt exception and the graph never pauses. No built-in notification, timeout, or escalation exists — interrupted threads persist in the checkpointer indefinitely.",
      "status": "partial",
      "evidence": [
        "https://api.theorydelta.com/published/langgraph-checkpoint-serialization-silent-loss",
        "https://github.com/langchain-ai/langgraph/issues/6956",
        "https://docs.langchain.com/oss/python/langgraph/interrupts"
      ]
    },
    {
      "id": "8",
      "claimed": "\"Deploy sophisticated agent systems confidently with scalable infrastructure designed to handle the unique challenges of stateful, long-running workflows\"",
      "claimed_source_url": "https://github.com/langchain-ai/langgraph",
      "observed": "The deployment product exists (LangGraph Platform GA 2025-05-16, renamed LangSmith Deployment October 2025, per-deployment-minute pricing), but multi-tenant checkpoint isolation is not enforced at the framework level — thread IDs must be scoped by application code, and a 2026 practitioner report documents a workflow for one customer reading another customer's checkpointed state through a misconfigured thread ID. Auth is a pair of middleware decorator hooks with no native OAuth2/OIDC; external provider integration is required.",
      "status": "partial",
      "evidence": [
        "https://blog.langchain.com/langgraph-platform-ga/",
        "https://dev.to/ottoaria/langgraph-in-2026-build-multi-agent-ai-systems-that-actually-work-3h5",
        "https://docs.langchain.com/langgraph-platform/auth"
      ]
    },
    {
      "id": "9",
      "verified_at": "2026-07-12",
      "verified_by": "probe-ci",
      "probe": "probes/langgraph/claim-9/",
      "claimed": "Double-texting Interrupt strategy: \"This option halts the current execution and preserves the progress made up to the interruption point\" before processing the new input",
      "claimed_source_url": "https://docs.langchain.com/langgraph-platform/double-texting",
      "observed": "Source-reviewed: reported behavior diverges from the documented semantics — both concurrent requests are processed together and return merged combined tool calls (e.g. weather lookups for two cities in one response) rather than the prior run halting with its partial output preserved in isolation (langchain-ai/docs#474, opened 2025-09-01, open and re-verified 2026-06-11).",
      "status": "not_as_labeled",
      "evidence": [
        "https://github.com/langchain-ai/docs/issues/474",
        "https://docs.langchain.com/langgraph-platform/double-texting"
      ]
    },
    {
      "id": "10",
      "verified_at": "2026-07-12",
      "verified_by": "probe-ci",
      "probe": "probes/langgraph/claim-10/",
      "claimed": "\"It also integrates seamlessly with any LangChain product, giving developers a full suite of tools for building agents\"",
      "claimed_source_url": "https://github.com/langchain-ai/langgraph",
      "observed": "LangSmith integration is genuinely zero-code (two environment variables auto-instrument every LLM call, tool invocation, and graph step). The first-party MCP bridge is not seamless: langchain-mcp-adapters fails entirely when any single configured MCP server is down — no partial initialization, no skip-and-warn (#401, opened 2025-12-23, open and re-verified 2026-06-11) — and ProxyUser serialization breaks on LangGraph Cloud while working locally (#416, opened 2026-02-09, open). UPDATE 2026-06-28: langchain-mcp-adapters 0.3.0 (2026-06-10) surfaces tool-execution errors as failed ToolMessages but #401/#416 stay open; new failures: an MCP tool parameter named \"config\" is silently overwritten by RunnableConfig injection (#532) and the 0.3.0 upgrade raises ImportError on an mcp-SDK version gap (#550).",
      "status": "partial",
      "evidence": [
        "https://github.com/langchain-ai/langchain-mcp-adapters/issues/401",
        "https://github.com/langchain-ai/langchain-mcp-adapters/issues/416",
        "https://github.com/langchain-ai/langchain-mcp-adapters/issues/532"
      ]
    },
    {
      "id": "11",
      "claimed": "Debugging: \"Gain deep visibility into complex agent behavior with visualization tools that trace execution paths, capture state transitions, and provide detailed runtime metrics\"",
      "claimed_source_url": "https://github.com/langchain-ai/langgraph",
      "observed": "Studio provides node-level execution and state visibility as claimed (interrupt-and-edit, replay, hot reload confirmed in the vendor's own launch material), but the debug surface is shallower than the failure surface: the most common production failures are sub-node — interrupt order mismatches, non-idempotent side effects on resume, silent serialization corruption — and none of them appear in the visualization.",
      "status": "partial",
      "evidence": [
        "https://api.theorydelta.com/published/langgraph-checkpoint-serialization-silent-loss",
        "https://www.langchain.com/blog/langgraph-studio-the-first-agent-ide"
      ]
    },
    {
      "id": "12",
      "claimed": "Fault tolerance: \"If one or more nodes fail at a given superstep, you can restart your graph from the last successful step,\" with pending checkpoint writes from successfully completed nodes preserved so they are not re-run",
      "claimed_source_url": "https://docs.langchain.com/oss/python/langgraph/durable-execution",
      "observed": "The superstep recovery mechanism works as documented, with two qualifications re-verified 2026-06-11: restored state whose deserialization fails is silently replaced with None rather than erroring, so a \"successful\" restart can resume on corrupted state (#6970); and the sync execution path caches ERROR/INTERRUPT writes that the async path skips (#7015), so the same failure yields different checkpoint contents depending on execution mode — a graph that recovers correctly in async mode may replay stale error state in sync mode. UPDATE 2026-06-28: a new race condition in PregelLoop.put_writes() (#8115, 2026-06-17) causes silent checkpoint data loss under concurrent Send tasks; its fix PR #8114 was closed without merge the same day.",
      "status": "partial",
      "evidence": [
        "https://api.theorydelta.com/published/langgraph-checkpoint-serialization-silent-loss",
        "https://github.com/langchain-ai/langgraph/issues/6970",
        "https://github.com/langchain-ai/langgraph/issues/7015",
        "https://github.com/langchain-ai/langgraph/issues/8115"
      ]
    }
  ],
  "deltas": [
    {
      "id": "LG-01",
      "title": "JsonPlusSerializer silently replaces failed deserializations with None — checkpoint restore cannot be trusted without post-restore validation",
      "evidence": [
        "https://github.com/langchain-ai/langgraph/issues/6970",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2026-02-28",
      "status": "open",
      "falsification_criterion": "A checkpoint round-trip whose value fails deserialization raises an exception instead of restoring None, re-verified on a current release"
    },
    {
      "id": "LG-02",
      "title": "StrEnum fields silently coerced to plain str on checkpoint round-trip — type information lost",
      "evidence": [
        "https://github.com/langchain-ai/langgraph/issues/6598",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2025-12-16",
      "status": "open",
      "falsification_criterion": "StrEnum fields restore from a checkpoint round-trip as StrEnum (isinstance check passes), re-verified on a current release"
    },
    {
      "id": "LG-03",
      "title": "Nested Enum fields become None after checkpoint deserialization (closed once, reopened 2026-01-24)",
      "evidence": [
        "https://github.com/langchain-ai/langgraph/issues/6718",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2026-01-24",
      "status": "open",
      "falsification_criterion": "Nested Enum fields restore with their original values after checkpoint deserialization, re-verified on a current release"
    },
    {
      "id": "LG-04",
      "title": "BinaryOperatorAggregate stores the Overwrite wrapper instead of the payload when the initial value is MISSING",
      "evidence": [
        "https://github.com/langchain-ai/langgraph/issues/6909",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2026-02-23",
      "status": "open",
      "falsification_criterion": "A BinaryOperatorAggregate channel whose initial value is MISSING stores the unwrapped payload, not the Overwrite wrapper, re-verified on a current release"
    },
    {
      "id": "LG-05",
      "title": "get_state().next returns empty after the first of two interrupt() calls — paused graph reports complete, approval gates can be silently skipped",
      "evidence": [
        "https://github.com/langchain-ai/langgraph/issues/6956",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2026-02-27",
      "status": "open",
      "falsification_criterion": "get_state().next reports the paused node after resuming the first of two interrupt() calls in one node, re-verified on a current release"
    },
    {
      "id": "LG-06",
      "title": "Sync checkpoint path caches ERROR/INTERRUPT writes that the async path guards against — recovery behavior differs by execution mode",
      "evidence": [
        "https://github.com/langchain-ai/langgraph/issues/7015",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2026-03-04",
      "status": "open",
      "falsification_criterion": "Sync and async checkpoint paths produce identical write sets for ERROR/INTERRUPT states, re-verified on a current release"
    },
    {
      "id": "LG-07",
      "title": "Command(resume=None) crashes the resume flow with UnboundLocalError",
      "evidence": [
        "https://github.com/langchain-ai/langgraph/issues/7034",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2026-03-05",
      "status": "open",
      "falsification_criterion": "Command(resume=None) either resumes cleanly or raises a clear validation error instead of UnboundLocalError, re-verified on a current release"
    },
    {
      "id": "LG-08",
      "title": "Platform double-texting Interrupt strategy returns merged combined outputs instead of halting the prior run with isolated preserved progress",
      "evidence": [
        "https://github.com/langchain-ai/docs/issues/474",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2025-09-01",
      "status": "open",
      "falsification_criterion": "A concurrent request under the Interrupt double-texting strategy halts the prior run and returns its partial output isolated from the new run, re-verified against the deployed platform"
    },
    {
      "id": "LG-09",
      "title": "Multi-tenant checkpoint isolation not enforced at the framework level — thread scoping is application code's responsibility; cross-tenant state access reported in production",
      "evidence": [
        "https://dev.to/ottoaria/langgraph-in-2026-build-multi-agent-ai-systems-that-actually-work-3h5",
        "UPDATE 2026-06-28: the dev.to article no longer contains the cross-tenant claim (mutable source drift); the underlying behavior is corroborated by https://docs.langchain.com/langgraph-platform/auth (HTTP 200, developer-scoped isolation)",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2026-05-14",
      "status": "open",
      "falsification_criterion": "Checkpoint-level tenant scoping or namespace access control ships such that one thread's state cannot be read across tenants without application-layer guards, re-verified"
    },
    {
      "id": "LG-10",
      "title": "langchain-mcp-adapters fails entirely when any single MCP server is down — no partial initialization or graceful degradation",
      "evidence": [
        "https://github.com/langchain-ai/langchain-mcp-adapters/issues/401",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2025-12-23",
      "status": "open",
      "falsification_criterion": "MultiServerMCPClient initializes with unavailable servers skipped with a warning while the remaining servers' tools stay available, re-verified on a current release"
    },
    {
      "id": "LG-11",
      "title": "langchain-mcp-adapters ProxyUser serialization breaks on LangGraph Cloud while working locally — passes local testing, fails in deployment",
      "evidence": [
        "https://github.com/langchain-ai/langchain-mcp-adapters/issues/416",
        "Re-verified open 2026-06-28 against langgraph==1.2.6"
      ],
      "opened": "2026-02-09",
      "status": "open",
      "falsification_criterion": "MCP tool invocation with a ProxyUser auth context succeeds on LangGraph Cloud as it does locally, re-verified"
    },
    {
      "id": "LG-12",
      "title": "Race condition in PregelLoop.put_writes() silently loses checkpoint writes under concurrent Send tasks — fix PR #8114 closed unmerged",
      "evidence": [
        "https://github.com/langchain-ai/langgraph/issues/8115",
        "https://github.com/langchain-ai/langgraph/pull/8114"
      ],
      "opened": "2026-06-17",
      "status": "open",
      "falsification_criterion": "Concurrent Send tasks writing to the checkpoint produce the complete write set (no lost writes) under a stress test, re-verified on a current release"
    },
    {
      "id": "LG-13",
      "title": "Checkpoint serialization failure class expanding — dict subclasses lose type fidelity (#8184) and Fraction/complex raise TypeError (#8185)",
      "evidence": [
        "https://github.com/langchain-ai/langgraph/issues/8184",
        "https://github.com/langchain-ai/langgraph/issues/8185"
      ],
      "opened": "2026-06-24",
      "status": "open",
      "falsification_criterion": "dict-subclass and Fraction/complex state values round-trip through a checkpoint with type preserved and no exception, re-verified on a current release"
    },
    {
      "id": "LG-14",
      "title": "MCP tool parameter named \"config\" silently overwritten by RunnableConfig injection (langchain-mcp-adapters #532)",
      "evidence": [
        "https://github.com/langchain-ai/langchain-mcp-adapters/issues/532"
      ],
      "opened": "2026-06",
      "status": "open",
      "falsification_criterion": "An MCP tool with a parameter named 'config' receives the caller's value rather than LangChain's injected RunnableConfig, re-verified on a current release"
    }
  ],
  "methodology": {
    "sampling_rule_ref": "Material-claims sampling rule (strategy/method.md §2, label-check methodology D0086): a claim is sampled iff it appears on the product's own label and would plausibly influence an adoption decision. Sampling frame: the langchain-ai/langgraph README (core benefits and ecosystem sections), the docs.langchain.com LangGraph overview, persistence, durable-execution, and streaming pages, and the LangGraph Platform double-texting and auth pages — label captured 2026-06-11. All material claims found on these surfaces are sampled (12 found).",
    "verification_depth": "source-reviewed",
    "verification_statement": "Evidence is drawn from the project's own issue tracker, release history, and published documentation, plus third-party production reports. All load-bearing GitHub issue statuses (langgraph #6970, #6598, #6718, #6909, #6956, #7015, #7034; langchain-ai/docs #474; langchain-mcp-adapters #401, #416) were re-verified open on 2026-06-28 against the langgraph==1.2.6 release line (released 2026-06-18); 1.2.5 and 1.2.6 shipped no fixes for any tracked delta. Theory Delta has not executed LangGraph in its own environment for this dossier. Quantitative vendor-adjacent metrics (star counts, blog-reported PyPI download figures) are treated as unreliable and excluded from assessment.",
    "backing_confidence": "secondary-research",
    "executed_by_td": false,
    "strongest_case_against": "All non-as_labeled verdicts rest on open-issue review, not execution: an open issue does not prove the behavior reproduces on langgraph==1.2.4, and most of the serialization bugs were filed against the 1.0.x line — a fix could have shipped without the issue being closed. The serialization failures affect specific type patterns; pipelines that checkpoint only primitive types never hit them, and a postmortem review in the backing corpus found real-world failures were mostly environmental rather than structural. LangGraph ships multiple releases per month (volatile decay class), so any specific row can go stale within weeks of the last-verified date."
  },
  "provenance": {
    "source_block": "theorydelta-blocks/blocks/langgraph-state-management.md (validated 2026-05-22)",
    "source_blocks": [
      "theorydelta-blocks/blocks/langgraph-state-management.md",
      "theorydelta-blocks/blocks/langgraph-interrupt-hitl.md",
      "theorydelta-blocks/blocks/langgraph-platform.md",
      "theorydelta-blocks/blocks/langgraph-studio.md",
      "theorydelta-blocks/blocks/langchain-ecosystem.md",
      "theorydelta-blocks/blocks/agentic-rag-pipeline.md"
    ],
    "additional_sources": [
      "published/langgraph-checkpoint-serialization-silent-loss.md"
    ],
    "derived_date": "2026-06-28"
  }
}