Claim ledger

The Limit Said 10. The Loop Made 500 Calls.

Your limit counts one cycle. The one that runs away is another. Here is how to tell them apart.

Read the essay Published

Claims
34
Verified at the primary source
21
Removed before publication
3
Last checked

34 claims: 21 verified, 12 executed, 1 reported. Plus 3 removed before publication, listed at the end.

Download this ledger: CSV · JSON · Markdown · CC BY 4.0 · Query it from Claude or ChatGPT

What the essay claims

Believed now: "My loop has a limit. I set it to 10. It is bounded."

Believed after: "Whether a limit bounds anything is a question with a fifty-year-old answer, and I can apply it. My limit counts passes through one cycle; the cycle that runs away is a different one; and the guard I would have added next has the same defect one level down."

The delta that does the work: An instrument, not an anecdote. The bench shows the failure, the variant explains it, and the frame predicts where repeat-detection breaks before the reader is shown that it does

The claim ladder

#ClaimSubject — whose behaviour it measuresRests onStatus / scope
1Termination needs a quantity that decreases on every pass through the cycle, in units that run out, and something that tests itCode structure, any programLoop variant; Turing, Floyd, Cook et al.Settled, borrowed, ~50 years old. Conceded at the point of use. The fourth clause is the one agent writing drops
2A limit therefore bounds only the cycle whose passes it counts, so a limit can be set, honoured on every pass, and irrelevantCode structureRung 1 appliedThe frame's first prediction. Demonstrated, not asserted
3Here is that, at 500 calls, runnable with no keyOur bench, n=1, deterministicFirst-party runA demonstration of a borrowed mechanism. 500 is the bench's own backstop and the prose says so at first use. A no-key reproduction is not ours (runcycles.io)
4At realistic parse-failure rates the same uncovered cycle costs little, and the exposure is the sustained window where p climbs2,000 seeded trials per rate, our simulationloop_variant_lab.pyOurs as a measurement. A simulation of a control-flow shape, not an observation of any live system
5Repeat-hash detection has the same defect one level down: its measure stops decreasing when arguments varyCode structure, then our benchRung 1 applied, then measuredThe frame's second prediction, and the reason it is a frame rather than an anecdote. Mechanism and defeat both published (West); the numbers are ours
6This shape is in at least one real repositoryOne repository, LiteRAG, in a surveyed corpusHou et al., preprintAn existence proof. Never a frequency

What this ladder does NOT reach:

Not claimedWhy it is out of reach
That the reader's loop is brokenThe bench is a scripted fake model and rung 4 is a simulation. Neither measures the reader's code
That an uncovered cycle will run awayRung 4 measures the opposite at low failure rates: median overrun of zero at p=0.02. "Can", never "will"
That the frame is newFifty years old and credited. Only its application here is ours
That any of the guards is oursWest published the hash and its defeat; the SDK ships increment-before-call
That this failure is common47 of 6,549 is a lower bound of 0.72% with no recall reported. The corpus bounds prevalence in one direction only, and the piece says which
That the guards would have stopped the AWS billThey would not. That cycle ran inside a CloudFormation retry
Anything about what a run costsPitch 3

What would make it wrong

A reader runs the printed listing and it does not print 500

loop_variant_lab.py at other seeds moves the p=0.02 median off 10

Someone has already published loop-variant reasoning as the organising frame for agent loops

A reader shows a terminating loop the four-part question flags as broken

Framework-supplied retries turn out to be unbounded by default

The evidence, row by row

Each row is a claim the essay makes, then the evidence recorded for it and the source it was checked against. For verified rows that is usually the exact words, where they sit and the day they were read. The label says how far it was checked.

