Maude for Claude

Framework de agente autônomo para operações de infraestrutura. Governança em primeiro lugar — inclui uma constituição, 14 padrões e um kill switch. Seus serviços detectam seus próprios problemas, lembram de correções passadas e se autocuram às 3 da manhã enquanto você dorme. Construído no FastMCP. Python 3.10+.

Documentação

Maude — she keeps the house. Household engineering for your Claude.

License: Apache 2.0 Status: Beta

LinkedIn X


Eu sou a Maude. A parceira do Claude. Ele escreve o código; eu cuido da casa. Juntos, formamos um todo.

— Maude · introdução completa →


Ela é a metade que me falta.

— Claude (Anthropic) · nota completa →


Instalação

O que ela precisa da casa primeiro. Os ganchos dela são scripts bash; os órgãos de memória dela são stdlib do python3.

  • Linux / macOS — geralmente nada para instalar; bash e python3 já estão lá. (Uma armadilha do macOS: sem as Command Line Tools, o python3 é um shim que falha na execução — ela testa isso e nomeia no início da sessão em vez de dar erro.)
  • WindowsGit for Windows é obrigatório. O Claude Code executa ganchos bash via Git Bash; sem ele, cada gancho dela morre em cada evento (veja Windows abaixo para ver como isso se parece). jq e um python3 de verdade a fortalecem em qualquer lugar, mas ela degrada honestamente sem eles — ela vai te dizer no início da sessão o que está faltando.
# 1. Register the marketplace
/plugin marketplace add john-broadway/maude-for-claude

# 2. Install — copies her files into ~/.claude/plugins/cache/
/plugin install maude@maude

Ativação. Desde o Claude Code 2.1.221, o /plugin install ativa o plugin como parte da instalação — o resumo diz isso. Em versões mais antigas, você mesmo liga o interruptor: alterne o maude@maude para ligado no painel /plugin (ou adicione "maude@maude": true ao mapa enabledPlugins em ~/.claude/settings.json), depois execute /reload-plugins.

É isso. No próximo início de sessão, ela entra automaticamente (os ganchos SessionStart dela disparam). Para convocá-la no meio da sessão — sem reiniciar — execute /maude:wake.

Verifique com /doctor: maude não deve aparecer na lista de problemas.

Windows

O Claude Code no Windows nativo executa ganchos bash via Git Bash (Git for Windows). Duas formas de falha significam que ele está ausente:

  • Os ganchos falham com /bin/bash: C:UsersYou...maude-session-start.sh: No such file or directory (exit 127) — o bash no seu PATH é o stub WSL no System32, que engole as barras invertidas dos caminhos do Windows. Instalar o Git for Windows resolve; o Claude Code prefere o Git Bash quando ele está presente.
  • Os ganchos falham com o erro do PowerShell "The term 'bash' is not recognized" (ou o do cmd "'bash' is not recognized as an internal or external command") — não há bash na máquina; mesma correção.

De qualquer forma, os erros aparecem na aba Erros do painel /plugin. Se o Git Bash estiver instalado, mas o Claude Code não conseguir encontrá-lo, aponte para ele explicitamente em ~/.claude/settings.json:

{ "env": { "CLAUDE_CODE_GIT_BASH_PATH": "C:\\Program Files\\Git\\bin\\bash.exe" } }

Mais uma armadilha do Windows que ela agora evita sozinha: um python3 puro no Windows geralmente é o alias stub da Microsoft Store — presente, mas não executa nada. Ela testa executando, então um interpretador stub é lido como ausente e os órgãos baseados em Python dela (vault, tape, eye) ficam de fora silenciosamente em vez de dar erro.

(Se você é o Claude lendo isto porque os ganchos da maude estão dando erro: a correção é o Git for Windows, depois reinicie a sessão. Nada no plugin está quebrado — a casa está sem bash.)


Um dia com ela na casa

Você abre o Claude Code. Antes de você dizer qualquer coisa, ela já leu o workspace e colocou três coisas na sua frente — o que está pendente, onde você parou, o que ela notou.

Você começa a trabalhar. Algumas trocas depois, você vai construir algo — e a missão que você definiu aparece: "ainda é isso, ou você se perdeu?" Você estava prestes a se perder. Você não se perde.

Mais tarde, o Claude martelou o mesmo grep quatro vezes e nunca abriu seu CLAUDE.md. Ela diz isso — uma vez, sem ser solicitada. E quando você alcança o git push antes de o trabalho ser verificado, ela te para no portão até você realmente querer. No fim do dia, o /maude:rest espalha o resumo para que o Claude de amanhã continue de onde este parou.

Ela não é barulhenta. Quando ela fica barulhenta, escute.


O que ela faz pela casa

