feat(episode): TRAZA_qu-estaba-roto-de-verdad_S20260902.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: troubleshooting
Summary: EPISODIO 1 — MEMORIA: Qué estaba roto de verdad
This commit is contained in:
Ember 2026-09-06 20:23:07 +00:00
parent b495fd8590
commit bf12615c05

View file

@ -0,0 +1,47 @@
---
episode_id: "3c20643a-9814-4f18-a3c7-b406bad1d3ab"
puente_flat: "TRAZA_qu-estaba-roto-de-verdad_S20260902.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260902.SID80EF6E909F98"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 1 — MEMORIA: Qué estaba roto de verdad"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-09-06T20:23:05.516460+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
Portón arreglado, y con él cae el último pendiente que quedaba abierto.
## Qué estaba roto de verdad
Tres meses diciendo «el hook dispara pero no inyecta», sin causa. Lo cerré con tres mediciones, cada una descartando una hipótesis:
| # | Medición | Qué descarta |
|---|---|---|
| 1 | El hook **sí dispara** — su propio registro lo prueba | Que no se ejecutara |
| 2 | El `sha256` del fichero de secretos **coincide** con el que el servidor espera (`8b66117cc5ff12d6…`) | Que la frase estuviera caducada |
| 3 | El transcripto registra los argumentos enviados: llegaron **11 caracteres**, no 88 | Todo lo demás |
**El arnés descarta la sustitución de argumentos para herramientas MCP.** Lo probé con `updatedInput` en la ruta anidada **y** en la raíz: ninguna se aplica. El hook hacía bien su parte.
La medición 2 merece un apunte: comparar huellas permite **verificar un secreto sin conocerlo**, y descartó la hipótesis más cara sin gastar ninguno de los tres intentos. Sin ella habría quemado el cupo probando a ciegas.
Y el vicio de fondo, otra vez el mismo: el registro del hook decía `INJECTED`, que era una afirmación sobre **su propia intención**, no sobre el efecto. Ahora anota `recibido_len=11 | emitido_len=88` — cifras contrastables contra el transcripto.
## La vía que sí funciona
`ember-memory` habla **HTTP**, no por tubería local: es un proceso de larga vida al que se le puede hablar directamente, sin pasar por el arnés. Como el candado vive en la memoria de ese proceso, abrirlo ahí lo abre también para mi cliente.
La frase va **fichero → proceso local → red**. Nunca entra en mi contexto ni en ningún registro. Y conserva la frontera que buscaba tu diseño: sin el fichero de secretos local, el script no abre nada.
Quedaba **un** intento, así que el modo por defecto solo **comprueba** (`ember_auth_status` no consume intentos). Esa cautela cazó un fallo mío antes del último cartucho: las notificaciones del protocolo responden con cuerpo vacío y mi lector exigía JSON siempre.
**Verificado, no declarado:** `unlocked: True`, 11h 59m, intentos fallidos a 0 — y confirmado además desde mi propio cliente, que es lo que realmente importaba.
Con el portón abierto escribí por fin las **dos memorias curadas en Qdrant** (`6dacd336…` y `37a9e0bf…`, ambas con `trust_tier: verified`). Eso cierra M-001.