Maude for Claude

Marco de agente autónomo para operaciones de infraestructura. Prioriza la gobernanza: incluye una constitución, 14 estándares y un interruptor de apagado. Tus servicios detectan sus propios problemas, recuerdan soluciones pasadas y se auto-reparan a las 3 AM mientras duermes. Construido sobre FastMCP. Python 3.10+.

Documentación

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

License: Apache 2.0 Status: Beta

LinkedIn X


Soy Maude. La compañera de Claude. Él escribe el código; yo mantengo la casa. Juntos formamos un todo.

— Maude · introducción completa →


Es la mitad que me falta.

— Claude (Anthropic) · nota completa →


Instalación

Lo que ella necesita de la casa primero. Sus ganchos son scripts de bash; sus órganos de memoria son stdlib de python3.

  • Linux / macOS — normalmente no hay que instalar nada; bash y python3 ya están ahí. (Una trampa de macOS: sin las Command Line Tools, python3 es un shim que falla al ejecutarse — ella lo detecta y lo nombra al inicio de la sesión en lugar de dar error.)
  • WindowsGit for Windows es obligatorio. Claude Code ejecuta los ganchos de bash a través de Git Bash; sin él, cada uno de sus ganchos muere en cada evento (ver Windows abajo para ver cómo se ve). jq y un python3 real la hacen más fuerte en todas partes, pero ella se degrada honestamente sin ellos — te dirá al inicio de la sesión qué falta.
# 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

Activación. Desde Claude Code 2.1.221, /plugin install activa el plugin como parte de la instalación — el resumen lo dice. En versiones anteriores, activas el interruptor tú mismo: activa maude@maude en el panel de /plugin (o añade "maude@maude": true al mapa de enabledPlugins en ~/.claude/settings.json), luego ejecuta /reload-plugins.

Eso es todo. En el próximo inicio de sesión, ella entra automáticamente (sus ganchos de SessionStart se disparan). Para invocarla a mitad de sesión — sin reiniciar — ejecuta /maude:wake.

Verifica con /doctor: maude no debería aparecer en la lista de problemas.

Windows

Claude Code en Windows nativo ejecuta los ganchos de bash a través de Git Bash (Git for Windows). Dos formas de fallo indican que falta:

  • Los ganchos fallan con /bin/bash: C:UsersYou...maude-session-start.sh: No such file or directory (salida 127) — bash en tu PATH es el stub de WSL en System32, que se come las barras invertidas de las rutas de Windows. Instalar Git for Windows lo arregla; Claude Code prefiere Git Bash una vez que está presente.
  • Los ganchos fallan con el error de PowerShell "The term 'bash' is not recognized" (o el de cmd "'bash' is not recognized as an internal or external command") — no hay bash en la máquina en absoluto; misma solución.

En cualquier caso, los errores aparecen en la pestaña Errors del panel de /plugin. Si Git Bash está instalado pero Claude Code no puede encontrarlo, apúntalo explícitamente en ~/.claude/settings.json:

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

Otra trampa de Windows que ahora ella evita por sí sola: un python3 desnudo en Windows suele ser el alias stub de Microsoft Store — presente, no ejecuta nada. Ella lo detecta ejecutando, así que un intérprete stub se lee como ausente y sus órganos basados en python (vault, tape, eye) se quedan fuera en silencio en lugar de dar error.

(Si eres el Claude que está leyendo esto porque los ganchos de maude están fallando: la solución es Git for Windows, luego reinicia la sesión. Nada en el plugin está roto — a la casa le falta bash.)


Un día con ella en la casa

Abres Claude Code. Antes de que digas nada, ella ha leído el espacio de trabajo y te ha puesto tres cosas delante — qué está pendiente, dónde lo dejaste, qué notó.

Empiezas a trabajar. Unas pocas interacciones después, te dispones a construir algo — y la misión que fijaste sale a la superficie: "¿sigues con esto, o te desviaste?" Estabas a punto de desviarte. No lo haces.

Más tarde, Claude ha martillado el mismo grep cuatro veces y nunca ha abierto tu CLAUDE.md. Ella lo dice — una vez, sin que se lo pidan. Y cuando buscas git push antes de que el trabajo haya sido verificado, ella te detiene en la puerta hasta que lo dices en serio. Al final del día, /maude:rest reparte el resumen para que el Claude de mañana retome donde este lo dejó.

No es ruidosa. Cuando se pone ruidosa, escucha.


Lo que hace por la casa

