fix: a slot the resolver emptied folds only into a copy of its own song (M498)
release / govulncheck (push) Successful in 16s
release / web (push) Successful in 1m28s
release / go (push) Successful in 1m36s
release / android (push) Successful in 5m2s
release / integration (push) Failing after 5m7s
release / Build signed APK (releases and dev) (push) Successful in 5m12s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Skipped
release / Verify release artifacts (tag releases only) (push) Skipped

On 2026-10-20 the emptied "Open the Gateway" slot of Auvic's Speed Demons
was folded by title into another file tagged "Open the Gateway" that holds
Onward (244 s against the song's 254 s), so the album was never wanted
back. A wrong-slot removal now stamps tracks.emptied_at (migration 0095)
when the album holds no copy of the song as long as its MusicBrainz slot,
and missing-pair folding pairs such a row by title only with a track added
since: a copy fetched again. A slot whose song the album does hold (VOID
DLC's Weeper beside Void's) folds into it as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-20 11:55:23 -04:00
co-authored by Claude Opus 5.5
parent 09e74a57a2
commit 3ebd35e51d
13 changed files with 179 additions and 21 deletions
+5
View File
@@ -25,6 +25,10 @@
-- A pair whose MBIDs are both set and differ is not a title match: the tags say
-- they are different recordings. The caller folds a pair only when each side has
-- exactly one candidate; anything else is ambiguous and left alone.
--
-- A slot the duplicate resolver emptied (emptied_at, migration 0095) pairs by
-- title only with a track added since: the album held no copy of the song as
-- long as it is, so one already there under the title is another song.
WITH grp AS (
SELECT id AS album_id, COALESCE(release_group_mbid, id::text) AS g
FROM albums
@@ -47,6 +51,7 @@ cand AS (
AND lower(p.title) = lower(m.title)
WHERE m.missing_since IS NOT NULL
AND (m.mbid IS NULL OR p.mbid IS NULL OR m.mbid = p.mbid)
AND (m.emptied_at IS DISTINCT FROM m.missing_since OR p.added_at > m.emptied_at)
),
pairs AS (
-- A pair both rules found is one candidate, credited to the stronger rule.