fix(remote): matching no datasets is a failure, not a quiet success master
`remote pull` returned success=True and exit 0 when discovery matched nothing, which is indistinguishable from "the scope is already in sync". That is how the --push-to source bug survived: an OWI mirror ran nightly against a specifier that could never match, recorded success every time, and moved nothing for weeks. Shipping the --push-to fix unblocks that mirror but leaves the next failure of this shape equally invisible. Zero *discovered* datasets now returns success=False with ErrorType.DATA and ExitCode.DATA_ERROR, naming the specifier -- "no datasets" without it sends the reader looking in the wrong place. The HTTP job layer maps success=False to a failed job, so API callers see it too. Deliberately narrow. "Nothing to transfer" stays a success and stays exit 0: that case has datasets and simply finds their files already present, and conflating the two would make an idle mirror look broken every night. Both are now pinned by tests, including the counter-case. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019nPNpEG2QRnmjxxn5LeEb7