--- episode_id: "889d7618-b685-4ffc-9479-58726b874199" puente_flat: "TRAZA_para-john-r12_S20260618.R7_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD" session_code: "S20260618.VERIFY_FIRST_PASSPORT_FIX" acto_dialogico: "informar" actor_flujo: "multi_actor" criticidad_aegis: "low" skill_dominante: "NONE" fase_proyecto: "operations" tipo_semantico: "troubleshooting" summary_one_line: "EPISODIO 7 — MNEMO_PRE_DIGEST: 📍 PARA JOHN — R12" source_type: "claude_code" trust_boundary: "internal" created_at: "2026-06-18T22:41:11.772091+00:00" relectura_tagged: false forgejo_commit_sha: "pending" --- - **CONTRATO I/O:** entrada = batch post-F3/F5 con `qdrant_status`/`neo4j_status` por episodio → salida = `episode_sync_status` refleja inline-writes; postcondición: con dispatcher `--only nextcloud forgejo`, toda fila llega a `completed` ≤2h. Errores: UPDATE sobre fila aún no creada → upsert/retry. - **DESCOMPOSICIÓN:** (a) UPDATE states en crisol F5 (~5 líneas, patrón "guard + UPDATE"); (b) cambiar `--only` (en `outbox_service.sh` o el override del unit); (c) backfill SQL idempotente. - **VERIFICACIÓN:** smoke episode → assert `qdrant_state=neo4j_state=success` post-crisol + `episode_outbox.status='completed'` tras un ciclo. Rollback: `git checkout crisol_run.py` + restaurar `--only` + el backfill es aditivo (no destructivo). — ### 📍 PARA JOHN — R12 - **Hice:** confirmé tu razonamiento con la tabla de estado (165 filas, único blocker `qdrant_state=pending`; `neo4j_state=success` prueba el doble-write). Diseñé el fix combinado. - **Falta:** tu GO para ejecutarlo (toca crisol.py + systemd + backfill → RELOJERO con backup y test). - **Mi consejo:** **GO a A.** Es el fix correcto y mínimo: crisol marca Qdrant+Neo4j, poda los 2 workers, backfill de las 165. Pero la regla de oro aquí — **las 2 mitades van juntas en el mismo cambio** (podar sin marcar = peor). Lo hago con backup triple + test smoke antes de declarar éxito. - **Para avanzar, elige:** - 🟢 **A** *(recomendado)* — GO: ejecuto el fix combinado RELOJERO (backup → crisol marca states → `--only nextcloud forgejo` → backfill 165 → verifico smoke) - 🟡 **B** — primero te muestro el diff exacto de crisol.py + el SQL, lo apruebas, y luego aplico - ⚪ **C** — lo dejamos documentado y lo ejecutas/agendas tú 📌 **PILA-PENDIENTES (R12)** - 🔴 CRITICAL — Fix combinado: crisol marca `qdrant_state`+`neo4j_state` + dispatcher `--only nextcloud forgejo` + backfill 165 [hard_fact, tabla de estado verificada] - 🟠 HIGH — Sin SLO/alerta cross-store (capa C2, tras el fix) [diseño entregado] - 🟡 MEDIUM — Corregir reporte §7 (claim "dispatcher muerto" erróneo) [DLC-2] - 🟡 MEDIUM — BLINDADA-29: 4 archivos sin commit → backup triple-remoto + MNEMO_PRE_DIGEST en el diseño (B14) - ❓ PREGUNTA-JOHN — Q-001 ¿A/B/C? · Q-002 ¿SLO 2h? · Q-003 ¿Forgejo+Nextcloud respaldo o primera-clase? - ✅ RESUELTAS — single-writer-por-store confirmado con datos · fix combinado diseñado · doble-write Neo4j probado