The §4a branching, as a pure function so both completion shapes stay
testable without a browser:
confirm-on-client (Stripe): the confirm result is already terminal.
tokenize-first (Paysafe): confirm yields a clientToken; the host's
onServerCompletion must call its own API route, which calls
PaymentService.completePayment. Either way the caller sees one PayResult.
The §4a branching, as a pure function so both completion shapes stay testable without a browser: