Comando: cat projects/content-pipeline.md
Esteira de questões com medição de estilo e portão de aceite
Ferramentas próprias de linha de comando e rotinas agendadas que medem como uma banca escreve, conferem cada lote de questões contra essa medida e entregam ao painel da plataforma de estudos apenas rascunhos, que uma pessoa aprova ou descarta. A qualidade é conferida por números e por códigos de saída, e o próprio portão é atacado por testes. Uso interno, sem resultado de negócio a mostrar.
abrir demonstraçãosimulação do sistema com dados fictícios · 5 telas
- Papel
- Autor das ferramentas e do contrato de operação
- Período
- ago/2026 – hoje
- O que eu fiz
Eu: O desenho da esteira, as medidas de estilo, os critérios do portão de aceite, o contrato de códigos de saída, as ferramentas, os testes adversários e a entrega idempotente ao painel.
Projeto privado, descrito sem identificar cliente, produto ou empresa.
Diagrama
Provas públicas, com hash conferido, dão o perfil de estilo medido da banca. Uma rotina agendada redige o lote do dia a partir desse perfil, e o portão de aceite confere integridade, repetição, estilo e cobertura do edital, com um veredito e um código de saída como contrato. No CI, um gerador adversário ataca o portão. O pacote aceito vai à API de ingestão com chave de idempotência e recibo e chega ao painel como rascunho inativo, até a revisão humana.
Contexto
Um catálogo de questões cresce na velocidade de quem lê edital e provas anteriores e escreve no estilo da banca. Uma rotina que redige rascunhos com um modelo de linguagem acelera a escrita, mas deixa marcas previsíveis: a alternativa correta tende a ser a mais longa, temas se repetem, e uma rotina que falha costuma falhar em silêncio. Esta esteira mede essas marcas antes que qualquer coisa chegue ao painel da plataforma de estudos.
O que eu construí
- Medição do estilo da banca. Ferramentas que baixam provas públicas com hash conferido, separam as questões, casam cada uma com o gabarito definitivo e medem como a banca escreve.
- Portão de aceite. Cada pacote passa por integridade, repetição contra o acervo e os pacotes anteriores (enunciado mais alternativas), estilo contra o perfil medido e cobertura do edital, e sai com um veredito e um código de saída.
- Rotinas com contrato. Uma rotina redige o lote do dia a partir do perfil medido; outras conferem se as rotinas rodaram e medem o produto de fora. Todas só leem e relatam, e o silêncio também é um resultado.
- Entrega idempotente. O pacote aceito vai ao painel pela API de ingestão com chave de idempotência e recibo, e chega como rascunho: questões inativas, sem preço e sem simulado oficial.
- Painel gerado. Uma nota gerada a partir do registro separa o que não foi medido do que nunca rodou e aponta instrução divergente.
Desafios
- Adversário preguiçoso. A primeira versão do caso bom do gerador adversário fazia questões de um molde só, e o portão recusou o lote por 435 pares repetidos. O portão estava certo, e o teste foi refeito.
- Teste que não testava. O teste de mutação mostrou que um limite do portão podia ser desligado sem quebrar nenhum teste. Virou um caso novo do adversário.
- Código de saída trocado. Um arquivo corrompido devolvia 1 (achei um problema) quando devia devolver 2 (não consegui olhar).
- Rede fechada na nuvem. A leitura de páginas oficiais falhou em todos os domínios testados. O contrato de evidência foi reescrito em níveis, e o monitoramento do produto passou para a máquina local.
Status
Uso interno, sem resultado de produção a mostrar. Na última medição, o painel apontou rotinas com a instrução publicada diferente da versão do repositório, que é exatamente o que o detector existe para achar.
Restrições
- Nada chega ao aluno sem revisão humana, então a esteira só entrega rascunhos.
- Rotinas agendadas rodam sem ninguém olhando, e uma falha silenciosa precisa virar sinal.
- Ferramentas sem dependências de terceiros, para rodar em qualquer máquina com Node.
- O acervo de provas anteriores fica só na máquina local.
Decisões
Estilo medido, e não descrito
- Contexto
- Pedir questões no estilo de uma banca produz textos plausíveis com marcas previsíveis, como a alternativa correta ser quase sempre a mais longa, o que deixa o aluno acertar pelo tamanho.
- Escolha
- Medir o perfil da banca em provas anteriores (tamanho de enunciado e de alternativa, comandos negativos, itens em algarismo romano, distribuição do gabarito e a frequência com que a correta é a mais longa) e usar os mesmos números na instrução de geração e no portão de aceite.
- Ganhos
- O estilo vira algo que se confere, pacote por pacote.
- O gabarito denunciado pelo tamanho é barrado antes de chegar ao painel.
- Custos
- Depende de um acervo local de provas e de medir de novo para cada banca.
Código de saída como contrato
- Contexto
- Uma ferramenta que engole um erro parece igual a uma que não achou nada, e as rotinas decidem o próximo passo pelo código de saída.
- Escolha
- Todas as ferramentas seguem o mesmo contrato. Zero quer dizer que mediu e não achou nada, um que mediu e achou algo que pede olho, e dois que não conseguiu medir.
- Ganhos
- Não conseguir olhar deixa de passar por estar tudo bem.
- Scripts encadeiam decisões sem interpretar texto.
- Custos
- Cada ferramenta precisa separar falha de leitura de achado, e um caso já saiu trocado e foi corrigido.
Atacar o próprio portão
- Contexto
- Um portão que ninguém tenta furar pode estar aprovando por acidente.
- Escolha
- Um gerador adversário fabrica pacotes desenhados para passar pelo portão, e nenhum pode passar. Um teste de mutação desliga uma checagem de propósito e confere se o adversário percebe.
- Ganhos
- Achou um limite que podia ser desligado sem quebrar teste nenhum.
- Custos
- Mais código de teste para manter, e o adversário também precisa de revisão.
Rotina lê e relata, e só rascunho entra no produto
- Contexto
- Rotinas agendadas rodam sem supervisão, e uma rotina com permissão de escrita poderia publicar um erro para todos os alunos.
- Escolha
- As rotinas só leem e mandam relatório por e-mail. A única escrita no produto é o envio de um pacote pela API de ingestão, com chave de idempotência e recibo, e ele chega como rascunho pendente de revisão.
- Ganhos
- Uma rodada ruim não publica nada.
- Reenviar o mesmo pacote não duplica conteúdo.
- Custos
- A vazão fica limitada pela revisão humana, e receber cada pacote ainda é um passo manual.
Instrução versionada, com detector de deriva
- Contexto
- A instrução que roda na nuvem pode mudar sem que o arquivo do repositório mude, e ninguém percebe até o resultado piorar.
- Escolha
- Cada instrução é um arquivo versionado, com a cópia publicada guardada ao lado, e um detector compara as duas.
- Ganhos
- A divergência aparece no painel, em vez de virar surpresa num relatório.
- Custos
- Toda mudança exige publicar e conferir de novo.
Stack e por quê
- Node.js puro (ESM)
- Nenhuma dependência de terceiros, com leitor de PDF e gerador de planilha próprios.
- node:test
- Regressões, o gerador adversário e o teste de mutação.
- GitHub Actions
- Roda a suíte, confere a instrução derivada e ataca o portão a cada push.
- Rotinas agendadas e uma tarefa local
- A produção do lote roda na nuvem, e a vigilância do produto roda na máquina.
- Obsidian
- Um painel gerado a partir do registro medido, que ninguém edita à mão.
Resultados
Cerca de 11,5 mil linhas em 50 arquivos de ferramenta, sem nenhuma dependência de terceiros.
repositório privado auditadoContagem no repositório(Auditoria do repositório privado, set/2026)CI que roda as regressões, a suíte completa, a conferência da instrução derivada e o gerador adversário contra o portão.
repositório privado auditadoWorkflow do repositório(Auditoria do repositório privado, set/2026)117 testes em 14 seções, e um limite de semelhança de 0,75 para acusar repetição, contra 0,211 no par legítimo mais parecido já medido.
declaradoDocumentação do projeto
Ângulo de segurança
Superfície de ataque
- Download de provas públicas a partir de páginas oficiais.
- Pacotes de questões recebidos por e-mail e lidos do disco.
- A API de ingestão do painel, com credencial de máquina.
Controles implementados
- Coleta com origem explícita, DNS fixado e só endereços públicos, contra SSRF.
- Hash conferido em cada prova baixada e em cada pacote recebido.
- Leitura de pacote com limite de tamanho e recusa de links simbólicos e junções.
- Entrega com chave de idempotência e consulta antes de reenviar, e o painel só recebe rascunhos.
- Rotinas agendadas sem nenhuma permissão de escrita no produto.
O que eu testaria hoje
- Um pacote com HTML ou link malicioso no enunciado, do portão até a tela de revisão do painel.
- Uma página oficial que redireciona para um endereço interno durante a coleta.
- O mesmo pacote reenviado com o corpo alterado e a mesma chave de idempotência.
Evidências
- repositório privado auditadoRepositório privado auditado(Auditoria do repositório privado, set/2026)