Added

v2.9.0

  • Connect onboarding return lands on /stripe-connect, not the portal root

  • crash-proof the Stripe webhooks and stop them double-sending or lying to Stripe

  • do not ack a Stripe webhook we could not durably record

  • drain gracefully on SIGTERM instead of dying mid-request on every deploy

  • keep WebSocket sessions alive with a server heartbeat, so guest live-updates stop dying

  • merchant.freeze(false) never unfroze anyone, freezing was a one-way door

  • publish the wallet-UI session gauge per pod, so it stops racing, drifting and expiring

  • route Connect onboarding return through /login?redirectPage=/stripe-connect

  • wire WebSocket onclose so closed sockets stop leaking, and stop dead sockets crashing the pod

  • make Stripe webhooks idempotent and durably logged

  • restore the one-way merchant freeze, it is an intentional security kill-switch