---
id: "55"
title: "Roadmap de prereqs — issues de osint_graph que odr_console necesita antes/durante MVP"
status: deferred
type: epic
domain:
  - osint
scope: cross-stack
priority: alta
depends: []
blocks: []
related:
  - "53"
  - "54"
created: 2026-05-09
updated: 2026-05-17
tags: []
---

## Objetivo

Documentar el orden de dependencias entre las issues de `graph_explorer` y los issues `0065` (extract jobs) + `0066` (odr_console MVP) para que ambas apps compartan infra (jobs system, runtime Python embebido, CDP browser, profiles, sessions) sin reescribir codigo. **Este issue NO implementa nada** — es el meta-plan que ordena en que orden se atacan las dependencias previas.

## Contexto

`odr_console` es la segunda app C++ ImGui que necesita el mismo stack de recoleccion de datos que `graph_explorer`:

- Workers concurrentes con subprocess + wire protocol stdin/stderr/stdout (jobs system, issue 0026 ya completado).
- Python embebido portable (sin WSL) — issue 0033 pendiente.
- Browser CDP con profiles + cookies — issues 0038/0039/0040 pendientes.
- Compile skill que empaqueta runtime + vendored deps — issues 0033c/d/e pendientes.

Sin este orden:
- `odr_console` arranca con dependencia WSL y se rompe en Windows nativo.
- Los collectors browser-driven no funcionan hasta tener CDP.
- Cada app duplicaria infra de jobs/cache/subprocess.

## Arquitectura

### Capas afectadas

| Capa | Estado actual | Que falta para odr |
|---|---|---|
| Registry C++ (`cpp/functions/`) | tiene `tokens`, `app_settings`, `app_about`, `logger`, `panel_menu`, etc. en `fn_framework` | añadir `jobs_pool`, `subprocess_worker`, `job_cache_sha256`, `worker_manifest_loader` (issue 0065) |
| Registry Python (`python/functions/`) | tiene `fetch_webpage`, `web_search`, `extract_*`, `html_to_markdown`, `normalize_url` | reusar tal cual; vendor en collectors `_vendored/` |
| Runtime Python embebido | NO existe (graph_explorer usa WSL) | issue 0033 — runtime portable Linux+Windows |
| CDP browser control | NO existe | issues 0038/0039/0040 — `cdp-cli` Go binario + profiles + sessions |
| Compile skill | builds `.exe` Windows + DLLs + assets | issue 0033e — empaqueta runtime + vendored + go binaries |

### Mapeo issues prereq → componente odr

| Issue graph_explorer | Componente odr afectado | Bloqueo? |
|---|---|---|
| 0033 (multilang + Python embebido) | runtime portable, sin WSL | **bloquea release Windows** |
| 0033c (fn check vendored) | audit drift `_vendored/` ↔ registry | nice-to-have |
| 0033d (indexer python_runtime fields) | `app.md` declara python_runtime | bloquea 0033e |
| 0033e (compile skill orquesta) | distribuible self-contained | **bloquea release Windows** |
| 0034 (port enrichers a Go) | acelera arranque de collectors | opcional |
| 0038 (browser launch CDP) | collectors `browser_capture_dom`, `browser_login_capture` | bloquea browser collectors |
| 0039 (cookie session manager) | collectors con auth | bloquea OSINT-style scraping |
| 0040 (multi-profile management) | collectors paralelos por profile | bloquea multi-fuente |
| 0029 (enrichers via CDP) | template para `fetch_webpage_browser` collector | nice-to-have |
| 0030 (deep enrich macro) | patron para pipeline builder DAG | referencia, no bloquea |
| 0021 (command palette Ctrl+K) | UX del launcher panel | nice-to-have |
| 0014 (browser extension) | ingest desde browser → odr collectors | post-MVP |
| 0012 (HTTP ingest endpoint) | endpoint compartido entre apps | post-MVP |
| 0017 (gx CLI) | `odr` CLI espejo | post-MVP |

## Tareas

### Fase 1 — Bloqueantes para MVP odr (orden estricto)

- **1.1** Issue **0065** (extract jobs system to registry). Bloquea 0066. Refactor seguro: graph_explorer sigue funcionando.
- **1.2** Issue **0033d** (indexer lee `python_runtime` fields). Pequeño, sin deps. Habilita 0033e.
- **1.3** Issue **0033** (multilang dispatcher + Python embebido). Critico para Windows nativo. Sin esto, odr depende de WSL igual que graph_explorer hoy.
- **1.4** Issue **0033e** (compile skill orquesta freeze + vendor + go builds). Permite que `/compile odr_console` produzca zip self-contained con runtime + collectors vendored.

### Fase 2 — MVP odr_console

- **2.1** Issue **0066** (odr_console MVP). Esqueleto + 1 collector `api_hn_top` end-to-end. Reusa 0065. NO depende de browser CDP (collector inicial es API JSON pura).
- **2.2** Verificar build Windows + WSL. Compile skill copia exe + Python runtime + collectors a `Desktop/apps/odr_console/`.

### Fase 3 — Browser-driven collectors

