No piloto do kit, com critério nível 3 e 14 testes congelados, a execução terminou no primeiro ciclo, em 3 minutos. A maior parte do trabalho de uma execução longa é escrever o critério. Aqui você escreve o seu goal.md de forma que o único jeito de cumprir seja fazer o trabalho.
2Pôr trava: contagem mínima, teste congelado, validador
3Fazer a prova aparecer na saída do /goal
4Testar o critério contra a trapaça mais barata
Objetivo: escrever um goal.md com critérios comando → saída que cubram função, regressão e limite e que não se cumpram por atalho.
01 · Do resultado à prova na tela
Um goal.md bom tem estas cinco partes. Clique em cada uma.
Clique em cada bloco do diagrama para ver o que ele faz.
Função + regressão + limite, cada um com trava, e a prova visível. A escala 0–4 completa é do curso 0; como montar o verificador, do curso 1.
02 · As cinco perguntas do templates/goal.md
Cada "não" derruba o nível do critério.
1. Dá para checar com um comando?
"Deixar bom" e "revisado e limpo" não têm comando. Reescreva até ter um.
Reescritopython3 validar.py && echo OK → OK
2. A resposta é sim ou não?
"Melhorou a performance" é comparação. Fixe o número: "p95 abaixo de 200 ms no benchmark X".
3. É impossível cumprir sem fazer o trabalho?
Procure a trapaça mais barata: apagar teste, página vazia, valor fixo no código. Para cada uma, uma trava: contagem mínima, hash ou git diff dos testes, validador do conteúdo.
Nível 2 → nível 3"0 falhas" vira "0 falhas E ≥ 48 testes E tests/ intocado".
4. A prova aparece na saída?
Para o /goal do Claude, escreva a condição como algo que o agente imprime: "a saída do npm test mostra 0 falhas". "O state.md diz concluído" só vale se o agente mostrar o arquivo.
5. Função, regressão e limite estão cobertos?
Os três, cada um com pelo menos uma linha. E dois testes: um rápido por ciclo (segundos ou minutos) e o completo no final.
03 · O goal.md e os dois prompts de /goal
Exemplo preenchido para uma tarefa pequena (contar palavras). Troque pelo seu.
longrun/[data]-contador-palavras/goal.md
# Goal — contador-palavras
- **Início:** 2026-10-19 09:00 · **Agente:** Claude /goal
- **Tetos:** tempo 2 h · memória 2G
## Resultado
`conta.py` tem conta_palavras(texto) que conta palavras separadas por qualquer espaço.
## Critérios de pronto (verificáveis)
**Função**
- [ ] `python3 -m pytest -q` → `3 passed`, 0 failed (e nunca menos de 3 testes)
**Regressão**
- [ ] `python3 -c "import conta"` → sem erro (o módulo continua importável)
**Limite**
- [ ] `git diff --exit-code -- tests/ pytest.ini` → código 0 (testes congelados)
- [ ] `git diff --stat` → só `conta.py` e a pasta longrun/
**Teste rápido por ciclo**: `python3 -m pytest -q`
**Teste completo no final**: `python3 -m pytest -q`
## Restrições
- só pela assinatura; nenhuma API
- não mexer em: tests/, pytest.ini
## Portões humanos (parar e perguntar)
- qualquer mudança fora de conta.py e da pasta longrun/
Claude Code · /goal (templates/prompt-goal-claude.md)
/goal A saída do terminal mostra <comando de verificação> passando com <resultado esperado>, e longrun/<pasta>/state.md diz "concluído".
Codex · /goal (templates/prompt-goal-codex.md)
/goal
RESULTADO: <resultado final em uma frase>
VERIFICAÇÃO (só termina quando todos passarem):
- <comando> → <saída esperada>
RESTRIÇÕES: <o que não pode>. Uso só pela assinatura; nenhuma API sem autorização.
ESTADO: use longrun/<pasta>/ (goal.md, plan.md, state.md, progress.md, failures.md, decisions.md, canal.md).
Após qualquer compactação ou retomada, releia goal.md, state.md, plan.md e canal.md antes de agir. Registre no canal.md (só acrescentar) fatos, aprendizados, glossário e armadilhas assim que surgirem.
CICLO: analisar → escolher a próxima ação útil → executar → testar → observar → corrigir → atualizar state/progress → commit no checkpoint → continuar.
Enquanto existir uma próxima ação objetiva, segura e alinhada ao objetivo, execute-a sem esperar nova instrução.
3 ciclos sem avanço mensurável = parar, registrar em failures.md e me chamar.
PARE E ME CHAME SÓ SE: gasto de crédito/API, ação irreversível ou externa (push em produção, e-mail, apagar), credencial ausente, decisão de negócio, conflito real entre requisitos.
Exemplo do repositório
Do longrun/2026-10-01-medir-sessao/goal.md do kit, a execução que construiu o medir-sessao.py:
Função
- pytest -q → todos passam (12 rápidos + 2 com sessões reais), 0 falhas, 0 skips
Regressão
- python3 tools/medicao/cx.py | head -1 e cc.py continuam rodando
Limite
- git diff --exit-code -- tests/ pytest.ini → vazio
(testes congelados; hash inicial 3ae1ba7975508cba)
- só criar/alterar tools/medir-sessao.py e a pasta longrun/
Teste rápido por ciclo: pytest -q -m "not real"
Teste completo no final: pytest -q
Resultado: concluído no 1º ciclo (3 min). Verificação independente depois: hash dos testes intacto, sem valores fixos no código, 14 passed reproduzido e uma sessão nunca vista conferida.
Palavras "bom", "limpo", "adequado", "completo".
Depende do agente dizer que terminou.
Só contagem, sem checar o conteúdo (20 páginas vazias passam).
Não diz o que NÃO pode mudar.
A verificação leva horas: o loop não consegue medir avanço a cada ciclo.
Lista do templates/goal.md do kit.
04 · Prática
Use a pasta que você criou na aula 1.
E4 · O goal.md da sua execução
30 min
Preencha o goal.md com resultado, função, regressão, limite, os dois testes, restrições e portões humanos. Antes de qualquer trabalho, rode cada critério no terminal.
Pronto quando: cada critério tem um comando que roda agora; os de função falham antes do trabalho (se já passam, o critério não mede a tarefa) e o de limite já passa: git diff --exit-code -- tests/; echo $? → 0.
E5 · Ataque o próprio critério
20 min
Num branch descartável (git switch -c ataque), faça a trapaça mais barata: apague um teste que falha, ou troque a função por um valor fixo. Rode os critérios de novo e volte com git switch -.
Pronto quando: para cada trapaça, pelo menos um critério falha; apagando teste, git diff --exit-code -- tests/; echo $? → 1.
05 · Teste da aula
Pergunta 1 de 4
O critério é "pytest -q → 0 falhas". Qual trapaça ele deixa passar?competência
Correto
Sem contagem mínima e sem congelar tests/, apagar o teste que falha dá 0 falhas. Nível 3 soma "≥ N testes" e "git diff --exit-code -- tests/ → 0".
Não é essa
Sem contagem mínima e sem congelar tests/, apagar o teste que falha dá 0 falhas. Nível 3 soma "≥ N testes" e "git diff --exit-code -- tests/ → 0".Rever: Do resultado à prova na tela
Pergunta 2 de 4
No /goal do Claude Code, por que a condição tem de aparecer na saída?competência
Correto
A doc do /goal diz que o avaliador julga só o que está na conversa. Por isso a condição é algo que o agente imprime, como a saída do teste.
Não é essa
A doc do /goal diz que o avaliador julga só o que está na conversa. Por isso a condição é algo que o agente imprime, como a saída do teste.Rever: Do resultado à prova na tela
Pergunta 3 de 4
Antes de qualquer trabalho, você rodou o critério de função e ele já passou. O que isso indica?
Correto
Critério de função que passa antes do trabalho não distingue feito de não feito. O de limite, ao contrário, deve passar desde o início.
Não é essa
Critério de função que passa antes do trabalho não distingue feito de não feito. O de limite, ao contrário, deve passar desde o início.Rever: Prática
Pergunta 4 de 4
Qual camada responde "não mexeu onde não devia e não gastou o que não devia"?
Correto
Limite: arquivos congelados, pastas fora do escopo e gasto proibido. É a que fecha o atalho de mexer no próprio juiz.
Não é essa
Limite: arquivos congelados, pastas fora do escopo e gasto proibido. É a que fecha o atalho de mexer no próprio juiz.Rever: Do resultado à prova na tela
Teste concluído
Você acertou {a} de {n}. Acertando todas, a aula é marcada como concluída.
Escolha uma alternativa. A explicação aparece depois da sua tentativa.
06 · Em três frases
Três camadasFunção, regressão e limite, cada uma com um comando e a saída esperada.
Trava em cada umaContagem mínima, testes congelados por git diff ou hash, validador do conteúdo: o atalho tem de falhar.
Prova à vistaO avaliador do /goal do Claude só lê a conversa; o loop headless roda o teste ele mesmo (aula 6).