Comando: cat projects/exam-radar.md
Inteligência de concursos com a conta à mostra
Ferramenta própria, de uso interno, para decidir para qual concurso vale produzir material: ordena concursos por um score em cinco parcelas, extrai o padrão de cada banca a partir de provas anteriores e estima o que tem chance de cair, sempre com a conta escrita ao lado do número. Roda numa máquina só, com o banco num arquivo. É um protótipo funcional, sem resultado de negócio a mostrar.
abrir demonstraçãosimulação do sistema com dados fictícios · 5 telas
- Papel
- Autor da ferramenta, do produto aos testes
- Período
- ago/2026 – hoje
- O que eu fiz
Eu: Produto, arquitetura, modelo de dados, a fórmula do score, o motor de incidência e a mistura dele com a estimativa do modelo, o portão de aprovação humana, as telas, os testes e o CI.
Projeto privado, descrito sem identificar cliente, produto ou empresa.
Diagrama
As entradas são texto colado de editais e provas e um manifesto de pesquisa validado por contrato. O app Next.js roda só em localhost, sem login, com SQLite num arquivo. Nele, um motor de incidência só com aritmética, um score com parcelas explicáveis e um roteador de provedores por tarefa; o roteador chama provedores gratuitos, um modelo local e o pago, este com teto. A estimativa junta a proposta do modelo e a conferência da aritmética e escreve a conta ao lado do número, e o material gerado só vira insumo depois de passar pelo portão humano.
Contexto
Antes de escrever uma única aula, é preciso decidir para qual concurso vale produzir e o que estudar primeiro dentro dele. Essa decisão costuma sair de intuição e de listas de temas quentes sem fonte. Esta ferramenta prepara essa decisão para a plataforma de estudos, de um jeito que dá para conferir.
O que eu construí
- Radar de oportunidade. Importa uma pesquisa revisada, com fontes oficiais, datas, confiança e elegibilidade, e ordena os concursos por um score de 0 a 100 em cinco parcelas, cada uma com o máximo ao lado.
- Acervo e padrão da banca. Provas anteriores coladas como texto viram questões classificadas por matéria e tópico. Sobre elas, um motor só com aritmética calcula frequência e tendência e monta o padrão de cada banca: como ela constrói a questão, as armadilhas que repete e o que mais cobra.
- O que tem chance de cair. Com o edital colado, o modelo de linguagem propõe tópicos e probabilidades. O portão do edital zera o que não está no texto, a base histórica corrige a estimativa e a justificativa escreve a conta, citando as questões usadas como evidência.
- Custo à vista. Provedores prontos, chamadas, falhas, tokens, latência e gasto do dia aparecem numa tela, com o teto do provedor pago.
- Portão humano. O material gerado nasce para revisar e só vira insumo depois de uma aprovação com confirmação.
Status
Protótipo funcional de uso interno, rodando numa máquina. Não há resultado de negócio nem medida de acerto das previsões: a ferramenta mostra de onde vem cada número e não promete o que vai cair.
O que eu faria diferente
Escreveria o autoteste das fórmulas antes das telas. Foi ele que mostrou parcelas que não fechavam o total, e um script de preparo que nunca criava o banco passou seis dias sem que ninguém percebesse.
Restrições
- Orçamento zero no uso diário, com provedores gratuitos, um modelo local e o pago atrás de um teto.
- Uma pessoa e uma máquina, sem servidor para manter.
- Nenhum número sem explicação. Toda estimativa mostra de onde veio.
- Entrada por texto colado de editais e provas, sem raspar sites.
- Nada gerado vira material do produto sem uma pessoa aprovar.
Decisões
Um arquivo SQLite, sem login e só na máquina local
- Contexto
- A ferramenta serve a uma pessoa, que decide o que produzir. Um servidor com contas e banco gerenciado seria custo e superfície de ataque sem ninguém para atender.
- Escolha
- SQLite num arquivo, aplicação acessível só pelo endereço local e sem login, por decisão registrada.
- Ganhos
- Nada fica exposto na rede, e o backup é copiar um arquivo.
- Nenhuma infraestrutura para operar.
- Custos
- Abrir para outra pessoa exigiria autenticação e outro banco.
O modelo propõe, a aritmética confere
- Contexto
- Perguntar a um modelo de linguagem o que vai cair devolve números confiantes sem nenhuma evidência por trás.
- Escolha
- Um motor de incidência só com aritmética (peso por recência com meia-vida de quatro anos, tendência por regressão linear e encolhimento para o meio quando a amostra é pequena). A probabilidade final mistura a estimativa do modelo com essa base, e o peso do histórico cresce com o acervo, até 60% com seis provas ou mais. Tópico que não está no edital é zerado.
- Ganhos
- Cada número pode ser refeito à mão a partir da justificativa escrita.
- Amostra pequena puxa a estimativa para o meio, e não para 99%.
- Custos
- As previsões ficam menos confiantes e só valem alguma coisa com acervo de provas.
Score explicável, separado da confiança nas fontes
- Contexto
- Um único número de oportunidade escondia como tinha sido montado, e um dado ausente derrubava a nota sem aviso.
- Escolha
- Cinco parcelas com o máximo ao lado (público, dinheiro, urgência, busca e espaço), piso declarado para dado ausente, e confiança das fontes e elegibilidade mostradas à parte. A tela diz que nenhum número ali é probabilidade de venda.
- Ganhos
- Dá para discordar de uma parcela sem jogar fora o resto.
- O autoteste confere que as parcelas somam o total.
- Custos
- Os pesos continuam sendo um julgamento meu, só que agora visível.
Roteador de provedores com teto de gasto
- Contexto
- Provedores gratuitos batem limite, caem e devolvem JSON malformado, e o pago não pode virar uma conta surpresa.
- Escolha
- Uma fila por tarefa com cinco provedores. Limite, erro de servidor e timeout passam ao próximo; erro de credencial não. O pago só entra com teto diário maior que zero, e toda tentativa fica registrada com tokens, custo e latência.
- Ganhos
- O uso diário custa zero, e o custo aparece na própria tela.
- A queda de um provedor não para o trabalho.
- Custos
- A qualidade da resposta varia com o provedor que respondeu.
Stack e por quê
- Next.js 15 e React 19
- Onze telas renderizadas no servidor, sem uma API separada para manter.
- TypeScript
- Tipos do banco até a tela nas fórmulas que mudam número.
- Prisma com SQLite
- Banco num arquivo, com migrações e 13 modelos.
- zod
- Contrato do manifesto de pesquisa importado.
- Tailwind CSS
- Tema escuro com contraste conferido nos rótulos e no botão principal.
- GitHub Actions
- Auditoria de dependências, checks de lógica, typecheck e build a cada push.
Resultados
11 telas em 8 módulos, 13 modelos de dados e cerca de 6,2 mil linhas de TypeScript.
repositório privado auditadoContagem no repositório(Auditoria do repositório privado, set/2026)CI com auditoria de dependências, banco exclusivo, checks de lógica, typecheck e build, com actions fixadas por SHA.
repositório privado auditadoWorkflow do repositório(Auditoria do repositório privado, set/2026)140 asserções sobre a lógica pura, sem chave de API e sem internet. O autoteste pegou seis defeitos que mudavam número na tela, entre eles parcelas do score que não somavam o total em 22,9% dos casos.
declaradoRegistro de testes do projeto
Ângulo de segurança
Superfície de ataque
- Texto colado de editais e provas, que segue para o modelo de linguagem.
- Manifesto de pesquisa importado, com links de fontes.
- Chaves dos provedores guardadas na máquina.
Controles implementados
- Aplicação só no endereço local e banco num arquivo, sem nada exposto na rede.
- Manifesto validado por contrato versionado, com limite de tamanho e de candidatos e só links oficiais em HTTPS.
- Importação gravada numa transação única, que repetida não cria nem altera nada.
- A importação não chama modelo nem abre os links que recebe.
- Provedor pago só com teto diário, e cada chamada registrada com o custo.
- Material gerado nasce não aprovado e só vira insumo depois de uma aprovação com confirmação.
O que eu testaria hoje
- Instrução maliciosa escondida no texto colado de um edital ou de uma prova.
- A aplicação subindo em todas as interfaces por engano e ficando alcançável pela rede local.
- Chamadas concorrentes estourando o teto diário do provedor pago.
Evidências
- repositório privado auditadoRepositório privado auditado(Auditoria do repositório privado, set/2026)