From 29a476fc606213180bf69f730c0f9a13d081b1c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yi=C4=9Fitcan=20=C3=96zt=C3=BCrk?= <318303091+yigitcan-ozturk@users.noreply.github.com> Date: Sat, 29 Aug 2026 22:48:23 +0300 Subject: [PATCH 1/2] chore: remove one-time release verifier --- .github/workflows/verify-v0.2.0-release.yml | 124 -------------------- 1 file changed, 124 deletions(-) delete mode 100644 .github/workflows/verify-v0.2.0-release.yml diff --git a/.github/workflows/verify-v0.2.0-release.yml b/.github/workflows/verify-v0.2.0-release.yml deleted file mode 100644 index 66bdb8e..0000000 --- a/.github/workflows/verify-v0.2.0-release.yml +++ /dev/null @@ -1,124 +0,0 @@ -name: Verify rfqdiff v0.2.0 Release - -on: - push: - branches: [main] - paths: - - ".github/workflows/verify-v0.2.0-release.yml" - -permissions: - contents: read - -jobs: - verify-release: - runs-on: ubuntu-latest - steps: - - name: Check out repository - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - - name: Download published wheel - env: - GH_TOKEN: ${{ github.token }} - run: | - mkdir -p "$RUNNER_TEMP/release" - gh release download v0.2.0 \ - --pattern "rfqdiff-0.2.0-py3-none-any.whl" \ - --dir "$RUNNER_TEMP/release" - - - name: Verify published wheel digest - run: | - python - <<'PY' - import hashlib - import os - from pathlib import Path - - wheel = Path(os.environ["RUNNER_TEMP"]) / "release" / "rfqdiff-0.2.0-py3-none-any.whl" - digest = hashlib.sha256(wheel.read_bytes()).hexdigest() - expected = "858a0c7a7b0caf69f4b1f22843363edd8d14cad4553564539abcbc33ec878fa5" - assert digest == expected, (digest, expected) - PY - - - name: Clean-install published wheel - run: | - python -m venv "$RUNNER_TEMP/release-venv" - "$RUNNER_TEMP/release-venv/bin/python" -m pip install --upgrade pip - "$RUNNER_TEMP/release-venv/bin/python" -m pip install \ - "$RUNNER_TEMP/release/rfqdiff-0.2.0-py3-none-any.whl" - "$RUNNER_TEMP/release-venv/bin/rfqdiff" --help - - - name: Run representative released comparison - run: | - cat > "$RUNNER_TEMP/quotes.csv" <<'CSV' - name,currency,price,lead_time_weeks,payment_days - Supplier A,EUR,84200,8,30 - Supplier B,EUR,79400,14,0 - CSV - - "$RUNNER_TEMP/release-venv/bin/rfqdiff" \ - "$RUNNER_TEMP/quotes.csv" \ - --json > "$RUNNER_TEMP/result.json" - - "$RUNNER_TEMP/release-venv/bin/rfqdiff" \ - "$RUNNER_TEMP/quotes.csv" \ - --report "$RUNNER_TEMP/comparison.xlsx" - - - name: Validate released output contract - run: | - "$RUNNER_TEMP/release-venv/bin/python" - <<'PY' - import json - import os - from pathlib import Path - from openpyxl import load_workbook - - root = Path(os.environ["RUNNER_TEMP"]) - payload = json.loads((root / "result.json").read_text(encoding="utf-8")) - - assert payload["tool"] == "rfqdiff", payload - assert payload["version"] == "0.2", payload - assert payload["recommended_supplier"] == "Supplier A", payload - assert payload["decision_summary"]["runner_up"]["name"] == "Supplier B", payload - assert payload["decision_summary"]["score_margin"] == 30.0, payload - assert payload["decision_explanation"]["criterion_leaders"] == { - "price": "Supplier B", - "lead_time": "Supplier A", - "payment_terms": "Supplier A", - }, payload - - winner = payload["suppliers"][0] - assert winner["score"] == 97.1, winner - assert winner["score_breakdown"] == { - "price": 47.1, - "lead_time": 30.0, - "payment_terms": 20.0, - }, winner - source = winner["rfqdiff_source"] - assert source["file"] == "quotes.csv", source - assert source["format"] == "csv", source - assert source["row"] == 2, source - assert len(source["sha256"]) == 64, source - - workbook = load_workbook(root / "comparison.xlsx", read_only=True, data_only=True) - try: - assert workbook.sheetnames == ["Comparison", "Summary"], workbook.sheetnames - comparison = workbook["Comparison"] - summary = workbook["Summary"] - assert comparison["C2"].value == "Supplier A" - assert comparison["B2"].value is True - assert summary["B2"].value == "Supplier A" - finally: - workbook.close() - PY - - - name: Upload release verification evidence - uses: actions/upload-artifact@v4 - with: - name: rfqdiff-v0.2.0-release-verification - path: | - ${{ runner.temp }}/result.json - ${{ runner.temp }}/comparison.xlsx - if-no-files-found: error From 47c5b1e887301bbffb67f642a6670f594adb220e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yi=C4=9Fitcan=20=C3=96zt=C3=BCrk?= <318303091+yigitcan-ozturk@users.noreply.github.com> Date: Sat, 29 Aug 2026 22:48:38 +0300 Subject: [PATCH 2/2] docs: close v0.2.0 release checklist --- .github/RELEASE_CHECKLIST_v0.2.0.md | 53 +++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/.github/RELEASE_CHECKLIST_v0.2.0.md b/.github/RELEASE_CHECKLIST_v0.2.0.md index 2f51220..f896fe5 100644 --- a/.github/RELEASE_CHECKLIST_v0.2.0.md +++ b/.github/RELEASE_CHECKLIST_v0.2.0.md @@ -1,8 +1,12 @@ -# rfqdiff v0.2.0 release checklist +# rfqdiff v0.2.0 release checklist — completed -Current package metadata: `0.2.0` -Current machine-readable contract: `0.2` -Latest published GitHub Release before this checklist: `v0.1.0` +Release status: **COMPLETED** +Release date: **2026-08-29** +Package metadata: `0.2.0` +Machine-readable contract: `0.2` +Git tag: `v0.2.0` +Tagged release commit: `63b074284954a9ae04b80e3b290e4f6427df690d` +GitHub Release: `rfqdiff v0.2.0` ## Preconditions completed @@ -15,21 +19,40 @@ Latest published GitHub Release before this checklist: `v0.1.0` - [x] Wheel and source-distribution build validation - [x] Installed-wheel CLI smoke test outside repository checkout - [x] End-to-end CSV → JSON + XLSX report smoke test -- [x] `CHANGELOG.md` prepared for v0.2.0 +- [x] Sanitized industrial golden RFQ pilot +- [x] `supplier-scorecard` RFQdiff v0.2 consumer-contract verification +- [x] Multi-tool Phase 2 procurement pilot verification +- [x] `CHANGELOG.md` finalized for v0.2.0 -## Publication steps +## Publication completed -- [ ] Change `CHANGELOG.md` heading from `[0.2.0] - Unreleased` to the actual release date. -- [ ] Create Git tag `v0.2.0` at the release-ready `main` commit. -- [ ] Publish GitHub Release `rfqdiff v0.2.0` from that tag. -- [ ] Use the v0.2.0 changelog section as the release notes baseline. -- [ ] Verify the release page points to the intended commit and source archives. -- [ ] Re-run/confirm the `main` GitHub Actions workflow is green at the tagged commit. -- [ ] Run a clean install check from the release artifact and execute `rfqdiff --help`. -- [ ] Run one representative comparison and verify recommendation, score breakdown, provenance and report export. +- [x] Changed `CHANGELOG.md` heading to `[0.2.0] - 2026-08-29`. +- [x] Created annotated Git tag `v0.2.0` at release commit `63b074284954a9ae04b80e3b290e4f6427df690d`. +- [x] Published GitHub Release `rfqdiff v0.2.0` from that tag. +- [x] Used the v0.2.0 changelog section as the release-notes baseline. +- [x] Verified the release page, source archives and downloadable distribution assets. +- [x] Confirmed the normal `main` test workflow is green at the tagged release commit (`33271631667`). +- [x] Downloaded the published wheel from the GitHub Release and verified its SHA-256 digest. +- [x] Clean-installed the published wheel into a fresh Python 3.11 virtual environment and executed `rfqdiff --help`. +- [x] Ran a representative released comparison and verified recommendation, runner-up, score margin, score breakdown and provenance. +- [x] Generated and validated an XLSX comparison report using the published wheel. +- [x] Stored post-release evidence in GitHub Actions artifact `rfqdiff-v0.2.0-release-verification` from run `33271772371`. + +## Published artifacts + +- `rfqdiff-0.2.0-py3-none-any.whl` + SHA-256: `858a0c7a7b0caf69f4b1f22843363edd8d14cad4553564539abcbc33ec878fa5` +- `rfqdiff-0.2.0.tar.gz` + SHA-256: `8a716802ed14312c5cd785161b08760d9f1a54a4569101673f2b58cdc3ce9e17` + +## Post-release verification + +Post-release verification workflow run `33271772371` completed successfully against the actual published wheel. The verifier downloaded the GitHub Release asset, checked its digest, installed it cleanly, ran a representative commercial comparison, validated the JSON v0.2 contract and generated an XLSX report. The ordinary `main` test workflow on the post-release verification commit (`33271772506`) also completed successfully. + +The temporary release-publisher and post-release-verifier workflows were intentionally removed after successful execution so the repository does not retain one-off publication machinery. ## Release boundary v0.2.0 is the commercial quotation-comparison release. FX normalization remains in `currency-normalizer`, technical compliance remains in `bidlint`, and broader supplier risk remains outside `rfqdiff`. -No new scoring criteria should be added as part of the release publication step. +No new scoring criteria were added as part of release publication or verification.