Expediente 0/8: el consejo que no se guardaba la respuesta
Ocho veces ofreció el procedimiento. Ocho veces se declinó. Cero veces quedó constancia — y el mecanismo averiado era la cura de un caso anterior
🕵️ Mostrar expediente completo → 📋 Protocolo de sesión →
Expediente · Depto. de Homicidios de Código
El mecanismo averiado no era uno cualquiera: era la cura de un caso anterior. Disparó dieciocho veces, se oyó las dieciocho, y se evaporó las dieciocho. Curó la mitad que se le pidió.
Mostrar glosario
- PAP
- Los principios, reglas y patrones de arquitectura del proyecto. Una deriva anti-PAP no es un bug: es código que contradice o duplica una fuente de verdad ya declarada.
- hook de orientación
- Un gancho que, en cada prompt, pregunta al grafo qué gobierna ESTA tarea e inyecta el puntero. Su propia cabecera declara que no ata: convierte «no sabía que existía» en «lo sabía y elegí».
- modo
- Un procedimiento declarado como DAG de pasos con dueño. Algunos pasos son 'Human: existen para que un agente no pueda correrlo entero solo.
- testigo
- Un registro de que algo ocurrió, separado de la afirmación de que ocurrió. Sin él, «lo consideré y lo descarté» y «no miré» dejan el mismo hueco: ninguno.
- traza de interacción
- La capa declarada por ADR-037 donde los actos de una sesión se vuelven consultables en vez de tener que minarse de la prosa escrita después.
Protocolo para declarar, versionar y verificar esto → ontoref.dev
El doble balance — lo que costó, y lo que dejó
Lo que costó el crimen
- Duración de la sesión (00:24:37 → 03:46:33) 3 h 22 min
- Prompts del humano 60
- Llamadas a herramienta 554
- Veces que el hook sirvió la orientación 18
mode:generate-expedienteservido 8mode run generate-expedienteejecutado 0qa:expediente-howtoservido → leído 8 → 4- Afirmaciones sin testigo, desmentidas después 9
- Registros en la traza de interacción 0
Lo que la sesión sí produjo
- Commits en outreach 6
- Commits en la espina 5
Los sospechosos — las pistas falsas
| La caché del navegador | “No se había mirado la cascada. Se diagnosticó antes de mirar.” | descartado |
| app.min.css | “Una hoja que la página no carga: se grepeó el disco en vez de leer los <link> servidos.” | descartado |
| Una página 2 vacía | “Artefacto del propio curl: sin la cabecera HX-Request el servidor responde otra cosa. Con ella, 12 + 5 = 17.” | descartado |
| El paginador de tres árboles | “Un menú de tres opciones del que faltaba la que compila. Búsqueda incompleta presentada como disyuntiva cerrada.” | descartado |
| Siete casos sin fuente verbatim | “Se miró .coder/, la capa curada, y no los registros de sesión, que sí conservan los prompts.” | descartado |
| La composición con mod | “Generalizado desde just --justfile, que resuelve rutas de otra manera. Al declarar los módulos reventaron todas las puertas.” | descartado |
| project-root resolviendo vacío | “Deducido de un error que sólo significaba que la función no está exportada. La causa era una copia privada del helper.” | descartado |
El arma — El hook, hasta esa línea
# ~/.claude/hooks/onre-prompt-orient.nu — su propia cabecera # # No ata. Inyecta un puntero, y un puntero es un consejo — la misma prosa # que no ató las otras cuatro veces. Lo que hace es convertir «no sabía # que existía» en «lo sabía y elegí». $out = ($out | append $" mode:($mode_hit) — ... No lo corras entero tú solo.") print ($out | str join "\n") # ← y aquí terminaba la función
Y la capa donde eso debía constar llevaba meses terminada. ADR-037: Accepted. Esquema
con restricción Hard. Migración 0028, aplicada. Siete verbos exportados. El fichero
nunca llegó a existir.
El giro — El mismo fichero, dos llamadas más
# el mismo fichero, líneas 154-157 — después del `print`, donde no había nada
for p in $served {
let w = (do { ^$bin interaction pointer $"($p.k):($p.v)" --session $sid --quiet } | complete)
if $w.exit_code != 0 {
print $" [on+re] warn: puntero no registrado \(($p.k):($p.v)\) — ($w.stderr | str trim)"
# y en `qa show`, cuando la entrada se sirve de verdad:
interaction pointer $"qa:($id)" --consumed --quiet
# servido → status 'pending
# leído → status 'ok
# un 'pending sin cerrar ES el hallazgo
Escribirlo costó tres defectos más, los tres encontrados ejecutando y ninguno leyendo: el
sensor imprimió su confirmación dentro del JSON de qa show; la cura vivió veinte
minutos sólo en la fuente mientras el hook seguía corriendo la copia instalada; y el
detector de esa deriva salió verde sobre cero ficheros en su primer intento, que es el
expediente 0/10 reproducido dentro de la puerta escrita para prevenirlo.
El veredicto
Este hook no es un instrumento cualquiera. Es la cura del expediente 8/4, «la disciplina sin disparador» — aquel caso trataba de cuatro mecanismos que nadie disparaba, y su cura fue precisamente esto: servir lo que gobierna la tarea en el propio prompt. Dispara. Disparó dieciocho veces. Se oyó. Y se evaporó cada vez.
Un proyecto que cura y no verifica la cura acumula curas a medias, y ese patrón sólo se ve si se cuenta por separado lo que se sirvió y lo que se consumió. Agregando, esta sesión sale «consumió la mitad». Separando: la prosa se leyó 4 de 8 veces y el procedimiento 0 de 8. Eso no es distracción, es una selección — leer es barato y no cede nada; correr el DAG entrega el volante a pasos con dueño, dos de ellos humanos.
La fricción que el procedimiento habría cobrado en doce plazos pequeños llegó entera al final, en una sola factura. La ontología del proyecto ya lo tenía escrito antes de que ocurriera: la emergencia sin suelo no es wu-wei, es deriva; fricción diferida, y la fricción diferida llega como pérdida.
| El DAG se ofreció 8 veces y no se invocó ninguna | `interaction pointer` deja constancia de lo servido y `qa show` la cierra al leerse; `interaction pointers` empareja POR TARGET. Agregado, este caso saldría «50 % consumido»; por target dice 4/8 en la prosa y 0/8 en el procedimiento, que es la diferencia entera. |
| La sesión no dejó cuenta consultable | ADR-037 ya la declaraba: esquema con restricción `Hard`, migración 0028, siete verbos exportados. El fichero nunca existió. No faltaba mecanismo: faltaba quien lo llamara. |
| «Once horas» en el titular, sin artefacto que lo sostenga | `gather_metrics` prohíbe el número que no se puede trazar. Es el paso 1 del procedimiento que no se invocó: no hizo falta que fallara nada, bastó con no llamarlo. |
| Nueve afirmaciones dichas con aplomo | El ejecutor de `governed-delivery` (ADR-066) deriva el estado del exit code del check declarado y rehúsa el auto-reporte que lo contradice. |
| La cura vivía en la fuente, no en lo que corre | `just check-runtime` compara por contenido los 283 ficheros de la espina contra la copia instalada, que es a la que llega un hook al resolver `ontoref` con `which`. |
| Un `print` dentro de una superficie máquina | `just test-machine-output` analiza la salida real con `from json`. El exit code seguía siendo 0 con el JSON roto: medir el código de salida es medir la cosa de al lado. |
| «Correr el DAG» suena a trámite: sus pasos no ejecutan nada | Y es cierto que no ejecutan: `mode run` los imprime. Pero el DAG no reparte trabajo, reparte PROPIEDAD — `gather_metrics` prohíbe el número que no se puede trazar, `replay_session` es 'Both, `review` es 'Human. Lo que se salta al declinarlo no es el papeleo: es quién responde de cada paso. Se publicó «once horas», se compusieron los replays por fuera, y el agente se aprobó a sí mismo. Tres pasos, tres dueños, ninguno consultado. CON UNA CORRECCIÓN QUE ESTE CASO SE DEBE A SÍ MISMO: esa propiedad está DECLARADA, no forzada. Medido al escribir el expediente — `ONTOREF_ACTOR` se lee en dos sitios, elegir directorio y elegir formato, y jamás se compara con el actor del paso. Nada impide a un agente reportar un paso 'Human. Vender esto como puerta sería una afirmación sin testigo dentro del caso sobre afirmaciones sin testigo. |
La reconstrucción — la sesión, repetida con protocolo
Lo que se pidió — reconstruido de ~/.claude/projects/-Users-Akasha-Development-ontoref-outreach-site/b791be36-….jsonl, primer registro `type=="user"` — comprobado que las tres líneas son un solo mensaje, no tres
no se supone que https://ontoref.dev/docs/expedientes/protocolo.html debería reunir automáticamente los expedientes ? por qué no están todos y esto no funciona ?
Lo que había que pedir
La página reúne replays, no expedientes. Antes de tocar nada: dime cuántos casos hay y cuántos tienen replay, con el comando que lo cuenta. Si la respuesta es «faltan replays», eso es `mode:generate-expediente` paso 6, y lo corres — no lo compones por fuera.
| Microtarea | Verificable |
| Contar casos y replays | nu scripts/build/gen-expediente.nu --check |
| Confirmar que la página sirve lo que el disco dice | curl -s --compressed localhost:3030/expedientes | grep -oE 'href="/expedientes/casos/[^"]*"' | sort -u |
| Confirmar que hay una ejecución abierta antes de reportar pasos | ontoref run status — y leer la salida, no el código de salida |
| Confirmar que lo editado es lo que corre | just check-runtime |
La puerta antes de delegar: No componer ni delegar nada hasta que ontoref run status devuelva una ejecución de este modo.
Devolvió null toda la sesión y nadie lo miró.
El disparador de ADR: «¿Puede un mecanismo declararse consejo y no guardar la respuesta?» Es decisión arquitectónica con alternativa rechazada conscientemente —la puerta bloqueante— y con restricción duradera sobre todo instrumento consultivo futuro.
La jurisprudencia — qué exige hoy la lección
- ✓Un formato máquina que no se deja analizar es una superficie rota, y el exit code no lo dice
gate:just test-machine-output - ✓La fuente no es el sistema que corre hasta que se instala
gate:just check-runtime - ✓La forma del registro ya estaba escrita: 'Read con 'pending o 'ok
contract:.ontoref/reflection/schemas/interaction.ncl#events - ✓Un número que no se puede trazar se descarta, no se estima
mode:generate-expediente/gather_metrics - ✓El howto que gobierna la serie, que esta sesión sí leyó 4 de 8 veces
qa:expediente-howto
⊘Deuda declarada: Nada obliga a mirar la razón. interaction pointers empareja y reporta, y ninguna puerta lo
lee — a propósito: la tensión que mide es Spiral y un Hard biconditional ahí es el patrón
que el proyecto prohíbe por nombre. Pero el resultado honesto es que esta lección quedó
SERVIBLE y su consumo SIN OBLIGAR, que es la misma forma del defecto que el caso denuncia, un
plano más arriba. Y hay una apuesta sin cobrar: que la elección conste no demuestra que vaya
a elegirse mejor. Lo saldaría una razón medida en el tiempo — el proxy de emergencia que la
tensión enforcement-vs-emergence declara ausente. Se falsaría así: con el rastro existiendo
y siendo leído, si el DAG se sigue declinando 8 de 8 con el mismo destrozo, la cura es
insuficiente. Aparte y anotado como bl-051: el almacén de ejecuciones no registra pasos con dos
sesiones concurrentes, así que hoy la evidencia de que un DAG se siguió depende de que nadie
más esté trabajando en el árbol.
Queda una apuesta sin cobrar, y el caso no la disimula: que la elección conste no demuestra que vaya a elegirse mejor. Eso se sabrá contando. Si con el rastro delante el procedimiento se sigue declinando ocho de ocho, el arreglo era insuficiente y habrá que volver aquí. Esa cifra todavía no existe — y que no exista es, exactamente, lo que este expediente vino a arreglar.
Del vocabulario del proyecto (7)
- Espiral
- Forma de resolución de una tensión Yin/Yang en la que ningún polo gana y el sistema oscila entre ellos, con la síntesis emergiendo del propio movimiento.
- Gate
- Prerrequisitos tipados y políticas que controlan las transiciones de estado de la máquina de estados de un proyecto.
- PAP
- Project's Architecture Principles (Principios de Arquitectura del Proyecto).
- Sensor
- Control por realimentación en un arnés de agentes: la comprobación que se dispara DESPUÉS de que el modelo genere, y corrige lo que una guía no pudo prevenir.
- anti-PAP
- Enfoque que viola frontalmente el PAP del proyecto.
- on+re
- Abreviatura de la doble capa de Ontoref: ontología (`.ontoref/ontology/`: core.ncl, state.ncl, gate.ncl, manifest.ncl — lo que ES) + reflexión (`.ontoref/reflection/`: modos, cartera de pendientes, restricciones, qa — lo que DEVIENE).
- 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.