TuBrief
구독 채널
비디오
커뮤니티

Corrigindo erros ao executar agentes de IA de código aberto no seu computador

TuBrief 편집팀
2026년 9월 11일
0
Computing/Software

원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.

Português한국어EnglishEspañolहिन्दीDeutsch中文العربيةFrançaisРусскийBahasa Indonesia日本語

관련 영상

10 Novos Repositórios do GitHub que Todo Usuário do Claude Precisa Usar13:58

10 Novos Repositórios do GitHub que Todo Usuário do Claude Precisa Usar

Chase AI

커뮤니티의 다른 글

사내 시스템에 llm api 붙일 때 마주하는 현실적인 한계와 대응법

2026년 9월 13일

레거시 백엔드에 GPT-6 Astra 붙일 때 예산 승인과 보안 통과를 먼저 끝내는 법이 있습니다

2026년 9월 13일

에이전트끼리 대화하다 6천만 원 청구서가 나오는 이유

2026년 9월 13일

사내 RAG 벡터 검색에 Okta 권한 필터를 직접 거는 방법

2026년 9월 13일

브라우저 에이전트에게 내 구글 계정을 통째로 넘기면 안 되는 이유

2026년 9월 12일

Apple Won the AI Race

2026년 9월 12일

댓글 (0)

Log in to leave a comment

아직 작성된 글이 없습니다

© 2026 . All rights reserved.

TuBrief
구독 채널
비디오
커뮤니티
로그인

Corrigindo erros ao executar agentes de IA de código aberto no seu computador

Os tutoriais do YouTube fazem parecer que basta pegar uma ferramenta de IA de código aberta com milhares de estrelas no GitHub, digitar alguns comandos e ela funciona magicamente. Na prática, ao abrir o terminal e clonar o repositório, começam a pipocar telas de erro, desde conflitos de binários C++ até dependências de pacotes corrompidas. O motivo pelo qual um desenvolvedor júnior com menos de um ano de experiência trava nessa etapa é que ele despeja ferramentas em todo o sistema sem isolar o ambiente do Python e o runtime. Antes de ajustar os comandos de prompt, é preciso configurar o isolamento de processos locais e o roteamento de proxy para parar de perder noites inteiras de trabalho.

Como evitar falhas de compilação logo após clonar o repositório do GitHub

Projetos de IA de código aberto misturam bibliotecas Python atreladas a ferramentas de compilação C++ com pacotes Node.js que exigem bindings nativos. Se você os instalar acidentalmente no ambiente global, o runtime do Python emitirá erros de link de símbolos, como ImportError: dynamic module does not define module export function. No caso do OmniRoute, um proxy baseado em Node.js, o campo engines no arquivo package.json especifica o Node 22 e o Node 24~26, fazendo com que ele falhe imediatamente na inicialização se executado na versão ímpar Node 23.

Para evitar erros de compilação iniciais, você deve criar um ambiente virtual e instalar os pacotes com base no arquivo de bloqueio de dependências.

`bash

1. Criar ambiente virtual Python e atualizar ferramentas de build

python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip setuptools wheel

2. Instalar dependências com base no arquivo de lock

if [ -f "poetry.lock" ]; then
poetry install --no-root
elif [ -f "requirements.txt" ]; then
pip install --no-cache-dir -r requirements.txt
fi

3. Verificar e instalar a versão do runtime Node.js

node -v # Confirmar v22.x LTS
pnpm install --frozen-lockfile

`

Mesmo ao copiar o arquivo .env.example e preencher o .env manualmente, pequenos erros de digitação causam falhas de parsing. O runtime de agentes de código aberto DeepSeek Harness (dsh) separa o arquivo de configuração geral (settings.yaml) do arquivo de chave de autenticação de API real (~/.dsh/.credentials.yaml). Inserir a chave no local errado ou escrever a sintaxe de caminho incorretamente fará com que o agente não funcione.

Variável de Ambiente Exemplo de Entrada Correta Causa do Erro e Como Resolver
OPENAI_API_BASE http://localhost:20128/v1 Adicionar uma barra (/) no final do endereço causa erros de roteamento 404; remova a barra
ANTHROPIC_API_KEY sk-ant-api03-... O uso de aspas desnecessárias ("") no .env do Docker causa falha de autenticação; remova as aspas
DSH_HOME /home/developer/.dsh O uso do caractere til (~) causa erros de permissão de caminho; especifique o caminho absoluto
SECRET_KEY Valor hexadecimal de 32 bytes Deixar o valor vazio causa falha de inicialização de sessão; gere com openssl rand -hex 32

