Skip to content

Health duplicates: say why books were grouped; hold another edition's match for review - #131

Merged
KodeStar merged 4 commits into
mainfrom
fix/duplicate-reasons
Oct 14, 2026
Merged

KodeStar merged 4 commits into
mainfrom
fix/duplicate-reasons

Conversation

@KodeStar

Copy link
Copy Markdown
Owner

Fixes #129.

Two books that share an ASIN or ISBN were grouped as duplicates whatever their lengths, and labelled "same title, author and length". The reported pair (The Burning, a 5h57m full-cast dramatization and a 7h13m unabridged reading) got there because a confident auto-match wrote the dramatization's ASIN onto the unabridged book: the community data holds only the dramatized recording, and it scored 90 despite an 18% length gap.

Duplicates

  • New reasons, additive on the wire: same_id (a shared ASIN/ISBN, matching lengths) and id_length_differs (a shared ASIN/ISBN whose group lengths don't match). Order: id_length_differs > same_files > same_id > same_book.
  • Lengths are judged across the whole group (shortest vs longest known), so a book of unknown length can't bridge two recordings into "copies"; an unknown length is no evidence they differ.
  • One pass per identifier instead of comparing every pair.
  • The console shows a warning and no "Worth keeping" / "Another copy" badges for id_length_differs, so it never nudges deleting a different recording.

Matching

  • A match is confident only when the recording's length is within 10% of the book's (meta.PlausibleRuntimeOff, now shared with the scorer). A refresh run holds such a book for review too.

Docs: KodeStar/audiosilo-docs (docs/duplicate-reasons).

Follow-ups not in this PR: the community data lacks the Guidall unabridged recording of The Burning (and the work's title lacks "[Dramatized Adaptation]"); a review item held for length carries no detail saying why.

…n the lengths differ (#129)

Duplicate groups now carry the reason their joins support: same_id (a shared
ASIN or ISBN of matching lengths) and id_length_differs (a shared identifier of
lengths that don't match, every pair of its holders compared) beside same_files
and same_book. id_length_differs outranks even identical audio, as such a group
holds a different recording. The console words each reason and, for
id_length_differs, marks no copy as the one to keep and says what to check.
…fident

The closest recording of a work can be another edition: the unabridged The
Burning (7h 13m) scored 90 against a work holding only its 357-minute
dramatization, 24 ahead of the next, and took its ASIN unasked. Such a match is
now left for review. CLAUDE.md: the duplicate reasons and the length rule.
…for review

A shared ASIN/ISBN joins its holders in one pass, judged by the shortest and longest
known lengths (an unknown length is no evidence they differ). The 10% band is
meta.PlausibleRuntimeOff and meta.RuntimeOff, shared by the scorer and lengthFits, which
a refresh run now applies too. The reason constants are package-private, the
metaKey join marks nothing, and the console's warning is a StatusText.
A group a shared identifier joined differs when its shortest and longest known lengths
do, so a book of unknown length can't bridge two recordings into copies. The ignored
view drops the 'say they're different books' advice, fixtures carry their own lengths,
and the refresh comments name the length hold.
@KodeStar
KodeStar merged commit f1705e5 into main Oct 14, 2026
3 checks passed
@KodeStar
KodeStar deleted the fix/duplicate-reasons branch October 14, 2026 10:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Health duplicates: books sharing an ASIN/ISBN are grouped whatever their length, under the wrong reason

1 participant