- Refund is now idempotent and crash-safe: stamp refunded_at right after the
refund succeeds, then cancel + disconnect best-effort in a try/catch (logged),
and bail if already refunded. Drop the no-op DB::transaction.
- Funnel report attributes users by the variant Pennant actually served (eager
loaded per chunk) instead of recomputing the formula, so it can't drift from
what users experienced.
- Paywall states the exact amount charged today for pay_now (yearly upfront).
- Throttle + block-demo middleware on the refund route; drop the inline check.
- resolve(?User) nullable to match sibling features; resolve the variant once in
offerFor; add French translations.