Pular para conteúdo

v1.9.3 — Public Exams & Edital Intelligence Foundation

A v1.9.3 cria a primeira fundação real de Editais / Concursos no SotuHire, sem transformar o produto em um sistema completo de concursos.

O SotuHire ajuda a organizar e interpretar editais, mas o edital oficial sempre prevalece. Revise manualmente requisitos, datas, taxa, documentos, conteúdo programático e regras da banca.

Objetivo

Separar oportunidades públicas de vagas privadas e criar uma base local-first para:

  • importar texto colado de edital;
  • extrair campos úteis com parser local;
  • usar IA/Gemini opcional apenas como extrator assistido;
  • comparar requisitos com o Perfil Profissional Universal;
  • usar evidências acadêmicas/Lattes confirmadas;
  • gerar score inicial, checklist e plano de estudo simples;
  • preparar Radar e Tracker para oportunidade pública.

Módulo core

modules/public_exams/
  __init__.py
  models.py
  parser.py
  service.py
  scoring.py
  store.py
  study_plan.py
  formatters.py

Modelos principais:

  • ExamNotice;
  • ExamRole;
  • ExamRequirement;
  • ExamTimeline;
  • ExamSubject;
  • ExamFitScore;
  • StudyPlanDraft.

Importação

O endpoint POST /api/v1/public-exams/import recebe texto colado e retorna um rascunho:

{
  "text": "texto colado do edital",
  "source_url": "",
  "source_name": "",
  "use_ai": false,
  "language": "pt-BR"
}

O rascunho sempre vem com needs_user_review=true. Nada é salvo automaticamente.

Parser local

O parser local busca padrões de:

  • órgão/instituição;
  • banca organizadora;
  • número do edital;
  • cargo/função;
  • nível e escolaridade;
  • registro profissional;
  • salário/vencimento/bolsa;
  • taxa de inscrição;
  • carga horária, vagas e cadastro reserva;
  • local de prova ou lotação;
  • inscrição, pagamento, prova, resultado e recursos;
  • requisitos gerais;
  • documentos;
  • etapas;
  • conteúdo programático.

Quando o texto é curto, ambíguo ou incompleto, o parser adiciona warnings em vez de inventar dados.

IA opcional

O prompt public_exam_notice_extractor_v1 permite estruturar o edital com Gemini quando o backend local está configurado.

Regras:

  • a IA só organiza o texto fornecido;
  • a IA não salva edital;
  • a IA não decide elegibilidade;
  • a IA não inventa datas, salário, taxa, banca, órgão, requisito ou conteúdo;
  • resposta vazia, inválida ou pouco útil cai para parser local.

Perfil, Lattes e Career Context

POST /api/v1/public-exams/{notice_id}/analyze usa:

  • Perfil Profissional Universal;
  • CareerContextPurpose.PUBLIC_EXAMS;
  • evidências acadêmicas/Lattes confirmadas;
  • experiência, formação, registros, certificações, localização e preferências.

Regras conservadoras:

  • requisito legal sem evidência vira missing ou uncertain;
  • registro profissional não é presumido;
  • graduação em andamento não conta como concluída;
  • edital não cria item de Perfil por si só.

Frontend

A rota /public-exams oferece:

  • textarea para colar edital;
  • URL/fonte opcionais;
  • horas semanais disponíveis;
  • toggle para usar IA/Gemini se configurada;
  • análise local/fallback;
  • cartões de órgão, banca, cargos, taxa, salário, datas e requisitos;
  • warnings;
  • salvar edital revisado;
  • comparar com Perfil;
  • Exam Fit Score;
  • checklist;
  • plano de estudo inicial.

Não há botão de inscrição automática.

Radar e Tracker

A v1.9.3 prepara tipos e status para oportunidades públicas:

job
public_exam
academic_call
scholarship
residency
internship_public

Status públicos preparados:

noticed
reviewing_notice
requirements_review
registered_manually
studying
exam_scheduled
document_pending
result_waiting
approved
rejected
archived

Fora de escopo

  • PDF/HTML direto;
  • crawler de editais;
  • busca automática na internet;
  • login em banca/órgão;
  • scraping autenticado;
  • inscrição automática;
  • pagamento automático;
  • boleto automático;
  • envio automático de documentos;
  • score final decidido apenas por IA.

Segurança

O fluxo não altera:

/api/v1/sources/authenticated-browser/status
/api/v1/sources/authenticated-browser/launch
/api/v1/sources/authenticated-browser/collect
modules/scraping/browser_session.py
modules/scraping/connectors/authenticated_browser.py

Também não cria docs/ethics/allowed-vs-not-allowed.md.