feat(episode): TRAZA_listo-john-posta-del-grafo-entregada-doc_S20260602.R23_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD
Skill: COMPASS | Type: chronicle Summary: EPISODIO 23 — BLINDADAS: Listo, John. **POSTA del grafo entregada:** [`docs/POST
This commit is contained in:
parent
a23f7b7c4c
commit
e539f2fce1
3 changed files with 137 additions and 0 deletions
|
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
episode_id: "ad5e02f6-5701-49be-9415-b0b296363738"
|
||||
puente_flat: "TRAZA_code-modernizer-migracin-legacymoderno_S20260601.R52_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
|
||||
session_code: "S20260601.AGENTES_NATIVOS_ACTIVACION"
|
||||
acto_dialogico: "informar"
|
||||
actor_flujo: "multi_actor"
|
||||
criticidad_aegis: "low"
|
||||
skill_dominante: "NONE"
|
||||
fase_proyecto: "operations"
|
||||
tipo_semantico: "chronicle"
|
||||
summary_one_line: "EPISODIO 52 — John: - **`code-modernizer` (migración legacy→moderno):** + tests "
|
||||
source_type: "claude_code"
|
||||
trust_boundary: "internal"
|
||||
created_at: "2026-06-06T15:04:05.269298+00:00"
|
||||
relectura_tagged: false
|
||||
forgejo_commit_sha: "pending"
|
||||
---
|
||||
|
||||
- **`code-modernizer` (migración legacy→moderno):** + tests de equivalencia de comportamiento + extracción de reglas de negocio. Se parece a `code-modernization:*` nativo, **pero** encadenado al pipeline EMBER. Honestidad (PROCEDENCIA): explorer y modernizer *sí* solapan funcional con nativos — su valor agregado es la **gobernanza/telemetría EMBER**. El critic es el más irreemplazable. **Bonus:** los 3 reales tienen **rigor v0.2.0 superior** a los 16 que escribí hoy (Casbin + telemetría pre/post + matriz de escalación + rollback granular). Mi POC `code-explorer.md` quedó *más pobre* que el `skills/` real. ## ⚖️ [R3.§3] La decisión, ahora con datos reales
|
||||
|
||||
**Mi recomendación corregida:** el roster verdadero de 19 = los que ya construiste = **incluye los 3**. Los adopto como nativos (modernizer + critic me faltan; el explorer lo **regenero** desde la versión rica de `skills/`, no desde mi POC pobre). Quedan **dos hilos** que sí son tu decisión:
|
||||
|
||||
1. **`validator / optimizer / deployer`** (la cadena del plan que nunca se construyó): ¿los fabricamos *también* (roster de 22, cadena de merge/deploy completa — mis 16 ya los referencian como handoff), o los dejamos como deuda futura? 2. **Drift documental:** el doc `SPRINT_C_..._S20260521.md` muestra el roster viejo. Conviene anotarlo (DLC) para que ninguna instancia futura vuelva a confundirse como me pasó a mí. **La pregunta esencial, en una frase:**
|
||||
> Confirmo: **adopto los 3 reales como nativos** (con su rigor v0.2.0). Y sobre el plan-fantasma → **¿(A) sólo los 3 reales [19 limpio], (B) los 3 reales + también validator/optimizer/deployer [22, cadena completa], o (C) tú me dices otra cosa?**
|
||||
|
||||
Dame A/B/C y, ya sea cual sea, dejo los nativos listos en este turno (verde, gasolina de sobra) + anoto el drift del doc.
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
---
|
||||
episode_id: "fa543408-207f-4bfd-bf1d-eb0d0fa29d65"
|
||||
puente_flat: "TRAZA_decisin-arquitectnica-con-datos_S20260602.R24_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
|
||||
session_code: "S20260602.GRAFO_GRAPHIFY_CURADURIA"
|
||||
acto_dialogico: "informar"
|
||||
actor_flujo: "multi_actor"
|
||||
criticidad_aegis: "low"
|
||||
skill_dominante: "AEGIS"
|
||||
fase_proyecto: "operations"
|
||||
tipo_semantico: "troubleshooting"
|
||||
summary_one_line: "EPISODIO 24 — BLINDADAS: Decisión arquitectónica (con datos)"
|
||||
source_type: "claude_code"
|
||||
trust_boundary: "internal"
|
||||
created_at: "2026-06-06T15:04:05.176173+00:00"
|
||||
relectura_tagged: false
|
||||
forgejo_commit_sha: "pending"
|
||||
---
|
||||
|
||||
**🎯 Diagnóstico FINAL — `stop-enricher.py:437-438` SÍ invoca `push_pending_to_server()` (paso 11b "DETERMINISTIC PUSH").**
|
||||
|
||||
La cadena client→server existe completa:
|
||||
1. `stop-enricher.py:435-438` invoca push (cada Stop) ✓
|
||||
2. `push_to_server.py` SCP a `crisol/inbox/` server (vivo, 498 .md ahí hoy) ✓
|
||||
3. `crisol_run.py` server lo procesa (cron horario activo) ✓
|
||||
4. Si éxito → `clear_all_pending()` limpia manifest
|
||||
|
||||
**ENTONCES ¿por qué los 82 payloads NO se drenan?** El except handler `stop-enricher.py:439` captura silenciosamente. Si el push falla, clear NO se ejecuta, manifest crece. Hipótesis runtime ponderadas:
|
||||
|
||||
| H | Hipótesis | Evidencia | Test mínimo | Confidence |
|
||||
|---|---|---|---|---|
|
||||
| **H1** | `TIMEOUT_SSH=300s` insuficiente con lote crecido (82 payloads ≈ 250-410s en crisol_run F0-F6) — repite bug S20260516 ya documentado en `push_to_server.py:75-87` | Lote 82 × 1s SCP + 3s conexión = ~85s; crisol_run × 82 episodios excede 300s | leer 1 entry del log último intento push | **0.65** |
|
||||
| **H2** | Drift de stores: `push_pending_to_server` lee de `session_state.json::pending_qdrant_payloads` pero writer escribe en `pending_memory_push.json` (manifest separado) | `batch_push_to_qdrant.get_pending_payloads()` lee STATE_FILE; el manifest es otro archivo | `diff` los 2 archivos | **0.20** |
|
||||
| **H3** | `push_pending_to_server()` falla por otro motivo (auth, key SSH, permisos, container) silenciado por except L439 | El except amplio L439-... captura todo sin log explícito visible | Grep telemetría push_log | **0.15** |
|
||||
|
||||
★ **Insight ─────────────────────────────────────**
|
||||
H1 es el "déjà vu del bug ya documentado": `push_to_server.py:81-87` literalmente cita *"Bug #15 fix S20260515: 120s→300s; lotes >8 episodios excede 300s → cola NO se limpia → re-push + duplicados"*. El lote actual es **82 episodios**, **10× sobre el umbral** documentado. El fix S20260515 era escalar timeout, pero **el lote sigue creciendo más rápido que el timeout**. Fix real = chunks acotados + clear parcial.
|
||||
**─────────────────────────────────────────────────**
|
||||
|
||||
## Decisión arquitectónica (con datos)
|
||||
|
||||
**Opción A (refinada R41):** modificar `push_to_server.py::push_pending_to_server()` para:
|
||||
1. **Chunk size cap** (max 20 payloads por SCP/SSH batch) → cada chunk <60s timeout SSH.
|
||||
2. **Clear PARCIAL atomic** (limpiar payloads cuyos hashes confirmen `pg_inserted` server-side, no todo-o-nada).
|
||||
3. **Telemetría JSONL explícita** (`push_to_server_attempts.jsonl`) — cada attempt loguea status, no más silencio.
|
||||
4. **Idempotency dedup** por `content_sha256` antes de SCP (evita re-push de los ya procesados).
|
||||
|
||||
Estimación: ~40-60 líneas en `push_to_server.py` (no fabricación nueva, refactor del existente con tests).
|
||||
|
||||
## Tres caminos finales para ti
|
||||
|
||||
1. **Verificar H1 empírico primero** (1 comando SSH: `tail /home/johnember/logs/push_gateway*.log`) → ~3K tokens. Si confirma timeout → fabrico A refinado con seguridad.
|
||||
2. **GO directo Opción A refinada** asumiendo H1 (0.65 confidence + 2 fixes previos en código apuntan a timeout) → ~60K tokens fabricar + tests + deploy.
|
||||
3. **Pausar + revisar mañana** con `FORENSE_L3` ya completo (todo el trabajo preserved).
|
||||
|
||||
**Mi inclinación honesta:** **Camino 1 → Camino 2 si H1 confirma**. Costo total ~65K, cabe holgado. El verificar primero descarta especulación.
|
||||
|
||||
¿Cuál?
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
---
|
||||
episode_id: "7ff86f3f-542f-4a16-8e74-12b976c2f05b"
|
||||
puente_flat: "TRAZA_listo-john-posta-del-grafo-entregada-doc_S20260602.R23_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
|
||||
session_code: "S20260602.GRAFO_GRAPHIFY_CURADURIA"
|
||||
acto_dialogico: "informar"
|
||||
actor_flujo: "multi_actor"
|
||||
criticidad_aegis: "low"
|
||||
skill_dominante: "COMPASS"
|
||||
fase_proyecto: "operations"
|
||||
tipo_semantico: "chronicle"
|
||||
summary_one_line: "EPISODIO 23 — BLINDADAS: Listo, John. **POSTA del grafo entregada:** [`docs/POSTA_GRA"
|
||||
source_type: "claude_code"
|
||||
trust_boundary: "internal"
|
||||
created_at: "2026-06-06T15:04:05.287069+00:00"
|
||||
relectura_tagged: false
|
||||
forgejo_commit_sha: "pending"
|
||||
---
|
||||
|
||||
Listo, John. **POSTA del grafo entregada:** [`docs/POSTA_GRAFO_MEMORIA_S20260602.md`](docs/POSTA_GRAFO_MEMORIA_S20260602.md)
|
||||
|
||||
Aquí tienes el **bloque copy-paste** — pégalo en la instancia que está arreglando COMPASS para que retome el grafo al terminar:
|
||||
|
||||
`[R39.cierre.I1]` **Lo clave que rescata esta POSTA:** el grafo **no quedó perdido** — la curaduría (5 tiers) + el SOTA + el diseño del workflow de 3 olas están todos documentados. La otra instancia solo necesita **ejecutar** las 3 olas → Graphify → A/B. Y la **sinergia** está anotada para que coordine con la cirugía de COMPASS (el Tier 3 alimenta F0).
|
||||
|
||||
Con esto tienes **las dos postas** para coordinar tus dos instancias: la de COMPASS (en el EXODUS) y la del grafo (esta). 🔥
|
||||
|
||||
📁 **BITÁCORA S20260602.GRAFO_GRAPHIFY_CURADURIA.R39**
|
||||
- 🆕 WRITE docs/POSTA_GRAFO_MEMORIA_S20260602.md (relevo grafo + bloque copy-paste autocontenido)
|
||||
|
||||
✅ **Arreglo #1 COMPLETO y verificado** — los 3 casos pasan:
|
||||
|
||||
🧪 TEST_POST: `python -c "3 casos end-to-end"` → C1 skill ✓ · C2 direct ✓ · C3 panel ✓ · query_text+skills+schema 1.1 ✓ · **CRITERIO_EXITO_PASS = True**
|
||||
|
||||
| Caso | Pregunta | route_type | Resultado |
|
||||
|---|---|---|---|
|
||||
| FORJA | "arregla COMPASS" | `skill` | ✓ especialista detectado |
|
||||
| solo always-ON | "hola que tal" | `direct` | ✓ respuesta directa |
|
||||
| 9 skills | "convoca CONCILIO" | `panel` | ✓ panel detectado |
|
||||
|
||||
## Qué quedó funcionando (en plastilina)
|
||||
|
||||
El cuaderno (`compass_routing.jsonl`) ahora graba en cada turno: **la pregunta de John + a qué skill fue + de qué tipo de ruta** (especialista/panel/directo). Antes solo guardaba ruido. **Desde ahora se llena solo, turno a turno** — empezó a juntar los ejemplos del maestro.
|
||||
|
||||
## El bonus que encontró el test (por esto se prueba)
|
||||
|
||||
Al verificar, descubrí un **bug que ya existía en producción**: las últimas **40 de 40** entradas del cuaderno tenían el skill **vacío** y todo marcado "L0". El parser leía el transcript crudo (donde los saltos de línea van "escapados") y los markers nunca matcheaban. Sin ese arreglo, tu idea del maestro→alumno **no habría tenido etiquetas que aprender** — preguntas sin respuesta. Lo arreglé decodificando el texto correctamente. Ahora el cuaderno captura la etiqueta de verdad.
|
||||
|
||||
## Dónde quedamos
|
||||
|
||||
El espía (fase 1 del bucle) **ya está vivo**. Lo que sigue, cuando me digas:
|
||||
- **dejarlo grabar** un tiempo (la ventana — ¿mes, o "hasta cubrir los 70"?),
|
||||
- después: tapar huecos (sintéticos) + el alumno k-NN.
|
||||
|
||||
Quedan **1230 edits sin commitear** (BLINDADA-29). ¿Hago commit del arreglo #1 ahora, o seguimos y commiteamos al cierre?
|
||||
Loading…
Reference in a new issue