Split from #1295, which was rescoped once the real blockers were measured with deno why npm:zod@3.25.76.
#1295 lands what is achievable now: the AI/MCP peer cluster onto npm Zod 4, workspace Zod in the root catalog, and a guard test that fails CI on a split graph. This issue is the part that cannot be done yet.
Why it is blocked
@ag-ui/core@0.0.52 hard-depends on zod: ^3.22.4 — no || ^4, so it is unsatisfiable by Zod 4 at any version we can choose.
jsr:@olli/kvdex@3.6.7 also materialises Zod 3, and 3.6.7 is the latest release.
Two possible routes, neither acceptable for 0.0.5:
- TanStack AI 0.39 → 0.43 coordinated cluster upgrade. Currently pulls a canary AG-UI build — that trades a type-identity split for a pre-release dependency, which is a worse position for a release cut.
- kvdex: replace, fork, remove, or an explicitly accepted compatibility override.
Watch signals
Acceptance
Why it matters (from #1278): a schema built with one Zod instance is a different module identity from another — instanceof fails, brand checks fail, structurally identical types stop being assignable. That is the class that produced #1250 and #1249.
Split from #1295, which was rescoped once the real blockers were measured with
deno why npm:zod@3.25.76.#1295 lands what is achievable now: the AI/MCP peer cluster onto npm Zod 4, workspace Zod in the root catalog, and a guard test that fails CI on a split graph. This issue is the part that cannot be done yet.
Why it is blocked
@ag-ui/core@0.0.52hard-depends onzod: ^3.22.4— no|| ^4, so it is unsatisfiable by Zod 4 at any version we can choose.jsr:@olli/kvdex@3.6.7also materialises Zod 3, and 3.6.7 is the latest release.Two possible routes, neither acceptable for 0.0.5:
Watch signals
@ag-ui/corepublishes a stable release acceptingzod ^4Acceptance
deno infoshows exactly one Zod instance across the whole graphnpm:zod@3absent fromdeno.lockWhy it matters (from #1278): a schema built with one Zod instance is a different module identity from another —
instanceoffails, brand checks fail, structurally identical types stop being assignable. That is the class that produced #1250 and #1249.