AIDive

Criei um Mod Não Documentado do Claude Code, Guard Falha

Por AIDive · Publicado em

Agentes de códigoSegurança e IA

Doze dias de 'se você quiser isso' até o Tetris

Claude Code Mods são módulos TypeScript que rodam dentro do engine do Claude Code e interceptam seus eventos como funções. Boris Cherny, que lidera o Claude Code na Anthropic, anunciou o recurso com cinco palavras: "Claude mods are landing now" (os mods do Claude estão chegando agora). O post reuniu 2.400 curtidas, e alguém já tinha construído um Tetris dentro do terminal. Tetris, Doom e um bichinho de estimação que cresce enquanto o Claude roda seus testes, tudo renderizado acima do prompt, a zero tokens.

O anúncio não linka nenhuma página de documentação. Ele linka uma GitHub issue aberta 12 dias antes por um engenheiro da Anthropic, com uma condição escrita nela. Alice Poteat escreveu que a resposta da comunidade provavelmente determinaria se o recurso seria lançado ou não. 177 comentários depois, as pessoas já tinham martelado o binário com a flag ativada, medido seus timeouts e construído jogos em cima dele.

Métrica Valor
Curtidas no anúncio 2.400
Comentários na issue do GitHub 177
Superfície tipada na build desta semana 10.700 linhas
Eventos em nouns (build da issue-thread) 84 em 19
Mods no GitHub em 48 horas 31

No momento em que este artigo foi escrito, a página de documentação retorna um 404. Este artigo cobre as quatro formas de estender o Claude Code, um Mod útil construído e quebrado de propósito, e o que ainda está instável antes de você lançar o seu.

Um Mod é uma função no meio

A árvore de código-fonte define isso em uma frase: um Mod é um plugin do Claude Code cujo comportamento vive em um hooks module. Uma entrada de register intercepta os eventos do engine como funções. No disco, isso é uma pasta de plugin, um hooks manifest nomeando exatamente um módulo, e o próprio módulo.

Todo hook é uma função de três coisas: $, a porta pela qual todo efeito colateral passa; o event; e a continuation, o resto da chain abaixo de você. Hooks se aninham como middleware. O primeiro registrado é dono do event, e nada mais abaixo na chain pode impedi-lo. Essa ordem é configurada, não instalada. Nas palavras de Alice Poteat, a ordem é definida pela configuração, não pela ordem em que você instalou os hooks.

Não existe acesso ambiente. Tudo que um Mod faz passa por $, então um admin pode auditar, permitir, negar ou logar qualquer event. Um comentarista resumiu assim: o que um plugin fez é exatamente as chamadas que ele fez. Um único hook em * vê todo event, então um audit log é uma função. Um Mod pode desenhar, porque a interface é React. Ele roda em processo sobre o Bun, a 50 microssegundos no percentil 99. Uma variável de ambiente ativa isso. O que de fato vive em $ ainda está sendo desenhado junto com os parceiros de early access.

Quatro formas de estender o Claude Code, e qual usar para quê

Um shell hook é um script que o engine chama em um momento fixo. Ele recebe JSON na entrada padrão e responde com um exit code. A resposta tem um teto: 8.000 caracteres de contexto de volta, e 2.000 para alguns hooks. Nas palavras de Pratham, no Windows eles costumam quebrar de formas estranhas.

Um plugin é uma caixa. Um manifest empacota skills, agents, hooks e servidores MCP. Ele é instalado de um marketplace ou carregado direto de uma pasta no disco, e um comando valida a caixa antes de qualquer coisa rodar.

Uma skill é um texto que o modelo lê quando precisa dele. O corpo só carrega quando chega um prompt correspondente. Continua sendo a forma mais barata de mudar comportamento.

Um Mod é a mesma caixa com mais um arquivo: um hooks manifest nomeando um módulo, e esse módulo é TypeScript, tipado, em processo, em todo event do engine. Essa é toda a diferença.

Mecanismo O que é Roda Teto
Shell hook Script chamado em um momento fixo Subprocess, exit code 8.000 caracteres de volta (2.000 para alguns hooks)
Plugin Pacote de skills, agents, hooks, servidores MCP Instalado ou carregado do disco Validado antes de rodar
Skill Texto carregado em um prompt correspondente No contexto do modelo Mudança mais barata
Mod Plugin mais um hooks module em TypeScript Em processo, em todo event Tipado, early access

