The 4,300-Digit Wall
The benchmark compared A2A agent performance across Python, Go, Node, and Rust. At N=24, Python returned N/A. The error: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit. CPython 3.11 added this default cap as a denial-of-service mitigation. The 24th Mersenne prime (2^19937−1) has 6,002 digits. The fix? Delete the unnecessary str() call. Go had the same dead weight (val.String()) but didn't crash.
The Parser Bet on LLM Phrasing
The harness parsed Python's elapsed time with regex r"It took ([\d\.\-e]+) seconds". But Gemini never said "It took"—it said "Calculating the first 5 Mersenne primes took…" or "The calculation took…". Python data survived only via a fallback that read structured tool artifacts. The primary path was a bet on a language model's phrasing habits.
Nanoseconds Broke the Parser
After deleting dead formatting, Go's small-N runs became so fast that time.Duration output changed units: Elapsed time: 836ns. The parser had branches for µs, ms, and s, but never met a nanosecond. The fix made the code too fast for its own benchmark.
The LLM Got Bored
Reruns caused three missing Go datapoints. The captured response: "I already did that. Do you want to do it again?" The harness reused deterministic context IDs; ADK keeps per-context session history. On rerun, Gemini declined to redo work. Unique per-run IDs fixed it.
The Chart Lied
The chart title: "A2A Round-Trip Time (including LLM/Tool calling)". Only half true—two agents route through Gemini, two are direct HTTP handlers. Median RTT: 2.6ms and 4.6ms for direct, ~1.6s and ~1.8s for Gemini. A ~400× gap presented as language comparison was actually pipeline comparison.
Nine Bugs, Four PRs
The full list: (1) CPython int→str crash, (2) regex on LLM prose, (3) nanosecond parsing, (4) LLM refusal to repeat, (5) Node/Rust reporting "Found first 100 Mersenne primes" (they only have 26), (6) Rust's %.2f ms rounding to 0.00ms (breaks log scale), (7) chart title misleading, (8) benchmark stopped at N=22 as workaround, (9) the workaround committed as run_benchmark_1_22.py.
The Takeaway
run_benchmark_1_22.py sat in the repo like a fossil of an uninvestigated crash. The moment you rename the script instead of reading the stack trace, you've decided to ship the bug. Benchmarks are production code—they crash, lie about counts, round away smallest measurements, and compare different architectures on one axis.
If a machine consumes output, never route it through prose. Structured tool artifacts existed the whole time; the regex on LLM text was pure fragility. An LLM in the measurement path adds failure modes including boredom.
To reproduce: docker run --rm -e GEMINI_API_KEY=your_key -v "$PWD/out:/out" xbill9/bugsmash runs all four fixed agents and writes charts to ./out. The bugs, numbers, and "I already did that" refusal are real and archived in the repo.



