Episode 2 — React Frontend Architecture NextJS / 2.15 — Advanced Forms and Validation
2.15.c — Zod schema validation: type-safe strategy
Learning outcomes
- Model user input with
z.inputvs transformedz.outputawareness. - Use
safeParseat boundaries; map errors to UI fields. - Compose schemas for maintainability.
Baseline schema
import { z } from "zod";
export const signupSchema = z
.object({
email: z.string().email("Invalid email"),
password: z.string().min(8, "At least 8 characters"),
confirm: z.string(),
})
.refine((data) => data.password === data.confirm, {
message: "Passwords must match",
path: ["confirm"],
});
export type SignupInput = z.input<typeof signupSchema>;
export type SignupOutput = z.output<typeof signupSchema>;
safeParse vs parse
parsethrows—OK internally when failure is exceptional.safeParsereturns{ success, data | error }—ideal for HTTP handlers and UI mapping.
Resolver integration (React Hook Form)
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";
useForm<SignupInput>({
resolver: zodResolver(signupSchema),
defaultValues: { email: "", password: "", confirm: "" },
});
Server-only constraints
Add checks that must not be client-bypassable:
- uniqueness of email
- permission to modify resource
- anti-abuse rate limits
Use .superRefine async carefully; never trust client-only async validation for security.
Coercion pitfalls
z.coerce.number() can surprise with empty strings depending on configuration. Prefer explicit transforms with tests.
Appendix — Scenario bank (basic → advanced)
Each scenario is a mini design review: what users see, what breaks, what you change, what you say in an interview. Cover five per day and narrate fixes out loud.
ZOD-001 — Zod schemas scenario #1
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
13 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-002 — Zod schemas scenario #2
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
26 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-003 — Zod schemas scenario #3
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
39 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-004 — Zod schemas scenario #4
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
52 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-005 — Zod schemas scenario #5
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
65 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-006 — Zod schemas scenario #6
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
78 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-007 — Zod schemas scenario #7
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
91 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-008 — Zod schemas scenario #8
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
104 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-009 — Zod schemas scenario #9
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
117 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-010 — Zod schemas scenario #10
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
10 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-011 — Zod schemas scenario #11
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
23 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-012 — Zod schemas scenario #12
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
36 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-013 — Zod schemas scenario #13
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
49 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-014 — Zod schemas scenario #14
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
62 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-015 — Zod schemas scenario #15
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
75 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-016 — Zod schemas scenario #16
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
88 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-017 — Zod schemas scenario #17
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
101 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-018 — Zod schemas scenario #18
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
114 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-019 — Zod schemas scenario #19
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
7 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-020 — Zod schemas scenario #20
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
20 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-021 — Zod schemas scenario #21
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
33 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-022 — Zod schemas scenario #22
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
46 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-023 — Zod schemas scenario #23
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
59 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-024 — Zod schemas scenario #24
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
72 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-025 — Zod schemas scenario #25
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
85 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-026 — Zod schemas scenario #26
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
98 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-027 — Zod schemas scenario #27
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
111 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-028 — Zod schemas scenario #28
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
4 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-029 — Zod schemas scenario #29
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
17 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-030 — Zod schemas scenario #30
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
30 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-031 — Zod schemas scenario #31
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
43 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-032 — Zod schemas scenario #32
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
56 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-033 — Zod schemas scenario #33
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
69 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-034 — Zod schemas scenario #34
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
82 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-035 — Zod schemas scenario #35
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
95 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-036 — Zod schemas scenario #36
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
108 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-037 — Zod schemas scenario #37
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
1 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-038 — Zod schemas scenario #38
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
14 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-039 — Zod schemas scenario #39
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
27 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-040 — Zod schemas scenario #40
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
40 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-041 — Zod schemas scenario #41
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
53 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-042 — Zod schemas scenario #42
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
66 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-043 — Zod schemas scenario #43
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
79 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-044 — Zod schemas scenario #44
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
92 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-045 — Zod schemas scenario #45
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
105 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-046 — Zod schemas scenario #46
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
118 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-047 — Zod schemas scenario #47
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
11 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-048 — Zod schemas scenario #48
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
24 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-049 — Zod schemas scenario #49
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
37 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-050 — Zod schemas scenario #50
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
50 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-051 — Zod schemas scenario #51
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
63 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-052 — Zod schemas scenario #52
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
76 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-053 — Zod schemas scenario #53
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
89 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-054 — Zod schemas scenario #54
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
102 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-055 — Zod schemas scenario #55
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
115 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-056 — Zod schemas scenario #56
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
8 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-057 — Zod schemas scenario #57
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
21 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-058 — Zod schemas scenario #58
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
34 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-059 — Zod schemas scenario #59
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
47 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-060 — Zod schemas scenario #60
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
60 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-061 — Zod schemas scenario #61
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
73 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-062 — Zod schemas scenario #62
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
86 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-063 — Zod schemas scenario #63
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
99 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-064 — Zod schemas scenario #64
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
112 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-065 — Zod schemas scenario #65
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
5 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-066 — Zod schemas scenario #66
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
18 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-067 — Zod schemas scenario #67
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
31 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-068 — Zod schemas scenario #68
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
44 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-069 — Zod schemas scenario #69
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
57 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-070 — Zod schemas scenario #70
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
70 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-071 — Zod schemas scenario #71
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
83 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-072 — Zod schemas scenario #72
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
96 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-073 — Zod schemas scenario #73
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
109 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-074 — Zod schemas scenario #74
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
2 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-075 — Zod schemas scenario #75
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
15 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-076 — Zod schemas scenario #76
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
28 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-077 — Zod schemas scenario #77
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
41 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-078 — Zod schemas scenario #78
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
54 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-079 — Zod schemas scenario #79
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
67 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-080 — Zod schemas scenario #80
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
80 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-081 — Zod schemas scenario #81
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
93 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-082 — Zod schemas scenario #82
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
106 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-083 — Zod schemas scenario #83
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
119 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-084 — Zod schemas scenario #84
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
12 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-085 — Zod schemas scenario #85
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
25 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-086 — Zod schemas scenario #86
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
38 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-087 — Zod schemas scenario #87
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
51 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-088 — Zod schemas scenario #88
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
64 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-089 — Zod schemas scenario #89
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
77 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-090 — Zod schemas scenario #90
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
90 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-091 — Zod schemas scenario #91
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
103 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-092 — Zod schemas scenario #92
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
116 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-093 — Zod schemas scenario #93
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
9 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-094 — Zod schemas scenario #94
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
22 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-095 — Zod schemas scenario #95
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
35 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-096 — Zod schemas scenario #96
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
48 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-097 — Zod schemas scenario #97
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
61 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-098 — Zod schemas scenario #98
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
74 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-099 — Zod schemas scenario #99
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
87 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-100 — Zod schemas scenario #100
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
100 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-101 — Zod schemas scenario #101
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
113 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-102 — Zod schemas scenario #102
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
6 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-103 — Zod schemas scenario #103
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
19 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-104 — Zod schemas scenario #104
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
32 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-105 — Zod schemas scenario #105
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
45 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-106 — Zod schemas scenario #106
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
58 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-107 — Zod schemas scenario #107
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
71 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-108 — Zod schemas scenario #108
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
84 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-109 — Zod schemas scenario #109
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
97 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-110 — Zod schemas scenario #110
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
110 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-111 — Zod schemas scenario #111
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
3 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-112 — Zod schemas scenario #112
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
16 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-113 — Zod schemas scenario #113
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
29 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-114 — Zod schemas scenario #114
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
42 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-115 — Zod schemas scenario #115
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
55 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-116 — Zod schemas scenario #116
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
68 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-117 — Zod schemas scenario #117
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
81 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-118 — Zod schemas scenario #118
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
94 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-119 — Zod schemas scenario #119
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
107 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-120 — Zod schemas scenario #120
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
0 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-121 — Zod schemas scenario #121
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
13 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-122 — Zod schemas scenario #122
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
26 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-123 — Zod schemas scenario #123
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
39 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-124 — Zod schemas scenario #124
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
52 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-125 — Zod schemas scenario #125
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
65 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-126 — Zod schemas scenario #126
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
78 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-127 — Zod schemas scenario #127
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
91 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-128 — Zod schemas scenario #128
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
104 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-129 — Zod schemas scenario #129
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
117 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-130 — Zod schemas scenario #130
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
10 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-131 — Zod schemas scenario #131
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
23 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-132 — Zod schemas scenario #132
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
36 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-133 — Zod schemas scenario #133
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
49 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-134 — Zod schemas scenario #134
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
62 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-135 — Zod schemas scenario #135
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
75 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-136 — Zod schemas scenario #136
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
88 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-137 — Zod schemas scenario #137
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
101 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-138 — Zod schemas scenario #138
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
114 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-139 — Zod schemas scenario #139
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
7 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-140 — Zod schemas scenario #140
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
20 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-141 — Zod schemas scenario #141
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
33 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-142 — Zod schemas scenario #142
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
46 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-143 — Zod schemas scenario #143
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
59 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-144 — Zod schemas scenario #144
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
72 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-145 — Zod schemas scenario #145
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
85 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-146 — Zod schemas scenario #146
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
98 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-147 — Zod schemas scenario #147
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
111 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-148 — Zod schemas scenario #148
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
4 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-149 — Zod schemas scenario #149
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
17 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-150 — Zod schemas scenario #150
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
30 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-151 — Zod schemas scenario #151
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
43 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-152 — Zod schemas scenario #152
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
56 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Internationalized messages hard-coded in schema without i18n layer.
- Primary remediation: Separate
inputvsoutputtypes; document transforms in UI copy. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-153 — Zod schemas scenario #153
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
69 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class:
.parsethrows in UI paths instead ofsafeParsecausing uncaught errors. - Primary remediation: Use
safeParseat boundaries; map issues to field errors deterministically. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-154 — Zod schemas scenario #154
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
82 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Coerce misuse turning empty strings into unintended numbers.
- Primary remediation: Split schemas:
addressSchema,accountSchema, compose with.merge/.and. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-155 — Zod schemas scenario #155
- Level: Advanced
- User-visible symptom: validation flicker, double submit, or lost input after
95 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Refinements on wrong step (client vs server) leading to duplicated rules drifting.
- Primary remediation: Be explicit with
z.coercevsz.stringtransforms; test edge cases. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-156 — Zod schemas scenario #156
- Level: Advanced+
- User-visible symptom: validation flicker, double submit, or lost input after
108 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Async refinements without debounce causing race conditions on fast typing.
- Primary remediation: Use
discriminatedUnionwith a literal discriminator; render variants explicitly. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-157 — Zod schemas scenario #157
- Level: Beginner
- User-visible symptom: validation flicker, double submit, or lost input after
1 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Transforms hiding invalid states from users until too late in the pipeline.
- Primary remediation: Share one schema module; add server-only checks via
.superRefinewhere needed. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-158 — Zod schemas scenario #158
- Level: Beginner+
- User-visible symptom: validation flicker, double submit, or lost input after
14 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Schema too large to reuse between client and server without modularization.
- Primary remediation: Normalize
fieldErrorspaths to RHF nested naming conventions. - Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.
ZOD-159 — Zod schemas scenario #159
- Level: Intermediate
- User-visible symptom: validation flicker, double submit, or lost input after
27 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Discriminated union field not narrowed; impossible states rendered.
- Primary remediation: Debounce async checks; cancel stale requests with AbortController.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Server validation always wins over client Zod for security.
ZOD-160 — Zod schemas scenario #160
- Level: Intermediate+
- User-visible symptom: validation flicker, double submit, or lost input after
40 msasync checks. - Form architecture symptom: state thrashes, unnecessary renders, or impossible-to-test validation scattered in JSX.
- Root cause class: Error map shape mismatched to UI expectations for nested arrays.
- Primary remediation: Pipe Zod messages through i18n keys; keep schema mostly structural.
- Accessibility check: associate errors with fields via
aria-describedby/aria-invalid; do not rely on color alone. - Interview one-liner: Zod encodes invariants; UI encodes presentation—keep both but avoid duplication drift.