A failed transfer failed the whole download. On Soulseek the usual
failure is one peer being offline or refusing, and a popular album has
several other peers offering the same folder; the ranked list that
names them was already held in m.results and nothing walked it.
grab now loops: when a candidate's transfer fails, or delivers too
little of the album to import, the next candidate is tried in its
place, up to three in all. Three rules keep that honest:
- Only a candidate auto-pick would itself have accepted is offered, so
a second choice clears the same match, quality and guardrail gates
as the first.
- On Soulseek the failure is the peer's, so every folder that peer
offered is skipped with it; elsewhere only the failed release is.
- A candidate the user picked by hand does not fall back. They chose
that copy, and quietly substituting another is a decision they did
not make.
The same change fixes auto-pick grabbing the wrong candidate.
AutoPickVeto judges the best candidate inside the user's guardrails,
but Start and Attempt then grabbed ranked[0] -- so when the overall best
was over the size ceiling, the veto passed on the strength of the
second and the first was downloaded anyway: the one copy the user had
said not to take unattended. autoPick returns the candidate the veto
actually judged.
Closes#263
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017HJiuc3ZZhxsPXz3ozTirT