Failure 1 · Merging
pip pools every index
- Private index: acme-billing-utils 1.4.2
- Public index: acme-billing-utils 9000.0.0
- One candidate pool, no source priority
- Highest version that fits wins
Fix: one index, or a per-name source (uv)
Failure 2 · Misrouting
npm asks the wrong registry
- Laptop .npmrc maps @acme to the private registry
- CI image has no .npmrc
- GET registry.npmjs.org/@acme%2fauth
- Attacker registered @acme on npmjs.com
Fix: commit the scope map, own the scope
Failure 3 · Proxy merge
The proxy adds upstream versions
- Internal shared-utils 1.3.0, tagged latest
- Proxy adds 66 public versions, up to 2.0.1
- "^2.0.0": latest does not satisfy it
- Highest public match is chosen
Fix: no upstream proxy for private names