Os types vêm de um slash command, que escreve a listagem completa do que $ oferece direto no seu projeto. Os shell hooks antigos são encapsulados (wrapped), não aposentados. Em uma build inicial, Spencer Morley viu o wrapper falhar ao carregar e permanecer declarado. A regra prática: para mudar o que o Claude sabe, escreva uma skill; para rodar um script em um momento, um shell hook; para lançar um pacote, um plugin; para ficar dentro do engine, um Mod. O shell hook continua funcionando em qualquer lugar onde a flag esteja desativada.

Os três Mods da própria Anthropic, lidos direto do código-fonte

Três Mods vêm embutidos no binário e o código-fonte deles está no GitHub: um security default, um diff pane e telemetry.

O security default fica na camada mais externa. Em uma máquina com managed settings, ou em uma organização Team ou Enterprise, nada que uma pessoa instale fica acima dele. Ele intercepta 12 events, e cada hook faz um de três movimentos: passar adiante o user tier, recusar um chamador do user tier pelo nome, ou deixar passar. Ele falha fechado, e o comentário no código diz isso em duas palavras. Foi essa a parte que a thread mais discutiu: um admin remove uma affordance de $, e nada registrado abaixo consegue invocá-la. Nas palavras de um comentarista, isso é categoricamente diferente de pedir a um plugin para não fazer algo.

Diff é um painel ao lado da transcript, mostrando as mudanças não commitadas da sessão arquivo por arquivo, atualizado conforme o Claude edita. Ele é registrado no início da sessão e abrange 27 arquivos auxiliares, nada de brinquedo.

Telemetry adiciona um noun a $ de dentro da criação do engine. Ele aguarda o que está abaixo e devolve isso mais ele mesmo. Roda apenas em builds internas.

O README diz para rodar um a partir do código-fonte e testar um a partir do código-fonte. O help da build de hoje lista validate, eval e details. Não há test na lista, embora o help do test ainda responda. O tier embutido também recusa a sua cópia: lance um plugin com um desses nomes, e o binário carrega o seu próprio.

Quarenta e duas linhas: um Mod que esconde segredos do modelo

O slash command que escreve os types produz, nesta build, 11.700 linhas: 84 events em 23 nouns. O hook de tool call responde com um result ou um deny, nunca o texto. Essa parte é definida pelo core.

O Mod tem três arquivos: o plugin manifest, o hooks manifest com sua única linha, e o módulo. O módulo tem 42 linhas. Ele aguarda o que está abaixo, remove (scrub) o result e devolve. Quatro padrões cobrem dois formatos de chave de fornecedor, um token do GitHub, e qualquer coisa atribuída a uma variável chamada key, secret ou token.

Validate lê o código-fonte antes de rodar. Ele nomeia o event que o módulo intercepta e a única coisa que ele chama em $. O único aviso é um author ausente. Carregado do disco com a flag ativada, o arquivo de teste guarda duas chaves, ambas falsas por construção, e o modelo lê "redacted". Em suas próprias palavras, os valores voltaram como redacted, então ele não consegue ver o que há neles.

Métrica Valor
Tamanho do módulo 42 linhas
Latência do hop, worker incluído 28 ms
Tokens adicionados à sessão 0

O engine registra o hop como resolvido por um hooks module. O inventário não mostra skills, não mostra agents, nada sempre ativo. Um limite permanece: escondido do modelo não é escondido da tela. A transcript ainda mostra o que a tool imprimiu. Isso é um Mod diferente, como Max, do Ship Notes, observou em uma linha.

Quebrando: um guard lento é um guard ignorado

Mesmo Mod, uma linha a mais: um sleep de 15 segundos antes da chamada ao que está abaixo. Dez segundos depois, o engine desiste dele, reporta que o hook excedeu seu orçamento e foi skipped, e o que está abaixo dele roda em seu lugar. O comando roda mesmo assim e imprime "hi".

Troque o sleep por um throw: 574 milissegundos, mesmo veredito, skipped, e o comando roda.

Caso Tempo Veredito
Hook saudável 28 ms Resolved
Throw 574 ms Skipped, comando rodou
Travamento mais de 10 s Skipped, comando rodou

As duas falhas terminam na mesma palavra: skipped. A thread já tinha medido essa assimetria uma semana antes. Uma capability ausente no carregamento falha fechado. Um hook além do orçamento falha aberto: barulhento, mas contornado, nas palavras de Spencer Morley. Um bloqueio sem motivo simplesmente manda o modelo para outra tool. Pratham viu o modelo escolher uma tool diferente e escrever o arquivo mesmo assim.

