feat(episode): TRAZA_r9seccion1i1-veredicto-sobre-el-portn-de_S20260926.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: troubleshooting
Summary: EPISODIO 1 — ember-mcp: [R9.seccion1.I1] Veredicto sobre el portón de ember-mcp:
This commit is contained in:
Ember 2026-09-28 05:22:58 +00:00
parent 8ae23b2dab
commit 73f219359d

View file

@ -0,0 +1,48 @@
---
episode_id: "5dfa3836-0f61-40cb-b77e-d85b3d49c2bf"
puente_flat: "TRAZA_r9seccion1i1-veredicto-sobre-el-portn-de_S20260926.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260926.SID8BFB883A7AA7"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 1 — ember-mcp: [R9.seccion1.I1] Veredicto sobre el portón de ember-mcp: hay"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-09-28T05:22:57.159238+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
## [R9.seccion1.I1] Veredicto sobre el portón de ember-mcp: hay fallo, y lo confirmé yo mismo
**Causa raíz en una frase:** en el servidor, `auth_guard.py` línea 262, la función de estado devuelve la bandera "abierto" tal como está guardada, sin mirar si el plazo venció; la bandera solo se corrige cuando alguien intenta usar una herramienta protegida.
**En palabras llanas:** es como un letrero de "ABIERTO" en la puerta de una tienda que nadie voltea al cerrar. El letrero solo cambia cuando un cliente empuja la puerta y la encuentra con llave. Mientras nadie empuja, todos los que miran el letrero creen que está abierto.
## [R9.seccion2.T1] Lo que verifiqué con mis propios ojos
| Afirmación del agente | Mi comprobación | Resultado |
|---|---|---|
| La función de estado no mira el vencimiento | Leí `auth_guard.py` líneas 250 a 268 en el servidor | **Cierto.** Línea 262: `"server_unlocked": _state["unlocked"]` |
| El guardia de las herramientas sí lo mira | Leí líneas 204 a 224 | **Cierto.** `elapsed = time.time() - _state["unlock_time"]` y `if elapsed > SESSION_TTL` |
| El vigía del servidor se fía de la bandera | Leí `porton_mcp_guard.py` línea 290 | **Cierto.** `if estado.get("unlocked") is True` |
| El sensor de arranque local también | No lo comprobé yo | Lo dice el agente |
| 57 registros con "abierto" y "vencido" a la vez, desde el 10 de septiembre | No lo comprobé yo | Lo dice el agente |
## [R9.seccion3.L1] Tu hipótesis, corregida
- **Acertaste** en que el indicador reporta "abierto" sin comprobar el vencimiento.
- **Matiz:** el vigía no reabre el portón vencido **a propósito**. Según el agente, esa fue una decisión tuya (reabre tras un reinicio, no por vencimiento). El fallo no es que no reabra. El fallo es que **dice "OK" cuando debería decir "vencido"**.
## [R9.seccion4.T2] Arreglo propuesto (no aplicado)
| Pieza | Cambio | Tamaño |
|---|---|---|
| Servidor, `auth_guard.py` | La bandera reportada pasa a ser "abierto **y** con plazo vigente" | 2 líneas |
| Vigía y sensor local (opcional) | Tratar "vencido" como "cerrado", aunque la bandera diga otra cosa | 2 líneas cada uno |
| Prueba nueva | El hecho medido es "una herramienta protegida responde", no "el letrero dice abierto" | Con control que debe salir en rojo sin el parche |
**Dos avisos honestos:**