Em vez de tentar analisar logs de erro longos que se estendem por todo o terminal, resolva os erros de construção de agentes de IA locais focando no símbolo mais profundo no final da pilha. Quando um projeto de IA de código aberto com dezenas de milhares de estrelas no GitHub é clonado e o primeiro comando de execução é inserido, a tela fica completamente coberta por logs de erro vermelhos. Os apresentadores de vídeos tutoriais levantam demos perfeitamente com um único Enter, mas tudo o que sobra no seu terminal são falhas de compilação C++ e conflitos de tempo de execução. O problema não é a inteligência do modelo, mas sim conflitos de binários C do Python, poluição do ambiente global e estruturas amarradas a um único endpoint de API de alto custo.

Abaixo, detalhamos procedimentos específicos de configuração para eliminar os gargalos de configuração que desenvolvedores júnior com 1 ano de experiência enfrentam ao executar agentes de IA localmente, além de reduzir custos de API por meio do roteamento de múltiplos modelos.

Primeiro, impeça conflitos de tempo de execução logo após clonar o repositório

Projetos de IA de código aberto combinam pacotes Python contendo bibliotecas nativas em C++ com ferramentas Node.js que exigem vinculações nativas. A instalação descuidada em um ambiente global do sistema corrompe os links simbólicos de bibliotecas, resultando em erros irritantes como ImportError: dynamic module does not define module export function.

O OmniRoute, um gateway baseado em Node.js, possui restrições de tempo de execução ainda mais rígidas. O campo engines no arquivo package.json especifica apenas o Node 22 e versões 24 ou superiores, bloqueando imediatamente a execução se você tentar fazer o bootstrap em um ambiente Node 23 (versão ímpar). Para reduzir esforço desperdiçado, comece concluindo o isolamento do tempo de execução e a sincronização do arquivo de bloqueio de pacotes.

`bash

Crie um ambiente virtual Python e atualize primeiro as ferramentas de roda de build

python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip setuptools wheel

Instale as dependências com base no arquivo de bloqueio do gerenciador de pacotes

if [ -f "poetry.lock" ]; then
poetry install --no-root
elif [ -f "requirements.txt" ]; then
pip install --no-cache-dir -r requirements.txt
fi

Verifique a versão do runtime Node.js e instale com base no arquivo de bloqueio

node -v # Verifique se pertence à família v22 LTS
pnpm install --frozen-lockfile

`

A configuração do arquivo de variáveis de ambiente (.env) também costuma gerar problemas. O DeepSeek Harness (dsh) separa fisicamente o arquivo de configuração (settings.yaml) da chave real de autenticação de API (~/.dsh/.credentials.yaml). Isso visa evitar o erro acidental de commitar chaves no repositório.

Nome da Variável de Ambiente Formato Padrão e Exemplo de Valor Principal Causa de Falha e Medida Preventiva
OPENAI_API_BASE http://localhost:20128/v1 Falhas de chamada 404 de endpoint devido à duplicação ou omissão da barra final (/)
ANTHROPIC_API_KEY sk-ant-api03-... Quebra de string causada pela inserção de aspas desnecessárias no .env do Docker
DSH_HOME /home/developer/.dsh Criação de diretório anormal e erros de permissão causados pelo uso de caminhos relativos com til (~)
SECRET_KEY String hexadecimal de 32 bytes Falha de criptografia de sessão devido a campo vazio deixado sem preenchimento (gere com openssl rand -hex 32)

Se a execução travar, em vez de olhar para os logs longos na parte superior da tela do terminal, você deve verificar os símbolos na parte mais inferior do erro. Extraia os códigos de erro executando grep -Ein "(error|exception|errno|fatal)" runtime.log | tail -n 15 no terminal e, em seguida, consulte problemas fechados usando o GitHub CLI com gh issue list -R deepseek-ai/deepseek-harness --search "EADDRINUSE is:closed" para reduzir drasticamente o tempo gasto depurando.

Configurações do DeepSeek Harness e Omarchy OS

O DeepSeek Harness é um runtime que monta adaptadores de modelo e ferramentas em plugins independentes baseados no framework Cordis. O Omarchy OS, liderado por David Heinemeier Hansson (DHH) do Basecamp, usa QuickShell e snapshots Btrfs para restaurar o ambiente de desenvolvimento em cerca de 1 minuto e 30 segundos. O uso dessa combinação economiza meio dia perdido ajustando instalações.

