Data field validation
data specs/data/validation.kmd
Regras canônicas de validação de campo na Koder Stack — required, format/pattern, length/range, check-digit (CPF/CNPJ), cross-field, e o contrato de onde a validação roda (client + server, server é autoridade). Define como uma falha de validação vira erro de classe `VL` e popula o array `fields` do envelope (`specs/errors/model.kmd`). Pareada com `specs/data/field-types.kmd` (tipos) e `specs/data/masks.kmd` (apresentação).
Quando esta spec se aplica
Triggers primários
- Especificar a validação de um campo de dado em qualquer surface Koder
Todos os triggers
- Validar input de usuário (form, API, CLI) em componente Koder
- Definir regra required/format/length/check-digit de um campo
- Emitir um erro de validação (classe VL) com detalhe por-campo
Corpo da especificação
Spec — Data field validation
Facet Data + Interface. Define as regras que um valor deve satisfazer. O tipo/storage é
field-types.kmd; a máscara émasks.kmd; a falha é um erro de classeVL(errors/taxonomy.kmd) carregado pelo arrayfieldsdo envelope (errors/model.kmd).
Applicability
Toda validação de valor de campo em componente Koder — formulários (UI),
payloads de API (backend), argumentos de CLI. Aplica-se a input de usuário e
a dados que cruzam um boundary. Não se aplica a invariantes internas de
código (isso é assert/panic de code/error-handling.kmd §R2).
R1 — Tipos de regra (enum)
| Regra | Significado | Param |
|---|---|---|
required | Valor presente e não-vazio | — |
format | Casa um pattern (regex / format de field-types.kmd §R4) | pattern |
length | Comprimento de string em [min,max] | min, max |
range | Valor numérico/data em [min,max] | min, max |
enum | Pertence a um conjunto fechado | values |
check-digit | Dígitos verificadores válidos (CPF, CNPJ) | algoritmo |
cross-field | Coerência entre campos (end ≥ start, confirm == senha) | expr |
unique | Único no escopo (server-side; respeita multi-tenancy) | escopo |
Regras compõem: um campo cpf required valida presença e check-digit.
R2 — Onde a validação roda (client + server)
- Server é a autoridade. Toda regra deve ser revalidada no servidor, independentemente da validação de cliente. Cliente nunca é confiável.
- Cliente valida para UX — feedback imediato (ícone ✓/✗ de
text-fields.kmd/phone-input.kmd §R4), antes do submit. É espelho da regra do servidor, não substituto. - Mesma regra, uma fonte — a regra é declarada uma vez (schema JSON
Schema draft 2020-12,
extract-RFC-001) e consumida por client e server; não duplicar a lógica em dois lugares com risco de divergir (policies/reuse-first.kmd). Okoder_kitexpõe o validador headless.
R3 — Regras de preenchimento por tipo semântico
Validação default dos tipos de field-types.kmd §R2 (produto pode tighten,
nunca loosen):
| Tipo | Regras default |
|---|---|
email | required? + format (RFC 5321) |
phone | format E.164 válido p/ país (libphonenumber) |
cpf | length=11 dígitos + check-digit (mód-11) |
cnpj | length=14 dígitos + check-digit (mód-11) |
cep | length=8 dígitos + format |
money | range ≥ 0 (salvo regra) + 2 casas decimais p/ BRL/USD |
date/datetime | format ISO + range plausível (não ano 0000) |
url | format absoluta + scheme HTTPS (policies/security.kmd) |
CPF/CNPJ check-digit é obrigatório — validar só o formato (
000.000.000-00) aceita111.111.111-11e afins. O dígito verificador (mód-11) é a regra real.
R4 — Contrato de erro de validação
Falha de validação é um erro de classe VL (errors/taxonomy.kmd §R1),
severity: error, retryable: false com recovery: "fix_field:<name>"
(taxonomy.kmd §R4 conditional). O envelope (errors/model.kmd) deve
popular o array fields:
{
"error_id": "KFORM-VL-422-001",
"error_category": "VL",
"severity": "error",
"retryable": false,
"recovery": "fix_field:cpf",
"fields": [
{"field": "cpf", "rule": "check-digit", "message": "CPF inválido."},
{"field": "email", "rule": "required", "message": "Informe o e-mail."}
]
}
- Um envelope
VLsemfieldsé violação de contrato (model.kmd §R3.6/ auditmodel.kmd §R7.4). messagepor campo é humanizada (user-facing-messages.kmd); oruleé o identificador máquina-legível (de R1).- Validação reporta todos os campos inválidos de uma vez (não falha no primeiro) — UX de formulário.
R5 — Audit determinístico
data-validation-audit.sh (advisory), via /k-housekeep:
- Endpoint que aceita CPF/CNPJ sem validar check-digit (só formato) → error.
- Regra de validação só no cliente, ausente no servidor → error (R2.1).
- Lógica de validação duplicada client/server a partir de fontes distintas (em vez de schema único) → warning (R2.3).
- Erro
VLemitido sem arrayfields→ warning (crossmodel.kmd §R7.4). urlaceitandohttp://(não-HTTPS) → error (policies/security.kmd).
Não-escopo
- Tipo/storage do valor —
specs/data/field-types.kmd. - Máscara de apresentação —
specs/data/masks.kmd. - Texto das mensagens —
specs/errors/user-facing-messages.kmd. - Linguagem de schema — JSON Schema draft 2020-12 (extract-RFC-001).
- Unicidade/isolamento cross-tenant —
specs/multi-tenancy/contract.kmd.
Cross-link
specs/errors/taxonomy.kmd— classeVL, severidade, retryability.specs/errors/model.kmd— arrayfieldsdo envelope (§R2,§R3.6).specs/components/text-fields.kmd— estados visuais de validade.
Referências
specs/data/field-types.kmdspecs/data/masks.kmdspecs/errors/model.kmdspecs/errors/taxonomy.kmdspecs/errors/user-facing-messages.kmdrfcs/extract-RFC-001-foundations.kmd