Context
0009 has two mechanisms: application secrets in the runtime store, and developer and CI tokens in Infisical. Neither fits a tenant’s own credentials (their Stripe, Zendesk or Google tokens, their app-store keys for a white-label app), which a tenant admin sets at runtime, per tenant, thousands of times. Settings (0108) must not become a place where such values end up. Nor fits a Stackra Pro customer’s own HeroUI key or registry token.Decision
-
Three homes, no fourth:
-
@stackra/connectionsis a package with a store owned by an Integrations service: envelope encryption with a key from KMS in SaaS or a local key on-prem, OAuth refresh, rotation and revocation, all audited. -
Settings never hold raw secrets. A setting that needs a credential holds a
@ConnectionRefto a connection. - Code reads a connection through the runtime, which resolves it at call time; agents and models only ever see the reference.
Consequences
- One answer to “where does this key go” for every kind of key.
- An Integrations service and its encryption keys are a standing operational chore, including key rotation.
- A third storage location for secret material exists, scoped to tenant credentials only; 0009’s “never a third” is amended for that class.
Enforcement
Planned: the settings validator rejects a setting whose schema marks a secret without@ConnectionRef; gitleaks keeps
scanning for values in files; a connections conformance suite including an air-gapped local-key run. Nothing checks this today.