feat(episode): TRAZA_el-diagnstico-evidencia-verificada-no-e_S20260609.R43_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: design
Summary: EPISODIO 43 — SessionStart: 👻 El diagnóstico (evidencia verificada, no especulac
This commit is contained in:
Ember 2026-06-11 03:17:01 +00:00
parent 2d65662d36
commit d4a9165284

View file

@ -0,0 +1,41 @@
---
episode_id: "ac2506e7-5eb9-4b0c-8f6d-973aaec876ad"
puente_flat: "TRAZA_el-diagnstico-evidencia-verificada-no-e_S20260609.R43_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260609.SELFAWARENESS_MISION_CRITICA"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "design"
summary_one_line: "EPISODIO 43 — SessionStart: 👻 El diagnóstico (evidencia verificada, no especulación)"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-06-11T03:16:28.968380+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
✅ FORENSE entregado y anclado: 📄 **[docs/FORENSE_TURNOS_FANTASMA_STOP_HOOKS_S20260609.md](docs/FORENSE_TURNOS_FANTASMA_STOP_HOOKS_S20260609.md)** (commit `0b019eb`, 3 remotos). Y sí — **tienes razón, con un matiz que afina tu regla.**
## 👻 El diagnóstico (evidencia verificada, no especulación)
**Causa raíz en una frase:** los Stop hooks advisory emiten contexto **incondicionalmente mientras su condición persista** — verifiqué con grep que `panel-analitico`, `concilio-detector` y `self-awareness-post` tienen **cero** lógica de deduplicación/cooldown/tope (0 matches) — y cada emisión re-invoca al modelo, creando el bucle de relojitos que solo muere cuando tú escribes.
**La cadena completa:** tu mensaje sobre *gráficos* → el classifier lo marcó D-ARCH por la keyword "arquitectura" (falso positivo) → el panel quedó registrado como "pendiente" en `panel_state` → la lógica documentada del hook es literalmente *"Si no → alerta"* sin escape → cada Stop re-alertó → ~25+ turnos fantasma. Lo más irónico: el **routing-verifier discrepó** en su momento (`primary=D-ARCH vs verifier=NONE`) — la segunda opinión existía y nadie la consumió.
## El matiz a tu tesis
"Ningún hook sin acción del usuario" casi — porque SessionStart, PreCompact y los crons son activaciones legítimas sin acción directa tuya. El invariante fino que propongo canonizar:
> **Los hooks decoran turnos; no los fabrican.** Ningún hook puede re-invocar al modelo de forma no acotada sin input nuevo del usuario o cambio real de estado. Observar/loguear: libre. Generar turnos: presupuestado (máx 2 por condición) y deduplicado.
## El fix — 3 capas, listo para ejecutar con tu OK
| Capa | Qué | Costo |
|------|-----|-------|
| **F-1** inmediato | registrar `EXCEPCION_PANEL` (el escape que el propio protocolo contempla) + limpiar `panel_state` → el bucle actual muere | 5 min |
| **F-2** estructural | `lib/stop_advisory_guard.py`: emitir solo si condición nueva o hubo prompt tuyo desde el último aviso; tope 2 avisos → luego PILA silenciosa. Retrofit a los 5 emisores ruidosos | ~1h + tests |
| **F-3** upstream | tuning del classifier: anti-trigger viz para "arquitectura" + consumir la discrepancia del routing-verifier | sprint corto |
Mi inclinación: **F-1 ya** (es trivial y apaga el ruido) y **F-2 también hoy** (cura la clase entera del bug, no solo este caso). F-3 puede esperar a sprint. ¿Doy luz verde a F-1+F-2?