Data field types
data specs/data/field-types.kmd
Catálogo canônico dos tipos de dado de campo na Koder Stack — o conjunto fechado de tipos primitivos e semânticos (string, text, int, decimal, bool, date, datetime, uuid, enum, email, phone, money, cpf, cnpj, cep, url, json, binary-ref) com sua representação canônica de armazenamento, faixa/limite default e regras de preenchimento. Base para `specs/data/masks.kmd` (apresentação) e `specs/data/validation.kmd` (regras). Não redefine conceitos já-com-dono: config é `specs/koder-toml/`, schema-language é JSON Schema (extract-RFC-001), naming de coluna é `specs/code/naming.kmd`, isolamento é `specs/multi-tenancy/contract.kmd`.
When this spec applies
Primary triggers
- Definir o tipo de um campo de dado novo em qualquer surface Koder
All triggers
- Modelar um campo de dado (schema, form, API, storage) em componente Koder
- Escolher o tipo canônico + representação de armazenamento de um valor
- Decidir limite/faixa default de um campo
Specification body
Spec — Data field types
Facet Data do Koder Design. Define o que um valor é e como ele é armazenado. A máscara de apresentação é
specs/data/masks.kmd; as regras (required/format/length) sãospecs/data/validation.kmd; a linguagem de schema (JSON Schema draft 2020-12) é a derfcs/extract-RFC-001-foundations.kmd— esta spec mapeia seus tipos a essa linguagem, não a substitui.
Applicability
Todo campo de dado que um componente Koder modela, persiste, valida, exibe
ou trafega — schemas de DB, payloads de API, campos de formulário,
parâmetros de config-de-dado. Não se aplica a config de módulo
(koder.toml → specs/koder-toml/) nem a env vars (policies/environments.kmd).
R1 — Tipos primitivos
Representação canônica de armazenamento (o wire/DB), independente de apresentação:
| Tipo | Armazenamento canônico | Notas |
|---|---|---|
string | UTF-8, single-line, ≤ 255 chars default | Sem \n; trim de borda no input |
text | UTF-8, multi-line, sem limite default | \n permitido |
int | inteiro com sinal 64-bit | Faixa explícita quando menor |
decimal | string decimal de precisão fixa | Nunca float p/ valores exatos (ver money) |
bool | true/false | Ausência ≠ false salvo regra explícita |
date | ISO 8601 date YYYY-MM-DD | Sem timezone |
datetime | ISO 8601 com timezone 2026-04-17T15:42:30-03:00 | Sempre com offset; armazenar UTC, exibir local |
uuid | UUIDv7 (time-ordered) canônico lowercase | UUIDv7 default p/ chaves (índice sequencial) |
enum | string de conjunto fechado | Valores em snake_case; documentar o conjunto |
json | objeto JSON validado por schema | Schema declarado (extract-RFC-001) |
binary-ref | referência ao object store, não os bytes | Bytes vão no plano de objetos (stack-RFC-006), nunca inline |
R2 — Tipos semânticos (BR + comuns)
Tipos com regra de domínio. Armazenamento normalizado (sem máscara); a
apresentação fica em masks.kmd; a validação em validation.kmd.
| Tipo | Armazenamento canônico | Apresentação | Validação |
|---|---|---|---|
email | lowercase, normalizado RFC 5321 | como digitado | validation.kmd |
phone | ISO E.164 (+5511912345678) | locale (masks.kmd) | libphonenumber (specs/components/phone-input.kmd) |
money | decimal minor units + currency ISO 4217 | masks.kmd (R$ 1.234,56) | ≥ 0 salvo regra |
cpf | 11 dígitos, sem máscara (12345678901) | 123.456.789-01 (masks.kmd) | dígitos verificadores (validation.kmd) |
cnpj | 14 dígitos, sem máscara (12345678000190) | 12.345.678/0001-90 | dígitos verificadores |
cep | 8 dígitos, sem máscara (01310100) | 01310-100 | formato + (opcional) lookup |
url | absoluta, normalizada, HTTPS only (policies/security.kmd) | como armazenada | scheme/host |
percent | decimal 0–100 (ou 0–1, declarar qual) | 12,5% | faixa |
Regra de ouro de armazenamento: documento/identificador brasileiro é
armazenado como dígitos puros (a máscara é só apresentação). Isso evita
o bug clássico de comparar 123.456.789-01 ≠ 12345678901.
R3 — Regras de preenchimento
- Normalizar no input, não no output — strip de máscara, trim, lowercase
(onde aplicável) acontecem uma vez, ao entrar; o storage guarda a
forma canônica. A máscara é reaplicada só na exibição (
masks.kmd). - Nullable é explícito — um campo é obrigatório ou opcional por decisão
declarada (
validation.kmd §required), nunca por acidente de schema. - Default declarado — se há valor default, ele é parte do schema, não do código de UI.
- Limite default —
string≤ 255;textsem limite; faixas numéricas explícitas quando não-64-bit. Ultrapassar é erro de classeVL(taxonomy.kmd §R1). - Sufixo de unidade no nome — campos com unidade carregam a unidade no
nome (
timeout_ms,size_bytes,price_cents) — alinhar comspecs/code/naming.kmd. Esta spec não redefine naming; cross-link. - Tempo é UTC no storage —
datetimesempre armazenado em UTC com offset preservado da origem quando relevante; exibição converte ao local.
R4 — Mapeamento para JSON Schema
A linguagem de schema canônica é JSON Schema draft 2020-12
(rfcs/extract-RFC-001-foundations.kmd). Esta tabela mapeia os tipos Koder
às construções JSON Schema (não inventa schema-language nova):
| Tipo Koder | JSON Schema |
|---|---|
string | {"type":"string","maxLength":255} |
int | {"type":"integer"} |
decimal/money | {"type":"string","pattern":"^-?\\d+(\\.\\d+)?$"} |
date | {"type":"string","format":"date"} |
datetime | {"type":"string","format":"date-time"} |
uuid | {"type":"string","format":"uuid"} |
email | {"type":"string","format":"email"} |
enum | {"enum":[…]} |
cpf/cnpj/cep | {"type":"string","pattern":"^\\d{11}$"} (etc.) |
R5 — Audit determinístico
data-field-types-audit.sh (advisory), via /k-housekeep:
- Campo
cpf/cnpj/cep/phonecujo storage contém caractere de máscara (.,-,/,(,),espaço) → error (deve ser dígitos puros / E.164). - Valor monetário em
float/double→ error (usardecimal). datetimesem timezone offset → warning.- UUID que não seja v7 em campo de chave nova → warning (índice não-sequencial).
binary-refcom bytes inline em vez de referência ao object store → error.
Não-escopo
- Naming de campo/coluna —
specs/code/naming.kmd(snake_case, sufixos). - Linguagem de schema — JSON Schema draft 2020-12 (extract-RFC-001).
- Config de módulo —
specs/koder-toml/. - Storage backend / object plane —
rfcs/stack-RFC-001-kdb-as-unified-data-plane.kmd(dados),rfcs/stack-RFC-006-object-storage-plane-and-trust-tiering.kmd(objetos),specs/multi-tenancy/contract.kmd(isolamento).
Cross-link
specs/data/masks.kmd— apresentação dos tipos semânticos.specs/data/validation.kmd— regras (required/format/length/check-digit).specs/components/phone-input.kmd— caso aplicado dephone.specs/errors/taxonomy.kmd— erros de preenchimento são classeVL.
References
specs/data/masks.kmdspecs/data/validation.kmdspecs/data/README.mdspecs/code/naming.kmdspecs/multi-tenancy/contract.kmdrfcs/extract-RFC-001-foundations.kmd