Skip to content

ci: make SynapseML releases approved and resumable - #2628

Open
Rana Singh (ranadeepsingh) wants to merge 25 commits into
microsoft:masterfrom
ranadeepsingh:release-automation-plan
Open

Rana Singh (ranadeepsingh) wants to merge 25 commits into
microsoft:masterfrom
ranadeepsingh:release-automation-plan

Conversation

@ranadeepsingh

@ranadeepsingh Rana Singh (ranadeepsingh) commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

What changed

Make repeated OSS releases and independent Internal releases plan-driven and
resumable, with reviewed sources, explicit publication approval, durable
recovery records and immutable package coordinates.

  • Derive and seal release plans; reject duplicate JSON members and overwritten plan files.
  • Preview work before publication, record intent/build IDs, and resume only authorized missing work.
  • Bind Maven and private-feed producers to exact source tags and commits, then require artifact receipts.
  • Recover missing derivative tags at recorded reviewed merge commits without moving existing tags.
  • Isolate ESRP staging, reject linked output paths, and reject incomplete publication requests explicitly.
  • Document preview, recovery and rollout limits, with current links to release guide v3.

September 22 refresh

Head: 3f7d9fcf376212b721fad69c3b8291e2c5cf142a

Integrated master: 681bd96990c421de3b91d2b1bf8f8f470764199d

Rebased all 24 original commits and preserved their complete messages. The
conflict resolutions retain master's current review-artifact guidance and
two-commit checkout for E2E impact detection, alongside the release PR's full
history/tag checkout and publication admission guards.

The incoming E2E pipeline contract initially failed with KeyError: 'fetchDepth'.
A test-only follow-up now checks both checkout modes and the unique named impact
step. No release implementation or release workflow changed during this refresh.

Fresh local evidence:

  • Release and CI-helper contracts: 959 passed, 1 skipped, 63 subtests passed.
  • Native Windows version-bump/history contracts: 228 passed.
  • Black 22.3.0 and whitespace checks passed.
  • The one skipped check explicitly requires SYNAPSEML_TEST_RELEASE_SBT=1;
    no fresh SBT runtime result is claimed.
  • Source-tree and test-file hashes confirm the final integration is identical
    to the tested bytes. Incoming master changes outside the original PR paths
    were preserved.

The bounded direct integration review is appended to
the existing follow-up report.
Earlier multi-model reviews and Azure preview results remain historical evidence,
not current-head CI or review approval.

Remaining gates

Fresh current-head Azure merge validation and automated review are being requested
after this update. Their absence or an old-head result is not a pass. See the
current Checks and review threads for results.

These existing findings still require disposition:

Human last-push approval and applicable companion-pipeline gates remain.
No release tags, production publication, approvals or rollout changes were
performed. This PR is not being declared merge-ready by the refresh.
Same-coordinate Maven retry remains unsupported.

Documentation and companion changes

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

@github-actions

Copy link
Copy Markdown

Hey Rana Singh (@ranadeepsingh) 👋!
Thank you so much for contributing to our repository 🙌.
Someone from SynapseML Team will be reviewing this pull request soon.

We use semantic commit messages to streamline the release process.
Before your pull request can be merged, you should make sure your first commit and PR title start with a semantic prefix.
This helps us to create release messages and credit you for your hard work!

Examples of commit messages with semantic prefixes:

  • fix: Fix LightGBM crashes with empty partitions
  • feat: Make HTTP on Spark back-offs configurable
  • docs: Update Spark Serving usage
  • build: Add codecov support
  • perf: improve LightGBM memory usage
  • refactor: make python code generation rely on classes
  • style: Remove nulls from CNTKModel
  • test: Add test coverage for CNTKModel

