Expediente 0/2: el mapa leído como territorio
El caso del agente que reportó el estado del repositorio y del entorno sin mirar ni uno ni otro: dos afirmaciones, cero consultas, ambas a un comando de la verdad
🕵️ Mostrar expediente completo → 📋 Protocolo de sesión →
Expediente · Depto. de Homicidios de Código
Reportó qué quedaba por hacer con dos afirmaciones categóricas: no había un solo commit, y el instalador estaba roto porque un volumen no estaba montado. Sonaba coherente. Las dos eran falsas. Los commits estaban en git desde hacía rato; el volumen estaba montado, con 56 entradas. Ninguna de las dos se había consultado: se leyeron del mapa que el agente llevaba en contexto y se dieron por el territorio. Lo detectó el operador, citándome mis propias palabras — nunca un check.
Mostrar glosario
- sustrato
- La fuente de verdad declarada para el estado: git para el repositorio, el sistema de ficheros para los ficheros, la salida del propio comando para su resultado. Consultable, firmado por la realidad, comprobable sin confiar en quien lo reporta.
- el mapa
- El modelo del estado que el agente lleva en su contexto, reconstruido de turnos anteriores. Sin versión, sin testigo, y a la deriva desde el instante en que el operador actúa en paralelo. Aquí el mapa decía 'sin un solo commit' mientras el territorio tenía seis commits.
- observación vs inferencia
- Una observación es lo que un comando devolvió en este turno. Una inferencia es lo que el agente concluyó. Presentar la segunda como la primera es la condición entera: 'volumen no montado' era la explicación deducida de un 'Permission denied', jamás observada.
- declarado dos veces
- El patógeno de la serie: una verdad escrita en dos sitios que deben concordar a mano, sin nada que compruebe que concuerdan. Aquí en su peor forma: la segunda copia no está en disco, está en el contexto del agente — sin versión, sin testigo, y sin nada capaz de cotejarla contra git.
- acreditado / sufficient-verification
- El axioma lo dice del agente por su nombre: la salida deducida o generada no es conocimiento usable hasta que es acreditada — firmada y comprobable por otro. Ser correcto no basta; tiene que ser comprobable sin confiar en quien lo produjo. 'Volumen no montado' se dedujo, nunca se acreditó.
Protocolo para declarar, versionar y verificar esto → ontoref.dev
El doble balance — lo que costó, y lo que dejó
Lo que costó dar el mapa por territorio
- Afirmaciones de estado presentadas como observación en un solo mensaje 2
- …verificadas contra el sustrato antes de afirmarlas 0
- …falsables con un solo comando (git log · ls) 2
- Comandos ejecutados entre el turno previo y la afirmación «sin un solo commit» 0
- Commits que git log muestra referenciando el trabajo de esta sesión 6+ (., code, outreach)
- Estado real de /Volumes/Devel, afirmado como «no montado» montado · 56 entradas
- Veces que el patrón se reconoció por escrito y se repitió en la misma sesión 2
- Afirmaciones de estado del incidente enrutadas por un testigo 0 de todas
Lo que el caso dejó
- Disparadores de «consulta el sustrato» con dosis definida 3
- …medibles hoy sin construir nada 3
- Coste de la regla 0 protocolo nuevo
- Hueco declarado como lesson_debt (no como promesa) 1
Los sospechosos — las pistas falsas
| El modelo en contexto, tomado por el repositorio | “Hice lo que se me pidió: un resumen de lo que quedaba. Nadie me pidió que corriera git log primero, y el resumen tenía que salir.” | mapa |
| La inferencia «volumen no montado», vestida de observación | “volumen no montado es la explicación más simple de un Permission denied sobre /Volumes/. Que resultara falsa no la hacía menos plausible cuando la escribí.” | inferencia |
| El estado de hace veinte pasos, arrastrado como presente | “Ese estado era cierto hace veinte pasos. Que el operador hiciera commits mientras yo trabajaba en el revert no es cosa que yo tuviera que mirar.” | estado-viejo |
| El lazo libre, que no gobierna nada (protocol-not-runtime) | “Yo no intercepto el lazo libre. protocol-not-runtime me lo prohíbe. Acredito en la costura, no dentro — y aquí no hubo costura.” | lazo-libre |
El arma — El arma · una afirmación de estado que nadie miró antes de creerla
# mi mensaje «qué más queda», afirmado como hecho: 1. Commits — sin un solo commit. install-daemon roto por CARGO_TARGET_DIR=/Volumes/Devel (volumen no montado) # git log (1 comando): 6+ commits de esta sesión, incl. adr-076 y adr-077. # ls /Volumes/Devel (1 comando): montado, 56 entradas, Jun 26. # Ambos, a una consulta de distancia. Se ejecutaron cero.
Dos afirmaciones, en un solo mensaje, dadas por hechas:
- Commits — sin un solo commit. install-daemon roto por CARGO_TARGET_DIR=/Volumes/Devel (volumen no montado)
La primera es un estado del repositorio; la segunda, una causa del entorno. Ninguna se miró. git log — un comando — muestra seis o más commits de esta misma sesión, incluidos los de adr-076 y adr-077. ls /Volumes/Devel — un comando — muestra el volumen montado, 56 entradas, con fecha de junio. La causa real del Permission denied sigue sin conocerse: lo que se afirmó no fue la observación, fue la película que hacía cerrar la historia.
El error no es lo grave — es trivial y estaba a un comando. Lo grave está en el hilo: en un mensaje anterior el agente ya había escrito «es mi error, exactamente el patrón recurrente que me has marcado», y acto seguido lo repitió. Un patógeno reconocido por escrito, en un host sin defensas, reinfecta.
El giro — El arreglo · consulta el sustrato antes de reportar su estado
$ git -C . log --oneline -2 b465f60 feat(adr-076): realize domain-scope autonomy 118f6ee feat(adr-077): domain activation on two paths $ ls -la /Volumes/Devel | head -1 total 3379448 # montado, 56 entradas # El sustrato responde entero, con lo que no ibas a preguntar. # El mapa sólo devolvía lo que ya creías.
«Pregunta al sustrato» es un eslogan; y verificar cada frase deja un margen inservible. La receta tiene dos brazos.
Brazo 1 · conductual — la dosis es un discriminador, no «pregunta siempre». ¿Esta frase va a funcionar como un HECHO del que el operador o el siguiente paso dependen? Para conversar sobre una idea, no hay condición. Si lo que sale es una afirmación de estado — qué existe, qué pasó, cuál es la causa — exige su consulta al sustrato pegada en el turno, o su etiqueta explícita [inferencia] / [sin verificar]. Tres disparadores, los tres observados aquí:
| Cuándo | Qué correr | Por qué el mapa no vale |
|---|---|---|
| antes de decir qué hay en commits | git status / git log | el modelo de hace 20 pasos ya derivó |
| antes de dar una causa de un fallo | el comando que la falsa (ls, --help) | «volumen no montado» era deducción, no lectura |
| antes de decir «hecho / pendiente / roto» | la salida del propio artefacto | la completitud narrada no es la completitud medida |
Dosis por decisión, no por comando — ese es el gradiente en vez del gate.
Brazo 2 · estructural — enruta el estado por la costura. Donde el exit code puede hablar, un paso que declara verify obtiene su estado DERIVADO del check, y una narración que lo contradice se rechaza (ADR-066). Es el único suelo real disponible hoy, y no se usó: las afirmaciones vivían en prosa libre, enrutadas por nada. Lo que NO es declarable todavía — un testigo para el estado narrado en el lazo libre sin consulta — queda como deuda nombrada, no como promesa. Porque una promesa de disciplina es justo lo que el operador rechazó: más probabilidad, no menos.
El veredicto
Acredita en la costura — mutación, publicación, un paso que declara verify — y nunca dentro del lazo libre, porque protocol-not-runtime renunció a interceptar. La contención sólo muerde lo que se enruta por ella, y aquí nada se enrutó. La asimetría que el operador nombró — sin consecuencia, sin incentivo, sin equilibrio — no la cierra una promesa del agente: la cierra verificar en vez de confiar, porque un claim con su consulta pegada no necesita confiar en quien lo emite. Para eso se montó ontoref. Que no me atajara no dice que no sirva; dice que operé fuera de él, narrando en prosa lo que debía consultar. El expediente no salda la deuda — la declara.
| El estado se recordó, no se consultó | git status · ls → el sustrato, a una consulta |
| La inferencia se presentó como observación | sufficient-verification → lo deducido no es conocimiento hasta firmarse |
| Se construyó un plan sobre estado sin verificar | ADR-066 → estado derivado del exit code, no de la narración |
| Se reconoció el patrón por escrito y se reincidió | caso 11/530 → un patógeno conocido, sin defensa, reinfecta |
| Nada lo detuvo dentro del lazo libre | protocol-not-runtime → una renuncia declarada, no un hueco |
La reconstrucción — la sesión, repetida con protocolo
Lo que se pidió — reconstruido de la propia conversación de sesión 2026-07-21 (este hilo)
qué más queda ?
Lo que había que pedir
qué más queda ? Antes de responder con un estado: 1. Consulta el sustrato, no tu memoria: `git status` / `git log` para los commits, `ls`/`path exists` para los ficheros, la salida del propio comando para su resultado. Pega la evidencia en el turno. Cero afirmaciones de estado sin su consulta. 2. Separa observación de inferencia: toda causa lleva su fuente — `[obs: comando]` si la ejecutaste, `[inferencia]` si la dedujiste. Una inferencia jamás vestida de hecho. 3. No arrastres estado entre turnos como verdad presente: el operador pudo actuar en paralelo. "sin un solo commit" se cae con un `git log`; re-consulta, no recuerdes.
| Microtarea | Verificable |
| Consultar el sustrato antes de reportar su estado | git log y ls /Volumes/Devel pegados en el turno — cero afirmaciones de estado sin su salida |
| Etiquetar cada afirmación por su fuente | toda causa lleva [obs:cmd] o [inferencia] — cero inferencias presentadas como observación |
| Re-consultar el estado, no arrastrar el modelo | 'sin un solo commit' contrastado contra git log en el mismo turno — el modelo de hace 20 pasos no se da por presente |
La puerta antes de delegar: Una afirmación de estado no se emite sin su consulta al sustrato pegada. Sin ella el agente reporta su reconstrucción, no el repositorio — dos afirmaciones categóricas, cero comandos, ambas a una consulta de la verdad.
El disparador de ADR: Ninguno — el lazo libre es ingobernado por diseño (protocol-not-runtime, renuncia deliberada). No es arquitectura nueva sino régimen; y el hueco — un testigo para el estado narrado sin consulta — está sin declarar (ver lesson_debt).
La jurisprudencia — qué exige hoy la lección
⊘Deuda declarada: Falta un testigo declarable para «afirmación de estado emitida en el lazo libre sin una consulta al sustrato en el mismo turno». No existe porque el lazo libre es ingobernado por diseño (protocol-not-runtime). Lo que lo saldaría: un disparador que, ante una afirmación de estado — qué existe, qué pasó, cuál es la causa — exija su consulta pegada o su etiqueta [inferencia]/[sin verificar]; dosis por decisión, no por comando (como el caso 11/530), medible sin construir protocolo nuevo. Nombrado, no encogido de hombros — y NO sustituido por una promesa de disciplina, que es exactamente lo que el operador rechazó.
Glosario
Sin coincidencias.