The bug
With zero indexers configured/enabled, IndexerSearchWorkflow.SearchIndexersAsync logged a warning and then returned GenerateMockIndexerResults(query): five synthetic releases with fabricated titles, sizes, and URLs. Because this method also serves the automatic-search path, those fake releases flowed into real scoring and the grab decision, where one could be selected and handed to a download client.
This is not only reachable by a manual search click: AutomaticSearchService (a BackgroundService on a five-minute initial delay and recurring interval) also calls SearchAsync(isAutomaticSearch: true), so on an install with no indexers configured yet the fake releases enter scoring unattended, on a timer. The fabricated entries carry realistic qualities (MP3 64kbps through FLAC), sizes, and non-zero seeders; the only tell is the Mock Indexer source string, which nothing in the pipeline gates on.
The fix
Zero indexers now returns an empty result set with a clear warning ("No indexers configured or enabled; search returned no results"). Both GenerateMockIndexerResults overloads are deleted — a repo-wide search (backend, tests, fe/) found no other consumers, and no dev/debug flag gated them.
Tests
SearchIndexers_NoIndexersConfigured_ReturnsEmptyWithoutSyntheticResults
Full suite green: 1190 passed / 0 failed; dotnet format --verify-no-changes clean.
🤖 Generated with Claude Code
Automated Canary build