Delegation is attenuation — authority flows down, never up (v2.46.0)
The canonical adopter scenario: a SaaS embeds a chat widget on any
third-party origin. The widget needs identity — but every existing
bearer is wrong for a browser: a service account (v2.46.0) is long-lived
and broad; a user JWT belongs to a person. What the widget needs is
a slice of the backend's authority: [chat.invoke], for fifteen
minutes, and nothing else.
The law. A mint is admitted only when
grants ⊆ capabilities(minter). The bearer's lifetime is bounded by a closed ceiling (24h —axon-T894). The minted principal holds no mint authority (depth 1, structural). Authority flows DOWN the delegation chain — never up, never sideways.
Three layers, all fail-closed
- Compile. A contract that grants nothing is dead
(
axon-T893); a TTL that is unparseable, zero, or above the ephemeral ceiling is rejected (axon-T894); amintof an undeclared contract is rejected (axon-T895); a mint binding flowing into apersistpayload is rejected (axon-T896— credentials are shown once, never stored). - Verify/deploy. The
CredentialAttenuationproof re-derives every contract + mint site from the compiled IR — a stale or hand-edited artifact that smuggles a ghost mint or a week-long "ephemeral" credential is REFUTED before it mounts. The enterprise deploy gate composes with v2.45.0: every declared grant must be grantable (⊆ π(authority catalog)) — you cannot deploy a flow that mints dead capabilities. - Mint time. The dispatch handler checks
grants ⊆ held_capabilitieswhen the request carries a bearer; theCredentialMinterport re-checks independently (safe standalone) and REFUSES when there is no capability context to attenuate from. No minter port configured ⇒ a loud missing-dependency error — never a silent stub, never a hallucinated token.
Why attenuation, not issuance
An issuance API ("create a token with scopes X") is an amplification
hazard: whoever reaches it mints arbitrary authority. Attenuation
inverts the posture — the mint site can only ever hand down a subset
of what it provably holds, so the worst a compromised bootstrap flow
can leak is its own authority, time-boxed. Combined with the v2.28.0
budget (per-visitor cost attribution) and v2.38.0 cors (the
browser-origin half), the widget scenario is expressible end-to-end
in typed, PCC-attested source.
Relation to the other laws
- The third act of the authority story:
every_boundary_is_guarded(v2.44.0 — every boundary declares a guard) →every_requirement_is_grantable(v2.45.0 — every guard is satisfiable) → this law (v2.46.0 — authority can be handed down, but only attenuated, only briefly, only provably). - The v2.46.0 service account is the long-lived dual: admin-minted
machine identity with catalog grants.
credentialdeliberately cannot reach that shape (the 24h ceiling) — a credential that outlives a day is a service account wearing a costume. - The inbound dual:
rotation_without_revelation(v2.48.0) governs authority a third party lends US — a borrowed credential is custodied, renewed in custody (rotate), and never readable, exactly as a minted bearer is never persisted (axon-T896). Together the two laws close the perimeter: no authority — own or borrowed — exists as data in cognition space.
The honest test: if a piece of code can produce a bearer whose authority exceeds what that code itself was granted, your delegation is amplification. AXON rejects that program.