fix: #3591838 Add unconditional coverage pass so lifecycle event rows land in segments
Lifecycle event rows (segment_archived, segment_transient_purged, segment_live_purged, segment_file_purged, segment_restored) used to accumulate indefinitely on chains with transient_purge_after unset: the transient-purge content filter excluded them (no transient data) and the archive pass's id > max_archived_to_id watermark trapped any row past the most recent archived segment. The result was a slowly growing graveyard of orphan rows the verifier had to walk but no retention pass would ever clean up.
Refactor the cron pipeline around an unconditional coverage pass that mints bare segments for every chain row past the earliest retention threshold not already inside a segment, then advances each downstream pass (transient-purge, archive, live-purge, file-purge) to operate on segments coverage produced. archive() no longer asserts non-overlap or mints residual segments; coverageBucket() treats existing segments as obstacles and subdivides any requested range around them, so overlaps are structurally impossible.
Drush + tugboat archive call sites + ArchiveRange test helper follow the new two-step pattern: coverageBucket then archive.
Closes #3591838