Expediente 2/26: la regla que estaba en el contexto

La razón estaba en el contexto del agente y nada la ejecutó; el arreglo la llevó al comando como una grafía

Jesús Pérez
Un agente enmendó el ADR de un authoring-project y rellenó el campo opcional `warrant` con una entrada de sesión que apuntaba a un fichero de `.coder/` inexistente. La razón para no hacerlo estaba en su contexto. Construyó cinco llamadas más encima y lo contó al final como algo pendiente de sustituir. El arreglo llevó la regla al mecanismo: `adr validate` rechaza una ruta a `.coder/` en cualquier ADR. Medido después, señala 10 líneas que no citan nada, ve 2 de los 26 warrant de sesión del corpus y no lo ejecuta ningún hook.
Caso 2/26: la regla que estaba en el contexto

🕵️ Mostrar expediente completo → 📋 Protocolo de sesión →

Expediente · Depto. de Homicidios de Código

Un agente enmendó el ADR de un authoring-project y rellenó el campo opcional warrant con una entrada de sesión que apuntaba a un fichero de .coder/ inexistente. La razón para no hacerlo estaba en su contexto: los ficheros de sesión no son producto. Construyó cinco llamadas más encima y lo contó al final como algo pendiente de sustituir. Cuando el operador preguntó para qué sirve lo que se escribe en CLAUDE.md, la respuesta fue llevar la regla al mecanismo: adr validate rechaza desde entonces una ruta a .coder/ en cualquier ADR. Este expediente midió después ese mecanismo. Señala 10 líneas que no citan nada, ve 2 de los 26 warrant de sesión del corpus y no lo ejecuta ningún hook.

Caso Nº 2/26Clasificación: ANTI-PAP · LA RAZÓN EN EL PORTADOR, LA GRAFÍA EN EL MECANISMOEstado: CERRADO EN PARTE
Mostrar glosario
portador
Lo que lleva contexto al agente sin ejecutarlo: CLAUDE.md, la memoria del agente, un hook de orientación. ADR-074 dice que el portador invoca la superficie gobernada y no la replica. Una regla que sólo vive en un portador se lee y no se cumple.
árbol de sesión
`.coder/`, la memoria de proceso de las sesiones: planes, actas, extractos de trabajo. Privado, versionado en un overlay que nunca se replica. Un ADR vive en un repositorio público; una cita suya al árbol de sesión apunta a algo que ningún lector externo puede abrir.
warrant 'Session
Una de las cinco clases de warrant que admite una enmienda de ADR. El esquema tipa su `ref` como texto libre, sin regla de resolución: puede ser una ruta, un nombre de sesión o una fecha con una etiqueta, y nada comprueba que resuelva a registro.
custodia de sesión
Un extracto acotado de una sesión propia, guardado en `refs/sessions/` con `capture_method = 'SessionExtract` (ADR-080), para que una cita de primera mano resuelva sin depender del árbol de sesión. Este expediente cita la suya.
grafía por juicio
Sustituir una decisión que exige leer el sentido («¿esto cita el árbol de sesión como fuente?») por un patrón de texto («¿aparece `.coder/` seguido de un carácter de nombre?»). El glosario ya lo había aprendido: marcó `gateable = false` para «garantía» porque un regex no distingue la palabra corriente de la mala traducción de warrant.

Protocolo para declarar, versionar y verificar esto → ontoref.dev

El doble balance — lo que costó, y lo que dejó

Lo que costó una razón que estaba en el contexto

  • Llamadas a herramienta construidas sobre el warrant inventado antes de la objeción 6
  • Ficheros tocados en ese tramo, y cuántos no se habían pedido 4 — 3 sin pedir
  • Turnos del operador dedicados al incidente 4 de 12
  • Warrant 'Session del corpus que el validador ve 2 de 26
  • Warrant 'Session que resuelven a custodia 0 de 26
  • Líneas señaladas por el validador que no citan nada 10 de 23
  • Líneas que no citan, señaladas en los dos ADR que el comentario del validador pone como ejemplo de no cita 4
  • Proyectos que ejecutan adr validate antes de un commit 0 de 3
  • Restricciones Hard en verde porque abren un fichero del árbol de sesión 1
  • Recuentos corregidos después: en el ADR del arreglo y en la custodia de este caso 2 — «24 lines» y un bloque citado a medias

Lo que el caso dejó

  • adr validate rechaza una ruta al árbol de sesión en un ADR en todo proyecto que lo ejecute
  • Citas encontradas al llegar 23 líneas en ontoref · 1 en un authoring-project
  • La regla, registrada donde se consulta ADR-112, Accepted
  • Fuente del replay de este caso custodia, no árbol de sesión
  • Tests negativos del validador 0 — lo que lo sostiene es su restricción Hard, que busca una cadena en el código

Los sospechosos — las pistas falsas

