Portfolio
Estudo de caso 002 · as 670 questões
Bastidores · Estudo de caso 002Um experimento medido · ago 2026

Eu tinha um processo na cabeça. Fui medir e descobri que ele estava certo. O registro é que estava errado.

Em quatro meses eu escrevi 670 questões de matemática para a plataforma. As regras que evitavam defeito existiam, mas viviam em conversas de chat e na minha memória. O console do banco tinha guardado tudo sem que ninguém planejasse: 506 comandos, com hora e resultado. Fui ler.

Meu papelAutoria e processo
InstrumentoLog do console do banco
Período medidoabr → jul / 2026
Lote novo04 / ago
506
comandos no log
670
questões medidas
7
famílias de defeito
81%
acerto de primeira

Acervo em 03/08/2026. Depois do lote novo são 739 questões ativas.

00Como uma questão nascia

Três assistentes, cinco etapas, nenhuma regra escrita.

Cada questão passava por três modelos de IA diferentes, cada um com uma função. Um planejava o bloco. Outro escrevia as questões. Um terceiro revisava, de propósito um modelo diferente do que escreveu. Depois eu rodava o comando no banco e conferia na tela.

O fluxo existia e funcionava. O que não existia era registro: as regras que evitavam defeito viviam nas conversas, e cada conversa nova começava do zero.

O fluxo de autoria · 5 etapasMáquinaHumano
OpenAI1 PlanejarRoadmapDo bloco, questão a questão
Gemini2 GerarEscreverAs questões em lotes de 15
Claude3 RevisarConferirModelo diferente do que escreveu
44 ExecutarRodarO comando no banco
55 ConferirOlharAbro a plataforma e vejo na tela

As três inspeções do processo aconteciam depois da peça pronta. Nenhuma verificação durante a geração.

Os logos identificam as ferramentas usadas no processo. Não há vínculo, patrocínio ou endosso.

01O instrumento que ninguém planejou

O console do banco guardava tudo. Eu só não tinha olhado.

O editor que eu uso registra cada comando executado no banco: data, hora, o comando inteiro e quantas linhas afetou. Ninguém planejou isso como instrumentação. Mas é o rastro completo de como cada questão nasceu, foi corrigida ou descartada.

-- 2026-05-15 16:43:31 [mat-ia-plataform] [console]
UPDATE questoes SET alternativas = … \not=1 linha
-- 2026-05-15 16:46:35
UPDATE questoes SET alternativas = … ≠ dentro do LaTeX1 linha
-- 2026-05-15 16:50:15
UPDATE questoes SET alternativas = … \neq1 linha

O instrumento é frágil. Em 04/08 o editor atualizou de versão e passou a escrever o log noutra pasta. A cópia congelada do estudo parou em 24/07. Se eu tivesse aceitado o primeiro resultado, teria concluído que a sessão nova não foi registrada.

02O que a medição achou

A linha de base não é baixa. E ela não melhora com o tempo.

Acerto de primeira, por lote · ordem cronológicaHistóricoLote novo
100500média 81%98100699374848678868424/0425/0430/0415/0519/0520/0521/0503/0704/0704/08↑ o maior lote, 210 questões↑ lote novo

Média do acervo: 81%. O lote novo entra na faixa, não acima dela.

As sete famílias · 355 correções
Alternativas126 · 35,5%
Renderização visual67 · 18,9%
Substituição integral62 · 17,5%
Texto do enunciado47 · 13,2%
Renderização LaTeX31 · 8,7%
Classificação12 · 3,4%
Gabarito errado10 · 2,8%

Duas dessas não são defeito. Substituição integral e Classificação são trabalho planejado: troca deliberada de questão e mudança de taxonomia. Descontando as duas, o acerto sobe de 68,8% para 81%.

03O caso que resume tudo

Sete reescritas em dezesseis minutos, por um caractere.

15 de maio, questão 454. O símbolo de "diferente" não renderizava. O registro fala sozinho:

16:43:31\not=
16:46:35≠ dentro do LaTeX
16:50:15\neq
16:52:25string JSON com \\neq
16:54:12\ne
16:59:16\\neq
16:59:51'x ≠ $\frac{\pi}{2}$'
O segundo caso · questão 305
10 reescritas

Em catorze minutos, todas do mesmo desenho. Nenhuma tocou a matemática. É a questão mais retrabalhada do acervo inteiro.

A solução das 16:59 foi um contorno no dado, e virou regra em todos os prompts seguintes, por sete semanas. Até 04/07, quando uma linha entrou no código e resolveu a causa:

DOMPurify.sanitize(parte.replace(/≠/g, '≠'))

Defeito que reaparece em todo lote é candidato a correção no processo, não a mais uma linha na regra. Levei 50 dias para ver isso.

Evidências · questão id 454, 15/05, 7 comandos em 16 min · correção na causa em 04/07, commit b78b258 · id 305: 10 reescritas em 14 min, 30/04

04O achado central

Três regras pareciam se contradizer. Nenhuma se contradizia.

Ao comparar o que estava escrito com o que o registro guardou, o padrão apareceu, e sempre na mesma direção.

O que a fonte dizia

"Nunca \text{} nas alternativas"

escopo declarado
O que o registro guardou

"Nunca usar \text{}"

escopo perdido