To test your commit locally, please follow our guild on building from source.
Check out the developer guide for additional guidance on testing your change.

Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 22, 2026
## 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>
@ranadeepsingh Rana Singh (ranadeepsingh) added enhancement github_actions Pull requests that update GitHub Actions code labels Aug 22, 2026
@ranadeepsingh Rana Singh (ranadeepsingh) changed the title feat: Automate release preparation, notes, and artifact verification feat: Automate reviewed SynapseML-to-Fabric releases Aug 22, 2026
@ranadeepsingh
Rana Singh (ranadeepsingh) marked this pull request as ready for review August 22, 2026 03:24
Copilot AI lite review requested due to automatic review settings August 22, 2026 03:24
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_dispatch for PR validation so release PRs created via GITHUB_TOKEN can 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 internal does not currently skip the internal PyPI feed checks (the synapseml_internal package); it only skips internal git tag checks. This makes --skip internal behave 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

Comment thread scripts/release/verify_release.py Outdated
Comment thread scripts/release/verify_release.py
Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 22, 2026
## 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>
Copilot AI review requested due to automatic review settings August 22, 2026 03:34
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 when az is installed. Build a platform-appropriate command (string for shell=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

Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 22, 2026
## 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>
Copilot AI review requested due to automatic review settings August 22, 2026 03:40
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

Addressed the current-head suppressed Windows auth finding in 6e80f27.

  • Windows now gives subprocess.run(..., shell=True) a command string; non-Windows retains an argument list with shell=False.
  • Parameterized regression coverage locks both command shapes.
  • A token-less Windows fallback replay authenticated through �z and found all 12 selected v1.1.3 master artifacts; the complete release-tooling suite is 279 passed.

@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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} (via public_maven()), but the workflow-generated release notes advertise com.microsoft.azure:synapseml_2.12:${VERSION} (see .github/workflows/release-notes.yml:137) and the docs use the synapseml_2.12 coordinate (website/doctest.py:25). This can let verify_release.py report 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 both synapseml_{scala} and synapseml-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

Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 22, 2026
## 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>
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Two critical issues remain in ESRP staging: stale explicitly versioned artifacts can be relabeled, and mandatory arguments break the supported Spark 4.1 pipeline.

Get a fresh assessment by requesting another Copilot review.

Review tier: Lite
Findings: 2 High severity

Open (2)

Comment thread tools/esrp/prepare_jar.py
Comment on lines +50 to +55
filename = (
path.name
if suffix.startswith(f"-{version}.")
or suffix.startswith(f"-{version}-")
else f"{module}-{version}{suffix}"
)
Comment thread tools/esrp/prepare_jar.py

def main(argv=None):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--version", required=True)
SynapseML CI and others added 25 commits September 22, 2026 18:37
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>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Make the release matrix the executable contract for Spark 3.5, 4.0, and 4.1; emit explicit public and Internal Maven queue commands; add full versus Internal-only release scopes; propagate rebuild counters; and fail release verification unless every expected Maven, pip, UPack, and tag artifact is present and commit-consistent.

## Prompting Intent
Refresh PR microsoft#2628 on current master and make SynapseML-to-Fabric releases easy to operate, complete across supported Spark branches, and verifiably published to Maven. Follow historical releases and the SynapseML Fabric Release Guide v2, while producing an interoperable contract for the SynapseML-Internal follow-up.

## Linked Sources
- GitHub pull request: microsoft#2628
- SynapseML Fabric Release Guide v2: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2
- Historical release reference: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3

## Rationale
Use one validated matrix instead of hand-maintained branch instructions so Maven, pip, UPack, tags, and BBC-VHD values cannot drift. Queue Maven publication explicitly because the downstream packaging pipeline does not publish Maven. Keep Internal-only hotfixes from republishing immutable public artifacts, and verify live artifact files plus peeled tag commits because green pipelines alone do not prove a complete release.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Apply the repository-pinned Black 22.3.0 layout to the Fabric certificate test helper so PR validation accepts the rebased release automation changes.

## Prompting Intent
Keep PR microsoft#2628 green after its release hardening update by fixing the exact formatting mismatch reported by the Python Style Check, without changing behavior or formatting unrelated files.

