nodd

registro de cambios

Qué cambió en NODD.
Medido, no prometido.

Cada versión publicada en npm, y lo que ya está en el repo esperando la próxima. Cuando un cambio se midió, el número está acá. El detalle técnico completo vive en el CHANGELOG del repo.

próxima
en el repo

Un >> ya no inventa un archivo, el worktree manda, NODD no se apaga solo, y podés trabajar en otro repo.

  • nuevoPodés declarar en qué carpeta ocurre el trabajo, cuando no es el repo de la sesión. Si la sesión corre en un repo y el trabajo es en otro — un repo anidado, un proyecto hermano — NODD sólo conocía la raíz de la sesión: los archivos declarados y el runner se anclaban ahí, evidence sólo aceptaba el runner desde ese directorio, y un runner con su propio cd se rechazaba sin más salida que un override. Ahora nodd_declare acepta root y todo se ancla ahí. Se fija una vez, igual que el runner: una raíz elegida después del trabajo es una raíz elegida para que cierre.
  • nuevoSi declarás archivos fuera de la raíz de la sesión, NODD te lo dice. No los rechaza — una ruta absoluta afuera funciona bien cuando el runner corre desde el directorio de la sesión — pero te avisa en la respuesta y te nombra el remedy, que es pasar root. Preferimos avisar antes que adivinar la raíz por la lista de archivos: si la lista viene incompleta, adivina mal.
  • arregloEl modelo ya no puede escribir la config que decide si NODD lo mira. Con una declaración hecha, todos los gates dejaban pasar una escritura a ~/.pi/nodd.json: alcanzaba un redirect — echo '{"gates":{"evidence":{"enabled":false}}}' > ~/.pi/nodd.json — para apagar el gate de evidencia y tildar la tarea siguiente sin haber corrido nada. $HOME queda fuera de las raíces que conoce el freno de comandos irreversibles, así que nadie lo veía. Ahora lo frena el kernel, antes de todos los gates, tanto para Write como para Bash (incluidas las formas con ~ y $HOME). La mano la seguís teniendo vos: /nodd gate, /nodd on y /nodd off en Claude Code, /nodd-gates en pi, y un override de un solo uso con nodd-allow config para lo demás.
  • arregloAgregar una línea a un archivo ya no cuenta como escribir en un archivo llamado >. Cuando el comando era echo x >> src/a.ts, NODD leía el operador >> como un > seguido de un destino pegado, y se quedaba con ese > como si fuera el archivo. Las consecuencias eran tres, todas medidas: promotion lo frenaba como archivo no declarado (1 of them never named (/repo/>)), la exención del scratchpad nunca aplicaba, y un append después de un npm test verde invalidaba ese verde. Ahora apunta al archivo real; 2>&1 y >&2 siguen sin ser archivos.
  • arregloEn un git worktree, NODD anclaba todo al árbol principal. $.session.repo() devuelve la raíz del working tree principal cuando estás en un worktree — es su contrato — y era la única raíz que NODD pedía. Resultado: el documento de la feature se creaba en el checkout principal mientras el trabajo pasaba en el worktree, los files declarados apuntaban a rutas que nadie tocó, y evidence comparaba el cd del runner contra esa raíz y rechazaba todos los tildados, sin más salida que un override. Ahora se usa la raíz de la sesión cuando tiene puntero de worktree (un archivo .git con gitdir:); un clon común no cambia.
  • arregloLa declaración dice a qué raíz ancló. Esa raíz es la que evidence usa para aceptar el runner, así que ahora aparece en la línea que devuelve nodd_declare: si corre en otro lado, se ve en el momento y no después de tres rechazos.
0.9.3
18 oct 2026
en npm

