feat(episode): TRAZA_lo-que-qued-inscrito_S20260902.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: troubleshooting
Summary: EPISODIO 1 — MEMORIA: Lo que quedó inscrito
This commit is contained in:
Ember 2026-09-06 17:43:40 +00:00
parent 607aa32676
commit 928e739dd9

View file

@ -0,0 +1,45 @@
---
episode_id: "064784bb-d17d-4fe2-9e4e-c11bd5660286"
puente_flat: "TRAZA_lo-que-qued-inscrito_S20260902.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260902.SID80EF6E909F98"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 1 — MEMORIA: Lo que quedó inscrito"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-09-06T17:43:38.653815+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
Terminado. Ya puedes re-ejecutar el comando de rotación.
## Lo que quedó inscrito
**El escáner nació ciego tres veces, y eso es lo más valioso del turno.** No lo digo como anécdota: es la prueba de que el método funciona.
1. Leía **línea a línea**. El bug histórico vivía partido en dos trozos de una cadena, así que daba `0 hallazgos` **sobre el código que lo motivó**. Lo cacé preguntándole al oráculo antes de creerle: `¿detecta el bug histórico real? → False`.
2. Buscaba la relectura **cerca** de la escritura en vez de **dentro**. Marcó 4 sitios donde el patrón era el correcto (escribir, luego releer para validar).
3. Se marcó **a sí mismo**: su propio docstring describía el patrón que busca.
Las tres las cazó el control, no yo leyendo. Por eso el `0 hallazgos` final del repositorio y el `0 casos` de la flota ya significan algo — antes eran indistinguibles de un instrumento muerto.
**Lo que ahora obliga, no recuerda:**
| Artefacto | Qué hace | Verificado |
|---|---|---|
| [`lib/fallos_silenciosos.py`](.claude/hooks/lib/fallos_silenciosos.py) | Fuente **única** de las reglas FS-1..FS-7 | — |
| [`mega-hook-writing.py`](.claude/hooks/mega-hook-writing.py) regla 3.5 | **Bloquea** FS-1 y FS-5 al escribir `.py` | **4/4 en vivo** |
| [`escanear_fallos_silenciosos.py`](scripts/escanear_fallos_silenciosos.py) | Barrido del repo y del servidor | 0 hallazgos |
| [`test_escanear...py`](scripts/test_escanear_fallos_silenciosos.py) | Control positivo + negativo | **16/16** |
| [`PLAYBOOK_FALLOS_SILENCIOSOS.md`](docs/PLAYBOOK_FALLOS_SILENCIOSOS.md) | Las 7 clases y su árbol de decisión | — |
Extendí el guardián de Integridad que ya existía en vez de fabricar el hook número 25 — consulté el grafo primero. Y el muro **falla abierto**: si su librería se rompe, deja pasar. Un vigilante averiado no puede convertirse en una puerta cerrada.
Dos correcciones sobre mi propio trabajo que merecen mención: FS-2 medía **la sombra** (nombres que suenan a secreto — dio 4 avisos y los 4 eran `GPG_KEY` públicas y rutas de MinIO) y ahora mide **el hecho** (un contenedor vivo corriendo con el valor horneado en su imagen, que es exactamente lo que falló). Y toda su lógica vivía dentro de una cadena que solo corre por SSH: era **FS-7 cometido dentro del fichero que define FS-7**.
> 🎯 **En una frase:** lo que te costó cuatro días ahora lo bloquea un hook antes de que llegue a escribirse, y el instrumento que lo detecta tiene su propio examen porque nació ciego tres veces.