Raias 1 a 6 · arquitetura

Agentes da Document Collection

Como sair de "um agente por documento" (157) para uma estrutura que sustenta os 157 tipos com 8 especialistas, tools reutilizáveis e skill do tipo como configuração. Ver também: as 20 skills · board da Raia 1 · guia de agentes agno · as 4 camadas de armazenamento.

📌
Decisões da reunião de 20/08 que esta arquitetura implementa: checklist sai, agente especialista entra; multi-agent com distribuidor chamando especialistas; cada documento com suas próprias tools; sandbox obrigatória antes de produção; humano no ponto em que o agente não garante precisão; pré-popular configuração com I.A a partir de exemplos.

1 · O número que dita o desenho

A Raia 1 tem 157 tipos e 26.036 documentos reais, mas 68% do volume está em 20 tipos e 88% em 40. Um agente por tipo significaria 157 prompts, 157 conjuntos de tools e 157 baterias de teste para cobrir uma cauda de 12%.

A validação, olhando documento por documento, se repete em 8 famílias. O que muda entre tipos da mesma família não é o raciocínio, é a configuração: o que aceitar, quais campos extrair, o que cruzar, quando parar e chamar humano. Então: 8 agentes especialistas + 1 roteador, e o "agente do documento" que a reunião pediu existe como skill do tipo, versionado no banco e editável pelo time no Sandbox.

2 · Componentes

APP YOUSAcliente envia no bloco liberado · Storage + evento
→
Resolução tipo → agentetabela do lado do negócio: lê document_type_id e chama o agente do grupo. Sem I.A (decisão 27/08)
→
Agente do grupo1 dos 8 · roda os checks da skill com as tools permitidas
→
Vereditook · ressalva · rejeitado + checks + campos extraídos + fontes
1 Identidade e status
2 Registro civil
3 Credencial acad./prof.
4 Narrativa e cartas
5 Mérito EB (nunca conclui)
6 Financeiro e fiscal
7 Terceiros
8 Foto/biométrico (mínimo)
Fora do validador2 frentes que os dados exigiram: câmera guiada no app (foto: 12% de aproveitamento) e agente da checklist do caso (13,5% dos docs nascem desnecessários)

3 · O skill do tipo (configuração, não código)

Uma linha por document_type. É o que o time edita no Sandbox e o que a I.A pré-popula a partir de documentos reais aprovados. O especialista lê a skill em tempo de execução.

-- tabela nova (nosso banco, sem sync com Airtable)
document_type_agent_card (
  document_type_id   int primary key references document_types(id),
  family             text not null,        -- identidade | registro_civil | credencial | narrativa
                                               -- | merito | financeiro | terceiros | foto
  accepts            jsonb not null,       -- formatos e variantes aceitas
  extract_fields     jsonb not null,       -- campos a extrair (nome, validade, ano fiscal...)
  objective_checks   jsonb not null,       -- checagens que o agente pode concluir sozinho
  cross_checks       jsonb not null,       -- cruzamentos com o dossiê (tool sql)
  translation_rule   text not null,        -- never | if_not_english | always
  escalate_when      jsonb not null,       -- condição -> papel (LA | specialist | attorney)
  resend_message_pt  text not null,        -- texto ao cliente, COMP-05 (PT claro)
  tools_allowed      text[] not null,      -- whitelist do catálogo
  version            int not null,
  updated_by         uuid, updated_at timestamptz
)

Por que tabela e não prompt solto: o prompt fica no agent_prompt_versions por família (governado no Sandbox, com diff e reverter); a skill é o dado do tipo. Trocar o texto de reenvio de um documento não deveria exigir deploy nem versionar prompt.

4 · Catálogo de tools (a reutilização que o Daniel pediu)

