Context
release-publish.yaml's workflow_dispatch gained a target: pypi option in PR #638, so #653's manual priming work has a real-PyPI path, not just Test PyPI. It always publishes a synthetic <on-disk-version>.dev0 (never the real release version) through the same pypi-release-<package> environment the automated release path already uses -- no separate approval-gated environment, workflow_dispatch already requires repo write access to trigger, which is gate enough for a disposable priming publish.
This is a bootstrapping tool for priming Trusted Publishers past PyPI's pending-registration rate limit (~3 at a time, applies independently to pypi.org and test.pypi.org), not a permanent fixture. Once every package has a converted (non-pending) Trusted Publisher for the v2.0 launch, there's no more legitimate use for a manual dispatch path straight to production PyPI: it's standing attack surface (a compromised or careless dispatch can put a .dev0 on the real index) with no ongoing purpose after priming is done.
Task
Parent: #653
Context
release-publish.yaml'sworkflow_dispatchgained atarget: pypioption in PR #638, so #653's manual priming work has a real-PyPI path, not just Test PyPI. It always publishes a synthetic<on-disk-version>.dev0(never the real release version) through the samepypi-release-<package>environment the automated release path already uses -- no separate approval-gated environment,workflow_dispatchalready requires repo write access to trigger, which is gate enough for a disposable priming publish.This is a bootstrapping tool for priming Trusted Publishers past PyPI's pending-registration rate limit (~3 at a time, applies independently to pypi.org and test.pypi.org), not a permanent fixture. Once every package has a converted (non-pending) Trusted Publisher for the v2.0 launch, there's no more legitimate use for a manual dispatch path straight to production PyPI: it's standing attack surface (a compromised or careless dispatch can put a
.dev0on the real index) with no ongoing purpose after priming is done.Task
target: pypioption fromrelease-publish.yaml'sworkflow_dispatchonce all 12 packages are primed on real PyPI (drop thetargetinput entirely, sincetest-pypiwould be the only remaining choice).docs/versioning.md's release-flow table (currently line 60), which still describes real-PyPI dispatches as requiring apypi-dispatch-<package>approval environment. That gate doesn't exist: dispatch reusespypi-release-<package>, with no separate approval-gated environment.Parent: #653