Composición — caso de uso Reservas
Grafo canónico del caso de uso Reservas (implementación UnoSportClub). Fuente machine-readable: composition.py (REFERENCE_GRAPH).
Árbol por capas
| Capa | Plugins |
| Fundación | clients, resources, payments, discounts |
| Catálogo | pricing |
| Operaciones | booking, sales |
| Extensión | events, store, subscriptions |
| Finanzas | accounting, billing |
| Plataforma | ai-agents |
Grafo de dominio
| plugin_id | requires (hard) | optional_requires | provides |
| clients | — | — | clients |
| resources | — | — | resources |
| pricing | resources | — | pricing |
| booking | resources | clients, pricing, payments, discounts | booking |
| payments | — | — | payments |
| sales | clients, payments | pricing, discounts | sales |
| events | booking, clients | sales | events |
| discounts | — | — | discounts |
| accounting | — | payments, sales | accounting |
| store | — | sales | store |
| subscriptions | clients | payments | subscriptions |
| billing | clients | payments, accounting | billing |
| ai-agents | — | booking, clients, payments | ai-agents |
Leyenda:
- requires: boot falla en
CORTEX_PLUGIN_DEPS=strict si el proveedor no está activo. - optional_requires: el plugin carga; UI y flujos consultan capabilities y degradan.
- provides: capability indexada en
GET /api/v1/control/capabilities.
Validación en CI
| Capa | Qué valida |
products/unosportclub/tests | Descriptores == REFERENCE_GRAPH; bundles cerrados; sin ciclos; sin imports cruzados entre plugins |
Boot validate_plugin_dependencies | requires hard según CORTEX_PLUGIN_DEPS (framework, agnóstico de producto) |
Añadir un plugin al caso de uso
- Descriptor en el plugin (
requires, optional_requires, provides). - Nodo en
REFERENCE_GRAPH del paquete cortex-product-unosportclub. - Entrada en dependency-contracts.md y docs locales del plugin.
- Perfil pip si aplica (bundles.md).