On Settings > Manage Plan, a free user who ticked 'Allow AI categorization'
silently recorded consent. That flipped hasActiveAiConsent() to true, which
made the EnsureUserIsSubscribed middleware hard-redirect them to the paywall on
the next navigation and removed the 'Continue for free' escape hatch — locking
them out of the app with no explanation.
Now, for a free user, ticking the box opens a contextual dialog explaining AI is
a paid feature and offering Monthly/Annual plans that start Stripe checkout. No
consent is recorded, so nothing locks them out; dismissing the dialog leaves the
app fully usable. Pro users keep the direct-consent behavior, and a free user
who already has consent can still untick to revoke and escape the lock.
Add vitest coverage for the free (modal, no POST), pro (direct consent) and
revoke paths, and drop the now-inaccurate 'you can give consent now' note.