Files
Gitea-Tools/docs/mcp-restart-classes.md

4.5 KiB

MCP restart classes and blast-radius permissions (#663)

This is the machine-enforced class matrix used by restart_coordinator.RESTART_CLASS_POLICIES. It implements the narrower-first recovery ladder from #655 and the authorization policy from #656, using the path inventory from #657 and the impact coordinator from #658. Product and delivery lineage: vision #652 and roadmap #653.

Unknown class names are denied. The coordinator requires both the class permission and an eligible request role. Approval gates are additional: a caller cannot turn a request permission into execution authority.

Restart class Required permission Expected blast radius Drain requirement Approval requirement Audit requirement Recovery behavior
client_reconnect mcp.reconnect.client none none self service class, actor, client namespace, reason, outcome Reconnect only the caller's client transport. No daemon or peer work changes.
session_reconnect mcp.reconnect.session low requesting-session safe point self service class, actor, session, reason, outcome Rebind identity, capability, and workspace state for one session.
worker_restart mcp.restart.worker.request low target worker controller approval + automated gates class, actor, worker, approval, scoped drain, outcome Restart one worker after its own leases and mutations drain.
role_runtime_restart mcp.restart.role_runtime.request medium target role runtime controller approval + automated gates class, actor, role namespace, approval, scoped drain, outcome Restart and re-probe one role runtime; unrelated roles remain available.
connector_restart mcp.restart.connector.request medium target connector controller approval + automated gates class, actor, connector, approval, scoped drain, outcome Restart one connector while unrelated runtimes remain available.
configuration_reload mcp.reload.configuration.request low mutation quiesce controller approval + automated gates class, actor, configuration revision, approval, outcome Gracefully reload configuration without replacing the daemon.
rolling_mcp_restart mcp.restart.rolling.request medium one instance at a time controller approval + automated gates class, actor, instance order, approval, per-instance drains, outcome Drain, restart, verify, and restore each instance before advancing.
full_mcp_restart mcp.restart.full.request high all sessions and mutations controller approval + automated gates class, actor, full impact, approval, full drain proof, outcome Replace the complete MCP runtime only after a verified full drain.
host_restart mcp.restart.host.request high all host work controller approval + infrastructure operator class, actor, host/change or incident id, approval, full drain proof, outcome Hand off to infrastructure ownership and reconcile every runtime afterward.

Drain boundary

Only full_mcp_restart and host_restart set full_drain_required=true. Reconnects and configuration reloads do not disrupt peer sessions. Worker, role-runtime, and connector restarts evaluate only their explicitly named target. Rolling restart drains one instance at a time. Missing required target scope denies the request rather than silently widening it to a full restart.

Permission and approval boundary

Author, reviewer, merger, and reconciler roles may self-request reconnects and request scoped worker/role/connector/reload recovery. They cannot request rolling, full, or host restart classes. Controller/operator/admin roles may request the broader classes, while execution remains operator/admin-owned. Controller approval is independently required for every class above a session reconnect. Host restart additionally requires infrastructure-operator proof.

The MCP request tool derives class permissions from its authenticated runtime role. It does not accept caller-supplied permissions. Controller and operator authorization are read from the already-running daemon environment, never from a request argument.

Audit and failure behavior

Every impact audit and every console restart/reload audit includes a restart_class field. The impact audit also includes the exact required_permission. Unknown classes, missing permissions, ineligible roles, missing approval, missing scoped targets, and incomplete inventory all deny fail closed. Manual process kills remain forbidden and contaminating (#630).