Real-World Agent Framework Defects: Evidence for lambdagentpaas Static Analysis
Date: 2026-04-04
Sources: GitHub Issues from Claude Code, LangChain, CrewAI, AutoGen, LangGraph
Total Issues Analyzed: 40+
Conclusion: Every category of defect maps to a lambdagentpaas static guarantee
1. Cost Explosion ($342 Single Session — Claude Code)
- What happened: Session resume generated 652,069 output tokens without user input
- Cost: $342.74 in a single session
- Root cause: Resume logic auto-generated massive output with no budget check
- lambdagentpaas prevention:
- Graded types
(p, t, l, m): compile-time upper bound on tokens and cost
- CEK Yield: cost check at every oracle call → budget breaker before exceeding $X
- What happened: Catastrophic runaway event consumed 1.67 billion tokens
- Cost: Potentially thousands of dollars
- Root cause: No per-step cost tracking, no budget ceiling
- lambdagentpaas prevention:
- Cost monotonicity (Paper II Prop. 23):
c' ≥ c at every CEK step
- Graded iteration
g^n = (p^n, n·t, n·l, n·m): Loop cost upper bound computed at compile time
- What happened: Shell process ran infinite loop for 2+ days, consuming ~2.88M tokens
- Cost: $50-100 completely undetected
- Root cause: No process lifecycle management, no effect isolation
- lambdagentpaas prevention:
- Effect handlers:
io effect requires handler → orphaned process impossible without handler leaking
- Lint L004: no terminate condition detected at compile time
- What happened: Cache hit rate dropped from 97% to 4%, silently inflating costs 10-20x
- Duration: 28 days across 20 versions, affecting all paid tiers
- Impact: Front-page Hacker News (136 points), The Register coverage
- lambdagentpaas prevention:
- Graded types: Expected cost per call is part of the type → 10x deviation detectable as type violation
- Effect annotation
llm(m): Each model call carries expected cost grade → runtime deviation triggers alert
- What happened: Daily usage spiked from 17M to 96-108M tokens/day
- Root cause: Compaction triggers re-compaction in a cycle
- lambdagentpaas prevention:
- Lint L004: Loop without effective terminate condition
- Store independence: Compaction writes to same state it reads → violates
writes(f) ∩ reads(f) ≠ ∅ cycle detection
2. Infinite Loops (7 Distinct Patterns — Claude Code Alone)
- What happened: Agent repeatedly stated "let me write the document" without ever calling the Write tool, consuming entire context window
- lambdagentpaas prevention:
- Lint L004: ReAct loop where no branch leads to terminate
- CEK trace: Continuation stack K shows no
toolK frame ever pushed → detectable as non-progress
- What happened: Claude repeats identical failing command without modification, burning tokens
- lambdagentpaas prevention:
- Store independence:
state(step_n) = state(step_{n-1}) → identical state loop detected
- Guard validator:
P(output) = false for repeated identical errors → Guard retry limit enforced
- What happened: "Compacting conversation..." triggers again immediately after completing
- lambdagentpaas prevention:
- Loop variant analysis: Compaction should reduce context size → if it doesn't, Y combinator base case unreachable
- Lint L004a: TRUE semantic defect — loop body doesn't converge
- What happened: Task agent stuck in infinite loop, no way to terminate, must kill process
- lambdagentpaas prevention:
- CEK Yield: Every oracle call is a Yield point → cancellation checked between steps
- CEK pause/resume:
⟨C, E, K, σ, c⟩ serializable → graceful stop at any point
- What happened: Playwright SQL injection loop, repeating same failing approach
- Cost: 20+ minutes of Opus-level token consumption
- lambdagentpaas prevention:
- Store independence: Repeated identical tool inputs detected
- Graded cost: 20 min × opus rate → cost prediction flags this as expensive before running
- What happened: Opus model gets stuck exploring files and "thinking" without productive action
- lambdagentpaas prevention:
- CEK trace: K stack shows only
compK(explore, ...) frames, never toolK(write/edit, ...)
- Progress guard: No state change after N steps → Guard failure
- What happened:
--continue caused infinite session state re-serialization, 27.87 GB memory
- lambdagentpaas prevention:
- Effect annotation:
state(session) effect with write-amplification detected
- Lint L004: Recursive state write without convergence condition
3. Type/Format Mismatches (Crash at Runtime After Spending Money)
LangChain #17336 — LineList Expected Dict, Got Int
- What happened: MultiQueryRetriever output parser expects dict, receives int → TypeError
- Cost: All preceding LLM calls wasted
- lambdagentpaas prevention:
- T-Compose:
output(llm_chain) = Int, input(LineList) = Dict → Int ≮: Dict → compile error
LangChain #10997 — Chain Returns Dict, Tool Wrapper Expects String
- What happened: RetrievalQAWithSourcesChain returns dict, but agent tool wrapper expects string
- lambdagentpaas prevention:
- T-Compose:
output(chain) = Dict, input(tool_wrapper) = Str → Dict ≮: Str
LangChain #13101 — StructuredOutputParser Always Fails
- What happened: LLM returns triple-backticks format, parser regex expects single-backtick
- lambdagentpaas prevention:
- T-Compose:
output(LLM) = Str, input(parser) = Json(S) → schema validation at type level
- Guard:
Guard(llm >> parser, is_valid_json, k=3) with retry
AutoGen #391 — String Treated as Dict → AttributeError
- What happened:
'str' object has no attribute 'get' — string response treated as dictionary
- lambdagentpaas prevention:
- T-Compose:
typeof(response) = Str, but code calls .get() expecting Dict
LangGraph #6533 — Interrupt Resume Values Misrouted Between Tools
- What happened: Both tool interrupts get same ID → resume values delivered to wrong tool
- lambdagentpaas prevention:
- Store independence: Two tools writing to same interrupt namespace →
writes(tool_a) ∩ writes(tool_b) ≠ ∅
claude-agent-sdk-python#571 — StructuredOutput Wrapper Mismatch
- What happened: Agent wraps output in
{"output": {...}}, schema validation expects bare object
- lambdagentpaas prevention:
- Json(S) subtyping:
Json(object({output: S})) ≮: Json(S) → caught by structural subtyping
4. Parallel Agent Data Corruption
LangChain Forum — Race Condition: Parallel Tool Responses Out of Order
- What happened: Multiple tool calls in parallel, responses arrive out of order, corrupting message sequence
- lambdagentpaas prevention:
- Pair confluence (Paper II Prop. 30): Requires store independence
writes(f) ∩ writes(g) = ∅
- CEK PairLK/PairRK: Deterministic left-first-then-right evaluation prevents reordering
LangChain Forum — Multi-Agent Race Condition: Silent Data Loss
- What happened: Agent A and B both read state S, produce updates A' and B', one overwrites the other
- lambdagentpaas prevention:
- Store independence check:
writes(A) ∩ writes(B) ≠ ∅ → StoreConflictError at compile time
- SharedMemory append-only: Paper I store typing
Σ' ⊇ Σ — append-only prevents overwrite
5. Other Frameworks: Same Patterns
CrewAI #3847 — max_iter Does Not Actually Stop the Loop
- What happened:
handle_max_iterations_exceeded prepares answer but it gets overwritten; loop continues
- lambdagentpaas prevention:
- Theorem 5.4 (Bounded fixpoint termination):
fix_n GUARANTEES termination in n steps
- Lint L003:
maxSteps=0 / ineffective iteration cap
CrewAI #737 — Tool Called But Result Never Returns to Agent
- What happened: Agent calls tool with same params forever; tool result never feeds back
- lambdagentpaas prevention:
- CEK C-CompRet: Value MUST pop continuation and flow to next step — architectural guarantee
- T-Compose: Tool output type must match agent input type for next iteration
AutoGen #108 — Blank Messages in Infinite Loop (GPT-4)
- What happened: Agents send blank messages back and forth, hit rate limits, burn money
- Root cause:
is_termination_msg checks exact string "TERMINATE", LLM writes "(TERMINATE)"
- lambdagentpaas prevention:
- Lint L004c: String-based termination is fragile — flagged as INFO
- terminate = λx.x: In λA, terminate is a TOOL (structural), not a string match (heuristic)
AutoGen #1070 — No Way to Calculate Chat Session Cost
- What happened: Users cannot determine total cost of GroupChat session
- lambdagentpaas prevention:
- Graded types:
g_total = g_agent1 · g_agent2 · ... · g_agentN computed at compile time
- CEK cost vector:
c = (tokens, latency, cost) accumulated precisely per step
Summary: Mapping to lambdagentpaas Features
| lambdagentpaas Feature |
Real Issues Prevented |
Example Issues |
| T-Compose type checking |
9+ type mismatch crashes |
LangChain #17336, #10997, #13101; AutoGen #391; claude-sdk #571 |
| Graded cost prediction |
10+ cost explosions |
Claude Code #4095 ($1000s), #38029 ($342), #34629 (10-20x); AutoGen #1070 |
| Lint L004 (no terminate) |
7+ infinite loops |
Claude Code #27281, #6004, #19699; AutoGen #108, #391; CrewAI #737 |
| CEK Yield (pause/cancel) |
3+ runaway agents |
Claude Code #13996, #30016, #24585 |
| Store independence |
4+ data corruption |
LangGraph #6533; LangChain Forum race conditions; Claude Code #9579 |
| Effect handlers |
2+ environment confusion |
Claude Code #9704, #38029 |
| CEK cost monotonicity |
3+ undetected spending |
Claude Code #4095, #9704, #9579 |
Total: 38+ real issues across 5 major projects, every single one mappable to a lambdagentpaas static guarantee.
The Killer Statistic
Claude Code #34629 alone: A prompt-cache regression silently inflated costs 10-20x for 28 days across 20 versions.
If Claude Code's agent pipeline had been compiled with graded types:
Expected: g_call = (0.99, 1500 tokens, 1.2s, $0.005)
Actual: g_call = (0.99, 30000 tokens, 1.2s, $0.10) ← 20x deviation
lambdagentpaas runtime check:
⚠️ COST ANOMALY at Yield(llm):
Expected token cost: 1,500 (from graded type)
Actual token cost: 30,000
Deviation: 20x — exceeds 2x threshold
Action: PAUSE execution, alert developer
This bug would have been caught on Day 1, Call 1 — not Day 28.