The home rows send popular:true genres:<slug>. The card feeder had no genre
handling (it served trending/daily), and the gateway drops a record without a
genres/<Name> key when a genres filter is present, so every genre row came back
empty.
A popular row with genres now searches subject:"<subject>" sorted by readinglog
(the same reader-shelving signal as trending, cut by genre) and stamps
genres/<Name> on each card. Up to three genres per row, deduplicated, the
trending path unchanged.
compute_outcomes still passed the identifier-only lookup's Option<String> to
into_discovery_record, which now takes the binding (CI: E0308). Both paths now
call bind(): the identifier, else the title match for an etext Open Library
lists under no work, so a redeemed record is bound exactly as its search record
was.
Two reasons a book's page in meta-read showed no Gutenberg edition, both found
on the live stack with Frankenstein (OL450063W, etext 84):
- An edition was bound to its work only when Open Library's search lists the
etext under exactly one work (id_project_gutenberg). For many classics it
lists it under none: no edition of OL450063W carries etext 84. Such an etext
is now bound by title and author: same main title (main_title), an author
with the same surname, and the most published of those works, since Open
Library holds many small "Frankenstein" works by Mary Shelley. The record
carries the same claim plus anchorMethod=title, so the gateway records
matchedBy/openlibrary:OL...W and meta-read grades it Matched, below an
identifier binding. An etext several works list (an unmerged duplicate)
still gets no binding: gutenberg_etext keeps "several" apart from "none".
- A work page asks for openlibraryid:OL...W with no text, which fell through to
the catalogue browse (the 32 most downloaded books), so a book outside them
never reached its own page. Such a query now searches Gutendex for the work's
main title and its first author's surname (work_search_text); the gateway
still keeps only the records bound to the work.
Tests: title binding graded Matched while an identifier binding stays
Anchored; a work query searches "frankenstein shelley"; main_title, surname,
the most-published choice, ties and non-matches; Etext one/several/unlisted
and its cache form.
github.com/worph/meta-feeder-sdk answers 404, so a clean build could not fetch
the dependency; the same tag lives on gitea-watch at the same commit (v1.7.0 =
027917c8), so only the source URL changes, in Cargo.toml and Cargo.lock.
The repo had only the image workflow; test.yml runs cargo test --locked and
clippy -D warnings, like meta-read's.