- CratesIOSource searches crates.io JSON API with custom User-Agent header - RubyGemsSource searches rubygems.org search.json API for gem matches - Both credentialless; CratesIO 1 req/s burst 1, RubyGems 1 req/2s burst 2 - Tests verify User-Agent header, Sweep findings, ctx cancellation, metadata