Arquitectura

Mentat esta pensado como una plataforma privada de workloads con un control plane pequeno, un agent por host y un CLI para operacion. La meta es mantener deploy, scheduling, health y ciclo de vida en un solo sistema sin arrastrar la complejidad operativa de una plataforma mas pesada.

Que Corre Donde

mentat-server

El control plane. Recibe jobs, guarda estado, decide scheduling y coordina deploys, rollbacks y estado de nodos.

mentat-agent

Corre en cada host. Inicia workloads por Firecracker, Sandbox, Docker, exec o Hull y mantiene los detalles de runtime cerca del nodo.

mt

La interfaz de operacion. El equipo la usa para desplegar, escalar, inspeccionar y revertir servicios desde una sola superficie.

mentat-types

Tipos compartidos para definiciones de servicio, recursos, constraints, estrategias de deploy y estado de runtime.

Modelo Operativo

La arquitectura esta optimizada para infraestructura privada. El server decide donde debe correr un workload, el agent lo materializa en el host, y el CLI se mantiene liviano. Asi el control plane sigue pequeno pero soporta runtimes mixtos y workflows de deploy.

1. Operador ejecuta: mt run services.yaml
2. CLI valida el archivo y envia el job a mentat-server
3. Server guarda el estado deseado y elige un nodo
4. Server despacha una asignacion a mentat-agent
5. Agent inicia el workload con el driver seleccionado
6. Server guarda el estado observado y responde al operador

Saber Que Esta Mal

Un monitor de salud prueba cada endpoint registrado cada 10 segundos y escribe una conclusion en el registro: healthy, starting, unhealthy. Pasado un umbral de fallos consecutivos reinicia el workload a traves del agente, con un cooldown para que un boot lento no se convierta en una tormenta de reinicios.

La conclusion sola rara vez alcanza durante un incidente — dice que, no por que. Por eso los contadores detras tambien se pueden leer: cuantos probes fallaron seguidos, si hay un restart en vuelo, hace cuanto se reinicio el servicio por ultima vez, y la condicion del nodo donde vive cada endpoint. mt diagnose lee eso, vuelve a probar los endpoints en el momento, trae la salida reciente del workload por el agente, y reporta hallazgos. Todo ese camino es read-only, que es lo que lo hace seguro de correr cuando algo ya esta roto.

mt://services/{name}/health     status + los contadores detras
mt://services/{name}/diagnose  lo anterior + probes en vivo, logs, hallazgos
mt://nodes                     condiciones de lifecycle por nodo
mt://registry                  todos los endpoints que registro el agente

Un workload arrancado fuera del agente es invisible aca: el agente registra solo lo que el mismo lanzo, el ingress rutea solo lo que el registro conoce, y un puerto que responde en el host no prueba ninguna de las dos cosas. Esa brecha es, ella misma, uno de los hallazgos que mt diagnose reporta.

Por Que Esta Forma

Control plane pequenoMenor uso de memoria y menor superficie de fallo
Agent por hostLa logica de runtime queda cerca del nodo
CLI livianoFacil de automatizar por SSH o CI
Tipos compartidosUn solo modelo para config, deploy y estado
Abstraccion de driversUna sola plataforma para VMs, contenedores, binarios y workloads Hull

Modelo de Definicion de Servicios

Los servicios declaran runtime, recursos, constraints y estrategia de deploy en una sola especificacion. Ese mismo modelo atraviesa scheduling, rollout y status.

mentat-types/src/types.rs
pub enum Driver { Firecracker, Sandbox, Docker, Exec, Hull }

pub enum DeployStrategy { Rolling, BlueGreen, Canary }

pub enum DriverConfig {
    Firecracker(FirecrackerConfig),
    Sandbox(SandboxConfig),
    Docker(DockerConfig),
    Exec(ExecConfig),
    Hull(HullConfig),
}

pub struct ServiceSpec {
    pub name: String,
    pub replicas: u32,
    pub config: DriverConfig,
    pub resources: Resources,
    pub constraints: Vec<Constraint>,
    pub deploy: DeployConfig,
}

Stack de Implementacion

Runtimetokio 1.x
API HTTPaxum 0.8
Serializacionserde + serde_json + serde_yml
Estadosled 0.34
Cliente HTTPreqwest (rustls)
Unix Socketshyperlocal + hyper
CLIclap 4 (derive)
Erroresthiserror
IDsuuid v4