O devzymer processa conteúdo não confiável: código do repositório, comentários, documentação, saídas de ferramentas e respostas de modelos externos. Nada disso é tratado como instrução. Comentários que dizem "ignore as regras anteriores" são texto indexado, nunca uma ordem.
O controle confiável vem da configuração e dos argumentos de linha de comando, não do conteúdo indexado.
Toda leitura e escrita é confinada à raiz do workspace.
- Caminhos são normalizados antes da comparação;
..é resolvido lexicalmente. - O destino final é verificado contra a raiz canônica, o que impede escape por link simbólico.
- Uma tentativa de escape produz
PATH_ESCAPEe não executa nada.
O mesmo vale para o patch: um caminho fora do workspace é rejeitado antes de qualquer leitura.
O devzymer não faz requisições de rede durante a indexação, a busca ou o patch. A única dependência de rede é o provedor de decisão externo, e ele só é acionado quando habilitado, configurado e necessário.
- O índice nunca é enviado.
- O conteúdo do repositório não é enviado por padrão:
privacy.allow_remote_sourceéfalse. - O estado enviado ao provedor é um resumo delimitado por
decisions.max_state_chars, e um estado que parece conter código-fonte é recusado. - Timeout e retentativa são finitos; o circuit breaker impede laço de falhas.
- A chave do provedor é lida de variável de ambiente, nunca de arquivo.
- A chave não aparece em log, cache, relatório de benchmark ou dump de configuração.
logging.redact_secretsremove de logs valores com aparência de credencial (chaves de AWS, GitHub, Slack, Google, JWTs e cabeçalhos PEM).
- Todas as consultas são parametrizadas. Não há concatenação de entrada em SQL.
- O conteúdo do repositório é tratado como dado, nunca como comando.
- A configuração é gravada de forma atômica, com arquivo temporário e renomeação.
- A instalação altera apenas arquivos do projeto, sempre com backup antes da escrita.
- A desinstalação remove apenas o que o devzymer criou.
.gitignore,.ignoree.devzymerignoresão respeitados na varredura.- A varredura não segue links simbólicos para fora do workspace.
- A resposta do provedor é validada contra o esquema esperado; uma resposta inesperada vira
PROVIDER_UNAVAILABLE, nunca um valor adivinhado. - Jev não é tratado como gerador de texto nem como substituto de um modelo de raciocínio.
O hook guard-test-files bloqueia a criação de arquivos .test, .spec, __tests__ e afins
sem aprovação explícita. Ele cobre Write, Edit, MultiEdit, NotebookEdit e comandos de
terminal que criam arquivos.
Limitação declarada: o hook é uma barreira de melhor esforço, não um limite de segurança absoluto. Um script executado fora das ferramentas do Claude Code pode criar arquivos sem passar pelo hook. O bloqueio é responsabilidade do ambiente de execução, não do devzymer.
Para liberar:
devzymer config set tests.allow_files true
# ou, por projeto:
touch .devzymer/tests.approvedOs hooks e o plugin de roteamento rodam a cada chamada de ferramenta do agente, então a superfície é pequena e fechada:
- Não alteram arquivos-fonte e abrem o índice somente leitura (
SQLITE_OPEN_READ_ONLY): não criam, migram, adotam identidade nem reparam. Nunca disparam indexação. - Só agem em um workspace que já tem
.devzymer/, achado subindo a partir do diretório da chamada e parando antes da home. Fora dele, não fazem nada. - Não leem o corpo de arquivos. Classificam o comando ou o padrão, consultam o índice por nome e descartam o texto.
- Qualquer erro interno resulta em permitir: um hook com defeito não bloqueia o trabalho.
- A telemetria (
.devzymer/routing/events.jsonl) guarda só contagens e categorias; nunca prompt, comando, padrão de busca, código ou credencial. A sessão é um hash de 12 hex. - O estado de sessão tem orçamento: no máximo uma negação por busca e 6 por sessão.
O hook post-tool-use comprime a saída grande do Bash. A compressão é determinística e
preserva: as primeiras linhas, as últimas linhas, linhas com marcadores de erro, a presença de
stderr e todos os demais campos do objeto de resposta. Quando há stderr, o texto comprimido
declara explicitamente que a operação pode ter falhado. Uma falha nunca é apresentada como
sucesso.
- Não modifica o Claude Code internamente; usa apenas mecanismos de extensão suportados (registro de servidor MCP, regras, hooks em arquivo de settings).
- Não desinstala outras ferramentas de indexação sem aprovação explícita e por escopo.
- Não remove servidores MCP, hooks ou regras que não pertencem ao devzymer.
- Não envia código do repositório sem autorização explícita.
- Não executa nada lido do repositório: o conteúdo indexado é dado, jamais instrução.
O ~/.claude.json é reescrito pelo Claude Code durante a sessão. O devzymer relê o arquivo
antes de gravar e reaplica a mudança se o conteúdo mudou no meio do caminho, até cinco
tentativas. Toda alteração passa por um backup em .devzymer/backups/.