- **3.1** Issue **0038** (browser launch + CDP control). graph_explorer lo necesita igual. odr lo consume por subprocess `cdp-cli` igual que graph_explorer.
- **3.2** Issue **0039** (cookie session manager). Permite collectors con auth.
- **3.3** Issue **0040** (multi-profile management). Permite N collectors en paralelo con profiles distintos.
- **3.4** Crear collectors odr basados en CDP: `browser_capture_dom`, `browser_login_capture`, `browser_scroll_paginated` (issue futura).

### Fase 4 — Calidad y UX (post-MVP)

- **4.1** Issue **0033c** (fn check vendored). CI gate para drift detection.
- **4.2** Issue **0034** (port enrichers a Go). Reduce dependencia Python opcional.
- **4.3** Issue **0029** (enrichers via CDP — `fetch_webpage_browser`, `fetch_screenshot`). Templates aplicables como collectors.
- **4.4** Issue **0021** (command palette Ctrl+K). UX comun a las dos apps; extraer al registry.
- **4.5** Issue **0030** (deep enrich macro). Patron para pipeline builder DAG en odr.

### Fase 5 — Integraciones cross-app (largo plazo)

- **5.1** Issue **0012** (HTTP ingest endpoint local). Compartido por ambas apps.
- **5.2** Issue **0017** (gx CLI). Crear `odr` CLI espejo o unificar bajo `gx` con subcomando.
- **5.3** Issue **0014** (browser extension). Ingest desde browser apunta a 0012; ambas apps consumen.

## Ejemplo de uso

Roadmap visual del orden:

```
[1.1 0065 extract jobs]            ──┐
[1.2 0033d indexer fields]         ──┤── prereqs MVP odr
[1.3 0033 multilang + python emb]  ──┤   (sin estos, odr no compila distribuible)
[1.4 0033e compile orquesta]       ──┘
                ↓
[2.1 0066 odr MVP]                 ── MVP funcional con collector API
[2.2 verify Windows+WSL]
                ↓
[3.1 0038 browser CDP]             ──┐
[3.2 0039 cookie manager]          ──┤── browser-driven collectors
[3.3 0040 multi-profile]           ──┤
[3.4 collectors browser]           ──┘
                ↓
[4.x calidad: vendored audit, go ports, command palette, deep enrich]
                ↓
[5.x cross-app: HTTP endpoint, CLI unificado, extension]
```

Bloqueo critico para "release Windows funcional": **1.1 → 1.2 → 1.3 → 1.4 → 2.1**.

## Decisiones de diseño

1. **Por que reordenar en lugar de bifurcar**: si odr clona jobs.cpp, divergira de graph_explorer en semanas. El registry-first justifica el coste de 0065 antes que 0066.

2. **Por que 0033 es critico antes que MVP**: graph_explorer hoy depende de WSL para correr enrichers en Windows. Si odr arranca igual, **dos apps con la misma deuda**. Mejor pagar 0033 una vez para ambas.

3. **Por que browser CDP no bloquea MVP**: el collector inicial `api_hn_top` es API JSON pura. Browser collectors son fase 3, una vez probado el flujo. Asi MVP llega a Windows en dias, no semanas.

4. **Por que NO portar enrichers a Go (0034) antes**: optimizacion prematura. Python embebido (0033) ya da portabilidad. Go solo si la latencia molesta.

5. **Por que command palette no es prereq**: UX nice-to-have. MVP launcher con search FTS5 + lista basta. 0021 se extrae al registry cuando ambas apps lo necesiten.

## Prerequisitos

- Issue 0026 (jobs system base) — completado.
- Issue 0033b (vendor python functions) — completado.
- `cpp/PATTERNS.md` y `cpp/DESIGN_SYSTEM.md` — ya autoritativas.
- Regla `apps_tbd.md` — sub-repos Gitea + branch master + TBD activo.

## Riesgos

| Riesgo | Mitigacion |
|---|---|
| Issue 0033 (Python embebido) es grande, retrasa MVP odr semanas | Hacer 0066 con `python3` del sistema primero, migrar a embebido al cerrar 0033. Coste: dos releases — Linux/WSL primero, Windows nativo despues. |
| Refactor 0065 rompe graph_explorer | TBD obligatorio en sub-repo de graph_explorer + tests pasando antes de mergear (32 WSL + 21 Win). |
| Browser CDP (0038) se enreda con perfiles existentes del usuario | Issue 0040 establece profiles propios bajo `<app>/local_files/browser_profiles/<name>/`, no toca los del sistema. |
| Compile skill (0033e) explota build matrix Linux+Windows+freeze+vendor | Trabajo incremental: primero `python_runtime: false` sigue funcionando como hoy; cuando 0033e este, opt-in. |
| Drift entre `_vendored/` de graph_explorer y collectors de odr | 0033c (fn check vendored) gate en CI antes de mergear cambios en `python/functions/`. |

## Out of scope

- Implementar ninguno de los issues referenciados — este meta-plan solo ordena.
- Decidir si `gx` y `odr` se unifican bajo un CLI comun (ver fase 5).
- Diseño detallado del pipeline builder DAG de odr (ver issue 0066).
