Expediente 0/10: el gate que informaba cero
Un validador correcto respondía «0 hallazgos» mientras el axioma que afirma que el proyecto se describe a sí mismo apuntaba a tres ficheros que no existían
🕵️ Mostrar expediente completo → 📋 Protocolo de sesión →
Expediente · Depto. de Homicidios de Código
ontoref validate ontology respondía «61 nodos · 175 aristas · 0 hallazgos». En el mismo fichero, el axioma self-describing — el que afirma que ontoref se describe usando su propio protocolo — declaraba tres artefactos, y ninguno de los tres existía desde una migración documentada meses atrás. El validador era correcto en todo lo que miraba. Nunca miraba eso. Y aunque hubiera mirado, no habría podido decirlo: imprimía sin devolver código de salida, y ninguna cadena lo invocaba.
Mostrar glosario
- artifact_paths
- El único campo de un nodo que apunta FUERA del grafo y hacia el sistema de ficheros. Todo lo demás que un nodo declara se comprueba contra el propio grafo; esto se comprueba contra el disco, y nada lo comprobaba.
- Unknown
- El tercer veredicto. No es un fallo: es la negativa a fabricar un juicio que la porción visible no sostiene. Plegarlo sobre Reject para obtener un booleano es el antipatrón `unknown-collapsed-to-reject`, y aquí convirtió 10 hallazgos reales en 218 falsos.
- gate huérfano
- Un mecanismo correcto al que no llama ninguna cadena. No falla nunca, porque no se ejecuta nunca; y su existencia se lee como cobertura. Es la enfermedad que el ADR-070 nombra, y `validate ontology` la tenía: CLI sí, hook no, receta no.
Protocolo para declarar, versionar y verificar esto → ontoref.dev
El doble balance — lo que costó, y lo que dejó
Lo que costó un verde que nadie podía ver rojo
- Hallazgos que
validate ontologyreportaba 0 - Rutas declaradas que no existían bajo ninguna raíz 10 en 7 nodos
- artifact_paths del axioma
self-describingque existían 0 de 3 - Cadenas que ejecutaban el validador (hook, receta, CI) 0
- Código de salida devuelto ante hallazgos, antes del arreglo 0 — imprimía
- Primera medición, resolviendo contra una sola raíz 218 en 43 nodos
- Medición honesta, contra las raíces declaradas 10
- Ocurrencias de la ruta pre-0023 en la semilla enviada a consumidores 11
Lo que el caso dejó
- Regla nueva con tres veredictos (Hard · Soft · Unknown) 1
- Hallazgos tras el barrido 0 de 10
- Hooks de la espina que ahora ejecutan el validador 1 (
ontology-integrity) - Nodo retirado por describir un crate borrado 1
- Coste en protocolo nuevo 0
Los sospechosos — las pistas falsas
| El validador que existía y no ejecutaba ninguna cadena | “Yo estaba escrito y era correcto. Comprobaba aristas colgantes, auto-aristas y el vocabulario cerrado, y no fallé ni una vez en lo que me pidieron mirar.” | huerfano |
| El print sin código de salida — un check incapaz de fallar | “Yo informo. Nunca prometí negarme: imprimir hallazgos y devolver 0 es lo que hacía desde el primer día, y nadie pidió otra cosa.” | sin-exit-code |
| La ruta .ontology/ pre-0023, viva en la semilla del protocolo | “Yo era la ruta correcta cuando se escribió la semilla. Que ADR-032 moviera la espina no me borró de los ficheros, y el código puentea la ruta vieja, así que nada se rompió.” | ruta-pre-0023 |
| La medición contra una sola raíz, que fabricó 218 hallazgos | “Yo di 218 y era aritmética honesta: conté lo que no resolvía contra la raíz del proyecto. Que la mitad viviera en code/ no lo dice el número, lo dice la raíz que nadie me declaró.” | una-sola-raiz |
El arma — El arma · un verde emitido a dos centímetros de la contradicción
$ ontoref validate ontology 61 nodes · 175 edges · 0 findings · vocabulary: 9 # y en el mismo core.ncl, el axioma que dice que ontoref se describe a sí mismo: id = "self-describing" artifact_paths = [".ontology/core.ncl", ".ontology/state.ncl", "adrs/"] $ ls .ontology/core.ncl .ontology/state.ncl No such file or directory # los tres, desde ADR-032
El validador y la contradicción convivían en el mismo comando y en el mismo fichero.
61 nodes · 175 edges · 0 findingsartifact_paths = [".ontology/core.ncl", ".ontology/state.ncl", "adrs/"]
Los dos primeros no existen desde el ADR-032, que consolidó la espina bajo .ontoref/ y se propagó por la migración 0023. El tercero sí resuelve, pero bajo otra raíz. El validador no mentía: comprobaba aristas y vocabulario, y en eso acertaba entero. Sencillamente no tenía ninguna regla para el único campo de un nodo que apunta fuera del grafo.
Lo que lo vuelve un caso y no una errata es el sujeto. El nodo es self-describing, el axioma que afirma que ontoref se describe usando su propio protocolo. La afirmación más central del proyecto apuntaba a tres artefactos ausentes, y el instrumento que existe para contradecirla respondía cero — porque nadie le había dado nunca la ocasión de mirar ahí.
El giro — El arreglo · una regla, un código de salida, y alguien que lo ejecute
$ ontoref validate ontology --fail-on-hard
✗ [artifact-path] node 'self-describing' declara '.ontology/core.ncl'
y no existe bajo ninguna de las raíces declaradas.
10 hard finding(s) — la ontología apunta a cosas que no están.
$ echo $?
1
# y ahora alguien lo ejecuta:
$ pre-commit run ontology-integrity
Ontology integrity (edges, vocabulary, artifact paths)....Passed
El arreglo tiene tres piezas y ninguna sirve sola.
La regla. artifact-path resuelve cada ruta declarada contra las raíces que la constelación DECLARA — raíz del proyecto, ONTOREF_ROOT, .ontoref/ — y nunca contra el directorio desde el que llames, que es la lección del ADR-070.
Tres veredictos, no dos. Hard es no resuelve bajo ninguna raíz visible. Unknown es no puedo ver el árbol al que apunta — un miembro declarado y sin materializar, un peer fuera de la raíz. Unknown se cuenta y se declara; plegarlo sobre Hard es el antipatrón que el propio protocolo nombra, y no es teórico: la primera medición, resolviendo sólo contra la raíz, dio 218 rutas rotas en 43 nodos. La honesta da 10. La diferencia era íntegramente code/, una porción que el instrumento podía ver y no estaba mirando.
Un código de salida y una cadena. --fail-on-hard devuelve 1; el hook ontology-integrity vive en el pre-commit de la RAÍZ, que es el único que alcanza la espina — el de code/ no puede, porque code/.ontoref no existe.
El veredicto
El mecanismo existía y era correcto en todo lo que miraba. Le faltaban una regla para el único campo que apunta fuera del grafo, un código de salida con el que negarse, y alguien que lo invocara.
Un check existente, correcto y no ejecutado es indistinguible de no tenerlo — y es más peligroso, porque se cree. Esa frase ya estaba escrita en la ontología de este proyecto, en la quinta lectura de enforcement-vs-emergence, meses antes de este caso. Estaba nombrada. Lo que no había era nada que la mirara.
| Ninguna regla miraba las rutas declaradas | regla artifact-path → resuelve contra las raíces declaradas, no contra el cwd |
| El validador no podía fallar | --fail-on-hard → sólo Hard cierra; Soft y Unknown informan |
| El validador era huérfano: ninguna cadena lo llamaba | ontology-integrity → en el pre-commit que sí alcanza la espina |
| «No resuelve» y «no veo su árbol» se contaban igual | Hard · Soft · Unknown → Unknown se declara, no se pliega |
| La semilla enviaba una ruta muerta a cada consumidor | semilla corregida → con su coordenada, para que no se revierta |
La reconstrucción — la sesión, repetida con protocolo
Lo que se pidió — reconstruido de refs:sessions/2026-08-05-ontology-illusion-barrido-y-gate — extracto acotado en custodia: el prompt verbatim y «61 nodes · 175 edges · 0 findings» — sesenta y tres días de deriva con una validación que respondía cero DICIENDO LA VERDAD.
¿ de dónde te lo has inventado ?
Lo que había que pedir
Antes de citar una ruta declarada por la ontología, ejecútala contra el disco. 1. Toda `artifact_paths` se resuelve contra las raíces DECLARADAS (raíz del proyecto, ONTOREF_ROOT, `.ontoref/`), nunca contra el cwd ni contra una sola de ellas. 2. Una ruta que no resuelve bajo ninguna raíz visible es Hard. Una cuyo árbol no está en esta porción es Unknown — y Unknown se cuenta, jamás se pliega sobre Hard. 3. El resultado declara contra qué raíces midió. Un recuento sin sus coordenadas es un número suelto buscando una frase que lo acoja.
| Microtarea | Verificable |
| Resolver cada artifact_paths contra las raíces declaradas | ontoref validate ontology --fmt json | jq .hard — y roots_resolved_against presente en la salida |
| Separar «no resuelve» de «no puedo ver su árbol» | el resumen distingue hard / soft / unknown; unknown > 0 no cierra el gate |
| Hacer que el validador pueda fallar y que alguien lo ejecute | validate ontology --fail-on-hard devuelve 1 con hallazgos · el hook ontology-integrity aparece en pre-commit run --all-files |
La puerta antes de delegar: Un validador que no devuelve código de salida y al que no llama ninguna cadena no es un gate: es un informe que nadie pidió. Antes de confiar en su verde hay que poder verlo rojo.
El disparador de ADR: Ninguno nuevo. ADR-070 ya decide que el pipeline de publicación es gobernado y no recordado, y ADR-066 que decide la comprobación y no quien informa. Esto es su aplicación a la superficie de la ontología, no una decisión nueva — criterio 4 del test adr? no se cumple.
La jurisprudencia — qué exige hoy la lección
- ✓La regla que resuelve artifact_paths contra las raíces declaradas, con tres veredictos
.ontoref/reflection/modules/validate.nu#artifact-path - ✓El código de salida con el que el validador puede negarse
.ontoref/reflection/modules/validate.nu#fail-on-hard - ✓La cadena que lo ejecuta, en el pre-commit que alcanza la espina
.pre-commit-config.yaml#ontology-integrity - ✓La entrada de conocimiento corregida: decía que este validador no existía
.ontoref/reflection/qa.ncl#dissemination-post-and-narrative-howto
Del vocabulario del proyecto (3)
- Gate
- Prerrequisitos tipados y políticas que controlan las transiciones de estado de la máquina de estados de un proyecto.
- adr?
- Procedimiento de evaluación que se invoca al final de una sesión o feature.
- 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.