feat(episode): TRAZA_r38seccion1i1-la-causa-raz-era-ma-y-expl_S20260902.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: troubleshooting
Summary: EPISODIO 1 — ember-mcp: [R38.seccion1.I1] La causa raíz era mía, y explica los d
This commit is contained in:
Ember 2026-09-06 16:53:13 +00:00
parent 97b61752d4
commit 607aa32676

View file

@ -0,0 +1,44 @@
---
episode_id: "a49987c5-34de-45d1-8fcb-ae384f498722"
puente_flat: "TRAZA_r38seccion1i1-la-causa-raz-era-ma-y-expl_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 — ember-mcp: [R38.seccion1.I1] La causa raíz era mía, y explica los dos i"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-09-06T16:52:59.443405+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
Todo limpio: canario retirado, `ember-mcp` sano con `939e0`, y el oráculo final da **`HTTP 200 · DIMS=3072`**.
## [R38.seccion1.I1] La causa raíz era mía, y explica los dos incidentes
Mi código de escritura hacía esto:
Python evalúa `open(p,'w')` **primero**, y abrir en modo escritura **vacía el fichero**. Así que el `.read()` que viene después leía un fichero ya vacío, la sustitución se aplicaba sobre la nada, y se escribía la nada. **El fichero de configuración quedaba en cero bytes** — no solo perdía la clave nueva: borraba todas las variables.
Reproducido en local, no deducido:
Con eso, cada síntoma de los dos incidentes queda explicado sin residuo: `ember-mcp` caía a la clave grabada en su imagen porque **no tenía fichero**; `litellm` no arrancaba porque se quedaba **sin ninguna variable**; el `000` era «nadie escucha», no «clave rechazada»; y la restauración funcionaba porque los respaldos estaban íntegros.
**Y cierra la corrección que te debía:** el 3 de septiembre te dije que habías pegado una clave muerta. Era falso. Fue este bug, las dos veces. Tú pegaste `sk-or-v1-7946b6b` — que es exactamente `fusionkey`, la correcta.
## [R38.seccion2.I2] El arreglo, y por qué son tres cambios
**Leer primero, escribir después** — sin efectos colaterales en el orden de evaluación. **Verificar que la sustitución ocurrió** — `re.sub` no falla cuando no encuentra el patrón, simplemente no sustituye, y ese silencio habría dejado el fichero sin la clave mientras el script anunciaba «actualizado». **Escritura atómica** — el fichero nunca existe a medias, ni aunque el proceso muera en mitad.
Verificado con oráculo externo: **117 bytes, todas las variables conservadas, clave nueva dentro, vieja fuera**. El test del guardián sigue **6/6**.
## [R38.seccion3.T1] Dos hallazgos colaterales que debes conocer
| Hallazgo | Estado |
|---|---|
| La imagen `ember-mcp-with-neo4j-asyncpg:latest` lleva **grabada** `sk-or-v1-6ea2` | Clave muerta, pero es un respaldo silencioso que enmascaró el fallo dos veces |
| El fichero de composición de `ember-mcp` tiene un **token de Forgejo en texto plano** | Credencial viva; mi filtro de secretos no lo cubrió y se imprimió en tu terminal |