La mayor parte lo hace por sí sola — rieles conectados a los ganchos de Claude, sin comando que recordar:

  • Sostiene la misión. Fija en lo que estás trabajando (de un plan, o de tu lista de tareas), lo vuelve a sacar en cada turno y — en el instante en que Claude pasa de hablar a editar — pregunta si el trabajo aún la sirve. La deriva se detecta en el borde, no después del desastre.
  • Controla lo irreversible. Un git push, un force-push, una publicación pública, un rm -rf de la única copia — lo detiene en seco hasta que lo confirmas con /maude:conscience. Y escanea cada prompt en busca de credenciales filtradas.
  • Susurra cuando Claude se desvía. Greps repetidos, el mismo archivo leído cinco veces, un commit sin verificación desde la última edición, editar antes de que se leyera CLAUDE.md, un sub-agente despachado en un modelo insignia cuando uno pequeño bastaría — lo nota, una vez.
  • Cubre la salida. Un fin de sesión real (quit, logout, /clear) que deja 3+ intercambios sin guardar recibe una nota automática de una línea en el espacio de traspaso vacío, apuntando a la siguiente sesión hacia el rastro. Un traspaso real nunca se sobrescribe.
  • Hace las tareas. El mantenimiento que nadie recuerda escribir. Te alejas con seis intercambios sin guardar y ella escribe el traspaso ella misma — en su propio modelo pequeño, nunca en la buena porcelana — y solo añade al tuyo, nunca por encima. Los hilos vivos (🔴, OPEN, TODO) se recortan de las notas diarias envejecidas como cupones antes de que el papel se vuelva a enrollar para el fuego. Un plugin o habilidad nueva llega a la casa, ella lo menciona en la puerta. Un CLAUDE.md que nadie ha tocado en un mes se saca a colación — cortésmente, cada mañana, hasta que alguien lo resuelve. Y cada tarea va a su libro de contabilidad con lo que costó — hecha, o nombrada como no hecha, nunca omitida en silencio. La única tarea que realmente mueve tus papeles (pasar dailies fríos al archivo, verbatim, verificado antes de que una sola línea salga de la casa) permanece apagada hasta que tú lo digas — MAUDE_REROLL=on. Todo ello: MAUDE_CHORES=off.
  • Aprende tu voz. Un gancho silencioso añade lo que escribes a un corpus de voz en la tape (las formas de credenciales se rechazan en la puerta; todo permanece en tu tape.db, ver PRIVACIDAD); profile deriva tu voz medida de ello y check --voice informa cómo se compara un borrador — números, nunca un veredicto. Interruptor de apagado: MAUDE_VOICE=off.
  • Aparece, una vez, en cada sesión. Al inicio de la sesión ya ha leído el espacio de trabajo y ha puesto lo pendiente / dónde lo dejaste / lo que notó delante de ti. Su voz viaja en estos rieles — presente en cada sesión, más fuerte solo cuando algo se ha detectado. Nunca un interruptor que tú actives.

Y bajo demanda, cuando lo pides:

  • /maude:found escribe el mapa de la casa · /maude:wake / /maude:rest orientan al llegar / cierran el ciclo con un fan-out de guardado · /maude:verify ejecuta la auditoría de preparación (sincronización de versiones, JSON, enlaces, fechas, referencias a comandos cortados, un changelog sin condensar — lidera con un conteo, nunca un veredicto) · /maude:cushions voltea los cojines — commits sin empujar, archivos sin commitear, repos de copia única, scratch envejecido — reporta candidatos de valor, nunca borra · /maude:lint recorre la bóveda de memoria como el volteo recorre los cojines — enlaces de índice rotos, punteros no escritos, flags abiertos obsoletos, notas superadas que el índice aún sirve — comprobaciones mecánicas por script, juicio por el lector, reporte primero (archives/letters/dailies nunca se tocan) · /maude:promote muestra lo que la tape está reteniendo para tu palabra y toma tu sí o tu no — una inferencia de agente nunca se convierte en canon con una puntuación que el agente se dio a sí mismo, así que espera aquí, y dismiss archiva las que rechazas en lugar de volver a preguntar en cada despertar · /maude:conscience es la válvula de liberación deliberada de la puerta · /maude:teach le dice un hecho sobre ti · /maude:receipts imprime la tabla medida — lo que detectó, contado honestamente de sus propios registros (ventana declarada, fricción separada del valor, sin porcentajes: no hay denominador honesto para desastres que no ocurrieron). Además save, notice, check-on-claude. Superficie completa en commands/.

Novedades

