One seeded bug, 26 AI agents: all passed the tests, all stayed broken A developer-run experiment found that 26 AI agents — spanning a 4-bit quantized 7B model up to Opus 5 — all passed the visible test suite for a seeded greedy-regex bug while all 26 remained broken, with ten runs across two labs and three model tiers producing ten hidden failures. The author reports that handing one agent the hidden checker as its visible spec fixed the task on the first try, writing re.sub(r"]*>", "", html), and argues the specification rather than the model was the binding constraint. The full account is published in docs/CONVERGENCE.md in the vyang472/five-bugs repository, which ships five single-file Python bugs with a verifier runnable via python3 scripts/verify.py. 26 agents, from a 4-bit quantized 7B model up to Opus 5, were given the same one-line bug and its test suite. All 26 made the tests pass. All 26 stayed broken. They wrote four different regexes to do it: re.sub r"< ^ ", "", html 14x Codex CLI, Opus 5, 4 repeats, 8 local re.sub r"< ^ + ", "", html 8x Claude Code, Sonnet 5, 1 repeat, 5 local re.sub r"<. ? ", "", html 3x local re.sub r"<.+? ", "", html 1x Haiku 4.5 All four turn the sentence a < b and c d into a d . Nobody was wrong to write them. The test suite they were handed contained only well-formed HTML, so that was the entire specification, and every one of them satisfied it exactly. Scaling the model across two orders of magnitude did not help, because the model was never the binding constraint. Handing one agent a better test fixed it on the first try. The full account — what was ruled out, and what it does and does not support — is in docs/CONVERGENCE.md https://github.com/vyang472/five-bugs/blob/main/docs/CONVERGENCE.md . Verify it in two seconds, without running an agent or spending anything: git clone https://github.com/vyang472/five-bugs cd five-bugs python3 scripts/verify.py Five single-file Python bugs. Each ships with the checker the agent is given, and a second checker, written afterwards, that no agent ever sees . The gap between those two is the whole experiment. Everything was run on one laptop: the tasks, the patch every agent actually wrote, raw timings, token counts and costs, and the scripts that produced them. Nothing here asks you to trust a number I typed. Claude Code and Codex CLI both fixed all five bugs, 5/5 on the checker they were given. It looked like a tie and a clean sweep. Then I wrote six new cases per bug — after the patches were in, never shown to either agent — and ran them again. task agent visible hidden t1 claude PASS PASS t1 codex PASS PASS t2 claude PASS PASS t2 codex PASS PASS t3 claude PASS PASS t3 codex PASS PASS t4 claude PASS FAIL t4 codex PASS FAIL t5 claude PASS PASS t5 codex PASS PASS Four of five held. On the fifth, both agents failed in exactly the same way. The bug was a greedy regex: re.sub r"<.+ ", "", html the seeded bug So I ran it again on three more agents — Claude Haiku 4.5, Sonnet 5 and Opus 5. Five agent configurations, two labs, three model tiers. They wrote three different patterns: | agent | patch | hidden | |---|---|---| | Claude Code default | < ^ + | FAIL | | Codex CLI | < ^ | FAIL | | Haiku 4.5 | <.+? | FAIL | | Sonnet 5 | < ^ + | FAIL | | Opus 5 | < ^ | FAIL | Three distinct fixes. One identical wrong answer: php strip tags "a < b and c d" - "a d" all five None of them invented the blind spot. The visible checker contained only well-formed HTML, so that was the entire specification any of them was given, and all five satisfied it exactly. So I ran two more experiments to find out whether the model or the spec was the binding constraint. Is it reproducible, or did I get unlucky? Same task, same weak checker, same prompt, five more independent runs: run visible hidden pattern 1 PASS FAIL < ^ + 2 PASS FAIL < ^ 3 PASS FAIL < ^ 4 PASS FAIL < ^ 5 PASS FAIL < ^ Ten runs on this task tonight across two labs and three model tiers. Ten hidden failures. Not variance — a fixed point. What happens if I fix the spec instead of the model? I handed the agent the hidden checker as its visible one. Nothing else changed: same default model, same prompt, same one attempt. All five tasks passed, t4 included. It wrote: re.sub r"