Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when reviewing code that calls fetch(), reads from localStorage, accesses process.env, or processes form submissions without explicitly validating the incoming data shape.
.claude/skills/thedaviddias-runtime-validation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -2% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -18% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 120% | 0% |
| case-03 | ✓→✓ | = Same ✓ | -1% | 0% |
| case-04 | ✓→✓ | = Same ✓ | -20% | 0% |
TypeScript gives you confidence at compile time, but data from the network, user input, and storage arrives at runtime as raw, untyped values. A backend schema change, a misconfigured API, or malicious input can produce data that does not match your TypeScript types — and the compiler will never warn you. Runtime validation with a schema library catches these mismatches at the boundary, surfaces clear error messages, and prevents type-unsafe data from propagating through your application.
Identify all places in this code where external data enters the application (fetch calls, localStorage reads, env variable access, form submissions) and report which ones lack runtime schema validation.
Add Zod schemas to validate the external data entry points in this code. Show the schema definition, the validated type inference, and where to call .parse() or .safeParse().
Explain why TypeScript types do not protect against runtime data mismatches, how Zod bridges compile-time and runtime safety, and when to use .parse() versus .safeParse().
Review all external data entry points in this file: API calls, storage reads, environment variable access, and form handling. Flag any location where data is cast to a TypeScript type without a preceding runtime validation step.
For full implementation details, code examples, and framework-specific guidance, see references/rule.md.
Rule page: https://frontendchecklist.io/en/rules/javascript/runtime-validation
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 12,868 | 11,517 | -10% | 1 | 1 | 0% | 2,794 | 2,726 | -2% | 0 | 0 | — |
case-02 | pass→pass | 8,356 | 14,071 | +68% | 1 | 1 | 0% | 1,423 | 3,130 | +120% | 0 | 0 | — |
case-03 | pass→pass | 8,408 | 5,771 | -31% | 1 | 1 | 0% | 1,345 | 1,335 | -1% | 0 | 0 | — |
case-04 | pass→pass | 11,172 | 5,820 | -48% | 1 | 1 | 0% | 2,026 | 1,616 | -20% | 0 | 0 | — |
case-05 | fail→pass | 10,211 | 6,697 | -34% | 1 | 1 | 0% | 2,059 | 1,683 | -18% | 0 | 0 | — |
case-06 | fail→fail | 8,367 | 7,136 | -15% | 1 | 1 | 0% | 1,698 | 1,774 | +4% | 0 | 0 | — |
case-07 | pass→pass | 14,575 | 12,720 | -13% | 1 | 1 | 0% | 2,295 | 2,609 | +14% | 0 | 0 | — |
case-08 | pass→pass | 11,355 | 8,081 | -29% | 1 | 1 | 0% | 2,015 | 1,882 | -7% | 0 | 0 | — |
case-09 | pass→pass | 12,384 | 10,475 | -15% | 1 | 1 | 0% | 2,084 | 2,185 | +5% | 0 | 0 | — |
case-10 | pass→pass | 9,594 | 7,639 | -20% | 1 | 1 | 0% | 1,856 | 1,905 | +3% | 0 | 0 | — |
case-11 | pass→pass | 14,409 | 10,005 | -31% | 1 | 1 | 0% | 2,664 | 2,115 | -21% | 0 | 0 | — |
case-12 | pass→pass | 8,329 | 6,205 | -26% | 1 | 1 | 0% | 1,788 | 1,651 | -8% | 0 | 0 | — |
case-13 | pass→pass | 13,060 | 9,308 | -29% | 1 | 1 | 0% | 2,632 | 2,122 | -19% | 0 | 0 | — |
case-14 | pass→pass | 12,005 | 9,680 | -19% | 1 | 1 | 0% | 2,185 | 2,223 | +2% | 0 | 0 | — |
case-15 | pass→pass | 7,772 | 6,275 | -19% | 1 | 1 | 0% | 1,404 | 1,538 | +10% | 0 | 0 | — |
case-16 | pass→pass | 14,139 | 9,648 | -32% | 1 | 1 | 0% | 2,344 | 2,093 | -11% | 0 | 0 | — |
case-17 | pass→pass | 11,340 | 6,457 | -43% | 1 | 1 | 0% | 2,281 | 1,563 | -31% | 0 | 0 | — |
case-18 | pass→pass | 7,920 | 5,287 | -33% | 1 | 1 | 0% | 1,544 | 1,395 | -10% | 0 | 0 | — |
case-19 | pass→pass | 12,439 | 11,891 | -4% | 1 | 1 | 0% | 2,319 | 2,724 | +17% | 0 | 0 | — |
case-20 | pass→pass | 9,019 | 6,249 | -31% | 1 | 1 | 0% | 1,792 | 1,466 | -18% | 0 | 0 | — |
case-21 | pass→pass | 12,469 | 9,002 | -28% | 1 | 1 | 0% | 2,399 | 2,204 | -8% | 0 | 0 | — |
case-22 | pass→pass | 13,377 | 10,214 | -24% | 1 | 1 | 0% | 2,184 | 2,207 | +1% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.