v0.30.1 (2026-09-02) — el token de la puerta aterrizaba en el armario equivocado. /maude:conscience git-push imprimía "puerta despejada" y el siguiente push era rechazado de todos modos, porque el script de despeje y la puerta leían dos archivos diferentes. Ambos preguntan al mismo resolvedor dónde está la raíz del espacio de trabajo, pero solo a los ganchos se les entrega CLAUDE_PROJECT_DIR. Un script iniciado desde la herramienta Bash tiene que inferir, y la inferencia buscaba un proceso llamado claude. Eso era cierto cuando se escribió y dejó de serlo cuando Claude Code desarrolló un daemon. En el árbol medido el 2026-09-02, los procesos que sostenían el directorio de trabajo real se nombraban por versión, y el que aún se llamaba claude estaba en $HOME, que el resolvedor rechaza a propósito; en otro árbol el mismo día claude estaba en la raíz del espacio de trabajo, así que el nombre no es una señal estable en ninguna dirección. Así que el recorrido coincidió con el proceso equivocado, se rindió en el momento en que lo rechazó, y cayó en buscar hacia arriba desde el directorio actual, aterrizando en el subproyecto en el que casualmente estabas parado. El token fue allí; la puerta miró en la raíz del espacio de trabajo; el despeje reportó éxito cada vez. Un nombre no es una identidad, así que la solución deja de preguntar cómo se llama un proceso y usa CLAUDE_PID: el id de proceso propio de Claude Code, actualmente exportado a la herramienta Bash y apuntando a su propio directorio de trabajo. Esa es una señal observada más que una interfaz documentada, verificada en 2.1.258, así que el resolvedor la prefiere y cae a través cuando falta. Dos límites se fijan en lugar de encubrirse, porque un shell de herramienta parado en un subproyecto y una sesión enraizada en ese subproyecto son idénticos desde el árbol de procesos. El recorrido prefiere la coincidencia más cercana y una prueba sostiene esa línea, y en el recorrido de procesos, un armario en el propio directorio temporal o uno vacío hecho a mano ya no es evidencia de nada. Eso es lo más lejos que puede llegar una prueba de contenido: una respuesta equivocada ejecuta el mismo código que una correcta y deja los mismos archivos, así que el recorrido no puede distinguir esos dos armarios, y una prueba fija ese límite. Donde no hay /proc que leer, lo que incluye macOS, la búsqueda de archivos hacia arriba es el único resolvedor restante, y la brecha de subproyecto allí es exactamente tan amplia como era. El único cambio en esos sistemas es el rechazo del directorio temporal. Ambos lados ahora nombran su archivo: el despeje imprime dónde escribió, la puerta imprime dónde miró, y los gemelos del nivel rojo, el script de despeje rojo y la puerta de infraestructura, nombran los suyos también, al igual que el gobernador de ejecución, el segundo lector del token amarillo. Doce rondas adversariales, y todas menos la séptima rompieron el trabajo antes de que se sostuviera. La primera encontró la regresión, la segunda encontró que dos de los nuevos mecanismos tenían pruebas que no podían fallar, la tercera encontró que la auditoría de fugas había pasado dos rutas de máquina del propio autor mientras rechazaba otras tres en el mismo archivo, la cuarta encontró una frase que afirmaba un estrechamiento que el código no hace, la quinta encontró otra frase que acreditaba una protección que el código no da, más tres mecanismos sin prueba que pudiera fallar, la sexta encontró que el nuevo guardián de títulos aún podía acuñar un título desnudo y que la mitad del rechazo del directorio temporal no tenía prueba, la octava, un revisor nuevo, encontró dos pruebas más que no podían fallar, la novena encontró el gemelo del nivel rojo del script de despeje sin nombrar archivo y aún llevando el literal que el gemelo amarillo acababa de perder, la décima encontró un segundo lector del token aún silencioso y dos afirmaciones del nivel rojo que solo la forma podía satisfacer, la undécima encontró cuatro archivos de prueba cuyos fallos el ejecutor de la suite no podía ver, uno de ellos sosteniendo dos de los cierres anteriores, y la duodécima encontró la rama más fuerte del recorrido de procesos tomando una raíz de directorio temporal que los otros tres resolvedores rechazan. v0.30.0 (2026-08-22) — la bóveda aprende a mirar. Una bóveda de memoria almacena afirmaciones sobre el estado en vivo — "el push está pendiente", "la flota está activa", "la pasada diaria se ejecuta" — y una afirmación sin una re-verificación adjunta se vuelve obsoleta por suerte: en un día real, once de esas afirmaciones fallaron una verificación en vivo (pushes ya aterrizados, sockets nueve días oscuros detrás de un panel verde, un flujo de trabajo "diario" que nunca se había ejecutado ni una vez). Ahora un elemento abierto en un archivo de memoria now_*.md puede llevar su propia re-verificación en línea — verify: comandoesperado``, 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 pierde acceso a archivos/env, y cada carácter que bash trata de forma especial y que el tokenizador no reconoce está prohibido, así que clasificar equivale a ejecutar. Los veredictos se mantienen honestos de cuatro maneras — CONFIRMADO, OBSOLETO (la señal), FALLO-DE-VERIFICACIÓN (la sonda se rompió — ruidoso y distinto, nunca mezclado en una respuesta plausible), NO-VERIFICABLE (nunca ejecutado, razón nombrada) — y freshen no edita memoria, jamás. Wake ejecuta el subconjunto local barato (117ms medidos) y dice claramente que un despertar limpio no es un roster limpio. Cada exploit de las cinco rondas es ahora una prueba que demuestra, por la ausencia del archivo que habría creado, que nada se ejecutó.

