Summary
Wire the WebAuthn assertion into the grant approval flow so that approvals require successful biometric/passkey verification via the approval web UI.
Context
This is the core Phase 3 value: instead of approving via Discord reactions, the operator clicks a link, performs a WebAuthn assertion (Face ID, Touch ID, etc.), and the server issues the grant only after successful verification.
Acceptance Criteria
Dependencies
Scope Boundaries
- Does NOT replace Discord notifications (they now include a link instead of / in addition to reaction-based approval)
- Does NOT change client-side injection logic
Summary
Wire the WebAuthn assertion into the grant approval flow so that approvals require successful biometric/passkey verification via the approval web UI.
Context
This is the core Phase 3 value: instead of approving via Discord reactions, the operator clicks a link, performs a WebAuthn assertion (Face ID, Touch ID, etc.), and the server issues the grant only after successful verification.
Acceptance Criteria
POST /api/approve/:requestId— requires valid WebAuthn assertion in request bodyPOST /api/deny/:requestId— requires valid CSRF token (no WebAuthn needed for deny)approval.requireWebAuthn: boolean(default:false)true: only WebAuthn-verified approvals are acceptedfalse: both Discord reactions and WebAuthn are valid (backward compatible)Dependencies
Scope Boundaries