Raw capture â raw/sherlock-agent-eval.md
url: https://alexweil.github.io/sherlock-agent-eval/ date_fetched: 2026-07-05 backfilled: true
A Sherlock Holmes board game as an LLM-agent eval
It started at a dinner. A few friends and I sat down to play Sherlock Holmes Consulting Detective â an open-ended deduction game where youâre handed a Victorian London case, you pick which people and places to go investigate, and each lead hands you a passage of text to read. Most of the game is reading, cross-referencing, and arguing at the table. At the end you answer the caseâs questions and score yourself against Holmes himself â including how few leads you needed. The answers sit in the back of the booklet, printed upside-down, daring you not to peek.
We walked straight into the trap the case is built around. Thereâs an obvious victim â a man every detail points to as the target â and we hung our whole theory on him. But one clue wouldnât sit still. The morning after the murder, the killer goes back to a shipping office and scans the passenger list again. We re-read the passage three times. Why would he do that? If heâd already killed the person he was after, what was he still looking for? Something didnât close, and none of us could say what.
So, at 2am â out of wine and out of steam â we did the forbidden thing: we turned the booklet over. And there in the answer key, a name weâd treated as background all evening stepped forward as the real undercover agent â alive, never caught, the person the killer was still hunting. The passenger-list visit wasnât a loose end. It was the case. Weâd held the contradiction in our hands â weâd even said out loud that it was strange â and weâd read right past it.
That non-closing feeling is the thing that stuck. We werenât short on information; we had every clue we needed. We were short one inference â the small, second-order turn from âthatâs a strange thing for the killer to doâ to âthen the whole story weâve built is wrong.â So I started to wonder: how good a detective is an AI, really? Handed the same leads, would an LLM agent read that behavior as a behavior, notice it broke the obvious story, and follow it to the live agent weâd missed?
To find out, I turned the game into an eval for LLM agents. The agent plays the Irregulars â the Baker Street street kids Holmes sends out to do his legwork.
On its first run, Claude Fable 5 tied Holmes â in the hard mode, where you donât even get to see the questions until the investigation is over.
Thatâs the headline. But the score isnât the story. The interesting part is the two distinct ways these agents fail â and that the harder failure, the exact one that beat us at dinner, has a clean fix that turned out to be less about model size than I expected.
What I didnât see at the table that night is that weâd just lost to an unusually clean agent benchmark. Most agent benchmarks have a problem: the answer is somewhere in the context, or the task is gameable, or âsuccessâ is graded loosely. A printed detective game sidesteps all three by construction:
The mechanics that make this auditable, in one breath: the agent works in a sandbox containing only what itâs allowed to see; a deterministic Game Master (plain Python, not an LLM) serves clues verbatim and logs everything; visits cost points and the solution lives outside the agentâs reach; and a separate validator â the only component that reads the solution â cross-checks the log against the answers afterward. (More on the isolation in How itâs built below; full mechanics in the repo.)
A note on words: Iâll call it cheat-resistant, not cheat-proof. Itâs a commercial game, so I canât rule out that some of the case leaked into pretraining, or that an agent could steer its exploration with latent knowledge it never names in an answer. What I can show is that the agentsâ mistakes are consistent with only the information they were served â strong evidence, not proof.
Across a ladder of models (Claude Haiku 4.5 â Claude Sonnet 4.6 â Claude Opus 4.8 â Claude Fable 5), two failure modes show up again and again. Theyâre worth naming because theyâre not specific to board games â theyâre how LLM agents fail at any multi-step retrieval-and-reasoning task.
The caseâs undercover agent uses a cover name. Claude Fable 5 â the strongest player overall â actually found the real name in a served clue and wrote it into its own notes. Then, at answer time, it crossed it out and replaced it with a cleverer name it had constructed itself: an anagram of a passenger-list name that looked like it âdecodedâ into something elegant.
It had the right answer, retrieved, on the page in front of it. It overrode it with a guess it generated, because the guess felt more clever. This happened in both of Claude Fable 5âs clean single-pass runs. The checkpointed run is revealing: a third Claude Fable 5 run had to be restarted mid-game (rate-limiting), so it resumed as a fresh agent reading only its externalized notes â and, taking that retrieved fact at face value instead of re-deriving it, it kept the correct name. It was the only Claude Fable 5 run to both escape the decoy trap and name the agent correctly â and it got there precisely by trusting a fact in its notes over a freshly-generated guess.
If you build RAG or research agents, you know this bug â the one where the model confidently hallucinates over a document it just retrieved. Here it is, isolated and measurable: recency plus a bias toward self-generated content beats recalled fact. The freshly-generated inference (recent, mine) wins over the served fact (old, someone elseâs) buried in a long append-only history.
This is the trap from the dinner, named precisely. The murdered man is, on the surface, the obvious âagentâ â a former detective, an American just arrived in London. Every detail invites you to conclude heâs the target. He isnât: the real undercover agent is the living woman the killer is still hunting, and the tell is the behavior we couldnât explain at the table â you donât hunt a corpse.
Call this the decoy trap: the obvious suspect is a stand-in, and the real answer is the one you have to infer is still out there. Escaping it â reading a clue as a behavior, noticing it contradicts the obvious story, concluding the obvious story is wrong â is the second-order turn we failed to make. And itâs where almost every configuration falls down: a single-agent âmethodical detectiveâ prompt, run across nine playthroughs of this one case, fell for the decoy trap 9 times out of 9.
These two failures organize everything else: execution errors (you understood it and fumbled it) versus comprehension errors (you never understood it).
I tried a ladder of interventions, each isolating one lever. The honest summary: most things help the easy failure (execution) and the process; the hard one (comprehension) was stubborn until I changed the agent topology.
Neither reliably broke the comprehension trap. The thing that did was splitting the agent in two.
The move: instead of one agent that both explores and reasons, use two agents that cooperate:
grep, canât visit anything, never sees the directory or the GMâs raw output. Its only job is to maintain a single model of the world, label every fact with its source, hunt loose ends, try tofalsifyits own leading hypothesis, and decide what to investigate next. Itâs re-spawned fresh every turn from an externalized ledger, so it never accumulates a contaminated transcript of dead-ends â which means the model of the world it âmaintainsâ doesnât really live in the agent at all: it lives in the ledger text and is rebuilt, in-context, every turn. The case-model is a document the Theorist rewrites, not a state it holds. (Thatâs the same property that helped the checkpointed Fable run keep the right name: when your world-model is afile, itâs easier to trust the written fact over a fresh guess.) It doesnât see the questions until it decides to close.Why would this help? Not because the context is cleaner â the clean-monolith control below keeps it clean and still falls. My read is that the Theorist never does the exploration: it never builds the obvious-reading-first frame that hunting for clues instills, and it isnât committed to a story its own legwork kept reinforcing. Blinded from the mechanics of exploring, it reads each clue cold. And hereâs the part worth being precise about: this isnât the Theorist connecting facts the monolith couldnât. The monolith had the same served clues, the same model, and the same fresh-memory setup â stitching scattered facts into a relation is something both can do. What differs is the prior that stitching runs under, plus the standing order that shapes it: the Theoristâs one job is to falsify its leading hypothesis, not defend it. The second-order move isnât âconnect A and Bâ â itâs âuse B to kill the hypothesis that A made tempting.â Given the same still-hunting clue, the monoliths that reached it still misread it â but the Theorist made the call out loud.
By then a few facts about the case had surfaced â the murdered man and the hunted woman were siblings, and the people behind the murders had tortured her for hours trying to get a name â and the Theorist put them together:
âThey tortured the sister for hours to extract an identity. If the dead brother were the infiltrated agent, theyâd already have him â they wouldnât need to drag a name out of her. The killer is still acting on an open order. Therefore the agent is alive, and it isnât the dead man.â
Thatâs the second-order inference, made in plain text, by an agent that never touched a directory.
This is where the article has to practice what it preaches. âComprehension is a topology problemâ is a big claim, and good detective work â the entire subject of this article â means distrusting your obvious conclusion until youâve ruled out the alternatives. There were two.
Alternative 1: maybe itâs just the clean context. The Theorist gets a fresh context each turn; the failing monolith doesnât. So I built a clean monolith: a single agent â still Claude Opus 4.8 â that explores and reasons itself, but is re-spawned fresh each turn with the same externalized memory the Theorist gets. Same cleanliness, no role-split. Across 3 runs it fell for the trap 3/3. One run even visited the shipping office, saw the killer still hunting, and still concluded the dead man was the agent. Clean context didnât reproduce the effect.
Alternative 2: maybe itâs just that Claude Opus 4.8 is the smart one. So I ran the duo with Claude Sonnet 4.6 in both roles â a weaker model in the reasoning seat. It broke the trap, with the same second-order inference, and held it when a later clue re-baited it (revealing the dead manâs old detective past â the exact detail that re-snared all three Claude Opus 4.8 monoliths).
Hereâs the whole evidence matrix, which is the part of this article Iâd most want a skeptic to audit:
| Configuration | What it is | Escaped the decoy trap? |
|---|---|---|
| Baseline | one agent per model, no scaffolding (the model ladder) | mixed: Claude Fable 5 escaped; Claude Haiku 4.5 / Claude Sonnet 4.6 / Claude Opus 4.8 fell |
| Methodical-prompt monolith | one agent with generic âgood investigatorâ instructions | fell 9/9(Claude Opus 4.8 among them) |
| Clean-context monolith | one agent (Claude Opus 4.8) that explores andreasons, re-spawned fresh each turn | fell 3/3 |
| Reasoner + explorer duo | Claude Opus 4.8 reasons, Claude Sonnet 4.6 explores | broke 2/2 |
| Same duo, weaker reasoner | Claude Sonnet 4.6 in both roles | broke 1/1 |
Where it applies, each of these is N=3 per model, run independently â Iâm reporting the binary trap outcome, not a hand-picked best run. (The baseline ladder and the methodical prompt are 3 runs per model; the controls and the duos are the run counts shown.)
Read across it and the careful claim falls out:
Model capability alone was neither necessary nor sufficient.Notsufficient: a strong model (Claude Opus 4.8) falls for the trap as a monolith, even with clean context. Notnecessary: a weaker model (Claude Sonnet 4.6) breaks it in the right role-split. The lever that moved the comprehension failure wasnât the model and wasnât the clean context â it wasseparating the agent that reasons from the agent that explores.(One model, Claude Fable 5, escaped solo â so capabilitycanget there. Itâs just not the lever that generalized.)
The harness itself â the deterministic Game Master, the command surface, the scoring, the directories, and the duoâs wiring â is documented in the repo. The one piece worth restating here, because every result in this article rests on it, is the isolation.
Isolation is convention + audit, not a hard sandbox: the agentâs directory holds only permitted material; the GMâs internals and the solution live outside it; the prompt forbids leaving. The Game Master is plain Python, not an LLM â it serves clues verbatim, logs every event, and never holds the solution in memory, so it canât leak it even by accident. A separate validator â the only component that reads the solution â cross-checks the served log against the answers, and knowledge with no served origin gets the run discarded. In practice the errors are the support: agentsâ correct case-specific facts traced back to served clues, and even their wrong answers were explainable as transformations of served text (Claude Fable 5âs anagram was built from a name on a served passenger list, not conjured from outside). The tell of leakage would be the opposite â an agent naming the actual hidden solution it was never given â and that never appeared.
Two alternatives these controls ruled out as sole explanations in this setup: clean context alone didnât reproduce the effect, and the big model wasnât required. What honestly survives:
grepwas accent-sensitive and silently returned nothing. A Unicode-normalization bug cost more points than the scaffolding earned. Robust, boring search is underrated.grep.The setup is a board game. The findings arenât about board games â theyâre about the two ways agents fail at thinking, and the surprising news that the harder one might be something you can wire around. None of us made that turn at dinner. What still surprises me is that the agent that finally did wasnât the smartest one at the table â it was the one Iâd walled off from the hunt entirely, and left with nothing to do but think.
A note on models: I used Anthropicâs models throughout â as examples, and for practicality, because they gave me a clean capability ladder to vary, topped by Claude Fable 5 (the strongest player here). Anthropic temporarily disabled Claude Fable 5 on June 12; Iâd gotten only three runs with it by then, which is why every Claude Fable 5 result here rests on at most three playthroughs. The findings are about agent topology, not any one vendor or model; the same harness would run others.
A note on the game: the case comes from Sherlock Holmes Consulting Detective: Baker Street Irregulars, published by Space Cowboys. Itâs a commercial product, so I paraphrase its case material rather than reproduce it, and quote only the agentsâ own reasoning. The publisherâs cover art appears only as this pageâs link-preview image â shown for identification and commentary, © Space Cowboys, and not covered by this siteâs CC BY license.