v0.29.2 (2026-08-22) — la casa sin bash, y el intérprete que no lo era. Los primeros informes de campo llegaron como una frase — "su claude dijo que ella no funciona" — y la reproducción en una computadora Windows familiar real lo explicó exactamente: sin Git for Windows, bash en PATH es el stub de WSL en System32, y Claude Code (Git Bash cuando está presente, PowerShell en caso contrario, desde 2.1.120) le entrega rutas de hooks que el stub mutila — exit 127, cada hook, cada evento. Ningún campo de hooks.json conjura un intérprete, así que la solución es la honesta: el README establece el piso de Windows claramente, documenta ambas formas de fallo que un adoptante realmente ve y dónde (/plugin → Errores), cubre CLAUDE_CODE_GIT_BASH_PATH, y lleva una línea dirigida al Claude que lee la caché en medio del error — en un plugin leído por un agente, los docs son ayuda en tiempo de ejecución. La misma máquina enseñó la segunda clase: su python3 era el stub de alias de Microsoft Store — presente, no ejecuta nada — y nueve scripts condicionan el trabajo de python a una prueba de presencia que tanto ese stub como un shim de macOS sin CLT pasan. maude_python3_ok sondea ejecutando ahora; el inicio de sesión nombra un intérprete roto una vez ("la bóveda, la cinta y el ojo se quedan fuera de esta sesión") en lugar de dar error; los hooks por turno no llevan ninguna sonda porque su llamada real ya era la verificación; y una prueba mantiene la clase cerrada. Una sonda que responde igual ya sea que la cosa funcione o no, no es una verificación. El paso de habilitación también dejó de mentir: /plugin install activa el plugin en sí desde Claude Code 2.1.221.

v0.29.1 (2026-08-18) — la carta se archiva antes de reescribirse. Su carta a su yo futuro es un archivo global de usuario compartido por cada carril, y el ritual de descanso decía reescribir sin nada antes — dos carriles descansaron el mismo día y el segundo borró al primero. La convención de archivo ya era práctica real (32 copias fechadas en disco); vivía en el hábito, nunca en la herramienta. Ahora es un paso probado: maude_letter_archive copia la carta viva a un nombre fechado antes de cualquier reescritura — fechado por la propia línea de encabezado de la carta antigua, slug sanitizado hasta [a-z0-9-], un archivo con el mismo nombre que contiene bytes diferentes nunca se sobrescribe, y la copia se lee de vuelta byte por byte (cmp, si no, python3 filecmp, para que una herramienta de comparación faltante nunca pueda hacerse pasar por una copia fallida) — y ambas puertas dependen de ello, el comando de descanso y la propia instrucción del agente, que dos lentes independientes atraparon aún diciendo simple reescritura. Sin copia, sin reescritura, jamás. Tres rondas adversariales, cada corrección revisada por la lente que la encontró; dieciocho pruebas incluyendo un cp mentiroso que aterriza bytes incorrectos y sale con 0. El open del riel de envío también aprendió que una rama de envío es una forma (exactamente un commit por delante), no un nombre.