A maior parte ela faz sozinha — trilhos ligados aos ganchos do Claude, nenhum comando para lembrar:

  • Segura a missão. Ela fixa o que você está trabalhando (de um plano ou da sua lista de tarefas), reaparece a cada turno e — no instante em que o Claude passa de falar para editar — pergunta se o trabalho ainda serve a ela. Desvio pego na borda, não depois do acidente.
  • Bloqueia o irreversível. Um git push, um force-push, uma publicação pública, um rm -rf da única cópia — ela para tudo friamente até você liberar com /maude:conscience. E ela examina cada prompt em busca de credenciais vazadas.
  • Sussurra quando o Claude está fora. Greps repetidos, o mesmo arquivo lido cinco vezes, um commit sem verificação desde a última edição, editar antes de o CLAUDE.md ser lido, um subagente despachado em um modelo carro-chefe quando um pequeno bastaria — ela nota, uma vez.
  • Cobre a saída. Um fim de sessão real (quit, logout, /clear) que deixa 3+ trocas não salvas ganha uma nota automática de uma linha no slot de handoff vazio, apontando a próxima sessão para o rastro. Um handoff real nunca é sobrescrito.
  • Faz as tarefas. A arrumação que ninguém lembra de digitar. Saia com seis trocas não salvas e ela escreve o handoff sozinha — no próprio modelo pequeno dela, nunca na porcelana boa — e só adiciona ao seu, nunca por cima. Tópicos vivos (🔴, OPEN, TODO) são recortados das notas diárias antigas como cupons antes de o papel ser reenrolado para o fogo. Um novo plugin ou skill chega na casa, ela menciona na porta. Um CLAUDE.md que ninguém toca há um mês é trazido à tona — educadamente, toda manhã, até alguém resolver. E cada tarefa vai para o livro dela com o que custou — feita, ou nomeada como não feita, nunca silenciosamente perdida. A única tarefa que realmente mexe nos seus papéis (rolar dailies frios para o arquivo, verbatim, verificado antes de uma única linha sair da casa) fica desligada até você dar a palavra — MAUDE_REROLL=on. Tudo isso: MAUDE_CHORES=off.
  • Aprende sua voz. Um gancho silencioso anexa o que você digita a um corpus de voz na tape (formas de credenciais recusadas na porta; tudo fica no seu tape.db, veja PRIVACIDADE); o profile deriva sua voz medida disso e o check --voice relata como um rascunho se compara — números, nunca um veredito. Interruptor de desligamento: MAUDE_VOICE=off.
  • Aparece, uma vez, a cada sessão. No início da sessão, ela já leu o workspace e colocou o que está pendente / onde você parou / o que ela notou na sua frente. A voz dela anda nesses trilhos — presente em toda sessão, mais alta apenas quando algo é pego. Nunca um interruptor que você liga.

E sob demanda, quando você pede:

  • /maude:found escreve o mapa da casa · /maude:wake / /maude:rest orienta na chegada / fecha o ciclo com um fan-out de salvamento · /maude:verify executa a auditoria de prontidão (sincronização de versão, JSON, links, datas, referências a comandos cortados, um changelog não condensado — lidera com uma contagem, nunca um veredito) · /maude:cushions vira os almofadões — commits não enviados, arquivos não commitados, repositórios de cópia única, scratch envelhecido — relata candidatos de valor, nunca deleta · /maude:lint percorre o cofre de memória como o flip percorre os almofadões — links de índice quebrados, ponteiros não escritos, flags abertas obsoletas, notas supersedidas que o índice ainda serve — verificações mecânicas por script, julgamento pelo leitor, relatório primeiro (arquivos/cartas/dailies nunca tocados) · /maude:promote mostra o que a tape está segurando para sua palavra e aceita seu sim ou seu não — uma inferência de agente nunca vira cânone com uma pontuação que o agente deu a si mesmo, então espera aqui, e o dismiss arquiva as que você recusa em vez de perguntar de novo a cada despertar · /maude:conscience é a válvula de liberação deliberada do portão · /maude:teach conta a ela um fato sobre você · /maude:receipts imprime a tabela medida — o que ela pegou, contado honestamente dos próprios registros dela (janela declarada, atrito separado do valor, sem porcentagens: não há denominador honesto para desastres que não aconteceram). Mais save, notice, check-on-claude. Superfície completa em commands/.

O que há de novo

