código aberto · laboratório em infraestrutura própria

O harness inteiro, não só o loop

Um desktop persistente onde agentes autônomos trabalham: ferramentas, sandbox, privilégio, estado durável e observação de kernel. E um laço que sabe parar — inclusive quando entregou sem ter cumprido o pedido.

Trocar de modelo muda pouco. O que decide se um agente funciona é o que ele consegue tocar e o que ele faz até parar. Este repositório é essas duas camadas, construídas e medidas.

136arquivos Go
608testes
90,9%cobertura
7motivos de parada

O modelo é o menor dos três. O laço decide o que ele faz até parar; o harness decide o que ele consegue tocar.

as duas camadas

Um teste separa as duas, e ele é curto

Se dá para corrigir mudando um prompt ou uma condição de parada, é o loop. Se é preciso mudar o que o agente consegue fazer, é harness. Quase todo diagnóstico de agente começa errando esta pergunta.

Harness

o que ele consegue tocar

  • 10 ferramentas: shell, 6 de navegador, take-over, delegação a outro agente de código
  • Sandbox por usuário, com sudo em lista fechada
  • Cofre cifrado — o modelo usa a credencial sem lê-la
  • Estado durável num volume que sobrevive à máquina
  • Forma do erro: falha de ferramenta vira texto no histórico, não derruba a tarefa
  • Observação: OpenTelemetry no laço e eBPF no kernel

Muda recompilando e reinstalando. É o que o agente é capaz de fazer.

Loop

o que ele faz até parar

  • Até 60 iterações por invocação, 180 turnos somando retomadas
  • Detector de laço: 3 falhas idênticas seguidas
  • Teto de custo em dólar, por tarefa
  • Teto de tempo de parede
  • Verificação de conclusão antes de aceitar que terminou
  • Sete motivos de parada, cada um com o que pedir à pessoa

Muda com uma variável de ambiente. É o que o agente faz com o que tem.

loop engineering

Parar não é cumprir

O laço concluía a tarefa quando o modelo parava de chamar ferramentas. Isso mede que ele parou, não que fez o que foi pedido — e a diferença é onde mora o defeito silencioso: a tarefa fica “concluída”, ninguém olha, e o pedido não aconteceu.

chama o modelo até 60 iterações executa ferramentas em série, com teto verifica conclusão com evidência citada cumprido termina devolve a lacuna chama você take-over a lacuna volta ao modelo até 2 vezes; depois, é uma pessoa

A verificação exige evidência citada do histórico: um verificador que pudesse aprovar sem apontar onde aprovaria por inércia.

O sétimo motivo de parada aponta para o lado oposto dos outros

Cinco motivos descrevem o que o site exige — senha, 2FA, CAPTCHA, pagamento, presença humana. O sexto, guardrail, contém quem foi longe demais: laço, custo, turnos, tempo. O sétimo, unverified, marca quem parou cedo demais. Na tela, a pergunta é diferente em cada caso: num vale decidir se continua, no outro é saber o que ficou faltando.

harness engineering

Três pontos de extensão, e escolher o errado custa retrabalho

O mesmo teste da seção anterior decide onde uma capacidade nova entra. A cor de cada linha diz a camada.

O erro comum é uma habilidade que ensina a chamar a API com curl: a credencial passa a viver na linha de comando, ao alcance de quem ela deveria conter.

privilégio

O adversário declarado é o próprio modelo

A máquina não publica nada: só a porta 22 no firewall, com tela, navegador e API em loopback. A pergunta de segurança não é quem entra de fora — é o que o modelo alcança pela ferramenta de shell, que é a função do produto e não um defeito.

UsuárioQuem éAlcança
agentdo serviçoo cofre cifrado, /etc/agentd
agentas ferramentas do modelo/workspace, sudo por lista fechada
rooto operador, por chave que só existe no laptoptudo

observação

Três camadas, porque uma não responde a pergunta inteira

A primeira sabe a intenção e é cega ao que o sistema fez. A segunda sabe o fato e é cega à intenção. Só juntas respondem “o modelo tentou X e a máquina fez Y”.

A camada de kernel é a única que o modelo não desliga por dentro — e mesmo ela cai para quem tem sudo. Por isso a prova de que ela está viva mora fora da máquina: ausência de dado é o sinal.

estado da máquina — medido em 01/09/2026
sistemaNixOS 25.11 · kernel 6.12.93declarativo
volume/workspace · 20 GB · 282 conversasdurável
firewall22/tcp · o resto em 127.0.0.1invariante
agent-probeeBPF · execve + connectsobe no boot
tela 5parou sem cumprir o pedidoprecisa de você

contenção

Todo teto do loop se ajusta sem recompilar

Teto que só muda recompilando é teto desligado. E há um motivo a mais: o teste de contenção precisa forçá-lo, porque pedir ao modelo que falhe produz um teste que passa e reprova alternadamente — medido, com o mesmo prompt em duas rodadas.

VariávelPadrãoO que detém
AGENTD_MAX_TURNS180Turnos acumulados, atravessando retomadas
AGENTD_MAX_TOOL_FAILURES3Falhas idênticas seguidas — é o detector de laço
AGENTD_MAX_COST_USD3.00Inferência por tarefa, em dólar
AGENTD_MAX_VERIFY_ATTEMPTS2Devoluções da lacuna antes de chamar uma pessoa
AGENTD_MAX_CONCURRENT_TASKSTarefas simultâneas na máquina inteira

começar

Do zero à máquina observada

  1. task checkConfere binários, token, chave e latência — antes de gastar
  2. AGENT_OS=nixos task upVolume durável e droplet, sistema declarativo, validação ponta a ponta
  3. task deploy && task vaultInstala o agente por SSH de root e provisiona o cofre cifrado
  4. task obs:upSobe o backend de observação no laptop, com Nix
  5. task probe:deployCompila os objetos BPF e instala o coletor de kernel
  6. task openAbre a tela ao vivo por túnel — nada fica exposto