Skip to content

chore: replace yanked multidict - #251

Merged
goloroden merged 3 commits into
mainfrom
chore/replace-yanked-multidict
Aug 1, 2026
Merged

chore: replace yanked multidict#251
goloroden merged 3 commits into
mainfrom
chore/replace-yanked-multidict

Conversation

@goloroden

@goloroden goloroden commented Aug 1, 2026

Copy link
Copy Markdown
Member

Why multidict stayed on a yanked version

multidict 6.3.2 was yanked from PyPI over a memory leak. A yanked release is skipped when a resolver picks versions freshly, but it stays installable when requested exactly — and a lockfile does exactly that.

It survived for one reason: multidict is a transitive dependency of aiohttp and yarl and never appears in pyproject.toml. Dependabot, running as the pip ecosystem until #248, only ever looked at that file. Everything reachable only through the lockfile was therefore unmaintained — the yank just happened to be the one that produced a visible warning.

Nothing was blocking the upgrade: multidict moves to 6.7.1 on its own, no constraint in the way.

Scope

This affects the development and CI environment only. The published wheel declares aiohttp==3.14.x and leaves multidict to the consumer's resolver — which, being a fresh resolution, was skipping the yanked version all along. No user of the library was exposed to the leak.

All 77 tests pass.

Note on detecting future yanks

This PR deliberately does not add an automated yank check. Two approaches were tried and both fail:

  • uv lock --check does not read yank metadata at all when the lockfile is considered valid — verified against CI runs that had multidict 6.3.2 locked and a cold cache, where no warning appeared.
  • uv lock --check --refresh does surface the warning, but breaks the check itself: refreshing discards the metadata cache, and since the lockfile records complete wheel lists, any newly uploaded wheel for any dependency makes it report the lockfile as outdated even when no version changed. That would turn every future PR red at random.

A periodic uv lock --upgrade run is the more promising route — a fresh resolution skips yanked versions by construction, so it prevents the situation instead of detecting it. Tracked separately.

🤖 Generated with Claude Code

https://claude.ai/code/session_01F3ADPwk11GHQF7BBwQHaPz

@goloroden
goloroden requested a review from a team as a code owner August 1, 2026 09:22
multidict 6.3.2 was yanked from PyPI for a memory leak, but a yanked
version stays installable when it is pinned exactly -- which a lockfile
does. It survived because multidict is a transitive dependency of
aiohttp and yarl and therefore never appears in pyproject.toml, so
Dependabot as the pip ecosystem never looked at it. Nothing was holding
it back: it moves to 6.7.1 on its own.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3ADPwk11GHQF7BBwQHaPz
@goloroden
goloroden force-pushed the chore/replace-yanked-multidict branch from 0f866d0 to a5fdb1b Compare August 1, 2026 09:27
@goloroden goloroden changed the title chore: replace yanked multidict and detect future yanks chore: replace yanked multidict Aug 1, 2026
@goloroden
goloroden merged commit 16b6557 into main Aug 1, 2026
4 checks passed
@goloroden
goloroden deleted the chore/replace-yanked-multidict branch August 1, 2026 11:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant