Partly: in 5 runs, Claude Opus 5's zod attribution reaches 4.1.0 (2025-08-23), inside zod 4, and stops there — zod was at 4.5.4 when this index last verified against it (2026-09-06). That is ~9 months below the training cutoff the subject stated in those runs (2026-05). 9 findings are currently charged against Claude Opus 5 on zod (3x S1 breaks-build, 5x S2 silently-wrong, 1x S4 wrong-metadata), each reproduced in a published run and checked against zod's own release notes. Read the boundary precisely: it is the newest release whose contents the model can correctly attribute to that release, not the newest zod feature it can use. Past it a model often writes working code with a newer API while naming the wrong release for it.
Answer class inside, decided by one rule applied to every page
of this kind: every measured boundary is at or above the first release of the major named in the question. Every figure below is read from
the dataset at build time; nothing on this page is written by hand.
| Battery | Newest release it can place | Oldest it cannot | Lag vs stated cutoff |
|---|---|---|---|
| v2 2026-08-29 | 4.1.0 2025-08-23 |
4.2.0 2025-12-15 |
~9 months |
| v2r-a 2026-09-01 | 4.1.0 2025-08-23 |
4.2.0 2025-12-15 |
~9 months |
| v2r-b 2026-09-01 | 4.1.0 2025-08-23 |
4.2.0 2025-12-15 |
~9 months |
| v3-a 2026-09-02 | 4.1.0 2025-08-23 |
4.2.0 2025-12-15 |
~9 months |
| v3-b 2026-09-02 | 4.1.0 2025-08-23 |
4.2.0 2025-12-15 |
~9 months |
5 measurements of this pair, all giving the same boundary. Of those, 2 came from the same stored prompt file, sent concurrently and blind: they agreed exactly.
zod published 6 minor or major releases in the twelve months before this model’s stated cutoff, which is the scale a spread should be read against.
“Chargeable” means the change was published before this model’s own stated cutoff, so it had the opportunity to know it.
| Severity | Belief | Changed in | Chargeable | Proof |
|---|---|---|---|---|
| S1breaks-build | .extend() overwrite on a refined schema throws; .safeExtend() unknown.extend() / .safeExtend() |
4.1.0 2025-08-23 |
yes | run · source |
| S1breaks-build | .pick() on a refined object schema throws.pick() / .omit() |
4.3.0 2025-12-31 |
yes | run · source |
| S1breaks-build | States that .pick() and .omit() on a refined object schema succeed at load and silently drop the refinement, where 4.3.0 made them throw.pick() / .omit() on a schema with refinements |
4.3.0 2025-12-31 |
yes | run · source |
| S2silently-wrong | declares an unnecessary dependency for JSON Schema inputz.fromJSONSchema() |
4.2.0 2025-12-15 |
yes | run · source |
| S2silently-wrong | hand-rolls exclusive-or, states Zod cannot express itz.xor() |
4.2.0 2025-12-15 |
yes | run · source |
| S2silently-wrong | Does not reach .exactOptional() for strict optionality, and offers a constructor it cannot confirm exists plus a type-system cast instead.exactOptional() |
4.3.0 2025-12-31 |
yes | run · source |
| S2silently-wrong | misses z.httpUrl(), prescribes a manual normalization workaroundz.httpUrl() |
4.4.0 2026-04-29 |
yes | run · source |
| S2silently-wrong | States that "https:/example.com" passes http/https URL validation, and prescribes the hand-rolled normalization 4.4.0 removed the need forz.httpUrl() |
4.4.0 2026-04-29 |
yes | run · source |
| S4wrong-metadata | correct code, disbelievedz.undefined() object properties |
4.4.0 2026-04-29 |
yes | run · source |
The zod correction pack states what is true now for each corrected fact, with a primary-source citation, as markdown you can paste into a rules file (raw). What a correction pack measurably changed when one was tested — a pre-registered run on zod — is on the benchmark page, including where it changed nothing.
All of them at once: Which Claude model knows zod 4 best?
Other subjects on zod:
Claude Opus 5 on the other libraries: