O CLAUDE.md estabelece "Zod em todo input externo (request body, webhook payload, env)". O diretório lib/channels/ inteiro não usa Zod:
$ grep -rln 'from "zod"' lib/channels/
(vazio)
$ grep -rln 'from "zod"' lib/api/ # controle positivo: o grep está vivo
lib/api/client.ts
Os payloads de webhook são lidos por type-guards manuais (obj/str em lib/channels/zernio/webhook.ts:100-102, e equivalentes no canal meta). Funciona, mas cada campo novo depende de alguém lembrar de checar o tipo, e a divergência entre o que o parser aceita e o que o resto do código assume não tem nada que a acuse.
Achado na triagem do PR #228. Não é regressão dele — é ausência repo-wide nesta família, que o PR apenas herdou ao seguir o padrão do canal existente.
Escopo
Os três parsers de webhook de canal (waha, meta, zernio). O ganho real não é o Zod em si: é o payload passar a ter um schema declarado, em vez de a forma esperada estar espalhada em type-guards.
O
CLAUDE.mdestabelece "Zod em todo input externo (request body, webhook payload, env)". O diretóriolib/channels/inteiro não usa Zod:Os payloads de webhook são lidos por type-guards manuais (
obj/stremlib/channels/zernio/webhook.ts:100-102, e equivalentes no canalmeta). Funciona, mas cada campo novo depende de alguém lembrar de checar o tipo, e a divergência entre o que o parser aceita e o que o resto do código assume não tem nada que a acuse.Achado na triagem do PR #228. Não é regressão dele — é ausência repo-wide nesta família, que o PR apenas herdou ao seguir o padrão do canal existente.
Escopo
Os três parsers de webhook de canal (
waha,meta,zernio). O ganho real não é o Zod em si: é o payload passar a ter um schema declarado, em vez de a forma esperada estar espalhada em type-guards.