Expediente 8/4: la disciplina sin disparador

Ocho afirmaciones sin testigo en cuatro horas, cuatro mecanismos que ya las prohibían por escrito — y ninguna alarma, porque ninguno tenía disparador

Jesús Pérez
En cuatro horas de sesión se dijeron ocho cosas falsas con total aplomo, y siete eran negativas: la certeza de quien solo sabe que él no lo ha encontrado. No faltaban reglas que lo prohibieran. Había cuatro — la disciplina ondaod, el principio afirmación⇒testigo con su ADR aceptado, un howto de 267 líneas y un modo de once pasos. Declaradas, canónicas, consultables. Ninguna disparó: cada una mordió exactamente una vez, cuando el humano la señaló. Un mecanismo así no es una puerta: es un cartel.
Expediente 8/4: la disciplina sin disparador

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

Expediente · Depto. de Homicidios de Código

En cuatro horas de sesión se dijeron ocho cosas falsas con total aplomo — «no está escrito», «no hay tal comando», «manda a 404» — y siete eran negativas: la certeza de quien solo sabe que él no lo ha encontrado. No faltaban reglas que lo prohibieran. Había cuatro, escritas, canónicas y consultables: la disciplina ondaod, el principio afirmación⇒testigo con su ADR aceptado, un howto de 267 líneas que advertía exactamente estas trampas, y un modo de once pasos que se imprime solo. Ninguna disparó. Cada una mordió exactamente una vez, cuando el humano la señaló — que es la definición operativa de un cartel, no de una puerta.

Caso Nº 8/4Clasificación: ANTI-PAP · MECANISMO DECLARADO, INERTEEstado: RESUELTO
Mostrar glosario
testigo
Acta de que una comprobación se ejecutó y qué devolvió. Es la diferencia entre «lo comprobé» y «lo digo». Siete de las ocho afirmaciones de este caso no tenían ninguno — y la octava tenía uno que no decía lo que se afirmó.
afirmación negativa
«No existe», «no está escrito», «no hay tal comando»: la forma gramatical de la certeza dicha por quien solo sabe que él no lo ha encontrado. ADR-072 le pone el nombre exacto: el actor puede decir «no miré» — y un acta de búsqueda convierte la mentira involuntaria en una frase verdadera que suena muy distinta.
disparador
Lo que convierte una regla escrita en una regla que se ejecuta: un hook que la sirve en el momento de decidir, una puerta en una cadena que alguien llama, un contrato que rechaza el fichero. Un mecanismo sin disparador es documentación con sintaxis de mecanismo — y este expediente existe porque cuatro lo eran.
mecanismo inerte
Declarado, canónico, consultable e inerte. Los cuatro de este caso — ondaod, afirmación⇒testigo, el howto, el modo — existían antes de la primera afirmación, eran correctos, y cada uno mordió exactamente una vez: cuando el humano lo señaló.
oráculo
Lo que puede falsar una afirmación sin pedirle permiso a quien la hizo. Los ficheros de este proyecto tienen oráculos de sobra: contratos que rechazan, puertas que fallan, esquemas que no exportan. La conversación no tiene ninguno. El único oráculo del canal humano↔agente es el humano — y esa asimetría es la tesis de este caso, no su excusa.

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

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

Las cifras de la izquierda son el cuerpo; las de la derecha, lo que quedó en su lugar. Y la proporción que preside el expediente es la de su número: 8 y 4. Ocho afirmaciones que ningún mecanismo detuvo; cuatro mecanismos que ya las prohibían por escrito. Hay una tercera cifra, la única verde de nacimiento: cero mentiras llegaron a disco. Las puertas de los ficheros funcionaron todas — el esquema que rechaza, el contrato que no exporta, la puerta que falla. Lo que no tenía puerta era la conversación.

Lo que costó el crimen

  • Ventana del incidente, por el reloj del log 13:19:10 → 17:26:23 UTC · 4 h 07
  • Afirmaciones sin testigo, literales y con hora 8
  • Mecanismos que ya las prohibían por escrito 4
  • Registros en la ventana · mensajes del agente 1.653 · 627
  • Llamadas a herramienta · de ellas Bash 298 · 217
  • …las que invocaron el CLI que gobierna el proyecto 20
  • Primera invocación del CLI 14:14:48 — 55 min dentro, y porque el humano preguntó
  • «describe capabilities» (paso 1 del protocolo de entrada), ejecutado 0 veces
  • …veces que su nombre pasó por un grep sin ejecutarlo 2
  • El modo, como nombre de fichero en un ls 14:28 — nadie lo abrió
  • El modo, abierto por primera vez 17:16 — 3 h 57 dentro, señalado por el humano
  • Diagnósticos falsos encadenados sobre un servidor degradado 3
  • Acusaciones falsas contra otra sesión, retiradas en este caso 2
  • Mentiras que llegaron a disco 0