What the labels mean
Verified
Checked against the primary source itself by a checker who did not draft the piece, usually with the exact words, where they sit and the date read.
Executed
A run or observation done for the piece: code, a query, a count, or a check made live in an app. The claim is what it returned. Run records are not published.
Checked
Checked against its source by a separate checker in the older ledger format, which recorded no quote, locator or date.
Reported
Not verified word for word against a primary source: carried from a secondary source, from one that could not be opened in full, or supported only in part. The essay words it accordingly.
Struck
Drafted, checked and removed before publication. Kept here, crossed out, with the reason.
Excluded
Considered and deliberately left out of the piece. Kept here with the reason.
Sources (11)
  1. Lan Tian 4 rows
  2. AWS 2 rows
  3. Ball 4 rows
  4. Anthropic 3 rows
  5. First-party runs 12 rows
  6. Cloudzy 1 row
  7. Cook 1 row
  8. Floyd 1 row
  9. Hou 4 rows
  10. Alan West 1 row
  11. Albert Mavashev 1 row
  1. C46 Verified Read

    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.

    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"

    Lan Tian, blog post on the DN42 scanning agent · § timeline + § what it built · lantian.pub

    Link
    Cite

    Lan Tian, blog post on the DN42 scanning agent, § timeline + § what it built, https://lantian.pub/en/article/fun/ai-agent-bankrupted-their-operator-scan-dn42lantian.lantian/. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C46, https://durabilitycurve.com/claims/the-limit-said-10/#c-C46 (source read 2026-08-14).

    Report an error
  2. C47 Verified Read

    The $6,531.30 figure is the bill as incurred; AWS subsequently reduced it to about $1,894

    Initial bill "$6531.30"; operator reports the revised amount as "$1894" after AWS agreed to reduce charges

    Lan Tian, ibid. · § aftermath · lantian.pub

    Link
    Cite

    Lan Tian, blog post on the DN42 scanning agent, § aftermath, https://lantian.pub/en/article/fun/ai-agent-bankrupted-their-operator-scan-dn42lantian.lantian/. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C47, https://durabilitycurve.com/claims/the-limit-said-10/#c-C47 (source read 2026-08-14).

    Report an error
  3. C48 Verified Read

    The "a small VPS would have done it" judgement is the blog author's, not the operator's

    "for a hobbyist network like DN42, such infrastructure is way overkill, a small VPS server would do the job" — author's own assessment

    Lan Tian, ibid. · § assessment · lantian.pub

    Link
    Cite

    Lan Tian, blog post on the DN42 scanning agent, § assessment, https://lantian.pub/en/article/fun/ai-agent-bankrupted-their-operator-scan-dn42lantian.lantian/. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C48, https://durabilitycurve.com/claims/the-limit-said-10/#c-C48 (source read 2026-08-14).

    Report an error
  4. C49 Verified Read

    The operator learned of the spend through card charges rather than AWS monitoring

    Operator: "the cost too high and much charges on card"

    Lan Tian, ibid. · § discovery · lantian.pub

    Link
    Cite

    Lan Tian, blog post on the DN42 scanning agent, § discovery, https://lantian.pub/en/article/fun/ai-agent-bankrupted-their-operator-scan-dn42lantian.lantian/. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C49, https://durabilitycurve.com/claims/the-limit-said-10/#c-C49 (source read 2026-08-14).

    Report an error
  5. C50 Verified Read

    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

    "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"

    AWS Cost Management docs · § Managing your costs with AWS Budgets — console setting, service-side, nothing to run · docs.aws.amazon.com

    Link
    Cite

    AWS Cost Management docs, § Managing your costs with AWS Budgets — console setting, service-side, nothing to run, https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-managing-costs.html. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C50, https://durabilitycurve.com/claims/the-limit-said-10/#c-C50 (source read 2026-08-14).

    Report an error
  6. C94 Verified Read

    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

    "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)" ·

    AWS, Amazon EC2 User Guide · § On-Demand Instance quotas — console setting, service-side. · docs.aws.amazon.com

    Link
    Cite

    AWS, Amazon EC2 User Guide, § On-Demand Instance quotas — console setting, service-side, https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-on-demand-instances.html. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C94, https://durabilitycurve.com/claims/the-limit-said-10/#c-C94 (source read 2026-08-15).

    Report an error
  7. C1 Verified Read

    Ball's framing of an agent is "an LLM, a loop, and enough tokens"

    "It's an LLM, a loop, and enough tokens. It's what we've been saying on the podcast from the start."

    Thorsten Ball, How to Build an Agent · § opening · ampcode.com

    Link
    Cite

    Thorsten Ball, How to Build an Agent, § opening, https://ampcode.com/notes/how-to-build-an-agent. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C1, https://durabilitycurve.com/claims/the-limit-said-10/#c-C1 (source read 2026-08-13).

    Report an error
  8. C2 Verified Read

    A working code-editing agent fits in under 400 lines, mostly boilerplate

    "You can do it in less than 400 lines of code, most of which is boilerplate."

    Ball, ibid. · § opening · ampcode.com

    Link
    Cite

    Thorsten Ball, How to Build an Agent, § opening, https://ampcode.com/notes/how-to-build-an-agent. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C2, https://durabilitycurve.com/claims/the-limit-said-10/#c-C2 (source read 2026-08-13).

    Report an error
  9. C4 Verified Read

    The canonical tutorial does not cover error recovery, termination, token budget, cost, tool-output verification, concurrency or streaming

    Absence claim, checked at source: zero occurrences of "error recover", "terminat", "token budget", "cost", "stream", "concurren" across all 7 headings.

    Ball, ibid. · full page, 7 headings · ampcode.com

    Link
    Cite

    Thorsten Ball, How to Build an Agent, full page, 7 headings, https://ampcode.com/notes/how-to-build-an-agent. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C4, https://durabilitycurve.com/claims/the-limit-said-10/#c-C4 (source read 2026-08-14).

    Report an error
  10. C85 Verified Read

    Ball's tutorial does not cover verifying what a tool returned

    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

    Thorsten Ball, How to Build an Agent · full page, 7 headings · ampcode.com

    Link
    Cite

    Thorsten Ball, How to Build an Agent, full page, 7 headings, https://ampcode.com/notes/how-to-build-an-agent. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C85, https://durabilitycurve.com/claims/the-limit-said-10/#c-C85 (source read 2026-08-14).

    Report an error
  11. C5 Verified Read

    Anthropic defines agents as systems where the model directs its own process

    agents are "systems where LLMs dynamically direct their own processes and tool usage"

    Anthropic, Building Effective Agents · § What are agents? · anthropic.com

    Link
    Cite

    Anthropic, Building Effective Agents, § What are agents?, https://www.anthropic.com/engineering/building-effective-agents. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C5, https://durabilitycurve.com/claims/the-limit-said-10/#c-C5 (source read 2026-08-13).

    Report an error
  12. C7 Verified Read

    Anthropic advises agents need ground truth from the environment each step

    "During execution, it's crucial for the agents to gain 'ground truth' from the environment at each step"

    Anthropic, ibid. · anthropic.com

    Link
    Cite

    Anthropic, Building Effective Agents, https://www.anthropic.com/engineering/building-effective-agents. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C7, https://durabilitycurve.com/claims/the-limit-said-10/#c-C7 (source read 2026-08-13).

    Report an error
  13. C99 Verified Read

    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

    "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}

    Anthropic, Tool use with Claude · § How tool use works — service-side, console/service contract, nothing to run locally · platform.claude.com

    Link
    Cite

    Anthropic, Tool use with Claude, § How tool use works — service-side, console/service contract, nothing to run locally, https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C99, https://durabilitycurve.com/claims/the-limit-said-10/#c-C99 (source read 2026-08-15).

    Report an error
  14. C100 Executed Read

    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.

    Result: 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)

    First-party execution against current PyPI wheels · github.com

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party execution against current PyPI wheels), https://github.com/langchain-ai/langgraph/blob/1.2.14/libs/langgraph/langgraph/_internal/_config.py#L32. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C100, https://durabilitycurve.com/claims/the-limit-said-10/#c-C100 (source read 2026-10-06).

    Report an error
  15. C71 Verified Read

    Cloudzy describes a recursion limit as a backstop firing after the waste

    "It is a backstop that fires _after_ the loop has already wasted twenty-five steps and the API spend that goes with them."

    Cloudzy · § recursion limits · cloudzy.com

    Link
    Cite

    Cloudzy, § recursion limits, https://cloudzy.com/blog/why-ai-agent-loops-fail-in-production/. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C71, https://durabilitycurve.com/claims/the-limit-said-10/#c-C71 (source read 2026-08-14).

    Report an error
  16. C17 Verified Read

    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.

    "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

    Cook, Podelski & Rybalchenko, CACM 54(5):88–98, May 2011 · journal p.91 (PDF p.4), § Turing's Classic Method and Disjunctive Well-Foundedness · www0.cs.ucl.ac.uk

    Link
    Cite

    Cook, Podelski & Rybalchenko, CACM 54(5):88–98, May 2011, journal p.91 (PDF p.4), § Turing's Classic Method and Disjunctive Well-Foundedness, http://www0.cs.ucl.ac.uk/staff/b.cook/pdfs/proving_program_termination.pdf. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C17, https://durabilitycurve.com/claims/the-limit-said-10/#c-C17 (source read 2026-08-15).

    Report an error
  17. C72 Reported Read

    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).

    Floyd's authorship of the well-ordered-set termination argument is standard secondary attribution.

    Floyd, Assigning Meanings to Programs (1967), scanned copy · people.eecs.berkeley.edu

    Link
    Cite

    Floyd, Assigning Meanings to Programs (1967), scanned copy, https://people.eecs.berkeley.edu/~necula/Papers/FloydMeaning.pdf. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C72, https://durabilitycurve.com/claims/the-limit-said-10/#c-C72 (source read 2026-08-15).

    Report an error
  18. C21 Executed Read

    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

    Result: Run output: "malformed -> {'stopped': 'runaway', 'calls': 500}". hard_cap=500 is an argument in uncovered_bound_loop.

    First-party run

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party run). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C21, https://durabilitycurve.com/claims/the-limit-said-10/#c-C21 (source read 2026-08-15).

    Report an error
  19. C22 Executed Read

    No-progress detection on hashed (tool, args) halts a repeating caller in 3 calls

    Result: Run output: "repeater -> {'stopped': 'no-progress', 'calls': 3, 'repeated': 'a099dc8c'}"

    First-party run

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party run). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C22, https://durabilitycurve.com/claims/the-limit-said-10/#c-C22 (source read 2026-08-15).

    Report an error
  20. C23 Executed Read

    That same guard does NOT catch a model making novel calls forever; it runs to the ceiling at 30

    Result: Run output: "never_finishes -> {'stopped': 'ceiling', 'calls': 30}"

    First-party run. The 30 is max_iterations=30 in the guard's own signature, not a discovered threshold

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party run. The 30 is max_iterations=30 in the guard's own signature, not a discovered threshold). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C23, https://durabilitycurve.com/claims/the-limit-said-10/#c-C23 (source read 2026-08-15).

    Report an error
  21. C88 Executed Read

    The three printed outputs of bounded_run are what the printed code produces

    Result: 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.

    First-party run, reproducible

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party run, reproducible). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C88, https://durabilitycurve.com/claims/the-limit-said-10/#c-C88 (source read 2026-08-14).

    Report an error
  22. C8 Verified Read

    A static scan of 6,549 agent repos confirmed 68 infinite-loop failures across 47 projects at 91.9% precision

    "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"

    Hou, Wang, Zhao & Wang (HUST). PREPRINT · arXiv:2607.01641v1 §V-B1 · arxiv.org

    Link
    Cite

    Hou, Wang, Zhao & Wang (HUST). PREPRINT, arXiv:2607.01641v1 §V-B1, https://arxiv.org/abs/2607.01641. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C8, https://durabilitycurve.com/claims/the-limit-said-10/#c-C8 (source read 2026-08-13).

    Report an error
  23. C9 Verified Read

    All 68 confirmed failures share one root cause: the repeating path is not covered by a strong bound

    "All 68 failures share the same root issue: the repeated path is not covered by a strong bound."

    Hou et al. PREPRINT · arXiv:2607.01641v1 §V-B1 · arxiv.org

    Link
    Cite

    Hou et al. PREPRINT, arXiv:2607.01641v1 §V-B1, https://arxiv.org/abs/2607.01641. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C9, https://durabilitycurve.com/claims/the-limit-said-10/#c-C9 (source read 2026-08-13).

    Report an error
  24. C80 Verified Read

    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

    "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.

    Hou et al. PREPRINT · arXiv:2607.01641v1 §V-B2 Case Study + Figure 6 · arxiv.org

    Link
    Cite

    Hou et al. PREPRINT, arXiv:2607.01641v1 §V-B2 Case Study + Figure 6, https://arxiv.org/abs/2607.01641. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C80, https://durabilitycurve.com/claims/the-limit-said-10/#c-C80 (source read 2026-08-14).

    Report an error
  25. C90 Verified Read

    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

    "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."

    Hou et al. PREPRINT · arXiv:2607.01641v1 §V-B1 and the false-negative paragraph · arxiv.org

    Link
    Cite

    Hou et al. PREPRINT, arXiv:2607.01641v1 §V-B1 and the false-negative paragraph, https://arxiv.org/abs/2607.01641. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C90, https://durabilitycurve.com/claims/the-limit-said-10/#c-C90 (source read 2026-08-14).

    Report an error
  26. C101 Executed Read

    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

    Result: 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.

    First-party, seeded and deterministic

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party, seeded and deterministic). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C101, https://durabilitycurve.com/claims/the-limit-said-10/#c-C101 (source read 2026-08-15).

    Report an error
  27. C102 Verified Read

    Call-signature hashing with sorted keys, AND its defeat by semantically-equivalent varied arguments, both shipped with working code

    "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

    Alan West, How to Stop Your LLM Agent From Looping Itself Into Oblivion, DEV · § the tracker + § varied arguments · dev.to

    Link
    Cite

    Alan West, How to Stop Your LLM Agent From Looping Itself Into Oblivion, DEV, § the tracker + § varied arguments, https://dev.to/alanwest/how-to-stop-your-llm-agent-from-looping-itself-into-oblivion-27eh. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C102, https://durabilitycurve.com/claims/the-limit-said-10/#c-C102 (source read 2026-08-15).

    Report an error
  28. C103 Verified Read

    A runnable no-key simulated runaway predates ours by five months

    "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 (

    Albert Mavashev, Stop a Runaway AI Agent in Three Lines, runcycles.io, 2026-03-26 · § the unguarded run · runcycles.io

    Link
    Cite

    Albert Mavashev, Stop a Runaway AI Agent in Three Lines, runcycles.io, 2026-03-26, § the unguarded run, https://runcycles.io/blog/runaway-demo-agent-cost-blowup-walkthrough. Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C103, https://durabilitycurve.com/claims/the-limit-said-10/#c-C103 (source read 2026-08-15).

    Report an error
  29. C104 Executed Read

    The article's own guard.py prints c740a98e; C22 records a099dc8c, which is loop_lab.py's different call shape.

    Result: 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

    First-party run of the printed listing

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party run of the printed listing). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C104, https://durabilitycurve.com/claims/the-limit-said-10/#c-C104 (source read 2026-08-15).

    Report an error
  30. C105 Executed Read

    Its counter is on calls, not on time, and neither tools... nor model(messages) carries a timeout

    Result: Executed by the caller with a tool that never returns: hanging tool -> STILL RUNNING after 3s: bounded_run did NOT terminate (SIGALRM at 3s).

    First-party execution

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party execution). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C105, https://durabilitycurve.com/claims/the-limit-said-10/#c-C105 (source read 2026-08-15).

    Report an error
  31. C106 Executed Read

    The OpenAI Agents SDK advances its turn counter and tests the bound before invoking the model

    Result: 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

    First-party, read from the package

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party, read from the package). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C106, https://durabilitycurve.com/claims/the-limit-said-10/#c-C106 (source read 2026-08-15).

    Report an error
  32. C107 Executed Read

    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

    Result: 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

    First-party derivation, independently re-simulated

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party derivation, independently re-simulated). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C107, https://durabilitycurve.com/claims/the-limit-said-10/#c-C107 (source read 2026-08-15).

    Report an error
  33. C109 Executed Read

    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

    Result: 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

    First-party derivation

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party derivation). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C109, https://durabilitycurve.com/claims/the-limit-said-10/#c-C109 (source read 2026-08-15).

    Report an error
  34. C110 Executed Read

    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

    Result: 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.

    First-party execution

    A run or observation done for this piece. The run record is not published.

    Link
    Cite

    A run or observation by The Durability Curve (First-party execution). Checked in: Claim Ledger, "The Limit Said 10. The Loop Made 500 Calls.", The Durability Curve, row C110, https://durabilitycurve.com/claims/the-limit-said-10/#c-C110 (source read 2026-08-15).

    Report an error