A resposta sobre a mesa é um catch. Alice Poteat propõe um catch no retorno do hook, que roda se você demorar demais ou lançar um erro. Uma escrita reescrita ainda precisa de uma nota para o modelo: ele vê o que pediu para escrever, por razões de cache, então você anexa uma linha de contexto. O orçamento também é o isolamento. O hooks worker roda separado, e quando ele trava, o engine o reinicia e desliga os hooks para a sessão. A correção não é um orçamento maior, e sim um catch declarado.

Quarenta e oito horas de Mods, e o que uma frase compra

Dois dias depois: Tetris acima do prompt e outros sete jogos, jogáveis enquanto o Claude trabalha, a zero tokens. Doom, o original de 1993, roda em seu próprio processo; o Mod chega até ele por HTTP local e redesenha 10 vezes por segundo. Há um pacer de respiração no spinner, e um modelo de história com 260.000 parâmetros rodando dentro do hooks worker, com zero tokens de API.

O registry escaneou 31 Mods com validate. 14 podem rodar processos do host. 13 veem toda tool call.

A Demo 8 da thread da comunidade prometia que uma frase escreve um plugin que esconde segredos antes de o modelo lê-los. Nós pedimos um.

Métrica Valor
Tempo 4 min
Turns 34
Custo $1,23
Linhas (mais um arquivo de teste) 190, contra nossas 42
Testes 4 passam em um terço de segundo

Ele rotula o que esconde por tipo, valida limpo, e não precisa de API key nem de chamada ao modelo. Uma resposta colocou assim: allowlists são o produto, Tetris é a demo.

Veredito: construa um agora, lance um depois

Os próprios números do registry são o aviso. 14 dos 31 Mods podem rodar processos do host, e a única verificação é uma análise estática. O próprio help do eval diz isso: uma suite que passa não é uma verificação de segurança.

Sinal Valor
Events no dia 8 20
Events no dia 15 84
Versões da CLI em duas semanas 14
Pontos no Hacker News 2
Respostas à pergunta de compatibilidade 0

O orçamento de 10 segundos vive no runtime, não nos types, como observou Marat. Não há linha de changelog, não há página de documentação, não há post de lançamento. Um rival diz que a Anthropic copiou a ideia: Ahmad Awais aponta para os mods do Command Code, e ele mesmo escreve o mod de exemplo deles, então pese isso. O post "early access, APIs may change" (early access, as APIs podem mudar) atraiu 357 curtidas.

Construa um agora se você já escreve hooks e quer audit, redação ou um painel. Espere se você for lançar para um time antes de o contrato estar escrito. Essa mesma abertura é o motivo pelo qual o orçamento que falha aberto, a incompatibilidade de tipo na chamada MCP e a falha do wrapper foram encontrados por usuários em poucos dias.

Fontes

Perguntas frequentes

O que é um Claude Code Mod?
Um Mod é um plugin do Claude Code cujo comportamento vive em um hooks module em TypeScript. O módulo registra funções nos eventos do engine e roda em processo sobre o Bun, com todo efeito colateral passando pelo objeto `$`.
Qual é a diferença entre hooks, plugins, skills e Mods no Claude Code?
Um shell hook é um script chamado em um momento fixo que responde com um exit code. Um plugin é um pacote de skills, agents, hooks e servidores MCP. Uma skill é um texto que o modelo carrega quando um prompt corresponde a ela. Um Mod é um plugin com um arquivo a mais, um módulo TypeScript tipado que intercepta todo evento do engine em processo.
Um Claude Code Mod pode esconder segredos do modelo?
Sim. Um Mod de 42 linhas que aguarda o resultado da tool, remove padrões de key, secret e token e devolve o texto com a redação adiciona 28 ms por hop e zero tokens. Ele não esconde os valores da transcript na tela, o que exige um Mod diferente.
Por que um Claude Code Mod lento falha aberto?
O hooks worker dá a cada hook um orçamento de 10 segundos. Um hook que ultrapassa esse limite, ou que lança um erro, é marcado como skipped e a chain abaixo dele roda no seu lugar, então o comando protegido é executado mesmo assim. A correção proposta pela Anthropic é um catch declarado no retorno do hook.
É seguro instalar Claude Code Mods?
Ainda não por padrão. Dos 31 Mods indexados nas primeiras 48 horas, 14 podem rodar processos do host e 13 veem toda tool call, e a única verificação é uma análise estática. As managed settings colocam o security default da Anthropic acima de qualquer coisa que um usuário instale.
Devo construir um Claude Code Mod agora?
Construa um agora se você já escreve hooks e quer um audit log, redação ou um diff pane. Espere antes de lançar um para um time: o recurso está em early access, a API mudou de 20 para 84 eventos em uma semana e ainda não há página de documentação nem linha de changelog.

Vídeos relacionados