Caller surface: oauthModule({ clientRepository, codeRepository, express? })
→ oauthModule({ config }).
All dependencies now flow through the typed DI graph (requires / optional).
Route contributions (Amendment 1):
"oauth-endpoints" @ /oauth — always contributed.
"oidc-discovery" @ /.well-known/openid-configuration — conditional on
config.oauth.jwt.issuer being a non-empty string.
The v0.4.x lazy closure () => context.federationProviders is REMOVED.
deps.federationProviders is the typed, stable read at factory invocation
time (Theme E structural fix).
grantPolicy and refreshTokenFamilyRevocation are declared as
ComponentMap slots (colocated augmentations in core/src/policy/types.mts
and core/src/refresh-token-family/types.mts). Both are consumed by
routes.mts — grantPolicy.evaluate gates /oauth/token, and
refreshTokenFamilyRevocation.isFamilyRevoked is read by introspect,
userinfo, logout cascade, and federation-token. The legacy
RefreshTokenStoreBase slot was removed in issue #101 (A3 §5.3).
Theme B (one responsibility per module), Theme C (no synthetic-key redeclaration),
Theme D (immutability — const defineModule, no ctx mutation),
Theme E (structural temporal contracts — stable deps closure replaces lazy getter).
Declarative manifest for the OAuth 2.0 endpoint suite.
Per A2-γ §3.2.1 + Amendment 1 (§1.1.1 routes-factory shape) + Amendment 3 (§1.1.3 grantHandlerResolver synthetic dep) + Amendment 4 (§1.1.4 four-store session split).
Caller surface:
oauthModule({ clientRepository, codeRepository, express? })→oauthModule({ config }). All dependencies now flow through the typed DI graph (requires/optional).Route contributions (Amendment 1):
The v0.4.x lazy closure
() => context.federationProvidersis REMOVED.deps.federationProvidersis the typed, stable read at factory invocation time (Theme E structural fix).grantPolicyandrefreshTokenFamilyRevocationare declared as ComponentMap slots (colocated augmentations incore/src/policy/types.mtsandcore/src/refresh-token-family/types.mts). Both are consumed byroutes.mts—grantPolicy.evaluategates/oauth/token, andrefreshTokenFamilyRevocation.isFamilyRevokedis read by introspect, userinfo, logout cascade, and federation-token. The legacyRefreshTokenStoreBaseslot was removed in issue #101 (A3 §5.3).Theme B (one responsibility per module), Theme C (no synthetic-key redeclaration), Theme D (immutability — const defineModule, no ctx mutation), Theme E (structural temporal contracts — stable deps closure replaces lazy getter).