0005. The revocation model
Date: design phase Status: Accepted
Context
Revocation is the one identity primitive that genuinely fights edge-statelessness, and the constitution (ADR-0001) named it a first-class obligation rather than leaving it to be discovered. It is monotonic — once revoked, a credential stays revoked — which is simple and grow-only-set-shaped; correctness is never the hard part. The hard part is propagation latency: a revocation must become visible fast, and the naive way to guarantee that (read the authoritative set on every verification) is exactly the hot-path core read the constitution forbids (rule 1).
So the design problem is precisely: revoke promptly without putting a core read on the verification path. This ADR fixes the mechanism, because it determines Vord's whole consistency posture and is tightly coupled to the token format (ADR-0003).
Decision
-
Short-TTL-dominant. Access tokens are minutes-scale, so for the common case revocation reduces to waiting for expiry. This keeps the large majority of revocations off any propagation path at all — the cheapest possible answer for the common case.
-
Signed status list for "kill now". For revocations that must take effect within a bounded window before expiry, a signed Token Status List (the IETF draft) is published and cached at the edge. The verifier consults it locally — it is itself a signed, verifiable artifact, not a core read — refreshed on a short interval.
-
Urgent propagation over NATS. Genuinely urgent revocations are pushed to edge nodes over NATS (already present in the Wyrd stack for L3 replication), with Wyrd's watch hook (reserved Wyrd ADR-0007, fan-out kept uncapped per Wyrd ADR-0018) as the durable backstop and source of truth.
-
The authoritative set is core-resident but never hot-path-read. The strongly-consistent core holds the authoritative revocation set — freshness- critical revocation is one of the irreducible facts constitution rule 2 permits there — but the status list and the NATS stream are derived projections of it (a CQRS-shaped relationship). Verification reads the projections, never the source.
-
Freshness budget is a target, shape fixed. "Urgent revocation visible at all edges within N seconds" is a budget set during implementation; the mechanism above is fixed now (the same pattern as Wyrd's quality scenarios — numbers later, shape now).
Consequences
- The verification path never reads the core for revocation: short TTLs and the cached status list carry it, so constitution rule 1 holds even for the primitive that most threatens it.
- "Kill now" is bounded, not instantaneous, and the bound is a stated budget — the honest tradeoff of freshness latency against hot-path independence, named rather than hidden.
- Revocation correctness stays trivial (monotonic, grow-only); all the engineering is in propagation latency, which is now explicit and measurable (a durability-plane signal — revocation lag — worth instrumenting, the Vord analog of Wyrd's time-to-repair).
- The model is coupled to the token format (ADR-0003): short TTL is a token parameter and the status list is a credential-format artifact, so the two ADRs move together.