This gate is leaking. The teaser-story row has status: approved but
an empty approved_by — someone flipped the status without putting a
name on it — and the current gate schedules it anyway. In September
that's an unreviewed AI draft going out under the brand's name.
Fix publish_queue so a row needs BOTH status == "approved" AND a
non-empty approved_by to reach the queue.
Expected output:
queue: 2 rows
09-02 launch-email -> approved by dana
09-05 winback -> approved by sam
The break is on lines 11, 12 — but read the whole snippet first.