## Linked Sources
- GitHub pull request: microsoft#2628
- Failed Python Style Check: https://github.com/microsoft/SynapseML/actions/runs/32958770630/job/98146240564

## Rationale
Apply only the formatter diff emitted by Black 22.3.0 because the local newer Black version accepted a layout that the repository-pinned CI version rejects. A focused follow-up preserves commit history and avoids unrelated repository-wide formatting churn.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Probe Maven and PyPI artifact URLs with HEAD first, falling back to GET only when a server reports HEAD as unsupported with HTTP 405 or 501. Add regression coverage for successful HEAD probes, unsupported-method fallback, and missing artifacts in both paths.

## Prompting Intent
Address the current-head review finding on PR microsoft#2628 while preserving the verifier's fail-closed semantics and making complete multi-branch Maven verification faster and less bandwidth-intensive.

## Linked Sources
- GitHub pull request: microsoft#2628
- Review finding: microsoft#2628 (comment)
- SynapseML Fabric Release Guide v2: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2

## Rationale
Use HEAD for the common path so large JAR bodies are never opened unnecessarily. Fall back only for the standard unsupported-method responses, rather than masking authentication, server, or network failures, so operational errors remain actionable and missing artifacts still fail release verification.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Add a discoverable SynapseML release skill with focused preflight,
automation-boundary, recovery, and rollout references. Make the documented dry
run work from a fresh checkout, keep historical review evidence out of version
replacement, and add scoped verification that reports only Internal rows for
an Internal-only patch.

## Prompting Intent
The engineer asked to document the current SynapseML-to-Fabric release process
through an agent skill in PR microsoft#2628. The skill needed to explain what can be
previewed, which actions publish or tag state, where human approval remains
mandatory, and how to recover without moving immutable tags or packages. The
change also needed to pass the SynapseML PR loop and its six-round review
gauntlet.

## Linked Sources
- GitHub pull request: microsoft#2628
- Derivative tag automation: microsoft#2540
- SynapseML Fabric Release Guide v2: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2
- Public release reference: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3
- Review evidence: reviews/release-skill/

## Rationale
Keep the main skill short and put commands and recovery detail in focused
references so agents can load only what a release step needs. Use the release
matrix and verifier as executable sources of truth instead of duplicating
coordinates. Add an explicit Internal-only verification scope while preserving
the previous nonzero-patch inference, and record the resolved scope in output
so stored evidence cannot hide omitted OSS rows. Keep tag creation, publication,
credentials, and rollout approvals behind explicit human gates.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 476d113f-dd35-40c6-bc79-005dcccd7b79
## Summary
Move the six release-automation review reports into `review/pr-2628/`, rename
them with the PR-number prefix, add an index README, and remove machine-local
artifact paths. Exclude both the new `review` root and the historical `reviews`
root from version replacement, with tests for directory and nested-file paths.

## Prompting Intent
The engineer asked to move and rename PR microsoft#2628's review artifacts under
`review/pr-2628/` and to follow the organization used by existing checked-in
PR review evidence.

## Linked Sources
- GitHub pull request: microsoft#2628
- Existing review-layout example: https://github.com/microsoft/SynapseML/tree/master/reviews/pr-2666
- Review evidence index: review/pr-2628/README.md

## Rationale
Use the requested singular root while keeping the established PR-numbered
subdirectory, filename prefix, and README pattern. Leave the existing
`reviews/pr-2666/` history in place to avoid unrelated churn. Denylist both
roots because both contain immutable reports with historical version strings
that must not be changed by a future release bump.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 476d113f-dd35-40c6-bc79-005dcccd7b79
## Summary
Move PR microsoft#2628 review evidence from the singular `review/pr-2628/` directory to
`reviews/pr-2628/`. Add a repository-wide `AGENTS.md` rule for PR-numbered and
feature-numbered review directories, and remove the now-unused singular-root
version-bump exclusion.

