Skill: NONE | Type: design
Summary: EPISODIO 43 — SessionStart: 👻 El diagnóstico (evidencia verificada, no especulac
3.1 KiB
| episode_id | puente_flat | session_code | acto_dialogico | actor_flujo | criticidad_aegis | skill_dominante | fase_proyecto | tipo_semantico | summary_one_line | source_type | trust_boundary | created_at | relectura_tagged | forgejo_commit_sha |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ac2506e7-5eb9-4b0c-8f6d-973aaec876ad | TRAZA_el-diagnstico-evidencia-verificada-no-e_S20260609.R43_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD | S20260609.SELFAWARENESS_MISION_CRITICA | informar | multi_actor | low | NONE | operations | design | EPISODIO 43 — SessionStart: 👻 El diagnóstico (evidencia verificada, no especulación) | claude_code | internal | 2026-06-11T03:16:28.968380+00:00 | false | pending |
✅ FORENSE entregado y anclado: 📄 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?