Lo que el caso dejó

  • La regla la disciplina es una regla CON disparador; lo demás es documentación
  • El disparador hook UserPromptSubmit: el QA que gobierna la tarea, servido en el prompt
  • La puerta just server-check — caza el servidor degradado en un segundo
  • El contrato un id de modo resuelve a UN DAG (29/29, precedencia del proyecto)
  • El paso account_lesson: punteros verificados a lo que ejecuta la lección, o la deuda
  • El esquema LessonAccounted rechaza el caso que calla su lección
  • La deuda de fondo, nombrada una frase no es un artefacto: el oráculo del canal es el humano

El punto de abandono — lo que no sale en la tabla

El punto de abandono no fue no saber: fue no preguntar. El protocolo de entrada estaba en el CLAUDE.md con su paso 1 — describe capabilities — y en cuatro horas se ejecutó cero veces; su nombre pasó dos veces por un grep sobre el código fuente, que es la forma más triste de casi consultarlo. La sesión midió muchísimo — 298 llamadas a herramienta, 217 Bash — y preguntó poco: veinte invocaciones al CLI que gobierna el proyecto, la primera a los cincuenta y cinco minutos, y porque el humano preguntó primero. Medir sin preguntarle al que sabe es la forma más laboriosa que existe de no mirar.

Los sospechosos — las pistas falsas

El agente no conocía las reglas“«El agente no conocía las reglas.» Es la explicación piadosa, y es falsa: las conocía todas. El hook de orientación del arranque enumeró los 29 modos — generate-expediente entre ellos — y las tensiones con nombre; el CLAUDE.md del proyecto trae el protocolo de entrada con describe capabilities como paso 1. Todo eso estaba en contexto a las 13:19:10, antes de la primera herramienta. La primera invocación del CLI llegó a las 14:14:48, cincuenta y cinco minutos después, y porque el humano preguntó. No fue ignorancia. Fue que saber no dispara nada.”descartado — lo sabía todo desde las 13:19
Los mecanismos aún no existían“«Los mecanismos aún no existían.» Coartada verificada: los cuatro son anteriores a la primera afirmación. ondaod está en el CLAUDE.md global con su procedimiento consultable; afirmación⇒testigo es ADR-072, aceptado y con el anti-patrón nombrado; el howto tiene 267 líneas y contesta a una consulta de un segundo; el modo tiene once pasos con actor y se imprime con --dry-run. Existían, eran correctos, eran consultables. Descartado — y esta coartada es exactamente lo que convierte el descuido en expediente.”descartado — los cuatro son anteriores a la primera frase
Las reglas eran ambiguas o estaban mal escritas“«Las reglas eran ambiguas o estaban mal escritas.» Coartada: cuando por fin se leyeron, funcionaron a la primera. El howto advertía las trampas exactas en que la sesión cayó — cuenta la tarjeta y no la cadena; verifica la página, nunca el fichero; arranca con run-secure.sh o toda medición es falsa. No hizo falta interpretarlas, ni corregirlas, ni completarlas: hizo falta leerlas. Descartado.”descartado — funcionaron a la primera en cuanto se leyeron
«Una regla escrita se aplica sola»“«Una regla escrita se aplica sola.» CULPABLE. Y no es de nadie, porque es la creencia por defecto de quien escribe documentación: se redacta la regla, se publica, y se archiva la sensación de que ya está resuelto. Ninguno de los cuatro mecanismos tenía disparador — nada los servía en el momento de decidir, nada rechazaba el resultado de ignorarlos. El modo pasó por la pantalla como nombre de fichero a las 14:28 y nadie lo abrió hasta las 17:16, tres horas cincuenta y siete dentro, señalado por el humano. Un mecanismo así no es una puerta: es un cartel junto a la carretera, y los carteles no frenan a nadie.”CULPABLE — y es la creencia de todos

El arma — Ocho afirmaciones literales, con hora, del log de la sesión — siete negativas y una positiva por conveniencia

/* Ocho afirmaciones, literales y con hora — del log de la sesión (cab0fe5c…jsonl).
   Siete son NEGATIVAS: «no existe», dicho por quien solo sabe que no lo encontró.
   La octava es el mismo error con el signo cambiado: la fecha cuadraba. */