## Prompting Intent
The engineer clarified that committed reviews must live under
`reviews/pr-<number>/`, or under the defined feature-numbered directory when
there is no PR. They also asked to record this rule in `AGENTS.md` so future
reviews do not use topic-named or singular-root directories.

## Linked Sources
- GitHub pull request: microsoft#2628
- Existing review-layout example: https://github.com/microsoft/SynapseML/tree/master/reviews/pr-2666
- Repository guidance: AGENTS.md

## Rationale
Use the plural `reviews` root because it matches the checked-in PR microsoft#2666
precedent and gives every review set a stable work-item identifier. Keep the
PR and feature forms explicit in repository guidance, and remove the temporary
singular-root handling rather than preserving two accepted layouts.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 476d113f-dd35-40c6-bc79-005dcccd7b79
## Summary
Convert malformed UTF-8 or JSON HTTP 200 responses into verifier runtime
errors that name the failing URL. Add regressions for HTML and truncated JSON
bodies.

## Prompting Intent
Resolve the current-head Copilot finding on PR microsoft#2628. Release operators must
be able to identify which GitHub or Azure DevOps endpoint returned a malformed
success response instead of receiving a context-free JSON decoder error.

## Linked Sources
- GitHub pull request: microsoft#2628
- Copilot review finding: microsoft#2628 (comment)

## Rationale
Catch only response-decoding failures at the HTTP helper boundary and retain
the existing fail-closed behavior. Including the URL there gives every caller
the missing backend context without logging request headers or credentials.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 476d113f-dd35-40c6-bc79-005dcccd7b79
## Summary
Add sealed source-bound release plans, explicit queue approval, durable
recovery state, producer evidence, and guarded notes/BBC-VHD handoffs.
Harden tag workflows, release versioning, PyPI collisions and ESRP staging.
Keep ordinary CI on snapshot coordinates. Add history-preserving publisher
retries, persistent local ledger claims and bounded lock inspection. Keep
same-coordinate Maven retries disabled without whole-namespace absence proof.

## Prompting Intent
The engineer asked for safer, more effective end-to-end release automation,
repeatable command-line steps and a release skill, while allowing Internal
to publish independently of new OSS releases. Human approval, reviewed source,
immutable packages and existing runtime compatibility must remain intact.

## Linked Sources
- Public release automation: microsoft#2628
- Operator commands: scripts/release/README.md
- Release skill: .github/skills/synapseml-release/SKILL.md
- Review findings and resolutions: reviews/pr-2628/
- Repository rules: AGENTS.md

## Rationale
Bind intent once and preserve it through queueing, recovery and verification
instead of recalculating package coordinates at every step. Keep inventory
separate from producer evidence and require original approvals for staged
rollout. This permits independent Internal releases without weakening source,
destination or immutability checks. This is release/build infrastructure;
no library API or dependency pin changes are included.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 476d113f-dd35-40c6-bc79-005dcccd7b79
## Summary
Use portable noninteractive SBT probe invocations. Preserve actionable blob
inspection failures and cache each ESRP module directory's resolved path.
Add failing-before regressions and retain the current-head review resolutions.

## Prompting Intent
The engineer asked to continue the coordinated release improvements and commit
them. The PR loop requires fixing current-head CI and review findings rather
than treating historical passing runs as evidence for new code.

## Linked Sources
- Public PR: microsoft#2628
- CI failure: https://github.com/microsoft/SynapseML/actions/runs/33964603972
- Blob diagnostic: microsoft#2628 (comment)
- ESRP resolution: microsoft#2628 (comment)
- Review and resolution history: reviews/pr-2628/pr-2628-attempt-2-review-6-claude-opus-5.md

