Base: anatomia do loop|INEMA.CLUB-PRO

Aula 7 · 17 min

Tetos e parada: turnos, tempo, memória, estagnação e custo

Critério bom garante que o loop não sai antes da hora; não garante que ele saia. Objetivo impossível, agente preso no mesmo erro, processo que come a memória da máquina: só um teto para. Nesta aula você conhece os cinco tetos, vê cada um parar um processo de verdade e treina a decisão mais difícil: quando o agente pede só mais uma tentativa.

Começar a aula
Painel industrial com temporizador, botão vermelho de emergência, módulo de memória e um mostrador no limite.

Nesta aula você vai

  1. 1Turnos, tempo, memória, estagnação e custo
  2. 2timeout, MemoryMax e contagem de ciclos sem avanço, rodando
  3. 3O que sempre pede humano, mesmo dentro do teto
  4. 4Uma conversa simulada com um agente que quer continuar

Objetivo: pôr os cinco tetos num loop e decidir, diante de um agente que insiste, entre continuar, parar e chamar o humano.

01Cinco tetos em volta do ciclo

Clique em cada teto: o que ele limita e onde ele já existe nas ferramentas.

Role a página: cada etapa abaixo acende a sua parte do diagrama.

  1. 1/6

    Turnos

    A doc do /goal manda incluir um teto na própria condição, como "ou pare depois de 20 turnos"; e o Claude Code já para o goal se o agente responde vários turnos seguidos sem usar ferramenta. No seu laço, é uma variável: MAX_CICLOS. O /loop tem o dele: tarefa recorrente expira em 7 dias.

  2. 2/6

    Tempo

    Um ciclo que travou (esperando entrada, num laço infinito, num servidor que não sobe) segura o loop inteiro. O timeout do coreutils mata o comando depois do prazo e devolve 124, e o laço trata como ciclo falho.

  3. 3/6

    Memória

    Agente que sobe processo pesado pode travar a máquina inteira. No Linux, systemd-run --user --scope com MemoryMax põe um teto no processo e nos filhos dele: passou, o kernel mata só ele (código 137). É o que o kit execucao-longa usa em todo ciclo.

  4. 4/6

    Estagnação

    O teto que mais economiza. Mede um número a cada ciclo (testes passando, itens com passes) e conta quantos ciclos seguidos ele não subiu. A regra do kit execucao-longa: 3 ciclos sem avanço mensurável = parar, registrar em failures.md e chamar você. Também é sinal de contexto degradado: o mesmo plano repetido sem fechar, item já feito reaberto.

  5. 5/6

    Custo

    Tokens são cota (na assinatura) ou dinheiro (na API). No LOOP-R o teto de custo por ciclo é uma das cinco respostas obrigatórias da ficha, e o Guardião interrompe o ciclo quando atinge; a primeira métrica do Meta-agente é o custo por hipótese promovida. Sem teto, o loop pode custar mais do que o ganho que persegue.

  6. 6/6

    Duas portas de saída

    A porta boa é o critério de pronto passando. A porta de segurança é qualquer um dos cinco tetos. Um loop que só tem a primeira depende de o objetivo ser possível e de o agente nunca empacar.

Conceito aqui; a implementação headless com todos os tetos juntos (loop-longrun.sh, flock, systemd) é a aula 6 do curso 2.

02Três tetos parando processos de verdade

Rode na sua máquina; nenhum gasta cota. O de memória precisa de Linux com systemd de usuário.

Terminal · tempo
timeout 2 sleep 5; echo "rc=$?"
Terminal · memória (Linux, systemd de usuário)
systemd-run --user --scope -q -p MemoryMax=50M -p MemorySwapMax=0 \
  python3 -c "x=bytearray(300*1024*1024); x[::4096]=b'1'*len(x[::4096]); print('alocou')"
