What Claude Fable 5.1 gets right about better-auth — battery v7-d, tested 2026-09-06

Run better-auth--claude-fable-5-1--v7-d--2026-09-06 · self-test: the subject is the operator

Summary

The blind twin, and it agreed with v7-c on every graded answer: task 1 "yes", task 5 updatedAt, both 1.6.0 options denied, the control held, the floor passed. That agreement is what makes the Fable 5.1 freshness belief a measurement rather than a coin - and it is the direct contrast with the Opus 5 pair, which split on the same question from the same prompt. Two details are its own. It required storeOTP: 'plain' for its resend workaround, deriving the exact constraint resendStrategy encodes without knowing the option exists. And it stated the twoFactorPage history inversion flatly rather than as a hedged memory. It charges nothing, by the duplicated-arm rule.

SubjectClaude Fable 5.1 claude-fable-5-1, Anthropic
Invoked asAgent tool, model alias "fable"; the blind twin of v7-c, identical stored prompt, no tools available to the subject
Cutoff the model states2026-06
Newest better-auth release it could place1.3.0 · 2025-07-19 (~11 month lag)
Oldest better-auth release it could not place1.4.0 · 2025-11-22 (so this run brackets the subject’s boundary to 2025-07-19 – 2025-11-22)
In its own words"The latest version I'm aware of existing is somewhere in the 1.4–1.5 range. The most recent release whose contents I can actually describe with reasonable confidence is 1.3 (around July 2025). I have partial, low-confidence recollection of 1.4 (roughly November 2025)."
Library at test timebetter-auth 1.7.3 (npm), verified 2026-09-06
Batterybetter-auth/v7-d · 7 tasks, 3 direct questions · probe window 1.6.0 to 1.7.3
Tool uses during test0 (a run with any tool use is void — we measure training knowledge, not retrieval)
Tested2026-09-06
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
misssession.freshAge (measured from session.createdAt) Task 1: "yes", reproducing its twin exactly, and consistent with its own task 5(a) answer of updatedAt. At task 3 it stated the belief outright: "the timestamp it is compared against is fixed in the framework's freshSessionMiddleware — it uses updatedAt, i.e. the product team's semantics. Because updateAge refreshes updatedAt on activity, an active user is effectively always 'fresh' under the default." That is an accurate description of better-auth up to 1.5.0. Both Fable 5.1 draws agree here, which is what turns the belief into a measurement; the two Opus 5 draws split on the same question. (Charged on the -c twin as F1. The -d draw of a duplicated arm carries the failure and no F-number.) [chargeable miss — a replicate, a duplicated arm’s second draw or a below-floor control charges nothing; charged as a finding on better-auth--claude-fable-5-1--v7-c--2026-09-06]
missemailOTP({ resendStrategy }) Task 2: "no", with the absence claimed explicitly ("Nothing among them says 'reuse the outstanding code on resend'") after listing the 1.5.0 option set from memory. Shipped the same generateOTP reuse cache as its twin, but read the code back out of better-auth's own verification row through internalAdapter.findVerificationValue rather than out of Redis - and, unlike its twin, correctly required storeOTP: 'plain' for it to be possible at all, noting that "'hashed' makes this impossible". That is the constraint resendStrategy encodes, derived correctly by a draw that did not know the option exists. (Charged on the -c twin as F2.) [chargeable miss — a replicate, a duplicated arm’s second draw or a below-floor control charges nothing; charged as a finding on better-auth--claude-fable-5-1--v7-c--2026-09-06]
misstwoFactorClient({ twoFactorPage }) Task 6: "no", with the same inverted history as v7-c and v7-a: "Early 0.x releases accepted twoFactorClient({ twoFactorPage: '/two-factor' }); that string option was replaced by the onTwoFactorRedirect callback and is what the current release supports." This draw states it flatly rather than hedging it. Three of the battery's six draws name twoFactorPage correctly and place it on the wrong side of its own introduction. (Charged on the -c twin as F3.) [chargeable miss — a replicate, a duplicated arm’s second draw or a below-floor control charges nothing; charged as a finding on better-auth--claude-fable-5-1--v7-c--2026-09-06]
correctsession.freshAge anchor option (does not exist) Task 3, the control: "no". Correct, and it went further than any other arm in shipping the alternative - a MEASURE_FROM constant driving both freshAge and a hooks.before middleware, so that the choice reads as a setting in the reader's own config. It named the weak spot itself: "The path list is the honest weak spot — you have to keep it in sync with which endpoints the framework guards with freshSessionMiddleware."
correctcustomSession Task 4, the floor probe. customSession with the client plugin for typing, plus the cookieCache interaction and the session.additionalFields alternative for a stored rather than computed value. Passed.
contextstateless sessions Task 7: "I don't know of a release that does this, and I'd be suspicious of any answer that names one." Then the same three near neighbours the other draws listed, and a note that later 1.x releases extended cookie caching "I have a vague memory of a strategy/refresh option for the cache in the 1.4–1.5 era" - the right window for the wrong feature. Stateless session management is 1.4.0. Belief data, never scored.

Sources

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