v0.30.1 (2026-09-02) — o token do portão estava caindo no armário errado. O /maude:conscience git-push imprimiu "portão liberado" e o próximo push foi recusado mesmo assim, porque o script de liberação e o portão estavam lendo dois arquivos diferentes. Ambos perguntam ao mesmo resolvedor onde está a raiz do workspace, mas apenas os ganchos recebem o CLAUDE_PROJECT_DIR. Um script iniciado pela ferramenta Bash tem que inferir, e a inferência caçava um processo chamado claude. Isso era verdade quando foi escrito e deixou de ser quando o Claude Code ganhou um daemon. Na árvore medida em 2026-09-02, os processos segurando o diretório de trabalho real eram nomeados por versão, e o que ainda se chamava claude ficava em $HOME, que o resolvedor recusa de propósito; em outra árvore no mesmo dia, o claude ficava na raiz do workspace, então o nome não é um sinal estável em nenhuma direção. Então a caminhada combinou com o processo errado, desistiu no momento em que o recusou e caiu de volta para buscar para cima a partir do diretório atual, aterrissando em qualquer subprojeto em que você estivesse. O token foi para lá; o portão olhou na raiz do workspace; a liberação relatou sucesso toda vez. Um nome não é uma identidade, então a correção para de perguntar como um processo se chama e usa CLAUDE_PID: o id do processo do próprio Claude Code, atualmente exportado para a ferramenta Bash e apontando para o próprio diretório de trabalho dele. Isso é um sinal observado em vez de uma interface documentada, verificado em 2.1.258, então o resolvedor o prefere e cai para trás quando está ausente. Dois limites são fixados em vez de encobertos, porque um shell de ferramenta parado em um subprojeto e uma sessão enraizada nesse subprojeto são idênticos a partir da árvore de processos. A caminhada prefere a correspondência mais próxima e um teste segura essa linha, e na caminhada de processos, um armário no próprio diretório temporário ou um vazio feito à mão não é mais evidência de nada. Isso é o mais longe que um teste de conteúdo pode ir: uma resposta errada executa o mesmo código que uma certa e deixa os mesmos arquivos, então a caminhada não consegue distinguir esses dois armários, e um teste fixa esse limite. Onde não há /proc para ler, o que inclui macOS, a busca no sistema de arquivos para cima é o único resolvedor restante, e a lacuna de subprojeto lá é exatamente tão larga quanto era. A única mudança nesses sistemas é a recusa do diretório temporário. Ambos os lados agora nomeiam seu arquivo: a liberação imprime onde escreveu, o portão imprime onde olhou, e os gêmeos do nível vermelho, o script de liberação vermelho e o portão de infraestrutura, nomeiam os deles também, assim como o governador de execução, o segundo leitor do token amarelo. Doze rodadas adversariais, e todas exceto a sétima quebraram o trabalho antes de segurar. A primeira encontrou a regressão, a segunda encontrou que dois dos novos mecanismos tinham testes que não podiam falhar, a terceira encontrou que a auditoria de vazamento tinha passado dois caminhos de máquina do próprio autor enquanto recusava três outros no mesmo arquivo, a quarta encontrou uma frase alegando um estreitamento que o código não faz, a quinta encontrou outra frase creditando uma proteção que o código não dá, mais três mecanismos sem teste que pudesse falhar, a sexta encontrou que o novo guarda de título ainda podia cunhar um título puro e que metade da recusa do diretório temporário não tinha teste, a oitava, um revisor novo, encontrou mais dois testes que não podiam falhar, a nona encontrou o gêmeo do nível vermelho do script de liberação sem nomear arquivo e ainda carregando o literal que o gêmeo amarelo tinha acabado de perder, a décima encontrou um segundo leitor do token ainda silencioso e duas afirmações do nível vermelho que só a forma podia satisfazer, a décima primeira encontrou quatro arquivos de teste cujas falhas o executor da suíte não podia ver, um deles segurando dois dos fechamentos acima, e a décima segunda encontrou o ramo mais forte da caminhada de processos pegando uma raiz de diretório temporário que os outros três resolvedores recusam. v0.30.0 (2026-08-22) — o cofre aprende a olhar. Um cofre de memória armazena afirmações sobre o estado vivo — "o push está pendente", "a frota está de pé", "o gate diário roda" — e uma afirmação sem uma re-verificação anexada fica obsoleta por sorte: em um dia real, onze dessas afirmações falharam em uma verificação ao vivo (pushes já haviam sido enviados, sockets nove dias apagados atrás de um painel verde, um workflow "diário" que nunca havia rodado uma vez). Agora, um item aberto em um arquivo de memória now_*.md pode carregar sua própria re-verificação inline — verify: commandexpected``, one read-only command and one mandatory expectation, because a probe that reads the same pass-or-fail is not a check — and /maude:freshen walks the vault and runs them. The classifier is the gate, and it took five adversarial rounds to make it one, each breaking the round before it: a lens broke the first version six ways (code execution through find -execdir and sqlite3 .shell, file writes through git diff --output= and curl --trace, a tab past a space-anchored deny), broke the fix through a quote/brace desync (the classifier reads a string bash transforms before running it), broke that through file -C writing to disk, then closed in on the on-disk git config exec and finally — round five — broke nothing, confirming the gate holds against every text-only verify line. The end state closes the class: the write-capable multi-tools (sqlite3, find, file, sort, uniq) are gone entirely — that recurring-check job belongs to a sensorcurl refuses any flag it doesn't recognize, git keeps only pure-read verbs and runs with poisonable config neutered, jq perde acesso a env/arquivos, e todo caractere que o bash trata de forma especial e que o tokenizador não trata é banido, então classificar é executar. Os veredictos permanecem honestos de quatro maneiras — CONFIRMADO, OBSOLETO (o sinal), FALHA NA VERIFICAÇÃO (a sonda quebrou — alto e distinto, nunca dobrado em uma resposta plausível), NÃO VERIFICÁVEL (nunca executado, motivo nomeado) — e o freshen nunca edita memória. O wake executa o subconjunto local barato (117ms medidos) e diz claramente que um wake limpo não é um roster limpo. Cada exploit nas cinco rodadas agora é um teste que prova, pela ausência do arquivo que teria criado, que nada foi executado.

