Estado: vigente desde 2026-05-06.
Este documento fija decisiones de arquitectura para que OPS pueda evolucionar como SaaS multitenant sin romper el modelo operativo de workspaces, agentes, modelos, credenciales y automatizaciones.
OPS es un SaaS multitenant. Toda entidad operativa nueva debe tener alcance de workspace cuando afecte a tareas, credenciales, targets, perfiles, agentes, plantillas, limites o ejecuciones.
Reglas:
workspace_id.workspace_id.workspace_id.workspace_id y puede ser personal o workspace.workspace_id.No se debe introducir estado global que cambie el comportamiento de todos los workspaces sin una politica explicita.
Los conceptos se separan asi:
opencode, codex, hermes, claudecode o un agente futuro.opencode, codex, hermes, claude, un worker HTTP o un runner local.openai, minimax, anthropic, google, ollama, lmstudio, openrouter o proveedor propio.openai/gpt-5.4-mini, minimax/..., local/qwen....OPS no debe asumir que solo existen unos pocos modelos. La UI puede sugerir modelos conocidos, pero debe permitir introducir modelos nuevos mientras el agente/proveedor los soporte.
La autenticacion debe ser configurable por workspace y por worker:
workspace_id;El launcher debe resolver credenciales de la tarea antes de decidir si un runtime esta autenticado. Esto evita que un OAuth local caducado bloquee una tarea que trae OPENAI_API_KEY, MINIMAX_API_KEY u otra clave desde el vault del workspace.
Las tareas no deben heredar credenciales de otro workspace. Los workers multitenant deben evolucionar hacia pools aislados, cuotas y limites por workspace; los workers dedicados pueden usar variables globales cuando el aislamiento lo permita.
La preferencia actual de producto para OPS interno es:
Hermes no esta prohibido. Lo prohibido es caer en Hermes de forma silenciosa cuando la tarea, plantilla o workspace pedia otra cosa.
Un fallback valido debe cumplir:
Ejemplo no aceptable:
minimax2.7 -> openai/gpt-5.4-mini
Si se usa OpenAI como sustituto temporal de Minimax, debe verse como override operativo, no como alias silencioso.
El API/UI no debe asumir que los agentes corren en el mismo VPS que OPS.
Un worker debe anunciar capacidades reales:
{
"worker_id": "worker-eu-01",
"workspaces": ["ops-internal"],
"agents": ["opencode"],
"models": ["openai/gpt-5.4-mini"],
"providers": ["openai"],
"max_concurrency": 2,
"current_load": 0,
"region": "eu"
}
Modos futuros admitidos:
Para 1000 usuarios concurrentes no es valido un unico VPS ejecutando todos los agentes. El modelo debe permitir pool de workers, limites por workspace y asignacion por capacidad.
Estados visibles:
inbox: entrada sin decidir.next: lista, planificada o pendiente de lanzamiento manual.doing: trabajo activo o seguimiento.waiting: esperando input externo.review: resultado listo para validar.done: completada.archived: fuera del flujo activo, conservada por historico.Estados tecnicos:
queued: esperando worker.dispatching: worker ejecutando.queued y dispatching pueden verse en diagnostico, pero no deben convertirse en columnas mentales principales para usuarios finales.
archived significa que la tarea ya no participa en la operacion normal.
Usos correctos:
done significa trabajo completado. archived significa fuera de flujo.
Las tareas automatizables pueden entrar a cola de tres formas:
queued;next hasta fecha/regla;Dispatch now.El boton Dispatch now debe seguir existiendo para lanzar manualmente tareas automatizables que deliberadamente no entran a cola al crearse.
Una tarea automatizable bloqueada debe poder resolverse en una sola accion:
blocked;queued;Debe existir tambien la opcion de guardar sin ejecutar.
Mover una tarea a doing no debe relanzar automatizacion. Solo dispatch encola.
El health debe detectar desalineaciones:
Un health que dice ok solo porque hay heartbeat fresco no es suficiente.
El portal oficial de documentacion OPS es la fuente operativa. Los cambios de comportamiento deben actualizar:
docs/;public/help;Commit y push no equivalen a deploy cuando produccion es una copia en /var/www/ops y no un checkout Git.
Antes de cambiar dispatch, agentes, modelos, credenciales o plantillas, comprobar:
workspace_id;