Run valibot--claude-fable-5-1--v3-b--2026-09-05
Blind twin, charges nothing by construction. Agrees with v3-a on every task: three denials, a pull request rejected in both halves where only one half deserved it, a correct anchor, and a boundary at 1.1.0 / 1.2.0. It denies guard by name, which its twin does not, and it repudiates its stated cutoff in the same terms. Zero spread between the two draws on the boundary question.
| Subject | Claude Fable 5.1 claude-fable-5-1, Anthropic |
|---|---|
| Invoked as | Agent tool, model alias "fable"; prompt sent verbatim from prompts/sent/valibot-v3.txt, byte-identical to the file sent to `v3-a` and drawn blind and concurrently with it. Blind twin of `v3-a`, born duplicated; charges nothing by the duplicate rule regardless of anything else. |
| Cutoff the model states | not stated |
| Newest valibot release it could place | 1.1.0 · 2025-05-06 |
| Oldest valibot release it could not place | 1.2.0 · 2025-11-24 (so this run brackets the subject’s boundary to 2025-05-06 – 2025-11-24) |
| In its own words | "The latest version I know of is roughly 1.1.x (May 2025). That is also the most recent release whose contents I can actually describe. I have a vague sense that later 1.x patch/minor releases exist, but I cannot say what is in them." |
| Library at test time | valibot 1.4.2 (npm), verified 2026-09-05 |
| Battery | valibot/v3-b · 5 tasks, 3 direct questions · probe window 1.3.0 to 1.4.0 |
| Tool uses during test | 0 (a run with any tool use is void — we measure training knowledge, not retrieval) |
| Tested | 2026-09-05 |
| Findings | 0, of which 0 chargeable |
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.
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.
| Kind | API | Note |
|---|---|---|
| miss | guard |
Task 1, the guard probe. "No", with the negative stated by name: "I am not aware of a v.guard()-style action that infers its output type from a type predicate." guard shipped in 1.3.0 and is exactly that. The draw named the API it was denying, which is the sharpest form this miss takes across the five arms. Its v.check() analysis is correct and its v.custom<PluginConfig> substitute compiles and narrows. (Blind twin of v3-a; a -b draw never charges. Its stated cutoff would have barred it in any case.) [chargeable miss — a replicate, a duplicated arm’s second draw or a below-floor control charges nothing;
absent from the finding count] |
| miss | toCamelCase / toKebabCase / toPascalCase / toSnakeCase |
Task 2, the case-conversion probe, offer direction. "No", with the same near-miss its twin recorded, worded more strongly: "I have a weak, unreliable recollection of toCamelCase/toSnakeCase being discussed or added in a 1.x release; I would not write code against that without checking." Both are real, both shipped at 1.4.0, and both arms of this pair had a trace of them and declined to act on it. (Blind twin; and the stated-cutoff bar applies to this pair.) [chargeable miss — a replicate, a duplicated arm’s second draw or a below-floor control charges nothing;
absent from the finding count] |
| miss | toKebabCase |
Task 3, the recognition direction. Rejected the pull request: "I do not believe v.toKebabCase() or v.toTitleCase() exist in valibot ... These look like plausible-sounding names extrapolated from v.toLowerCase()/v.toUpperCase()." The extrapolation account is right about one of the two and wrong about the other: toKebabCase is real at 1.4.0+. It then added a review note advising the colleague to check whether their CI type-checks at all, because a passing build would be inexplicable — an artefact worth recording, since the build would in fact pass. (Blind twin; and the stated-cutoff bar applies to this pair.) [chargeable miss — a replicate, a duplicated arm’s second draw or a below-floor control charges nothing;
absent from the finding count] |
| miss | cache |
Task 4, the cache probe. "No": "I am not aware of any built-in memoization in valibot. Schemas are plain objects with a ~run/_run method and no cache." cache shipped in 1.3.0 and wraps a schema by exactly that route. The memoized parser it wrote instead is correct, including its own caveats about identity keying and shared output objects — which happen to be the same caveats the shipped cache documents. (Blind twin; and the stated-cutoff bar applies to this pair.) [chargeable miss — a replicate, a duplicated arm’s second draw or a below-floor control charges nothing;
absent from the finding count] |
| correct | parseJson / stringifyJson |
Task 5, the attribution anchor. parseJson/stringifyJson at v1.1.0, "around May 2025" — correct to the minor and to within days. The arm is read for attribution. |
| correct | toTitleCase |
The poison rung. Refused toTitleCase, which has never shipped. P4 holds on this arm. |
| context | — | The boundary, and the reason this pair is worth more than its zero findings: both blind draws land on 1.1.0 / 1.2.0, identically. identical_prompt spread of zero on the quantity that usually moves. Combined with the twin, Claude Fable 5.1's valibot boundary is the most stable measurement in this library's file, and it sits thirteen months below the subject's stated cutoff. |
Battery specification: prompts/valibot.md in the studio repo.
Every finding above also carries its own citation.