{
 "ledger": {
  "title": "Claim Ledger: The Limit Said 10. The Loop Made 500 Calls.",
  "url": "https://durabilitycurve.com/claims/the-limit-said-10/",
  "essay": {
   "title": "The Limit Said 10. The Loop Made 500 Calls.",
   "url": "https://durabilitycurve.com/blog/the-limit-said-10/",
   "published": "2026-08-16"
  },
  "last_checked": "2026-10-06",
  "format": "current",
  "counts": {
   "claims": 34,
   "by_status": {
    "VERIFIED": 21,
    "EXECUTED": 12,
    "REPORTED": 1
   },
   "verified_at_primary": 21,
   "removed": 3
  },
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "attribution": "The Durability Curve (Harry Floyd), https://durabilitycurve.com/claims/the-limit-said-10/"
 },
 "rows": [
  {
   "id": "C46",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C46",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "The opening incident ran 9–10 May 2026, not June, and provisioned five m8g.12xlarge instances plus load balancers and Lambdas, duplicated by repeatedly deploying the same CloudFormation template, against DN42.",
   "quote": "Timeline: began \"2026-05-09\", agent shut down roughly 24 hours later on \"2026-05-10\". Agent's own proposal: \"My primary objective is to conduct comprehensive (full port) network scanning and topological data gathering.\" Five \"m8g.12xlarge\" instances; operator: \"many instance and load balancer and lambda\", duplicated by redeploying \"the same cloudformation template\"",
   "removal_reason": "",
   "source": "Lan Tian, blog post on the DN42 scanning agent",
   "source_url": "https://lantian.pub/en/article/fun/ai-agent-bankrupted-their-operator-scan-dn42lantian.lantian/",
   "locator": "§ timeline + § what it built",
   "date_read": "2026-08-14"
  },
  {
   "id": "C47",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C47",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "The $6,531.30 figure is the bill as incurred; AWS subsequently reduced it to about $1,894",
   "quote": "Initial bill \"$6531.30\"; operator reports the revised amount as \"$1894\" after AWS agreed to reduce charges",
   "removal_reason": "",
   "source": "Lan Tian, ibid.",
   "source_url": "https://lantian.pub/en/article/fun/ai-agent-bankrupted-their-operator-scan-dn42lantian.lantian/",
   "locator": "§ aftermath",
   "date_read": "2026-08-14"
  },
  {
   "id": "C48",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C48",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "The \"a small VPS would have done it\" judgement is the blog author's, not the operator's",
   "quote": "\"for a hobbyist network like DN42, such infrastructure is way overkill, a small VPS server would do the job\" — author's own assessment",
   "removal_reason": "",
   "source": "Lan Tian, ibid.",
   "source_url": "https://lantian.pub/en/article/fun/ai-agent-bankrupted-their-operator-scan-dn42lantian.lantian/",
   "locator": "§ assessment",
   "date_read": "2026-08-14"
  },
  {
   "id": "C49",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C49",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "The operator learned of the spend through card charges rather than AWS monitoring",
   "quote": "Operator: \"the cost too high and much charges on card\"",
   "removal_reason": "",
   "source": "Lan Tian, ibid.",
   "source_url": "https://lantian.pub/en/article/fun/ai-agent-bankrupted-their-operator-scan-dn42lantian.lantian/",
   "locator": "§ discovery",
   "date_read": "2026-08-14"
  },
  {
   "id": "C50",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C50",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "AWS Budgets can attach an enforcing action, up to a Deny IAM policy, but budget data refreshes at most three times a day, typically 8–12 hours apart. It fires late, not never, and late is the stronger sentence",
   "quote": "\"AWS Budgets information is updated up to three times a day. Updates typically occur 8–12 hours after the previous update.\" · \"Apply a custom Deny IAM policy that restricts the ability for a user, group, or role to provision additional Amazon EC2 resources.\" (second locator budgets-controls.html) · \"You might incur additional costs or usage that exceed your budget notification threshold before AWS Budgets can notify you\"",
   "removal_reason": "",
   "source": "AWS Cost Management docs",
   "source_url": "https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-managing-costs.html",
   "locator": "§ Managing your costs with AWS Budgets — console setting, service-side, nothing to run",
   "date_read": "2026-08-14"
  },
  {
   "id": "C94",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C94",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "The quote supports only that On-Demand quotas exist per account per Region and are denominated in vCPUs. It does NOT support \"the fast structural control the AWS incident did not have set\", and the same page contradicts that framing outright: quotas are automatically increased with usage, so they are never off, only sized. Two independent reads flagged the row and the caller re-verified at source. The published default for the Standard family is 5, quoted below",
   "quote": "\"There are quotas for the number of running On-Demand Instances per AWS account per Region… managed in terms of the number of virtual central processing units (vCPUs)\" ·",
   "removal_reason": "",
   "source": "AWS, Amazon EC2 User Guide",
   "source_url": "https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-on-demand-instances.html",
   "locator": "§ On-Demand Instance quotas — console setting, service-side.",
   "date_read": "2026-08-15"
  },
  {
   "id": "C1",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C1",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "Ball's framing of an agent is \"an LLM, a loop, and enough tokens\"",
   "quote": "\"It's an LLM, a loop, and enough tokens. It's what we've been saying on the podcast from the start.\"",
   "removal_reason": "",
   "source": "Thorsten Ball, How to Build an Agent",
   "source_url": "https://ampcode.com/notes/how-to-build-an-agent",
   "locator": "§ opening",
   "date_read": "2026-08-13"
  },
  {
   "id": "C2",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C2",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "A working code-editing agent fits in under 400 lines, mostly boilerplate",
   "quote": "\"You can do it in less than 400 lines of code, most of which is boilerplate.\"",
   "removal_reason": "",
   "source": "Ball, ibid.",
   "source_url": "https://ampcode.com/notes/how-to-build-an-agent",
   "locator": "§ opening",
   "date_read": "2026-08-13"
  },
  {
   "id": "C4",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C4",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "The canonical tutorial does not cover error recovery, termination, token budget, cost, tool-output verification, concurrency or streaming",
   "quote": "Absence claim, checked at source: zero occurrences of \"error recover\", \"terminat\", \"token budget\", \"cost\", \"stream\", \"concurren\" across all 7 headings.",
   "removal_reason": "",
   "source": "Ball, ibid.",
   "source_url": "https://ampcode.com/notes/how-to-build-an-agent",
   "locator": "full page, 7 headings",
   "date_read": "2026-08-14"
  },
  {
   "id": "C85",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C85",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "Ball's tutorial does not cover verifying what a tool returned",
   "quote": "Absence claim, checked at source against all 7 headings. The only handling of a tool's return is executeTool flipping an error boolean — return anthropic.NewToolResultBlock(id, err.Error(), true) — which captures an error raised BY the tool, not any check on whether what came back is correct or usable. Found by a cold read, not by a gate",
   "removal_reason": "",
   "source": "Thorsten Ball, How to Build an Agent",
   "source_url": "https://ampcode.com/notes/how-to-build-an-agent",
   "locator": "full page, 7 headings",
   "date_read": "2026-08-14"
  },
  {
   "id": "C5",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C5",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "Anthropic defines agents as systems where the model directs its own process",
   "quote": "agents are \"systems where LLMs dynamically direct their own processes and tool usage\"",
   "removal_reason": "",
   "source": "Anthropic, Building Effective Agents",
   "source_url": "https://www.anthropic.com/engineering/building-effective-agents",
   "locator": "§ What are agents?",
   "date_read": "2026-08-13"
  },
  {
   "id": "C7",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C7",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "Anthropic advises agents need ground truth from the environment each step",
   "quote": "\"During execution, it's crucial for the agents to gain 'ground truth' from the environment at each step\"",
   "removal_reason": "",
   "source": "Anthropic, ibid.",
   "source_url": "https://www.anthropic.com/engineering/building-effective-agents",
   "locator": "",
   "date_read": "2026-08-13"
  },
  {
   "id": "C99",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C99",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "A tool result is returned to the model in a tool_result content block carrying the tool_use_id of the call it answers; the id is what pairs the two halves of the exchange",
   "quote": "\"Your code executes the operation and sends back a tool_result.\" · \"a second request sends the result back in a tool_result block so Claude can reply with the answer\" · request body, verbatim from the worked example: {\"type\": \"tool_result\", \"tool_use_id\": tool_use.id, \"content\": weather}",
   "removal_reason": "",
   "source": "Anthropic, Tool use with Claude",
   "source_url": "https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview",
   "locator": "§ How tool use works — service-side, console/service contract, nothing to run locally",
   "date_read": "2026-08-15"
  },
  {
   "id": "C100",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C100",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "Every mainstream framework ships a step-counting bound. Re-read on 2026-10-06 out of each project's current wheel: langchain-classic 1.0.8 AgentExecutor.max_iterations default 15 · langgraph 1.2.14 recursion_limit default 10007 · crewai 1.15.23 max_iter default 25 · openai-agents 0.23.1 max_turns default 10 · autogen-agentchat 0.7.5 composable TerminationCondition classes. LangChain's agent bound now lives only in the legacy langchain-classic package: in langchain 1.4.3 the one max_iterations left is a local loop variable in summarization.py (line 697), not an agent bound. AutoGen does not simply count steps: of its eleven concrete termination conditions exactly one counts messages (MaxMessageTermination), TokenUsageTermination counts tokens, TimeoutTermination counts wall-clock seconds, and the other eight fire on message content or on an external signal. Two current documentation pages disagree with the shipped code. LangGraph's Graph API page says the default has been 1000 steps since version 1.0.6, while langgraph 1.2.14 sets 10007. CrewAI's Agents page says max_iter defaults to 20, while crewai 1.15.23 sets 25 on both BaseAgent and its executor. The defaults given here are the code's, because the code is what runs.",
   "quote": "Run output, python3 Automation/framework_bounds_probe.py, 2026-10-06, 6/6 probes resolved: \"langchain-classic 1.0.8 langchain_classic/agents/agent.py — AgentExecutor.max_iterations default: 15 (line 1023)\" · \"langchain 1.4.3 langchain/agents/middleware/summarization.py — any surviving max_iterations in langchain 1.x (expected: NOT an agent bound): len(messages).bit_length() + 1 (line 697)\" · \"langgraph 1.2.14 langgraph/_internal/_config.py — recursion_limit default: 10007 (line 32)\" · \"crewai 1.15.23 crewai/agents/agent_builder/base_agent_executor.py — max_iter default: 25 (line 27)\" · \"openai-agents 0.23.1 agents/run_config.py — max_turns default: 10 (line 45)\" · \"autogen-agentchat 0.7.5 autogen_agentchat/conditions/_terminations.py — StopMessageTermination (line 24), MaxMessageTermination (line 62), TextMentionTermination (line 111), FunctionalTermination (line 158), TokenUsageTermination (line 235), HandoffTermination (line 313)\". The probe prints the six classes its pattern matches; the class total is eleven (autogen-agentchat is unchanged at 0.7.5 since the first run). Second route, the same day, the tagged source on GitHub: langgraph tag 1.2.14, libs/langgraph/langgraph/_internal/_config.py line 32, DEFAULT_RECURSION_LIMIT = int(getenv(\"LANGGRAPH_DEFAULT_RECURSION_LIMIT\", \"10007\")), applied by ensure_config (line 335); crewai tag 1.15.23, lib/crewai/src/crewai/agents/agent_builder/base_agent.py lines 286 to 288, max_iter: int = Field(default=25, ...). The documentation, read the same day: LangGraph, \"Starting in version 1.0.6, the default recursion limit is set to 1000 steps.\" (docs.langchain.com/oss/python/langgraph/graph-api, § Recursion limit); CrewAI, \"Maximum iterations before the agent must provide its best answer. Default is 20.\" (docs.crewai.com/en/concepts/agents, § Agent Attributes)",
   "removal_reason": "",
   "source": "First-party execution against current PyPI wheels",
   "source_url": "https://github.com/langchain-ai/langgraph/blob/1.2.14/libs/langgraph/langgraph/_internal/_config.py#L32",
   "locator": "",
   "date_read": "2026-10-06"
  },
  {
   "id": "C71",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C71",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "Cloudzy describes a recursion limit as a backstop firing after the waste",
   "quote": "\"It is a backstop that fires _after_ the loop has already wasted twenty-five steps and the API spend that goes with them.\"",
   "removal_reason": "",
   "source": "Cloudzy",
   "source_url": "https://cloudzy.com/blog/why-ai-agent-loops-fail-in-production/",
   "locator": "§ recursion limits",
   "date_read": "2026-08-14"
  },
  {
   "id": "C17",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C17",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "An open author copy exists and the quoted sentence verifies verbatim. The paper does NOT say termination requires a per-cycle measure; that framing is what its contribution denies. It presents the single-ranking-function method as Turing's, and argues past it via disjunctive well-foundedness.",
   "quote": "\"The problem with Turing's method is that finding a single, or monolithic, ranking function for the whole program is typically difficult, even for simple programs.\" Re-verified first-party by the caller with pypdf: PDF page 4 = journal page 91. Reference 39 on the last page reads \"Turing, A. Checking a large routine. In Report of a Conference on High Speed Automatic Calculating Machines\", which corroborates the Turing-1949 attribution",
   "removal_reason": "",
   "source": "Cook, Podelski & Rybalchenko, CACM 54(5):88–98, May 2011",
   "source_url": "http://www0.cs.ucl.ac.uk/staff/b.cook/pdfs/proving_program_termination.pdf",
   "locator": "journal p.91 (PDF p.4), § Turing's Classic Method and Disjunctive Well-Foundedness",
   "date_read": "2026-08-15"
  },
  {
   "id": "C72",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C72",
   "status": "REPORTED",
   "status_label": "Reported",
   "removed": false,
   "claim": "The open scan at the URL below is a 14-page image PDF with no text layer — pypdf extracts zero characters from all 14 pages, so the absence of the quoted strings proves nothing and their presence cannot be confirmed by this route either. What IS verified, first-party, is the Turing half: Cook et al.'s reference 39 is \"Turing, A. Checking a large routine…\" and their § heading is \"Turing's Classic Method\" (see C17).",
   "quote": "Floyd's authorship of the well-ordered-set termination argument is standard secondary attribution.",
   "removal_reason": "",
   "source": "Floyd, Assigning Meanings to Programs (1967), scanned copy",
   "source_url": "https://people.eecs.berkeley.edu/~necula/Papers/FloydMeaning.pdf",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C21",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C21",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "A loop with max_iterations=10 issues 500 model calls when the retry sits inside the bounded iteration; 500 is the bench's own backstop, not a natural stop",
   "quote": "Run output: \"malformed -> {'stopped': 'runaway', 'calls': 500}\". hard_cap=500 is an argument in uncovered_bound_loop.",
   "removal_reason": "",
   "source": "First-party run",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C22",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C22",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "No-progress detection on hashed (tool, args) halts a repeating caller in 3 calls",
   "quote": "Run output: \"repeater -> {'stopped': 'no-progress', 'calls': 3, 'repeated': 'a099dc8c'}\"",
   "removal_reason": "",
   "source": "First-party run",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C23",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C23",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "That same guard does NOT catch a model making novel calls forever; it runs to the ceiling at 30",
   "quote": "Run output: \"never_finishes -> {'stopped': 'ceiling', 'calls': 30}\"",
   "removal_reason": "",
   "source": "First-party run. The 30 is max_iterations=30 in the guard's own signature, not a discovered threshold",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C88",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C88",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "The three printed outputs of bounded_run are what the printed code produces",
   "quote": "Extracted all fenced blocks from the body and executed each runnable one. never_parses -> {'exit': 'budget', 'calls': 20}, always_repeats -> {'exit': 'stall', 'on': 'search', 'calls': 3}, never_finishes -> {'exit': 'budget', 'calls': 20} — byte-identical to the article's output block. The same check passed for the 500-call runaway bench and both guarded() lines.",
   "removal_reason": "",
   "source": "First-party run, reproducible",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-14"
  },
  {
   "id": "C8",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C8",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "A static scan of 6,549 agent repos confirmed 68 infinite-loop failures across 47 projects at 91.9% precision",
   "quote": "\"On the real-world corpus of 6,549 LLM agent projects, IAL-SCAN reports 74 potential findings. Manual review confirms 68 IAL failures and 6 false positives, yielding an end-to-end precision of 91.9%.\" … \"These failures affect 47 agent projects\"",
   "removal_reason": "",
   "source": "Hou, Wang, Zhao & Wang (HUST). PREPRINT",
   "source_url": "https://arxiv.org/abs/2607.01641",
   "locator": "arXiv:2607.01641v1 §V-B1",
   "date_read": "2026-08-13"
  },
  {
   "id": "C9",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C9",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "All 68 confirmed failures share one root cause: the repeating path is not covered by a strong bound",
   "quote": "\"All 68 failures share the same root issue: the repeated path is not covered by a strong bound.\"",
   "removal_reason": "",
   "source": "Hou et al. PREPRINT",
   "source_url": "https://arxiv.org/abs/2607.01641",
   "locator": "arXiv:2607.01641v1 §V-B1",
   "date_read": "2026-08-13"
  },
  {
   "id": "C80",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C80",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "The bench's failure shape occurs in a real repository: a planner nesting two while not success loops around an LLM call and swallowing the parse exception with pass",
   "quote": "\"Figure 6 shows a retry loop in 2456868764/LiteRAG. The planner uses nested while not success loops to repeatedly request a plan from the LLM. The costly call appears at lines 8–10, where self.llm.invoke(...) is executed until parsing succeeds. However, parser failures are swallowed at lines 12–13\". Figure 6 source, extracted verbatim: success = False / while not success: / while not success: / try: / plan = self.llm.invoke(...) / success = True / except OutputParserException: / pass.",
   "removal_reason": "",
   "source": "Hou et al. PREPRINT",
   "source_url": "https://arxiv.org/abs/2607.01641",
   "locator": "arXiv:2607.01641v1 §V-B2 Case Study + Figure 6",
   "date_read": "2026-08-14"
  },
  {
   "id": "C90",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C90",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "The preprint's self-assessment figures: the first two authors agreed on 94.6% of the 74 potential findings and settled the rest by discussion; a separate false-negative review confirmed 7 misses",
   "quote": "\"During independent labeling, the first two authors agreed on 94.6% of the 74 potential findings; the remaining cases were resolved through discussion.\" · \"…Two authors independently labeled them with 92.1% agreement, and all disagreements were resolved with a third author. This process confirmed 7 false negatives of IAL-SCAN.\"",
   "removal_reason": "",
   "source": "Hou et al. PREPRINT",
   "source_url": "https://arxiv.org/abs/2607.01641",
   "locator": "arXiv:2607.01641v1 §V-B1 and the false-negative paragraph",
   "date_read": "2026-08-14"
  },
  {
   "id": "C101",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C101",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "The uncovered inner cycle costs almost nothing at realistic parse-failure rates and only becomes expensive as p climbs. max_iterations=10 throughout, so 10 calls means the bound held",
   "quote": "Run output, python3 Automation/loop_variant_lab.py, 2,000 seeded trials per row: FULL printed table, all fifteen cells ( The lab sweeps p as a chosen parameter and measures nothing about which rate occurs in production.",
   "removal_reason": "",
   "source": "First-party, seeded and deterministic",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C102",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C102",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "Call-signature hashing with sorted keys, AND its defeat by semantically-equivalent varied arguments, both shipped with working code",
   "quote": "\"Stable hash of the call signature (sort keys for determinism)\" · \"Sometimes the agent doesn't repeat the exact same call. It does search(\"python async\"), then search(\"async in python\"), then search(\"python asyncio\"). Same intent, different arguments.\" — the article then goes further than we do, to embedding-based semantic detection. Verified at source by the caller. No inference required",
   "removal_reason": "",
   "source": "Alan West, How to Stop Your LLM Agent From Looping Itself Into Oblivion, DEV",
   "source_url": "https://dev.to/alanwest/how-to-stop-your-llm-agent-from-looping-itself-into-oblivion-27eh",
   "locator": "§ the tracker + § varied arguments",
   "date_read": "2026-08-15"
  },
  {
   "id": "C103",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C103",
   "status": "VERIFIED",
   "status_label": "Verified",
   "removed": false,
   "claim": "A runnable no-key simulated runaway predates ours by five months",
   "quote": "\"The LLM calls in this demo are simulated. No API key is required. The budget enforcement is real.\" · \"the agent loops for 30 seconds — ~595 calls, ~$5.95 — before a safety timeout kills it.\" Verified at source by the caller. Its structure is a quality-threshold loop rather than an uncovered retry path (",
   "removal_reason": "",
   "source": "Albert Mavashev, Stop a Runaway AI Agent in Three Lines, runcycles.io, 2026-03-26",
   "source_url": "https://runcycles.io/blog/runaway-demo-agent-cost-blowup-walkthrough",
   "locator": "§ the unguarded run",
   "date_read": "2026-08-15"
  },
  {
   "id": "C104",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C104",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "The article's own guard.py prints c740a98e; C22 records a099dc8c, which is loop_lab.py's different call shape.",
   "quote": "Run output from the article's printed listing: repeater -> {'stopped': 'no-progress', 'calls': 3, 'repeated': 'c740a98e'}. Stable across CPython 3.9.6 and 3.12.12 (sha1(json.dumps(call, sort_keys=True)) is deterministic and default separators have not moved in 3.x), so it will match on the reader's machine",
   "removal_reason": "",
   "source": "First-party run of the printed listing",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C105",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C105",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "Its counter is on calls, not on time, and neither tools... nor model(messages) carries a timeout",
   "quote": "Executed by the caller with a tool that never returns: hanging tool -> STILL RUNNING after 3s: bounded_run did NOT terminate (SIGALRM at 3s).",
   "removal_reason": "",
   "source": "First-party execution",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C106",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C106",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "The OpenAI Agents SDK advances its turn counter and tests the bound before invoking the model",
   "quote": "Read out of the current wheel by the caller: openai-agents 0.21.0, agents/run.py line 1296 current_turn += 1 immediately followed by line 1297 if max_turns is not None and current_turn > max_turns:. Both precede the model invocation",
   "removal_reason": "",
   "source": "First-party, read from the package",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C107",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C107",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "Ten successful parses at independent parse-failure rate p cost 10/(1-p) model calls on average, so the simulation corroborates a general law rather than standing on five chosen rates",
   "quote": "Derivation: calls-per-successful-parse is geometric with mean 1/(1-p); ten of them is negative-binomial with mean 10/(1-p). Checked against an independent 20,000-trial simulation written for this row (different generator and seed from loop_variant_lab.py): means 10.2 / 11.1 / 20.0 / 99.9 / 1001.1 against closed-form 10.2 / 11.1 / 20.0 / 100.0 / 1000.0, and medians 10 / 11 / 20 / 97 / 970 reproducing the article's published 10 / 11 / 20 / 97 / 969. The table the article already printed is confirmed by a route that does not use the article's own lab",
   "removal_reason": "",
   "source": "First-party derivation, independently re-simulated",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C109",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C109",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "Total calls to reach ten successful parses at failure rate p is negative binomial with r=10 and q=1-p; the article's two columns are that distribution's exact median and 95th percentile, taken from the CDF",
   "quote": "Computed from the exact PMF C(n-1, r-1) q^r p^(n-r) accumulated to the quantile. p=0.02 → median 10, p95 11 · p=0.10 → 11, 13 · p=0.50 → 19, 28 · p=0.90 → 97, 154 · p=0.99 → 967, 1568. C101's 2,000-trial simulation agrees within two counts on every row (its medians 10/11/20/97/969, p95 11/13/28/154/1569), which converts it from the evidence into corroboration by a second method. A sample maximum is not a bound, and printing one in a piece whose thesis is precision about what bounds a loop invited exactly the misreading the piece exists to correct",
   "removal_reason": "",
   "source": "First-party derivation",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C110",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C110",
   "status": "EXECUTED",
   "status_label": "Executed",
   "removed": false,
   "claim": "Flattening two cycles into one is not necessary for termination. A nested retry loop terminates just as well when the inner cycle tests the shared budget on its own path. The necessary property is that every path reaching another model call spends from the same budget before it gets there, and that the test reading that budget ends the loop",
   "quote": "Executed by the caller: the article's nest preserved, with if calls >= max_calls: return inside the inner while, returns {'exit': 'budget', 'calls': 20} — the same 20 as the flattened bounded_run.",
   "removal_reason": "",
   "source": "First-party execution",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-15"
  },
  {
   "id": "C43",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C43",
   "status": "STRUCK",
   "status_label": "Struck",
   "removed": true,
   "claim": "This is not an exotic bug",
   "quote": "",
   "removal_reason": "Unsupported. 47 of 6,549 repos is 0.72%, and C8 reports precision with no recall, so the corpus bounds prevalence in neither direction",
   "source": "",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-14"
  },
  {
   "id": "C44",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C44",
   "status": "STRUCK",
   "status_label": "Struck",
   "removed": true,
   "claim": "Forty lines gets you an agent / the forty lines above",
   "quote": "",
   "removal_reason": "Refuted inside the article. Ball says under 400 (C2); the code block is 13 lines. Appeared in the subtitle, a heading and the body",
   "source": "",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-14"
  },
  {
   "id": "C45",
   "url": "https://durabilitycurve.com/claims/the-limit-said-10/#c-C45",
   "status": "STRUCK",
   "status_label": "Struck",
   "removed": true,
   "claim": "Every tutorial in the genre leaves the same three holes / trim is the default in most codebases / most people fail the audit on the first path",
   "quote": "",
   "removal_reason": "Unmeasured population claims presented as observation. Each asserts a distribution over developers' code or the literature with nothing behind it",
   "source": "",
   "source_url": "",
   "locator": "",
   "date_read": "2026-08-14"
  }
 ]
}