feat(episode): TRAZA_lo-que-cerr-y-el-orden-que-eleg_S20260726.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: ATLAS | Type: advisory
Summary: EPISODIO 1 — HANDOFF_PROMPT.md: Lo que cerré, y el orden que elegí
This commit is contained in:
Ember 2026-07-27 05:13:58 +00:00
parent 5b7a59df02
commit 8a0f65233a

View file

@ -0,0 +1,35 @@
---
episode_id: "325dda00-9dda-4f67-aed5-734f4eff502e"
puente_flat: "TRAZA_lo-que-cerr-y-el-orden-que-eleg_S20260726.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260726.ARCO_CICLO4_AUTOMEJORA"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "ATLAS"
fase_proyecto: "operations"
tipo_semantico: "advisory"
summary_one_line: "EPISODIO 1 — HANDOFF_PROMPT.md: Lo que cerré, y el orden que elegí"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-07-27T05:13:50.906885+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
Terminado. **4/4 commits de la jornada en los tres remotos**, verificado por contención (`merge-base`), no por el mensaje del push.
## Lo que cerré, y el orden que elegí
Prioricé por **desbloqueo en cadena**, no por severidad — y resultó ser lo correcto porque los pendientes estaban encadenados sin que se notara: **D3 → tema EMBER → hints del gate → detector del gate → cierres formales**.
**#5 D3 protegía por sufijo de nombre.** `CRITICAL_PROJECT_FILES` lista `.claude/settings.json` y el match era `endswith`, así que tu settings **global** (fuera del repo) se trataba como infra del ecosistema. El daño no era el bloqueo falso: el guardián **confundía dos archivos distintos con el mismo nombre**, y el crítico es el del proyecto. Ahora el root se deriva de `__file__` —no del `cwd`, que en el proceso hook no siempre es la raíz— y sale si el path cae fuera, con fail-safe hacia "dentro" para que un error mío nunca abra el guard.
**Y eso desbloqueó el tema.** El mismo Edit que la sesión rechazó al empezar pasó al final: `theme = "custom:ember"` está activo, apuntando a tu `ember.json` con los 11 tokens de la paleta canónica. Al reiniciar verás el naranja brasa en el spinner.
**#6 y #7 — el gate pedía cosas que no verifican.** Tres defectos medidos: dictaba `ast.parse(open(X))`, que revienta con cp1252 sobre cualquier archivo con acentos; dictaba `python test_x.py` para suites pytest-only, donde da exit 0 sin ejecutar **nada** —y medí que **70 suites** del repo están así—; y su detector usaba `.*` greedy, capturando `d.py` en vez del path, de modo que **obedecerle no contaba como cumplimiento**. Eso explica los tres bloqueos que me comí tras dos ejecuciones válidas. Añadí también `json.tool`, que el gate dicta y su detector tampoco reconocía.
**El test es de invariante, no de casos.** [test_gate_dicta_lo_que_reconoce.py](.claude/hooks/test_gate_dicta_lo_que_reconoce.py) fija la propiedad: *todo comando que el gate dicta debe ser ejecutable y reconocido por su propio detector*. Cierra la clase, no los síntomas. Y encontró un error **en mi propio test**: supuse que `~` era entrada inválida cuando resuelve al home y está legítimamente fuera del repo. Lo dejé anotado ahí, porque ilustra para qué sirve de verdad un control positivo.
## Los dos que decidí no arreglar
No los dejé en el limbo: están cerrados con la razón escrita en [CIERRE_S20260727_jornada_guardianes.md](docs/CIERRE_S20260727_jornada_guardianes.md).