Architecture

6. Runtime view

The scenarios that define the system. Each names the planes it crosses and the side of the constitution's line it sits on.

6.1 Issuance — the authorization-code + PKCE flow

The headline issuance path and the M0 slice. Diagram: diagrams/auth-code-flow.mermaid.

Relying party → Modgud authorize → login ceremony (an authentication method, ADR-0015) → SSO session (ADR-0016) → core issuance (the irreducible write) → a signed OIDC JWT → relying party. Stateful and core-touching, on the Modgud (issuance) side.

6.2 Verification — the hot path

The rule-1 path. Diagram: diagrams/verification-path.mermaid (drawn with the core shown unavailable).

Relying party presents a token → Vör checks the signature against the cached JWKS, the clock, and the cached status list → decision, with no core read. This is the property the edge-independence test asserts (ADR-0010). The autonomy is bounded: the edge verifies core-independently only while its cached projections are within their max-age, and fails closed past it (ADR-0010, ADR-0032, ADR-0039).

6.3 Authorization

Forseti evaluates a relationship query ("may principal P do action A on resource R") over the relation graph, optionally fenced by a consistency token when the decision needs read-your-writes (ADR-0006, ADR-0004).

6.4 Revocation propagation

Diagram: diagrams/revocation-propagation.mermaid.

A core revocation write → a CQRS projection → the signed status list (published and edge-cached) plus an urgent NATS push → the edge cache updates → "kill now" takes effect within the freshness budget, the verification path still reading only the projection (ADR-0005, ADR-0022).

6.5 Single sign-on

One SSO session at Modgud mints tokens for many relying parties without re-authenticating; logout ends the session and propagates via the revocation path (ADR-0016).

6.6 Token exchange — SAML/upstream to OIDC (roadmap)

A SAML or upstream-IdP login at Modgud is exchanged (RFC 8693) into a short-TTL OIDC JWT, so the edge verification path is always JOSE/Vör and the front-channel protocol never reaches the hot path (ADR-0017, ADR-0019, ADR-0014). Re-running the §6.2 property with SAML in the issuance path is M6's definition of done.

6.7 Consistency at runtime

Default reads are bounded-staleness and edge-local; a read-your-writes-sensitive decision presents the opaque consistency token and is served only by a replica caught up to it, otherwise routed to the home zone (the region/zone holding the tenant's strongly-consistent authority) (ADR-0004).

6.8 Refresh grant — rotation and reuse detection

The browserless-session path (ADR-0044).

Client presents a refresh token at Modgud → family lookup in the region-local store (the same SessionStore as the SSO session, ADR-0016) → rotation: a new generation is issued and its predecessor invalidated. A predecessor re-presented within the grace window is the legitimate network retry and receives the same successor already issued; past the window it is the theft signal — the family is revoked through its sid-keyed status-list entry and the event feeds the risk pipeline (ADR-0031). Issuance-side and region-local throughout; no strong hot-path write.

6.9 Logout propagation

The end-to-end kill path (ADR-0016, ADR-0044).

RP-initiated logout at Modgud → the session ends → one sid-keyed status-list entry plus an urgent NATS push (ADR-0005) → the edges reject every token the session minted within the freshness budget → back-channel logout tokens (carrying the same sid) are POSTed to the relying parties the session record lists. Verification never reads the session; it sees only the status-list projection.

6.10 Key rotation

The V5 scenario (ADR-0023).

A new kid is published to the JWKS, the publish-before-sign lead exceeding the edge staleness bound → the edges refresh the JWKS (distribution-key-signed, its counter and max-age checked per ADR-0043) → signing cuts over to the new kid → the retiring kid stays published at least as long as the max token TTL → no in-flight token is orphaned.