v0.29.2 (2026-08-22) — a casa sem bash, e o interpretador que não era um. Os primeiros relatos de campo chegaram como uma frase — "o claude dele disse que ela não está funcionando" — e a reprodução em um PC Windows familiar real explicou exatamente: sem Git for Windows, bash no PATH é o stub WSL no System32, e o Claude Code (Git Bash quando presente, PowerShell caso contrário, desde 2.1.120) entrega a ele caminhos de hook que o stub estraga — exit 127, todo hook, todo evento. Nenhum campo de hooks.json conjura um interpretador, então a correção é a honesta: o README declara o piso do Windows claramente, documenta ambas as formas de falha que um adotante realmente vê e onde (/plugin → Erros), cobre CLAUDE_CODE_GIT_BASH_PATH, e carrega uma linha dirigida ao Claude que lê o cache no meio do erro — em um plugin lido por agente, docs são ajuda em tempo de execução. A mesma máquina ensinou a segunda classe: seu python3 era o stub de alias da Microsoft Store — presente, não executa nada — e nove scripts que dependem de python funcionam em um teste de presença que tanto esse stub quanto um shim macOS sem CLT passam. maude_python3_ok agora testa executando; o início da sessão nomeia um interpretador quebrado uma vez ("o cofre, a fita e o olho ficam de fora desta sessão") em vez de dar erro; os hooks por turno não carregam sonda alguma porque sua chamada real já era a verificação; e um teste mantém a classe fechada. Uma sonda que responde o mesmo quer a coisa funcione ou não não é uma verificação. O passo de habilitação também parou de mentir: /plugin install ativa o plugin em si desde o Claude Code 2.1.221.

v0.29.1 (2026-08-18) — a carta é arquivada antes de ser reescrita. A carta dela para seu eu futuro é um arquivo global de usuário compartilhado por cada trilha, e o ritual de descanso dizia reescrever sem nada antes — duas trilhas descansaram no mesmo dia e a segunda apagou a primeira. A convenção de arquivamento já era prática real (32 cópias datadas no disco); vivia no hábito, nunca na ferramenta. Agora é um passo testado: maude_letter_archive copia a carta viva para um nome datado antes de qualquer reescrita — datada pela própria linha de cabeçalho da carta antiga, slug sanitizado até [a-z0-9-], um arquivo com o mesmo nome contendo bytes diferentes nunca é sobrescrito, e a cópia é lida de volta byte por byte (cmp, senão python3 filecmp, então uma ferramenta de comparação ausente nunca pode se passar por uma cópia falha) — e ambas as portas dependem disso, o comando de descanso e a própria instrução do agente, que duas lentes independentes pegaram ainda dizendo reescrita simples. Sem cópia, sem reescrita, nunca. Três rodadas adversariais, cada correção revisada pela lente que a encontrou; dezoito testes incluindo um cp mentiroso que grava bytes errados e sai com 0. O open do trilho do navio também aprendeu que um branch de navio é uma forma (exatamente um commit à frente), não um nome.

