nightowl:migrate's completeness checks only ever looked at floors, so a
rollup that froze stayed frozen across every deploy. Completeness now also
compares ceilings, with a two-hour tolerance because bucket starts are event
time and created_at is the drain-insert clock.
Also: probe both raw families per tick in the concurrency recompute (prune's
v1-EOL DROP was 42P01'ing it silently), fork health-alert dispatch off the
event loop (one unreachable SMTP host held it 30s), make nightowl_ddsketch_agg
linear via a bigint[] state (migration 000070; 14d percentile read 103s ->
0.48s), add the ROLLUP_STALE diagnosis, and unblock drop-v1-histograms behind
the new aggregate.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>