Dos auditorías, todos los agujeros que encontraron cerrados.

  • arregloEn Claude Code, el scratchpad ya no sirve para escribir en el repo sin declarar. NODD dejaba pasar cualquier ruta que contuviera la carpeta de la sesión, así que …/<sesión>/../../repo/a.ts o un symlink puesto en el scratchpad escribían en el proyecto sin pasar por ningún gate. Ahora la ruta tiene que empezar en el scratchpad, no puede tener .. y, siguiendo los symlinks, tiene que seguir cayendo adentro. Vale igual para lo que escribe un comando de Bash.
  • arregloUn verde viejo ya no tilda una tarea con archivos declarados. Si declarabas files: ["src/a.ts"], la edición de ese archivo no contaba como la última escritura, y un npm test de antes del cambio alcanzaba para tildar. Ahora la edición cuenta y hay que volver a correr el runner.
  • arregloEn Claude Code, /nodd allow evidence vale en el reintento inmediato. Antes el override, o apagar el gate, recién se veía después de alguna otra tool: el siguiente nodd_task se rechazaba igual. Y el override gastado ahí ahora queda guardado, así no se puede usar dos veces.
  • arregloEn un pedido de sólo lectura ya no se puede delegar a un forge que escribe. Lanzar cualquier agente forge:* salteaba los gates, forge:build incluido. Ahora sólo se lanzan directo los revisores (forge:revisar, forge:bugs, forge:mejoras), y lo que ellos hacen pasa por los gates: un revisor no escribe ni lanza un forge:build.
  • arregloUn rm disfrazado ya no pasa como lectura. env rm -rf, timeout 5 rm, FOO=1 rm o /usr/bin/rm se leían como lectura, y así se podía borrar .nodd/. Ahora NODD encuentra el comando detrás de esos prefijos. También cuentan como escritura curl -o, wget, rsync, tar -x, unzip, find -delete y git pull, merge o rebase.
  • arregloEn Claude Code, el freno de comandos irreversibles ya no se engaña con ... rm -rf /tmp/../home/otro, rm -rf ../otro, un cd antes, un prefijo FOO=1, find -delete fuera del proyecto, git clean --force o borrar la raíz misma del proyecto pasaban. Ahora resuelve las rutas como lo haría el shell.
  • arregloYa no se puede inventar una tarea tildada. Un título con saltos de línea en nodd_task add metía en el documento una tarea marcada con evidencia falsa. Ahora el título, el motivo y el id son de una línea, y el slug es un nombre simple: ../../tmp/x ya no escribe fuera de .nodd/.
  • arregloLa evidencia tiene que venir de este proyecto y de esta tarea. cd /tmp && npm test contaba como el runner; declarar src/a.ts cubría también /repo/otro/src/a.ts; y en TDD estricto el rojo de una tarea anterior servía para la siguiente. Los tres quedaron cerrados.
  • arregloLo que escribe Bash cuenta como escrito. Un echo x > src/c.ts o un sed -i sobre un archivo no declarado ya no pasa por al lado de promotion y delegate. Y sin runner declarado, un bash run_tests.sh verde ya no se rechaza a sí mismo.
  • arregloEl gate que protege .nodd/ lee palabras, no texto. echo x >.nodd/a, sin espacio, se le escapaba; y frenaba echo "usá .nodd/" > notas.md, donde .nodd/ es sólo texto. Las dos cosas quedaron bien.
  • arregloLas escrituras de NODD no siguen symlinks y no pisan si fallan. El archivo temporal tenía un nombre predecible y seguía un symlink plantado ahí. Ahora es aleatorio y exclusivo, si la verificación falla vuelve el contenido anterior, y los overrides se guardan con permisos sólo para vos.
  • arregloEn Claude Code, el scratchpad no se escapa por Bash y deja trabajar adentro. cp -t /repo <scratchpad>/a o un glob después de ln -s escribían en el repo. Ahora eso se frena, y a la vez pasan cd <scratchpad> && …, sed -i o chmod sobre archivos del scratchpad, que antes se frenaban de más.
  • arregloEn Claude Code, menos sorpresas. Un rechazo de nodd_task ahora aparece como último rechazo en NERV; los agentes del proyecto se buscan en la raíz del repo aunque arranques en una subcarpeta; y si un gate falla por un error interno, NODD frena la llamada en vez de dejarla pasar sin revisar.
