ember-memory-test/episodes/TRAZA_lo-que-qued-arreglado_S20260726.R4_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD.md
Ember 4de4868308 feat(episode): TRAZA_lo-que-qued-arreglado_S20260726.R4_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD
Skill: NONE | Type: troubleshooting
Summary: EPISODIO 4 — MNEMO_PRE_DIGEST: Lo que quedó arreglado
2026-07-27 03:10:08 +00:00

3 KiB

episode_id puente_flat session_code acto_dialogico actor_flujo criticidad_aegis skill_dominante fase_proyecto tipo_semantico summary_one_line source_type trust_boundary created_at relectura_tagged forgejo_commit_sha
3e37dd13-605e-4bd3-b20b-9d83e9c26152 TRAZA_lo-que-qued-arreglado_S20260726.R4_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD S20260726.ARCO_CICLO4_AUTOMEJORA informar multi_actor low NONE operations troubleshooting EPISODIO 4 — MNEMO_PRE_DIGEST: Lo que quedó arreglado claude_code internal 2026-07-27T03:09:47.430880+00:00 false pending

Cerrado y verde, con el control positivo que lo hace creíble.

Lo que quedó arreglado

check_override_flag() ahora valida de quién es el permiso antes de concederlo. La comprobación va deliberadamente antes del reuso-por-ráfaga y antes de gastar el slot, así que un flag ajeno ni se reusa ni se consume — y tampoco se borra, porque pertenece a otra instancia y borrarlo sería sabotearle un trabajo que tú autorizaste.

La política, que es lo que decide el comportamiento real:

  • Flag sin created_by → se acepta. Retrocompatibilidad: los flags legacy siguen funcionando, nadie se queda a medias.
  • Flag del dueño → override normal. Compara tanto el session_code completo (S20260726.MI_TAG) como el tag suelto, sin distinguir mayúsculas.
  • Flag de otra instancia → rechazado con not owner, sin tocar el archivo.
  • Identidad no resoluble o vacía → se acepta (fail-open). Un fix de seguridad no debe volver el guardián más frágil de lo que era: si session_state se cae, el guard se comporta como antes en vez de bloquearte a ciegas.

La evidencia

  • test_ley_zero_override_owner.py — 13 tests, 30 PASS / 0 FAIL. Aísla DATA_DIR en un tmpdir, así que nunca toca el flag real de nadie.
  • Suite existente del guard: 36 PASS / 0 FAIL — cero regresión.
  • Control positivo: revertí _flag_owner_matches en memoria a la versión pre-fix y volví a correr el test del flag ajeno → 3 FAIL (override ACTIVE (1/5 edits used), edits_done=1). El test caza la regresión; no es decorativo. Esto era obligatorio: un test que no puede fallar no es evidencia de nada.
  • E2E del hook: docs/CUALQUIERA.mdallow · CLAUDE.mddeny · rm -rf .claude/deny. Sigue haciendo su trabajo.

Corrijo una cosa que te dije

Te dije que otra instancia se comió mi slot, marcándolo como inferencia. Leyendo la función completa encontré una causa más probable para mi bloqueo concreto: existe un debounce de ráfaga de 8 segundos (añadido en S20260704, porque el harness invoca el hook varias veces por una sola tool call). Mi ALLOW y mi BLOCK estaban a 14 segundos — fuera de esa ventana. Con 113 registros de hooks, la ráfaga se estira más de 8s y la segunda invocación encuentra el slot ya gastado. Es decir: probablemente me lo comí yo mismo, no un tercero.