Problem
The release workflow performs expensive verification and immutable publication in one job. If PyPI publication succeeds and a later step fails, PyPI can contain an immutable version with no finalized GitHub Release or attached provenance. Re-running is not a safe recovery because the version already exists.
Test selection, parallelism, and timeout sizing are now owned by #344. This issue owns the publication transaction and recovery model.
Target design
- A read-oriented verification job builds/validates the exact candidate and produces a content-addressed artifact handoff.
- A publication job starts only after verification succeeds and consumes that exact handoff.
- A draft GitHub Release exists before PyPI publication.
- PyPI publication occurs once.
- The draft is finalized only after all required release assets are attached and validated.
Acceptance criteria
Non-goals
Problem
The release workflow performs expensive verification and immutable publication in one job. If PyPI publication succeeds and a later step fails, PyPI can contain an immutable version with no finalized GitHub Release or attached provenance. Re-running is not a safe recovery because the version already exists.
Test selection, parallelism, and timeout sizing are now owned by #344. This issue owns the publication transaction and recovery model.
Target design
Acceptance criteria
cancel-in-progress: false.uv publishand finalized afterward.Non-goals