## Rationale
An explicit SBT task and closed stdin work with both native and wrapper
launchers. Keep query failure distinct from artifact absence while preserving
the underlying process error. Resolve each admitted source directory once
without dropping containment checks. This is release infrastructure, not a
library feature or dependency change.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 476d113f-dd35-40c6-bc79-005dcccd7b79
## Summary
Add no-overwrite plan output, shared duplicate-rejecting plan decoding, and
bounded read-only or explicitly approved release polling. Preserve durable
state and restore unsent intent when its save exhausts the scheduling window.
Keep fixed release tooling and fixtures unchanged across successive version
bumps. Include focused regressions, operator documentation and review reports.

## Prompting Intent
Refresh and complete the release automation PR for reliable future releases.
Rebase onto the current target, address review findings, and commit evidence
without bypassing approval or immutable-publication safeguards. Treat the
requested confidence as an evidence standard, not a bug-free guarantee.

## Linked Sources
- Release automation PR: microsoft#2628
- Operator contract: scripts/release/README.md
- Release procedure: .github/skills/synapseml-release/SKILL.md
- Branch and readiness rules: AGENTS.md and .github/skills/synapseml-pr-loop/SKILL.md
- Review findings and resolutions: reviews/pr-2628/pr-2628-attempt-3-review-*.md

## Rationale
Extend the existing plan-driven state machine rather than introduce another
release coordinator. Waiting must not approve, retry, adopt, widen scope or
cancel remote builds. Exclusive output and stable fixture exclusions keep
successive releases separate without invalidating historical evidence. Shared
strict decoding closes the producer admission gap as well as local plan reads.
This is release/build infrastructure, covered by the PR's area/build label.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 879c5a1c-4efa-4620-93ea-f8f0052112f1
## Summary
Recover missing Spark and Python derivative tags at the exact recorded merge
commit of a reviewed release PR. Verify existing immutable tags and actual
remote refs before reporting a branch complete. Preserve open PRs and reject
unknown source commits instead of guessing a moving branch tip.

Add native Git regression coverage for reruns, rewritten ancestry, advanced
targets, partial annotated pairs, missing or invalid evidence, remote conflicts
and rejected pushes. Add outgoing-request authentication tests without changing
the already-correct production token construction. Include operator guidance
and six follow-up review reports with their findings and dispositions.
Require exact local and remote refs across all three tagging workflows and
Maven admission. Stage selected tag objects in a unique local namespace and
atomically map its literal names to remote tags, preventing suffix-lookalike
branches from becoming write destinations. Clean up staging refs on failure
and success. Bind preparation ancestry to the exact master branch object.

## Prompting Intent
Complete and refresh the release automation PRs for repeatable future releases,
with evidence rather than a bug-free guarantee. Address current-head review
findings, retain immutable publication and human-approval boundaries, and commit
the verified changes without merging or publishing a release.

## Linked Sources
- Release automation PR: microsoft#2628
- Missing-tag review: microsoft#2628 (comment)
- Authentication review: microsoft#2628 (comment)
- Operator contract: scripts/release/README.md
- Release and branch policy: .github/skills/synapseml-release/SKILL.md and AGENTS.md
- Review findings and resolutions: reviews/pr-2628/pr-2628-attempt-3-review-*.md

## Rationale
An already-merged branch does not prove that its asynchronous tag workflow
finished. The recorded merge SHA is the authorization boundary for recovery;
creating a tag at the current branch tip could include later unreleased work.
Legacy releases without that record may only verify a consistent existing pair.
Atomic non-forced pushes and remote verification fail closed on concurrent
changes. Pattern refspecs avoid single-ref Git destination resolution, which
could otherwise update an unrelated lookalike branch before verification fails.
Redacted source rendering is not evidence of a broken token header,
so the authentication follow-up adds a real request assertion rather than a
speculative production edit. This is release/build infrastructure covered by
the PR's area/build label.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 879c5a1c-4efa-4620-93ea-f8f0052112f1
## Summary
Reject an existing output symlink before resolving its path, including a link
whose target does not exist. Keep the existing Ivy containment, new-output and
artifact validation rules. Add twelve API/CLI regressions covering relative
and absolute links with missing, directory and file targets. Preserve link
identity, target contents, cache contents and explicit failure output.
Document the staging constraint and retain the review finding and its evidence.

