{
 "ledger": {
  "title": "Claim Ledger: The Graph Looks Right. The Merge Is Where It Breaks.",
  "url": "https://durabilitycurve.com/claims/where-agents-disagree/",
  "essay": {
   "title": "The Graph Looks Right. The Merge Is Where It Breaks.",
   "url": "https://durabilitycurve.com/blog/where-agents-disagree/",
   "published": "2026-08-30"
  },
  "last_checked": "2026-09-27",
  "format": "current",
  "counts": {
   "claims": 19,
   "by_status": {
    "EXECUTED": 14,
    "VERIFIED": 4,
    "REPORTED": 1
   },
   "verified_at_primary": 4,
   "removed": 0
  },
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "attribution": "The Durability Curve (Harry Floyd), https://durabilitycurve.com/claims/where-agents-disagree/"
 },
 "rows": [
  {
   "id": "1",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-1",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "Two parallel nodes writing one plain (LastValue) channel do not silently overwrite; LangGraph refuses and raises",
   "quote": "At key 'decision': Can receive only one value per step. Use an Annotated key to handle multiple values.",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "a fan-out cannot silently collide on a plain channel: the framework refuses that write out loud"
  },
  {
   "id": "2",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-2",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "Silencing that error with a last-write-wins reducer on the decision channel keeps one write and silently drops the rest, with no error",
   "quote": "the channel now holds: 'roll back' and silently dropped: ['ship it', 'hold'] (no error was raised)",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "The run went clean, the channel held one verdict, and the other two were gone with no error"
  },
  {
   "id": "3",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-3",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "Which write survives follows node-name order (the node whose name sorts last in Python's default codepoint order wins, not case-insensitive alphabetical) and is stable across re-runs of the same graph; an undocumented implementation detail",
   "quote": "zebra=ship, alpha=hold, mike=roll -> survives: ship and determinism (same order x3): ['roll back', 'roll back', 'roll back']; codepoint check Zebra vs alpha -> alpha survives (Z=0x5A < a=0x61)",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "in this static fan-out on 0.6.11, the write from the node whose name sorts last wins"
  },
  {
   "id": "4",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-4",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "The documented reducer operator.add is lossless: on a str channel it concatenates the writes in node-name (alphabetical) fold order; on a list channel it keeps all of them",
   "quote": "decision -> 'roll backship ithold' (str, release-gate fan-out changelog/metrics/tests, stable x3) and ['ship it', 'hold', 'roll back'] (list)",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "On a str channel it concatenates the three verdicts"
  },
  {
   "id": "5",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-5",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "The SAME reducer knob is correct on a gather channel: three read-workers append an isolated operator.add findings channel and a single writer reconciles all three",
   "quote": "findings reaching the single writer = 3 of 3 and reconciled 3 of 3",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "The reviewers write concurrently to the same gather channel, and here the merge is legitimate"
  },
  {
   "id": "6",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-6",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "A Send fan-out into a shared plain decision channel raises the same InvalidUpdateError",
   "quote": "raised InvalidUpdateError: At key 'decision': Can receive only one value per step.",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "I wired a Send fan-out into a shared decision channel and it raised the same InvalidUpdateError"
  },
  {
   "id": "7",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-7",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "A cyclic graph with no stop condition halts at LangGraph's default recursion limit of 25 and raises GraphRecursionError",
   "quote": "Recursion limit of 25 reached without hitting a stop condition.",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "LangGraph stops it with GraphRecursionError at a default limit, 25 on the 0.6.11 this piece was built on"
  },
  {
   "id": "8",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-8",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "interrupt() surfaces its payload with or without a checkpointer, but resuming needs one: without a checkpointer Command(resume=...) raises",
   "quote": "RuntimeError: Cannot use Command(resume=...) without checkpointer and (no-checkpointer first run) has __interrupt__: True",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "on 0.6.11, resuming needs a checkpointer"
  },
  {
   "id": "9",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-9",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "On resume the interrupt node re-runs from the top, so a side effect above the interrupt() call happens twice",
   "quote": "side effect ran 2 times -> twice, claim SUPPORTED",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "on resume the node runs again from the top"
  },
  {
   "id": "10",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-10",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "A plain channel written by two nodes in sequence (across supersteps) overwrites silently, no error; the first write is lost",
   "quote": "no error. final decision = 'B said ship' -> A's write silently lost",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "a plain decision channel that two nodes write in sequence overwrites silently, no error"
  },
  {
   "id": "11",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-11",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "LangGraph exposes no static per-node write set: a node's introspectable .channels is its read set (a node that writes only decision still lists the whole readable state)",
   "quote": "a.channels: ['decision', 'other']",
   "removal_reason": "",
   "source": "first-party own run, langgraph 0.6.11",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "a node's introspectable channels are its reads, not its writes"
  },
  {
   "id": "12",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-12",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "The safe demo makes exactly three worker model calls, one per read-worker",
   "quote": "model calls made: 3",
   "removal_reason": "",
   "source": "first-party own run",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "Three parallel workers are three model calls, which the demo counts for you"
  },
  {
   "id": "13",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-13",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "audit.py reads a State TypedDict and flags reducer channels (the fan-out silent-merge surface): findings on the safe schema, decision on the trap schema",
   "quote": "! classify findings REDUCER (add) and fan-out safe decision plain",
   "removal_reason": "",
   "source": "first-party own run (re-run 2026-08-29 after output cleanup)",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": "the reducer channels are the whole fan-out surface, and the tool reads them off the annotation"
  },
  {
   "id": "14",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-14",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "Environment of record for every mechanism row",
   "quote": "langgraph 0.6.11 and langchain-core 0.3.86 and python 3.9.6",
   "removal_reason": "",
   "source": "first-party own run",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-29",
   "in_essay": ""
  },
  {
   "id": "15",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-15",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "Cognition argues actions carry implicit decisions and recommends a single-threaded linear agent",
   "quote": "\"Actions carry implicit decisions, and conflicting decisions carry bad results\" · \"The simplest way to follow the principles is to just use a single-threaded linear agent\"",
   "removal_reason": "",
   "source": "Cognition (Walden Yan), Don't Build Multi-Agents, 2025",
   "source_url": "https://cognition.com/blog/dont-build-multi-agents",
   "locator": "Principle 2; \"A Theory of Building Long-running Agents\"",
   "date_read": "2026-09-27",
   "in_essay": ""
  },
  {
   "id": "16",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-16",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "Cognition's 2026 follow-up concludes multi-agent systems work best when writes stay single-threaded and the extra agents add intelligence rather than actions (cited in [^2])",
   "quote": "\"multi-agent systems work best today when writes stay single-threaded and the additional agents contribute intelligence rather than actions\"",
   "removal_reason": "",
   "source": "Cognition (Walden Yan), Multi-Agents: What's Actually Working, 22 Apr 2026",
   "source_url": "https://cognition.com/blog/multi-agents-working",
   "locator": "essay body (re-fetched at primary, 2026-08-29)",
   "date_read": "2026-09-27",
   "in_essay": "which finds these systems work best when writes stay single-threaded and the extra agents add intelligence rather than actions"
  },
  {
   "id": "17",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-17",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "Anthropic reports its multi-agent research system uses about 15x the tokens of a chat",
   "quote": "\"multi-agent systems use about 15× more tokens than chats\"",
   "removal_reason": "",
   "source": "Anthropic engineering blog",
   "source_url": "https://www.anthropic.com/engineering/multi-agent-research-system",
   "locator": "\"Benefits of a multi-agent system\"",
   "date_read": "2026-09-27",
   "in_essay": ""
  },
  {
   "id": "18",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-18",
   "status": "REPORTED",
   "status_label": "Reported",
   "removed": false,
   "claim": "The MAST study finds specification and system design the largest of three roughly balanced failure categories, and the authors trace many failures to system design rather than model limits alone",
   "quote": "\"The distribution of failures across MAST’s categories is relatively balanced (FC1: 41.77%, FC2: 36.94%, FC3: 21.30%, Figure 2)\" · \"many MAS failures came from system design, not just limitations of the underlying LLMs\"",
   "removal_reason": "",
   "source": "Cemri et al., \"Why Do Multi-Agent LLM Systems Fail?\", arXiv 2503.13657v2",
   "source_url": "https://arxiv.org/abs/2503.13657v2",
   "locator": "v2, \"Balanced Distribution\"; §5.2 \"Beyond Model Capabilities: The Primacy of System Design\"",
   "date_read": "2026-09-27",
   "in_essay": "finds specification and system design the largest of three roughly balanced failure categories"
  },
  {
   "id": "19",
   "url": "https://durabilitycurve.com/claims/where-agents-disagree/#c-19",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "Ranjan Kumar published the reducer-as-concurrency-policy framing and a compiled-graph merge-policy auditor before this piece (convergent prior art, credited in the body)",
   "quote": "\"The reducer is not a merge helper. It is the concurrency-control policy for that state key.\" · \"It appears on no diagram, in no edge list, and in no type checker’s output.\"",
   "removal_reason": "",
   "source": "Ranjan Kumar, \"LangGraph Reducers Are a Concurrency Policy\", 27 Jul 2026",
   "source_url": "https://ranjankumar.in/langgraph-reducers-concurrent-state-writes",
   "locator": "post body (re-fetched at primary, 2026-08-29)",
   "date_read": "2026-09-27",
   "in_essay": "reached all of this before I did: the reducer as a concurrency policy"
  }
 ]
}