v2.2.0 — Checkout reservation and purchasability
Host-integration seams for self-serve provider checkout, building on 2.1's administrative seams. SubscriptionService::reserveCheckoutFor() creates idempotent, non-entitling, origination-bound reservations before provider I/O, with guarded replacement and exact-origination release. A new non_renewing status projects stop-renewal cancellations while preserving entitlements exactly until the paid period's end, with a never-resurrect guard for terminally canceled rows. The projector gains an additive outcome-returning entry point with deterministic rejection codes (including origination_mismatch), and the strict Payvia bridge writes durable accepted/rejected acknowledgements to payvia ^2.5's checkout-origination ledger after receipt commit. Plans gain per-gateway provider_identifiers (migration 008) — the sole checkout-purchasability authority, read through the typed PlanPurchasability::forGateway() projection; the legacy scalar provider_price_id remains correlation-compatibility only, and existing plans require explicit operator configuration to become purchasable. On PATCH, provider_identifiers is a full-map replacement. All additive; existing 2.0/2.1 callers unchanged.