{"i":14,"study":{"slug":"subagent-fan-out-cost","title":"What does fanning out 100 AI subagents cost? A calculation from measured runs","seoTitle":"CLI subagent cost: calculations for 10, 100 and 500 calls","description":"Calculation from separate CLI calls and Crewshal worker attempts. List-price cost scenarios for 10, 100 and 500 units; no parallel run was measured.","question":"What cost scenarios do recorded CLI calls and worker attempts support for 10, 100 and 500 units?","answer":"Calculation, not a run. We started no parallel subagents. At list price, 100 small Sonnet calls cost $0.36 using the median (15 calls; per-call range $0.0034 to $0.0102). Sonnet passed 12/15 (Wilson 95% interval 54.8% to 93.0%). This is cost per call, not per correct answer.\n\nAt the mean notional cost, 100 full worker attempts cost $280.72 (33 attempts; per-attempt range $0.89 to $4.83).\n\nFor Claude Code minimal replies, 100 × median input tokens gives 676,100 tokens (n = 5; token range unavailable). Input-only Sonnet price scenarios give $0.16, $1.35 or $2.70, with different cache assumptions. The corrected Codex aggregate reports 17,051 inclusive input tokens, including 13,184 cache-read tokens. We add no Codex input or cost projection.\n\nSerial scenarios use N × median duration. We do not know the parallel completion time.","date":"2026-10-06","updated":"2026-10-06","tags":["calculation","subagents","parallel-agents","claude-code","codex-cli","llm-pricing","latency"],"caveats":["Nothing ran in parallel. We did not measure rate limits, shared-host contention, machine limits or orchestration costs. One-unit medians are reference times, not parallel lower bounds.","These are subscription calls priced at API list rates, not invoices. We did not measure subscription capacity or billing at scale.","Minimal-reply calls do not isolate the CLI prefix. No empty-prompt control establishes tokens sent before work. Tools, prompts, flags and models differ across runs.","Claude’s minimal-reply input median is 6,761; whole Sonnet calls have a median 2,081. Times also differ: 2.53 s versus 2.31 s. We did not test the cause. Each small call includes its own CLI prompt, not the separately measured minimal-reply prefix.","Cache costs are scenarios, not bounds. Complete reuse assumes a cache write finishes before later calls start and their prefixes match. Actual writes can exceed plain-input prices.","The 4 later Claude processes read fewer first-turn cache tokens than they wrote. Counters do not identify which ledger tokens they read. Claude used a shortened ledger; Codex used the earlier longer ledger.","Pre-call protocol declaration is unverified from the selected public extracts. File times and final protocol text do not establish what was declared before the calls. This calculation supplies no new experiment or advance-declaration proof.","The linked minimal-reply, head-to-head and cache extracts retain final protocol text with advance-declaration headings. No preserved pre-call protocol versions were supplied for these extracts. Their public summary labels this missing provenance before publication; historical raw records and review verdicts stay unchanged.","The small task set is easy and selected, not a representative coding sample. Sonnet has three exact-text format misses with correct final numbers. Other selected configurations passed every call and hit a ceiling. Small n and overlapping cost ranges do not support a ranking.","Other work shared the Mac and subscription accounts. Timing may include shared load; different dates, models and harnesses prevent causal comparisons.","The worker sample has 33 attempts. Costs range from $0.89 to $4.83 and times from 1.6 min to 54.1 min. Campaigns used different platform builds and include replacement instances. New tasks may require different tokens and outcomes.","These publication-label corrections need a fresh source and text recheck before publication. They do not establish advance declaration or replace the historical failed source review."],"hero":{"statIds":["fan-out-small-cost-100-sonnet"]},"sourceIds":["calc-fan-out","agent-routing-overhead","agent-caching-consistency","agent-provider-h2h","agent-swebench-c1","agent-swebench-c2","price-anthropic","price-openai"],"stats":{"$k":["id","label","value","unit","display","n","note","ci"],"$r":[["fan-out-startup-tokens-claude","Minimal-reply input tokens, Claude Code (median, Haiku 4.5)",6761,"tokens","6,761",5,"Includes the user prompt and cache reads and writes. Token range is absent from the public aggregate; this is not an isolated start-up tax.","\u0001"],["fan-out-startup-time-claude","Recorded: Claude Code minimal-reply wall time (median)",2.529,"seconds","2.53 s",5,"Range 2.27 s to 3.38 s. Different models; timing includes the answer and process exit.","\u0001"],["fan-out-startup-time-codex","Recorded: Codex CLI minimal-reply wall time (median)",5.999,"seconds","6.00 s",5,"Range 5.37 s to 6.51 s. Different models; timing includes the answer and process exit.","\u0001"],["fan-out-startup-tokens-100-claude","100 minimal replies × median input tokens (calculation)",676100,"tokens","676,100",5,"Assumes the same prompt size. Token range is not available in the raw aggregate.","\u0001"],["fan-out-startup-cost-100-claude-upper","100 minimal replies, plain input (calculation)",1.3522,"usd","$1.35",5,"Input-only scenario at Sonnet 5.5 prices; not a measured bound.","\u0001"],["fan-out-startup-cost-100-claude-lower","100 minimal replies, first writes, later calls read (calculation)",0.16091,"usd","$0.16",5,"Input-only scenario at Sonnet 5.5 prices; not a measured bound.","\u0001"],["fan-out-startup-cost-100-claude-if-written","100 minimal replies, every call writes (calculation)",2.7044,"usd","$2.70",5,"Input-only scenario at Sonnet 5.5 prices; not a measured bound.","\u0001"],["fan-out-cache-cross-session-reuse","Later Claude sessions with first-turn cache reads greater than writes (proxy)",0,"count","0 of 4",4,"Proxy only: counters do not identify which ledger tokens were read. Wilson 95% rate interval 0.0% to 49.0%.","\u0001"],["fan-out-cache-turn1-read-share-claude","Recorded: Claude Code first-turn cache-read share (mean; calculation from reported first-turn counters)",0.18685,"rate","18.7%",6,"Per-process range 18.7% to 18.7%; not a confidence interval. Different ledger sizes and CLI prefixes; routes are not matched.","\u0001"],["fan-out-cache-turn1-read-share-codex","Recorded: Codex CLI first-turn cache-read share (mean; calculation from reported first-turn counters)",0.55451,"rate","55.5%",3,"Per-process range 47.7% to 59.3%; not a confidence interval. Different ledger sizes and CLI prefixes; routes are not matched.","\u0001"],["fan-out-small-task-cost-sonnet","Recorded: Claude Code · Claude Sonnet 5.5, median per-call cost (calculation)",0.0036,"usd","$0.0036",15,"Range $0.0034 to $0.0102. Includes failed validators; not cost per correct answer.","\u0001"],["fan-out-small-task-passed-sonnet","Recorded: Claude Code · Claude Sonnet 5.5, strict validator pass rate",0.8,"rate","12/15",15,"The easy task set hits a ceiling for configurations with no misses.",[0.5481,0.9295]],["fan-out-small-cost-100-sonnet","100 calls, Claude Code · Claude Sonnet 5.5 (calculation)",0.36006,"usd","$0.36",15,"N × median cost; scaled observed range $0.34 to $1.02.","\u0001"],["fan-out-small-task-cost-opus","Recorded: Claude Code · Claude Opus 5.5, median per-call cost (calculation)",0.00688,"usd","$0.0069",15,"Range $0.0059 to $0.0223. Includes failed validators; not cost per correct answer.","\u0001"],["fan-out-small-task-passed-opus","Recorded: Claude Code · Claude Opus 5.5, strict validator pass rate",1,"rate","15/15",15,"The easy task set hits a ceiling for configurations with no misses.",[0.7961,1]],["fan-out-small-cost-100-opus","100 calls, Claude Code · Claude Opus 5.5 (calculation)",0.68766,"usd","$0.69",15,"N × median cost; scaled observed range $0.59 to $2.23.","\u0001"],["fan-out-small-task-cost-haiku","Recorded: Claude Code · Claude Haiku 4.5, median per-call cost (calculation)",0.00566,"usd","$0.0057",15,"Range $0.0051 to $0.0180. Includes failed validators; not cost per correct answer.","\u0001"],["fan-out-small-task-passed-haiku","Recorded: Claude Code · Claude Haiku 4.5, strict validator pass rate",1,"rate","15/15",15,"The easy task set hits a ceiling for configurations with no misses.",[0.7961,1]],["fan-out-small-cost-100-haiku","100 calls, Claude Code · Claude Haiku 4.5 (calculation)",0.5657,"usd","$0.57",15,"N × median cost; scaled observed range $0.51 to $1.80.","\u0001"],["fan-out-small-task-cost-fable","Recorded: Claude Code · Claude Fable 5.1, median per-call cost (calculation)",0.00987,"usd","$0.0099",15,"Range $0.0049 to $0.0584. Includes failed validators; not cost per correct answer.","\u0001"],["fan-out-small-task-passed-fable","Recorded: Claude Code · Claude Fable 5.1, strict validator pass rate",1,"rate","15/15",15,"The easy task set hits a ceiling for configurations with no misses.",[0.7961,1]],["fan-out-small-cost-100-fable","100 calls, Claude Code · Claude Fable 5.1 (calculation)",0.98675,"usd","$0.99",15,"N × median cost; scaled observed range $0.49 to $5.84.","\u0001"],["fan-out-small-task-cost-sol","Recorded: Codex CLI · GPT-6.1 Sol (medium), median per-call cost (calculation)",0.01018,"usd","$0.0102",15,"Range $0.0054 to $0.0269. Includes failed validators; not cost per correct answer.","\u0001"],["fan-out-small-task-passed-sol","Recorded: Codex CLI · GPT-6.1 Sol (medium), strict validator pass rate",1,"rate","15/15",15,"The easy task set hits a ceiling for configurations with no misses.",[0.7961,1]],["fan-out-small-cost-100-sol","100 calls, Codex CLI · GPT-6.1 Sol (medium) (calculation)",1.0178,"usd","$1.02",15,"N × median cost; scaled observed range $0.54 to $2.69.","\u0001"],["fan-out-worker-cost-attempt","Full worker attempt, mean notional cost (calculation)",2.8072,"usd","$2.81",33,"Range $0.89 to $4.83; 25 resolved; all failures included.","\u0001"],["fan-out-worker-minutes-median","Full worker attempt, median wall time",9.59,"minutes","9.6 min",33,"Range 1.6 min to 54.1 min.","\u0001"],["fan-out-worker-calls-attempt","Full worker attempt, mean model calls",49.45455,"calls","49.5",33,"Range 13 to 71.","\u0001"],["fan-out-worker-cost-10","10 full worker attempts (calculation)",28.07197,"usd","$28.07",33,"N × mean notional cost; scaled observed range $8.90 to $48.27.","\u0001"],["fan-out-worker-cost-100","100 full worker attempts (calculation)",280.71973,"usd","$280.72",33,"N × mean notional cost; scaled observed range $88.98 to $482.74.","\u0001"],["fan-out-worker-cost-500","500 full worker attempts (calculation)",1403.59864,"usd","$1403.60",33,"N × mean notional cost; scaled observed range $444.91 to $2413.72.","\u0001"],["fan-out-worker-serial-100","100 worker attempts, serial duration scenario (calculation)",959,"minutes","16.0 h",33,"N × median; not a measured total.","\u0001"],["fan-out-worker-model-calls-100","100 worker attempts × mean calls (calculation)",4945.45455,"calls","4,945",33,"Scaled observed range 1300 to 7100; provider limits were not tested.","\u0001"]]},"charts":{"$k":["id","title","subtitle","kind","unit","yLabel","series","note","sourceIds","whisker"],"$r":[["fan-out-startup-tax","Claude Code minimal-reply input cost: three scenarios (calculation)","N × 6,761 median input tokens, repriced at Sonnet 5.5 rates","grouped-bar","usd","USD, input only",{"$k":["name","points"],"$r":[["Plain input, no cache surcharge",{"$k":["label","value","n"],"$r":[["10 subagents",0.1352,5],["100 subagents",1.3522,5],["500 subagents",6.761,5]]}],["First writes; all later calls read the whole prefix",{"$k":["label","value","n"],"$r":[["10 subagents",0.0392,5],["100 subagents",0.1609,5],["500 subagents",0.7018,5]]}],["Every call writes the whole prefix (1-hour price)",{"$k":["label","value","n"],"$r":[["10 subagents",0.2704,5],["100 subagents",2.7044,5],["500 subagents",13.522,5]]}]]},"Calculation, not a bill. n = 5 minimal replies on Haiku 4.5, one at a time. Sonnet 5.5 prices: $2.00 input, $0.20 cache read and $4.00 1-hour write per million tokens (2026-09-21). These scenarios use assumptions, not measured bounds. These scenarios exclude output and orchestration costs. No empty-prompt control isolates the CLI prefix. The corrected Codex aggregate reports 17,051 inclusive input tokens, including 13,184 cache-read tokens. Cached input is a subset, not an additional count. We omit its input and cost projections; different models and a minimal reply do not isolate a common startup prefix.",["calc-fan-out","agent-routing-overhead","price-anthropic"],"\u0001"],["fan-out-total-cost","N × per-call or per-attempt cost, by workload (calculation)","Small calls use medians; worker attempts use the mean. Each workload comes from a different run.","grouped-bar","usd","USD at list price",{"$k":["name","points"],"$r":[["Claude Code minimal reply (Haiku 4.5; Sonnet 5.5 price)",{"$k":["label","value","n"],"$r":[["10 subagents",0.1352,5],["100 subagents",1.3522,5],["500 subagents",6.761,5]]}],["Claude Code · Claude Sonnet 5.5",{"$k":["label","value","n","lo","hi"],"$r":[["10 subagents",0.036,15,0.0342,0.1021],["100 subagents",0.3601,15,0.3425,1.0211],["500 subagents",1.8003,15,1.7123,5.1053]]}],["Codex CLI · GPT-6.1 Sol (medium)",{"$k":["label","value","n","lo","hi"],"$r":[["10 subagents",0.1018,15,0.054,0.2686],["100 subagents",1.0178,15,0.5404,2.6858],["500 subagents",5.089,15,2.7018,13.429]]}],["Full worker attempt · Crewshal · Sonnet 5.5",{"$k":["label","value","n","lo","hi"],"$r":[["10 subagents",28.072,33,8.8983,48.2744],["100 subagents",280.7197,33,88.9827,482.7436],["500 subagents",1403.5986,33,444.9135,2413.718]]}]]},"We ran no parallel workload. Whiskers multiply observed per-unit cost ranges by N; they are scenario spreads, not confidence intervals.\n\nSmall-call costs include non-passes: Sonnet 12/15, Sol 15/15. These are per-call costs, not costs per correct answer. Each call includes its own CLI prompt, at the size used in that run.\n\nModels, flags and prompts differ across these runs. We did not test the cause of the cost difference. Do not add these bars together.\n\nWorker costs include all 33 attempts, including failures.",["calc-fan-out","agent-routing-overhead","agent-caching-consistency","agent-provider-h2h","agent-swebench-c1","agent-swebench-c2","price-anthropic","price-openai"],"minmax"],["fan-out-wall-time","Serial duration scenarios and one-unit reference times (calculation)","Serial = N × median. We did not measure parallel completion time.","grouped-bar","seconds","Seconds",{"$k":["name","points"],"$r":[["Serial scenario, 10 units",{"$k":["label","value","n","lo","hi"],"$r":[["Claude Code minimal reply (Haiku 4.5; Sonnet 5.5 price)",25.29,5,22.73,33.82],["Claude Code · Claude Sonnet 5.5",23.09,15,21.73,77.25],["Claude Code · Claude Opus 5.5",27.45,15,24.7,89.14],["Claude Code · Claude Haiku 4.5",44.28,15,31.64,235.69],["Claude Code · Claude Fable 5.1",19.44,15,14.09,98.28],["Codex CLI · GPT-6.1 Sol (medium)",56.49,15,40.95,254.61],["Full worker attempt · Crewshal · Sonnet 5.5",5754,33,978,32454],["Codex CLI minimal reply (default model)",59.99,5,53.67,65.06]]}],["Serial scenario, 100 units",{"$k":["label","value","n","lo","hi"],"$r":[["Claude Code minimal reply (Haiku 4.5; Sonnet 5.5 price)",252.9,5,227.3,338.2],["Claude Code · Claude Sonnet 5.5",230.9,15,217.3,772.5],["Claude Code · Claude Opus 5.5",274.5,15,247,891.4],["Claude Code · Claude Haiku 4.5",442.8,15,316.4,2356.9],["Claude Code · Claude Fable 5.1",194.4,15,140.9,982.8],["Codex CLI · GPT-6.1 Sol (medium)",564.9,15,409.5,2546.1],["Full worker attempt · Crewshal · Sonnet 5.5",57540,33,9780,324540],["Codex CLI minimal reply (default model)",599.9,5,536.7,650.6]]}],["Serial scenario, 500 units",{"$k":["label","value","n","lo","hi"],"$r":[["Claude Code minimal reply (Haiku 4.5; Sonnet 5.5 price)",1264.5,5,1136.5,1691],["Claude Code · Claude Sonnet 5.5",1154.5,15,1086.5,3862.5],["Claude Code · Claude Opus 5.5",1372.5,15,1235,4457],["Claude Code · Claude Haiku 4.5",2214,15,1582,11784.5],["Claude Code · Claude Fable 5.1",972,15,704.5,4914],["Codex CLI · GPT-6.1 Sol (medium)",2824.5,15,2047.5,12730.5],["Full worker attempt · Crewshal · Sonnet 5.5",287700,33,48900,1622700],["Codex CLI minimal reply (default model)",2999.5,5,2683.5,3253]]}],["One-unit median reference (not a parallel bound)",{"$k":["label","value","n","lo","hi"],"$r":[["Claude Code minimal reply (Haiku 4.5; Sonnet 5.5 price)",2.529,5,2.273,3.382],["Claude Code · Claude Sonnet 5.5",2.309,15,2.173,7.725],["Claude Code · Claude Opus 5.5",2.745,15,2.47,8.914],["Claude Code · Claude Haiku 4.5",4.428,15,3.164,23.569],["Claude Code · Claude Fable 5.1",1.944,15,1.409,9.828],["Codex CLI · GPT-6.1 Sol (medium)",5.649,15,4.095,25.461],["Full worker attempt · Crewshal · Sonnet 5.5",575.4,33,97.8,3245.4],["Codex CLI minimal reply (default model)",5.999,5,5.367,6.506]]}]]},"A serial total is a sum of durations. N × the median is a scenario, not its measured total or expected value. Whiskers show observed per-unit ranges, scaled by N for serial scenarios. They are not confidence intervals. Simultaneous completion depends on the maximum duration, not the median. The slowest recorded worker attempt took 54.1 min. We did not measure rate limits, machine limits or contention.",["calc-fan-out","agent-routing-overhead","agent-provider-h2h","agent-swebench-c1","agent-swebench-c2"],"minmax"]]},"related":["routing-overhead","model-head-to-head","swe-bench-verified"]}}