# Contexto de evidencia: Migración de sesiones v2

Fecha de inspección: 2026-07-26 (Asia/Tokyo). Alcance editable: `cursor-mobile-bridge`. La inspección de otros directorios bajo `C:\xampp\htdocs` fue exclusivamente de lectura.

## Identidad y limitaciones

- No existe una identidad Git utilizable: el árbol contiene `.git`, pero Git informa que no es un repositorio. Por ello, `sourceDrift` se considera `unknown`.
- Digest SHA-256 de la colección inventariada: `3298d316d7ed3d21b166363116d22948fb2d4448d585ba94d272965b26070126`.
- El digest se calculó concatenando, en el orden de la tabla, `ruta hash` con salto LF.
- No se leyeron ni copiaron valores de tokens. La búsqueda de archivos de entorno registró únicamente ruta, nombre de variable y presencia.
- No se inspeccionaron servicios ni archivos fuera de `C:\xampp\htdocs`; pueden existir consumidores en tareas programadas, perfiles de usuario, dispositivos móviles o el servidor `.16`.

## Registro de evidencia

| ID | Título | Evidencia y alcance | SHA-256 |
| --- | --- | --- | --- |
| `E001` | Frontera de autenticación del bridge | `server.js`: token raíz, sesión en memoria, middlewares, CORS, CSP y rutas de sesión | `f77099f7c5edb856f59042064351723d3b64e2a41fc28a4e38146921eb687f1b` |
| `E002` | Cliente web principal en transición | `static/app.js`: canje a cookie, borrado del token y fallback heredado | `e5cf73a1e1a7dc66002b2a3faacaf2c1db0862021898e479e8353d5e226d4f2b` |
| `E003` | Launcher `/apps` en transición | `static/apps/app.js`: usa cookie si existe y conserva fallback de cabecera | `01dfeae19fdc0b66a6dba228660489d995a9e222c680389ada368b1b35bbf360` |
| `E004` | Hub heredado | `static/hub/hub.js`: dos claves de `localStorage` y cabecera | `c286f975d7ddcd988185f529197e12aa7905b4645b04e36934b5dc91da05ba26` |
| `E005` | Manager heredado | `static/manager/app.js`: token local y operaciones privilegiadas por cabecera | `2ed80bc4333802d7758b58f2445f96c0b4471092687a95468358b6dcc3ad8e75` |
| `E006` | Vault heredado | `static/vault/vault.js`: token local y lectura de credenciales por cabecera | `1fb9dcbc6fc7f99c23b7c325a7ac519dd6928137b61d916aae3c0987605d542f` |
| `E007` | Cliente Telegram interno | `lib/bridge-telegram-hub.js`: pasa `env.BRIDGE_TOKEN` a ejecución móvil | `8e8ccc417dd4c7528044355da9ad4eb36827ade6fa0645f85ccbce3b2a6518b6` |
| `E008` | Prueba de carga no navegador | `tools/mobile-bridge-load-test.ps1`: usa `X-Bridge-Token` | `2a260e668867f1acaf2cfbf1366ee3e1c50fdeeb82e5db82efc98e2d477a2513` |
| `E009` | Verificador del hub | `tools/hub-verify.mjs`: usa `X-Bridge-Token` | `eb8e5f2322ca5f30668297cbb7c0237ba19c41dd1da45b78f310ea10f8b1cca8` |
| `E010` | Consumidor servidor externo confirmado | `xzonassite/ops/lab-ia-portal/includes/lab-ia-supervisor.php`: obtiene `XZ_IA_BRIDGE_TOKEN`/`BRIDGE_TOKEN` y envía `X-Bridge-Token` | No incluido en el digest del proyecto; solo lectura |
| `E011` | Referencias externas sin autoridad propia | ALimpiezas, Captajaus y Chatbot generan enlaces a `100.78.198.98:8095` sin token; su acceso depende de la sesión del navegador | No incluido; solo lectura |
| `E012` | Topología y proceso activo | `/health` devolvió HTTP 200; `netstat` mostró `0.0.0.0:8095`; documentación y configuración separan EQUIPITELLO `100.78.198.98` del servidor IA `.16`/`100.69.11.89` | Evidencia de ejecución, no artefacto hashado |
| `E013` | Presencia de variables externas | Se halló `XZ_IA_BRIDGE_TOKEN` en `xzonassite/.env.local`; `BRIDGE_TOKEN` solo en el `.env` del bridge dentro de la raíz inspeccionada | Valores redactados; no hashado |

