E10 · O lote no ensaio
10 minRode os dois blocos de ensaio.
Pronto quando: o primeiro mostra approval_due=true e requested=true; o segundo termina com check: 0, check: 1 (depois de mudar serve.sh) e check: 0.
Aula 4 · 20 min
O outro lado do loop que aprende não é número: é a lição que o agente tira de um erro. Escrita direto no CLAUDE.md, ela só cresce, ninguém decide nem revisa. Nesta aula você usa o SIL Loop R: ocorrência, proposta, aprovação em lote com decisão explícita e revisão automática quando o arquivo da regra muda.
Começar a aula
Objetivo: registrar ocorrência e proposta no SIL Loop R, aprovar em lote com decisão explícita e reabrir a regra quando o arquivo vigiado muda.
sil.py 1.1.0, SQLite local na pasta .sil do projeto. Nenhum comando envia mensagem nem chama modelo. Clique em cada bloco.
Fonte: sil-loop-r/skills/sil-loop-r/SKILL.md e sil.py --help (v1.1.0, commit 63746bd, 05/10/2026).
Projeto de ensaio em /tmp. O j só imprime os campos do JSON que o sil.py devolve.
SIL=~/projetos/sil-loop-r/sil.py # git clone https://github.com/inematds/sil-loop-r ~/projetos/sil-loop-r
E=${TMPDIR:-/tmp}/ensaio-aprende/a4; rm -rf $E; mkdir -p $E/p; cd $E/p && git init -q
echo 'python3 -m http.server 8000' > serve.sh
s() { python3 $SIL --project $E/p "$@"; }
j() { python3 -c 'import json,sys; d=json.load(sys.stdin); print(*[k+"="+json.dumps(d.get(k),ensure_ascii=False) for k in sys.argv[1:]])' "$@"; }
s init | j version; s config --approval-batch 2 | j approval_batch
s occurrence --title "porta ocupada" --evidence "teste HTTP falhou: address already in use" \
--cause "servidor de outra sessão na mesma porta" --correction "checar a porta antes" | j id
s lesson --occurrence O0001 --proposal "checar a porta antes de subir servidor" --scope "testes HTTP" --watch serve.sh | j id status
s occurrence --title "push no remoto errado" --evidence "git push foi para origin, não para o remoto da conta" | j id
s lesson --occurrence O0002 --proposal "conferir git remote -v antes do push" --scope "publicação" | j id status
echo "## fim da tarefa: chegou a hora do lote?"; s status | j approval_due approval_reasons
s request | j requestedversion="1.1.0" approval_batch=2 id="O0001" id="L0001" status="proposed" id="O0002" id="L0002" status="proposed" ## fim da tarefa: chegou a hora do lote? approval_due=true approval_reasons=["lote de novas propostas"] requested=true
Com o lote em 2, a segunda proposta liga approval_due. Daqui em diante, o agente mostra à pessoa ID, proposta, evidência, escopo e decisão sugerida, e espera.
Continua o bloco anterior. Uma proposta adotada, outra em teste por 14 dias; depois, o arquivo vigiado muda.
SIL=~/projetos/sil-loop-r/sil.py
E=${TMPDIR:-/tmp}/ensaio-aprende/a4; cd $E/p # continua o bloco anterior
s() { python3 $SIL --project $E/p "$@"; }
j() { python3 -c 'import json,sys; d=json.load(sys.stdin); print(*[k+"="+json.dumps(d.get(k),ensure_ascii=False) for k in sys.argv[1:]])' "$@"; }
ATE=$(python3 -c 'import datetime; print(datetime.date.today() + datetime.timedelta(days=14))')
s decide L0001 adopt --approved-by "Seu Nome" --reason "falhou duas vezes; correção comprovada" | j status rule
s decide L0002 trial --until $ATE --criterion "nenhum push no remoto errado em 14 dias" \
--approved-by "Seu Nome" --reason "uma ocorrência só" | j status
s check > /dev/null; echo "check: $?"
echo "## o arquivo vigiado mudou"; echo 'python3 -m http.server 8080' > serve.sh
s check | j reviews; s check > /dev/null; echo "check: $?"
s review R0001 keep --approved-by "Seu Nome" --reason "a porta mudou; a regra continua valendo" | j status
s check > /dev/null; echo "check: $?"status="adopted" rule="R0001"
status="trial"
check: 0
## o arquivo vigiado mudou
reviews=[{"id": "R0001", "reasons": ["arquivo alterado: serve.sh"]}]
check: 1
status="active"
check: 0check sai 0 sem pendência, 1 com pendência (aqui, a revisão) e 2 em erro. Saída 0 não prova que as regras são verdadeiras; só que não há nada vencido.
Teste com data passada: decide L0002 trial --until 2026-10-01 responde {"error": "Teste e adiamento exigem data futura."} (capturado em 19/10/2026). Por isso o bloco calcula a data com Python.
O INEMA usa LESSONS.md, FALHAS.md e LIMITES.md no projeto wifi (o hub de monitoramento). Só contagens; nenhuma linha dos arquivos aparece aqui.
A análise sil-melhoramento/ANALISE.md contou 37 lições no CLAUDE.md do wifi, 101 linhas no FALHAS.md e 255 no LIMITES.md, 49 ainda "aberto".
Conclusão dela: 100% degrau "prosa", sem triagem, sem ID, sem citação e sem poda. A lição sobre porta ocupada tinha sido escrita três vezes em datas diferentes.
O contar-licoes.py, rodado na pasta do wifi: 164 lições no LESSONS.md (9 marcadas como repetidas, nenhuma com ID), 167 falhas e 424 limites, 115 ainda "aberto".
Em 14 dias os abertos mais que dobraram. É o que acontece quando a lição entra sem decisão e sem data de revisão.
Das recomendações da análise, só a promoção no SIL foi feita (v1.1.0, 05/10). As outras (hook de portas, relógio no LIMITES, IDs nas lições, sonda pós-tradução) seguem como proposta.
O SIL ainda não foi iniciado no wifi: o caso serve de diagnóstico, não de vitrine.
Rode na pasta do seu projeto. O script só conta linhas e marcas; não imprime conteúdo.
K=~/projetos/loop-r-eng-aprende-v72/kit cd ~/projetos/<seu-projeto> # a pasta onde ficam o seu CLAUDE.md/AGENTS.md e as suas lições python3 $K/contar-licoes.py .
CLAUDE.md: 82 linhas, 19 lições na seção Lessons AGENTS.md: 10 linhas, 0 lições na seção Lessons LESSONS.md: 164 lições · 9 marcadas como repetidas · 0 com ID FALHAS.md: 167 falhas · 90 prompt · 85 infra (as duas contam quando a linha diz as duas) LIMITES.md: 424 limites · 115 ainda 'aberto' SIL Loop R: não iniciado nesta pasta degrau: prosa — sem decisão registrada, sem data de revisão, sem citação
As colunas prompt e infra somam mais que o total porque 8 linhas dizem as duas.
Ensaio, depois o seu projeto.
Rode os dois blocos de ensaio.
Pronto quando: o primeiro mostra approval_due=true e requested=true; o segundo termina com check: 0, check: 1 (depois de mudar serve.sh) e check: 0.
Rode o contar-licoes.py no seu projeto e anote quantas lições existem, quantas repetidas e se há alguma com ID ou data de revisão.
Pronto quando: python3 $K/contar-licoes.py . imprime a linha SIL Loop R: e pelo menos uma linha de contagem.
Inicie o SIL no seu projeto, pegue as três lições que mais se repetem e registre cada uma como ocorrência + proposta, com --watch no arquivo que a regra protege. Quando o lote ligar, decida você mesmo, com motivo.
Pronto quando: python3 $SIL --project . export | python3 -c 'import json,sys; print(len(json.load(sys.stdin)["rules"]))' → pelo menos 1, e python3 $SIL --project . check; echo $? → 0.
Pergunta 1 de 5
O lote de aprovação chegou e a pessoa não respondeu. O que o agente faz?competência
Pergunta 2 de 5
Qual destes faz uma regra ativa voltar para revisão no SIL?competência
Pergunta 3 de 5
O que um teste (trial) exige que a adoção não exige?
Pergunta 4 de 5
O check saiu com 0. O que isso garante?
Pergunta 5 de 5
No caso do wifi, o que mostra que lição em prosa sozinha não fecha o loop?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.