The verification of 62adccd found the 2FA composable conversion was incomplete:
PaymentModal.svelte (admin Take Payment on the today page — a live saved-card
charge surface) still re-implemented the 2FA gate inline while the composable's
own doc listed it as one of the six surfaces. This completes the refactor:
- Removed inline twoFactorCode/reveal2FACodeInput/show2FACodeInput/
missing2FACode/requesting2FACode/handleRequestNew2FACode state (74 -> 21 net
lines) and the now-unused requestNewTwoFactorCode import
- Composable call mirrors the TillPurchases admin reference: enabled() => true
(admin supplies the CUSTOMER's code), gateActive() => twoFactorEnforced &&
customerTwoFactorEnabled (byte-identical semantics)
- Rewired request body, success handler, 403 self-heal, focus effect, and the
TwoFactorCodeInput/request-button/Pay-button bindings to the composable
- Zero inline gate patterns remain in the payments components dir
Frontend 72/72 tests + build + eslint clean; backend 26/26 packages.