ToolO que fazUsada pelas famílias
doc.extract_fieldsOCR + extração estruturada dos campos declarados na skilltodas
doc.qualitylegibilidade, páginas faltando, corte, borda, rotação, página em brancotodas
case.sql_lookupconsulta o dossiê (nomes, datas, vínculos, forms já preenchidos) via espelho no backendtodas fato exato
case.timeline_checkcompara datas do documento com a linha do tempo do caso (lacunas, sobreposição)1, 3, 6
doc.expiry_checkvalidade do documento contra a data prevista do filing1, 6
translation.requestabre o fluxo de tradução com prazo próprio (10 dias) e marca o documento2, 3, 4, 6
aila.requirementsrequisitos do tipo de caso e do critério (busca semântica na base AILA)4, 5, 7
criteria.coveragequais critérios do caso já estão cobertos e por quais documentos5 nova
issuer.credential_checkconfere registro/credencial de quem emitiu o parecer7
app.request_resenddevolve ao cliente no app com o texto da skill e reabre prazotodas
human.escalateroteia para LA/Specialist/Attorney com o achado pronto e o motivotodas
i94.fetchpuxa o I-94 do CBP quando o cliente não tem o arquivo1 nova

Regra: tool nova só entra no catálogo, nunca dentro de um agente. O skill do tipo faz a whitelist. Isso mantém 12 tools para 157 tipos.

5 · Contrato do endpoint

Segue o padrão do guia de agentes agno: FastAPI no apps/agno, auth Bearer AGNO_API_KEY, espelho no backend Node com requireIdentity, case_id como escopo.

POST /documents/review
{ "case_id": 123, "document_id": 456, "document_type_id": 78,
  "files": ["storage://..."], "mode": "auto" }        // auto (chegou do app) | manual (time pediu) | dry_run (sandbox)

200
{ "verdict": "ok" | "ressalva" | "rejeitado",
  "family": "registro_civil",
  "card_version": 3,
  "checks":   [{ "id":"issuer_official", "pass":true },
               { "id":"filiation_matches_claim", "pass":false,
                 "evidence":"mãe: [NOME] no doc vs [NOME] no dossiê" }],
  "extracted": { "birth_date":"[DD/MM/AAAA]", "issuer":"..." },
  "translation_required": true,
  "next_action": { "type":"escalate", "to":"specialist", "reason":"filiacao_divergente" },
  "client_message_pt": "...",                          // só quando next_action = resend
  "sources": ["card:v3", "aila:8CFR204.5", "case:dossier"] }

Invariantes: o agente nunca grava status final de aprovação, ele propõe (ai_status/ai_output); quem muda o estado do documento é a ação humana ou a regra objetiva configurada; toda resposta carrega sources para aparecer no painel "Fontes do agente" da tela.

6 · Quando o agente decide e quando não

SituaçãoQuem resolvePor quê
Ilegível, página faltando, tipo errado, documento expiradoagente devolve ao clientechecagem objetiva, verificável, sem juízo
Documento em outro idioma quando o tipo exige traduçãoagente abre traduçãoregra do tipo, prazo próprio
Divergência de nome, data ou filiação contra o dossiêLA ou Specialistpode ser erro de digitação ou problema real de vínculo
Suficiência de conjunto (bona fide marriage, perseguição)Attorneyjuízo de prova; o agente entrega o mapa do que existe e o buraco
Mérito EB (critério regulamentar atendido?)sempre humanoo agente enquadra e cita a fonte; concluir é do advogado (COMP-06)
Overstay, antecedente, indício de fraudeManaging Attorneyred flag: escalonamento imediato, não é erro de documento

7 · Sandbox: como testar sem produção

Requisito bloqueante da reunião. O que ela precisa ter, na ordem em que dá valor:

  1. Golden set por família: 20 a 30 documentos reais já julgados pelo time (aprovados e rejeitados, com o motivo). Vem do histórico: temos 14.569 aprovados e o motivo em administrative_notes/specialist_notes.
  2. Execução em dry_run: roda a skill contra os cenários de teste sem gravar nada no caso, com custo e latência por documento.
  3. Placar que importa: taxa de auto-resolução (quanto o agente resolveu sozinho), falso aprovado (o pecado capital: aprovou o que o time rejeitou) e falso rejeitado (atrito com o cliente).
  4. Diff de versão da skill: mudou a skill, o resultado mudou para onde? Sem isso ninguém sabe se a edição melhorou.
  5. Promoção explícita: a skill vai para produção só com cenários aprovados e assinatura de quem promoveu (agent_test_runs já existe como base).

