fix: coalesce expiry_threshold MAX to avoid NULL three-valued logic
If the boundary epoch has no blocks, MAX(tx.id) returns NULL and the `expired` predicate evaluates to NULL instead of FALSE, which silently drops every row from BOTH `expired=true` and `expired=false` filter results. COALESCE to 0 so the predicate is always a real boolean and the "fails open" comment in the file is actually true. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>