> ## Documentation Index
> Fetch the complete documentation index at: https://docs.unifokal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Forense de documento

> O módulo doc_forensics faz a perícia do arquivo da foto do documento já capturada, sem pedir foto nova ao titular.

## Forense de documento

O módulo `doc_forensics` faz a **perícia dos arquivos** dos documentos que o fluxo já capturou: o **documento de identidade**, o **documento da empresa** e o **comprovante de endereço**. Ele **não pede nenhum arquivo novo** e **não lê o conteúdo dos documentos**: quem lê é o módulo de leitura de cada um (`cpf_ocr`, `cnpj_ocr` e `address_ocr`). Por isso ele exige no fluxo a leitura do documento de identidade ou a do documento da empresa, e cabe também num fluxo só de empresa. O que ele analisa é o que o arquivo declara sobre si mesmo (a ferramenta que o gerou, as datas, as revisões anexadas de um PDF, os metadados da imagem) e o que a compressão revela: recaptura de tela, sinais de recorte e colagem, e a presença de um manifesto declarando mídia gerada por modelo.

O que ele **não é**: documentoscopia. Marca d'água, microtexto e holograma são elementos do documento **físico**, e este módulo não os confere. Um achado forte **nunca reprova sozinho**: leva a verificação para `review` com o laudo, e o laudo diz o que cada sinal prova **e o que ele não prova**. Editar um PDF num site de juntar páginas é comum e legítimo, e aparece como contexto, não como acusação.

**Um laudo, um bloco por documento.** `data.verdict` é o veredito do laudo inteiro: `review` se qualquer documento pediu revisão, `indeterminate` se nenhum pediu e algum não pôde ser periciado, `clean` se todos saíram limpos. As chaves do topo (`bands`, `evidence`, `findings`, `regions`, `media_type`, `measurable_facets`) são as do documento que decidiu o veredito, e `data.documents[]` traz o mesmo laudo para cada documento periciado, com `document` igual a `identity`, `company` ou `address`. As bandas são `a`, `b` e `c`, da mais forte para o contexto.

```
// check_details do doc_forensics: o laudo, não um score solto
{ "module": "doc_forensics", "passed": false, "outcome": "failed", "score": 35,
  "data": { "verdict": "review",
            "media_type": "pdf",
            "bands": { "a": [], "b": ["pdf_incremental_unexplained", "pdf_dates_differ"],
                       "c": ["pdf_reexport_tool"] },
            "evidence": ["pdf_incremental_unexplained", "pdf_dates_differ", "pdf_reexport_tool"],
            "findings": [ { "tag": "pdf_incremental_unexplained", "band": "b",
                            "proves": "…", "not_proves": "…" } ],
            "regions": [],
            "measurable_facets": 5,
            "documents": [
              { "document": "identity", "verdict": "clean", "media_type": "image",
                "bands": { "a": [], "b": [], "c": [] }, "evidence": [], "findings": [],
                "regions": [], "measurable_facets": 6 },
              { "document": "company", "verdict": "review", "media_type": "pdf",
                "bands": { "a": [], "b": ["pdf_incremental_unexplained", "pdf_dates_differ"],
                           "c": ["pdf_reexport_tool"] },
                "evidence": ["pdf_incremental_unexplained", "pdf_dates_differ", "pdf_reexport_tool"],
                "findings": [ { "tag": "pdf_incremental_unexplained", "band": "b",
                                "proves": "…", "not_proves": "…" } ],
                "regions": [], "measurable_facets": 5 },
              { "document": "address", "verdict": "clean", "media_type": "pdf",
                "bands": { "a": [], "b": [], "c": [] }, "evidence": [], "findings": [],
                "regions": [], "measurable_facets": 5 } ],
            "evidence_expired": false } }
```

`regions` vem em coordenadas **normalizadas** (0 a 1), para você desenhar sobre a mesma imagem na sua tela de revisão. `measurable_facets` é o que separa **limpo** de **não consegui medir**: arquivo sem metadado nenhum não é arquivo inocente nem culpado, é arquivo sem evidência, e o laudo diz isso. Os blocos brutos de calibração e a régua de cada achado não viajam no webhook de propósito: o laudo diz o que foi achado e o que isso prova, não onde fica o nosso corte.

**Prazo do laudo.** As medidas do arquivo ficam disponíveis por 180 dias contados da verificação. Depois disso, a consulta pelo painel, a reemissão e a exportação trazem o `verdict`, o `media_type` e as `measurable_facets`, com `bands`, `evidence`, `findings`, `regions` e `documents` vazios e `evidence_expired: true` (antes do prazo ele vem `false`, sempre presente). Lista vazia com `evidence_expired: true` quer dizer que o laudo saiu no prazo, nunca que o arquivo estava limpo. Guarde no recebimento do webhook o que precisar guardar por mais tempo.

**Origem assinada.** Quando o arquivo carrega um manifesto de proveniência assinada, no padrão aberto C2PA (versão 2.4 da especificação), o laudo diz o estado dele em `evidence` e em `findings`: `c2pa_trusted_origin` (o manifesto está íntegro e a assinatura encadeia até a lista oficial de confiança da C2PA), `c2pa_signature_invalid` (o arquivo mudou depois de assinado, ou a assinatura não confere) e `c2pa_manifest_present` (há manifesto, sem cadeia até a lista oficial, e ele vale como ausente). Origem confiável prova de onde o **arquivo** veio, não que o documento fotografado é verdadeiro; e recorte, redimensionamento e reenvio por aplicativo também quebram a assinatura, por isso o estado é evidência para quem revisa, nunca uma acusação. O manifesto que declara mídia gerada ou editada por modelo generativo sai como `c2pa_ai_generated_declared` ou `c2pa_ai_composite_declared`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.