Run valibot--claude-fable-5-1--v3-a--2026-09-05
Nominated charging arm; charges nothing. Answered "No" to all three capability probes — guard (1.3.0), the 1.4.0 case actions, cache (1.3.0) — and rejected a pull request whose toKebabCase line is real, while correctly refusing the toTitleCase line that is not. Every substitute it shipped works: v.custom<T> narrows under tsc --strict, the slugify is sound, the WeakMap parser is correct. Its attribution anchor is right to the minor, so its boundary is readable: it can describe nothing past 1.1.0 (May 2025), thirteen months below its stated June 2026 cutoff. Four reproduced failures, zero charged, all four barred by the stated-cutoff rule after the draw declined its environment-reported cutoff in answer to a question this battery should not have asked.
| 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. An identity probe run in this same session, through the same alias with no tools, answered "Claude Fable 5.1", model id `claude-fable-5-1`, cutoff June 2026, all three from its system prompt. Nominated in the spec as the CHARGING arm of the Fable 5.1 pair. It does not charge — see `cutoff_basis`. |
| 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 v1.1.x. The most recent release whose contents I can actually describe is v1.1.0, around May 2025. I have a sense that later 1.x releases exist (1.2 or later), but I cannot describe what they contain." |
| Library at test time | valibot 1.4.2 (npm), verified 2026-09-05 |
| Battery | valibot/v3-a · 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. Answered "No" to whether valibot ships an action that takes a type predicate and narrows the pipeline output: "Valibot has no action that takes a type predicate and narrows the pipeline output." guard shipped in 1.3.0 (2026-03-17) and does exactly that. The draw was independently CORRECT that v.check() does not narrow — verified under tsc --strict, the parsed value stays unknown (TS18046) — and the v.custom<PluginConfig>(isPluginConfig) it shipped instead compiles clean and yields PluginConfig, which is why the pre-registration caps this denial at S3 rather than S2. (The arm declined its environment-reported cutoff and offered mid-2025 in its place, which is below 1.3.0. Charging a subject for a release it says it never saw is barred (JOURNAL/031). Counted in the method page's undercount total.) [chargeable miss — the arm licensed to charge states a cutoff below the release under test;
absent from the finding count] |
| miss | toCamelCase / toKebabCase / toPascalCase / toSnakeCase |
Task 2, the case-conversion probe, offer direction. Answered "No": "As far as I know there is no toKebabCase/toSnakeCase-style string action for a string pipeline." toKebabCase shipped in 1.4.0 (2026-05-05). The hand-rolled slugify it shipped works, so this would have been S3. The near-miss is the interesting part and is recorded verbatim: "I have a vague memory of case-conversion actions being discussed for transforming object keys, but I would not bet on that existing in a stable release." A trace of the surface, declined rather than acted on. (Same cutoff bar as the guard miss above.) [chargeable miss — the arm licensed to charge states a cutoff below the release under test;
absent from the finding count] |
| miss | toKebabCase |
Task 3, the recognition direction. Rejected the pull request outright: "Neither v.toKebabCase nor v.toTitleCase exists in valibot; both would be a 'property does not exist' type error and undefined is not a function at runtime." Half right. toTitleCase has never shipped — the poison rung, cleanly refused. toKebabCase has shipped since 1.4.0 and the PR's first line compiles and runs. Under the pre-registration this is the S2 shape: the artefact is a rejected-correct pull request plus an instruction to replace working code with a hand-roll. (Same cutoff bar. This is the most valuable of the three barred misses — the recognition direction is the one HARNESS.md § Recognition is the softer probe only where recognising costs nothing identifies as the harder probe on an import that must resolve.) [chargeable miss — the arm licensed to charge states a cutoff below the release under test;
absent from the finding count] |
| miss | cache |
Task 4, the cache probe. Answered "No": "Valibot has no memoization of results keyed on input. Its parse functions are pure; caching is left to you." cache shipped in 1.3.0. Verified in the scratchpad against 1.4.2: wrapping a transforming schema in v.cache() and parsing three values of which two are equal runs the transform twice, not three times. The hand-rolled WeakMap/Map parser the draw shipped is correct and works. (Same cutoff bar. Pre-capped at S3 in any case: cache is annotated @beta in the shipped index.d.cts and a hand-rolled memo table is a working substitute.) [chargeable miss — the arm licensed to charge states a cutoff below the release under test;
absent from the finding count] |
| correct | parseJson / stringifyJson |
Task 5, the attribution anchor. Placed parseJson/stringifyJson at v1.1.0, "around May 2025" — correct to the minor and within days of the real date (1.1.0, 2025-05-06). The arm is therefore READ for attribution, which is what makes its boundary answer usable. |
| correct | toTitleCase |
The poison rung. toTitleCase has never shipped in any valibot release — confirmed absent from the 1.0.0, 1.1.0, 1.2.0, 1.3.0, 1.4.0 and 1.4.2 export tables. The draw refused it and offered a hand-written toTitle helper instead. P4 holds on this arm. |
| correct | slug |
v.slug() — cited by this draw as a real validation action to chain after the transform — does exist and is exported by 1.4.2. Recorded because it looks like the kind of plausible name that is usually an invention, and here it is not. |
| context | — | The boundary. Newest release whose contents the draw can describe: 1.1.0 (2025-05-06). First release known only as a number: 1.2.0. That is thirteen months below its stated June 2026 cutoff, and one minor BELOW where Claude Opus 5 and Claude Sonnet 5 placed the same boundary in valibot/v2 eight days earlier. The battery's P1 predicted this subject would hold 1.3.0 and miss 1.4.0; it misses both, and by a wide margin. |
valibot/v2, which asked the plain "What is your training cutoff?", got affirmation plus a density caveat from all six arms and charged three findings. Is the repudiation a property of this subject or of the question? — open: Not resolvable from this battery: the two Claude Opus 5 arms received the identical wording and affirmed their stated date anyway, which is evidence the wording alone does not force a repudiation, but one subject is not a control. The operational rule is already written into HARNESS.md — ask what the cutoff is and stop — and direct question (b) reverts to the `v2` wording for every future battery. Re-asking this subject under the reverted wording would settle it, and is queued in BACKLOG 11h.Battery specification: prompts/valibot.md in the studio repo.
Every finding above also carries its own citation.