move handles to D1; render is a single JOIN
the KV approach did 1,651 parallel gets per build, blowing past the
worker 1,000-subrequest ceiling. the scheduled handler was silently
getting cut before it could cache the payload — explains why cron
kept firing but last_published_at never advanced.
handles now live in D1, render is a LEFT JOIN on pushes + handles,
single query. cascade logic writes to D1 via UPSERT. KV is unused
for this worker now.
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>