-
feat(tide-table): build_delete_manifest — the verdict becomes a delete allowlist · bd3a680f
`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.
PLN (Algolia) authoredbd3a680f
×