carlos@cesaints: ~/projects/content-pipeline.md — zsh

Comando: cat projects/content-pipeline.md

projects/content-pipeline.md · 2,4 KB

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

Do estilo medido ao rascunho que uma pessoa revisa

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)