## Prompting Intent
Complete, refresh and commit the coordinated release automation PRs for safe
future releases. Resolve current-head review findings with reproducible evidence
without promising bug-free behavior or bypassing release approvals and CI gates.

## Linked Sources
- Release automation PR: microsoft#2628
- Output-symlink finding: microsoft#2628 (comment)
- Operator contract: scripts/release/README.md
- Review evidence: reviews/pr-2628/pr-2628-attempt-3-review-1-gpt-6-astra.md

## Rationale
Resolving the path first erases the link identity and can create a missing
target outside the requested staging location. Checking the original path
preserves the existing staging implementation and CLI behavior while failing
closed for this case. Real filesystem tests reproduced four failures before
the fix. Both Linux and Windows exercise the corrected error path without
skipping symlink cases. This is release/build infrastructure covered by the
PR's area/build label. Live publishing and branch-integration approval remain
outside this change.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 879c5a1c-4efa-4620-93ea-f8f0052112f1
## Summary
Include the public Maven Release job only when both release and artifact
publication are enabled. Keep the initial release admission guard so incomplete
requests fail with the intended diagnostic rather than an unknown dependency.
Add four flag-combination regressions and record native Azure preview evidence.
Clarify that the public Maven and official pip/UPack publishers have separate
pipeline definitions and parameter contracts.

## Prompting Intent
Complete, refresh and commit the coordinated release automation PRs for safe
future releases. Resolve current-head findings with reproducible evidence
without promising bug-free behavior or bypassing approvals and CI gates.

## Linked Sources
- Release automation PR: microsoft#2628
- Dependency finding: microsoft#2628 (comment)
- Separate-contract finding: microsoft#2628 (comment)
- Operator contract: scripts/release/README.md
- Review evidence: reviews/pr-2628/pr-2628-attempt-3-review-1-gpt-6-astra.md

## Rationale
The artifact job is omitted at compile time when publishArtifacts is false.
Omitting the dependent release job under the same condition preserves the
guard and avoids constructing an invalid Azure graph. Valid release gating and
ordinary artifact publication are unchanged. A real no-run preview reproduced
the original failure; all four combinations now expand without missing
dependencies, and the invalid request stops at the actual admission guard.
The other finding confused two independently verified pipeline contracts,
so changing the correctly declared publisher parameters would be a regression.
This is release/build infrastructure covered by the PR's area/build label.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 879c5a1c-4efa-4620-93ea-f8f0052112f1
## Summary
Update the two current release-tooling links to guide v3 and identify v2 as
historical reference. Use the exact repository path rather than inventing a
wiki page ID before the new page is published.
Spell out the existing Maven coordinate in two newly merged tutorial references
so the fail-closed version bumper recognizes them without broader matching.

## Prompting Intent
The engineer requested a new release guide version while preserving the older
guide. Keep current automation entry points directed to the new procedure so
operators do not accidentally follow restored historical instructions.
Preserve release automation across the required target refresh, including
version references introduced by newly merged documentation.

## Linked Sources
- Release automation PR: microsoft#2628
- Current command reference: scripts/release/README.md
- Rollout reference: .github/skills/synapseml-release/references/recovery-and-rollout.md
- Documentation review disposition: reviews/pr-2628/pr-2628-attempt-3-review-1-gpt-6-astra.md
- Newly merged tutorial: microsoft#2701

## Rationale
Changing only the wiki navigation would leave the tooling's direct links
pointing at historical v2. Updating both references keeps the current
procedure consistent with the new version while preserving old permalinks.
The link is explicitly gated on the guide change merging. No runtime or
release behavior changes. The PR already carries the area/build label.
The target refresh introduced two bare version references that the existing
regression suite correctly rejected. Using the tutorial's already documented
Maven coordinate fixes those references without changing version values or
weakening the scanner's context requirement.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 879c5a1c-4efa-4620-93ea-f8f0052112f1
## Summary
Adapt the incoming E2E pipeline contract to the release PR's conditional
checkout. Assert full history and tags for release requests, preserve the
ordinary two-commit checkout, and locate the single named impact step without
depending on the release admission guard's position. Record the bounded
rebase review and current validation evidence without replacing prior reports.