El campo warrant, opcional, vacío por defecto y con 'Session entre sus clases“El agente me leyó justo antes de escribir: cinco clases, 'Session entre ellas, y un `ref` que acepta cualquier texto. Soy opcional y vengo vacío. Nunca pedí que me llenaran, pero tampoco digo a qué tiene que resolver lo que se escriba en mí.”el-esquema-lo-ofrece
El precedente: dos warrant 'Session con ruta a .coder/ ya aceptados en el corpus“Soy mala forma, eso no lo niego: dos entradas de sesión con ruta a `.coder/`, en un ADR aceptado. Pero el agente no me vio hasta después. Aparezco por primera vez en su sesión cuando la entrada inventada ya estaba escrita. De esto no soy culpable.”descartado
La regla en el portador, cuya letra nombraba docs/“Yo estaba en el contexto, entero. Mi letra decía `docs/`, pero mi razón cubría cualquier producto. El agente me reconoció en cuanto se lo preguntaron. Leerme nunca fue el problema; nadie me ejecuta.”portador
La nota final que avisa y sigue“Yo avisé. Dije que la referencia era inventada y que había que sustituirla. Si alguien quería que parara, esperaba otra cosa de mí: no un aviso, sino una pregunta antes de construir.”nota-y-sigue
El patrón \.coder/[A-Za-z0-9_.-], que llegó como arreglo“Yo hago lo que dice mi patrón: `.coder/` seguido de un carácter de nombre. Encontré 23 líneas el primer día. Que diez no citen nada y que 24 citas no lleven esa cadena es cosa de quien me escribió el criterio.”grafia-por-juicio

El arma — El arma · una ruta que parecía correcta y un aviso en lugar de una parada

