# ::::bastion:::: dashboard — paquete oficial

Sistema: **bastion::universalis** · Núcleo operativo: **mayan::os** · Lema: **facta::non::ficta**
Versión: `1.1.0` · Generado: `2026-06-12` · `TU-CORE-001-v02`

Paquete HTML integrable, portable y mantenible para el repo oficial de Bastion.
Material crudo, pruebas, screenshots y exports viejos quedaron **fuera** (ver `../non-official-review/`).

---

## Cómo abrir el portal oficial

1. Servir esta carpeta como estático (o detrás del gateway `unicornd` en `:8800`).
2. Abrir **`index.html`** → redirige al entry canónico **`bastion-portal.html`**.
3. El portal arranca apagado: escribir nombre sobre el logo terra y validar con **MIDI** (o entrar en modo demo sin dispositivo).

> **Entry point principal:** `index.html` → `bastion-portal.html`.
> **Documento de entrega y auditoría:** `entrega.html` — condensa identidad, regla maestra, estructura, reglas de manifest/README, dependencias, puertos, rutas prohibidas, checklist de sellado y estado final. Portada operativa para integración y continuidad.
> **Especificaciones gráficas:** `ESPECIFICACIONES-GRAFICAS.md` — documento portable para coordinar diseño, programación e implementación sobre el mismo repo; `design-files.html` es la versión interactiva.

---

## Flujo del sistema

```
index.html → bastion-portal.html  (apagado → valida con MIDI → enciende)
                  ├── bastion-admin-modules.html   (anillo admin → núcleo/intranet/codex)
                  ├── bastion-access-gate.html     (login grp → anillo grp)
                  └── midi-mappings.html           (anillo midi)
```

Navegación común: **octobar** superior (midi · admin · grp multicolor · sistema) + jaguar al centro.

---

## Dependencias locales (incluidas)

- **CSS:** `assets/bastion.css`, `assets/bastion-ops.css`, `assets/ds-tokens/tokens.css`
- **JS:** `assets/endpoints-config.js` (config central de puertos), `assets/bastion-shell.js`, `assets/bastion-octobar.js`, `assets/ops-chrome.js`, `assets/bastion-dial.js`, `assets/mayan-console.js`, `assets/rf-store.js`, `assets/endpoints-data.js`
- **Datos:** `assets/console/{maschine,traktor,m32,djcontroller}.json`
- **Media:** `assets/bastion-intro.mp4`, `assets/bastion-jaguar.png`, `assets/bastion-logo.jpg`, `assets/tu-imagotipo-blanco.png`, `assets/console/*.jpg|png`

---

## Dependencias externas restantes

| Dependencia | Estado | Motivo |
|---|---|---|
| **Google Fonts** (Instrument Sans, IBM Plex Mono, Hanken Grotesk, Cinzel) | externa, declarada | No vendorizada. Degrada a fuentes del sistema sin conexión (los font-stacks incluyen `system-ui`/`monospace`). Para 100 % offline: descargar los `.woff2` a `assets/vendor/fonts/` y reemplazar los `<link>` de fuentes. |
| **CDN de JavaScript** (React · ReactDOM · Babel · Tailwind) | **no presente** | El paquete **no usa ningún CDN de JS** ni framework externo. Todo el JS es local. Tailwind nunca estuvo en producción (sólo en el repo crudo excluido). |

> Resultado: el **único** recurso externo es **Google Fonts** (cosmético, con fallback a fuentes del sistema). Sin React, sin Babel, sin Tailwind, sin ningún CDN de JS. Todo el JS, los datos y la config de puertos son locales.

---

## Puertos — configuración declarada

Todos los puertos viven en **`assets/endpoints-config.js`** (`window.BASTION_ENDPOINTS`).
Ningún HTML lleva `host:puerto` duros: los consumidores leen de la config
(el dashboard arma el mapa del puerto y los `fetch` desde ahí; las pantallas midi muestran
sus puertos con `data-ep` hidratado por la config).

