Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f3cf9ee
chore: stage release gate implementation
Nagi-Inaba Aug 23, 2026
a91eeec
chore: trigger release gate application on PR
Nagi-Inaba Aug 23, 2026
a69be6b
chore: restage release gate implementation safely
Nagi-Inaba Aug 23, 2026
9cc5a8f
fix: normalize staged release gate tests
Nagi-Inaba Aug 23, 2026
bc7b557
fix: format staged release verification sources
Nagi-Inaba Aug 23, 2026
1c63295
chore: rerun release gate application with current workflow
Nagi-Inaba Aug 23, 2026
311b78a
fix: preserve release build job compatibility
Nagi-Inaba Aug 23, 2026
0c36b7b
chore: rerun release gates with compatible job identifiers
Nagi-Inaba Aug 23, 2026
b3150a6
fix: validate shared distribution artifact semantically
Nagi-Inaba Aug 23, 2026
04c7eaa
fix: preserve generated project-test indentation
Nagi-Inaba Aug 23, 2026
12075d0
fix: align release artifact contract with verification job
Nagi-Inaba Aug 23, 2026
c9b7440
chore: expose reconstructed release implementation for review
Nagi-Inaba Aug 23, 2026
d1cce0d
chore: include workflow files in reconstructed snapshot
Nagi-Inaba Aug 23, 2026
814aefc
fix: accept the uv dist marker without weakening artifact checks
Nagi-Inaba Aug 23, 2026
210084b
chore: add temporary release-gate materializer
Nagi-Inaba Aug 23, 2026
5994e5f
chore: materialize verified release-gate files
Nagi-Inaba Aug 23, 2026
48253ad
fix: remove temporary materializer before repository verification
Nagi-Inaba Aug 23, 2026
1d895ad
chore: exempt temporary materializer literals from line-length lint
Nagi-Inaba Aug 23, 2026
3f7de02
fix: retain tracked materializer during boundary verification
Nagi-Inaba Aug 23, 2026
cbb0028
fix: format the temporary materializer before full checks
Nagi-Inaba Aug 23, 2026
d143424
fix: normalize every release build dependency assertion
Nagi-Inaba Aug 23, 2026
ba870b1
chore: commit verified non-workflow release files
Nagi-Inaba Aug 23, 2026
7fe8384
fix: remove formatted temporary materializer forcefully
Nagi-Inaba Aug 23, 2026
f9926e7
ci: verify release artifacts across three operating systems
Nagi-Inaba Aug 23, 2026
fe61fdb
ci: install verified release workflows
Nagi-Inaba Aug 23, 2026
7278cf5
test: require offline sdist subprocess verification
Nagi-Inaba Aug 23, 2026
945d138
fix: run sdist build and install verification offline
Nagi-Inaba Aug 23, 2026
b94135f
chore: repair staged release gate contract
Nagi-Inaba Aug 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ jobs:
wheel-e2e:
name: Installed wheel on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
timeout-minutes: 20
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
Expand All @@ -85,15 +85,21 @@ jobs:
- name: Sync locked dependencies
run: uv sync --frozen --all-groups

- name: Build wheel
run: uv build --wheel
- name: Build wheel and source distribution
run: uv build

- name: Verify installed setup and doctor
run: >-
uv run --frozen python scripts/verify_wheel_install.py
--dist-dir dist
--source tests/fixtures/synthetic_pmgs

- name: Verify sdist-derived installed setup and doctor
run: >-
uv run --frozen python scripts/verify_sdist_install.py
--dist-dir dist
--source tests/fixtures/synthetic_pmgs

python-313-wheel-e2e:
name: Installed wheel on Python 3.13
runs-on: ubuntu-latest
Expand Down
272 changes: 247 additions & 25 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ permissions:

jobs:
build:
name: Verify and build Python distributions
name: Build one fixed Python distribution set
runs-on: ubuntu-latest
timeout-minutes: 30
timeout-minutes: 20