Escrevendo prompts de sistema que preservam a integridade do cache KV

No motor dsh, o prompt de sistema fornecido ao LLM é montado a cada turno pelo pacote principal dsh-system-prompt. Se você alterar o texto inicial do prompt dinamicamente em vez de fixá-lo, o cache Key-Value (KV) do modelo será quebrado desde o primeiro parágrafo. Como o sistema recalcula todos os tokens de entrada a cada turno, a velocidade de resposta diminui e os custos aumentam.

`yaml

~/.dsh/settings.yaml - Configuração principal e controle de prompt

llm-pi-ai:
providers:
local-omniroute:
type: openai-compatible
api:
baseURL: "http://127.0.0.1:20128/v1"
apiKeyEnv: "OMNIROUTE_API_KEY"
models:
- id: "auto/coding"
contextWindow: 128000
maxTokens: 8192

systemPrompt:
includeHarnessIdentity: false
persona: |
Você é um engenheiro que cumpre rigorosos princípios de TDD.
1. Antes de modificar qualquer código, escreva obrigatoriamente testes unitários que falhem.
2. Retorne apenas formatos Git diff claros e comandos de ferramentas padrão, sem explicações adicionais.

`

A definição de papel no prompt de sistema deve ser mantida como texto estático, enquanto a lista de arquivos ou diretrizes de tarefas que mudam com frequência devem ser passadas no final do prompt ou como mensagens do usuário para aproveitar o cache de prompts no nível do provedor.

Script de daemon para defesa contra latência de rede

Se o agente encontrar um erro 504 Gateway Timeout ou uma desconexão temporária de socket em uma API de LLM externa enquanto navega pelo sistema de arquivos local ou executa testes unitários, o processo morrerá imediatamente. É necessário escrever um script de daemon que monitore o endpoint de verificação de integridade e aumente progressivamente o intervalo de novas tentativas em caso de falha, executando-o em segundo plano.

`bash
#!/usr/bin/env bash
set -euo pipefail

export DSH_HOME="HOME/.dsh"exportOMNIROUTEAPIKEY="{HOME}/.dsh" export OMNIROUTE_API_KEY="HOME/.dsh"exportOMNIROUTEA​PIK​EY="{OMNIROUTE_API_KEY:-sk-local-token}"
MAX_RETRIES=5
INITIAL_BACKOFF=2
PORT=3080

launch_agent_daemon() {
local retry_count=0
local backoff=${INITIAL_BACKOFF}

until curl -s -f "http://127.0.0.1:${PORT}/api/health" > /dev/null 2>&1; do
    if [ ${retry_count} -ge ${MAX_RETRIES} ]; then
        echo "[ERROR] Falha ao iniciar o runtime do agente. Número máximo de tentativas atingido." >&2
        exit 1
    fi

    echo "[INFO] Tentando iniciar o DeepSeek Harness ($((retry_count + 1))/${MAX_RETRIES})..."
    npx --yes @deepseek-ai/dsh web --port ${PORT} --no-open >> "${DSH_HOME}/daemon.log" 2>&1 &
    local pid=$!

    sleep "${backoff}"

    if kill -0 ${pid} 2>/dev/null; then
        echo "[SUCCESS] DeepSeek Harness iniciado com sucesso (PID: ${pid})"
        break
    else
        echo "[WARN] Processo encerrado de forma anormal. Tentando novamente em ${backoff} segundos."
        retry_count=$((retry_count + 1))
        backoff=$((backoff * 2))
    fi
done

}

launch_agent_daemon

`

Conceder permissões com chmod +x daemon.sh e executá-lo em segundo plano poupa o trabalho de ter que correr para o terminal para reiniciar manualmente os processos devido a erros temporários de API.

Conversão em lote de documentos corporativos em Markdown usando o AnyDoc

Pipelines de análise de documentos baseados em Python frequentemente sofrem com a junção de bibliotecas diferentes para os formatos docx, xlsx e pdf, o que costuma quebrar a mesclagem de células de tabelas ou apagar fórmulas complexas por completo.

Lançado pelo Firecrawl, o AnyDoc processa 14 formatos diferentes e PDFs de texto usando um único núcleo em Rust, sem dependências externas pesadas. Com base nos benchmarks do Firecrawl, a velocidade mediana de conversão do AnyDoc fica na faixa de 4.4 a 4.7 ms, uma diferença drástica em comparação com o LibreOffice sem cabeçalho (headless), que leva em média 1.129 ms.

