feat: Automate reviewed SynapseML-to-Fabric releases - #2628
feat: Automate reviewed SynapseML-to-Fabric releases#2628Rana Singh (ranadeepsingh) wants to merge 10 commits into
Conversation
|
Azure Pipelines: There may be pipelines that require an authorized user to comment /azp run to run. |
|
Hey Rana Singh (@ranadeepsingh) 👋! We use semantic commit messages to streamline the release process. Examples of commit messages with semantic prefixes:
To test your commit locally, please follow our guild on building from source. |
c763701 to
2822d0b
Compare
## Summary Refresh the release automation on current master, align it with the Fabric release guide and the live Publish-Official pipeline, and add proof-oriented coverage for release identifiers, artifact verification, GitHub workflows, and BBC-VHD edits. ## Prompting Intent Refresh microsoft/SynapseML PR microsoft#2628 using the SynapseML PR readiness loop, follow the internal Fabric release guide, and derive automation from actual prior OSS, Internal, Publish-Official, and BBC-VHD releases rather than relying on stale examples. ## Linked Sources - Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2 - Release automation PR: microsoft#2628 - Derivative tag automation: microsoft#2540 - Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3 - Publish-Official pipeline: https://msdata.visualstudio.com/A365/_build?definitionId=35879 - Historical BBC-VHD release PR: https://msdata.visualstudio.com/A365/_git/BBC-VHD/pullrequest/1805064 ## Rationale Keep ESRP, review, White-Glove, and train decisions human-gated while automating deterministic mechanics. Tag the exact reviewed merge, dispatch downstream GitHub automation explicitly because GITHUB_TOKEN pushes do not recurse, gate release notes on public artifacts, use the live pipeline parameter contract, fail loudly on incomplete network evidence, and roll back paired BBC-VHD writes rather than leaving partial release state. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
/azp run |
|
Azure Pipelines: There may be pipelines that require an authorized user to comment /azp run to run. |
|
Azure Pipelines: Successfully started running 1 pipeline(s). |
There was a problem hiding this comment.
Pull request overview
This PR adds release-engineering automation to make SynapseML-to-Fabric releases more deterministic and reviewable, including a GitHub Actions “prepare → tag merged commit → publish notes” flow plus supporting Python tooling to derive/verify release identifiers and safely bump BBC-VHD pins.
Changes:
- Introduces a release matrix generator (
release_matrix.py) and an end-to-end verifier (verify_release.py) with accompanying tests. - Adds
bump_bbcvhd.py(plus tests) to safely update BBC-VHD component pins while preserving line endings and rolling back on failure. - Adds/updates GitHub workflows for release prepare/tagging and manual, artifact-gated release notes; enables
workflow_dispatchfor PR validation so release PRs created viaGITHUB_TOKENcan be validated.
Show a summary per file
| File | Description |
|---|---|
| scripts/test_bump_version.py | Extends bump-version tests for denylisted repo-relative paths; normalizes path keys to POSIX. |
| scripts/bump-version.py | Improves Windows console encoding robustness; adds path-based denylist support; normalizes path handling via as_posix(). |
| scripts/release/release_matrix.py | Adds a single-source-of-truth release matrix for tags and artifact versions + CLI rendering. |
| scripts/release/verify_release.py | Adds live verification of GitHub/ADO tags and Maven/PyPI/UPack/Azure Artifacts presence. |
| scripts/release/bump_bbcvhd.py | Adds deterministic, rollback-safe BBC-VHD component pin updater with CRLF/LF preservation. |
| scripts/release/README.md | Documents how to use the new release tooling and where it fits in the guide. |
| scripts/release/test_release_matrix.py | Adds regression/contract tests for the release matrix derivations and CLI validation. |
| scripts/release/test_verify_release.py | Adds unit tests for verifier networking/error handling and run plan behavior. |
| scripts/release/test_bump_bbcvhd.py | Adds tests for BBC-VHD bump idempotency, rollback, and newline preservation. |
| scripts/release/test_release_workflows.py | Adds tests asserting key workflow contract properties (manual gating, dispatch behavior). |
| scripts/release/test_prev_tag.sh | Adds a repo-taglist regression script for “previous primary tag” selection logic. |
| .github/workflows/release-prepare.yml | Adds a reviewed release PR generator and a merged-commit tagger that dispatches downstream orchestration. |
| .github/workflows/release-notes.yml | Adds a manual, artifact-gated GitHub Release publisher with explicit previous-tag selection. |
| .github/workflows/pr-validation.yml | Enables workflow_dispatch so validations can be dispatched for bot-opened release PR branches. |
Review details
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Suppressed comments (1)
scripts/release/verify_release.py:260
--skip internaldoes not currently skip the internal PyPI feed checks (thesynapseml_internalpackage); it only skips internal git tag checks. This makes--skip internalbehave inconsistently compared with--skip public.
def pip(self, package: str, version: str) -> str:
if "pip" in self.skip or "ado" in self.skip:
return SKIPPED
# Azure Artifacts normalises pypi names: synapseml_internal -> synapseml-internal
return (
OK
if version
in self._feed_versions("Synapse-Conda", "pypi", package.replace("_", "-"))
else MISSING
)
- Files reviewed: 14/14 changed files
- Comments generated: 2
- Review effort level: Lite
## Summary Make --skip internal consistently skip SynapseML-Internal tags, UPacks, and wheels while retaining OSS artifact checks, and document every skip scope with regression coverage. ## Prompting Intent Resolve all current-head automated review findings on microsoft/SynapseML PR microsoft#2628 and preserve an explicit, safe release-verification CLI contract. ## Linked Sources - Release automation PR: microsoft#2628 - Internal artifact skip review: microsoft#2628 (comment) - Skip help review: microsoft#2628 (comment) ## Rationale A release operator who opts out of Internal verification must not still query or fail on Internal packages. Passing artifact scope explicitly keeps OSS checks active, avoids hiding public release gaps, and makes combined skip behavior predictable from both CLI help and maintainer documentation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
/azp run |
|
Azure Pipelines: Successfully started running 1 pipeline(s). |
There was a problem hiding this comment.
Review details
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
scripts/release/verify_release.py:75
- On Windows,
subprocess.run(..., shell=True)expects a command string, but this code passes a list. That combination can fail (or behave differently) on win32, which would break the fallback ADO auth path even whenazis installed. Build a platform-appropriate command (string forshell=True, list otherwise).
out = subprocess.run(
[
"az",
"account",
"get-access-token",
"--resource",
ADO_RESOURCE,
"--query",
"accessToken",
"-o",
"tsv",
],
capture_output=True,
text=True,
shell=(sys.platform == "win32"),
)
- Files reviewed: 14/14 changed files
- Comments generated: 0 new
- Review effort level: Lite
## Summary Build the Azure CLI authentication command as a string only when Windows requires shell execution, while retaining an argument list and shell-free execution on other platforms. Add regression coverage for both command shapes. ## Prompting Intent Resolve the current-head suppressed Copilot review finding on microsoft/SynapseML PR microsoft#2628 and prove the fallback authentication path used by release verification on Windows. ## Linked Sources - Release automation PR: microsoft#2628 - Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2 ## Rationale Windows resolves the Azure CLI through a command shim, so the verifier needs shell execution there; subprocess requires that shell command to be a string. Keeping list-based execution elsewhere preserves safe argument boundaries, while an actual token-less Windows replay proves the fallback can authenticate and inspect the live release. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Addressed the current-head suppressed Windows auth finding in 6e80f27.
|
|
/azp run |
|
Azure Pipelines: Successfully started running 1 pipeline(s). |
There was a problem hiding this comment.
Review details
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
scripts/release/verify_release.py:313
- The Maven publication gate here verifies only
synapseml-core_{scala}(viapublic_maven()), but the workflow-generated release notes advertisecom.microsoft.azure:synapseml_2.12:${VERSION}(see.github/workflows/release-notes.yml:137) and the docs use thesynapseml_2.12coordinate (website/doctest.py:25). This can letverify_release.pyreport COMPLETE even if the primary install coordinate is missing (or vice versa). Consider aligning the verification to check the same Maven artifact(s) that users are instructed to consume (e.g., verify bothsynapseml_{scala}andsynapseml-core_{scala}, or switch to the canonical one).
"maven",
tp.key,
f"synapseml-core_{tp.scala}",
tp.oss_maven_version,
c.public_maven(tp.scala, tp.oss_maven_version),
- Files reviewed: 14/14 changed files
- Comments generated: 0 new
- Review effort level: Lite
## Summary Gate release completeness on both the user-facing synapseml_<scala> Maven coordinate and the release-guide synapseml-core_<scala> coordinate for every selected Spark target. Add a failing-install-coordinate regression and document the two-coordinate contract. ## Prompting Intent Resolve the current-head suppressed Copilot review finding on microsoft/SynapseML PR microsoft#2628 by aligning artifact verification with generated release notes, installation docs, and actual published releases. ## Linked Sources - Release automation PR: microsoft#2628 - Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2 - Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3 ## Rationale The aggregate synapseml artifact is the coordinate users install and the one release notes advertise, while the guide explicitly points maintainers to synapseml-core. Requiring both prevents a GitHub Release from reporting complete when either the public install contract or the guide's Maven evidence is absent. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Addressed the current-head suppressed tag-sort portability finding in c511a98.
|
|
/azp run |
|
Azure Pipelines: Successfully started running 1 pipeline(s). |
|
Azure build 232335424 failed only in Fabric E2E; the other 65 jobs succeeded. The failing |
|
/azp run |
|
Azure Pipelines: Successfully started running 1 pipeline(s). |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #2628 +/- ##
==========================================
+ Coverage 87.24% 87.26% +0.02%
==========================================
Files 338 338
Lines 20055 20055
Branches 2044 2044
==========================================
+ Hits 17496 17501 +5
+ Misses 2559 2554 -5 🚀 New features to boost your workflow:
|
|
Final current-head CI triage for
The exact remaining engineering blocker is the shared Fabric test service/account outage; required maintainer approval is also still outstanding. |
|
/azp run |
|
Azure Pipelines: Successfully started running 1 pipeline(s). |
Automates the mechanical parts of the SynapseML Fabric release so the remaining human work is decision-making and approvals. Fixes to scripts/bump-version.py (it currently FAILS on master): - PR microsoft#2589 (CDN migration) rewrote "docs/Reference/R Setup.md" to per-module archive names (synapseml-core-1.1.3.zip) and added VerifyRCodegen.scala with hardcoded version strings. Neither is matched by the existing patterns, so the script hard-fails and would block the next release. Added a generic "-{V}.zip" line anchor plus file anchors for VerifyRCodegen. - _detect_version() read docusaurus.config.js without an encoding, raising UnicodeDecodeError on a cp1252 console. - analyze() and the EXPECTED_FILES manifest check compared str(rel), which yields backslashes on Windows and never matches the "/" paths in the anchor tables, producing false "not updated" warnings. - Non-ASCII status output crashed on a cp1252 console *after* files had been rewritten, leaving a half-applied bump behind a non-zero exit. - Added DENYLIST_PATHS for files whose basename is too common to denylist safely. New tooling in scripts/release/: - release_matrix.py derives every tag, UPack version, pip version and BBC-VHD value from one input version. One release spans 7 tags per repo and 4 mutually inconsistent naming conventions; notably the OSS UPack package mangles spark dots to dashes (1.1.3-spark4-0) while the Internal package preserves them (1.1.3-0-spark4.0). - verify_release.py checks every tag and artifact against the matrix. Worth running even on a green publish pipeline, because several of its publish steps use continueOnError: true. - bump_bbcvhd.py applies a release to a BBC-VHD component, replacing the most error-prone hand-edit in the process. New workflows: - release-prepare.yml opens the version-bump PR. Two of the last four bumps landed as unsigned direct pushes to master with no PR. - release-notes.yml publishes the GitHub Release on a vX.Y.Z tag. v1.1.1 has a tag but no Release, which made v1.1.3's auto-generated notes span two releases; the workflow pins the diff base to the previous primary tag so notes stay correct regardless. Expected values in the tests are transcribed from live v1.1.1 and v1.1.3 data, so a failure means the tooling has drifted from what was actually shipped. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary Refresh the release automation on current master, align it with the Fabric release guide and the live Publish-Official pipeline, and add proof-oriented coverage for release identifiers, artifact verification, GitHub workflows, and BBC-VHD edits. ## Prompting Intent Refresh microsoft/SynapseML PR microsoft#2628 using the SynapseML PR readiness loop, follow the internal Fabric release guide, and derive automation from actual prior OSS, Internal, Publish-Official, and BBC-VHD releases rather than relying on stale examples. ## Linked Sources - Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2 - Release automation PR: microsoft#2628 - Derivative tag automation: microsoft#2540 - Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3 - Publish-Official pipeline: https://msdata.visualstudio.com/A365/_build?definitionId=35879 - Historical BBC-VHD release PR: https://msdata.visualstudio.com/A365/_git/BBC-VHD/pullrequest/1805064 ## Rationale Keep ESRP, review, White-Glove, and train decisions human-gated while automating deterministic mechanics. Tag the exact reviewed merge, dispatch downstream GitHub automation explicitly because GITHUB_TOKEN pushes do not recurse, gate release notes on public artifacts, use the live pipeline parameter contract, fail loudly on incomplete network evidence, and roll back paired BBC-VHD writes rather than leaving partial release state. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary Make --skip internal consistently skip SynapseML-Internal tags, UPacks, and wheels while retaining OSS artifact checks, and document every skip scope with regression coverage. ## Prompting Intent Resolve all current-head automated review findings on microsoft/SynapseML PR microsoft#2628 and preserve an explicit, safe release-verification CLI contract. ## Linked Sources - Release automation PR: microsoft#2628 - Internal artifact skip review: microsoft#2628 (comment) - Skip help review: microsoft#2628 (comment) ## Rationale A release operator who opts out of Internal verification must not still query or fail on Internal packages. Passing artifact scope explicitly keeps OSS checks active, avoids hiding public release gaps, and makes combined skip behavior predictable from both CLI help and maintainer documentation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary Build the Azure CLI authentication command as a string only when Windows requires shell execution, while retaining an argument list and shell-free execution on other platforms. Add regression coverage for both command shapes. ## Prompting Intent Resolve the current-head suppressed Copilot review finding on microsoft/SynapseML PR microsoft#2628 and prove the fallback authentication path used by release verification on Windows. ## Linked Sources - Release automation PR: microsoft#2628 - Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2 ## Rationale Windows resolves the Azure CLI through a command shim, so the verifier needs shell execution there; subprocess requires that shell command to be a string. Keeping list-based execution elsewhere preserves safe argument boundaries, while an actual token-less Windows replay proves the fallback can authenticate and inspect the live release. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary Gate release completeness on both the user-facing synapseml_<scala> Maven coordinate and the release-guide synapseml-core_<scala> coordinate for every selected Spark target. Add a failing-install-coordinate regression and document the two-coordinate contract. ## Prompting Intent Resolve the current-head suppressed Copilot review finding on microsoft/SynapseML PR microsoft#2628 by aligning artifact verification with generated release notes, installation docs, and actual published releases. ## Linked Sources - Release automation PR: microsoft#2628 - Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2 - Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3 ## Rationale The aggregate synapseml artifact is the coordinate users install and the one release notes advertise, while the guide explicitly points maintainers to synapseml-core. Requiring both prevents a GitHub Release from reporting complete when either the public install contract or the guide's Maven evidence is absent. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary Make the SBT launcher download fail fast with actionable HTTP errors and transient retries, and invoke the release verifier through the guaranteed Python 3 executable on Ubuntu. Lock both workflow contracts with tests. ## Prompting Intent Resolve both current-head suppressed Copilot findings on microsoft/SynapseML PR microsoft#2628 without changing the release approval or publication flow. ## Linked Sources - Release automation PR: microsoft#2628 - Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2 ## Rationale A failed launcher download should stop at the network boundary rather than creating a corrupt tool that fails later, and release publication must not depend on an optional python alias. Explicit curl failure semantics, bounded retries, and python3 make failures early and deterministic while preserving all human gates. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary Insert the release test directory explicitly before importing verify_release and bump_bbcvhd, matching the existing release-matrix test pattern. This keeps collection independent of pytest's default path-prepend behavior. ## Prompting Intent Resolve both current-head Copilot review threads on microsoft/SynapseML PR microsoft#2628 and prove the release tests collect under alternate pytest import modes. ## Linked Sources - Release automation PR: microsoft#2628 - Verifier import review: microsoft#2628 (comment) - BBC-VHD import review: microsoft#2628 (comment) ## Rationale Relying on pytest's default import mode makes test collection sensitive to runner configuration. Explicitly locating sibling modules is already the repository convention for release_matrix and allows these suites to run consistently from the repository root and under importlib collection. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary Normalize whitespace around rebuild-counter values and reject empty target keys directly in parse_iterations. Add positive whitespace and negative empty-target regression cases. ## Prompting Intent Resolve the current-head suppressed Copilot finding on microsoft/SynapseML PR microsoft#2628 and make release counter errors actionable at the CLI parsing boundary. ## Linked Sources - Release automation PR: microsoft#2628 - Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2 ## Rationale Rebuild counters are operator-entered recovery controls for immutable artifacts. Empty targets should fail as malformed KEY=N input rather than surfacing later as an unknown target, while spacing around a numeric value should not turn an otherwise valid recovery command into an error. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary Replace GNU sort -V in the release tag-history regression helper with Python 3 semantic-version ordering, reuse the sorted primary-tag stream, and support environments where the Python 3 executable is named either python3 or python. ## Prompting Intent Resolve the current-head suppressed Copilot portability finding on microsoft/SynapseML PR microsoft#2628 while preserving validation against the repository's complete historical tag list. ## Linked Sources - Release automation PR: microsoft#2628 - Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3 ## Rationale Contributor-side release evidence should run on macOS/BSD as well as GNU systems. Python 3 is already a release-tooling dependency and provides deterministic numeric tuple ordering without relying on platform-specific sort flags; consuming the full stream also avoids early-pipeline termination behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary`nPrevent the secret-bearing legacy Fabric E2E job from initializing for fork pull requests, while preserving Fabric validation for trusted branch and same-repository builds. Add a pipeline contract test for the fork guard. ## Prompting Intent`nRefresh release automation PR 2628 to merge-ready quality under the SynapseML PR loop, following the Fabric release guide and prior release evidence without bypassing checks or exposing credentials to untrusted code. ## Linked Sources`n- Release automation PR: https://github.com/microsoft/SynapseML/pull/2628`n- SynapseML Fabric E2E guidance: https://github.com/microsoft/SynapseML/blob/master/.github/skills/fabric-e2e/SKILL.md`n- Legacy identity failure: https://msdata.visualstudio.com/A365/_build/results?buildId=232344356`n- Service-connection diagnostic build: https://msdata.visualstudio.com/A365/_build/results?buildId=232398344`n- Release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2 ## Rationale`nGuard the complete Fabric job rather than individual secret-loading steps so no credential-fetching task initializes on a fork agent. This retains the blocking Fabric lane everywhere it can run safely, avoids falsifying the failed status, and avoids replacing a delegated-user Power BI client with a service principal that the live diagnostic proved receives HTTP 401. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
685dd36 to
0c7690d
Compare
| fork_guard = ( | ||
| r"ne\(\s*variables\[['\"]System\.PullRequest\.IsFork['\"]\]," | ||
| r"\s*['\"]True['\"]\s*\)" | ||
| ) | ||
| assert re.search(fork_guard, condition) |
| out = subprocess.run( | ||
| subprocess.list2cmdline(command) if use_shell else command, | ||
| capture_output=True, | ||
| text=True, | ||
| shell=use_shell, | ||
| ) |
What
Automates the deterministic parts of the SynapseML-to-Fabric release as a reviewed, fail-closed flow. A release engineer provides one OSS version; the tooling derives the Git tags, current
SynapseML-Publish-Officialparameters, public/internal artifact versions, and BBC-VHD values without retyping incompatible naming conventions.This complements #2540: that PR owns derivative tags and Spark release-branch PRs; this PR owns the reviewed version bump, exact merged-commit tag, release matrix, artifact proof, GitHub Release, and BBC-VHD edit.
Release flow
master, validatesX.Y.Z, applies the context-anchored bump, rebuilds/version-snapshots docs, opens the release PR, and explicitly dispatches branch validation (PRs opened withGITHUB_TOKENdo not recursively trigger workflows).release_matrix.pyemits all OSS/Internal tags and artifact values plus a copy-pasteaz pipelines runcommand for live pipeline 35879. The live pipeline now accepts a base version, Internal patch, and target booleans; this supersedes the guide's older hand-entered-ref example.verify_release.pyverifies GitHub and Internal tags, public Maven CDN and PyPI publication, and every selected UPack/Synapse-Conda artifact. Network/auth/API-shape failures are errors, not missing-artifact lookalikes.vX.Y.ZRelease after every public target exists, and generates notes against the immutable tag rather than a movingmaster.bump_bbcvhd.pyupdates the two package pins and component revision while preserving CRLF/LF, rejecting accidental reruns, and rolling both files back if either write or post-condition fails.Guide mapping and human gates
setup.sh+version.txtupdateNo ADO PAT or approval credential is stored in GitHub. The cross-system approval boundary remains explicit.
Evidence from shipped releases
v1.1.3replay: 33/33 GitHub, ADO, Maven, PyPI, UPack, and Synapse-Conda checks present.v1.1.1Spark 4.0 replay reproduces the independent OSS rebuild counter (1.1.1-spark4-0-1) with all selected checks present.v1.1.1Release object cannot make a later release span multiple versions.Compatibility and failure contract
Validation
283 passed: complete bump-version and release-tool regression suite, including negative, pagination, auth-skip, rollback, CRLF, idempotency, workflow-contract, historical replay, and live-repo coverage tests.black==22.3.0: clean across the repository.actionlint 1.7.12: clean across all workflows.1.1.3 -> 1.1.4): 143 anchored replacements across 21 files, zero unanchored references, no writes.62faf4e5fa5e5f367a00e21a94496f958eb68fadafter moving tomaster57c799b834080681defec358925ef2a7d5d5eb95.Sources