Commit bd3a680f by PLN (Algolia)

feat(tide-table): build_delete_manifest — the verdict becomes a delete allowlist

`sc_generation_lens` already knows which OPAL-26 uploads are the Aug-12 first
cut; nothing turned that verdict into something the new `sc delete --manifest`
could execute. This does, and it is the last checkpoint before a destructive
call, so it refuses rather than warns.

In: verdicts starting STALE/ORPHAN (right permalink, wrong cut) plus every
stray (an older cut under another slug). Out, and asserted out: verdict OK
(that IS the ear-verified cut), NOT UPLOADED (nothing to delete), anything
without an sc_id, and everything in `coincidences_discarded` — the lens finds
strays by duration and on a 132-track account two unrelated tracks will share
a length to 50 ms, which is how /au-revoir-lord-toyota (2020, and PUBLIC) and
/saria-demo (2025) both matched an OPAL render. The date floor is re-applied
here instead of trusting the file's own bucket names: two chances to catch a
mistake whose cost is permanent.

Every entry carries a reason citing the evidence, the artwork the pull saved,
and the local render the upload came from — all fourteen resolve to a FLAC in
Opal26_master/tracks/, so deleting these loses a URL and not a recording.

One bug found while writing it, and it is the reason the reason strings matter:
the first version lined a stale upload up against the newest cut BY TRACK
NUMBER, and the Aug-12 cut had fifteen tracks where v4 has fourteen. Dropping
Desire renumbered REVOLUTION from 15 to 14, so the manifest claimed
"#14 Desire, 388.1s vs v4 205.6s" — 205.6s is REVOLUTION's length. A
measurement is a comparison; an unnamed reference cites the wrong track. The
lookup is keyed on the title slug now, and a track absent from the newest cut
says so instead of borrowing a neighbour's duration.

Dry-run against the live account: 14/14 resolved, both directions, all private,
nothing refused. Nothing deleted — that is PLN's call.
parent ec9c7d4b
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment