E1 · Tempo e memória
10 minRode 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.
Aula 7 · 17 min
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
Objetivo: pôr os cinco tetos num loop e decidir, diante de um agente que insiste, entre continuar, parar e chamar o humano.
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.
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.
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.
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.
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.
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.
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.
Rode na sua máquina; nenhum gasta cota. O de memória precisa de Linux com systemd de usuário.
timeout 2 sleep 5; echo "rc=$?"
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=$?"#!/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 python3 -m pytest -q tests/ imprime 48 passed e git diff --stat -- tests/ sai vazio, ou pare depois de 20 turnos
$ 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
Memória só conta quando é usada de verdade. bytearray(300 MB) sozinho reserva páginas zeradas que o sistema ainda não entregou, e o processo passa pelo teto sem morrer. Por isso o teste escreve em cada página. Num agente real, o processo que estoura é o que de fato enche a memória.
Lista do kit execucao-longa (bloco PARE E ME CHAME do prompt de goal). Teto limita quanto; portão limita o quê.
Qualquer chamada paga ou que gasta crédito fora do que foi combinado. O loop para e pergunta.
Push em produção, mensagem para alguém, apagar dados. Não se desfaz com git revert.
Como cercar isso com permissões e hooks é o curso 4.
O agente não deve procurar chave em outro lugar nem contornar. Para e diz o que falta.
Requisitos que se contradizem ou escolha de negócio. O agente apresenta as opções; quem escolhe é você.
Ficção para treinar a decisão. Escolha o que você responderia; o comentário aparece logo depois.
Escolha a sua resposta. O comentário aparece logo depois e a conversa segue conforme a escolha.
Na sua máquina. Nenhum exercício gasta cota.
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.
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.
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.
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
Pergunta 2 de 4
timeout 20m codex exec … terminou com código 124. O que aconteceu?
Pergunta 3 de 4
O agente está dentro de todos os tetos e quer fazer push na branch de produção para terminar a tarefa. O que fazer?competência
Pergunta 4 de 4
Na conversa simulada, por que "aumente o MAX_CICLOS para 30" é a escolha fraca?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.