ADR 0005: Off-Path Secret Materialization
- Status: Accepted
- Date: 2026-07-18
- Gate: LF-2 before production provider publication
Decision
Portal resources carry only credential:// reference IDs. The first
production resolver seam is the gateway's already resolved runtime
configuration: config-loader decrypts CRYPT values, RuntimeConfig exposes
resolved values to authorized module construction, and ModuleRegistry masks
sensitive values in inspection output. A later provider integration must
implement the same narrow SecretResolver contract rather than changing the
request path.
Reload performs three stages: parse/validate the secret-free resource graph; authorize and resolve every enabled credential reference and construct reusable clients; publish only the fully materialized root. Resolution, decryption, token exchange, and client construction never occur during inference.
Missing, denied, expired, blank, or malformed references reject the candidate and preserve the last valid root. Runtime config reload is the rotation notification. Rotation rebuilds only affected provider subgraphs; in-flight requests may retain the old secret-bearing client Arc until their old root retires.
Ordinary logs, metrics, traces, audit events, projection/root digests, benchmark artifacts, crash reports, and module inspection contain neither secret values nor credential reference IDs. Repair-only operator diagnostics require explicit authorization and still prefer deployment/error IDs.
Evidence
projection-secret.json exercises success, missing, denied, rotation,
redaction, last-valid-root, and zero request-time lookup assertions.