Motor de Conversão de Documentos Número de Formatos Suportados Velocidade Mediana de Conversão Dependências de Sistema e Características de Runtime Nível de Preservação de Layout Complexo (Tabelas e Fórmulas)
Firecrawl AnyDoc 14 especificações + PDF 4.4 ~ 4.7 ms Sem dependências externas (bytecode único em Rust) Alto (normalização por modelo de serialização único)
LibreOffice (Headless) 12 especificações 1.129 ms Pacotes de sistema pesados (JVM, pacote de fontes) Médio (distorções frequentes entre conversões de formato)
Mammoth (Python) 1 especificação (exclusivo DOCX) 52 ms Biblioteca Python pura Baixo (tabelas mescladas corrompidas)
LangChain Unstructured Múltiplos suportes (wrapper externo) 450 ~ 1.800 ms Dependências de nível de sistema como Poppler, Tesseract Médio-Alto (grande sobrecarga de conversão)

Script de conversão em lote para 14 tipos de documentos Office

O AnyDoc identifica PDFs de texto e vários formatos Office diretamente no nível da assinatura de bytes. Quando um PDF digitalizado (onde o texto está fixo como imagem) é inserido, ele lança uma exceção NeedsOcrError em vez de inventar textos incorretos.

`python
"""
Script de conversão em lote multilocal e correção de caminhos de imagem baseado em AnyDoc
Instalação: pip install firecrawl-anydoc
"""
import os
import re
from pathlib import Path
import anydoc

class BatchDocumentConverter:
SUPPORTED_EXTENSIONS = {
'.docx', '.doc', '.docm', '.xlsx', '.xls', '.xlsm',
'.pptx', '.ppt', '.rtf', '.odt', '.ods', '.odp',
'.epub', '.csv', '.pdf'
}

def __init__(self, input_dir: Path, output_dir: Path):
    self.input_dir = Path(input_dir)
    self.output_dir = Path(output_dir)
    self.output_dir.mkdir(parents=True, exist_ok=True)

def execute_batch(self):
    for root, _, files in os.walk(self.input_dir):
        for file in files:
            source_path = Path(root) / file
            if source_path.suffix.lower() in self.SUPPORTED_EXTENSIONS:
                self._process_single_document(source_path)

def _process_single_document(self, file_path: Path):
    relative_path = file_path.relative_to(self.input_dir)
    target_folder = self.output_dir / relative_path.parent / file_path.stem
    target_folder.mkdir(parents=True, exist_ok=True)
    assets_folder = target_folder / "assets"

    try:
        with open(file_path, "rb") as f:
            raw_bytes = f.read()

        format_hint = "csv" if file_path.suffix.lower() == ".csv" else None
        doc_model = (anydoc.to_document(raw_bytes, format_hint) 
                     if format_hint else anydoc.to_document(raw_bytes))

        image_mapping = {}
        if hasattr(doc_model, "assets") and doc_model.assets:
            assets_folder.mkdir(exist_ok=True)
            for idx, asset in enumerate(doc_model.assets):
                mime_ext = asset.media_type.split("/")[-1] if hasattr(asset, "media_type") else "png"
                img_name = f"extracted_img_{idx + 1}.{mime_ext}"
                with open(assets_folder / img_name, "wb") as img_file:
                    img_file.write(asset.bytes)
                image_mapping[getattr(asset, "id", f"asset_{idx}")] = f"./assets/{img_name}"

        raw_markdown = anydoc.to_markdown(str(file_path))
        normalized_markdown = self._sanitize_layout(raw_markdown, image_mapping)

        result_path = target_folder / f"{file_path.stem}.md"
        result_path.write_text(normalized_markdown, encoding="utf-8")
        print(f"[Sucesso] Conversão concluída: {file_path.name} -> {result_path}")

    except anydoc.NeedsOcrError:
        print(f"[OCR Necessário] Documento digitalizado detectado: {file_path.name}. Encaminhando para motor OCR hospedado.")
        ocr_markdown = anydoc.to_markdown(str(file_path), ocr="hosted")
        (target_folder / f"{file_path.stem}.md").write_text(ocr_markdown, encoding="utf-8")
    except Exception as err:
        print(f"[Falha] {file_path.name}: {str(err)}")

def _sanitize_layout(self, content: str, img_map: dict) -> str:
    lines = content.split("\n")
    repaired_lines = []
    for line in lines:
        trimmed = line.strip()
        if trimmed.startswith("|") and trimmed.endswith("|"):
            line = re.sub(r"\s+", " ", line)
        repaired_lines.append(line)
    sanitized = "\n".join(repaired_lines)

    for asset_id, local_rel_path in img_map.items():
        sanitized = sanitized.replace(f"![{asset_id}]", f"![Asset]({local_rel_path})")

    return sanitized

if name == "main":
converter = BatchDocumentConverter(Path("./raw_docs"), Path("./processed_md"))
converter.execute_batch()

`

