Search failures are now reported instead of being returned as "no results".
A Hardcover rate limit, auth failure or timeout reached the user as an empty
result list — indistinguishable from "this book does not exist" — with nothing
logged and a 200 response. That is why the two outages fixed in v1.0.1 took
hours to diagnose.
What changed
search_booksno longer discards exceptions from its page fetches. A total
failure raises, and the search routes translate it into theerrorfield
their response contract already carried. A partial failure still returns the
pages that worked.- The Hardcover client moved to
services/hardcover.pyso search and the sync
engine share one implementation. Interactive lookups may spend the reserve
that background linking holds back, and now contribute to quota tracking. - The frontend was discarding the
errorfield entirely, so even the existing
"API key not configured" case had always rendered as "No results found". It
now shows the reason with a retry link. get_series_missingandget_author_also_bywrote their result into a
14-day metadata cache before checking it, so a momentary outage became a
fortnight of "this series has no books". Failures are no longer cached.