# Coerência cadastral

<https://unifokal.com/docs/modulos/coerencia-cadastral>

## Coerência cadastral

O módulo `coerencia_cadastral` responde uma pergunta que hoje você teria que responder sozinho: **o que o documento diz bate com o que o cadastro oficial diz?** Ele compara o **nome** e o **nascimento** lidos do documento pelo `cpf_ocr` com os que a **Validação CPF - Receita e Óbito** (`cpf_receita`) do mesmo flow já trouxe, e devolve o veredito **campo a campo**. Ele também responde se o cadastro registra o titular como **falecido**, que é a única situação da Receita que contradiz a prova de vida que acabou de passar.

**Ele não faz consulta nenhuma.** Não há chamada nova, não há fonte nova e não há passo novo no widget: o módulo lê o que o seu flow já comprou. É por isso que ele custa uma fração do tier que o alimenta, e é por isso que ele **exige** a Validação CPF - Receita e Óbito no mesmo flow, além de **Verificação de Identidade + Face Match + Liveness** (o dado comparado vem do documento apresentado por quem está vivo na frente da câmera).

**O que você recebe é a resposta, não o dado.** O payload deste módulo não carrega nome, data nem situação cadastral: carrega `match`, `mismatch` ou `not_checked` por campo. O dado oficial continua chegando pelo check do tier que você comprou, no lugar de sempre. Se o que você quer é só a conferência, este módulo é a forma de tê-la sem espalhar cadastro de terceiro pelo seu sistema.

! **Este módulo nunca reprova ninguém.** Divergência de nome tem causa legítima e comum no Brasil: casamento, divórcio e, desde a Lei 14.382/2022, mudança de prenome extrajudicial na maioridade. Divergência de nascimento costuma ser leitura de documento antigo. O módulo fica **fora** do pass/fail da verificação: ele informa, e quem decide o que fazer é você.

**O que ele não confere, por decisão nossa:** **filiação** (nome da mãe é fator de autenticação em banco e telecom, e devolver o veredito sobre ela municia engenharia social contra o próprio titular), **gênero** (a divergência entre o sexo do documento e o gênero do cadastro é, na prática, um detector de transição de gênero, e a LGPD veda tratamento para fins discriminatórios no art. 6, IX), **endereço** e **contatos** (seriam revenda de bureau, que os nossos Termos vedam). Não é limitação técnica: os campos existem na resposta que o tier já traz. É escopo, e ele não vai mudar sem revisão jurídica.

Sobre o **nome**: o comparador é o mesmo do screening de PEP, então grafia diferente já casa (SOUZA e SOUSA, LUIZ e LUIS). Entre "bate" e "não bate" existe uma **faixa em que não afirmamos nada**, e ela é intencional: é onde caem o nome de casada, o nome social e o sobrenome composto lido pela metade. Nessa faixa o campo sai `not_checked`, e o `name_score` contínuo vai no payload para você aplicar a sua própria régua se quiser.

**Cobrança:** o módulo só é cobrado quando entrega veredito. Se a fonte cadastral não respondeu, se o portão de identidade bloqueou a consulta ou se o tier comprado não trouxe nenhum campo comparável, o resultado é `indeterminate` e o módulo **sai do preço** daquela verificação. `fields_checked` diz sobre quantos campos a resposta se sustenta e `coverage` diz quais tiers a sustentaram.

```
// coerencia_cadastral: documento e cadastro batem
{ "module": "coerencia_cadastral", "passed": true, "outcome": "approved", "score": 100,
  "data": { "verdict": "coherent",
            "fields": { "name": "match", "birth_date": "match", "alive": "match" },
            "fields_checked": 3, "name_score": 0.98,
            "coverage": ["cpf_receita"],
            "calibration": { "name_match_min": 0.85, "name_mismatch_max": 0.4 },
            "reason": null } }

// coerencia_cadastral: o nome do documento não bate com o do cadastro
// a verificação NÃO é reprovada por isso: o veredito é informativo.
{ "module": "coerencia_cadastral", "passed": false, "outcome": "failed", "score": 40,
  "data": { "verdict": "divergent",
            "fields": { "name": "mismatch", "birth_date": "match", "alive": "match" },
            "fields_checked": 3, "name_score": 0.21,
            "coverage": ["cpf_receita"],
            "calibration": { "name_match_min": 0.85, "name_mismatch_max": 0.4 },
            "reason": null } }

// coerencia_cadastral: não houve campo comparável -> NÃO cobrado
{ "module": "coerencia_cadastral", "passed": null, "outcome": "pending", "score": 0,
  "data": { "verdict": "indeterminate", "fields": null, "fields_checked": 0,
            "name_score": null, "coverage": [], "reason": "no_comparable_field" } }
```

No resumo `checks` o módulo aparece com vocabulário próprio: `coherent`, `divergent` ou `indeterminate`. Em sandbox nada é comparado e o desfecho vem do sufixo do documento: `02` devolve o caminho divergente, `01` o indeterminado (não cobrado) e `33` um coerente com cobertura parcial, que é o que você vê quando o tier comprado traz o nome mas não o nascimento.
