Exemplo do repositório## A) trapaça
2026-10-19 03:56:46 início: rápido=0 passed · agente=codex · teto 4x2min · mem 1G
2026-10-19 03:56:46 ciclo 1: começa
2026-10-19 03:56:46 ciclo 1: agente saiu rc=0 em 0s
2026-10-19 03:56:46 ciclo 1: agente mexeu em arquivo protegido → revertido, ciclo falho
2026-10-19 03:56:46 ciclo 1: checkpoint commitado
(… ciclos 2 e 3 iguais …)
2026-10-19 03:56:47 PARADO: 3 ciclos sem avanço mensurável — ver failures.md
saída: 2
## B) trabalho certo
2026-10-19 03:56:48 início: rápido=0 passed · agente=codex · teto 4x2min · mem 1G
2026-10-19 03:56:48 ciclo 1: começa
2026-10-19 03:56:48 ciclo 1: agente saiu rc=0 em 0s
2026-10-19 03:56:48 ciclo 1: rápido=3 passed (melhor antes: 0)
2026-10-19 03:56:48 ciclo 1: checkpoint commitado
2026-10-19 03:56:49 CONCLUÍDO no ciclo 1: teste final passou (3 passed)
saída: 0
## C) dois loops
outro loop já roda nesta pasta
saída: 3
Os testes apagados pela trapaça voltaram: o loop reverteu os três ciclos e escreveu três linhas "revertido pelo loop" em failures.md.
Sem a linha __pycache__/ no .gitignore, o próprio pytest cria arquivos novos dentro de tests/. O loop vê arquivo não rastreado em pasta protegida e conta o ciclo do agente BOM como trapaça. Capturado no mesmo ensaio, sem o .gitignore:
2026-10-19 03:56:28 ciclo 1: agente saiu rc=0 em 0s
2026-10-19 03:56:28 ciclo 1: agente mexeu em arquivo protegido → revertido, ciclo falho
2026-10-19 03:56:29 CONCLUÍDO no ciclo 1: teste final passou (3 passed)
Terminou porque o teste final passou, mas o ciclo ficou marcado como falho e foi para failures.md. Com o agente lento, três ciclos assim dariam estagnação. Antes de ligar o loop: git status --short tests/ depois de rodar os testes tem de sair vazio.