AI coding assistants write library code from memory. When a library ships a big release that renames or removes things, the assistant keeps writing the old version. It reads fine & it doesn't build.
SDKProof measures how often that happens. It gives a model real coding jobs for one library, then compiles every answer against the real installed package with tsc, the TypeScript compiler. A task passes only if it compiles — no AI judges another AI.
This page is Zod, the schema library. Ten ordinary jobs — describe an object, parse it, pull the type back out — one shot each, no docs, no retries.
All ten compiled. The model wrote Zod 4's shapes, not Zod 3's, including the two renames it had the best excuse to get wrong.
This measures the model, not Zod.
Zod 4 folded the three separate error options into one called error, and made z.record() take a key type as well as a value type. Both are valid Zod 3 on the left and errors against the installed Zod 4.
The model wrote the right-hand column, unprompted. The prompts name the job, never the option names.
fails against zod 4.4.3
// custom message for a missing field
z.string({
required_error: "Name is required",
});
// a map of string to number
z.record(z.number());
// an IP address
z.string().ip();Every line here was correct in Zod 3. Against 4.4.3 the option name, the argument count and the method are all wrong.
zod 4.4.3
// one unified error option
z.string({
error: "Name is required",
});
// key type, then value type
z.record(z.string(), z.number());
// the version-specific checks
z.string().ipv4();tsc --noEmit — 0 errors
Reading the errors. TS2769 means no version of that call accepts those options. TS2554 means the wrong number of arguments. TS2339 means the method isn't there any more. All three are the compiler's own words, from a real run against zod 4.4.3.
The same ten tasks on the previous model, Opus 4.8, scored 90 — 9 of 10 compiled. The one miss was the error option: it wrote required_error, the Zod 3 name, and the compiler rejected it.
Opus 5 was trained later and writes error. Nothing about Zod changed between the two runs. The library sat still and the score moved, which is the clearest way to say what this number is: it's a reading of the model's memory, taken against a fixed package.
Expect it to move the other way too. When Zod ships its next release that removes or renames something, the model's memory goes stale again and the score drops until models retrain.
Marked ones are the version-specific probes — tasks written to catch a Zod 3 answer.
Ten realistic Zod tasks, written by claude-opus-5, each dropped into a small project with zod 4.4.3 actually installed, then run through tsc --noEmit. A task passes only if it compiles.
claude-opus-5. Another model will score differently — Opus 4.8 scored 90 on this same set.tsc, the TypeScript compiler, checks that the API exists and the types line up. It never runs the code, so nothing here says a schema validates the right things.claude-opus-5 knows current Zod. It says nothing about whether Zod is well designed.This run was rebuilt on 6 August 2026 from the committed render of the original 26 July run, after a smoke test overwrote the result file. Every task passed in that run, so the counts are exact rather than reconstructed.
v9 renamed the main hook. The model wrote v8 every time.
Breaks the moment a callback gets an explicit type.
Queries are clean. It still builds the client the v6 way.
Every v4 to v5 rename written unprompted.
Name any TypeScript package & I'll run it. Or do it yourself — it's all open source.
There's no npm package. Clone the repo, point it at a library, run it. The compiler is the judge.