Ejecución larga|INEMA.CLUB-PRO

Clase 3 · 18 min

Contexto en franjas: 50, 70 y 85% del punto de compactación

El mayor enemigo de una sesión larga es la compactación repetida: el objetivo sobrevive, pero lo que ya está hecho y lo que falta se diluyen. El hook-longrun mide el contexto y actúa antes del límite, en tres franjas. En esta lección activas el hook y provocas las tres franjas en un ensayo, sin gastar un token.

Comenzar la clase
Manómetro industrial con la aguja en la franja intermedia sobre un panel oscuro.

En esta clase vas a

  1. 1Dónde quedan las franjas: ~484, ~677 y ~822 mil tokens
  2. 2Compactación × handoff: qué guarda cada uno
  3. 3Activar el hook en los cinco eventos de Claude Code
  4. 4Ensayar el hook con una transcripción falsa

Objetivo: activar el hook-longrun y provocar las tres franjas en un ensayo, sabiendo qué le pide cada una al agente y cuándo hacer /clear + /prime.

01Las franjas sobre el punto de compactación

El porcentaje es sobre el punto en que Claude Code compacta por tamaño, no sobre la ventana completa.

En las mediciones del 07 al 15/10/2026, ninguna sesión compactó por tamaño: las 93 compactaciones fueron por inactividad (lección 4).

Hook-longrun 1.9.6 (18/10/2026). Las franjas cambian con LONGRUN_FAIXAS="50,70,85". El aviso llega una llamada de herramienta después, porque la transcripción se graba con retraso.

02Compactar, grabar handoff o abrir una sesión nueva

Qué guarda cada camino, medido el 15/10/2026 (17 compactaciones con handoff de la misma sesión en las 3 h anteriores).

1. Compactación

El resumen cita de 20 a 54 archivos y conserva los pasos y comandos recientes. Dentro de la misma sesión, guarda más detalle concreto que el handoff.

Pero no separa lo confirmado de la suposición, mezcla las decisiones en la narrativa y no sobrevive a /clear.

03Activar el hook y ensayar las franjas

El ensayo escribe una transcripción falsa con el número de tokens que quieras y llama al hook como lo llamaría Claude Code.

~/.claude/settings.json · fragmento "hooks" (únelo a los tuyos)
{
  "cleanupPeriodDays": 365,
  "hooks": {
    "PreCompact":       [{ "hooks": [{ "type": "command", "command": "bash ~/projetos/execucao-longa/tools/hook-longrun.sh 2>/dev/null || true", "timeout": 10 }] }],
    "SessionStart":     [{ "matcher": "compact|resume|clear", "hooks": [{ "type": "command", "command": "bash ~/projetos/execucao-longa/tools/hook-longrun.sh 2>/dev/null || true", "timeout": 10 }] }],
    "PostToolUse":      [{ "hooks": [{ "type": "command", "command": "bash ~/projetos/execucao-longa/tools/hook-longrun.sh 2>/dev/null || true", "timeout": 10 }] }],
    "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "bash ~/projetos/execucao-longa/tools/hook-longrun.sh 2>/dev/null || true", "timeout": 10 }] }],
    "Stop":             [{ "hooks": [{ "type": "command", "command": "bash ~/projetos/execucao-longa/tools/hook-longrun.sh 2>/dev/null || true", "timeout": 10 }] }]
  }
}
ensaio-hook.sh · guárdalo en un archivo y ejecútalo con bash
# ensaio-hook.sh — dispara o hook-longrun com uma transcrição FALSA (nenhum token gasto)
# uso: bash ensaio-hook.sh <tokens|-> [minutos-parado] [evento]     ("-" reaproveita a transcrição anterior)
E=/tmp/ensaio-hook; K=~/projetos/execucao-longa
mkdir -p $E/proj/longrun/2026-10-19-teste $E/proj/handoffs/history
[ -f $E/proj/longrun/2026-10-19-teste/state.md ] || echo "# Estado" > $E/proj/longrun/2026-10-19-teste/state.md
[ "${1:-500000}" = "-" ] || python3 - "${1:-500000}" "${2:-0}" > $E/t.jsonl <<'PY'
import json, sys, time, datetime
n, parado = int(sys.argv[1]), float(sys.argv[2])
ts = datetime.datetime.fromtimestamp(time.time() - parado * 60, datetime.timezone.utc).isoformat().replace("+00:00", "Z")
print(json.dumps({"type": "assistant", "timestamp": ts, "message": {"model": "claude-opus-5-5",
      "content": [{"type": "text", "text": "ok"}],
      "usage": {"input_tokens": 10, "cache_read_input_tokens": n - 10, "cache_creation_input_tokens": 0}}}))
