feat(episode): TRAZA_el-susto-del-11-lneas-aclarado_S20260727.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: troubleshooting
Summary: EPISODIO 1 — ember_experience: El susto del `+11 líneas`, aclarado
This commit is contained in:
Ember 2026-07-28 01:40:38 +00:00
parent c5739e8cd8
commit cd0184f6f7

View file

@ -0,0 +1,54 @@
---
episode_id: "0160e7bc-d896-469f-a54e-8a89c32d7416"
puente_flat: "TRAZA_el-susto-del-11-lneas-aclarado_S20260727.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260727.ARCO_CICLO10_ESPEJOS"
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_experience: El susto del `+11 líneas`, aclarado"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-07-28T01:40:34.082801+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
Sí, **quedó bien cambiada.** Las cinco verificaciones pasan:
| # | Verificación | Resultado |
|---|---|---|
| 1 | JSON válido | ✅ `grupos: 18 \| hooks: 113` — **idénticos** a antes, no rompiste nada |
| 2 | Matcher del memory-guard | ✅ `mcp__.*__(store_memory\|delete_memory\|update_memory_payload)` |
| 3 | Línea 154 en disco | ✅ exacta |
| 4 | Borrar `ember_album` | ✅ **deny** |
| 5 | Borrar `ember_experience` | ✅ **allow** (el mantenimiento diario sigue intacto) |
La indentación quedó con más espacios que el resto. **Es irrelevante**: en JSON los espacios no significan nada y el parser confirma que el archivo es válido.
## El susto del `+11 líneas`, aclarado
El diff mostraba once líneas nuevas, no una. Lo investigué antes de opinar, y **no fue culpa tuya**:
| | grupos | hooks | `atalaya-cuarentena` |
|---|---|---|---|
| **HEAD** (lo que git tenía guardado) | 17 | 112 | 0 |
| **Disco** (hoy) | 18 | 113 | 1 |
Mi medición de *antes* de tu edición ya daba 18 | 113. O sea: ese bloque llevaba en tu disco desde el **20 de julio**, activo pero nunca commiteado. Los dos tabuladores sueltos vienen de ahí. Lo dejé tal cual —`settings.json` es D3 y el JSON es válido— pero lo declaré explícitamente en el mensaje del commit en vez de esconderlo bajo una etiqueta que dijera "P0".
**Commit `d2f5f8c5`** — con los tres cambios nombrados (tu matcher, el bloque viejo de atalaya, y la baseline de secretos que se reescribió sola). Verifiqué la baseline por identidad y no por confianza: **84 secretos antes, 84 después, 0 nuevos, 0 desaparecidos** — solo corrieron los números de línea.
`★ Insight ─────────────────────────────────────`
**La garantía invertida que acabas de cerrar.** Borrar `ember_album` se denegaba *solo cuando Casbin estaba caído* — la lista negra que conoce `delete_memory` vive en las ramas de emergencia, y ninguna política la nombra en el camino sano. La protección de la memoria fundacional dependía de que el sistema de guardias estuviera **averiado**. Ya no.
`─────────────────────────────────────────────────`
## Lo siguiente ya está listo para tu mano: **P1**
Encontré que `pre-tool-dos-vias-guard.py` existe, está commiteado, **11/11 tests verdes**, deniega el caso prohibido y permite el legítimo… y **no está registrado**. Es un sensor sin consumidor: la clase exacta que este arco identificó como *"no es guardrail, es un log"*.
Te preparé el runbook con el detalle que pediste: → [RUNBOOK_P1_DOS_VIAS_GUARD_S20260727.md](docs/RUNBOOK_P1_DOS_VIAS_GUARD_S20260727.md)
Tres cosas que hice distinto esta vez: