Documento de concepcao
Como concebi o Observatorio OGE
Esta pagina explica, de forma didatica e tecnicamente honesta, a construcao desta prova de conceito para triagem segura de manifestacoes, revisao humana, coletas autorizadas e leitura gerencial de dados.
1. Visao geral
Concebi a POC como um observatorio operacional, e nao como um canal oficial de ouvidoria. O objetivo e demonstrar como uma equipe pode transformar manifestacoes em sinais de gestao sem delegar uma decisao administrativa final a um modelo de IA.
O sistema recebe manifestacoes manuais ou oriundas de fontes publicas previamente autorizadas. Em seguida, protege o texto, classifica quando houver condicoes para isso, encaminha casos incertos para pessoas e apresenta apenas dados agregados no observatorio.
2. Decisoes de produto
Privacidade antes da IA
O texto passa pela anonimização antes de chegar ao Gemini. A interface trabalha somente com texto anonimizado e a persistencia atual deixa o texto bruto como nulo.
IA nao encerra o processo
Baixa confianca, falha do provedor, JSON invalido ou catalogo indisponivel resultam em em_revisao, nao em uma classificacao forçada.
Catalogo controla a resposta
Area, assunto, tipo e urgencia sao validados contra os valores ativos. A resposta do modelo nao e aceita apenas por parecer bem formada.
Indicadores sem exposicao
O dashboard recebe contagens e series agregadas. A proveniencia informa filtros e fontes, sem devolver o conteudo de manifestacoes.
3. Arquitetura em camadas
A arquitetura separa experiencia, contrato HTTP, regra de negocio e integracoes externas. Essa divisao permite trocar uma fonte, o modelo de IA ou a interface sem reescrever a regra de triagem.
Navegador
|
| cookie HttpOnly + requisicoes relativas
v
Next.js 16 (frontend e BFF /api/proxy)
|
| Authorization: Bearer JWT
v
FastAPI (rotas, Pydantic, regras, RBAC)
| | |
v v v
PostgreSQL Presidio + spaCy Gemini
^
|
Worker Python + Playwright <--- execucoes de coleta persistidasEm producao, API e worker sao processos separados que compartilham o banco. A API cria uma execucao e responde rapidamente; o worker reivindica a pendencia com bloqueio transacional, executa a coleta e atualiza estado, contadores e logs.
4. Concepcao do frontend
O frontend e um monorepo npm com Next.js 16, React 19 e um pacote compartilhado de componentes shadcn/Base UI. Escolhi o App Router para combinar paginas publicas, layouts protegidos e rotas de servidor no mesmo projeto.
- Rotas: login e esta documentacao sao publicos; observatorio, triagem, manifestacoes, coletas e administracao usam o layout protegido.
- Estado remoto: TanStack Query busca, armazena em cache e invalida dados relacionados. Uma revisao invalida manifestacoes e indicadores; uma limpeza administrativa faz o mesmo.
- Formularios: React Hook Form coleta os valores e Zod valida no cliente antes da chamada. A API continua sendo a fonte final de validacao.
- Adaptacao de contrato:
adaptManifestation,adaptCollectioneadaptIndicatorsvalidam e normalizam a resposta para componentes tipados. - Experiencia: ha estados de carregamento, vazio e erro, feedback de processamento longo, cancelamento apenas da espera e layouts de tabela/cartao para desktop e celular.
5. Backend e contrato de API
O backend usa Python 3.12+, FastAPI, Pydantic, SQLAlchemy 2 e Alembic. SQLite acelera a demonstracao local; PostgreSQL 16+ e a escolha de producao para concorrencia do worker, persistencia e operacao duravel. Todas as chaves sao UUID e os timestamps sao UTC.
Os schemas Pydantic aceitam aliases em ingles e portugues onde a integracao precisa deles. Por exemplo, a criacao aceita texto outext, e classificar_com_ia ou classify_with_ai; o frontend usa os nomes em portugues nesta operacao para tornar o payload legivel.
| Metodo | Rota | Acesso | Responsabilidade |
|---|---|---|---|
| POST | /api/auth/login | Publico | Recebe formulario OAuth2 (e-mail em username) e devolve JWT. |
| GET | /api/auth/me | Autenticado | Identifica nome, e-mail e papel da sessao. |
| POST | /api/manifestacoes/processar | Autenticado | Anonimiza, classifica opcionalmente e persiste uma manifestacao. |
| GET | /api/manifestacoes | Autenticado | Lista registros seguros com pagina, origem, status, area e periodo. |
| GET | /api/manifestacoes/{id} | Autenticado | Retorna um registro seguro, sem texto original. |
| PATCH | /api/manifestacoes/{id}/revisao | Operator/Admin | Confirma a revisao; admin tambem corrige itens ja classificados. |
| POST | /api/manifestacoes/{id}/concluir | Autenticado | Marca a manifestacao como concluida e registra o horario. |
| DELETE | /api/admin/manifestacoes | Admin | Apaga o acervo mediante a confirmacao LIMPAR_MANIFESTACOES. |
| GET | /api/indicadores | Autenticado | Entrega agregacoes filtraveis, nunca registros ou texto original. |
| POST | /api/coletas | Admin | Cria uma execucao persistida e retorna 202 Accepted. |
| GET | /api/coletas/fila | Autenticado | Informa tamanho e proxima execucao da fila. |
| GET | /api/coletas/{id}/logs | Autenticado | Exibe logs sanitizados da execucao. |
A referencia interativa do contrato esta em /docs e /scalar no backend quando DOCS_ENABLED=true. Para a POC, essa e a fonte de verdade para payloads, codigos HTTP e schemas atualizados.
6. Triagem segura e revisao humana
- O operador informa texto, origem e escolhe se deseja processar com IA.
- O middleware limita corpo e taxa da rota de triagem e cria um ID de correlacao.
- O servico normaliza o texto, calcula HMAC para deduplicar por origem e anonimiza CPF, e-mail, telefone e pessoas com Presidio, spaCy e reconhecedores brasileiros.
- O registro e criado inicialmente em
em_revisao; o texto original nao e persistido no estado atual da POC. - Se a IA estiver habilitada, somente o texto anonimizado e o catalogo ativo seguem para o Gemini, que deve responder JSON estruturado.
- A API valida tipo, area, assunto, urgencia, confianca e a associacao area-assunto. So entao um resultado confiavel vira
classificado. - Operador ou admin revisa um item
em_revisao. O admin pode corrigir novamente umclassificado; o operator recebe 403 para essa tentativa.
POST /api/manifestacoes/processar
{
"texto": "Mensagem ficticia com CPF 123.456.789-00",
"origem": "manual",
"classificar_com_ia": false
}
Resultado esperado: texto anonimizado e status "em_revisao".7. Coletas assincronas e rastreaveis
A coleta foi desenhada como fila persistida, e nao como uma requisicao HTTP longa. Fontes so ficam disponiveis quando estao ativas, aprovadas, com termos e robots.txt revisados. A POC nao tenta contornar login, CAPTCHA ou bloqueios tecnicos.
- A API cria
execucao_coletaempendentee devolve202 Accepted. - O worker seleciona uma pendencia com
FOR UPDATE SKIP LOCKED, muda paraem_execucaoe controla tentativas, timeout e cancelamento. - Os adaptadores atuais abrangem Dados Abertos MG, Fala.BR ZIP e Reclame Aqui via Playwright.
- Cada item coletado passa pelo mesmo servico de anonimização, deduplicacao e classificacao usado na triagem manual.
- Os estados finais sao
concluida,falhouecancelada; os logs guardam metadados sanitizados, nao o conteudo coletado.

