Catalog lifecycle: immutable until restart
August 14, 2026 ยท View on GitHub
Status: Decided and enforced Decision: A running cMCP process never reloads or mutates its approved catalog.
The catalog binds tool names to upstream identities, TLS pins, measured stdio executables, and approved schemas. Changing it at runtime can redirect a permitted call to different code or a different network authority. That blast radius is larger than changing a policy decision over an otherwise stable route.
CMCP_CATALOG_HASH therefore means exactly one approved catalog artifact for
the process lifetime. To change it, an operator writes the new artifact,
computes and pins its hash, restarts the gateway, and obtains fresh attestation
evidence naming that hash. There is no polling interval, reload endpoint,
filesystem watcher, or signing-key exception for the catalog.
This does not hide upstream drift. CATALOG_DRIFT_DETECTED compares advertised
tool definitions with the sealed catalog and fails closed; it reports that
reality moved rather than silently rewriting the authority.
Executable guard
Configuration keys implying runtime mutation, including
catalog_reload_interval_seconds and catalog_reload_path, are reserved and
rejected with CATALOG_RESTART_REQUIRED. A future implementation cannot make
one valid by only adding a parser field. Changing this lifecycle requires
deliberately removing the guard, revising this decision, and replacing its tests
with a complete authorization and attestation model.