Execução Longa|INEMA.CLUB-PRO

Aula 3 · 18 min

Contexto em faixas: 50, 70 e 85% do ponto de compactação

O maior inimigo de uma sessão longa é a compactação repetida: o objetivo sobrevive, mas o que está feito e o que falta se diluem. O hook-longrun mede o contexto e age antes do limite, em três faixas. Nesta aula você liga o hook e provoca as três faixas num ensaio, sem gastar um token.

Começar a aula
Manômetro industrial com o ponteiro na faixa intermediária sobre painel escuro.

Nesta aula você vai

  1. 1Onde ficam as faixas: ~484, ~677 e ~822 mil tokens
  2. 2Compactação × handoff: o que cada um guarda
  3. 3Ligar o hook nos cinco eventos do Claude Code
  4. 4Ensaiar o hook com uma transcrição falsa

Objetivo: ligar o hook-longrun e provocar as três faixas num ensaio, sabendo o que cada uma pede ao agente e quando fazer /clear + /prime.

01As faixas sobre o ponto de compactação

A porcentagem é sobre o ponto em que o Claude Code compacta por tamanho, não sobre a janela inteira.

Nas medições de 07 a 15/10/2026, nenhuma sessão compactou por tamanho: as 93 compactações foram por ociosidade (aula 4).

Hook-longrun 1.9.6 (18/10/2026). As faixas mudam com LONGRUN_FAIXAS="50,70,85". O aviso chega uma chamada de ferramenta depois, porque a transcrição é gravada com atraso.

02Compactar, gravar handoff ou abrir sessão nova

O que cada caminho guarda, medido em 15/10/2026 (17 compactações com handoff da mesma sessão nas 3 h antes).

1. Compactação

O resumo cita de 20 a 54 arquivos e preserva passos e comandos recentes. Dentro da mesma sessão, guarda mais detalhe concreto que o handoff.

Mas não separa o confirmado do palpite, mistura as decisões na narrativa e não sobrevive a /clear.

03Ligar o hook e ensaiar as faixas

O ensaio escreve uma transcrição falsa com o número de tokens que você quiser e chama o hook como o Claude Code chamaria.

~/.claude/settings.json · trecho "hooks" (junte aos seus)
{
  "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 · salve num arquivo e rode com 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 · as três faixas
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
Exemplo do repositório
$ 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."}

Quebras de linha e (…) acrescentados para caber na tela; o texto é o do hook-longrun 1.9.6. O additionalContext vai para o agente; o systemMessage aparece para você.

04Prática

O primeiro exercício mexe no seu settings.json: faça um backup antes.

E6 · Hook ligado nos cinco eventos

15 min

Copie o settings.json para settings.json.bak e junte o trecho de hooks aos que você já tem (não apague os seus). Abra uma sessão nova do Claude Code para carregar.

Pronto quando: 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 · As três faixas no ensaio

10 min

Salve o ensaio-hook.sh e rode a sequência das três faixas. Depois apague /tmp/ensaio-hook e rode LONGRUN_TETO=600000 bash ensaio-hook.sh 500000.

Pronto quando: aparecem, nesta ordem, FAIXA 1 de 3, nada, FAIXA 2 de 3 e FAIXA 3 de 3; com LONGRUN_TETO=600000, 500 mil já cai na FAIXA 2 de 3 (83% de 600 mil).

05Teste da aula

Pergunta 1 de 4

Num modelo de 1M, em quantos tokens o hook avisa a faixa 2 por padrão?competência

06Em três frases

Sobre o ponto certoAs faixas são 50/70/85% de ~967 mil: canal, depois estado + handoff + /compact, depois nada novo e sessão nova ao fim.
Os dois juntosA compactação guarda mais detalhe; o handoff guarda o provado, as decisões e sobrevive a /clear.
Ensaie antesCom uma transcrição falsa você vê cada aviso do hook sem gastar um token.

Para ir além

Aula anteriorPróxima aula