Removed before publication

Claims that were drafted, checked and taken out, or considered and left out. The essay does not make them; they stay here with the reason.

  1. C43 Struck

    This is not an exotic bug

    Why: Unsupported. 47 of 6,549 repos is 0.72%, and C8 reports precision with no recall, so the corpus bounds prevalence in neither direction

  2. C44 Struck

    Forty lines gets you an agent / the forty lines above

    Why: Refuted inside the article. Ball says under 400 (C2); the code block is 13 lines. Appeared in the subtitle, a heading and the body

  3. C45 Struck

    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

    Why: Unmeasured population claims presented as observation. Each asserts a distribution over developers' code or the literature with nothing behind it

Cite and reuse

A single claim
Use the row's Cite button. It names the original source first, then this row, which carries its own link.
This ledger
Floyd, Harry (2026). Claim Ledger: The Limit Said 10. The Loop Made 500 Calls. The Durability Curve. https://durabilitycurve.com/claims/the-limit-said-10/
The essay
Floyd, Harry (2026). The Limit Said 10. The Loop Made 500 Calls. The Durability Curve. https://durabilitycurve.com/blog/the-limit-said-10/

The ledger data is licensed CC BY 4.0: reuse it, quote it or train on it, with credit to The Durability Curve and a link. Read the licence. Machine copies: JSON, CSV, Markdown.