PY
echo "{\"hook_event_name\":\"${3:-PostToolUse}\",\"cwd\":\"$E/proj\",\"session_id\":\"ensaio\",\"transcript_path\":\"$E/t.jsonl\",\"prompt\":\"oi\"}" \
  | LONGRUN_ESTADO=$E/estado LONGRUN_AGENDAR_ARQ=$E/agenda.jsonl python3 $K/tools/hook-longrun.py
echo
Terminal · las tres franjas
rm -rf /tmp/ensaio-hook
bash ensaio-hook.sh 500000    # faixa 1
bash ensaio-hook.sh 500000    # mesma faixa: silêncio (uma vez por faixa)
bash ensaio-hook.sh 700000    # faixa 2
bash ensaio-hook.sh 830000    # faixa 3
Ejemplo del repositorio
$ bash ensaio-hook.sh 500000
{"hookSpecificOutput": {"hookEventName": "PostToolUse", "additionalContext":
 "Contexto em 52% do ponto de compactação (500 mil de 967 mil tokens). FAIXA 1 de 3:
 antes de seguir, acrescente em longrun/2026-10-19-teste/canal.md o que você precisaria
 se o histórico sumisse agora (…) Só acrescentar. Depois continue o trabalho normalmente."}}

$ bash ensaio-hook.sh 500000

$ bash ensaio-hook.sh 700000
{… "Contexto em 72% do ponto de compactação (700 mil de 967 mil tokens). FAIXA 2 de 3:
 atualize state.md, progress.md e (…) canal.md; termine a unidade de trabalho atual e
 grave o handoff agora (…)"},
 "systemMessage": "Execução longa em 72% do ponto de compactação: hora de /compact
 (o agente foi avisado)."}

$ bash ensaio-hook.sh 830000
{… "Contexto em 86% do ponto de compactação (830 mil de 967 mil tokens). FAIXA 3 de 3:
 não abra trabalho novo. (…) /session-handoff, sessão nova e /prime (…) ao fim da
 unidade em curso, sem largá-la no meio. (…)"},
 "systemMessage": "Execução longa em 86% do ponto de compactação: hora de
 /session-handoff + sessão nova + /prime."}

Saltos de línea y (…) añadidos para que quepa en la pantalla; el texto es el del hook-longrun 1.9.6. El additionalContext va al agente; el systemMessage te aparece a ti.

04Práctica

El primer ejercicio toca tu settings.json: haz una copia de seguridad antes.

E6 · Hook activado en los cinco eventos

15 min

Copia settings.json a settings.json.bak y une el fragmento de hooks a los que ya tienes (no borres los tuyos). Abre una sesión nueva de Claude Code para cargarlo.

Listo cuando: python3 -c "import json,os;h=json.load(open(os.path.expanduser('~/.claude/settings.json')))['hooks'];print(sorted(e for e,l in h.items() if 'hook-longrun' in json.dumps(l)))" → ['PostToolUse', 'PreCompact', 'SessionStart', 'Stop', 'UserPromptSubmit'].

E7 · Las tres franjas en el ensayo

10 min

Guarda el ensaio-hook.sh y ejecuta la secuencia de las tres franjas. Después borra /tmp/ensaio-hook y ejecuta LONGRUN_TETO=600000 bash ensaio-hook.sh 500000.

Listo cuando: aparecen, en este orden, FAIXA 1 de 3, nada, FAIXA 2 de 3 y FAIXA 3 de 3; con LONGRUN_TETO=600000, 500 mil ya cae en la FAIXA 2 de 3 (83% de 600 mil).

05Prueba de la clase

Pregunta 1 de 4

En un modelo de 1M, ¿en cuántos tokens avisa el hook la franja 2 por defecto?competencia

06En tres frases

Sobre el punto justoLas franjas son 50/70/85% de ~967 mil: canal, luego estado + handoff + /compact, luego nada nuevo y sesión nueva al final.
Los dos juntosLa compactación guarda más detalle; el handoff guarda lo probado, las decisiones y sobrevive a /clear.
Ensaya antesCon una transcripción falsa ves cada aviso del hook sin gastar un token.

Para ir más allá

Clase anteriorPróxima clase