RLS recursion infinite loop: why I gave up policies and bet everything on a JWT custom claims hook
<blockquote> <p>Episode <strong>1/4</strong> — 3 incidents, one root: default GRANTs open more than you think — [CANONICAL URL EPISODE 1: fill in after push]<br> Episode <strong>2/4</strong> — <code>await mutation()</code> lies when nobody opens the <code>{ error }</code> envelope — [CANONICAL URL EPISODE 2: fill in after push]</p> </blockquote> <h2> The morning Françoise sees zero rows, again </h2> <p>It's a Tuesday in April 2026. I've just added the <code>agent_readonly</code> role to the <cod









