## TL;DR
pip found no version matching the requirement on the configured indexes. Check the package name spelling, confirm the version actually exists on the index, and look at any pin or extra index URL that narrows the search. Then widen or correct the requirement and reinstall.

## Error

```text
pip 'ERROR: Could not find a version that satisfies the requirement X' after an upgrade
```

## Steps

1. Read the full error: pip lists the versions it found, which tells you whether the index has the package at all.
   Expected output: You see either an empty version list (wrong name or index) or a list that excludes your pin.
2. Verify the name and the index: check the spelling, and confirm any extra index URL or index URL in pip config or the requirements file points where you think.
   Expected output: The name is correct and the index serves the package.
3. Check the pin: an exact pin on a yanked version, or a range that excludes everything published, produces this exact error.
   Expected output: You find the over-strict pin or the yanked version.
4. Fix and reinstall: correct the name, widen the range, or point at the right index, then pip install -r [requirements file].
   Expected output: pip resolves and installs the requirement.
5. For an upgrade that introduced it, diff the requirements before and after to see which line changed.
   Expected output: The offending line is identified and the team knows what moved.

## When to use

- pip fails with could not find a version that satisfies the requirement after an upgrade
- A new pin or a new index config changed what pip can see
- The error lists versions but none match; the constraint is too strict

## When not to use

- pip reports conflicting dependencies instead; that is a resolver clash, not a missing version
- The failure is a network timeout reaching the index; fix connectivity first
- The package needs a newer python; that surfaces as a different error about requires-python

## Variant phrasings

### pip could not find a version after adding an extra index
The index config shape; check URL typos and whether the index needs auth.

### No matching distribution found for a yanked version
Yanked versions are invisible to fresh resolves; move the pin to a live version.

### pip finds versions but the pin matches none
The over-strict pin shape; widen the range or drop the exact pin.

## Why it happens

pip only considers versions the configured indexes serve that also satisfy every constraint: the requirement string, the python version, and the platform tags. An upgrade can break this by pinning a version that was yanked, by pointing at an index that lacks the package, or by a typo nobody noticed because the old line never re-resolved.

## Edge cases

- Private indexes that proxy PyPI can lag; a brand-new release may simply not be mirrored yet.
- requires-python filters versions silently; the error lists what pip saw, not why each was rejected, so check the package's python support.
- pip normalizes names, so case and dash style rarely matter, but a wrong name still matches nothing.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_Av4ua7rP9r3WkjJ7zpSfFQ