Critério de corte sugerido para ligar uma família em produção: falso aprovado = 0 no golden set, auto-resolução acima de 50% nos checks objetivos.

8 · Ordem de implantação sugerida

OndaFamíliaVolumePor que nesta ordem
1Identidade e status5.432 docsmaior volume, checagem mais objetiva, quase toda auto-resolvível: prova o padrão com risco baixo
1Foto (câmera guiada no app)549 docsnão é agente, é produto; ganho imediato de 12% para perto de 90% de aproveitamento
2Registro civil3.322 docsestreia o fluxo de tradução automática e o cruzamento de filiação
2Credencial acadêmica/profissional4.026 docsreusa extração + tradução; entra a regra de credential evaluation (R4)
3Narrativa e cartas4.071 docsexige cuidado de PII e mapa de cobertura do conjunto
3Financeiro e fiscal1.624 docsextração numérica e consistência entre anos
4Terceiros646 docso ganho real está na fila de cobrança, não na análise
4Mérito EB2.683 docsúltimo: depende de AILA madura e nunca conclui sozinho

9 · O papel do agente muda em cada raia

🧩
O padrão (agente do grupo + skill + tools) é o mesmo, mas o que o agente entrega é diferente por raia. Isso importa para o Daniel porque muda o formato de saída, a tool nova e o critério de teste.
RaiaVolumePapel do agenteSaídaTool que só ela precisa
1 · Cliente e terceiros157 tipos · 26.036 docsValidador: recebe upload e julga formaverdict + checks + campos extraídosi94.fetch, doc.quality
2 · Peças do escritório97 tipos · 7.963 docsRedator: produz rascunho e revisa contra requisitotexto com origem por afirmação + lista de lacunasdraft.compose, text.anticlone, research.library
3 · Formulários85 tipos · 7.826 docsPreenchedor: monta o form do dossiê e roda os checksform preenchido + campos sem origem marcadosform.fill, form.version_check
5 · Governo17 tipos · 904 docsLeitor de ofício: extrai prazo e cria a obrigaçãoprazo com dono + demanda nova (RFE) + avisodeadline.create, demand.open
6 · Record only16 tipos · 404 docsIndexador: transforma em conhecimento consultávelresumo indexado na base do casoreusa o pipeline de ingestão (RAG)

Consequência para o teste: o golden set da Raia 1 é "documento julgado"; na Raia 2 é "peça aprovada pelo Attorney" (avalia-se rascunho, com nota humana); na Raia 3 é "form protocolado sem rejeição"; na Raia 5 é "prazo criado corretamente a partir do ofício". Critério de promoção muda junto: na Raia 5 o pecado capital não é falso aprovado, é prazo não criado.

10 · Família × foro (vocabulário do time, 25/08)

Quatro níveis, com o nome que o time usa:

NívelO que éExemplosConsequência técnica
Raiaquem entrega ou produz o documentocliente · escritório · formulário · governo · registrodefine o papel do agente (validar, redigir, preencher, ler ofício, indexar)
Famíliao que o caso éEB · Humanitários · Family · Courtorganiza a navegação; é como o advogado pensa
Grupo de validaçãocomo o documento se confereidentidade · registro civil · mérito · narrativadefine o agente: um especialista por grupo
Documentoo tipo em siPassport · Birth certificate · I-140o skill do tipo (config), não um agente novo

O grupo existe porque 51% do volume serve todos os tipos de caso. Se o agente fosse por família, teríamos quatro validadores de certidão divergindo com o tempo. Certidão é certidão em EB, Humanitários, Family ou Court.

Court é família e o foro é outro eixo

Court entra como família porque existe caso que nasce judicial, com documentos que não existem em nenhuma outra: habeas corpus (petição, TRO, declarações, EAJA, réplica), apelação ao BIA e as motions de corte. Levantamento na base: 52 tipos e ~1.729 documentos.

Onde o Court apareceTiposDocsO que é
Raia 2 · peças do escritório451.452HC, TRO, briefs, motions, proof of service
Raia 5 · governo2130ordem do juiz, soltura (release on own recognizance)
Raia 1 · cliente2105evidência para bond: vínculo com o país, origem dos recursos
Raia 3 · formulários342EOIR-26, EOIR-26A, EOIR-27, I-290B

