En el piloto del kit, con criterio nivel 3 y 14 pruebas congeladas, la ejecución terminó en el primer ciclo, en 3 minutos. La mayor parte del trabajo de una ejecución larga es escribir el criterio. Aquí escribes tu goal.md de forma que la única manera de cumplirlo sea hacer el trabajo.
2Poner un candado: conteo mínimo, prueba congelada, validador
3Hacer que la prueba aparezca en la salida del /goal
4Probar el criterio contra la trampa más barata
Objetivo: escribir un goal.md con criterios comando → salida que cubran función, regresión y límite y que no se cumplan por atajo.
01 · Del resultado a la prueba en pantalla
Un goal.md bueno tiene estas cinco partes. Toca cada una.
Haz clic en cada bloque del diagrama para ver qué hace.
Función + regresión + límite, cada uno con candado, y la prueba visible. La escala 0–4 completa es del curso 0; cómo montar el verificador, del curso 1.
02 · Las cinco preguntas del templates/goal.md
Cada "no" baja el nivel del criterio.
1. ¿Se puede comprobar con un comando?
"Dejar bien" y "revisado y limpio" no tienen comando. Reescríbelo hasta tener uno.
Reescritopython3 validar.py && echo OK → OK
2. ¿La respuesta es sí o no?
"Mejoró el rendimiento" es una comparación. Fija el número: "p95 por debajo de 200 ms en el benchmark X".
3. ¿Es imposible cumplirlo sin hacer el trabajo?
Busca la trampa más barata: borrar una prueba, una página vacía, un valor fijo en el código. Para cada una, un candado: conteo mínimo, hash o git diff de las pruebas, validador del contenido.
Nivel 2 → nivel 3"0 falhas" se convierte en "0 falhas Y ≥ 48 testes Y tests/ intacto".
4. ¿La prueba aparece en la salida?
Para el /goal de Claude, escribe la condición como algo que el agente imprime: "la salida de npm test muestra 0 falhas". "El state.md dice concluído" solo vale si el agente muestra el archivo.
5. ¿Función, regresión y límite están cubiertos?
Los tres, cada uno con al menos una línea. Y dos pruebas: una rápida por ciclo (segundos o minutos) y la completa al final.
03 · El goal.md y los dos prompts de /goal
Ejemplo completado para una tarea pequeña (contar palabras). Cámbialo por el tuyo.
longrun/[fecha]-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.
Ejemplo del repositorio
Del longrun/2026-10-01-medir-sessao/goal.md del kit, la ejecución que construyó el 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: terminado en el 1.er ciclo (3 min). Verificación independiente después: hash de las pruebas intacto, sin valores fijos en el código, 14 passed reproducido y una sesión nunca vista comprobada.
Palabras como "bueno", "limpio", "adecuado", "completo".
Depende de que el agente diga que terminó.
Solo conteo, sin revisar el contenido (20 páginas vacías pasan).
No dice qué NO puede cambiar.
La verificación tarda horas: el loop no puede medir el avance en cada ciclo.
Lista del templates/goal.md del kit.
04 · Práctica
Usa la carpeta que creaste en la clase 1.
E4 · El goal.md de tu ejecución
30 min
Completa el goal.md con resultado, función, regresión, límite, las dos pruebas, restricciones y puertas humanas. Antes de cualquier trabajo, ejecuta cada criterio en la terminal.
Listo cuando: cada criterio tiene un comando que se ejecuta ahora; los de función fallan antes del trabajo (si ya pasan, el criterio no mide la tarea) y el de límite ya pasa: git diff --exit-code -- tests/; echo $? → 0.
E5 · Ataca tu propio criterio
20 min
En un branch descartable (git switch -c ataque), haz la trampa más barata: borra una prueba que falla, o cambia la función por un valor fijo. Ejecuta los criterios de nuevo y vuelve con git switch -.
Listo cuando: para cada trampa, al menos un criterio falla; al borrar una prueba, git diff --exit-code -- tests/; echo $? → 1.
05 · Prueba de la clase
Pregunta 1 de 4
El criterio es "pytest -q → 0 falhas". ¿Qué trampa deja pasar?competencia
Correcto
Sin conteo mínimo y sin congelar tests/, borrar la prueba que falla da 0 fallas. El nivel 3 suma "≥ N testes" y "git diff --exit-code -- tests/ → 0".
No es esa
Sin conteo mínimo y sin congelar tests/, borrar la prueba que falla da 0 fallas. El nivel 3 suma "≥ N testes" y "git diff --exit-code -- tests/ → 0".Repasar: Del resultado a la prueba en pantalla
Pregunta 2 de 4
En el /goal de Claude Code, ¿por qué la condición tiene que aparecer en la salida?competencia
Correcto
La documentación de /goal dice que el evaluador juzga solo lo que está en la conversación. Por eso la condición es algo que el agente imprime, como la salida de la prueba.
No es esa
La documentación de /goal dice que el evaluador juzga solo lo que está en la conversación. Por eso la condición es algo que el agente imprime, como la salida de la prueba.Repasar: Del resultado a la prueba en pantalla
Pregunta 3 de 4
Antes de cualquier trabajo, ejecutaste el criterio de función y ya pasó. ¿Qué indica eso?
Correcto
Un criterio de función que pasa antes del trabajo no distingue lo hecho de lo no hecho. El de límite, al contrario, debe pasar desde el inicio.
No es esa
Un criterio de función que pasa antes del trabajo no distingue lo hecho de lo no hecho. El de límite, al contrario, debe pasar desde el inicio.Repasar: Práctica
Pregunta 4 de 4
¿Qué capa responde "no tocó donde no debía y no gastó lo que no debía"?
Correcto
Límite: archivos congelados, carpetas fuera del alcance y gasto prohibido. Es la que cierra el atajo de tocar el propio juez.