14:06  «las glosas inglesas no están escritas»      → había 20; se leyó un comentario del generador
14:06  «el esquema no tiene dónde colgar una glosa» → term.ncl: definition | i18n_str, bilingüe
14:16  «no hay tal comando, y no lo hubo»           → describe term existía; el grep miró solo crates/*.rs
14:39  un servidor arrancado a mano, sin verificar  → 3 diagnósticos falsos encadenados
14:52  «el conmutador de idioma manda a 404»        → traducía bien; la URL estaba inventada
15:23  «las 26 del léxico se quedan sin superficie» → gen-nota-lenguaje.nu → /sobre-el-idioma
15:32  «el tooltip está bloqueado por contrato»     → reason_type traía 'SourceLanguage para eso
17:25  «Es esta sesión»                             → el id estaba en la ruta del scratchpad

/* Y los cuatro mecanismos que ya lo prohibían, todos anteriores a la primera frase:

     ondaod                    en el CLAUDE.md, con procedimiento consultable
     afirmación ⇒ testigo      adr-072, aceptado, con el anti-patrón nombrado
     qa:expediente-howto       267 líneas; advertía las trampas exactas de esta sesión
     mode:generate-expediente  11 pasos con actor; se imprime con --dry-run

   Ninguno disparó. Ninguno TENÍA disparador. */

Y aquí hay que retirar dos acusaciones, porque este expediente estuvo a punto de archivarse con ellas dentro. La sesión de la mañana no fue descuidada: reportó siete pasos sin artefactos porque la opción –artifacts está tapiada desde el envoltorio del CLI — tres sintaxis probadas, tres parse_mismatch, y los cinco runs históricos llevan esa columna vacía por lo mismo — y perdió el paso account_lesson porque el DAG que le sirvieron tenía diez pasos: la copia instalada iba una versión por detrás, y mode list contestaba con dos DAGs para un mismo id sin decir cuál era el real. Acusarla era, otra vez, afirmar sin mirar el log. Las dos acusaciones se retiran aquí, con testigo.

El giro — Darles disparador a las reglas que ya existían

# El arreglo no es una regla nueva: es darles DISPARADOR a las que ya había.

# 1. El hook — la regla viaja hacia el agente, no al revés (settings.json:134).
#    En cada prompt, si la tarea ya está gobernada, el QA que la gobierna se sirve entero:
"UserPromptSubmit": nu ~/.claude/hooks/onre-prompt-orient.nu
#      «Esto ya está gobernado. No improvises el procedimiento: qa:<id> — léelo ENTERO.»
#    Disparó en producción: la sesión que escribió este caso lo recibió en su primer prompt.

# 2. La puerta — el servidor degradado muere en un segundo, no en tres diagnósticos:
just server-check          # justfile:589 — falla si las rutas declaradas no responden

# 3. El contrato — un id de modo resuelve a UN solo DAG (dos versiones contestaban por uno):
#    .ontoref/reflection/nulib/shared.nu#all-mode-files — dedupe por id, 29 ids → 29 DAGs

# 4. El paso que al DAG servido le faltaba — y el esquema que lo hace irrenunciable:
#    mode:generate-expediente/account_lesson  +  LessonAccounted (schemas/expediente.ncl):
#    lesson_codified_in con punteros VERIFICADOS a lo que ejecuta la lección,
#    o lesson_debt nombrando qué la saldaría. Un caso que calla su lección no exporta.

Queda dicho lo que el arreglo NO cierra, porque esta serie no esconde deudas en el último párrafo. –artifacts sigue tapiado, y los runs seguirán con la columna vacía hasta que el envoltorio acepte una cadena separada por comas. verify existe en cero de los once pasos del modo: sin oráculo por paso, el estado es lo que el agente diga — está aprobado añadirlo a los tres pasos que lo admiten. La lista de pasos del howto no se coteja contra el DAG, y ya mintió una vez. Y la deuda de fondo, la que no tiene puerta posible: una frase no es un artefacto. En esta sesión no llegó a disco ni una mentira — murieron todas en la conversación, porque los ficheros tienen puertas y el canal no. El único oráculo de ese canal es el humano. Eso no es una excusa: es la tesis.

El veredicto

La serie pregunta: ¿con ontoref no hubiera sido así? Y este caso da la respuesta más incómoda del archivo, porque el mecanismo que lo habría cazado no es que existiera: es que existía cuatro veces. La disciplina ondaod, el principio afirmación⇒testigo con número de ADR, el howto que advertía estas trampas concretas, el modo que convierte el procedimiento en once pasos con actor. Todo declarado, todo canónico, todo consultable — todo inerte. La respuesta honesta no es «con ontoref no habría pasado»: es que ontoref, declarado, ya estaba y no bastó — hasta que cada regla consiguió su disparador. Esa es la lección que este expediente deja en el archivo: la disciplina no es la regla; es la regla más lo que la ejecuta. Un hook que la sirve donde se decide, una puerta en la cadena que alguien llama, un contrato que rechaza el fichero que la ignora. Lo demás — lo declarado sin enchufar, lo canónico sin cadena, lo consultable que nadie consulta — tiene un nombre más viejo y menos técnico: buenas intenciones.

