migrate-to-ulid: migrate the union of local + origin v1, report dangling
Commit

Bug: the migration only walked the checkpoint tree it read from the local entire/checkpoints/v1 branch. The local and origin v1 branches can diverge (each machine condenses onto its own before they reconcile), so checkpoints that lived only on origin's v1 were never mapped — and filter-branch left their commit trailers as hex. Observed on a real repo copy: origin/v1 had 381 checkpoints but the run migrated only the stale local subset, leaving ~540 hex trailers.
Fix:
- Walk the UNION of every available v1 source (local entire/checkpoints/v1 AND origin's remote-tracking copy), deduped by checkpoint id, instead of a single tree. v1CheckpointTrees gathers both; missing/unreadable refs are skipped.
- Report trailers that reference a checkpoint absent from every v1 source: those
can't be remapped and will stay hex (genuinely dangling, or origin's tracking
ref is stale — the note tells the user to
git fetchand re-run).
Tests: local-only + origin-only checkpoints both migrate; a checkpoint on both sources migrates once. Verified on the real repo — the dry-run now sees origin's 381 checkpoints and flags the 57 dangling trailers.
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com Entire-Checkpoint: 5dbfec1503fc