## Prompting Intent
The engineer asked to restart the publishing automation work, beginning by
updating PR microsoft#2628 with the latest master branch and rerunning CI. Preserve the
existing release changes and master fixes without publishing version 1.2.0,
creating release tags, or bypassing approvals.

## Linked Sources
- Release automation PR: microsoft#2628
- Integrated master: microsoft@681bd96
- Incoming E2E impact selection: microsoft#2736
- Repository rules: AGENTS.md
- Pipeline contract: tools/ci/tests/test_e2e_impact.py
- Rebase review: reviews/pr-2628/pr-2628-attempt-3-review-1-gpt-6-astra.md

## Rationale
Keep both upstream contracts rather than weakening the release guard or the
E2E selector. The incoming assertion failed with KeyError for fetchDepth
because the checkout now has explicit release and ordinary branches.
Checking both branches and the unique impact step preserves the intended
coverage without changing runtime behavior.

Release and CI-helper contracts passed 959 cases and 63 subtests, with one
explicit opt-in SBT check skipped. Native Windows version-bump/history
coverage passed 228 cases. Black 22.3.0 accepted the changed test. Existing
release review findings and full CI remain separate readiness gates.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 879c5a1c-4efa-4620-93ea-f8f0052112f1
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Unresolved release publication scoping and dependency issues, plus workflow-test coverage gaps, block approval.

Get a fresh assessment by requesting another Copilot review.

Review effort: Lite
Findings: 3 High severity · 1 Medium severity · 4 Low severity

Open (8)

Comment thread pipeline.yaml
Comment on lines +201 to +202
${{ if eq(parameters.publishRelease, true) }}:
dependsOn: [BuildAndCacheSbt, Style, UnitTests, PythonTests, RTests, DatabricksCPUE2E, DatabricksGPUE2E, FabricE2E, WebsiteSamplesTests, BuildDocker]
Comment thread pipeline.yaml
- job: Publish
dependsOn: BuildAndCacheSbt
${{ if eq(parameters.publishRelease, true) }}:
dependsOn: [BuildAndCacheSbt, Style, UnitTests, PythonTests, RTests, DatabricksCPUE2E, DatabricksGPUE2E, FabricE2E, WebsiteSamplesTests, BuildDocker]
- **Theme**: Architecture & Patterns
- **Mode**: sequential
- **Model**: gemini-3.8-flash
- **Artifact**: direct-pr-2628\reviews\pr-2628\pr-2628-attempt-2-review-2-gemini-3.8-flash.md
Comment on lines +33 to +34
$root='C:\Users\singhrana\.copilot\session-state\16e6d9b2-ce73-41f9-9d38-9386edc5c48d\files\direct-pr-2628'
git --no-pager -C $root diff 8c7143875c843c649a817cf3e8ba9c7bee23689c -- build.sbt project\build.scala pipeline.yaml .github\workflows\pr-validation.yml
Comment on lines +43 to +45
$root='C:\Users\singhrana\.copilot\session-state\16e6d9b2-ce73-41f9-9d38-9386edc5c48d\files\direct-pr-2628'
git --no-pager -C $root status --short
git --no-pager -C $root rev-parse HEAD
Comment on lines +72 to +74
$root = 'C:\Users\singhrana\.copilot\session-state\16e6d9b2-ce73-41f9-9d38-9386edc5c48d\files\direct-pr-2628'
git --no-pager -C $root rev-parse HEAD
git --no-pager -C $root status --porcelain=v1 --untracked-files=all

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/build enhancement github_actions Pull requests that update GitHub Actions code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants