Closes the "wanted movie, no file" gap: search every indexer, cache each
candidate with its verdict and score, send the best eligible one to
Transmission with its label and both seeding limits, and record the Grab.
Restarting mid-flight cannot double-grab. A title with a live grab is not
a gap, selection is a total order over the candidate set, and the add is
keyed on the infohash, so a crash between the add and the insert heals on
the next tick instead of leaving a second torrent.
The policy row to arr-core mapping moves into arr-db, where both the
manual-search API and the daemon read it, instead of being copied.
PRs #63 and #65 were each green pre-merge but changed and consumed
the same arr-core surface; merging both broke main. Size bands are
now gibibytes with a points penalty, evaluate takes size_bytes, and
Policy carries score_weights (column wiring tracked in #68).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Eleven empty crates per DESIGN.md §11, versions and lints pinned once in the
root manifest, Justfile carrying the §12 gate, nix dev shell.
The frontend steps in `just ci` no-op until web/ exists. arr-core carries one
placeholder test because `cargo nextest` fails a zero-test run, and relaxing
that would let a broken filter go green later.
Closes#1
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>