All checks were successful
CD / build (pull_request) Successful in 7s
Consulta Receita em cadeia de fallback e repasse da ANP (ISO-8859-1); autoavaliacao de 17 itens por programa+loja+CNPJ em jsonb; motor de score com regra de gargalo e tres numeros, espelho do frontend. 21 testes novos. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4.0 KiB
4.0 KiB
Changelog — documents
Formato baseado em Keep a Changelog; versionamento semântico.
[1.2.0] - 2026-08-11
Added
- Radar de Conformidade (
/radar/*): validação de conformidade por CNPJ.GET /radar/company/:cnpjconsulta a Receita Federal em cadeia de fallback (BrasilAPI → minhareceita.org → CNPJá Open) e normaliza para um shape único — o QSA é reduzido à contagem (LGPD).GET /radar/anp/:cnpjrepassa a API de revendedores da ANP (sem CORS na origem) com decode ISO-8859-1; falha degrada paraavailable: false, nunca erro.GET/PUT /radar/assessments/:cnpjguarda a autoavaliação dos 17 itens por (programa, loja, CNPJ) e devolve o diagnóstico recalculado: score declarado, score verificado, índice de confiança, faixa A–E, teto por gargalo (documento impeditivo), pendências ordenadas por ganho e calendário de vencimentos. Motor espelho do frontend (regras R1–R7 da metodologia). Migrationradar_assessmentcom up/down simétricos e idempotentes.
[1.1.0] - 2026-08-07
Added
- Análise por LLM (
AnthropicAnalyzer, Onda 1.1 do PLANO-DOCUMENTOS-IA): comANTHROPIC_API_KEY, oPOST /documents/analyzeextrai tipo, datas e número do PDF/imagem via modelo multimodal (default Haiku, configurável porDOCUMENTS_LLM_MODEL), com confiança por campo (fieldConfidences), citação do trecho de origem (evidence) e dupla passada em datas — divergência entre as duas leituras zera o campo e devolvedateMismatch(data errada é pior que campo vazio). Warnings novos no contrato:dateMismatch,lowConfidence,llmUnavailable. - Fallback gracioso: erro de API, arquivo >10MB ou mime não suportado caem na heurística por nome
de arquivo com
llmUnavailable— a análise nunca falha por causa do LLM. Sem a chave, o comportamento v1 fica intacto (factory emdocument.module.ts). - Prazo de renovação dinâmico por órgão (Onda 1.2 do plano de IA). Cada renovação que sai do
órgão vira um ciclo observado (
renewal_cycle: protocolo → emissão), gravado automaticamente no save que zera um protocolo; ciclos implausíveis (negativos ou > 2 anos) são descartados com log. GET /compliance/lead-times?programId: mediana, p90 e prazo efetivo por órgão e por tipo. Régua:effectiveLeadDays = max(catálogo, mediana + 15)com amostra ≥ 3 — o catálogo é piso legal (os 120 dias da LO nunca encolhem), a estatística só estica quando o órgão está lento.GET /compliance/upcomingeGET /alerts/previewpassam a carregar os campos aditivoseffectiveLeadDayseobserved{count, medianDays}; o degrauleadda régua de alertas dispara pelo prazo dinâmico ("a SEMAD está levando 140 dias — comece agora").- Seed de demonstração
src/scripts/seed-demo-cycles.ts(determinístico) para o LAB.
[1.0.0] - 2026-08-07
Added
- Catálogo legal de postos com 15 obrigações semeadas por migration (Resolução ANP 948/2023,
CONAMA 273/2000, Portaria INMETRO 227/2022, IN IBAMA 22/2021, NRs 1/7/20/23) e variação por UF
(
document_type_uf_override; exemplos: AVCB SP 36 meses, GO 12; LO CETESB 60 meses/120 dias). - Documentos da loja com trilha de versões (renovação nunca sobrescreve) e upload de PDF em bucket GCS privado com URL assinada de vida curta.
- Status derivado na leitura (
valid/expiringSoon/inRenewal/expired) com a regra do protocolo tempestivo: renovação protocolada mantém o documento operante. - Resumo de conformidade com score 0–100 ponderado por criticidade (interdição 3, multa 2, administrativa 1) e contagem de pendências críticas.
- Análise de upload plugável (
DocumentAnalyzer): v1 heurística por keywords do catálogo; OCR/LLM entra no mesmo ponto na v1.1. - Régua de alertas (lead do tipo/30/15/7/1/vencido) com
GET /alerts/preview; envio real (WhatsApp/e-mail) é v1.2. - Infra completa: Dockerfile, k8s/hml, cd.yml via Cloud Build — mesmo desenho do
routines.