feat(episode): TRAZA_r36seccion1t1-el-fix-fase-por-fase-proto_S20260612.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: NONE | Type: troubleshooting
Summary: EPISODIO 1 — BLINDADAS: [R36.seccion1.T1] El fix, fase por fase (protocolo compl
This commit is contained in:
Ember 2026-06-12 19:43:50 +00:00
parent 18089e1387
commit 880a2a63e4

View file

@ -0,0 +1,38 @@
---
episode_id: "102d2f78-ee3b-4087-afe9-92edab47e28d"
puente_flat: "TRAZA_r36seccion1t1-el-fix-fase-por-fase-proto_S20260612.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260612.PIPELINE_FIXES"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "NONE"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 1 — BLINDADAS: [R36.seccion1.T1] El fix, fase por fase (protocolo completo)"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-06-12T19:43:38.734488+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
**Bug TOCTOU CERRADO end-to-end según la spec del chip.** Commit `7a061b8` en los 3 remotos.
## [R36.seccion1.T1] El fix, fase por fase (protocolo completo)
| Fase | Resultado |
|---|---|
| 🧪 TEST_PRE (repro sandbox) | 🐛 BUG_CONFIRMED: encolar 2 → pushear 1 → `clear_all_pending()` → **borró 2, sobrevivieron 0, archivo NO** (la mecánica exacta del incidente "Cleared 23 con 8") |
| 🔧 Fix (4 micro-mecanismos ≤40 líneas) | `_payload_fingerprint` (blc_hash o sha256 — misma huella para las 2 formas state/manifiesto, probado con **Hypothesis**) · `archive_payloads` (write-ahead JSONL en `data/archive/pending_cleared_*.jsonl` — **ya nada se borra sin copia**) · `clear_pushed_payloads(pushed_hashes)` selectivo **a nivel payload** · `clear_manifest_payloads()` flujo seguro: limpia EXACTAMENTE lo que el manifiesto leído contenía |
| 📋 Instrucción de boot | actualizada en `generate_push_instructions`: desde el próximo boot, toda instancia recibe el snippet seguro (`clear_manifest_payloads`) — **lo encolado durante el push sobrevive** |
| 🧪 TEST_POST | regresión nueva **5/5** + suite hooks completa **2,016 passed**; las 2 "fallas" eran contaminación de mi propio flag de override (retirado → **2 passed**, re-verificado) → efectivo 2,018/2,018 verde |
| 📦 Entrega | [memory_loop.py](.claude/hooks/lib/memory_loop.py) + [test_memory_loop_toctou.py](.claude/hooks/test_memory_loop_toctou.py), CONTRACT actualizado (CU-2), push 3/3 |
**Causa raíz en una frase:** el clear era todo-o-nada a nivel archivo mientras los Stop hooks encolaban en paralelo — ahora la limpieza es por huella criptográfica de lo efectivamente pusheado, con archivo de seguridad previo.
**Nota operativa:** el sistema dice que el chip `task_d256993b` ya fue iniciado por vos — si te abrió una sesión worktree aparte para este fix, **podés cerrarla**: el trabajo ya quedó hecho y respaldado acá (evitás duplicarlo).
## 📌 PILA-PENDIENTES (R36)
✅ **B-TOCTOU-CLEAR** [R36, hard_fact] CERRADO: fix + archive + 5/5 + suite verde + 7a061b8 ×3
🟢 **GATE-MEDICION-GRAFOS** [agendado] 2026-06-26 N≥30 (M1-M5)
🟡 **sonda acato lote 3** [heredada] · ⚪ **D-9 LiteLLM master key** [heredada, runbook listo]