--- type: RFI asset_id: RFI-XX-IntelliBanks-NavInternaDashboards-v01 version: v01 status: Abierto owner: Victor Heredia sherpa_owner: Jay responsable_implementacion: Alex intellbank: IB-XX-Maestro fecha_creacion: 2026-06-22 fecha_ultima_actualizacion: 2026-06-22 proposito: Solicitar a Alex que la app Intellibanks resuelva los enlaces internos entre dashboards HTML (navegación tablero→tablero) cuando se abren dentro de la app. --- # RFI — Navegación interna entre dashboards en la app Intellibanks **Request for Implementation** **Tripleta:** Owner: Victor Heredia · Sherpa: Jay · Implementa/Ratifica técnico: Alex **Prioridad:** Media-Alta (bloquea usar los dashboards dentro de la app; hay workaround en desktop) **Fecha:** 2026-06-22 --- ## 1. Resumen ejecutivo Los dashboards HTML del ecosistema (Hub de Dashboards, HOY, Frentes, WikiX, ROI Tracker, etc.) se enlazan entre sí para navegar de un tablero a otro. Esa navegación **funciona al abrirlos desde el desktop (Finder/`file://`) pero NO dentro de la app Intellibanks**: cada link interno devuelve **404**. La causa está confirmada: la app sirve cada archivo por un **ID interno opaco**, no por su ruta de carpeta. Un dashboard no tiene forma de conocer el ID de sus "hermanos", así que ningún arreglo del lado del HTML lo resuelve. **Se solicita que la app intercepte los links internos y los traduzca ruta→ID usando su propio mapa de sincronización.** --- ## 2. Comportamiento observado | Contexto de apertura | Navegación entre dashboards | |---|---| | Desktop (Finder, `file://`) | ✅ Funciona — rutas relativas se resuelven en disco | | Cowork (Claude) | ✅ Funciona — usa protocolo `computer://` con raíz portable | | **Dentro de la app Intellibanks** | ❌ **404 Not Found** en cada link interno | --- ## 3. Evidencia técnica **3.1 — La app sirve por ID, no por ruta.** El botón *Compartir* de un dashboard dentro de la app entrega este enlace: ``` file:///a/skill_6a3983e4d14f75.25138277 ``` Es decir, el archivo `BRD-EL-HOY-Dashboard-v01.html` se sirve como `/a/skill_6a3983e4d14f75.25138277`, **sin rastro de su ruta de vault**. **3.2 — Al hacer clic en un link interno, la app va al servidor de nube y no encuentra el archivo:** ``` 404 Not Found The requested URL was not found on this server. Apache/2.4.52 (Ubuntu) Server at genniux.net Port 443 ``` **3.3 — Cómo construyen los dashboards sus links (ejemplo real, nav del HOY Dashboard):** ```html ★ Hub de Dashboards ``` ```js // openDash() arma la URL así: var url = window.cowork ? ('computer://' + V + rel) : (DEPTH + rel); // rel = data-path (ruta vault-relativa) // DEPTH = '../../' (relativa) -> dentro de la app resuelve contra genniux.net -> 404 ``` Dentro de la app `window.cowork` es `undefined`, por lo que cae en la rama relativa `DEPTH + rel`. Como la página vive en `/a/skill_`, la ruta relativa `../../IB-XX-Maestro/...` apunta a un lugar inexistente en `genniux.net` → 404. **3.4 — El mapeo ruta→ID ya existe en la app.** En la raíz de `Documents/Intellibanks/` está `.intellibanks_sync_map.json`. Cada entrada mapea exactamente lo que se necesita: ```json "IB-EL-EmpowerLabs/EQ-EL-Equipo/BRD-EL-HOY-Dashboard-v01.html": { "hash": "ba818a77681c404fada1951b5c3faf76ea0b4098d3f0e4df057afc5327da41c0", "last_sync": "2026-06-22T22:04:45.174Z", "mtime": 1782165885173.91, "skill_id": "skill_6a398f1947b7b8.34880344" } ``` → La app ya tiene la tabla `ruta de vault → skill_id`. Solo falta usarla al resolver los links internos. --- ## 4. Causa raíz La app renderiza el HTML servido por nube bajo una URL por ID (`file:///a/skill_` → `genniux.net`). Los dashboards enlazan por **ruta de vault** (que es lo correcto y portable para disco y Cowork). Dentro de la app esas rutas no corresponden a ninguna URL servida, porque la app no expone los archivos por ruta sino por ID. **No es un defecto de los dashboards**; es que la capa de servicio de la app no traduce rutas internas a sus IDs. --- ## 5. Lo que NO resuelve esto (ya descartado) - **Cambiar las rutas de los dashboards a absolutas o a otra forma relativa.** No sirve: el HTML no puede conocer el `skill_id` de los demás archivos. - **Incrustar el mapa en cada dashboard.** Inviable: el mapa pesa ~700 KB, cambia con cada sync y quedaría desactualizado. - Por eso la solución **debe vivir en la app**, no en los archivos. --- ## 6. Implementación solicitada Que la app, al renderizar un HTML, **intercepte la navegación a links internos del vault y la resuelva vía el mapa de sync**: 1. Detectar clics/navegaciones cuyo destino sea una ruta de vault (`IB-…/archivo.html`) — ya sea por `href`, por `window.open`, o por handlers como `openDash`. 2. Tomar esa ruta vault-relativa y buscarla como **llave** en `.intellibanks_sync_map.json`. 3. Obtener el `skill_id` correspondiente y abrir `file:///a/skill_` (la misma URL que ya usa *Compartir*), en lugar de dejar que el navegador la trate como ruta relativa. 4. Si la ruta no está en el mapa (aún no sincronizada), mostrar un aviso claro en vez de un 404 crudo. Sugerencia de implementación: un interceptor a nivel del webview/`will-navigate` (Electron) que reescriba el destino antes de navegar, usando el mismo mapa que ya carga la app. --- ## 7. Criterios de aceptación - [ ] Abrir cualquier dashboard en la app y hacer clic en un link de su nav (ej. "Hub de Dashboards", "Home Live", "Ver glosario completo") **abre el dashboard destino dentro de la app**, sin 404. - [ ] La navegación funciona igual que en desktop (paridad de comportamiento). - [ ] Si el destino no existe/no está sincronizado, se muestra un mensaje útil (no un 404 de Apache). - [ ] No se rompe la apertura desde desktop (`file://`) ni desde Cowork (`computer://`), que hoy ya funcionan. --- ## 8. Alcance e impacto - **Afecta:** todos los HTML del vault con navegación interna (~31 dashboards interconectados ya con rutas portables). - **Solución:** única y global en la app (un interceptor), no requiere editar archivo por archivo. - **Impacto si no se resuelve:** los dashboards solo se navegan desde el desktop; dentro de la app son páginas sueltas sin navegación. --- ## 9. Workaround vigente (mientras se implementa) Abrir los dashboards **desde el desktop** (Finder → `Documents/Intellibanks/…` → abrir el `.html`). Ahí toda la navegación entre tableros funciona. Decisión operativa actual: **desktop tiene prioridad** hasta que la app resuelva este RFI. --- *Generado con evidencia de la sesión de migración del 2026-06-22. Owner: Victor Heredia · Sherpa: Jay.* --- ## Anexo (2026-07-03) — Hallazgo verificado en el bundle de la app Se inspeccionó `Intellibanks.app` (v1.0.0, `com.intellibanks`, Electron): - **NO** registra un esquema de URL del sistema: sin `CFBundleURLTypes` en el `Info.plist` ni `setAsDefaultProtocolClient(...)` en el código. - **NO** registra tipos de documento (`CFBundleDocumentTypes`) → tampoco se puede poner como app por defecto de `.md`/`.html`. - Usa `protocol.registerFileProtocol` **interno** (así sirve `file:///a/skill_` dentro de sus ventanas), no invocable desde fuera. **Conclusión:** hoy es imposible abrir un archivo en la app desde un dashboard o desde Finder — la app no expone el gancho. **Fix mínimo para Alex (proceso main de Electron):** ```js // 1) Registrar el esquema del sistema app.setAsDefaultProtocolClient('intellibanks'); // 2) Manejar el deep link app.on('open-url', (e, url) => { e.preventDefault(); abrirDesdeURL(url); }); // url = intellibanks://open?path=IB-EL-.../archivo.md // abrirDesdeURL: parsea path -> resuelve skill_id vía .intellibanks_sync_map.json -> navega la ventana al archivo (igual que clic en el sidebar) ``` ```xml CFBundleURLTypes CFBundleURLNamecom.intellibanks CFBundleURLSchemesintellibanks ``` Con eso, el botón **Intellibanks** de los dashboards pasa a `intellibanks://open?path=` y abre directo en la app. En cuanto exista, se actualizan los ~54 dashboards en una pasada.