Estado: contrato base
Fecha: 2026-05-05
OPS Center debe poder crecer como SaaS sin reescribir el producto cuando entren clientes externos. La regla principal es que toda funcionalidad nueva debe declarar desde el inicio si pertenece a plataforma, cuenta o workspace.
| Capa | Tabla base | Propiedad | Uso |
|---|---|---|---|
| Plataforma | app_users, account_plans, ops_settings globales |
Superadmin OPS | Operacion global, planes, salud, migraciones y soporte |
| Cuenta | accounts |
Empresa cliente | Plan comercial, limites, billing futuro y conjunto de workspaces |
| Workspace | workspaces, workspace_members |
Equipo operativo | Tareas, proyectos, agentes, credenciales, targets, skills, planes y colas |
| Usuario | app_users + membresias |
Persona | Sesion, preferencias, tema, permisos por workspace |
Toda tabla con datos operativos debe incluir workspace_id y toda query de API debe filtrar por el workspace resuelto en la peticion.
El workspace se resuelve por este orden:
X-OPS-Workspace-Id.workspace_id en query/body cuando el endpoint lo permite.Un usuario solo puede operar workspaces donde tenga una membresia activa en workspace_members.
Estas entidades deben permanecer aisladas por workspace:
Si una entidad necesita compartirse entre workspaces, debe tener una decision explicita de producto y permisos de lectura separados. No se debe compartir por accidente mediante ausencia de filtro.
La cuenta agrupa workspaces y limita uso:
plan_slug)Los planes actuales son solo, team, studio y custom. Por ahora no hay billing automatico; el plan funciona como contrato de limites.
Roles de plataforma:
admin: puede administrar cuentas, usuarios, workspaces y configuracion global.operator: puede usar el sistema operativo donde tenga acceso.Roles de workspace:
owner: control total del workspace y miembros.admin: configuracion, miembros operativos, credenciales y deploy targets.operator: tareas, colas, ejecucion y uso diario.viewer: lectura.La UI puede ocultar acciones, pero la autorizacion valida vive siempre en la API.
Las credenciales no deben exponerse al navegador despues de guardarse. La UI solo puede mostrar alias, proveedor, scope, estado, ultimo uso y fecha de expiracion.
Scopes permitidos:
personal: pertenece a un usuario dentro de un workspace.workspace: disponible para automatizaciones del workspace.Los deployment targets siempre pertenecen a un workspace y pueden referenciar una credencial del mismo workspace. No debe permitirse asociar una credencial de otro workspace.
Las preferencias visuales deben resolverse por prioridad:
Los componentes no deben depender de colores directos; deben leer tokens CSS. Esto permite cambiar tema sin duplicar pantallas.
Antes de cerrar una funcion nueva:
workspace_id.requireWorkspaceRole o una autorizacion equivalente.workspace_id.npm run smoke:saas debe validar:
La primera version SaaS usa una sola base de datos PostgreSQL con aislamiento por account_id y workspace_id.
No se adopta base de datos por cliente en esta fase porque aumentaria coste operativo y ralentizaria el desarrollo inicial. Si un cliente exige aislamiento fisico o requisitos regulatorios, el contrato actual permite evolucionar a esquemas o bases separadas manteniendo las mismas capas logicas.