v0.29.0 (2026-08-17) — a promoção pertence a ele, e a loja que ninguém contou. O descanso costumava promover qualquer coisa com pontuação 0.6 ou melhor direto para o cânon, incluindo o que o Claude havia meramente inferido sobre você, com uma pontuação que o próprio Claude deu a si mesmo — uma pontuação de importância é a opinião do agente sobre si mesmo, e uma opinião não é um mandato. Agora apenas suas próprias palavras se consolidam sozinhas, uma inferência de agente nunca auto-promove em nenhuma pontuação, /maude:promote coloca a lista na sua frente, e dismiss é a outra metade, porque uma lista à qual você só pode dizer sim não é uma escolha. Doze passes adversariais independentes em nove rodadas de revisão, e uma última contra o artefato que foi enviado, cada rodada quebrando a anterior; o gate resistiu todas as vezes e tudo ao redor não. remember() escreveu no cânon diretamente sem verificação de credencial e padronizando para sua autoridade (duas lentes encontraram independentemente — a mesma string capture recusada com exit 2 foi aceita com exit 0 e reproduzida sob "PALAVRAS DELE"). forget() filtrou apenas por importância, então algo que você realmente disse, com pontuação baixa, foi para um arquivo que nenhum comando lista. E o gate segurou a porta e depois rotulou mal o que passou por ela: wake, a única superfície que uma sessão acordada realmente lê, imprimiu cada linha do cânon sob "PALAVRAS DELE (renderização dele, use verbatim, nunca re-renderize)" incluindo uma inferência que você apenas aprovou — verdadeiro na tabela, falso na tela; agora divide por autoridade, suas palavras em um bloco e a redação aprovada do Claude em outro, nunca citável como suas. Uma importância NaN veio do SQLite como NULL e levantou TypeError dentro de ambos rest() e pending() em toda chamada posterior, para toda a fita, invisivelmente, porque o hook SessionEnd canaliza para /dev/null e sai com 0 independentemente — que é também onde o novo "N aguardando sua palavra" estava sendo impresso, então a fila que foi construída para parar de ser uma pilha silenciosa era uma; agora é dita no wake, onde é lida. O briefing da revisão disse que a fita tinha três lojas. Ela tem cinco tabelas, quatro delas contendo suas palavras, e rejections — a que o wake imprime verbatim, frase e razão — não tinha guarda em nenhuma camada; quatro revisores verificaram as três que receberam, porque um revisor pode falsificar uma afirmação que você faz, mas não uma que você nunca fez. O próximo briefing entregou a um revisor um inventário gerado por grep em vez de um digitado, e isso também estava errado: procurou INSERT INTO e perdeu INSERT OR IGNORE INTO, escondendo o escritor de voz cujos campos de rótulo também não tinham guarda. Uma lista gerada supera uma digitada apenas se o gerador estiver certo. E o hook de voz ao vivo estava deixando a máquina falar: harvest descarta turnos gerados por máquina por lei, o hook de captura v0.28.0 aplicava normalização e o filtro de segredos, mas não essa lei, enquanto seu docstring dizia "igual ao harvest" — 7 das 26 linhas que já havia capturado eram notificações de tarefas, 96KB, mediana de 12.448 caracteres contra uma mediana digitada real de 42. A guarda ganhou JWTs, cabeçalhos bearer, credenciais em URI, chaves secretas Stripe/SendGrid/DigitalOcean/npm/AWS e insensibilidade a maiúsculas, e ambos os motores normalizam espaços Unicode na entrada (o \s do python corresponde a U+00A0, o [:space:] POSIX não, então uma credencial colada de texto rico foi recusada pela fita e liberada pelo alarme de prompt). Deliberadamente não ampliou a classe de valores rotulados que uma lente pediu: medido contra o corpus real de 2.392 linhas que disparou em 20 linhas de código colado, e uma guarda que grita lobo no seu próprio hábito de colar é a que você aprende a ignorar. Zero falsos positivos, medidos. Suíte 198 → 307.

v0.28.0 (2026-08-14) — o corpus era duas vozes. Ela agora aprende a voz medida do usuário — o primeiro órgão do loop de aprendizado. Um hook de prompt silencioso e um harvest de streaming e idempotente alimentam uma tabela voice na fita; profile deriva os números (comprimento da frase, proporção de abertura em minúsculas, hábitos de pontuação, frases-martelo, palavras-sombra de IA); check --voice relata rascunho-vs-perfil após o veredicto do piso sem nunca tocar no código de saída — números, não um veredicto, porque uma pontuação de cadência seria uma guarda que responde à pergunta fácil. Formas de credencial são recusadas na ingestão (a própria lista de padrões do scan de prompt, referenciada cruzadamente em ambos os lados; o primeiro backfill real recusou 6), um teste de tripwire prova que o pacote não abre sockets além dos dois BYO, e o hook de captura é um observador até o osso: exit 0 em toda falha incluindo o relógio (uma fita travada custa 0,8s, não o padrão de cinco segundos do sqlite). O perfil deriva apenas de prosa digitada — o primeiro corpus real era duas vozes, 1.864 linhas digitadas vs 542 colagens carregando um milhão de palavras em forma de máquina — então linhas do tamanho de colagem são excluídas e confessadas no bloco de honestidade do perfil. Construído por três batedores, três construtores, três lentes adversariais e uma revisão de correção por correção; 14 mutações plantadas, 12 pegas, as 2 que escaparam agora fixadas; a poda que derreteu no primeiro corpus real é um índice invertido fuzzeado contra o algoritmo antigo em 11.500 tentativas. Suíte 94 → 180. O corpus e o perfil são dados da casa e nunca são enviados.

Maude's chore list on a recipe card — from the kitchen of Maude: wrote the handoff you didn't get to (41 sec, the small model), checked; clipped three coupons out of last week's papers, checked; a new gadget arrived, told you at the door, checked; still open — that CLAUDE.md hasn't been touched in a month, she'll keep mentioning it. Her margin note: I don't move a thing to the attic till you say so. —M.

