Fetching from the wire…
Public story · 2026-07-23 · high
Seth Larson's change closes a path where a compromised maintainer account could poison an old, trusted release.
Why now: Simon Willison covered Larson's write-up in his July 23 roundup, the same day GitHub detailed its bug bounty overhaul.
PyPI now rejects file uploads to any release more than 14 days old, per Seth Larson's write-up covered by Simon Willison. The mechanism is simple. A compromised maintainer account could quietly attach a new wheel or sdist to a release that shipped years ago. Nobody re-audits a pin that old, so every project trusting that version inherits the risk silently.
Version pinning is supposed to be a safety mechanism. This closes the loophole that turned it into a liability.
If you run release automation that backfills wheels or sdists onto older versions, that automation is about to start failing. Willison flags this directly, and the failure won't throw a clear error. It'll just quietly stop uploading, and you'll notice only when a downstream build breaks.
Go check those pipelines now, before the failure finds you.
This lands the same day GitHub restructured its bug bounty program around researcher experience instead of payout mechanics, according to the GitHub Blog. Different problem, same instinct: package ecosystems and the platforms around them are tightening process, the same quarter agents started publishing packages themselves.
A 14-day upload window on old releases is a small, specific control. It fits a world where the thing checking a release before install might not be a person.
Each link below shares sources, entities, or timing with this story.
Simon Willison uses Claude Code / Shared entities / Same source domain / Earlier coverage
Linked by a graph relationship (Simon Willison uses Claude Code); both cover GitHub, GitHub Blog; reported by the same outlet (github.blog).
Simon Willison released LLM / Shared entities / Same source domain / Earlier coverage
Linked by a graph relationship (Simon Willison released LLM); both cover Nobody, Simon Willison; reported by the same outlet (simonwillison.net).
Simon Willison released Datasette / Shared entity: Simon Willison / Same source domain / Shared topic / Earlier coverage
Linked by a graph relationship (Simon Willison released Datasette); both cover Simon Willison; reported by the same outlet (simonwillison.net).
Simon Willison released LLM / Shared entity: Simon Willison / Same source domain / Shared topic / Earlier coverage
Linked by a graph relationship (Simon Willison released LLM); both cover Simon Willison; reported by the same outlet (simonwillison.net).
Simon Willison released Datasette / Shared entity: Simon Willison / Same source domain / Earlier coverage / Tension
Linked by a graph relationship (Simon Willison released Datasette); both cover Simon Willison; reported by the same outlet (simonwillison.net).
Linked by a graph relationship (Simon Willison released Datasette); both cover Simon Willison; reported by the same outlet (simonwillison.net).
Simon Willison uses Claude Code / Shared entities / Same source domain / Earlier coverage
Linked by a graph relationship (Simon Willison uses Claude Code); both cover GitHub, Nobody, Simon Willison; reported by the same outlet (simonwillison.net).
Simon Willison released LLM / Shared entity: GitHub / Shared topic / Earlier coverage
Linked by a graph relationship (Simon Willison released LLM); both cover GitHub; overlapping topics (agent, around, change).