feat: Onda 1 de IA — extração por LLM e prazo de renovação dinâmico (1.1.0) #1

Merged
breno.pires merged 3 commits from feat/ai-onda-1 into master 2026-08-07 05:56:01 +00:00
Owner

Implementa a Onda 1 do PLANO-DOCUMENTOS-IA.md (raiz do LAB).

Análise por LLM (AnthropicAnalyzer)

  • Com ANTHROPIC_API_KEY, o POST /documents/analyze extrai tipo/datas/número do PDF ou imagem via modelo multimodal (default Haiku, configurável), com confiança por campo (fieldConfidences) e citação do trecho de origem (evidence).
  • Dupla passada em datas: duas leituras independentes; divergência zera o campo e devolve dateMismatch — data errada é pior que campo vazio.
  • Fallback gracioso: sem chave, erro de API, arquivo >10MB ou mime não suportado caem na heurística com llmUnavailable. A análise nunca falha por causa do LLM; sem a chave o comportamento 1.0.0 fica intacto.
  • O frontend (PR clubpetro-frontend#33) já renderiza confiança/evidência com o mesmo contrato.

Prazo de renovação dinâmico por órgão

  • Cada renovação concluída vira um ciclo observado (renewal_cycle: protocolo → emissão), gravado automaticamente na transação do save; ciclos implausíveis descartados com log.
  • GET /compliance/lead-times: mediana/p90/prazo efetivo por órgão e tipo. Régua: effectiveLeadDays = max(catálogo, mediana+15) com amostra ≥3, resolução tipo → órgão → catálogo — o catálogo é piso legal (os 120 dias da LO nunca encolhem).
  • upcoming/alerts/preview carregam os campos aditivos effectiveLeadDays e observed; o degrau lead dos alertas dispara pelo prazo dinâmico ("a SEMAD está levando 140 dias — comece agora").
  • Seed determinístico de ciclos para demonstração no LAB.

Verificação

  • yarn build limpo; yarn test: 8 suites, 62 testes verdes (38 base + 8 do analyzer + 16 de lead times), cobertura acima dos mínimos.
  • Contratos 100% aditivos — nenhum shape existente mudou.

🤖 Generated with Claude Code

Implementa a Onda 1 do `PLANO-DOCUMENTOS-IA.md` (raiz do LAB). ## Análise por LLM (`AnthropicAnalyzer`) - Com `ANTHROPIC_API_KEY`, o `POST /documents/analyze` extrai tipo/datas/número do PDF ou imagem via modelo multimodal (default Haiku, configurável), com **confiança por campo** (`fieldConfidences`) e **citação do trecho de origem** (`evidence`). - **Dupla passada em datas**: duas leituras independentes; divergência zera o campo e devolve `dateMismatch` — data errada é pior que campo vazio. - Fallback gracioso: sem chave, erro de API, arquivo >10MB ou mime não suportado caem na heurística com `llmUnavailable`. A análise nunca falha por causa do LLM; sem a chave o comportamento 1.0.0 fica intacto. - O frontend (PR clubpetro-frontend#33) já renderiza confiança/evidência com o mesmo contrato. ## Prazo de renovação dinâmico por órgão - Cada renovação concluída vira um ciclo observado (`renewal_cycle`: protocolo → emissão), gravado automaticamente na transação do save; ciclos implausíveis descartados com log. - `GET /compliance/lead-times`: mediana/p90/prazo efetivo por órgão e tipo. Régua: `effectiveLeadDays = max(catálogo, mediana+15)` com amostra ≥3, resolução tipo → órgão → catálogo — **o catálogo é piso legal** (os 120 dias da LO nunca encolhem). - `upcoming`/`alerts/preview` carregam os campos aditivos `effectiveLeadDays` e `observed`; o degrau `lead` dos alertas dispara pelo prazo dinâmico ("a SEMAD está levando 140 dias — comece agora"). - Seed determinístico de ciclos para demonstração no LAB. ## Verificação - `yarn build` limpo; `yarn test`: 8 suites, **62 testes verdes** (38 base + 8 do analyzer + 16 de lead times), cobertura acima dos mínimos. - Contratos 100% aditivos — nenhum shape existente mudou. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
breno.pires added 3 commits 2026-08-07 05:45:54 +00:00
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cada renovacao que sai do orgao vira ciclo observado (protocolo -> emissao);
a mediana por orgao/tipo estica o prazo de inicio de renovacao quando o orgao
esta comprovadamente mais lento que o catalogo. O catalogo e piso legal: os
120 dias da LO nunca encolhem. Campos aditivos effectiveLeadDays/observed no
upcoming e nos alertas; GET /compliance/lead-times; seed deterministico.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Merge branch 'feat/dynamic-lead-times' into feat/ai-onda-1
All checks were successful
CD / build (pull_request) Successful in 7s
c717fdb81e
# Conflicts:
#	AI-HISTORY.md
#	CHANGELOG.md
breno.pires merged commit 8cd9669717 into master 2026-08-07 05:56:01 +00:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Clubpetro-Lab/documents#1
No description provided.