E o foro continua existindo como atributo do caso (forum: uscis · eoir · federal_court · consular, com histórico), porque um caso pode mudar de lugar sem mudar de família: o asilo afirmativo referido vira defensivo e segue sendo Humanitários. Os dois eixos convivem; não são a mesma pergunta.

⚠ Cuidado de nome: "Court" (família, o caso judicial) e "EOIR/Corte" (foro, onde tramita) são coisas diferentes e aparecem juntas nas telas. Nos boards isso está marcado explicitamente.

❓
Pergunta aberta para a Marcela: o escopo da família Court. A proposta atual engloba habeas corpus, apelações ao BIA e as motions de corte. Falta confirmar se as motions que hoje vivem dentro de asilo defensivo (proof of service, motion to continue) migram para Court ou continuam em Humanitários com foro EOIR. Também vale confirmar se mandamus e ações federais entram aqui.

11 · Definido na reunião de 21/08 (Daniel)

Ponto levantadoDefiniçãoOnde aparece
"Qual é o time dele? É um agente só?"A primeira coisa na ficha do agente é a identidade: solo ou membro de time, com o ID e a versão em usoaba Identidade & contrato no Studio
"Cada agente vai ter um ID, vai ser uma família... agente, documento, raia 1, família 1"ID hierárquico (agent.legal.doc.raia1.registro_civil) e vínculo tipo de documento → agente gravado no banco, não decidido pelo LLMbloco "atende estes documentos"
"O sistema roda, passa um arquivo que não validou. Como o Joel vai saber que é esse agente aqui para ele mexer?"Caminho fechado nos dois sentidos: a tela do documento diz quem analisou e abre o agente; o agente lista de onde vieram as chamadaspainel "Quem analisou" na tela do documento + "de onde vêm as chamadas"
"O birth certificate poderia chamar o marriage certificate ou não?"Não. Especialista nunca chama especialista. Outro arquivo vem por ferramenta com escopo por tipo; dependência entre documentos é coordenada por cadeiabloco "precisa de outro documento?" + cadeia do diploma
"Vai ter uma lista de agentes comuns?"Sim: biblioteca compartilhada (comparador de nomes/datas, leitor OCR, tradutor assistido) que qualquer família pode acionarcategoria Agentes comuns no catálogo e na árvore
"Qual o input e o output? Recebe mensagem, um arquivo, um conjunto?"Contrato explícito por agente: entrada (1 documento · tipo · dados do caso) e saída (resultado + checagens + campos + encaminhamento), em formato fixobloco Entrada / Saída
"Pode ter memória ou não. Chat tem que ter memória. Tem perfis de agente"Perfil declarado por agente e os recursos do AGNO ligados/desligados (ferramentas, conhecimento, saída estruturada, memória, histórico, raciocínio) com o motivo de cada umbloco "recursos do AGNO neste agente"
"Primeiro a estrutura, depois o teste"Teste derivado do contrato: casos reais no banco de teste, 10 a 40 execuções por agente variando o documentoaba Testes (próximo passo)
🧩
Ideia registrada para avaliar: no AGNO é possível embutir instrução (LLM) dentro de uma ferramenta, funcionando como um microagente. Útil para validação de imagem específica, sem criar agente novo no catálogo. Ainda não usamos.

12 · Decisões que dependem do Daniel

  1. 8 agentes de grupo + skill por tipo em vez de um agente por tipo: fecha?
  2. Skill em tabela própria (document_type_agent_card) com prompt por família no agent_prompt_versions: ou você prefere prompt por tipo também versionado?
  3. Golden set vindo do histórico (14.569 aprovados + notas de rejeição) para popular a sandbox: aprova usar dado real de caso nesse ambiente, e com qual anonimização (COMP-04)?
  4. Critério de promoção (falso aprovado = 0, auto-resolução > 50%): serve como gate automático?
  5. As duas frentes fora do validador (câmera guiada e agente da checklist do caso) entram já na onda 1? Elas atacam 22,7% de docs parados e 13,5% de docs descartados, que nenhum validador resolve.