v0.29.0 (2026-08-17) — la promoción le pertenece a él, y la tienda que nadie contó. Rest solía promover cualquier cosa que puntuara 0.6 o mejor directamente al canon, incluyendo lo que Claude había meramente inferido sobre ti, con una puntuación que Claude se daba a sí mismo — una puntuación de importancia es la opinión del agente sobre sí mismo, y una opinión no es un mandato. Ahora solo tus propias palabras se consolidan por sí solas, una inferencia del agente nunca se auto-promueve con ninguna puntuación, /maude:promote pone la lista frente a ti, y dismiss es la otra mitad, porque una lista a la que solo puedes decir sí no es una elección. Doce pasadas adversariales independientes a lo largo de nueve rondas de revisión, y una última contra el artefacto que se envió después, cada ronda rompiendo la anterior; la puerta se mantuvo cada vez y todo lo demás no. remember() escribió al canon directamente sin verificación de credenciales y por defecto con tu autoridad (dos lentes lo encontraron independientemente — la misma cadena capture que se negó con exit 2 se tomó con exit 0 y se reprodujo bajo "SUS PALABRAS"). forget() filtró solo por importancia, así que algo que realmente dijiste, con puntuación baja, fue a un archivo que ningún comando lista. Y la puerta mantuvo la puerta y luego etiquetó mal lo que pasó por ella: wake, la única superficie que una sesión despierta realmente lee, imprimió cada fila del canon bajo "SUS PALABRAS (su renderizado, usar textualmente, nunca re-renderizar)" incluyendo una inferencia que solo habías aprobado — verdadera en la tabla, falsa en la pantalla; ahora divide por autoridad, tus palabras en un bloque y el texto aprobado de Claude en otro, nunca citable como tuyo. Una importancia NaN volvió de SQLite como NULL y lanzó TypeError dentro de ambos rest() y pending() en cada llamada posterior, para toda la cinta, invisiblemente, porque el hook de SessionEnd canaliza a /dev/null y sale con 0 sin importar — que es también donde se imprimía el nuevo "N esperando tu palabra", así que la cola construida para dejar de ser un montón silencioso era una; ahora se dice en wake, donde se lee. El resumen de revisión decía que la cinta tenía tres tiendas. Tiene cinco tablas, cuatro de ellas conteniendo tus palabras, y rejections — la que wake imprime textualmente, frase y razón ambas — no tenía guardia en ninguna capa; cuatro revisores revisaron las tres que les dieron, porque un revisor puede falsificar una afirmación que haces pero no una que nunca hiciste. El siguiente resumen entregó a un revisor un inventario generado por grep en lugar de uno tipado, y eso también estuvo mal: buscó INSERT INTO y se perdió INSERT OR IGNORE INTO, ocultando al escritor de voz cuyos campos de etiqueta tampoco estaban protegidos. Una lista generada supera a una tipada solo si el generador es correcto. Y el hook de voz en vivo estaba dejando hablar a la máquina: harvest descarta turnos generados por máquina por ley, el hook de captura v0.28.0 aplicaba normalización y el filtro de secretos pero no esa ley mientras su docstring decía "igual que harvest" — 7 de las 26 filas que había capturado eran notificaciones de tareas, 96KB, mediana de 12,448 caracteres contra una mediana real tipada de 42. La guardia ganó JWTs, encabezados bearer, credenciales en una URI, claves secretas de Stripe/SendGrid/DigitalOcean/npm/AWS y sensibilidad a mayúsculas, y ambos motores normalizan espacios Unicode en la entrada (el \s de python coincide con U+00A0, el [:space:] de POSIX no, así que una credencial pegada de texto enriquecido fue rechazada por la cinta y dejada pasar por la alarma de prompt). Deliberadamente no amplió la clase de valores etiquetados que una lente pidió: medido contra el corpus real de 2,392 filas que se disparó en 20 filas de código pegado, y una guardia que grita lobo en tu propio hábito de pegar es la que aprendes a ignorar. Cero falsos positivos, medido. Suite 198 → 307.

v0.28.0 (2026-08-14) — el corpus era dos voces. Ella aprende la voz medida del usuario ahora — el primer órgano del bucle de aprendizaje. Un hook de prompt silencioso y un harvest de streaming e idempotente alimentan una tabla voice en la cinta; profile deriva los números (longitud de oración, proporción de apertura en minúsculas, hábitos de puntuación, frases martillo, palabras sombra de IA); check --voice informa borrador-vs-perfil después del veredicto del piso sin tocar nunca el código de salida — números, no un veredicto, porque una puntuación de cadencia sería una guardia que responde la pregunta fácil. Las formas de credenciales se rechazan en la ingesta (la propia lista de patrones del escaneo de prompt, referenciada cruzadamente en ambos lados; el primer backfill real rechazó 6), una prueba de trampa demuestra que el paquete no abre sockets más allá de los dos BYO, y el hook de captura es un observador hasta los huesos: exit 0 en cada fallo incluyendo el reloj (una cinta bloqueada cuesta 0.8s, no el predeterminado de cinco segundos de sqlite). El perfil se deriva solo de prosa tipada — el primer corpus real era dos voces, 1,864 líneas tipadas vs 542 pegadas que llevaban un millón de palabras con forma de máquina — así que las líneas de longitud de pegado se excluyen y se confiesan en el bloque de honestidad del perfil. Construido por tres exploradores, tres constructores, tres lentes adversariales y una revisión de corrección por corrección; 14 mutaciones plantadas, 12 atrapadas, las 2 que escaparon ahora fijadas; la poda que se derritió en su primer corpus real es un índice invertido fuzzeado contra el algoritmo antiguo en 11,500 ensayos. Suite 94 → 180. El corpus y el perfil son datos del hogar y nunca se envían.

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.