## Inventario de dependencias confirmado

### Productor y validadores

- `BRIDGE_TOKEN` se carga una vez al arrancar `server.js`.
- `constantTimeTokenMatch` valida el valor con comparación de tiempo constante.
- `authMiddleware` y `codexAuthMiddleware` admiten cookie de sesión o `X-Bridge-Token`.
- `/api/bridge/session` y `/api/codex/session` canjean el token recibido en cuerpo por una cookie `HttpOnly`, `SameSite=Strict`, de 12 horas.
- Las sesiones viven en un `Map` del proceso: reiniciar el bridge invalida todas las sesiones.

### Consumidores del navegador dentro del bridge

Se localizaron 12 clientes JavaScript relevantes. Codex Suite usa cookie y no guarda el token. El cliente principal canjea el token y lo elimina de `localStorage`. El launcher `/apps` y el hub realizan una transición parcial. `apps2`, Equipitello Tools, Lab Checker, Manager, MCP Lab, Mirror, Ops y Vault aún contienen almacenamiento o envío heredado. La mera presencia de código fallback no prueba que cada dispositivo conserve hoy una copia; sí prueba que retirar la cabecera puede romper esos flujos.

### Consumidores no navegador

- Confirmados dentro del bridge: Telegram, prueba de carga y verificador del hub.
- Confirmado fuera del proyecto: portal LAB de `xzonassite`.
- La herramienta `sync-lab-env.ps1` copia el token a configuración `XZ_IA_BRIDGE_TOKEN`, por lo que una rotación requiere coordinación aunque no se ejecute automáticamente en esta fase.

### Referencias que no son consumidores del token

ALimpiezas, Captajaus y Chatbot construyen deep links con proyecto y prompt, pero no añaden credenciales. Esos enlaces seguirían abriendo el bridge tras retirar la cabecera; requerirían que el navegador tenga una sesión válida o muestre login.

## Radio de impacto de la autoridad

El mismo middleware protege lectura de conversaciones y conocimiento, archivos y cambios, SFTP/deploy, credenciales, comandos de sistema, procesos, servicios, operaciones, Telegram y la mayoría de Codex Suite. Por tanto, `BRIDGE_TOKEN` es actualmente una credencial ambiental con autoridad muy amplia, no un token limitado al launcher.

## Puerto 8095 y Tailscale

El proceso observado escucha en `0.0.0.0:8095` y `/health` respondió como `cursor-mobile-bridge`. La IP `100.78.198.98` corresponde, según configuración y documentación del propio proyecto, al PC EQUIPITELLO dentro de Tailscale. `/apps` es una ruta del mismo `server.js`. El servidor remoto `.16`/`100.69.11.89` ofrece supervisor y servicios IA separados; no hay evidencia de que sirva `/apps`.

## Incertidumbres que bloquean un corte o rotación

1. Consumidores fuera de `C:\xampp\htdocs`: tareas programadas, scripts personales, servicios, bots o integraciones remotas.
2. Copias de token en `localStorage` de cada navegador/PWA instalada.
3. Dispositivos y usuarios autorizados en Tailscale, ACLs y posible Funnel activo.
4. Necesidad operativa exacta del portal LAB de `xzonassite` y de Telegram durante la migración.
5. Terminación HTTPS elegida. En HTTP remoto, la cookie no puede marcarse `Secure`.
6. Ventana aceptable de reautenticación, porque las sesiones actuales no sobreviven a un reinicio.

## Comprobaciones ejecutadas

- Búsquedas `rg` de referencias de autenticación dentro del proyecto y, en solo lectura, bajo `C:\xampp\htdocs`.
- Inventario seguro de nombres de variables en `.env*`, sin mostrar valores.
- Lectura focalizada de middlewares, rutas de sesión y consumidores externos.
- `Invoke-WebRequest http://127.0.0.1:8095/health`: HTTP 200.
- `netstat`: listener `0.0.0.0:8095`.
- `Get-FileHash -Algorithm SHA256` sobre nueve fuentes principales.

No se ejecutó login, mutación, rotación, reinicio, prueba desde iPhone, prueba desde Tailscale ni prueba del servidor `.16`.