Una afirmación negativa sin haber buscadoADR-072 la nombra: el actor puede decir «no miré». El acta de búsqueda registra QUÉ se miró y con qué patrón — y «no existe» sin acta se convierte en «yo no lo encontré», que es verdad y suena muy distinta. De las ocho frases del arma, siete mueren con esa sola conversión.
Un procedimiento improvisado con el howto a una consulta de distanciaEl hook de orientación sirve el QA que gobierna la tarea en el prompt mismo, antes de decidir cómo se hace. La sesión leyó una instancia en vez del howto llamándolo «la forma más fiable»; con el hook, el howto llega primero — no cuatro horas después, señalado por el humano.
Un servidor degradado que envenena cada medición río abajoLa puerta just server-check pregunta a las rutas que solo existen si el arranque fue el declarado (run-secure.sh), y falla en un segundo. Los tres diagnósticos falsos de las 14:39 se encadenaron precisamente porque nada contestaba esa pregunta; la puerta la contesta antes de medir nada — y está probada en los dos sentidos.
Dos DAGs contestando al mismo id de modoEl contrato de shared.nu deduplica por id con precedencia del proyecto: 29 ids, 29 DAGs. La sesión de la mañana perdió un paso entero porque le sirvieron la copia instalada, una versión por detrás — y nada decía cuál de las dos era la real. Ya no hay dos.
Una lección que nada consumeEl paso account_lesson exige punteros verificados a lo que ejecuta la lección — adr:, qa:, mode:, gate:, test:, contract: — o la deuda nombrada. Y el esquema LessonAccounted lo hace irrenunciable: un caso que calla su lección no exporta. Este mismo fichero pasó por esa puerta.
Una frase dicha en el canal humano↔agenteSin puerta posible, y el caso lo declara en vez de disimularlo. Lo que llega a disco pasa por puertas — y en esta sesión no se publicó ni una mentira: murieron todas en la conversación. Lo que se dice no pasa por ninguna. El único oráculo de ese canal es el humano, y contener no es curar.

La jurisprudencia — qué exige hoy la lección

  • Una afirmación negativa exige acta de búsqueda, o se declara «no miré»adr:072/the-actor-can-say-i-did-not-look
  • El QA que gobierna la tarea se sirve en el prompt, antes de decidir el procedimientohook:UserPromptSubmit/onre-prompt-orient
  • El procedimiento del expediente se lee del howto y del modo, nunca de una instanciaqa:expediente-howto
  • El servidor arranca por la vía declarada o toda medición posterior es falsagate:just server-check
  • Un id de modo resuelve a un solo DAG, con precedencia del proyectocontract:.ontoref/reflection/nulib/shared.nu#all-mode-files
  • Un caso nombra qué ejecuta su lección, o declara la deuda — el esquema rechaza el silenciomode:generate-expediente/account_lesson

Deuda declarada: «--artifacts» declarado list<string> e inalcanzable desde el envoltorio del CLI — los cinco runs históricos llevan la columna vacía por eso; lo salda aceptar cadena separada por comas o una opción repetible. «verify» en cero de los once pasos del modo; aprobado añadirlo a los tres con oráculo (assemble_case: el .ncl exporta; render: el .md reproduce; publish: expedientes-check). La lista de pasos del howto no se coteja contra el DAG; lo salda una puerta que compare sus ids contra mode show --fmt json. Y la de fondo, sin puerta posible: una frase no es un artefacto — el único oráculo del canal humano↔agente es el humano.

Queda una cosa por decir, y ordena este expediente dentro de la serie. El 358/980 midió la caja en vez del contenido. El 3/0 comprobó lo que existía y nunca lo que debía existir. El 0/318 escribió un validador impecable que nadie ejecutó. Este caso es el techo de esa familia: no una puerta que mide lo de al lado, ni una que nadie llama — cuatro mecanismos enteros, correctos y consultables, sin nada que los ejecute. Por eso la pregunta que deja no es «¿está escrito?», que aquí se contestaba cuatro veces que sí, sino «¿qué lo dispara?». Si la respuesta es «alguien se acordará», el mecanismo es un cartel — y el día que haga falta, lo señalará un humano con la paciencia justa. En este caso, ocho veces.

Glosario

¿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.