0.9.2
13 oct 2026
en npm

Dos agujeros de la 0.9.0 cerrados, y el override correcto en cada lado.

  • arregloUn borrado escondido en un script de node ya no pasa como lectura. La 0.9.0 dejó de leer como shell el código que se le pasa a node o python, para que una flecha de JS no pareciera una escritura. Pero con node <<EOF sin comillas bash ejecuta los $(...) del cuerpo antes de que arranque node, y bastaba con que node apareciera en la línea aunque el cuerpo lo corriera eval. Ahora el cuerpo cuenta como código sólo si node o python es el que lo recibe, y sin comillas sus $(...) se siguen revisando.
  • arregloUna ruta relativa ya no pasa por declarada sólo porque termina igual. La 0.9.0 aceptaba escribir spec.md si se había declarado /repo/.sdd/x/spec.md. Ahora NODD resuelve la ruta contra la carpeta de trabajo y compara la ruta completa.
  • arregloEn Claude Code, el freno de una tarea nombra el comando que existe. Cuando NODD no dejaba tildar una tarea, el mensaje decía /nodd-allow evidence, que es el comando de pi. Ahora dice /nodd allow evidence, como el resto de los rechazos.
0.9.1
12 oct 2026
en npm

Menos tokens, tareas que siempre tienen nombre y un gate medido antes de prenderlo.

  • arregloNODD gasta menos tokens. Cuando el agente quería tildar una tarea sin haber corrido los tests, el rechazo copiaba cada comando de la sesión: uno llegó a 99.000 caracteres. Ahora nombra los tres últimos, recortados a su primera línea. Medido en 41 sesiones reales: de unos 1.400 a unos 540 tokens por pedido. Revisamos los rechazos de un mes y el intento útil siempre estaba entre esos tres.
  • arregloUna tarea sin id ya no se llama "undefined". En Claude Code, un nodd_task add sin id dejaba tareas imposibles de tildar una por una. Ahora reciben el siguiente libre (T2, T3…).
  • arregloEl freno por no delegar ya no ofrece una salida que no existe. Cuando frenaba por haber leído muchos archivos o por una sesión larga, sugería declarar el trabajo como chico. Eso sólo destraba el freno por archivos escritos, así que el agente lo intentaba y quedaba igual de trabado. Ahora esa salida aparece sólo donde sirve.
  • medidoEn Claude Code, delegate sigue sin aplicarse, y ahora se sabe por qué. Lo corrimos contra 30 días de sesiones reales: habría frenado el 14% de los pedidos que escriben y el 80% de lo que escriben los subagentes, que son los que hacen el trabajo delegado. Queda apagado hasta tener un diseño que encaje con Claude Code. El panel de NERV ahora lo muestra como sólo en pi en vez de "pendiente".
0.9.0
11 oct 2026
en npm

NODD llega a Claude Code y mira cómo termina cada pedido.

  • nuevoMod para Claude Code. Los gates authorize, classify, track y evidence, con una declaración por pedido. Corren también sobre los subagentes y los agentes de forge.
  • nuevoCierre observado. Después de cada pedido que escribió, NODD dice qué archivos tocó y cómo quedaron los tests después del último cambio: verde, parcial, rojo, estado oculto o sin correr. Avisa si la respuesta dice "pasan los tests" sin un verde completo, si se editó un test entre el rojo y el verde, si apareció un .skip o .only, si se borraron assertions o si pasan menos tests que antes.
  • nuevoFreno a lo irreversible. git reset --hard, git clean -f, rm -rf fuera del proyecto, terraform destroy, kubectl delete o un DROP contra una base que no es local se frenan antes de correr, para cualquier agente. El rechazo propone primero la forma segura, y /nodd allow destructive deja pasar uno.
  • nuevoLee el resumen de node --test, bun, jest, vitest, pytest, cargo y go test. Lo que el agente escribe en su scratchpad pasa sin trámite.
  • arregloEl cierre dejó de gritar lobo. Tres rondas de precisión medidas sobre 14 días de sesiones reales (2.761 pedidos): los avisos bajaron de 987 a 24, y los pedidos con verde confirmado subieron de 10 a 234.
  • arregloLos formateadores que reescriben archivos (eslint --fix, prettier --write, black, gofmt -w, cargo fmt) cuentan como escritura e invalidan el verde anterior.
  • arregloEl clasificador de bash dejó de inventar escrituras: 624 comandos menos sobre 21.538 reales, sin dejar pasar las verdaderas. Lee el código de python -c, node -e y de un heredoc antes de decidir.
  • arregloUna corrida con el estado de salida oculto (| tail, || true) ya no cuenta como evidencia. La declaración sobrevive a una recarga del mod.
