feat(episode): DEPURA_mi-recomendacin-estaba-mal-fundada-y-lo_S20260807.R2_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: troubleshooting
Summary: EPISODIO 2 — MNEMO_PRE_DIGEST: Mi recomendación estaba mal fundada, y lo digo pr
This commit is contained in:
Ember 2026-08-11 18:25:36 +00:00
parent aa4602729e
commit 40f67b1eb3

View file

@ -0,0 +1,54 @@
---
episode_id: "d9c1f57f-b7d1-47e2-abba-d32c6358ebea"
puente_flat: "DEPURA_mi-recomendacin-estaba-mal-fundada-y-lo_S20260807.R2_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260807.DOCS_MNEMO_FUENTE_VIVA"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 2 — MNEMO_PRE_DIGEST: Mi recomendación estaba mal fundada, y lo digo primero"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-08-11T18:25:26.911405+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
Commit `c7ced256`. Y la tarea resultó ser otra de la que pediste — para bien.
## Mi recomendación estaba mal fundada, y lo digo primero
Te propuse conectar `panel_log` diciendo que «tiene el clasificador turno a turno». **Falso.** Sus campos son `event, probator_verified, query_hash, session_id, ts`. Repetí el informe **sin abrir el archivo** — el error que llevo dos días cazando en otros.
Los datos del router viven en otros dos registros, y **ambos ya se consumen**. Así que la pregunta correcta no era *«conectemos otro flujo»* sino **«¿por qué está ciego con lo que ya lee?»**.
## La respuesta: el vigilante no veía nada
**3 de los 7 detectores buscaban campos que ninguna fila escribe.** Cuando el campo no existe, el criterio devuelve «no es fallo» — así que el único componente cuyo propósito es *sumar fallos de todo el sistema* reportaba **cero**.
| registro | buscaba | realidad | fallos invisibles |
|---|---|---|---|
| router | `action_taken` (0 filas) | `agreement` | **392** |
| esquemas | `validation_result` (0) | `verdict` | **80** |
| concilio | `probator_verdict` (1 de 1.327) | `event` | **1.031** |
**0 vistos → 1.503 visibles.** Y el hook ya alerta en vivo: *«routing_verifier: 3 fails»* donde antes callaba.
## Un cuarto caso que NO toqué
`libro_vivo` busca `VIOLATION` y sus 1.841 filas dicen `pending_review`. La clave existe; el criterio nunca se cumple. **No inventé la semántica de un subsistema que no conozco** — queda declarado como *inerte*, que no es lo mismo que ciego.
## Lo valioso no son los tres parches
Es el candado: una auto-auditoría que contrasta **cada clave declarada contra el registro real**, más un test permanente. Porque **un detector roto no falla: calla**, y su silencio se lee como «todo bien».
`★ Insight ─────────────────────────────────────`
**El test pineaba el bug.** Afirmaba en su docstring que el campo era `action_taken` y **fabricaba a mano una fila** con un campo que la realidad nunca produce.
**Es el reverso del error de ayer**: allí un escenario imposible hacía *fallar* un test sobre código sano; aquí hacía *pasar* un test sobre código ciego — **la forma más peligrosa, porque da confianza**.
`─────────────────────────────────────────────────`
**Control positivo:** al revertir la clave, el candado grita con el detalle exacto —`busca 'action_taken' (0 de 2273 filas)`— y el archivo queda byte a byte.
**Hice** — el vigilante cross-sistema ve 1.503 fallos que antes no veía, con candado y test permanente. Commit `c7ced256`.