steps:
- name: Check out tagged source
Expand All @@ -27,14 +27,6 @@ jobs:
python-version: "3.12"
enable-cache: true

- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: "22"
cache: npm
cache-dependency-path: worker/package-lock.json
package-manager-cache: false

- name: Sync locked dependencies
run: |
uv lock --check
Expand All @@ -45,42 +37,274 @@ jobs:
RELEASE_TAG: ${{ github.ref_name }}
run: uv run --frozen python scripts/verify_release_tag.py --tag "$RELEASE_TAG"

- name: Verify repository boundary
- name: Verify repository boundary before build
run: uv run --frozen python scripts/verify_repository_boundary.py

- name: Build wheel and source distribution once
run: uv build --clear

- name: Verify the exact distribution set
run: uv run --frozen python scripts/verify_distribution_set.py --dist-dir dist

- name: Upload fixed distributions
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: python-distributions
path: dist/*
if-no-files-found: error
retention-days: 7
compression-level: 0

verify-linux:
name: Release verification on Linux
needs: build
runs-on: ubuntu-latest
timeout-minutes: 40

steps:
- name: Check out tagged source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Install uv and Python
uses: astral-sh/setup-uv@ae62891fec2bb8e7d6c99fc78c9fec3a63790f8d # v10.0.0
with:
version: "0.10.12"
python-version: "3.12"
enable-cache: true
- name: Sync locked dependencies
run: uv sync --frozen --all-groups
- name: Download fixed distributions
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: python-distributions
path: dist
- name: Verify Python source and tests
run: |
uv run --frozen python scripts/verify_repository_boundary.py
uv run --frozen ruff check .
uv run --frozen ruff format --check .
uv run --frozen mypy src
uv run --frozen pytest -q
- name: Verify installed wheel
run: >-
uv run --frozen python scripts/verify_wheel_install.py
--dist-dir dist
--source tests/fixtures/synthetic_pmgs
- name: Verify isolated sdist build and install
run: >-
uv run --frozen python scripts/verify_sdist_install.py
--dist-dir dist
--source tests/fixtures/synthetic_pmgs
- name: Build determinism report
run: >-
uv run --frozen python scripts/verify_synthetic_determinism.py
--source tests/fixtures/synthetic_pmgs
--policy tests/fixtures/publication-policy.yaml
--output determinism-Linux.json
- name: Upload determinism report
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: release-determinism-Linux
path: determinism-Linux.json
if-no-files-found: error
retention-days: 7

- name: Verify Worker and WebMCP source
verify-windows:
name: Release verification on Windows
needs: build
runs-on: windows-latest
timeout-minutes: 40

steps:
- name: Check out tagged source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Install uv and Python
uses: astral-sh/setup-uv@ae62891fec2bb8e7d6c99fc78c9fec3a63790f8d # v10.0.0
with:
version: "0.10.12"
python-version: "3.12"
enable-cache: true
- name: Sync locked dependencies
run: uv sync --frozen --all-groups
- name: Download fixed distributions
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: python-distributions
path: dist
- name: Verify Python source and tests
run: |
npm --prefix worker ci
npm --prefix worker run verify
uv run --frozen python scripts/verify_repository_boundary.py
uv run --frozen ruff check .
uv run --frozen ruff format --check .
uv run --frozen mypy src
uv run --frozen pytest -q
- name: Verify installed wheel
run: >-
uv run --frozen python scripts/verify_wheel_install.py
--dist-dir dist
--source tests/fixtures/synthetic_pmgs
- name: Verify isolated sdist build and install
run: >-
uv run --frozen python scripts/verify_sdist_install.py
--dist-dir dist
--source tests/fixtures/synthetic_pmgs
- name: Build determinism report
run: >-
uv run --frozen python scripts/verify_synthetic_determinism.py
--source tests/fixtures/synthetic_pmgs
--policy tests/fixtures/publication-policy.yaml
--output determinism-Windows.json
- name: Upload determinism report
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: release-determinism-Windows
path: determinism-Windows.json
if-no-files-found: error
retention-days: 7

- name: Build wheel and source distribution
run: uv build
verify-macos:
name: Release verification on macOS
needs: build
runs-on: macos-latest
timeout-minutes: 40

- name: Verify the installed wheel
steps:
- name: Check out tagged source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Install uv and Python
uses: astral-sh/setup-uv@ae62891fec2bb8e7d6c99fc78c9fec3a63790f8d # v10.0.0
with:
version: "0.10.12"
python-version: "3.12"
enable-cache: true
- name: Sync locked dependencies
run: uv sync --frozen --all-groups
- name: Download fixed distributions
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: python-distributions
path: dist
- name: Verify Python source and tests
run: |
uv run --frozen python scripts/verify_repository_boundary.py
uv run --frozen ruff check .
uv run --frozen ruff format --check .
uv run --frozen mypy src
uv run --frozen pytest -q
- name: Verify installed wheel
run: >-
uv run --frozen python scripts/verify_wheel_install.py
--dist-dir dist
--source tests/fixtures/synthetic_pmgs

- name: Upload verified distributions
- name: Verify isolated sdist build and install
run: >-
uv run --frozen python scripts/verify_sdist_install.py
--dist-dir dist
--source tests/fixtures/synthetic_pmgs
- name: Build determinism report
run: >-
uv run --frozen python scripts/verify_synthetic_determinism.py
--source tests/fixtures/synthetic_pmgs
--policy tests/fixtures/publication-policy.yaml
--output determinism-macOS.json
- name: Upload determinism report
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: python-distributions
path: dist/*
name: release-determinism-macOS
path: determinism-macOS.json
if-no-files-found: error
retention-days: 7
compression-level: 0

compare-synthetic-determinism:
name: Compare release determinism
needs: [verify-linux, verify-windows, verify-macos]
runs-on: ubuntu-latest
timeout-minutes: 10

steps:
- name: Check out tagged source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Install uv and Python
uses: astral-sh/setup-uv@ae62891fec2bb8e7d6c99fc78c9fec3a63790f8d # v10.0.0
with:
version: "0.10.12"
python-version: "3.12"
- name: Download determinism reports
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: release-determinism-*
path: determinism-reports
merge-multiple: true
- name: Compare stable contracts
run: >-
uv run --python 3.12 --no-project python scripts/compare_determinism_reports.py
--directory determinism-reports

verify-distributions:
name: Verify fixed distribution metadata and hashes
needs: build
runs-on: ubuntu-latest
timeout-minutes: 10

steps:
- name: Check out tagged source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Install uv and Python
uses: astral-sh/setup-uv@ae62891fec2bb8e7d6c99fc78c9fec3a63790f8d # v10.0.0
with:
version: "0.10.12"
python-version: "3.12"
- name: Download fixed distributions
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: python-distributions
path: dist
- name: Verify artifact set
run: >-
uv run --python 3.12 --no-project python scripts/verify_distribution_set.py
--dist-dir dist

verify-worker:
name: Verify Cloudflare Worker on Node 22
runs-on: ubuntu-latest
timeout-minutes: 20

steps:
- name: Check out tagged source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: "22"
cache: npm
cache-dependency-path: worker/package-lock.json
package-manager-cache: false
- name: Verify Worker and WebMCP source
run: |
npm --prefix worker ci
npm --prefix worker run verify

publish-pypi:
name: Publish to PyPI after approval
needs: build
needs:
- build
- verify-linux
- verify-windows
- verify-macos
- compare-synthetic-determinism
- verify-distributions
- verify-worker
runs-on: ubuntu-latest
timeout-minutes: 15
environment:
Expand All @@ -96,7 +320,6 @@ jobs:
with:
name: python-distributions
path: dist

- name: Publish with trusted publishing and attestations
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
with:
Expand All @@ -117,7 +340,6 @@ jobs:
with:
name: python-distributions
path: dist

- name: Create the GitHub Release
env:
GH_TOKEN: ${{ github.token }}
Expand Down
Loading
Loading