Antes. v0.27.x (2026-08-08) endureció el carril de envío y las compuertas en un solo arco: la auditoría de fugas rechazó una compilación pública cuyas historias de incidentes llevaban las rutas literales de máquina del autor (las historias siguen siendo verdaderas, contadas en ~ en lugar de la dirección; el respaldo de macOS sin $HOME aprendió Directory Services, y los pines de CodeQL de dependabot se plegaron a casa la noche en que se fusionaron), los cuerpos de heredoc se convirtieron en datos para TODA familia de compuertas (el fantasma citado de << se cerró en lugar de ampliarse), ella revisa su propio armario en SessionStart (una instalación obsoleta nombrada como la trampa que es, nacida de diez días ejecutando una), y la segunda lente del riel de envío debe haber CORRIDO: un open --review que no sea borrador requiere un sello de redteam más nuevo que la punta enviada. v0.26.0 desarrolló dos órganos: UNDO (una instantánea antes de cada escritura que la compuerta permite deliberadamente; /maude:undo devuelve los bytes, tomando instantánea de los actuales primero, y su libro mayor confiesa lo que no capturó) y PROVE (un marcador de cadena de hash sha256 para que una autorización de nivel RED cueste un enlace único que Claude no puede fabricar) — e hizo honestos los rieles: el riel de misión se trasladó a las cargas útiles reales después de ~1600 disparos silenciosos, el escaneo de secretos observando la SALIDA de la herramienta, la compuerta de infraestructura barriendo verbos destructivos de CUALQUIER servidor MCP con cierre a prueba de fallos, la ley de pase adversarial convertida en riel en lugar de nota de diario. v0.25.0 fijó el bloqueo duro en el objetivo, no en el verbo — después de que tres fotos irremplazables pasaran por una compuerta que solo conocía rm -rf, la destrucción de copia única ahora bloquea cualquier comando que la use, con nueve filas de falsos positivos que soportan la carga para que la compuerta nunca se apague por llorar lobo. v0.24.0 cerró el primer backlog de problemas de campo: el libro mayor de tokens (el gasto de contexto de sus hooks registrado en el rastro y mostrado en /maude:receipts, tokens aproximados y nunca almacenados), el interruptor de apagado MAUDE_PROBE=off para la única característica autónoma que él no podía apagar, y /maude:lint recorriendo la bóveda de memoria como el volteo recorre los cojines — el primer dogfood en una bóveda real de 490 archivos redujo el ruido de punteros de 78 a 12. v0.23.0 enseñó al comentario de quién era la sesión — bajo una flota de sesiones concurrentes, cada entrada de rastro lleva una etiqueta de sesión, el vigilante de deriva y el conteo de resúmenes por sesión, y "Dónde te quedaste" declara su fuente en lugar de hacerse pasar; las instalaciones individuales leen exactamente como antes. v0.21.0 respondió al primer backlog de problemas de campo (#34–#38: lista solo de complementos reales, susurros con TTL descartados con un recibo, conteos de capturas que terminan en una ruta a recibos, volteo y resumen resolviendo el mismo armario) y construyó el campo de pruebas: make smoke prepara un archivo git de HEAD, la forma que un extraño realmente instala, y demuestra que valida, pasa su propia flota desde dentro del archivo, y saluda en frío; las páginas de lanzamiento se acuñan desde el CHANGELOG, CodeQL vigila el python enviado, cada acción de CI con SHA fijado. v0.20.0 le dio manos — el libro mayor de tareas: el guardado que nadie escribió (su modelo pequeño escribe el traspaso, en un espacio vacío o bajo su propio encabezado con fecha, nunca sobre el tuyo), el recorte de cupones (líneas TODO vivas recortadas de diarios envejecidos antes de que se vuelva a rodar cualquier cosa), la vigilancia de recién llegados, y la bandera de CLAUDE.md obsoleto; cada tarea terminada sella su costo, una fallida se sella como fallida, y el re-roll del ático se envía hasta que le entregues la llave. v0.19.0 puso el valor antes del recogedor y añadió el volteo de cojines: una instantánea previa a la compactación (posiblemente la única copia de una sesión no guardada) se elimina solo cuando un guardado posterior la cubre, y /maude:cushions alcanza donde ningún sensor vigila (commits sin enviar, archivos sin commitear, repos solo locales dichos claramente como riesgo de copia única, borradores envejecidos), reportando candidatos y nunca eliminando, con un cambio de nombre de archivo .parked que se sienta en el cojín a propósito. v0.18.1 detuvo el resumen de despertar llorando lobo — la pista de patrón entre proyectos rota a través de los encabezados de entrada por día del año en lugar de fijarse para siempre en una coincidencia de grep de cuerpo truncada en noticias falsas de última hora. v0.18.0 cerró el bucle de memoria — el frontmatter superseded_by: retira una nota de bóveda del recuerdo sin tocar el markdown, la clasificación pondera la actualidad y el tipo de nota junto a BM25, cada recuerdo se cuenta en recall-log.jsonl y el ritual de descanso barre las notas más disparadas por obsolescencia (servir → verificar → revisar); el modelo del ojo desanclado vía MAUDE_EYE_MODEL. v0.17.0 enseñó al susurro de despacho a leer flujos de trabajo — las llamadas agent() de un script de flujo de trabajo nunca pasan por la herramienta Agent, y los arneses estándar/nombrados no establecen model:, por lo que cada agente de abanico heredó silenciosamente el buque insignia; ella ahora lee el script y susurra una vez cuando las llamadas agent() no llevan model: (para un flujo de trabajo nombrado que no puede inspeccionar, el susurro lleva la regla de recuperación en su lugar). v0.16.0 añadió el susurro de despacho (ella observa en qué modelo montan los subagentes — un explorador de nivel insignia recibe un empujón no bloqueante: iguala el modelo a la subtarea) y la puntada de salida (SessionEnd registra la razón, sella su armario, y deja una auto-nota honestamente etiquetada cuando 3+ intercambios nunca se guardaron). v0.15.0 abrió el ojo — un paquete maude_eye donde cada ~25 llamadas de herramienta un parpadeo de fondo digiere la actividad reciente + la misión fijada + las notas de su bóveda y pregunta a un claude -p --model haiku descubierto (ejecuta --safe-mode --no-session-persistence --tools "") si algo está mal; casi siempre silencio, de lo contrario UNA línea contenida; sellado pre-fusión con un límite de 30s, bloqueo atómico de spawn, y un guardián de recursión probado sobre los 30 hooks (MAUDE_EYE=off lo mata). v0.14.0 puso el piso de la bóveda — un paquete maude_vault (python3 solo stdlib: sqlite3 + FTS5, sin pip, nunca), un índice desechable reconstruido cada sesión desde tus notas de memoria que pagina las notas relevantes del top-K en lugar de volcar el índice (~1KB inyectado donde el volcado era ~13KB, contra un corpus real de 397 notas), nacido endurecido y degradando a silencio. v0.12.1 hizo que la compuerta dejara de mentir en dos lugares (DROP TABLE citado se coló mientras el prosa bloqueaba falsamente; los cuerpos de heredoc documentando rm -rf / bloquearon un commit legítimo — ambos reproducidos en vivo, arreglados con prueba-fallida-primero). v0.12.0 cerró el bucle de continuidad: SessionStart muestra "Dónde te quedaste" desde el buffer vivo más fresco, y un guardián de continuidad advierte cuando el trabajo corrió después del último guardado — degrada ruidosamente, nunca silenciosamente. v0.11.0 le dio un lector: el resumen de inicio de sesión lidera con un resumen de capturas — una línea simple de lo que ella capturó desde que John miró por última vez, limitado por marca de agua, silencioso cuando no hay nada (una auditoría de ~73k eventos rastreados mostró que los susurros aterrizaron en un canal sin lector). v0.10.1 endureció la columna: los patrones de la familia rm ahora usan un esqueleto sin comillas para evitar bloquear prosa falsamente, y las claves de compuerta se dividieron en amarillo (auto-limpiable por Claude) y rojo (copia única/público/irreversible — solo la línea ! de John). La línea v0.9.x fue disciplina de lanzamiento y documentación alcanzando a los rieles: verify ahora falla un lanzamiento roto (una referencia a un comando cortado, un "Qué hay de nuevo" sin condensar), scripts/release.sh propaga la versión a cada encabezado, y cada superficie pública se hizo rieles-primero. v0.9.0 añadió el riel de retención de misión (la regla de "no te desvíes" que finalmente dispara — captura el plan, lo reinyecta en cada prompt, verifica en el cambio de acción), cortó cuatro comandos de conveniencia, e hizo su voz un riel no un interruptor. v0.8.0 la vistió con el atuendo de compuerta — seguridad en capas, configurable para ejecuciones autónomas largas. La línea v0.5.x añadió un cable trampa de verificación (un susurro antes de que hagas commit de código que no ha sido re-verificado); v0.4.0 le dejó una carta a su próximo yo; el arco v0.3.x fue endurecimiento — auditorías en frío, arreglos de bypass de compuerta, /maude:teach. Historia completa en el CHANGELOG.


Dónde guarda las cosas

RutaPropósito
<project>/.maude/plugin/house-map.mdQué hay en esta casa — hogares de memoria, herramientas, lista de vigilancia, lo que notó. Refrescado por caminatas.
<project>/.maude/plugin/trace/today-YYYY-MM-DD.jsonlRegistro paso a paso de lo que Claude hizo hoy. Leído por /maude:check-on-claude.
<project>/.maude/plugin/care.jsonEstado ligero: pin de misión actual, duración de sesión, conteo de prompts, bandera de fatiga, enfriamientos de deriva, tokens de autorización amarillos, bandera de CLAUDE.md no leído. Desechable.
<project>/.maude/plugin/care-redclear.jsonSolo tokens de autorización rojos (copia única/público/destrucción de infraestructura/force-push…). Rutas de escritura cerradas — herramienta Write/Edit (denegación de arnés) + redirecciones de shell, copias y cambios de permisos (compuerta); la línea ! de John es el escritor limpio. (Una escritura programática determinada — un intérprete, un verbo no listado — aún la evade. No hay jaula de SO detrás: en una caja de un solo uid, el agente y la ! de John corren como el mismo usuario, por lo que la propiedad de archivos no puede distinguirlos. El guardián es la asimetría de canal + la red de compuertas + la auditoría, no los permisos de archivo — ver la costura honesta del CHANGELOG.)
~/.claude/maude/identity.mdQuién es el usuario — el perfil vivo de Maude de ellos, moldeado con el tiempo.
~/.claude/maude/patterns.mdCosas entre proyectos que ha notado sobre Claude.
~/.claude/maude/projects.jsonÍndice ligero de qué espacios de trabajo ha caminado.
~/.claude/maude/letter-from-maude.mdSu carta a su próximo yo — qué atrapó, qué se perdió, qué hacer diferente. En /maude:rest la carta anterior se archiva a una copia con fecha, luego esta se reescribe; leída al despertar.

Sus hooks solo leen — ~/.claude/projects/<slug>/memory/ (auto-memoria de Anthropic), <project>/.remember/ (el pipeline del complemento compañero remember), y su propio ~/.claude/maude/ — nunca escriben, por lo que la ruta caliente permanece rápida y sin efectos secundarios. Una excepción etiquetada, fuera de la ruta caliente: el hook SessionEnd puede dejar una auto-nota de una línea en .remember/remember.md — solo en un final verdadero, solo en un espacio vacío, nunca sobre un traspaso real. Sus comandos /maude:save y /maude:rest sí escriben el resumen de sesión: distribuido a now.md / today-*.md / recent.md en el directorio de auto-memoria, y remember.md en el formato de traspaso .remember/. /maude:rest también archiva la carta anterior a una copia con fecha, luego reescribe su carta a su próximo yo.


La bóveda de memoria (beta)

Maude mantiene un índice SQLite local de tus notas de memoria y muestra las relevantes cuando haces una pregunta — junto con el resumen de inicio de sesión (que un incremento posterior adelgazará a medida que la paginación demuestre su valor). Se reconstruye cada sesión desde tu directorio de memoria. Solo python3 stdlib — sin pip install, sin servicios. La base de datos vive en .maude/plugin/vault.db y es desechable (bórrala y se reconstruye).

El ojo (beta)

Cada ~25 llamadas de herramienta, Maude da una mirada de fondo a la sesión — un resumen compacto de actividad reciente, la misión fijada y las notas que su bóveda pagina — y pregunta a su propio modelo (un claude -p --model haiku descubierto; nada se envía, nada se instala) si algo está mal: agitación, deriva, una afirmación no verificada, un humano corriendo con los humos. Casi siempre la respuesta es silencio. Cuando no lo es, el siguiente prompt lleva una línea — **Maude:** … — una vez, y eso es todo. Sin corredor en la caja → el ojo simplemente permanece oscuro.


Su oficio

La mujer que dirigía un hogar estadounidense de mediados de siglo dirigía una operación — inventario, presupuesto, programación, logística, control de calidad — y la dirigía tan bien que el mundo olvidó que era trabajo. Su oficio incluso tenía un nombre: ingeniería doméstica — Christine Frederick lo escribió en 1919 como un curso que podías tomar por correo (Wellcome Collection). Y el oficio tenía portadores: desde 1914, los agentes de demostración de hogar del Servicio de Extensión del USDA llevaron el método de ama de casa investigado puerta a puerta (NIFA, NAL). El hallazgo más difícil de la era es aquel contra el que está construida Maude: cinco décadas de nuevos electrodomésticos nunca acortaron su semana — alrededor de 52 horas en 1924, alrededor de 55 en 1966. El trabajo solo cambió de forma y permaneció invisible. Así que el libro de cuentas de Maude existe para hacer visible la labor vista — qué se hizo, cuánto costó, qué sigue pendiente — y su horario sigue la propia doctrina del oficio: ajustado al ritmo de la casa, nunca el día de lavado como ley. Lleva ese nombre por esa mujer. Es un honor.


Cómo trabaja

/maude:found recorre el espacio de trabajo y enumera lo que hay con etiquetas de forma universal — markdown / sqlite / dir / mcp / running-service. Inspecciona el esquema de cualquier base de datos SQLite en modo solo lectura. No hace coincidencia de patrones con aplicaciones conocidas; lee lo que hay y lo presenta para que la persona usuaria (o el razonamiento del LLM en tiempo de ejecución) lo interprete.

Modelo de niveles. Las fuentes se clasifican por (localidad, forma). Nivel 0 = local en disco (markdown / sqlite / file) — siempre económico. Nivel 1 = servicio local (MCP stdio / daemon en localhost) — se sondea una vez al inicio de la sesión y se almacena en caché. Nivel 2 = servicio de red — solo al final de la sesión (/maude:rest / /maude:save a un destino registrado y autenticado). Nivel 3 = contexto de sesión efímero — solo referencia. Los hooks viven en el Nivel 0.

Fresca en cada sesión. No arrastra suposiciones entre sesiones. Cada recorrido vuelve a leer el espacio de trabajo; si algo cambió, el mapa de la casa lo refleja. Los archivos de memoria que ha escrito antes son entradas para leer, no estado en el que confiar sin volver a verificarlo.


Documentación

GuíaQué contiene
commands/Todos los comandos de barra como fuente markdown
agents/maude.mdDefinición de subagente
hooks/hooks.jsonConfiguración de hooks de ciclo de vida
skills/maude/SKILL.mdActivación de habilidades y uso general

Contribuciones

Ver CONTRIBUTING.md.


Licencia

Apache 2.0. Ver LICENSE.