The hash lives in the database and the file does not, so a file deleted behind the app's back went on refusing its own replacement. Matches are now checked against disk, and re-adding a book's own missing file writes it back into the row that already describes it.