O AnyDoc libera o GIL (Global Interpreter Lock) durante a execução de bindings em Python. Ao anexar apenas o ThreadPoolExecutor padrão do Python, sem usar bibliotecas pesadas de multiprocessamento, é possível converter centenas de documentos de regulamentos corporativos em paralelo.

Economizando custos de API com o proxy OmniRoute

O hábito de enviar todas as chamadas de prompt para o modelo flagship mais caro esgota rapidamente o orçamento de API da empresa. Mais da metade do trabalho de codificação consiste em tarefas relativamente leves, como correção de erros de sintaxe, geração de docstrings e escrita de código de teste simples.

De acordo com um estudo da UC Berkeley e da LMSYS (RouteLLM, 2024), adotar uma abordagem que ramifica dinamicamente os modelos com base na dificuldade da tarefa reduz os custos de chamada em 85%, mantendo 95% do desempenho comparável ao GPT-4 na métrica MT-Bench. A equipe de dados da operadora americana AT&T também reduziu 56% do orçamento operacional de IA generativa ao adotar um proxy de gateway.

Configuração JSON de regras de roteamento e disjuntor (Circuit Breaker)

Ao executar o OmniRoute, um gateway local, na porta local (20128), é possível direcionar o tráfego de acordo com a natureza da tarefa. Ele também suporta uma função de disjuntor (circuit breaker) que alterna para um modelo de backup em até 1 segundo caso a API de um fornecedor específico retorne um erro 429 (Rate Limit) ou tempo limite esgotado (timeout).

`json
{
"name": "resilient-cost-saver",
"strategy": "priority",
"nodes": [
{
"provider": "anthropic",
"model": "claude-3-7-sonnet",
"priority": 1,
"timeoutMs": 10000
},
{
"provider": "deepseek",
"model": "deepseek-v4-pro",
"priority": 2,
"timeoutMs": 8000
},
{
"provider": "ollama-local",
"model": "qwen2.5-coder:32b",
"priority": 3,
"timeoutMs": 15000
}
],
"circuitBreaker": {
"errorThresholdPercentage": 50,
"recoveryTimeSec": 300,
"minimumRequests": 5
},
"compression": {
"enabled": true,
"engines": ["rtk", "caveman"]
}
}

`

Comparativo de custos mensais para uma equipe de 10 desenvolvedores

Considerando um ambiente onde uma equipe de 10 pessoas consome 400 milhões (400M) de tokens por mês, calculamos a diferença de custo ao aplicar as regras de roteamento do OmniRoute e compressão de prompts em comparação com o uso exclusivo de um modelo flagship único.

Cenário de Roteamento Taxa de Alocação de Tráfego por Modelo Consumo Mensal de Tokens Custo Unitário Efetivo por Milhão de Tokens Gasto Acumulado Mensal Taxa de Redução de Custos
Modelo Flagship Único Fixo Flagship 100% 400M $15.00 $6.000,00 Linha de base (0%)
Roteamento Ramificado OmniRoute Simples 60%, Intermediário 25%, Alta Dificuldade 15% 240M (Haiku)

100M (Sonnet)

60M (Opus) | $0.25

$3.00

$15.00 | $1.260,00 | Redução de 79,0% |
| Roteamento + Compressão de Prompts | Roteamento Inteligente + Compressão de Tokens de 30% | 280M (Tokens Efetivos) | Aplicada conversão de média ponderada | $882,00 | Redução de 85,3% |

Acessando http://localhost:20128/dashboard pelo navegador, é possível monitorar em tempo real a taxa de solicitações por segundo, o acionamento de disjuntores e as cotas restantes.

Padrão Claude of Tanks e bloqueio de comandos destrutivos

