Saltar a contenido

ADR 004: Multi-panel

Estado

Aceptado — 2026-06

Contexto

HIVE evoluciona hacia una plataforma multi-tenant con varios panels independientes. El prototipo histórico UnoSport Club validó este modelo de panels ortogonales; cada panel tiene su propio path de UI, namespace de API y módulos CUS. El framework no debe hardcodear panels ni mezclar dominios de negocio en un mismo shell.

Decisión

  1. Panel como unidad de composición UI/API, ortogonal al tenant (X-Tenant-Id).
  2. Los plugins host declaran panels vía entry point cortex.panels y PanelBuilder (ver ADR 011). El hook legacy register_panels() queda deprecado.
  3. El framework expone GET /api/v1/panels y ensambla manifests por panel/módulo.
  4. El shell React (framework/web-shadcn) depende de @cortex/web y monta rutas dinámicas desde la API; la skin @cortex/panel-shadcn renderiza CUS por panel.

Leyenda: Panels registrados por plugins sobre un tenant. Actores: shells/reference/accounting registran panels; tenant en header. Estado: Implementado.

flowchart TB
  Tenant[X-Tenant-Id header]
  subgraph panels [Panels independientes]
    Trainer[trainer /trainer/]
    Operations[operations /operations/]
    Admin[admin /admin/]
    Accounting[accounting /accounting/]
    Samples[samples /samples/]
    Control[control /control/]
  end
  Tenant --> panels
  PanelHost[plugins/panel,admin,trainer,...] --> Operations
  PanelHost --> Admin
  PanelHost --> Trainer
  PanelHost --> Accounting
  Ref[cortex_plugin_reference] --> Samples
  Ledger[cortex_plugin_ledger] --> Accounting

Leyenda: Mapa de panels Independiente vs tenant. Estado: Implementado.

sequenceDiagram
  participant Host as cortex.panels
  participant P as cortex_plugin_*
  participant R as PanelRegistry ResourceRegistry
  participant API as GET /api/v1/panels
  participant UI as framework/web-shadcn

  Host->>R: configure_panel
  P->>R: register_resources
  UI->>API: panels + routes
  API->>R: manifests ensamblados

Leyenda: Registro dinámico de panels sin rutas hardcodeadas en React. Estado: Implementado.

Mapping de referencia (panels HIVE)

Panel ID UI path API namespace Plugin
trainer /trainer/ /api/v1/trainer/ panel host (plugins/trainer)
panel /panel/ /api/v1/panel/ panel host (plugins/panel)
accounting /accounting/ /api/v1/accounting/ panel host + módulo ledger
samples /samples/ /api/v1/samples/ reference (To-Do)
control /control/ /api/v1/control/ panel host (plugins/control)

El módulo booking vive como sub-módulo del panel panel (no panel propio). Ver ADR 008.

Plugins por defecto

CORTEX_ENABLED_PLUGINS=panel,trainer,accounting,control,ledger,reference,clients,booking

Ver ADR 011 para cortex.panels y CORTEX_ENABLED_PANELS.

El plugin monolítico reserva fue retirado del monorepo; reservas de negocio → plugin booking (ADR 008, pip futuro cortex-plugin-booking — ADR 002).

Consecuencias

  • Positivas: panels aislados, extensibles por pip, shell único sin panelConfig.ts estático.
  • Negativas: más superficie en registry/API; documentación y CI deben listar plugins activos explícitamente.
  • Migración: To-Do pasa de /todo a panel samples en /samples/todo; API en /api/v1/samples/todo.