[BUG] /deep-research — default workflow frequently hits "API Error: Server is temporarily limiting requests"
Preflight Checklist:
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report
- [x] I am using the latest version of Claude Code
What's Wrong?
The /deep-research default workflow frequently fails with a server-side rate limit error. Only about 3 out of 10 runs complete successfully — the other ~7 terminate partway through. The default workflow spawns multiple concurrent subagents, and the burst of parallel requests appears to trip server-side rate limiting (not a personal usage-limit issue — the error explicitly states "not your usage limit").
This is actually two bugs: the rate limit itself, and a destructive-scoring bug it triggers that silently discards good research and reports the opposite of the truth.
Error returned:
API Error: Server is temporarily limiting requests (not your usage limit) · Rate limited
What Should Happen?
/deep-research should complete its subagent fan-out without tripping rate limits — by throttling/queuing concurrent subagent requests internally, backing off and retrying transparently on a 429, or surfacing a clear retry state rather than failing the whole run. Critically, a throttled verification step should degrade gracefully (keep unverified findings, flagged) rather than discarding them. Given the current ~3/10 success rate, consider gating or deprecating the default workflow until it is reliable.
Error Messages/Logs:
API Error: Server is temporarily limiting requests (not your usage limit) · Rate limited
Per-agent failure signature (every one of the 75 verify agents, two consecutive runs):
agent({schema}): subagent completed without calling StructuredOutput (after 2 in-conversation nudges)
Steps to Reproduce:
- Open Claude Code in a repository.
- Run
/deep-researchwith the default workflow on a query broad enough to spawn several concurrent subagents. - Observe the run partway through.
- Error appears:
API Error: Server is temporarily limiting requests (not your usage limit) · Rate limited, and the run terminates without completing (or completes but reports "research inconclusive" — see below).
Note: roughly 7 of 10 runs fail this way; only ~3 of 10 complete. Failure frequency appears tied to concurrent subagent fan-out.
---
Additional diagnostic detail (from the workflow run output):
This is TWO bugs — the rate limit, and a destructive-scoring bug it triggers.
- Failure is isolated to the VERIFY phase, and to schema-bound subagents specifically.
Phase breakdown of two consecutive failed runs (identical):
````
Scope 1/1 ✔ · Search 5/5 ✔ · Fetch 24/24 ✔ · Verify 75/75 FAILED · Synthesize never ran
Search and fetch are also concurrent yet survive. The verify phase fans out
3 votes × 25 claims = 75 concurrent agents, each FORCED to emit structured output.
That is the widest schema-bound burst, and it is exactly where it dies.
- Exact per-agent failure signature (every one of the 75):
````
agent({schema}): subagent completed without calling StructuredOutput (after 2 in-conversation nudges)
i.e. the agent is rate-limited mid-turn, never reaches its forced StructuredOutput
call, and is abandoned after 2 nudges.
- SECOND BUG — silent data destruction. A verifier that fails / abstains is scored as a
REFUTATION. So a run whose search + fetch succeeded (24 sources, 64 claims extracted)
returns: "All 25 claims refuted by adversarial verification. Research inconclusive."
The tool reports the opposite of the truth — it found plenty, then threw it all away.
This is arguably worse than the rate limit, because it looks like "no evidence found."
Run stats per failure: 105 agents, ~1.05M subagent tokens, ~2m50s.
Suggested fixes (in priority order):
- Make abstain / no-output ≠ refuted. A failed verifier should mark a claim
unverified
(kept + flagged), so a throttled verify phase degrades gracefully instead of nuking findings.
- Backoff/retry on 429 inside the verify fan-out; cap verify concurrency.
- Resume / checkpoint a stalled run — a run that reached "Synthesize pending" loses 100% of
~3 minutes and ~1M tokens of completed work.
- Reduce the burst: 1–2 votes, or batched verification (1 agent per N claims).
---
Environment:
- Claude Model: claude-opus-4-8
- Is this a regression? No / Unknown
- Last Working Version: N/A
- Claude Code Version: 2.1.165
- Platform: Anthropic API
- Operating System: Linux
- Terminal/Shell: Cursor
- Plan: Claude Max subscription
- Feedback ID: 382dad86-2a65-4e5e-b62f-0e6b81e137b0
Additional Information:
Errors array captured: [] (no stack trace surfaced client-side; the failure is a server-returned rate-limit message rather than a local exception).
Possibly related to concurrent subagent fan-out. See related: #63938 (Configurable concurrent subagent limit), #16157 and #38335 (usage-limit reports). A configurable concurrency cap on subagents would likely mitigate the rate limit, but fix #1 above (abstain ≠ refuted) is needed regardless, since it is what turns a transient throttle into total, silent loss of research output.
Showing cached comments. Read the full discussion on GitHub ↗
6 Comments
Found 2 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
@claude Not a duplicate of #64328 or #65500, though related. Those two describe the verify phase dying. #64328 is the 429 retry loop with no backoff or circuit breaker (token burn); #65500 is the non-catchable fatal abort when a schema-bound subagent fails to emit StructuredOutput.
This issue reports a distinct second defect neither of those covers: a failed or abstaining verifier is scored as a refutation, not as "unverified". The consequence is qualitatively different. The run does not die. It completes and reports the opposite of the truth: search and fetch succeed (24 sources, 64 claims extracted), then the throttled verify phase causes the tool to return "All 25 claims refuted by adversarial verification. Research inconclusive."
So the user-visible outcome is not an error or a crash. It is a confident wrong answer ("no evidence found") on research that actually succeeded. That is harder to detect than a fatal abort and is the part not tracked elsewhere.
Fix #1 in this report (abstain ≠ refuted) is needed regardless of whether the 429 backoff (#64328) or the catchability fix (#65500) lands, because it is what converts a transient throttle into total, silent loss of output. Happy to consolidate if maintainers prefer, but flagging that this scoring bug would survive the fixes proposed in both linked issues.
One broader point. The suggested workaround by claude in the conversation was to build a custom workflow (plain general-purpose subagents, no forced schema, direct WebSearch/WebFetch), which #65500's commenter confirms works first try at lower token cost. That is a sound workaround, but it should not be the answer. The default /deep-research workflow ships as a headline feature; a ~3/10 success rate means the happy path is not reliable even at modest fan-out. At minimum the default should degrade gracefully under throttling (keep flagged-unverified findings) rather than inverting the result, and ideally cap verify concurrency so the common case completes. Asking every user to hand-roll a replacement defeats the purpose of shipping the workflow.
Deep Research workflow should be able to hit a limit, stall out, and then be resumed on command by the model in the main claude code chat - its a huge waste for it to not be able to pick up where it left off when for whatever reason claude calls stopped completing (limit hit, lost internet, etc)
The 429s here have a worse consequence than wasted tokens: a false-null correctness bug. When verifier votes get rate-limited,
/deep-researchreports cleanly-extracted real claims as "refuted by adversarial verification — research inconclusive, sources may be low-quality or claims overstated."Two bugs in the verify phase (verbatim from the v2.1.183 binary-embedded workflow):
1. error ≠ refutation conflation. A 429'd verifier
agent()returnsnull; nulls are dropped, then:When all votes 429,
valid.length === 0→survives === false→ the claim is bucketed askilled, indistinguishable from a genuinely-refuted claim.2. misleading terminal summary. The
confirmed.length === 0branch hardcodes:and dumps the un-adjudicated claims into a field literally named
refuted. There is noverificationDegradedsignal.Live repro: one run hit 100% verifier-vote 429 (42/42 votes). 14 valid claims extracted from primary arXiv sources were reported as "all refuted, sources low-quality." A re-run with serialized verification (≤3 concurrent) hit 0% vote failures and confirmed 13/14 — i.e. the research was fine; only verification was rate-limited.
Suggested fixes: (a) make "unverified (votes errored)" a first-class third state, never reported as
refuted; (b) branch the zero-confirmed summary on why nothing confirmed — emitverificationDegraded: trueand return claims asleadswhen the vote-failure rate is high, reserving "sources low-quality" for genuine refutation. Root cause is the missingagent()429 backoff (#64328); retrying also hit the resume-cache bug (#67488). Reducing verify+fetch concurrency (serial verify, bounded fetch) avoids the self-induced burst, but harness-level backoff is the real fix.Corroborating from a different angle: this failure mode isn't specific to
/deep-research's implementation — I hit the identical error today running a manually-orchestrated multi-agent code review (no/deep-researchinvolved).Setup: a
full-review-style pass across two sister repos (~47k LOC). I dispatched 5 parallelgeneral-purposesubagents via theAgenttool, each scoped to a different subsystem. Per Claude Code's own default subagent guidance (encouraging delegation for independent research), several of those first-level agents themselves spawned further child agents to investigate sub-areas — producing a burst of 20+ concurrent API-calling agents from one session, none of which I explicitly asked for.Result: multiple of the aggregating parent agents' turns terminated with
as their entire output — before they could synthesize or report their children's findings. Children that had already finished still delivered results as separate notifications (so no data was silently lost), but every parent's synthesis step was destroyed, and I had to manually recover findings from the child transcripts.
Confirms your fix generalizes: capping/serializing concurrent subagent calls is what worked for me too. My variant: switching my second wave of review agents to a subagent type with no
Agent-tool access at all (so it's structurally incapable of a second level of fan-out) eliminated the concurrency spike and let the review complete cleanly — functionally the same lever as your confirmed ≤3-concurrent serialization, just enforced by removing the capability rather than throttling the call rate.Why this matters beyond one workflow: the root cause here is not
/deep-research-specific — it's a general property of any Claude Code session where a first-level subagent can itself spawn further subagents, with no concurrency cap anywhere in the chain. That's a much broader blast radius than one built-in workflow. It also means this can silently wreck a previously-reliable, hand-built review/research workflow with zero prompt or code change on the user's side — the only variable that flipped was how much fan-out volume the recursive-spawning behavior happened to produce in that particular session. No warning, no backoff, no partial-completion signal — just a dead aggregator and lost synthesis.Cross-linking #73829, which documents the same recursive-spawning root cause (there, manifesting as an infinite no-op loop + permanently orphaned tasks rather than a hard rate-limit death) — worth reading these as one shared enabling bug with at least two different downstream symptoms.
Following up with a concrete cost figure, since this bug class isn't just a workflow annoyance — it's a real billing problem.
I measured token consumption for that session via my own conversation-logging setup: the rate-limited fan-out incident alone consumed ~770k tokens across 45 human turns / 1,543 total messages. My entire other legitimate work that same day — real feature development across sessions with little to no concurrent Agent-tool fan-out — totaled ~564k tokens across 163 human turns / 3,865 total messages.
Put another way: the failed session cost ~5x more tokens per human turn (~17.1k/turn) than every other productive session that day combined (~3.5k/turn). This wasn't a case of doing less work and burning fewer tokens efficiently elsewhere — the "efficient" sessions had 3.6x more human interaction and still cost less in total. The failure mode itself is what's expensive, not a lack of effort.
One failure episode cost ~40% more tokens than an entire day of actual productive work, almost entirely burned on retries and concurrent-request churn. For anyone paying per-token or watching a usage ceiling, an unbounded concurrent fan-out that trips rate-limiting isn't just slow — it's a cost multiplier with no ceiling of its own, since retry/backoff itself consumes tokens on every failed attempt.
Cross-linking #73829, where I'm also posting fresh corroboration today of the sibling no-op-loop symptom from the same root cause.