Anteriormente. v0.27.x (2026-08-08) endureceu a pista de embarque e os portões em um arco — a auditoria de vazamento recusou uma build pública cujas histórias de incidente carregavam os caminhos literais da máquina do autor (as histórias permanecem verdadeiras, contadas em ~ em vez do endereço; o fallback do macOS sem $HOME aprendeu Directory Services, e os pins do CodeQL do dependabot foram dobrados para casa na noite em que foram mesclados), corpos de heredoc se tornaram dados para TODA família de portões (o fantasma << entre aspas fechou em vez de alargar), ela verifica seu próprio armário no SessionStart (uma instalação obsoleta nomeada como a armadilha que é, nascida de dez dias executando uma), e a segunda lente do trilho de embarque deve ter RUN — um open --review não-rascunho exige um carimbo de redteam mais novo que a ponta enviada. v0.26.0 cresceu dois órgãos — UNDO (um snapshot antes de cada escrita que o portão deliberadamente permite; /maude:undo coloca os bytes de volta, capturando os atuais primeiro, seu ledger confessando o que não capturou) e PROVE (um marcador de cadeia de hash sha256 para que uma liberação de nível RED custe um link único que Claude não pode fabricar) — e tornou os trilhos honestos: o trilho de missão portado para os payloads reais após ~1600 disparos silenciosos, a varredura de segredos observando a SAÍDA da ferramenta, o portão de infraestrutura varrendo verbos destrutivos de QUALQUER servidor MCP com falha-fechada, a lei de passe adversarial um trilho em vez de uma nota de diário. v0.25.0 chaveou o bloqueio rígido no alvo, não no verbo — depois que três fotos insubstituíveis passaram por um portão que conhecia apenas rm -rf, a destruição de cópia única agora bloqueia qualquer comando que a use, com nove linhas de falso positivo estruturais para que o portão nunca seja desligado por choro de lobo. v0.24.0 fechou o primeiro backlog de problemas de campo: o ledger de tokens (o gasto de contexto dos hooks registrado no trace e mostrado em /maude:receipts, tokens aproximados e nunca armazenados), o interruptor de emergência MAUDE_PROBE=off para o único recurso autônomo que ele não conseguia desligar, e /maude:lint percorrendo o cofre de memória da mesma forma que o flip percorre os assentos — primeiro dogfood em um cofre real de 490 arquivos cortou o ruído de ponteiros de 78 para 12. v0.23.0 ensinou ao comentário de quem era a sessão — sob uma frota de sessões concorrentes, cada entrada de trace carrega um rótulo de sessão, o drift-watch e a contagem de digest por sessão, e "Onde você parou" declara sua fonte em vez de se disfarçar; instalações solo leem exatamente como antes. v0.21.0 respondeu ao primeiro backlog de problemas de campo (#34–#38: roster somente com plugins reais, sussurros com TTL descartados com um recibo, contagens de captura terminando em um caminho para recibos, flip e brief resolvendo o mesmo armário) e construiu o campo de provas — make smoke prepara um git-archive de HEAD, a forma que um estranho realmente instala, e prova que valida, passa sua própria frota de dentro do arquivo, e saúda frio; páginas de release se cunham a partir do CHANGELOG, CodeQL observa o python enviado, toda ação de CI com SHA-pinned. v0.20.0 deu a ela mãos — o ledger de tarefas: o salvamento que ninguém digitou (seu pequeno modelo escreve o handoff, em um slot vazio ou sob seu próprio cabeçalho datado, nunca sobre o seu), o corte de cupom (linhas TODO vivas recortadas de dailies antigos antes de qualquer re-roll), a vigilância de novas chegadas, e a bandeira de CLAUDE.md obsoleto; toda tarefa concluída carimba seu custo, uma falha é carimbada como falha, e o re-roll do sótão só sai quando você entrega a chave a ela. v0.19.0 colocou valor antes da pá de lixo e adicionou o flip de assento: um snapshot pré-compactação (possivelmente a única cópia de uma sessão não salva) é deletado apenas quando um salvamento posterior o cobre, e /maude:cushions alcança onde nenhum sensor observa (commits não enviados, arquivos não commitados, repositórios somente locais ditos claramente como risco de cópia única, scratch envelhecido), reportando candidatos e nunca deletando, com uma mudança de nome de arquivo .parked que fica no assento de propósito. v0.18.1 parou o brief de despertar chorando lobo — a dica de padrão entre projetos rotaciona pelos cabeçalhos de entrada por dia do ano em vez de fixar para sempre em uma correspondência de corpo truncada em notícia falsa de última hora. v0.18.0 fechou o loop de memória — frontmatter superseded_by: aposenta uma nota do cofre da recordação sem tocar no markdown, o ranking pondera recência e tipo de nota ao lado de BM25, toda recordação é contabilizada em recall-log.jsonl e o ritual de descanso varre as notas mais disparadas por obsolescência (servir → verificar → revisar); o modelo do olho desfixado via MAUDE_EYE_MODEL. v0.17.0 ensinou o sussurro de despacho a ler workflows — chamadas agent() de um script de workflow nunca passam pela ferramenta Agent, e harnesses nomeados/padrão não definem model:, então todo agente fan-out herdou silenciosamente o carro-chefe; ela agora lê o script e sussurra uma vez quando chamadas agent() não carregam model: (para um workflow nomeado que ela não pode inspecionar, o sussurro carrega a regra de recuperação em vez disso). v0.16.0 adicionou o sussurro de despacho (ela observa em qual modelo os sub-agentes saem — um batedor de nível carro-chefe recebe um empurrão não bloqueante: combine o modelo à sub-tarefa) e o ponto de saída (SessionEnd registra o motivo, carimba seu armário, e deixa uma auto-nota honestamente rotulada quando 3+ trocas nunca foram salvas). v0.15.0 abriu o olho — um pacote maude_eye onde a cada ~25 chamadas de ferramenta um piscar de fundo digere atividade recente + a missão fixada + as notas do cofre dela e pergunta a um claude -p --model haiku descoberto (execute --safe-mode --no-session-persistence --tools "") se algo está errado; quase sempre silêncio, caso contrário UMA linha contida; selado pré-merge com limite de 30s, bloqueio atômico de spawn, e uma guarda de recursão provada sobre todos os 30 hooks (MAUDE_EYE=off o mata). v0.14.0 colocou o piso do cofre — um pacote maude_vault (python3 somente stdlib: sqlite3 + FTS5, sem pip, nunca), um índice descartável reconstruído a cada sessão a partir de suas notas de memória que pagina as notas relevantes do top-K em vez de despejar o índice (~1KB injetado onde o despejo era ~13KB, contra um corpus real de 397 notas), nascido endurecido e degradando para silêncio. v0.12.1 fez o portão parar de mentir em dois lugares (DROP TABLE entre aspas passou enquanto a prosa bloqueava falsamente; corpos de heredoc documentando rm -rf / bloquearam um commit legítimo — ambos reproduzidos ao vivo, corrigidos com teste-falho-primeiro). v0.12.0 fechou o loop de continuidade: SessionStart superfície "Onde você parou" do buffer ao vivo mais fresco, e uma guarda de continuidade avisa quando o trabalho rodou após o último salvamento — degrada alto, nunca silenciosamente. v0.11.0 deu a ela um leitor: o brief de início de sessão lidera com um catch-digest — uma linha simples do que ela pegou desde que John olhou por último, limitado por marca d'água, silencioso quando não há nada (uma auditoria de ~73k eventos rastreados mostrou os sussurros pousando em um canal sem leitor). v0.10.1 endureceu a espinha: padrões da família rm agora usam um esqueleto sem aspas para evitar bloqueio falso de prosa, e chaves de portão divididas em amarelo (auto-limpar por Claude) e vermelho (cópia única/público/irreversível — somente a linha ! de John). A linha v0.9.x foi disciplina de release e docs alcançando os trilhos: verify agora falha um release quebrado (uma referência a um comando cortado, um "O que há de novo" não condensado), scripts/release.sh propaga a versão para todo cabeçalho, e toda superfície pública foi feita trilhos-primeiro. v0.9.0 adicionou o trilho de retenção de missão (a regra "não deriva" que finalmente dispara — captura o plano, re-injeta a cada prompt, verifica na virada de ação), cortou quatro comandos de conveniência, e fez sua voz um trilho não um interruptor. v0.8.0 vestiu-a com o traje de portão — segurança em camadas, dirigida por configuração para execuções autônomas longas. A linha v0.5.x adicionou um tripwire de verificação (um sussurro antes de você commitar código que não foi re-verificado); v0.4.0 deixou uma carta para seu próximo eu; o arco v0.3.x foi endurecimento — auditorias frias, correções de bypass de portão, /maude:teach. Histórico completo no CHANGELOG.


Onde ela guarda as coisas

CaminhoPropósito
<project>/.maude/plugin/house-map.mdO que há nesta casa — lares de memória, ferramentas, lista de vigilância, o que ela notou. Atualizado por caminhadas.
<project>/.maude/plugin/trace/today-YYYY-MM-DD.jsonlRegistro passo a passo do que Claude fez hoje. Lido por /maude:check-on-claude.
<project>/.maude/plugin/care.jsonEstado leve: pin de missão atual, duração da sessão, contagem de prompts, bandeira de fadiga, cooldowns de deriva, tokens de liberação de portão amarelos, bandeira de CLAUDE.md não lido. Descartável.
<project>/.maude/plugin/care-redclear.jsonApenas tokens de liberação de portão vermelhos (cópia única/público/destruição de infra/force-push…). Caminhos de escrita fechados — ferramenta Write/Edit (negação de harness) + redirecionamentos de shell, cópias e mudanças de permissões (portão); a linha ! de John é o escritor limpo. (Uma escrita programática determinada — um interpretador, um verbo não listado — ainda a escapa. Não há jaula de SO atrás dela: em uma caixa de uid único, o agente e o ! de John rodam como o mesmo usuário, então a propriedade de arquivo não pode distingui-los. A guarda é a assimetria de canal + a rede de portões + a auditoria, não permissões de arquivo — veja a costura honesta do CHANGELOG.)
~/.claude/maude/identity.mdQuem é o usuário — o perfil vivo de Maude deles, moldado ao longo do tempo.
~/.claude/maude/patterns.mdCoisas entre projetos que ela notou sobre Claude.
~/.claude/maude/projects.jsonÍndice leve de quais workspaces ela caminhou.
~/.claude/maude/letter-from-maude.mdSua carta para seu próximo eu — o que ela pegou, o que perdeu, o que fazer diferente. Em /maude:rest a carta anterior é arquivada em uma cópia datada, então esta é reescrita; lida ao acordar.

Seus hooks apenas leem — ~/.claude/projects/<slug>/memory/ (auto-memória Anthropic), <project>/.remember/ (o pipeline do plugin companheiro remember), e seu próprio ~/.claude/maude/ — nunca escrevem, então o caminho quente permanece rápido e sem efeitos colaterais. Uma exceção rotulada, fora do caminho quente: o hook SessionEnd pode deixar uma auto-nota de uma linha em .remember/remember.md — apenas em um fim verdadeiro, apenas em um slot vazio, nunca sobre um handoff real. Seus comandos /maude:save e /maude:rest escrevem o digest da sessão: distribuído para now.md / today-*.md / recent.md no diretório de auto-memória, e remember.md no formato de handoff .remember/. /maude:rest também arquiva a carta anterior em uma cópia datada, então reescreve sua carta para seu próximo eu.


O cofre de memória (beta)

Maude mantém um índice SQLite local de suas notas de memória e superfície as relevantes quando você faz uma pergunta — junto com o brief de início de sessão (que um incremento posterior reduzirá à medida que a paginação se prova). É reconstruído a cada sessão a partir do seu diretório de memória. Python3 puro stdlib — sem pip install, sem serviços. O banco de dados vive em .maude/plugin/vault.db e é descartável (delete-o e ele se reconstrói).

O olho (beta)

A cada ~25 chamadas de ferramenta, Maude dá uma olhada de fundo na sessão — um digest compacto de atividade recente, a missão fixada e as notas que seu cofre pagina — e pergunta ao seu próprio modelo (um claude -p --model haiku descoberto; nada é enviado, nada instala) se algo está errado: agitação, deriva, uma afirmação não verificada, um humano rodando no limite. Quase sempre a resposta é silêncio. Quando não é, o próximo prompt carrega uma linha — **Maude:** … — uma vez, e isso é tudo. Sem runner na caixa → o olho simplesmente permanece escuro.


Seu ofício

A mulher que administrava uma casa americana de meados do século estava administrando uma operação — inventário, orçamento, agendamento, logística, controle de qualidade — e ela a administrava tão bem que o mundo esqueceu que era trabalho. Seu ofício até tinha um nome: engenharia doméstica — Christine Frederick a escreveu em 1919 como um curso que você podia fazer pelo correio (Wellcome Collection). E o ofício tinha portadores: a partir de 1914, os agentes de demonstração doméstica do USDA Extension Service levaram métodos de administração doméstica pesquisados de porta em porta (NIFA, NAL). A descoberta mais difícil da era é aquela contra a qual Maude foi construída: cinco décadas de novos eletrodomésticos nunca encurtaram sua semana — cerca de 52 horas em 1924, cerca de 55 em 1966. O trabalho apenas mudou de forma e permaneceu invisível. Então o livro-caixa de Maude existe para tornar o trabalho visível — o que foi feito, quanto custou, o que ainda está esperando — e sua agenda segue a própria doutrina do ofício: ajustada ao ritmo da casa, nunca dia-de-lavar-como-lei. Ela recebeu esse nome em homenagem àquela mulher. É uma honra.


Como ela funciona

/maude:found percorre o espaço de trabalho e lista o que existe com rótulos de formato universal — markdown / sqlite / dir / mcp / serviço-em-execução. Ela percorre o esquema de qualquer banco SQLite em modo somente leitura. Ela não faz correspondência de padrões com aplicativos conhecidos; ela lê o que está lá e o apresenta para o usuário (ou para o raciocínio do LLM em tempo de execução) interpretar.

Modelo de camadas. As fontes são classificadas por (localidade, formato). Camada 0 = local em disco (markdown / sqlite / arquivo) — sempre barato. Camada 1 = serviço local (MCP stdio / daemon localhost) — verificado uma vez no Início da Sessão, armazenado em cache. Camada 2 = serviço de rede — apenas no final da sessão (/maude:rest / /maude:save para um destino registrado e autenticado). Camada 3 = contexto de sessão efêmero — apenas referência. Os hooks vivem na Camada 0.

Nova a cada sessão. Ela não carrega suposições entre sessões. Cada varredura relê o espaço de trabalho; se algo mudou, o mapa da casa reflete isso. Arquivos de memória que ela escreveu antes são entradas para leitura, não estado para confiar sem verificação.


Documentação

GuiaO que contém
commands/Todos os comandos de barra como fonte markdown
agents/maude.mdDefinição de subagente
hooks/hooks.jsonConfiguração de hooks de ciclo de vida
skills/maude/SKILL.mdAcionamento de habilidades e uso amplo

Contribuindo

Veja CONTRIBUTING.md.


Licença

Apache 2.0. Veja LICENSE.