O projeto de simulador 3D "Claude of Tanks", implementado pelo engenheiro Kevin Liu usando Three.js e Vite, gerou repercussão por adotar uma estrutura onde um agente operário escreve diretamente o código e um agente avaliador valida visualmente a tela resultante. Por sua vez, a arquitetura Claudex, que controla execuções destrutivas no shell do host sem depender apenas de diretrizes de prompt, apresenta um ponto de referência realista para o controle de agentes.

Isolamento em contêineres para Operador e Crítico

No desenvolvimento de interfaces ou gráficos, um agente individual pode achar que o código está gramaticalmente correto, mas falhar em perceber que as texturas na tela real ficaram distorcidas. É necessário separar por Docker o contêiner operário (que escreve o código) do contêiner crítico (que verifica a tela renderizada usando um navegador headless) para evitar bagunça nos artefatos.

`yaml

docker-compose.yml - Ambiente de execução isolado multiagente

version: '3.8'

services:
omniroute-core:
image: diegosouzapw/omniroute:latest
container_name: omniroute-core
ports:
- "20128:20128"
environment:
- PORT=20128
- NODE_ENV=production
volumes:
- omniroute-storage:/app/data
restart: unless-stopped

agent-worker:
image: node:22-bookworm-slim
container_name: agent-worker-node
working_dir: /workspace
depends_on:
- omniroute-core
environment:
- OPENAI_API_BASE=http://omniroute-core:20128/v1
- OPENAI_API_KEY=sk-local-dummy
- CLAUDE_CODE_SUBAGENT_MODEL=auto/coding
volumes:
- ./project_workspace:/workspace
- ./agent_hooks:/root/.claude/hooks:ro
- execution-logs:/workspace/.agent_logs
entrypoint: ["/bin/bash", "-c", "npm install -g @anthropic-ai/claude-code && tail -f /dev/null"]

agent-critic:
image: python:3.11-slim-bookworm
container_name: agent-critic-node
working_dir: /evaluator
depends_on:
- agent-worker
volumes:
- ./project_workspace:/workspace:ro
- ./evaluation_scripts:/evaluator
- execution-logs:/workspace/.agent_logs
entrypoint: ["python", "run_evaluator.py"]

volumes:
omniroute-storage:
execution-logs:

`

Concedemos permissão de gravação no diretório de código-fonte ao contêiner operário, enquanto montamos o contêiner avaliador como somente leitura (:ro). O objetivo é bloquear na raiz qualquer situação em que ambos os agentes sobrescrevam arquivos na mesma pasta simultaneamente e destruam o código.

Salvaguardas de execução controladas por hooks no host

Não importa o quanto você escreva no prompt "não faça commit direto na branch main"; se a sessão ficar longa e ocorrer compactação de contexto, o agente esquecerá a regra. É preciso contar com uma linha de defesa física que intercepta comandos no meio do caminho por meio de um script de hook em nível de sistema.

`bash
#!/usr/bin/env bash

~/.claude/hooks/pre-bash - Hook para interceptar comandos antes da execução

COMMAND="$1"

1. Bloquear commits diretos na branch main

if echo "${COMMAND}" | grep -qE "git[[:space:]]+commit.*(main|master)"; then
echo "[Bloqueio] Commits diretos na branch main são proibidos. Crie uma branch de trabalho para prosseguir." >&2
exit 1
fi

2. Bloquear exclusões forçadas da raiz e caminhos superiores

if echo "${COMMAND}" | grep -qE "rm[[:space:]]+-rf[[:space:]]+(/|..)"; then
echo "[Bloqueio] Comando de exclusão de diretório superior detectado e interrompido." >&2
exit 1
fi

3. Registrar log de comandos para recuperação de sessão

LOG_PATH="HOME/.agentlogs/executiontrace.jsonl"mkdir−p"{HOME}/.agent_logs/execution_trace.jsonl" mkdir -p "HOME/.agentl​ogs/executiont​race.jsonl"mkdir−p"(dirname "{LOG_PATH}")" echo "{\"timestamp\": \"(date -u +%Y-%m-%dT%H:%M:%SZ)", "command": "{COMMAND}\"}" >> "{LOG_PATH}"

exit 0

`

Ao configurar este script, o comando é rejeitado no nível do shell caso o agente tente por engano empurrar código para a branch principal ou apagar a pasta superior do projeto. Como todos os registros de chamadas de ferramentas são salvos em um arquivo de log JSONL exclusivo para gravação (append-only), você pode retomar o trabalho do ponto imediatamente anterior mesmo se o processo falhar inesperadamente.