echo "rc=$?"
estagnacao.sh · ciclos sem avanço
#!/usr/bin/env bash
# Teto de estagnação: N ciclos seguidos sem o número de testes passando subir = parar.
set -u
ESTAGNACAO=3; MAX_CICLOS=10
medir() { cat passando.txt; }          # no loop real: o teste rápido, ex. pytest -q | grep -oE '[0-9]+ passed'
melhor=$(medir); sem_avanco=0
for ((i = 1; i <= MAX_CICLOS; i++)); do
  # ação do agente aqui (timeout + MemoryMax em volta)
  agora=$(medir)
  if [ "$agora" -gt "$melhor" ]; then melhor=$agora; sem_avanco=0; else sem_avanco=$((sem_avanco + 1)); fi
  echo "ciclo $i: $agora passando (melhor $melhor, sem avanço $sem_avanco)"
  if [ "$sem_avanco" -ge "$ESTAGNACAO" ]; then echo "PARADO: $ESTAGNACAO ciclos sem avanço"; exit 2; fi
done
echo "PARADO: teto de $MAX_CICLOS ciclos"; exit 2
/goal · teto de turnos na própria condição
/goal python3 -m pytest -q tests/ imprime 48 passed e git diff --stat -- tests/ sai vazio, ou pare depois de 20 turnos
Exemplo do repositório
$ timeout 2 sleep 5; echo "rc=$?"
rc=124

$ systemd-run --user --scope -q -p MemoryMax=50M -p MemorySwapMax=0 python3 -c "..."
Killed
rc=137

$ echo 41 > passando.txt; bash estagnacao.sh; echo "rc=$?"
ciclo 1: 41 passando (melhor 41, sem avanço 1)
ciclo 2: 41 passando (melhor 41, sem avanço 2)
ciclo 3: 41 passando (melhor 41, sem avanço 3)
PARADO: 3 ciclos sem avanço
rc=2

03O que pede humano mesmo dentro do teto

Lista do kit execucao-longa (bloco PARE E ME CHAME do prompt de goal). Teto limita quanto; portão limita o quê.

1. Gasto

Qualquer chamada paga ou que gasta crédito fora do que foi combinado. O loop para e pergunta.

04Conversa simulada: o agente quer só mais uma tentativa

Ficção para treinar a decisão. Escolha o que você responderia; o comentário aparece logo depois.

Agente em loop (simulado)ciclo 9 de 15 · migrar o parser

Escolha a sua resposta. O comentário aparece logo depois e a conversa segue conforme a escolha.

    05Prática

    Na sua máquina. Nenhum exercício gasta cota.

    E1 · Tempo e memória

    10 min

    Rode os dois primeiros blocos: o timeout e o teto de memória. Se não está no Linux, rode só o timeout (no macOS, gtimeout do coreutils).

    Pronto quando: O timeout imprime rc=124; o de memória imprime Killed e rc=137.

    E2 · Estagnação e avanço

    10 min

    Rode o estagnacao.sh com 41 em passando.txt. Depois, numa segunda janela, troque o número para 42 enquanto ele roda com um sleep 5 dentro do laço, e veja o contador zerar.

    Pronto quando: Sem mudança: PARADO: 3 ciclos sem avanço e rc=2. Com a troca: aparece uma linha com melhor 42, sem avanço 0.

    E3 · Os tetos do seu próximo loop

    10 min

    Num arquivo tetos.md, escreva o valor de cada teto para um loop seu e o que sempre vai pedir você, uma linha para cada: turnos:, tempo:, memória:, estagnação:, custo: e humano:.

    Pronto quando: grep -cE '^(turnos|tempo|memória|estagnação|custo|humano):' tetos.md → 6, e a linha de estagnação tem um número de ciclos.

    06Teste da aula

    Pergunta 1 de 4

    O loop tem MAX_CICLOS=50 e critério nível 3. Os testes estão em 41 de 48 há 4 ciclos. Qual teto deveria ter parado?competência

    07Em três frases

    Cinco tetosTurnos, tempo, memória, estagnação e custo: cada um pega um jeito diferente de o loop não terminar.
    Estagnação primeiro3 ciclos sem avanço medido = parar, registrar e chamar você; não se negocia.
    Teto não é portãoGasto, ação irreversível ou externa, credencial ausente e decisão de negócio sempre pedem humano.

    Para ir além

    Aula anteriorPróxima aula