Cashier 16.9.0 has no handler for invoice.payment_failed and treats past_due as inactive, so valid() is false from the first failed renewal while Stripe's recommended Smart Retries window runs for up
The same predicates treat paused as valid, so choosing Stripe's pause outcome keeps granting access unless you block that status yourself.
A past_due_since column set from the event's created time, plus a ladder of full access for 7 days, read-only to day 14, then blocked, matched Stripe's retry window in a 21-day timeline test.