Auditoria de dados e integração da v1.9.6¶
Data da auditoria: 12 de julho de 2026
Branch auditada: main
Commit de referência inicial: 309f9662f1da410349d85fefdcacff8778cea51e
Escopo: código Python, FastAPI, React, extensão, scripts, testes, documentação, stores locais e CI.
Método e limites¶
A auditoria comparou rotas, services, módulos, modelos, stores, frontend, testes e documentação. Também inspecionou somente a estrutura dos dados locais para contar registros, duplicatas e referências ausentes; nenhum conteúdo pessoal é reproduzido neste relatório.
As chaves expostas no prompt foram tratadas como comprometidas, não foram usadas, copiadas ou validadas. Os arquivos e endpoints de authenticated-browser foram protegidos por hash antes das mudanças e permaneceram fora do escopo de refatoração.
Estado inicial comprovado:
main,origin/maine a tag publicada anterior apontavam para o mesmo commit;- árvore limpa antes da implementação;
- CI e documentação remotos verdes no último commit publicado;
- nova tag ainda inexistente;
- extensão no manifesto anterior e sem handshake formal;
- secret scan do conteúdo rastreado sem padrão de chave Gemini/OpenAI.
Resumo executivo¶
O Perfil Profissional Universal era a fonte preferencial, mas não a única fonte operacional. O ProfileContextOrchestrator já o priorizava e recorria ao perfil legado quando vazio. Match, ATS, Tailor, Radar, Fontes, Tracker, GitHub e Editais consultavam Career Context em graus diferentes; Dashboard, Notificações, Currículo e Inteligência não tinham a mesma profundidade. O Local Companion mantinha ainda active-context.json para currículo/preferências explícitas.
Os maiores riscos encontrados foram stores JSON/JSONL sem schema ou transação cruzada, corrupção convertida silenciosamente em estado vazio, mesma vaga em vários stores sem vínculo, Tracker sem snapshots, eventos de etapa sobrescritos na memória, referências pouco granulares em Lattes/GitHub, fallback OpenAI registrado incorretamente, permissões de IA persistidas mas ignoradas e warnings/trace descartados pelo frontend.
A implementação desta entrega adiciona SQLite versionado, repositories, migração segura, backup/restore/health, snapshots imutáveis, vínculos do Tracker, AiRunStore, dedupe/proveniência reforçados, handshake/fila/snapshots da extensão, envelope de warnings no frontend e manifesto verificável. Stores legados continuam disponíveis e não são apagados.
Inventário de produção e consumo¶
| Dado produzido | Persistência | Consumidores | UI | Contexto | Origem / source_ref |
Dedupe | Snapshot | Teste | Status |
|---|---|---|---|---|---|---|---|---|---|
| Perfil Profissional Universal | profile/profiles.json; migração para profiles |
Orchestrator, API Perfil, Lattes, extensão | Perfil | Sim | Sim | Sugestão conservadora | ResumeSnapshot quando usado | API/Perfil/Contexto | completo |
ProfileItem confirmado |
JSON + profile_items |
Career Context, Match, ATS, Tailor, Radar, Editais | Perfil e revisão | Sim | Sim | Identidade por referência forte + título em containers | Indireto no currículo | Identidade/Perfil | completo |
| Candidato de Perfil | Resposta transitória até confirmação | Perfil, Lattes e bridge da extensão | Revisão da extensão/Lattes; GitHub web ainda parcial | Não antes de confirmar | Sim | Local | Não | Perfil/extensão | parcial |
| Perfil legado | memory/career-profile.json |
Fallback do orchestrator e legado Streamlit | Legado | Sim, apenas quando necessário | Não por fato | Textual | Não | Builder/Contexto | legado |
| Memória de carreira | career-memory.jsonl; memories |
RAG/Career Context | Inteligência/memória legada | Sim | Agora prioriza source_refs |
Identidade e merge de refs | Não | Memória/RAG | parcial |
| Extração de currículo | Transitória | Match/ATS/Tailor ou Tracker quando enviada | Currículo | Não | Arquivo/tipo | Parser local | ResumeSnapshot no Tracker | Parser/API | parcial |
| Extração de vaga | Transitória | Match/Tracker/captura | Vaga | Não | URL opcional | URL canônica | JobSnapshot no Tracker/captura | Parser/API | parcial |
| Match | Resposta; snapshot no Tracker | ATS, Tailor e Tracker | Match | Sim | evidence_used |
Hash do snapshot | AnalysisSnapshot | Match/API | completo |
| Revisão ATS | Resposta; snapshot no Tracker | Tracker e pessoa usuária | ATS | Sim, somente evidência confirmada | Evidências | Hash do snapshot | AnalysisSnapshot | ATS/API | completo |
| Tailor/variante | Resposta e Tracker | Currículo/Tracker | Tailor | Sim, somente evidência confirmada | Evidências | Hash de conteúdo | ResumeSnapshot | Tailor/Tracker | completo |
| Candidatura | JSON legado + applications |
Tracker, Dashboard, Inteligência | Kanban | Sim | URL/captura/snapshots | Mesma vaga forte | Links para snapshots | Tracker/API | completo |
| Evento de candidatura | application_events |
Histórico do Tracker | Tracker | Sinal histórico | application_id |
Não colapsa eventos | Aplicação vinculada | Tracker/storage | completo |
| Oportunidade coletada | JSON legado + opportunities |
Captura, Radar, Tracker | Fontes/Radar | Via memória/contexto | URL canônica | URL/empresa/cargo | JobSnapshot quando há texto | Identidade/fontes | parcial |
| Inbox de fontes | sources/imports.json + tabelas |
Fontes, Vaga, Tracker | Fontes | Sim | Sim | dedupe_key |
Ao importar | API Fontes | parcial |
Histórico de lotes imports |
sources/imports.json |
Sem leitura de produto encontrada | Não | Não | Parcial | Não | Não | Indireto | órfão |
| Captura Companion | captures.jsonl + captures |
Companion, API extensão, Vaga/Edital/GitHub/Tracker | Fontes | Sim | URL/capture ID | URL canônica | Sim | Companion/extensão | completo |
| Contexto ativo Companion | active-context.json |
Companion | Configuração legada | Complementa Career Context | Singleton | Não | ResumeSnapshot na migração se há currículo | Companion | legado |
| Wishlist | radar/radar.json + radar_wishlists |
Radar e scheduler | Radar | Sim | IDs locais | ID | Não | Radar/API | completo |
| Fonte do Radar | JSON + radar_sources |
Runs agendados/manuais | Radar | Não | URL/source ID | ID/URL | Não | Radar | completo |
| Run/resultado do Radar | JSON + radar_runs/results |
Alertas, Inbox e Tracker | Radar | Sim na análise | run_id, URL |
URL/identidade | Ao salvar no Tracker | Radar/API | parcial |
SavedSearch/JobRadarProfile |
Modelo no estado legado | Sem fluxo real encontrado | Não | Não | Não | Não | Não | Não | órfão |
| Agendamento | schedules.json + schedules |
Scheduler local | Radar | Sim | IDs | ID | Não | Scheduler/API | completo |
| Notificação local | schedules.json + notifications |
Centro de notificações | Notificações | Indireto | related_* parcial |
ID | Não | Notificações | parcial |
| Edital/cargo/requisito | notices.json + tabelas |
Editais, Exam Fit, plano | Editais | Sim | URL/número/órgão/banca | Identidade oficial antes da URL | PublicExamSnapshot | Editais/API | completo |
| Exam Fit/plano de estudo | Resposta transitória | Pessoa usuária | Editais | Sim | Evidências e warnings | Não | Fundação ainda parcial | Editais | parcial |
| Projeto GitHub/portfólio | project-analyses.jsonl + github_projects |
Perfil, memória, site/extensão | GitHub/Fontes | Sim | owner/repo/URL | Identidade canônica | AnalysisSnapshot na captura | GitHub/extensão | parcial |
| Análise GitHub direta do site | Resposta | Pessoa usuária | GitHub | Sim | Repositório + evidências | owner/repo | Não até salvar/Tracker | API GitHub | parcial |
| Trace de IA | ai_runs |
Auditoria e health | Metadados nas respostas; dashboard futuro | Registra fontes | Sim | input_hash |
AnalysisSnapshot separado | AiRun/API | completo |
| Configuração não secreta de IA | settings/ai-settings.json |
Runtime e frontend | Configurações | Define permissões | N/A | Singleton | Não | Settings | completo |
| Chave de provider do app | data/secrets/*.local.json |
Backend local | Apenas status mascarado | Nunca entra | N/A | N/A | Excluída | Segurança | completo |
| Chave própria da extensão | sessão ou cofre IndexedDB consentido | Service worker | Popup | Nunca entra no contexto | N/A | N/A | Excluída | Secret/package | completo |
| Fila offline da extensão | storage local sem segredo | Popup/service worker | Popup | Não | identidade de ação/URL | URL canônica | Captura gera snapshot | Harness Node | completo |
| Catálogo de modelos | cache local não secreto | Configuração/execução real | Site/extensão | Não | Provider | Modelo ID | Não | Settings/extensão | completo |
| Registro de prompts | Código Python | Orquestração de IA | Catálogo documental | N/A | prompt_id/version |
ID+versão | Trace | Registry/gerador | parcial |
| Capabilities manifest | config/capabilities.json |
Validadores e matriz | Documentação | N/A | Commit verificado | capability_id |
N/A | Geradores | completo |
| Backup/export | ZIP + manifest/checksums | Restore e pessoa usuária | Privacidade | Não | Metadados seguros | Nome/data | Contém snapshots, não segredos | Storage/API/E2E | completo |
Perguntas obrigatórias respondidas¶
O Perfil Universal é realmente a fonte central?¶
É a fonte central preferencial para fluxos novos, comprovado por modules/profile/orchestrator.py e modules/context/engine.py. Ainda existe fallback deliberado para career-profile.json, e active-context.json guarda o currículo explicitamente fornecido ao Companion. Portanto, a resposta é sim para fatos confirmados novos, com compatibilidade legada documentada, não uma exclusividade física de store.
Todos os fluxos consultam Career Context quando deveriam?¶
Match, ATS, Tailor, Radar, Wishlist, Fontes, GitHub, Tracker, extensão e Editais consultam finalidades específicas. Currículo e Vaga são extrações de entrada e não precisam do contexto completo. Dashboard agrega dados diretamente. Inteligência e Notificações ainda têm integração indireta; permanecem gaps parciais, não fluxos falsamente marcados como completos.
Existem fluxos que duplicam contexto?¶
Sim. O perfil legado e o Perfil Universal coexistem por compatibilidade; Companion mantém contexto ativo explícito; Tracker/Fontes também espelham sinais na memória. A correção evita tratar constraints reconstruídas como confirmadas e preserva origem/confiança, mas a eliminação completa do espelhamento legado exige migração gradual.
Existem dados salvos e nunca lidos?¶
Sim: SourceImportState.imports, saved_searches e JobRadarProfile não possuem consumidor de produto identificado. deduplication_reason e alguns metadados de merge possuem consumo principalmente diagnóstico. Estão marcados como órfãos/parciais, sem remoção destrutiva.
Existem campos retornados pela API e nunca exibidos?¶
O baseline descartava warnings/request ID do envelope, trace ATS, candidatos GitHub e contexto do Tracker. O client agora preserva envelope, trace, candidatos e contextos; ainda há metadados avançados de Radar, source_summaries e dedupe de Editais com exposição parcial.
Existem campos exibidos e nunca persistidos?¶
Match, ATS, Tailor, Exam Fit e plano podiam existir apenas na tela. Match/ATS/Tailor passam a ter snapshots quando vinculados ao Tracker; Exam Fit/plano continuam transitórios nesta fundação e estão documentados como parciais.
Existem candidatos de Perfil que nunca chegam à revisão?¶
O fluxo Lattes e a bridge da extensão chegam à revisão. A análise GitHub direta passou a preservar profile_evidence_candidates no client, mas sua apresentação/salvamento completo no fluxo GitHub web ainda é parcial.
Existem memórias gravadas e nunca recuperadas?¶
Sim. Reanálises antigas de projeto podiam ficar na memória depois de o store substituir o relatório, e eventos de Tracker eram sobrescritos por identidade. Eventos agora usam referências únicas e SQLite mantém application_events; memórias antigas permanecem para migração/health, sem apagamento automático.
Existem prompts registrados e nunca usados?¶
career_advice_v1 está registrado sem consumidor de produção. domain_classification_v1 possui implementação interna, mas não um fluxo integrado completo. Prompts documentais que não existem no registry foram removidos do catálogo gerado ou tratados como roadmap.
Existem providers ou modelos salvos e ignorados?¶
O modelo selecionado já era encaminhado ao provider. O baseline ignorava permissões de Perfil, Lattes, Extensão e Notificações e marcava OpenAI GitHub bem-sucedido como fallback. As permissões foram ligadas ao runtime e a comparação passou a usar o provider solicitado. O fallback agora é explícito.
Existem fallbacks silenciosos?¶
Existiam no fallback FastAPI→Companion da extensão e em mensagens hardcoded como Gemini. A extensão agora registra fallback_used/reason; mensagens do backend são neutras ao provider; AiRunStore e envelopes preservam warnings.
Existem endpoints sem cliente frontend?¶
Sim, sobretudo operações avançadas ou de manutenção, como detalhes/exclusão de alguns Editais, filtros avançados do Radar e endpoints legados. O manifesto diferencia endpoint existente de capacidade consumida; não se declara cobertura total apenas pela presença no OpenAPI.
Existem telas sem endpoint real?¶
O modo Demo é intencional e separado. No modo API Real, as capacidades principais do manifesto têm endpoint validado. Continuidade de alguns fluxos ainda exige seleção/colagem manual e aparece como gap na matriz.
Existem stores diferentes para a mesma entidade?¶
Sim. Uma vaga pode aparecer em oportunidades, Inbox, Radar, Companion, Tracker e memória. SQLite, snapshots e IDs cruzados reduzem a divergência, mas os stores legados permanecem durante a transição. Não há dual-write permanente imposto a todos os módulos.
Existem IDs incompatíveis para a mesma entidade?¶
Sim no baseline: URL, capture ID, Tracker ID, hash do Radar e source ID podiam representar a mesma vaga. normalize_entity_url, identidade canônica, source_refs, source_capture_id e snapshots criam vínculos estáveis; merges incertos continuam sugestões.
Existem documentos prometendo funções que o código não entrega?¶
A matriz anterior superestimava continuidade Currículo→Match, Vaga→Tracker, persistência GitHub, uso do Perfil por Inteligência e contexto completo da extensão. A nova matriz é gerada do manifesto e registra gaps. O documento anterior permanece como histórico, com aviso para consultar a matriz atual.
Existem screenshots antigas ou duplicadas?¶
Sim. A galeria mantém imagens históricas e as capturas de Editais e Editais com IA do baseline eram idênticas. Os scripts atuais usam nomes estáveis e incluem Privacidade/Data Health e diagnóstico da extensão; imagens históricas continuam arquivadas, mas não são a navegação principal.
Existem textos sem acento ou gramática ruim?¶
Sim, especialmente mensagens legadas e documentos antigos. README, roadmap, índices e documentação principal foram revisados em português. Corrigir todo o arquivo histórico não faz parte desta entrega e poderia apagar contexto original.
Existem versões divergentes?¶
No baseline, app/API/web estavam na versão publicada anterior e a extensão tinha ciclo próprio. O release atual alinha pyproject.toml, FastAPI, package web, mocks, documentação e testes; a extensão avança separadamente por conter handshake, snapshots, retry e JSON-LD.
Estrutura observada dos dados locais¶
Sem revelar conteúdo:
- Tracker legado: 3 registros válidos, 1 sem URL e nenhum com snapshot/histórico estruturado;
- memória: 112 linhas válidas, sem IDs repetidos;
- memória: 5 grupos repetidos por
kind + source_ide 7 grupos semânticos exatamente repetidos; - memória: 103 registros sem
source_refs, embora vários possuamsource_id; - portfólio: 2 registros válidos;
- perfil legado e contexto ativo: válidos;
- demais stores principais: ausentes no diretório local auditado.
Esses números servem apenas como dry-run da instalação auditada. A migração não deve inventar snapshots para os três registros legados do Tracker sem texto original e nunca deve apagar os JSON/JSONL.
Gaps corrigidos¶
- repository abstraction e SQLite local versionado;
- dry-run, backup prévio, importação transacional, verificação e idempotência;
- backup/export sem secrets conhecidos, restore checksummed e data health;
- snapshots imutáveis e relações de candidatura;
- stage history sem sobrescrever eventos anteriores;
- identidade de edital por número/órgão/banca antes de URL;
- granularidade de Perfil para várias evidências no mesmo Lattes/repositório;
- constraints com confiança, confirmação, sensibilidade e referência preservadas;
- ATS/Tailor/Radar sem promover evidência não confirmada a fato seguro;
- permissões de IA efetivamente consultadas;
- OpenAI GitHub e mensagens de fallback corrigidos;
- warnings, trace e contexto preservados pelo client;
- handshake, compatibilidade, retry/backoff/limite/export/import e JSON-LD na extensão;
- API/UI de data health, backup, export e restore;
- manifesto e documentos técnicos gerados/verificados.
Pendências reais¶
- executar a migração
--applynos dados pessoais é uma decisão local da pessoa usuária; o release valida dry-run e fixtures, não altera automaticamente o diretório pessoal; - expor revisão de candidatos no fluxo GitHub web direto;
- persistir Exam Fit e plano de estudo como AnalysisSnapshot;
- reduzir espelhamento entre Perfil legado, memória e contexto ativo após adoção comprovada do SQLite;
- dar consumidor ou deprecar com migração
SourceImportState.imports,SavedSearcheJobRadarProfile; - ampliar UI para metadados avançados de Radar,
source_summariese dedupe de Editais; - executar benchmark completo e baseline humano na etapa de avaliação de IA;
- ampliar a ingestão documental além da interface/fundação atual.
Conclusão¶
A arquitetura deixa de depender apenas de arquivos mutáveis sem relação e passa a possuir uma trilha verificável entre origem, contexto, análise, snapshot e candidatura. A compatibilidade legada é mantida de forma explícita. O release pode ser fechado somente após a suíte completa, build estrita da documentação, pacote da extensão, secret scan, verificação dos hashes protegidos, CI remoto verde e publicação dos artefatos.