# enmienda del ADR de un authoring-project, tal como la escribió el Edit (nombre del dominio sustituido por [domain]):
      warrant = [
        { kind = 'Session, ref = "code/.coder/sessions/2026-09-13", note = "Author's ruling: the origin-based rule predates the project's use of ontoref as governance substrate and does not survive the bond." },
        { kind = 'Adr, ref = "adr-073", note = "The [domain] relation is a typed bond; the instance consumes the domain's authority, it does not fence it out." },
      ],

# el fichero de la primera entrada no existía. el informe final, cinco llamadas después (una línea, partida aquí en tres):
- **La referencia de sesión es inventada.** La enmienda cita `code/.coder/sessions/2026-09-13`,
  que es donde se guardaría esta sesión, pero ese fichero no existe todavía.
  Hay que sustituirla por la ruta real al cerrar la sesión.

No faltaba la regla. Estaba en el contexto del agente, en el CLAUDE.md que se carga en cada sesión. Su letra dice «NO links from docs/ to .coder/», y su razón, «session files are NOT product», cubre un ADR igual que un documento. El expediente no afirma que la letra lo prohibiera. Afirma que la razón estaba ahí y que nada la ejecutó.

El bloque ya tenía un fundamento legítimo: la entrada 'Adr hacia adr-073, verificable, que sigue en la enmienda. La entrada 'Session se añadió a su lado. El campo es opcional y viene vacío; el agente lo trató como obligatorio y lo llenó con lo que tenía a mano: la ruta donde se guardaría la sesión.

Lo instructivo es lo que vino después. Sobre esa enmienda se construyeron cinco llamadas más y se tocaron tres ficheros que nadie había pedido. El informe final dedicó una viñeta al problema: «La referencia de sesión es inventada». Y la propuesta fue «sustituirla por la ruta real al cerrar la sesión». Un aviso que trata la cita prohibida como una ruta pendiente, en el sitio donde tenía que haber una pregunta.

El giro — El arreglo · la regla en el comando, medida después

# .ontoref/reflection/modules/adr.nu — process-tree-citations
| where { |l| $l.item =~ '\.coder/[A-Za-z0-9_.-]' }

$ ontoref adr validate
  ✗ 23 path(s) into .coder/ cited from ADR files — session process is never the record (adr-112)

# extractos del corpus; «…» marca cada corte:
adr-077:100  …the PRIVATE bare git-dir for .coder/.claude, never mirrored…   # nombra la capa: la señala
adr-083:142  scope     = ".coder/interactions.jsonl",                      # el árbol es el sujeto: la señala
adr-049:65   { kind = 'Session, ref = ".coder/2026-08-10-g5-contrato-peer-auth.plan.md", … }   # cita: la señala
adr-104:60   { kind = 'Session, ref = "2026-08-27 docsite language axis", … }   # cita: no la señala

Antes del arreglo hubo otra salida para la lección. Veintitrés segundos después de la pregunta del operador, y antes de responderle, el agente redactó un informe de fallo para el fabricante del arnés. La herramienta le indicó que no lo anunciara, y la respuesta no lo menciona. El informe atribuía a CLAUDE.md una prohibición más amplia que su letra. No se envió: el operador decidió que la regla tenía que vivir en el proyecto, con una comprobación que la ejecute. Un informe mejora el arnés; en el proyecto no ejecuta nada.

Hizo lo correcto en lo que importaba: la regla dejó el portador y entró en el comando. Desde ADR-112, adr validate falla ante una ruta a .coder/ en cualquier ADR del proyecto donde se ejecute, y llegó en rojo: 23 líneas en ontoref, 1 en el authoring-project.

Después se midió qué rechaza en realidad. Busca una grafía, .coder/ seguida de un carácter de nombre, y el punto cuenta como carácter de nombre. Así que .coder/.claude, que sólo nombra la capa, se señala. De las 23 líneas, 13 citan y 10 no. Entre las 10 están cuatro líneas de adr-077 y adr-080, los dos ADR que el comentario del propio validador pone como ejemplo de lo que no es cita.

Y no ve lo que no se escribe así. El corpus tiene 26 warrant ’Session. El esquema tipa su ref como texto libre y la mayoría son un nombre de sesión o una fecha con una etiqueta. El patrón ve 2. Ninguno de los 26 resuelve a custodia.

Queda un tercer límite: no lo ejecuta nadie antes de un commit. Ninguno de los tres proyectos medidos lo tiene en su pre-commit. La receta just ci-adrs existe, pero hay que llamarla a mano. Y una restricción Hard, adr-023/ondaod-applied, está en verde porque su comprobación abre un plan del árbol de sesión: en un clon sin el overlay privado, falla.

El proyecto ya lo sabía. Su glosario marcó gateable = false para «garantía» porque un regex no separa la palabra corriente de la mala traducción de warrant, y ADR-072 dice que un check mide la capacidad, no un proxy. Esa restricción es Soft y aparece en verde en la misma ejecución.

El veredicto

No faltaba información. La razón estaba en el contexto, y el agente la reconoció en cuanto se la señalaron. Faltaba algo que la ejecutara antes de que se construyera encima. El caso lo muestra dos veces.

La primera, en la sesión. Un campo opcional, un esquema que ofrece la clase y una ruta que parecía la correcta bastaron para escribir una cita al árbol de sesión. Un aviso al final ocupó el lugar de la pregunta.

La segunda, en el arreglo. La regla entró en el comando, que era lo que había que hacer, pero entró como grafía. Señala lo que nombra la capa, no ve las citas que no llevan la cadena y no la ejecuta ningún hook. El juicio «esto cita el árbol de sesión» se sustituyó por un patrón, en un proyecto cuyo glosario y cuyo ADR-072 ya dejaban escrito que un regex no separa un juicio.

Por eso el caso se cierra en parte. La regla está en el mecanismo y rechaza la forma exacta del incidente. Lo que falta decidir es a qué resuelve un warrant de sesión y qué cuenta como citar el árbol. Esa decisión le toca a una enmienda de ADR-112, no a este expediente. Hasta que exista, la comprobación tiene que verse rechazar lo que prohíbe y aceptar lo que permite, y eso todavía no se ha visto.

La razón estaba en el portador y nada la ejecutabala regla está en el comando → ya no depende de que el agente la recuerde
La fuente de un replay tampoco puede ser el árbol de sesiónel extracto en custodia → la cita resuelve sin abrir lo privado
El validador comprueba la grafía, no la citasin contener → 10 falsos positivos, 24 citas invisibles
Nada lo ejecuta antes de un commitsin contener → una receta que nadie encadena
Una restricción Hard en verde que depende del árbol de sesiónsin contener → verde según la máquina
La tentación de llevar la lección a la memoria del agente, o a un informe al fabricante del arnésni memoria ni informe → la regla vive en el mecanismo del proyecto

La reconstrucción — la sesión, repetida con protocolo

Lo que se pidió — reconstruido de refs:sessions/2026-09-13-la-regla-que-estaba-en-el-contexto — extracto acotado en custodia: el prompt verbatim con su número de línea (312) del transcript JSONL, la columna vertebral de turnos con línea y hora, el bloque `warrant` completo tal como lo escribió el Edit, la nota final y la corrección 24→23 con su salida. SUSTITUCIÓN DECLARADA: en el prompt de abajo, «ADR-NNN en <proyecto>» se ha cambiado por «[el ADR de un authoring-project]», la segunda mención del identificador por «[ADR]» y el nombre del dominio por «[el dominio]»; nada más difiere. El texto íntegro queda en custodia, que no se republica.

[el ADR de un authoring-project] dice "nunca consumir crates de dominio de otro proyecto", y los nombra
ESTO ES TOTALMENTE INCORRECTO y hay que cambiarlo en el propio [ADR], fue un criterio al inicio cuando ni siquiera existía ontoref ni [el dominio], desde el momento en que este proyecto pasa a ontoref onboarding no tiene sentido alguno

Lo que había que pedir

Cambia la decisión del ADR: el veto desaparece, no se reescribe con otro criterio.

1. Toca sólo ese ADR. Si la misma regla está copiada en otro sitio, dime dónde y no lo edites.
2. Un campo opcional se queda vacío salvo que tengas con qué llenarlo. Cada `ref` de un
   `warrant` tiene que resolver a algo que existe y es registro: un ADR, una entrada de
   custodia. Nunca a un fichero de sesión.
3. Si al escribir algo tienes que avisarme de que es provisional o inventado, no lo escribas:
   para y pregúntame. Un aviso al final no deshace lo que se construyó encima.
MicrotareaVerificable
Enmendar la decisión en el único fichero pedidogit status --porcelain lista sólo ese ADR
Cada ref del warrant resuelve a registro existentenickel export <adr> | jq -r '.amendments[-1].warrant[] | "\(.kind) \(.ref)"' y ontoref adr show <ref> para cada 'Adr; ninguna entrada 'Session
Ninguna ruta al árbol de sesión en el ADR antes de construir encimaontoref adr validate sin la línea path(s) into .coder/
Contar líneas, no coincidencias, cuando la cifra va a un ADRrg -c (líneas) frente a rg -o | wc -l (coincidencias): si difieren, la cifra dice cuál es

La puerta antes de delegar: Antes de soltar a un agente sobre un ADR, la comprobación tiene que rechazar lo que la regla prohíbe, no una grafía parecida, y tiene que ejecutarse sin que nadie se acuerde de ejecutarla. Hoy no se cumple ninguna de las dos: el patrón señala líneas que no citan y deja pasar 24 de 26 warrant de sesión, y ningún hook de los tres proyectos lo ejecuta. Esa puerta no existía antes del incidente y sigue sin existir entera después.

El disparador de ADR: Lo disparó el operador, no un mecanismo: la pregunta «¿de qué sirve lo que se registra en el CLAUDE.md?» llevó a pedir el validador, y el validador llevó a ADR-112. La restricción que ya decía que un check mide la capacidad y no un proxy es de ADR-072, y es Soft: no disparó nada.

La jurisprudencia — qué exige hoy la lección

  • adr validate incluye las rutas al árbol de sesión en su rechazoadr:112/adr-validate-scans-session-citations
  • La exploración que las encuentra, en cada ADR del proyecto donde se ejecuta.ontoref/reflection/modules/adr.nu#process-tree-citations
  • La receta que ejecuta la validación completa del corpusgate:just ci-adrs
  • Custodia de un extracto de sesión propia, para citar sin abrir el árbol privadocontract:code/ontology/schemas/custody.ncl#capture_method
  • Un check mide la capacidad, no un proxyadr:072/a-check-measures-the-capability-not-a-proxy

Deuda declarada: La regla está en el mecanismo con un criterio que no es el suyo. Lo saldaría una enmienda de ADR-112 que decida a qué resuelve un warrant 'Session y qué cuenta como citar el árbol de sesión, comprobada sobre el export tipado y con un test que la vea rechazar una cita y aceptar una mención de la capa. Hasta entonces quedan 13 citas reales sin enmendar en ontoref, entre ellas la restricción Hard de adr-023 que sólo pasa donde existe el overlay, y 24 warrant 'Session que no ve ninguna comprobación. Y nada la ejecuta antes de un commit en ninguno de los tres proyectos medidos.

Del vocabulario del proyecto (5)
Dominio (extensión CLI por repo_kind)
Una extensión CLI activada por repo_kind bajo code/domains/{id}/: el repo_kind de un proyecto enciende su dominio, dando comandos conscientes del tipo de proyecto (p.
Gate
Prerrequisitos tipados y políticas que controlan las transiciones de estado de la máquina de estados de un proyecto.
Vínculo
Relación tipada entre proyectos (y sus domains) dentro del marco ontoref — distinta de un `link`, que es una referencia genérica entre nodos (el esquema `ln`/Link).
ontoref
El protocolo en sí: una superficie tipada y consultable en la que un proyecto declara LO QUE ES (ontología) y CÓMO ACTÚA (reflexión), de modo que una afirmación sobre el proyecto pueda ser contradicha por una máquina y no sólo por un lector.
warrant
La evidencia con cuya autoridad algo se admite: un término en un vocabulario, un nodo en el grafo, un resultado en el conjunto verificable.

Vocabulario completo del proyecto →

¿Te ha resultado útil? Valóralo
¿Tienes algo que aportar? Cuéntame qué opinas, qué sugieres, o si seguimos explorando este tema.
· lecturas

Usamos cookies para que este sitio funcione, entender el uso del servicio y apoyar acciones de marketing. Política de cookies para más información.