8. Como o Playwright atua na coleta
O Playwright permite que o worker controle um navegador de forma programatica. Na fonte Reclame Aqui, ele abre uma sessao isolada, acessa somente a listagem previamente autorizada e aguarda os elementos necessarios antes de ler os dados disponiveis na pagina.
- A API registra a solicitacao e o worker retira a execucao da fila, sem manter a requisicao HTTP do usuario aberta.
- O worker inicia o navegador, navega para a fonte aprovada e usa seletores para identificar a listagem e seus itens.
- Cada item encontrado e normalizado e enviado ao mesmo fluxo de anonimização, deduplicacao e classificacao da triagem manual.
- Ao terminar, a execucao registra contadores e logs sanitizados, para que a equipe acompanhe o resultado na tela de coletas.

9. Indicadores e leitura gerencial
O endpoint GET /api/indicadores aceita origin, area_id,start e end. O frontend reaplica esses filtros na URL e na consulta para que a tela seja compartilhavel e a agregacao seja calculada pelo backend, onde os dados residem.
Cards
total_manifestacoes, percentual de SLA, tempo medio de resposta em horas e pendencias de revisao.
Graficos
Serie temporal diaria, volume por area, volume por origem e mapa semanal com todos os dias, inclusive os de valor zero.
SLA
O vencimento usa dias uteis e configuracoes por urgencia: baixa, media e alta. Um item aberto e contado em atraso apos o vencimento.
Proveniencia
A resposta informa filtros aplicados, fontes usadas e data de atualizacao; nenhum texto de manifestacao compoe o retorno.
10. Seguranca, privacidade e autorizacao
- Senhas usam Argon2; o backend emite JWT e protege as rotas com OAuth2 Bearer.
- O login do Next.js troca credenciais por JWT no servidor e grava cookie HttpOnly,
sameSite=laxesecureem producao. - O middleware do frontend bloqueia rotas protegidas sem cookie; o backend continua validando assinatura, usuario e papel em toda chamada.
- RBAC distingue
admineoperator. Exclusoes, catalogos e coletas administrativas exigem admin. - CORS e configuravel por ambiente; corpo da requisicao, rate limit e IDs de correlacao sao aplicados no backend.
- Segredos, URL do banco e chaves do Gemini ficam em variaveis de ambiente, nunca no repositorio ou no banco.
11. Qualidade, observabilidade e proximos passos
O frontend valida tipos, lint, build e testes Vitest. O backend possui testes Pytest para anonimização, seguranca, manifestacoes, catalogos, coletas, worker e requisitos funcionais. A API tambem expoe /health para disponibilidade e /ready para verificar a prontidao do banco.
Para evoluir esta POC para producao, eu priorizaria: retencao e criptografia formal para qualquer dado sensivel que venha a ser autorizado, auditoria persistente de acoes, rate limit distribuido, monitoramento centralizado, backups testados, SSO institucional, revisao juridica de cada fonte e testes de carga e seguranca.
12. Como executar localmente
Os dois repositorios podem ser executados separadamente durante a demonstracao.
Backend
cd D:\Projetos python -m venv .venv .venv\Scripts\Activate.ps1 python -m pip install -e ".[dev]" python -m spacy download pt_core_news_lg Copy-Item .env.example .env alembic upgrade head python -m app.commands.bootstrap_admin .\scripts\run-dev.ps1
Frontend
cd "D:\Sistemas\WebApp - Analitico\WebApp - OGE Entrevista" npm install Copy-Item apps\web\.env.example apps\web\.env.local npm run dev
Configure API_URL=http://localhost:8000 no frontend. Depois, acesse http://localhost:3000/documentacao para esta pagina ouhttp://localhost:3000/login para a demonstracao autenticada.
13. Guia visual: tela a tela
Os GIFs abaixo foram gravados na interface local real, usando a sessao administrativa de demonstracao e os dados retornados pela API local. Senhas nunca aparecem na gravacao: o campo de senha e mascarado pelo navegador. A sequencia explica o papel de cada tela durante uma apresentacao de entrevista.