O escopo caiu na transcrição, e a regra passou a proibir o que está em produção. $\text{tg}(x)$ e $\text{sen}(x)$ são uso legítimo: itálico em nome de função é que seria errado.

O que a fonte dizia

"O comando \infty quebra a renderização, use unicode"

"Infinito sempre dentro do LaTeX: $+\infty$"

contextos diferentes
O que o registro guardou

"duas versões contraditórias da mesma regra"

chamado de reversão

As duas frases estão no mesmo arquivo, as duas são instruções minhas. Não se contradizem. Falam de contextos diferentes: fora da fórmula, unicode; dentro, o comando.

Nas três vezes, a regra estava certa. Quem errou foi o registro, e sempre na mesma direção: tornando a regra mais absoluta do que ela era.

Nota de precisão · no terceiro caso (a regra permissiva que levou o gerador a aplicar escape duplo por segurança), o efeito está medido no banco, mas a citação original não pôde ser reconferida: o documento daquela versão não foi preservado. Relato com efeito verificado, não citação.

05A intervenção

Escrevi as regras. Uma sessão, quatro lotes, setenta questões.

O processo tinha cinco etapas e três inspeções, todas depois da peça pronta. Escrevi as regras num só lugar, com escopo obrigatório em cada uma, e produzi um lote novo seguindo o que estava escrito. Cronometrado.

Obsidian
O cofre de regras
11 notas · Obsidian

Cada regra passou a ter quatro campos obrigatórios:

o que éonde valepor quêonde não vale

"Onde vale" é o campo que faltava. Foi a ausência dele que fez três regras certas parecerem contraditórias. É o achado do bloco 04.

Lote 1 · 20 questões
65%
sem documento
Lote 2 · 20 questões
95%
documento v2
Lote 3 · 20 questões
85%
documento v3
Lote 4 · 10 questões
100%
documento v4: o único lote do acervo inteiro sem nenhuma correção
A sessão de 04/08 · bloco equação de 2º grau
Duração1h21, cronometrada
Produzidas70 questões, 4 lotes
Escape de sessão0%, nada ficou para depois
Erro matemático0 em 70
Ids descartados0, com 70 slots para 70 questões
Versões da especificação5, escritas durante a sessão

O gargalo nunca foi gerar a questão. Foi conferir na tela e atualizar o documento: 2 a 3 minutos por versão, cinco vezes.

Evidências · 70 questões, ids 863–932 · vazão 49,0 q/h (histórico: 53,4) · 0,19 correções por questão

06O defeito na tela

É assim que o defeito chega no aluno.

Questão 39: as três alternativas com fórmula aparecem em vermelho como ␌rac{2}{3}; a alternativa D, texto puro, aparece perfeita
O comando de fração escrito com uma barra em vez de duas. O leitor do banco tratou \f como caractere de controle e comeu o começo. A alternativa D, que era texto puro, ficou perfeita. O defeito não é da questão, é do campo.
Questão 45: o cifrão de R$ abriu um delimitador de LaTeX e meia frase do enunciado virou itálico embaralhado
R$ dentro de um texto com fórmula. O cifrão do real abriu um delimitador de LaTeX e engoliu meia frase. Um caractere.
Questão 1 de Frações: enunciado e as quatro alternativas exibem \frac cru, sem renderizar
Esta é de abril e nunca recebeu nenhuma correção. Na minha métrica, ela conta como acerto de primeira. É a imagem que desmonta o próprio indicador.
Depois e antes: à esquerda a questão 42, produzida depois da regra escrita; à direita a questão 36, com comando cru e parábola fora de escala
À esquerda, outra questão do mesmo bloco, produzida depois da regra escrita. À direita, o enunciado com o comando cru e a parábola fora de escala.
O que eu não posso afirmar

A parte mais útil de um levantamento é saber onde ele não alcança.

Não afirmo

Que o processo melhorou. A série oscila e não sobe: 98 · 100 · 69 · 93 · 74 · 84 · 86 · 78 · 86. O lote novo (84%) fica acima da média e abaixo do melhor histórico (93%). Um lote não faz série.

Que lote menor dá melhor resultado. O lote de 210 tem n=1, foi o primeiro grande, e no mesmo dia dois assistentes rodaram em paralelo. Três variáveis confundidas.

Que o log viu tudo. Ele não vê correção feita no código, e não vê defeito interceptado antes de entrar no banco.

O que falta medir

Um segundo lote, no público novo. O lote de 04/08 foi em terreno conhecido; o teste real é o fundamental, onde tudo é novo.

A taxa real de defeito na geração. O log só vê o que sobreviveu às inspeções. No lote novo, um defeito foi corrigido antes de entrar no banco e não aparece em lugar nenhum.

Quanto foi corrigido no código. Dois casos confirmados, nenhum dos dois gerou registro no banco.

Este estudo se corrigiu três vezes, e cada correção derrubou um número que eu já tinha escrito. O primeiro era 68,8% de acerto de primeira, com dois lotes catastróficos e uma boa história de aprendizado. Estava errado, e ficaria de pé se eu não tivesse ido conferir.

É isso que eu quero fazer em operações.

Não tenho anos de fábrica. Tenho um processo real que eu medi com instrumento próprio, e cujos números eu derrubei quando não se sustentaram. Documentar defeito impede que ele volte; mas só se a regra disser onde vale.