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:
parent
97b61752d4
commit
607aa32676
1 changed files with 44 additions and 0 deletions
|
|
@ -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 |
|
||||||
Loading…
Reference in a new issue