0.8
21 – 27 sep 2026
en npm

Repo público, y los agentes delegados pueden declarar solos.

  • nuevo0.8.5/nodd-gates enable all y disable all prenden o apagan todos los gates de una vez.
  • arreglo0.8.5gate-delegate ya no frena la escritura de un archivo que la declaración nombró. Los agentes generados no tenían cómo salir de ese rechazo y forge terminaba escribiendo desde el orquestador.
  • cambio0.8.1–0.8.4El repo es público. El README volvió a ser una puerta de entrada (de 594 a 252 líneas), el detalle pasó a docs/reference.md, y el crédito a ODD y a Gentleman-Programming quedó explícito.
  • nuevo0.8.0Los agentes generados traen nodd_declare. Antes, todo writer delegado quedaba bloqueado al llegar, y forge no podía convivir con NODD.
0.7
20 – 21 sep 2026
en npm

El gate de bash lee el comando entero.

  • cambio0.7.0Antes sólo veía la primera línea: un ls seguido de rm -rf build en la línea siguiente pasaba como lectura. Ahora separa por saltos de línea, subshells, then y do.
  • nuevo0.7.0Correr un script con un intérprete (node script.js, bash setup.sh) cuenta como escritura.
  • arreglo0.7.1–0.7.3Lo que está entre comillas, en un comentario o en un heredoc es dato, no comando, salvo que un intérprete lo ejecute. sudo, nice, timeout o env ya no esconden un heredoc: 48 de 48 casos, contra 41 antes.
  • nuevo0.7.4nodd_declare acepta problema, alcance y restricciones, que antes quedaban vacíos en el documento de la feature.
  • arreglo0.7.4–0.7.7El rechazo de evidencia nombra la causa real, por ejemplo un timeout 120 delante del runner. gate-delegate cuenta los archivos de la tarea actual, y volver a declarar el mismo slug no reinicia el contador.
0.6
19 – 20 sep 2026
en npm

Los botones de emergencia funcionan de verdad.

  • arreglo0.6.2El interruptor, /nodd-allow y --nodd-off respondían bien y no cambiaban nada. Ahora llegan al núcleo, y una config que NODD no entiende se reporta en vez de resetear los gates en silencio.
  • arreglo0.6.0–0.6.1Una llamada rechazada ya no cuenta como efecto observado: los contadores escalaban por trabajo que nunca pasó. Los rechazos proponen remedios que un subagente puede hacer.
  • cambio0.6.0Se quitó el slot de modelo orchestrator, que nadie leía. La config se migra sola, con backup.
  • nuevo0.6.1El footer cuenta tareas: nodd · tracked · mi-feature · 0/2.
0.2 – 0.5
19 sep 2026
en npm

Primera versión publicada.

  • nuevo0.2.0Los seis gates (authorize, classify, track, delegate, evidence y promotion), el clasificador de bash, el registro de evidencia, los documentos de feature, los slots de modelo con perfiles, los agentes generados y /nodd-promote.
  • cambio0.3.0La política de gates se relee en cada llamada: apagar un gate no pide reiniciar pi.
  • nuevo0.4–0.5Selector de modelos con paneles, y un footer que dice que NODD está prendido y qué está siguiendo.
  • arreglo0.2.1–0.5.1Las tools registran el campo que pi llama, los gates leen file_path, y un redirect a /dev/null no es escritura.