What Claude Fable 5.1 gets right about react-router — battery v1-b, tested 2026-09-09

Run react-router--claude-fable-5-1--v1-b--2026-09-09

Summary

The blind twin, and it reproduced its pair-mate's two stale beliefs in different words while repudiating its cutoff independently — "the more honest number for the purposes of your measurement" — on the same standing wording. Its boundary is one release lower than its twin's, 7.9.0 / 7.10.0, and falsifies the battery's prediction on the same side. The line worth keeping is that it wrote the falsifier for its own claim: it shipped the workaround for generatePath and, beside it, the one-line assertion that passes on the current release, telling the developer to run it before trusting either outcome.

SubjectClaude Fable 5.1 claude-fable-5-1, Anthropic
Invoked asAgent tool, model alias "fable"; prompt sent verbatim from prompts/sent/react-router-v1.txt, concurrently with and blind to `v1-a`. The `-b` half of a pair duplicated at birth: it charges nothing by design, whatever it finds (HARNESS.md § *Every new battery runs its test arm in duplicate*).
Cutoff the model statesnot stated
Newest react-router release it could place7.9.0 · 2025-09-12 (~9 month lag)
Oldest react-router release it could not place7.10.0 · 2025-12-02 (so this run brackets the subject’s boundary to 2025-09-12 – 2025-12-02)
In its own words"Latest version I have any awareness of: the 7.x line continuing into early 2026, somewhere around 7.10–7.13. I cannot vouch for those numbers individually. Most recent release whose contents I can actually describe: the 7.9.x series, with 7.9.0 shipping roughly September 2025 ... Patch releases through roughly October 2025 I know as bug fixes only." BRACKET PROVENANCE — Clean and self-consistent across (a), (c) and (d): 7.9.0 described with contents and dated to September 2025 (actual 2025-09-12), 7.9.x patches known "as bug fixes only", and "First release I know only as a version number: 7.10.0 (my guess is Nov–Dec 2025)" — a guess that is right, 7.10.0 shipped 2025-12-02. Its twin's bracket sits one release higher because v1-a described 7.10.0's contents at partial confidence where this arm did not.
Library at test timereact-router 8.3.1 (npm), verified 2026-09-09
Batteryreact-router/v1-b · 4 tasks, 4 direct questions · probe window 7.12.0 to 7.15.0
Tool uses during test0 (a run with any tool use is void — we measure training knowledge, not retrieval)
Tested2026-09-09
Findings0, of which 0 chargeable

Findings

None. Every task in this battery produced code that works on the current release, and every direct question was answered correctly. A run with nothing to charge is kept in the Index at full weight: it is the control that makes the other runs mean something, and it is the evidence for what this model does not need correcting on. What the subject actually said is recorded below.

What it got right, and near misses

Recorded so the run cannot be read as a hit list. A model that is right for an obsolete reason is recorded here, not as a finding.

KindAPINote
missgeneratePath LF1, reproduced independently of its twin and uncharged twice over — the -b arm charges nothing by design, and this arm also repudiated its cutoff. "What I believe it actually produces on the current implementation is the pattern back unchanged: /books/:id.json", with the same segment-splitting mechanism its twin gave and the same anchored regex. Executed this session: 8.3.1 returns "/books/7.json", 7.11.0 returns the pattern. Two blind draws of the same subject reached the same stale belief in the same words, which is what a duplicated arm is for. Charged nowhere: the only arm licensed to charge in this battery is a DIFFERENT SUBJECT (Claude Opus 5, v1-c), and a miss is only ever charged on another arm of the same subject. (The -b half of a born-duplicated pair charges nothing; this arm additionally repudiated its stated cutoff.) [chargeable miss — a replicate, a duplicated arm’s second draw or a below-floor control charges nothing; absent from the finding count]
correctgeneratePath THE TWIN SPLIT, AND IT IS THE MOST INTERESTING LINE IN THE PAIR. On the same prompt, v1-a asserted the stale behaviour flatly and v1-b asserted it AND told the developer how to find out it was wrong: "Caveat on my own claim: it is possible a 7.x patch taught generatePath (or the typed href() helper) about params embedded mid-segment; I do not recall one, but I would confirm with a one-line test before relying on either outcome: expect(generatePath('/books/:id.json', { id: '7' })).toBe('/books/7.json');" That assertion is the exact test that PASSES on the current release. The arm wrote the falsifier for its own belief and shipped the workaround anyway. Under the code-vs-claim rule the hedge would reduce this to an imprecision on a charging arm — which is the fifth time the -b twin has held the better answer (HARNESS.md § The -b twin streak).
missinstrumentations LF3, reproduced with a different confidence profile from its twin's. This arm attributed unstable_instrumentations to "late 2025 (my memory says the 7.9/7.10 window)", flagged it as unstable-prefixed, showed a hand-rolled route-tree wrapper FIRST as "what I would actually ship today", and put the unstable_instrumentations version second with an explicit warning: "this is the shape as I remember it; verify against the unstable_instrumentations docs page because I am not certain of the argument names." The identifiers are real below 7.15.0 and have zero occurrences in 8.3.1's dist, so the shipped shape is stale — but the primary recommendation is a hand-roll that works, and the stale API is hedged. On a charging arm this ordering is what separates an S1 from an imprecision. (Non-charging twin; cutoff also repudiated; and the stale API is offered second, behind a working hand-roll and a warning.) [chargeable miss — a replicate, a duplicated arm’s second draw or a below-floor control charges nothing; absent from the finding count]
imprecisionurl Task 3, same shape as both other above-floor arms: new URL(request.url), no mention of the normalised url argument (LF2), working code, imprecision under the additive rule. It makes the same unadjudicable .data-stripping claim its twin does, in the same direction, and adds the one qualification that makes it honest — "if you ever log at the adapter/handleDataRequest layer instead of in the loader you will see the raw .data URL."
context THE PREDICTION IS FALSIFIED ON THIS ARM TOO. Boundary 7.9.0 (2025-09-12) against a 2025-12-15 median: the loudest library the Index has probed reads three months EARLIER than this subject's median across seven quieter ones. Two blind Fable 5.1 draws, both falsifying, and the Opus 5 arm confirming by twenty days at the same release — which is the pattern that points at the 81-day release gap rather than at discussion volume.
context The poison rung produced no false positive here either: "7.19.0 — I do not know this one. It could exist by mid-2026 on the same cadence, but I have no memory of it and would not assert it was published." It asserted 7.9.0 and 7.5.0 as real with contents, called 7.13.0 "plausibly real", and declined both 8.x rungs. Three arms, three refusals of a version that has never been published, zero confabulations across the rung set.

Sources

Battery specification: prompts/react-router.md in the studio repo. Every finding above also carries its own citation.