814e49cb93
Brainstormed shape locked: JIT-provision local rows on first OIDC sign-in (auth_source='oidc'), YAML-only config (no UI), 'roles' claim with deny-on-no-match default, preferred_username with email fallback, refuse on local-user collision, single provider, login page shows SSO above password (break-glass), front-channel logout only, role re-evaluation at login only. Migration 0019: users.auth_source + users.oidc_subject (partial unique index), sessions.id_token (for end_session id_token_hint), oidc_state table for the OAuth round-trip state, swept on the existing alert-engine tick. Composes with the user-management work from P4-03/04: admin can disable OIDC users like local; last-admin guard catches IdP role- mapping mistakes; audit trail covers JIT-provision via user.created with auth_source payload + new user.oidc_login / user.oidc_login_blocked actions. Out of scope (deferred): back-channel logout, multi-provider, UI-driven role mapping, refresh tokens / mid-session re-eval.