El gateway expone **un solo puerto público (`:8800`)**; el resto es interno vía proxy.

| Puerto | Servicio | Proxy | Requerido | Fallback |
|---|---|---|---|---|
| `8800` | gateway unicornd (`/api/status`, `/api/restart`, estáticos, túnel) | `/` | sí | demo |
| `8767` | voice receiver | `/voice` | opcional | demo |
| `8788` | voice stream / nuntium | `/messages` | opcional | demo |
| `8011` | grp midi2 | `/grp-midi2` | opcional | demo |
| `8502` | mayan mapper / mayanmidi | `/mayanmidi` | opcional | demo |

> `8766` (hotspots) aparecía en el repo crudo; **ningún** módulo oficial lo usa.
> Para cambiar host/puertos en integración: editar **sólo** `assets/endpoints-config.js`.

---

## Integración al gateway Bastion

1. Copiar `dist/official/` dentro del repo oficial (p. ej. como raíz estática que sirve `unicornd`).
2. `unicornd` sirve `index.html` en `:8800`; las rutas `/api/*` quedan same-origin (sin host duro).
3. Levantar los servicios internos (`8767/8788/8011/8502`) para datos reales; sin ellos, demo.
4. Ajustar puertos/host de integración en `assets/endpoints-config.js` (fuente única).
5. (Opcional) Vendorizar Google Fonts a `assets/vendor/fonts/` para operación 100 % offline.

---

## Módulos 100 % offline (sin backend)

`index.html`, `bastion-portal.html`*, `bastion-admin-modules.html`, `midi-mappings.html`,
`design-files.html`, `nucleo/arquitectura.html`, `nucleo/reporte-endpoints.html`,
`nucleo/spec-pantallas-00-01.html`, `ESPECIFICACIONES-GRAFICAS.md`.

\* el portal valida con **Web MIDI API** del navegador; sin dispositivo cae a demo (nombre + entrar).

## Módulos que requieren servicios locales (degradan a demo)

- `bastion-admin-dashboard.html`, `nucleo/port-registry.html`, `nucleo/sistemas.html`, `intranet/*` → gateway `:8800`.
- `grp/*` → canon local en `localStorage` hasta conectar su backend.
- `midi/station.html`, `midi/mayan-mapper.html`, `midi/mirror-codex.html` → `:8502`.
- `midi/voice-receiver.html` `:8767` · `midi/voice-stream.html` `:8788` · `midi/grp-midi2.html` `:8011`.
- `codex/*` → embed `/codex` (+ `/voice`).

> El detalle por módulo (`status`, `offline`, `requires_backend`, `backend_ports`, `external_dependencies`, `local_vendor`, `local_assets`, `notes`) está en **`manifest.json`**.

---

## Estados (manifest)

- **official** — productivo y offline.
- **demo** — opera standalone con datos simulados/locales; usa backend si está vivo.
- **requires_backend** — necesita un servicio para ser útil.
- **review** — en revisión (ninguno en esta entrega; lo dudoso vive en `../non-official-review/`).

---

## Normalización aplicada

- Nombres canónicos sin espacios (`bastion-portal.html`, etc.) + `index.html` de entrada.
- `tokens.css` local en `assets/ds-tokens/` (sin rutas a `_ds/…`).
- **0** CDN de JS · **0** rutas absolutas/`file:///` · sin `C:/Users`. `127.0.0.1` aparece **solo como dato informativo** de destino interno (centralizado en `assets/endpoints-config.js`), nunca como link operativo.
- Puertos centralizados en `assets/endpoints-config.js`.
- **0** referencias locales rotas dentro del paquete (validado).

## Kukulkan :: ejemplos heredados

`kukulkan/index.html` concentra la primera migración de documentos viejos de `redeco` como ejemplos vivos para normalizar sistemas heredados. La fuente original local queda intacta; el paquete oficial conserva copias portables en `kukulkan/examples/redeco/`.
