When fan-out into multiple buckets, Configure Purchase modal sets PaymentOption='all-upfront' for ALL selected recommendations regardless of what each row's actual payment option is. Single-bucket flow (openPurchaseModal → resolvePerRecPaymentSeed) handles per-rec payment correctly; the multi-bucket fan-out (resolveBucketPaymentSeed in frontend/src/recommendations.ts:3242-3305) seeds from toolbar.payment (=cachedGlobalDefaultPayment, default all-upfront) and never inspects rec.payment. Silently mis-bills users on bulk purchases.
Fix direction
Include payment in the bucket key at recommendations.ts:3156 so recs with different payments fan into separate buckets (each bucket then uniform on payment, seed becomes recs[0].payment). Mirrors the existing 'bundle B' term-key approach. Alternative: extend resolveBucketPaymentSeed to fall back to recs[0].payment when all recs in the bucket share one supported value before falling back to toolbar — less clean.
Surfaced by QA spreadsheet row 5.2.
When fan-out into multiple buckets, Configure Purchase modal sets PaymentOption='all-upfront' for ALL selected recommendations regardless of what each row's actual payment option is. Single-bucket flow (
openPurchaseModal→resolvePerRecPaymentSeed) handles per-rec payment correctly; the multi-bucket fan-out (resolveBucketPaymentSeedinfrontend/src/recommendations.ts:3242-3305) seeds fromtoolbar.payment(=cachedGlobalDefaultPayment, defaultall-upfront) and never inspectsrec.payment. Silently mis-bills users on bulk purchases.Fix direction
Include
paymentin the bucket key atrecommendations.ts:3156so recs with different payments fan into separate buckets (each bucket then uniform on payment, seed becomesrecs[0].payment). Mirrors the existing 'bundle B' term-key approach. Alternative: extendresolveBucketPaymentSeedto fall back torecs[0].paymentwhen all recs in the bucket share one supported value before falling back to toolbar — less clean.Surfaced by QA spreadsheet row 5.2.