Skip to content

chore: bring latest master fixes to Spark 4.0 - #2733

Merged
Rana Singh (ranadeepsingh) merged 232 commits into
microsoft:spark4.0from
ranadeepsingh:sync/spark4.0-master-20260921
Sep 22, 2026
Merged

Rana Singh (ranadeepsingh) merged 232 commits into
microsoft:spark4.0from
ranadeepsingh:sync/spark4.0-master-20260921

Conversation

@ranadeepsingh

@ranadeepsingh Rana Singh (ranadeepsingh) commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator

What changes are proposed in this pull request?

Bring the latest master fixes into Spark 4.0 without replacing its Spark,
Python, or runtime adaptations. This keeps portable behavior aligned with
master instead of maintaining a separate port-specific implementation.

The latest merge includes #2730's contributor-review guidance
and background CI monitor. Tooling behavior and guidance match master; one
regression fixture is stronger so an ignored CLI failure cannot go undetected.

Status: Published at b9c35ebbd5a05499e6820e7f9f305a9d0eb8b40c.
Local validation and six GPT/Opus review themes are complete, including the
regression-fixture fix. Fresh Azure build
237118265
succeeded on this exact head. All 65 jobs passed, including the retried form
job's test-result and coverage publication. Current-head automated review
is still missing despite the Copilot request; a Qodo fallback was requested.
Gemini review is unavailable, so no complete three-family review is claimed.
Required human approval remains.

Scope and retained compatibility

Master source: 681bd96990c421de3b91d2b1bf8f8f470764199d.
Prepared as a normal merge in a dedicated worktree, with no rebase or force push.

  • Retain Spark 4.0.1, Scala 2.13.16, JDK 17, Python 3.12.11, NumPy 1 ABI,
    the compatible pandas wheel, and Databricks 17.3.
  • Retain Spark 4 collection/codegen/R/Petastorm adaptations, the Spark 4.0
    LongOffset import, bytearray handling, and SAR affinity encoding.
  • Keep Fabric E2E disabled and the dedicated streaming suite unscheduled.
    Neither is claimed as tested.
  • Include master's service-parameter and batched-header fixes, Fabric test
    cleanup, conservative notebook selector, and test/runner cleanup.
  • Import the latest review/CI tooling without changes to production code,
    dependencies, runtime profiles, templates, or pipeline configuration.

How is this patch tested?

  • Both complete helper suites passed 321 tests and 63 subtests.
    After the fixture correction, all 30 watcher tests and 63 subtests passed
    again on both ports. Removing the exit-code guard in memory now fails the
    regression; the old fixture did not detect its removal.
  • New Python files pass Black 22.3.0. The watcher also passes all 30
    standalone tests on Windows Python 3.14.6.
  • Eight new master paths match exactly; the ninth differs only in that
    regression fixture. Existing runtime and product files remain unchanged.
  • Fresh current-head full Azure CI: 3,666 published passes, 22
    baseline-identical non-executed cases, and 321 separate CI-helper passes
    plus 63 subtests.
  • Current-head automated review.
Current-head CI evidence and the publication retry

All 42 CPU notebooks, four GPU notebooks, six R jobs, 110 website samples,
50 cleanup tracker tests, three naming tests, and six geospatial tests passed.
The original 367 published test runs were preserved; the successful form retry
added the nine missing runs. Repeated test execution is not counted as new
coverage.

The first form-job attempt passed 53 tests and ignored two existing cases, but
Azure TLS certificate errors blocked test-result and coverage upload. Only
that job was retried. Its second attempt published all 55 results, Azure
coverage, and Codecov successfully; the other 64 jobs were not rerun.

Prior-head validation, not evidence for the new head

Build 237087792
validated d08aefee223d5fd7024a78dcd5e19a60b323967d: 3,666 published passes,
22 baseline-identical non-executed cases, and 291 separate CI-helper passes.
All 42 CPU notebooks, four GPU notebooks, six R jobs, 50 cleanup tracker tests,
three naming tests, and six geospatial tests passed.

Azure's partiallySucceeded result came only from dependency-cache TLS errors.
All 110 website samples and test/coverage publication passed, and the required
GitHub Azure check was SUCCESS. No test job was retried.

Related Issues/PRs

#2730, #2732,
#2735, #2736.
Sibling sync: #2734.

Does this PR change any dependencies?

  • No. Existing port pins are preserved.

Does this PR add a new feature? If so, have you added samples on website?

  • No new port-only library feature; this synchronizes master fixes and tooling.

smamindl and others added 30 commits April 17, 2026 17:09
…t#2550)

Add a ReleaseBranchCompat job that runs on every PR to master.
It rebases each release branch (starting with spark4.0) onto
the PR HEAD and runs sbt compile test:compile to catch breakage
before it lands in master.

- Non-blocking (continueOnError: true)
- Matrix-based for easy expansion to more release branches
- Reports merge conflicts and compile failures as warnings

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ease demo image (microsoft#2557)

Addresses MSRC case 110886 / incident 31000000570827.

The mmlspark/release image (built from tools/docker/demo/Dockerfile) ships
Spark 3.5.4, which pins netty 4.1.96.Final. That version is flagged for
multiple CVEs (CVE-2023-44487, CVE-2024-29025, CVE-2025-24970, ...). Spark
has not bumped netty in any 3.5.x release.

netty 4.1.x is binary-compatible, so we replace all netty-*-4.1.96.Final*.jar
files in /opt/spark/jars/ with 4.1.118.Final right after the Spark extract.
This includes netty-codec-http2 (the specific artifact named by the finder).

Also removes 'pyspark' from the conda install line. It was pulling a
complete second Spark install (PySpark 4.0.1) into
/usr/local/lib/python*/site-packages/pyspark/ that nothing in the demo image
actually used (SPARK_HOME points at /opt/spark) and that doubled the surface
area scanners report on.

Validated locally:
- /opt/spark/jars/netty-*-4.1.96.Final*.jar: 0 matches after build
- /opt/spark/jars/netty-*-4.1.118.Final*.jar: full set present
- /usr/local/lib/.../pyspark: no longer exists
- spark-submit --version: works
- spark.range(5).count(): returns 5

Jetty (shaded inside hadoop-client-runtime-3.3.4.jar at 9.4.43) is OUT OF
SCOPE for this PR; that requires a Spark/Hadoop swap and will be tracked
separately.
* chore: add SynapseML local setup skill

## Summary
Add a project-scoped SynapseML agent skill that diagnoses local toolchain state, selects JDK 11 for SBT commands, runs a safe local Spark smoke test, and flags live-service tests before agents run them.

## Prompting Intent
The engineer asked the agent to create a skill that helps any future agent get SynapseML working locally after the PR 2556 review exposed a local Java 21 and Scala 2.12 compiler-bridge failure. The engineer also asked to create a PR for the skill addition before continuing the original external PR review.

## Linked Sources
- User request in current session: create a skill that will help any agent be able to get SynapseML working locally.
- Follow-up user request in current session: create a PR for that skill addition and continue using it to review PR 2556.
- Existing project-scoped skill convention: .agents/skills/code-review/SKILL.md.
- Local validation output: doctor_status=ok, JDK 11 dry-run selected JAVA_HOME, smoke test passed, Azure Search tests flagged review_required.

## Rationale
A project-scoped SynapseML skill keeps local setup guidance with the repository where future agents need it. The scripts use explicit parameters rather than session state, force JDK 11 for Scala 2.12 SBT commands, and include a live-service guard so agents do not accidentally create or delete Azure Search resources while validating changes.

* chore: move SynapseML setup skill to Copilot path

## Summary
Move the SynapseML local setup skill from `.agents/skills/` to `.github/skills/` so it uses the documented Copilot project-skill discovery path.

## Prompting Intent
The engineer asked whether the `.agents` folder was correct and whether Copilot would pick it up. Investigation found that the local skill-authoring reference documents `.github/skills/<name>/` and `.claude/skills/<name>/` as project skill locations, so the open skill PR needed a path correction.

## Linked Sources
- User question in current session: is this .agent folder correct? will copilot pick this up?
- Skill-authoring reference: /home/brwals/.copilot/installed-plugins/copilot-toolkit-marketplace/common/skills/create-skill/references/REFERENCE.md
- Existing PR: microsoft#2558

## Rationale
The existing `.agents/skills/code-review` directory was only evidence of a repo-local convention, not evidence of Copilot discovery. Moving the new skill to `.github/skills/synapseml-local-setup/` keeps the same skill content while placing it in the documented project-skill path.
microsoft#2560)

* Add v1 OpenAI Endpoint support and remove legacy completions API

* Fix FuzzingUnitTest

* Add test to increase code coverage

* Make v1 api assumption cleaner

* Add OpenAICompletion deprecation

* Remove deprecation warnings

* Fix RAI test for OpenAIPrompt

* Revert "Add OpenAICompletion deprecation"

This reverts commit fa708e2.

* Revert "Fix RAI test for OpenAIPrompt"

This reverts commit 3ed6044.

* Revert "Remove deprecation warnings"

This reverts commit 9a40c5c.

* Reapply "Remove deprecation warnings"

This reverts commit 987484c.

* Reapply "Fix RAI test for OpenAIPrompt"

This reverts commit f06f1ad.

* Reapply "Add OpenAICompletion deprecation"

This reverts commit 10715cd.
## Summary
Move the remaining SynapseML repo skill from `.agents/skills/` to `.github/skills/` so Copilot CLI can discover all repo-versioned skills from the documented project-skill path. Add README pointers under `.agents/` for tools or agents that inspect the older convention.

## Prompting Intent
The engineer asked to migrate everything to the correct Copilot CLI path and suggested keeping a generic agents pointer. The goal was to make existing skills discoverable by Copilot while avoiding future confusion about `.agents/skills`.

## Linked Sources
- User request in current session: migrate everything to the correct path for Copilot CLI and keep a generic agents pointer.
- Skill location reference: /home/brwals/.copilot/installed-plugins/copilot-toolkit-marketplace/common/skills/create-skill/references/REFERENCE.md
- Prior merged skill PR: microsoft#2558

## Rationale
`.github/skills/<name>/` is the documented Copilot CLI project-skill location. Keeping only README pointers under `.agents/` preserves a breadcrumb for other agent conventions without leaving duplicate or stale `SKILL.md` files in a path Copilot CLI may not load.
* add speechtotextsdk improvements

* Fix ffmpeg output args

* add ffmpeg url check

* fix: address speech recording review feedback

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test: make OpenAIPrompt RAI test resilient

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Revert "test: make OpenAIPrompt RAI test resilient"

This reverts commit fccce86.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chore: remove Acrolinx integration config

AB#5391146 AB#5391147

## Summary
Remove the retired Acrolinx repository configuration from SynapseML and add the Feature Registry pointer and repo-specific design notes for Feature 5391136.

## Prompting Intent
Engineer asked the agent to complete the Acrolinx removal request from the Microsoft Learn authoring tools PM. The repository cleanup needed to remove stale source-controlled Acrolinx state while preserving Feature Registry traceability for the administrative webhook removal and the June 30 contract-expiration risk.

## Linked Sources
- ADO Feature: https://msdata.visualstudio.com/A365/_workitems/edit/5391136
- Design Spec task: https://msdata.visualstudio.com/A365/_workitems/edit/5391146
- Deployment task: https://msdata.visualstudio.com/A365/_workitems/edit/5391147
- Feature Registry specs: https://msdata.visualstudio.com/A365/_git/FeatureRegistry?path=/Features/active/5391136
- Teams request: https://teams.microsoft.com/l/message/19:81ff723c-eac9-4b2a-ba9f-844542135555_cc1adbf9-6510-43d6-a849-adba51e66d59@unq.gbl.spaces/1782314980087?context=%7B%22contextType%22%3A%22chat%22%7D
- Acrolinx config before cleanup: https://github.com/microsoft/SynapseML/blob/b0fa222cfdde5d0a2cbb2bc6a35630bbb61bc0e3/.acrolinx-config.edn

## Rationale
Deleting `.acrolinx-config.edn` is the least invasive source change because the Acrolinx contract is ending and the repo-level webhook was already removed through GitHub administration. Keeping the Feature Registry folder in the repo gives future maintainers a durable pointer to the reason for the cleanup without adding runtime or build behavior.

* chore: keep Feature Registry metadata out of SynapseML

AB#5391146 AB#5391147

## Summary
Remove the Feature Registry scaffold files from the SynapseML cleanup branch so the public repository PR only deletes the retired Acrolinx config.

## Prompting Intent
Engineer clarified that Feature Registry metadata must not be included in the external SynapseML repository. The agent adjusted the existing cleanup PR to keep registry tracking in FeatureRegistry only while preserving the Acrolinx source cleanup.

## Linked Sources
- ADO Feature: https://msdata.visualstudio.com/A365/_workitems/edit/5391136
- SynapseML PR: microsoft#2570
- FeatureRegistry PR: https://msdata.visualstudio.com/A365/_git/FeatureRegistry/pullrequest/2169703
- User correction: do not include Feature Registry metadata in the external repo

## Rationale
Keeping the public SynapseML PR scoped to `.acrolinx-config.edn` avoids adding internal Feature Registry process artifacts to an external repository. Feature-level tracking remains in the FeatureRegistry PR and ADO work items.
* fix: route AnalyzeText document errors to errorCol

Move Azure AI Language document-level errors returned inside HTTP 200 AnalyzeText responses from the response payload into the configured error column after auto-batch flattening. Preserve transport error precedence and add a no-network regression test for mixed document success/error responses.

AB#4638662

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: pin PR validation sbt launcher

Use the sbt launcher version from project/build.properties instead of installing the latest apt sbt package. This keeps the JDK 11 PR validation job on the repository's sbt 1.10.11 launcher and avoids sbt 2.x rejecting JDK 11 before scalastyle can run.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: use pinned sbt wrapper in PR validation

Invoke the downloaded sbt launcher explicitly so the GitHub runner does not resolve its preinstalled sbt 2.x binary under JDK 11.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: prefer pinned sbt on PATH

Keep PR validation commands as plain sbt while placing the repository-version launcher first on PATH for subsequent workflow steps.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test: avoid ordering assumption in AnalyzeText error test

Partition collected rows by error nullability instead of relying on collect order, addressing PR review feedback about Spark DataFrames being unordered.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pin the shared Python test environment to MLflow 2.21.3, matching the Databricks test dependency. This constrains protobuf to a compatible major version and invalidates the stale conda cache that breaks Python test collection.
test: migrate OpenAI tests and examples to GPT-5.1
fix: correct LightGBM improvement tolerance semantics
Bumps [amannn/action-semantic-pull-request](https://github.com/amannn/action-semantic-pull-request) from 5.4.0 to 6.1.1.
- [Release notes](https://github.com/amannn/action-semantic-pull-request/releases)
- [Changelog](https://github.com/amannn/action-semantic-pull-request/blob/main/CHANGELOG.md)
- [Commits](amannn/action-semantic-pull-request@v5.4.0...v6.1.1)

---
updated-dependencies:
- dependency-name: amannn/action-semantic-pull-request
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Rana Singh <ranadeep.dtu@gmail.com>
…t#2597)

Bumps [ossf/scorecard-action](https://github.com/ossf/scorecard-action) from 2.3.1 to 2.4.4.
- [Release notes](https://github.com/ossf/scorecard-action/releases)
- [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md)
- [Commits](ossf/scorecard-action@0864cf1...2d11466)

---
updated-dependencies:
- dependency-name: ossf/scorecard-action
  dependency-version: 2.4.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
)

Bumps [actions/setup-java](https://github.com/actions/setup-java) from 5.6.0 to 5.7.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](actions/setup-java@03ad4de...b6effb0)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: 5.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rana Singh <ranadeep.dtu@gmail.com>
* docs: add T4 GPU local RAG quickstart

## Summary
Add an end-to-end local RAG notebook that performs sentence embedding, exact retrieval, and Phi-4-mini generation on a Databricks T4 worker. Register the notebook in the active GPU smoke suite and documentation sidebar with pinned model dependencies.

## Prompting Intent
Reassess the unmerged GPU demo from PR microsoft#2271 against current master. Add a maintainable integration example only if it fills a gap beyond the standalone GPU KNN, Hugging Face CausalLM/Phi, and PDF Q&A notebooks; use current T4 assumptions, avoid TensorRT-LLM and custom CUDA setup, provide deterministic smoke assertions, and make no unrelated pipeline changes.

## Linked Sources
- Original proposal: microsoft#2271
- GPU KNN component: microsoft#2157
- Local embedding component: microsoft#2236
- Hugging Face CausalLM/Phi component: microsoft#2301
- Current Databricks T4 validation platform: microsoft#2579
- PDF Q&A reference: https://github.com/microsoft/SynapseML/blob/master/docs/Explore%20Algorithms/AI%20Services/Quickstart%20-%20Document%20Question%20and%20Answering%20with%20PDFs.ipynb

## Rationale
The existing notebooks document the individual building blocks but not their local, service-free composition. Exact PyTorch cosine scoring keeps the tutorial small and fully testable on the active T4 suite without reviving the disabled RAPIDS pipeline or its obsolete CUDA/TensorRT initialization. The notebook uses supported current-master models, max_new_tokens rather than conflicting sequence limits, and a PR smoke mode that exercises every GPU stage.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: harden GPU RAG reproducibility checks

## Summary
Pin both Hugging Face repositories to immutable commit snapshots, load the Phi model and tokenizer from the same local snapshot with remote code disabled, and strengthen retrieval validation against input-order fallback.

## Prompting Intent
Address independent review findings on PR microsoft#2588 by removing mutable model resolution and trust_remote_code, then make the smoke test prove that GPU similarity ranking—not corpus order—selects the answer document.

## Linked Sources
- Follow-up pull request: microsoft#2588
- Original proposal: microsoft#2271
- Pinned embedding snapshot: https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/tree/1110a243fdf4706b3f48f1d95db1a4f5529b4d41
- Pinned Phi snapshot: https://huggingface.co/microsoft/Phi-4-mini-instruct/tree/cfbefacb99257ffa30c83adab238a50856ac3083

## Rationale
SentenceTransformer accepts an immutable revision for its complete model/tokenizer snapshot. HuggingFaceCausalLM loads its tokenizer separately, so Phi is first resolved to one pinned worker-local snapshot and both loaders receive that path. Transformers 4.49 natively supports the checkpoint's phi3 architecture, allowing remote model code to remain disabled. A persisted corpus ordinal and independent Python sort over all GPU scores prove the top-k result differs from the first input rows and has strict score ordering.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* style: format GPU RAG notebook cells

## Summary
Apply the repository-pinned Black 22.3 Jupyter formatter to the updated GPU RAG notebook cells.

## Prompting Intent
Resolve the Python Style CI failure on PR microsoft#2588 without changing notebook behavior or broadening the patch.

## Linked Sources
- Pull request: microsoft#2588
- Failed Azure build: https://msdata.visualstudio.com/b9b2accc-2d1c-45b3-9d24-0eb5d78cc47f/_build/results?buildId=229241355

## Rationale
Black's Jupyter formatter omits the terminal newline stored in each code cell. Formatting only the touched notebook aligns its JSON representation with the CI environment while preserving all model-pinning and retrieval assertions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: pin GPU RAG hub client and FP16

## Summary
Pin huggingface-hub 0.26.0 in the Databricks GPU libraries and notebook setup, verify the Hugging Face dependency set in unit tests, and force Phi model loading to FP16 on T4 hardware.

## Prompting Intent
Address the second independent re-review of PR microsoft#2588 by making snapshot_download's client version reproducible and preventing Phi's BF16 checkpoint metadata from selecting an unsupported native dtype on T4 GPUs.

## Linked Sources
- Pull request: microsoft#2588
- Repository environment pin: environment.yml
- Hugging Face Hub 0.26.0: https://pypi.org/project/huggingface-hub/0.26.0/
- Pinned Phi configuration: https://huggingface.co/microsoft/Phi-4-mini-instruct/blob/cfbefacb99257ffa30c83adab238a50856ac3083/config.json

## Rationale
Version 0.26.0 is already the repository-pinned lower bound used with Transformers 4.49.0, so installing that exact version on the GPU cluster makes snapshot resolution deterministic without introducing a new dependency choice. Phi advertises bfloat16 in its configuration, while NVIDIA T4 compute capability 7.5 lacks native BF16; passing the supported float16 dtype explicitly avoids architecture-dependent auto selection.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test: guard accelerate GPU dependency pin

## Summary
Assert that the Databricks GPU library manifest retains accelerate==0.26.0 alongside the pinned Hugging Face dependencies.

## Prompting Intent
Address the remaining actionable review feedback on PR microsoft#2588 by preventing the runtime dependency used for distributed Phi loading from drifting without a focused unit-test failure.

## Linked Sources
- Pull request: microsoft#2588
- Reviewed GPU library manifest: core/src/test/scala/com/microsoft/azure/synapse/ml/nbtest/DatabricksUtilities.scala

## Rationale
The package is already explicitly pinned in GPULibraries, so extending the existing parsed-manifest test is the smallest regression guard and avoids duplicating library configuration or changing runtime behavior.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
microsoft#2601)

* chore(deps): bump github/codeql-action/autobuild from 4.37.3 to 4.37.5

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: ranadeepsingh <16433904+ranadeepsingh@users.noreply.github.com>
Co-authored-by: Rana Singh <ranadeep.dtu@gmail.com>
…t#2603)

Bumps [postcss](https://github.com/postcss/postcss) from 8.5.19 to 8.5.25.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](postcss/postcss@8.5.19...8.5.25)

---
updated-dependencies:
- dependency-name: postcss
  dependency-version: 8.5.25
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rana Singh <ranadeep.dtu@gmail.com>
* chore: migrate artifact links off retiring Azure CDN

## Summary
Replace all 400 current-master references to mmlspark.azureedge.net with the repository-owned mmlspark Blob Storage origin across runtime package configuration, release output, examples, documentation, notebooks, and every published documentation version.

## Prompting Intent
Recreate the intent of the stale CDN-removal PR on current master only after verifying the supported artifact destination and Azure CDN retirement path. Audit each endpoint use by semantics, preserve package and content paths, validate live artifacts and package resolution, and avoid changing or closing the original PR.

## Linked Sources
- Original proposal: microsoft#2326
- Azure CDN retirement FAQ: https://learn.microsoft.com/en-us/azure/cdn/classic-cdn-retirement-faq
- Azure CDN migration guidance: https://learn.microsoft.com/en-us/azure/cdn/migrate-tier
- Azure Front Door/CDN comparison: https://learn.microsoft.com/en-us/azure/frontdoor/front-door-cdn-comparison

## Rationale
SynapseML's release pipeline publishes artifacts directly to the mmlspark storage account, the repository already uses that public Blob Storage origin extensively, and byte-for-byte URL checks confirmed the CDN currently proxies the same content. Using the verified origin removes the retiring CDN hostname without inventing an unverified Front Door name, while preserving Maven, documentation, R-package, model, dataset, and icon path semantics. Historical links that already return 404 retain the same status and are not broadened into unrelated artifact-repair work.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: make R setup independent of retired CDN

## Summary
Repair current and versioned R setup guidance so each release installs its six published, version-matched component archives and resolves SynapseML JVM artifacts through Blob Storage. Document the compatibility bypass required by already-published wrappers, correct the Databricks setup and LightGBM example, remove invalid HTML-page Maven repositories from the Docker demo, and add generator/docs regressions.

## Prompting Intent
Investigate the review finding that published R archives still register the retired Azure CDN resolver. Make repository-controlled R installation work with that hostname unavailable, avoid claiming that externally published archives were rewritten, validate local and Databricks-oriented resolution paths, and state the exact external publishing prerequisite for a full artifact migration.

## Linked Sources
- Original migration PR: microsoft#2326
- Current migration PR: microsoft#2589
- Maven repository review: microsoft#2589 (comment)
- Azure CDN retirement FAQ: https://learn.microsoft.com/en-us/azure/cdn/classic-cdn-retirement-faq
- Azure Front Door migration guidance: https://learn.microsoft.com/en-us/azure/cdn/migrate-tier
- Apache Spark package repository configuration: https://spark.apache.org/docs/3.5.0/configuration.html#runtime-environment

## Rationale
Existing release archives cannot be repaired by a source-only change because their generated sparklyr metadata is already published. Version-matched component downloads plus an explicit Blob resolver and `extensions = character()` provide a tested repository-controlled path without racing or misrepresenting external publication. Future generated archives inherit the corrected resolver from PackageUtils; fully repairing historical metadata still requires an authorized regeneration and publish to the `mmlspark/rrr` container (or a replacement release).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: correct Spark 3.4 compatibility guidance

## Summary
Correct the Spark Packages and Python installation snippets so both identify SynapseML 1.0.15 as the compatible release for Spark 3.4 while retaining SynapseML 1.1.3 for Spark 3.5.

## Prompting Intent
Address the remaining actionable review feedback on PR microsoft#2589 in the existing branch, verify the surrounding compatibility guidance stays consistent, run targeted website validation and code review, and rerun the full PR checks.

## Linked Sources
- Pull request and review feedback: microsoft#2589
- Original migration context: microsoft#2326

## Rationale
The Databricks, Fabric, and SBT guidance already distinguishes SynapseML 1.1.3 for Spark 3.5 from 1.0.15 for Spark 3.4. Updating only the two stale explanatory references restores consistency without changing the Spark 3.5 commands that the snippets demonstrate.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
feat: add backward-compatible AAD auth for Azure Search
…2593)

## Summary
Count rows on the original DataFrame RDD so adaptive execution cannot coalesce a projected counting query into a different partition topology. Add a regression that exposes the old 20-to-fewer-partitions drift and verifies exact per-partition counts.

## Prompting Intent
Recreate the valid intent behind ancient PR microsoft#2282 from current master only after reproducing issue microsoft#2278. Isolate distributed startup, feature-width bounds, and native pointer lifetime separately; use TDD and submit only a proven root cause with real regression coverage.

## Linked Sources
- Reported failure: microsoft#2278
- Superseded ancient proposal: microsoft#2282

## Rationale
The literal-only projection was cheaper, but AQE could optimize it to fewer partitions than the training DataFrame. LightGBM then indexed that shortened count array with real task partition IDs, causing the primary ArrayIndexOutOfBoundsException and secondary connection failures. Counting the exact DataFrame RDD trades projection pruning for topology correctness. Feature-width validation and innerPredict cleanup were deliberately excluded because neither was demonstrated as the cause of microsoft#2278 or backed by a stable leak regression.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.37.3 to 4.37.4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@e4fba86...f205ea1)

---
updated-dependencies:
- dependency-name: github/codeql-action/upload-sarif
  dependency-version: 4.37.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.37.4 to 4.37.5.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@f205ea1...d1ba80a)

---
updated-dependencies:
- dependency-name: github/codeql-action/upload-sarif
  dependency-version: 4.37.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…#2605)

The Azure AI Anomaly Detector service has been retired by Microsoft. Every
`anomalydetector` REST endpoint now answers HTTP 410 (Gone), verified across
paths, API versions and regions.
* fix: correct LightGBM improvement tolerance semantics

## Summary
Require lower-is-better validation metrics to improve by more than improvementTolerance before resetting the early-stopping counter. Clarify the parameter documentation and add focused regression coverage for both metric directions and zero tolerance.

## Prompting Intent
Investigate GitHub issue microsoft#2565 from a new branch based on master, determine whether the report is valid, and implement a complete fix suitable for an upstream SynapseML pull request.

## Linked Sources
- GitHub issue: microsoft#2565

## Rationale
The existing higher-is-better comparison already treats improvementTolerance as a minimum delta, while lower-is-better metrics accepted small regressions. A package-internal comparison helper makes the intended symmetric behavior directly testable without adding a slow native LightGBM fixture or changing public APIs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: harden LightGBM early stopping parameters

## Summary
Expand improvement-tolerance coverage across representative LightGBM metrics and tolerance values. Preserve disabled early stopping when earlyStoppingRound is zero, validate both early-stopping parameters, and document their accepted ranges.

## Prompting Intent
The engineer requested broader parameter testing to ensure the issue microsoft#2565 fix does not introduce downstream regressions. Cover related defaults, boundaries, metric families, invalid values, and early-stopping-round interactions before updating the pull request.

## Linked Sources
- GitHub issue: microsoft#2565
- Pull request: microsoft#2578
- LightGBM 3.3.5 parameters: https://lightgbm.readthedocs.io/en/v3.3.5/Parameters.html#early-stopping-round

## Rationale
Correct tolerance semantics classify more rounds as non-improving, so the wrapper must explicitly preserve LightGBM's zero-means-disabled behavior. Shared Spark parameter validators reject values that LightGBM does not support, while deterministic matrix tests cover the decision logic without depending on platform-specific native binaries.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: prevent sbt bootstrap Maven rate limits

SynapseML's Azure Pipelines fans out ~30 hosted-agent matrix jobs that each
cold-bootstrap the sbt launcher (org.scala-sbt:sbt:1.10.11, pinned in
project/build.properties) and resolve Ivy dependencies from public Maven
Central. When many fresh agents -- and several overlapping PR builds -- do this
simultaneously, Maven Central returns HTTP 429 (rate limit) and "Setup repo"
fails before any test runs (e.g. ADO build 229124511, UnitTests flaky). The
pre-existing jittered retries only widened the window against a sustained
throttle; they did not remove the thundering herd.

Durable fix (cache-first, stagger as supplement):

* templates/sbt_cache.yml (primary): Azure Cache@2 for the sbt launcher boot
  dir (~/.sbt/boot -- the artifact that 429s) and the Ivy cache (~/.ivy2/cache).
  In steady state, jobs restore these from Azure's cache service and never touch
  Maven Central. Keys derive from the bootstrap inputs (project/build.properties,
  project/plugins.sbt, build.sbt) so they invalidate exactly when those change;
  restoreKeys give a safe partial fallback and continueOnError keeps a cache
  miss/corruption non-fatal.
* BuildAndCacheSbt prewarm job: warms those caches once per run, mirroring the
  existing BuildAndCacheCondaEnv job.
* tools/ci/sbt_retry.sh: single tested helper replacing the duplicated inline
  retry blocks. Smooths only the cold-cache path with a bounded random start
  stagger (desynchronises concurrent cold bootstraps) plus bounded jittered
  exponential-backoff retries. Fails visibly on exhaustion -- no success
  fallback masking.

Wired the shared cache template into every sbt-running job (Style, Publish,
Databricks/Fabric E2E, BuildDocker, PythonTests, RTests, WebsiteSamplesTests,
UnitTests, ReleaseBranchCompat) by reviving the dormant ivy_cache placeholders,
and routed all `sbt setup` bootstraps through the helper.

Tests (python -m pytest tools/ci/tests/): deterministically exercise the
retry/backoff/stagger + visible-failure behaviour with a fake sbt, and assert
pipeline.yaml parses, the cache keys invalidate on bootstrap inputs, and every
sbt job is wired to the cache template + prewarm job.

No LightGBM, Isolation Forest, GPU, or application changes. TLS verification,
job coverage, and all tests are preserved.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: serialize sbt cache prewarm before fan-out

## Summary
Make the sbt bootstrap prewarm a mandatory gate before Azure Pipeline matrix jobs start. Add Coursier caching, require exact hits on the boot, Ivy, and Coursier caches before disabling the cold-cache stagger, wire the conditional release job, and strengthen pipeline tests around the dependency graph and cache lifecycle.

## Prompting Intent
The engineer asked to fix Maven Central HTTP 429 setup failures in a new stacked PR. The solution must prevent fresh hosted agents from cold-bootstrapping sbt concurrently, allow at least the existing job fan-out after bootstrap is safe, retain bounded retry behavior for cache-service failures, and keep bootstrap failures visible rather than masking them.

## Linked Sources
- Failing Azure job: https://msdata.visualstudio.com/b9b2accc-2d1c-45b3-9d24-0eb5d78cc47f/_build/results?buildId=229124511&view=logs&jobId=e97036a1-bcdb-5cd5-905e-b0cf2c8f33cf
- Parent PR investigation: microsoft#2578 (comment)
- Stacked PR: microsoft#2581
- Prewarm concurrency review: microsoft#2581 (comment)

## Rationale
A best-effort prewarm running beside the matrix does not protect the first run for a new dependency key, so every sbt-running job now waits for one successful warm job. Cache-service errors remain non-fatal and fall back to staggered retries, but a failed warm blocks fan-out to avoid recreating the thundering herd. Coursier is cached alongside sbt boot and Ivy because modern resolution uses all three stores, and the stagger is suppressed only when every cache is an exact hit so dependency-only changes remain desynchronized.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: skip Databricks E2E for non-impacting PRs

## Summary
Add conservative pull-request impact detection for the six-leg Databricks E2E matrix. Clearly non-impacting documentation, website, GitHub metadata, CI helper, and isolated test-source changes skip Databricks, while all uncertain or runtime-affecting changes continue to run it.

## Prompting Intent
The engineer asked to extend PR microsoft#2581 so expensive Databricks Azure Pipeline jobs are skipped when the pull request cannot affect notebook execution. The gate must preserve scheduled and branch coverage, avoid brittle CPU-shard mapping, and default to running whenever impact detection is incomplete or uncertain.

## Linked Sources
- Stacked CI PR: microsoft#2581
- Full green baseline build: https://msdata.visualstudio.com/b9b2accc-2d1c-45b3-9d24-0eb5d78cc47f/_build/results?buildId=229164855
- Azure multi-job output variables: https://learn.microsoft.com/en-us/azure/devops/pipelines/process/conditions?view=azure-devops#job-output-variables-used-in-other-job-conditions

## Rationale
Use one fail-open decision for the complete Databricks matrix because the five CPU partitions mix notebooks across modules and are not stable ownership boundaries. The detector skips only a narrow allowlist of clearly inert paths; runtime code, notebooks, build and pipeline files, Databricks test utilities, shared TestBase infrastructure, unknown paths, empty diffs, and fetch or classifier failures all keep E2E enabled. Non-PR builds always run to preserve scheduled and release coverage.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: gate Databricks CPU and GPU tests independently (microsoft#2582)

* Gate Databricks CPU and GPU tests independently

## Summary
Classify changed paths against the actual Databricks CPU and GPU runtime surfaces, emit separate fail-open decisions, and gate each matrix leg independently.

## Prompting Intent
The engineer asked to determine exactly when Databricks tests should run, lock down the path rules, and deliver the work as a stacked pull request above PR microsoft#2581.

## Linked Sources
- Base CI hardening PR: microsoft#2581
- GitHub stacked PR documentation: https://docs.github.com/en/pull-requests/how-tos/create-pull-requests/creating-stacked-pull-requests
- ADO timing audit: build 229176406

## Rationale
CPU and GPU decisions are separated because most module changes cannot affect the expensive GPU notebooks. Unknown paths and shared build or test infrastructure remain fail-open, while explicit test-only and unrelated tooling paths skip safely. This preserves coverage while avoiding unrelated GPU capacity waits.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: fix and streamline release branch compatibility (microsoft#2583)

* Fix and streamline release branch compatibility checks

## Summary
Run release compatibility checks for both GitHub target-branch formats and replace redundant compile, setup, credential, and per-package SBT tasks with one cached, project-scoped validation process.

## Prompting Intent
The engineer asked to fix the silently skipped ReleaseBranchCompat job and simplify it before enabling it so the check is both reliable and efficient.

## Linked Sources
- Base CI hardening PR: microsoft#2581
- Evidence build with skipped phase: ADO build 229176406
- Parent stack layer: ci/databricks-impact-gating

## Rationale
The target condition accepts both values observed across Azure Repos and GitHub PR providers. A single SBT process retains full test compilation and the intended core, VW, and OpenCV compatibility suites while removing repeated build loading, root-wide IntelliJ setup, unnecessary Key Vault access, and Azure CLI authentication.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: use Entra authentication for ACR cleanup (microsoft#2584)

* Use Entra authentication for ACR cleanup

Make the weekly ACR cleanup schedule-only, switch it to the dedicated cleanup service connection, replace storage connection-string authentication with Azure CLI Entra authentication, and add fail-safe cleanup tests.

The engineer asked to repair the weekly cleanup failures caused by disabled key-based storage authentication, use the declared least-privileged identity, and prevent accidental CI or PR execution.

- Failed scheduled build: ADO build 228250033
- Base CI hardening PR: microsoft#2581
- Azure CLI pipeline-run reference: https://learn.microsoft.com/en-us/cli/azure/acr/pipeline-run
- Parent stack layer: ci/release-branch-compat

Using az storage blob exists with auth-mode login keeps all operations inside the AzureCLI task identity and removes runtime SDK installation, Key Vault access, and storage keys. Images are deleted only after the archive is confirmed, and subprocess argument lists avoid shell interpolation of registry-controlled names.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove redundant CI authentication and Conda work (microsoft#2585)

## Summary
Run non-Azure setup and coverage commands as Bash steps, install pinned Black without restoring the 8.6 GB Conda environment, and remove the ineffective standalone Conda cache consumer.

## Prompting Intent
The engineer asked for additional improvements that should ship with the requested CI fixes to make builds faster and more reliable without broad behavioral changes.

## Linked Sources
- CI efficiency audit from ADO build 229176406
- Base CI hardening PR: microsoft#2581
- Parent stack layer: ci/fix-acr-cleanup-auth

## Rationale
AzureCLI tasks create an isolated login for every invocation, so setup and coverage steps that never call az gain no authentication benefit. The Style job only needs pinned Black, not the full cached environment. The standalone Conda job was not a dependency and therefore could not prewarm consumers or prevent cold-cache fan-out.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: extend Docker validation timeout

## Summary
Raise the BuildDocker job timeout from 60 to 120 minutes and add a pipeline
regression test that preserves enough time for both sequential image builds.

## Prompting Intent
The engineer asked to diagnose and fix the remaining failure on microsoft#2581 and to
continue full validation until the parent PR is ready, without hiding genuine
test failures.

## Linked Sources
- Parent PR: microsoft#2581
- Failed PR build: https://msdata.visualstudio.com/b9b2accc-2d1c-45b3-9d24-0eb5d78cc47f/_build/results?buildId=229579403
- Matching master failure: https://msdata.visualstudio.com/b9b2accc-2d1c-45b3-9d24-0eb5d78cc47f/_build/results?buildId=229578121
- Matching master failure: https://msdata.visualstudio.com/b9b2accc-2d1c-45b3-9d24-0eb5d78cc47f/_build/results?buildId=229580525
- Matching master failure: https://msdata.visualstudio.com/b9b2accc-2d1c-45b3-9d24-0eb5d78cc47f/_build/results?buildId=229576499

## Rationale
The Dockerfiles and image behavior were unchanged, but recent hosted-agent
builds required roughly 51 minutes when successful and exceeded the default
one-hour job cap in multiple master and PR runs. A 120-minute job budget keeps
both image validations mandatory while tolerating current registry and package
download latency. This is safer and more targeted than skipping an image or
doubling agent usage by splitting the builds into parallel jobs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: address PR review and protect package publishing

## Summary
Resolve the blocking PR microsoft#2581 review findings by making ACR archival digest-safe, correcting PipelineRun names and sbt cache invalidation, warming cold agents before direct sbt calls, and validating the canonical package version before publishing.

## Prompting Intent
The engineer asked to rebase PR microsoft#2581 onto current master, audit the new review feedback, fix valid actions, ensure the pipelines continue to publish package versions safely, review the complete change, and rerun Azure validation.

## Linked Sources
- Integration PR and review threads: microsoft#2581
- Stacked CI changes: microsoft#2582
- Stacked CI changes: microsoft#2583
- Stacked CI changes: microsoft#2584
- Stacked CI changes: microsoft#2585
- ACR transfer guidance: https://learn.microsoft.com/azure/container-registry/container-registry-transfer-images
- ACR image deletion behavior: https://learn.microsoft.com/azure/container-registry/container-registry-delete

## Rationale
Immutable manifest digests prevent mutable tags such as latest from reusing the wrong backup or deleting an unarchived manifest. Per-agent warming is limited to unavailable or inexact cache restores so exact hits remain fast, while the prewarm job still verifies dependency resolution. Package versions are resolved from the SBT source of truth and release publication fails before side effects when the v-tag disagrees.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: Add lossless string identifier support to SAR

Refs microsoft#2275
Refs microsoft#2283

## Summary
Add deterministic, reversible user and item identifier mappings to SAR so string and wide numeric IDs are never cast into lossy caller-visible values. Persist mappings with the model, preserve identifier types in scores and recommendations, define null and unknown-ID behavior, restore typed item recommendation APIs, and add Scala and Python regression coverage.

## Prompting Intent
Recreate the intent of the stale SAR string-ID change on current master without copying its lossy casts. Keep the SparkML API coherent and backward compatible for numeric users, use TDD, validate serialization and schema behavior, expose Python wrappers, and exercise targeted compile, style, code generation, Scala, and Python/JVM checks before opening a replacement PR.

## Linked Sources
- Feature request: microsoft#2275
- Original pull request: microsoft#2283
- Current SAR implementation at the starting revision: https://github.com/microsoft/SynapseML/tree/7d9fabcc/core/src/main/scala/com/microsoft/azure/synapse/ml/recommendation
- Repository review policy: .github/skills/code-review/SKILL.md

## Rationale
Use model-owned typed mappings instead of composing RecommendationIndexer because that stage stringifies numeric identifiers, exposes index columns, and cannot recover every original type. Contiguous deterministic indices keep the existing matrix implementation viable, while persisted DataFrame parameters make decoding reversible after save/load. Inner mapping joins intentionally drop null or unseen scoring IDs, strict type validation prevents ambiguous conversions, and legacy numeric models fall back to identity mappings. The approach accepts a deterministic global sort and persisted mapping storage in exchange for lossless, reproducible SparkML behavior.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: Address SAR identifier compatibility review

Refs microsoft#2275
Refs microsoft#2594

## Summary
Resolve the four independent review findings on SAR string identifier support. Preserve typed IDs in ranking train/validation splits, accept only round-trip-safe numeric scoring casts, retain established integer recommendation schemas for safely representable numeric IDs, and rank only factor IDs that have real mappings. Add focused Scala and Python regressions and remove unnecessary mapping cache and interaction-count work identified during review.

## Prompting Intent
The engineer asked to fix all medium correctness and compatibility findings on PR microsoft#2594, add a regression for each, rerun targeted Scala, code generation, formatting, and Python/JVM validation, then update the existing PR and request re-review without weakening lossless string or wide numeric behavior.

## Linked Sources
- Pull request and review context: microsoft#2594
- Feature request: microsoft#2275
- Original pull request: microsoft#2283
- Repository review policy: .github/skills/code-review/SKILL.md

## Rationale
Use Spark structs and array functions instead of Double UDF payloads so split schemas remain typed. Numeric scoring IDs are temporarily cast only when casting back reproduces the input, preventing overflow and fractional aliasing while retaining unknown-ID drop semantics. Recommendation decoding conditionally uses the historical integer schema only when every ID round-trips through Int; strings and wide or fractional numeric IDs remain lossless. Candidate indices are intersected with both factors and mappings before top-K so gaps cannot consume recommendation slots.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: Make SAR numeric identifier handling ANSI-safe

Refs microsoft#2275
Refs microsoft#2594

## Summary
Use ANSI-safe try_cast expressions for numeric identifier compatibility and legacy mappings. Persist whether model-owned user and item mappings safely round-trip through IntegerType, reuse those flags when selecting recommendation output schemas, and limit destination-index collection to mapping-less legacy models. Add ANSI overflow, persisted-flag, legacy-default, and recommendation-planning regressions.

## Prompting Intent
The engineer asked to resolve the second independent review of PR microsoft#2594: prevent CAST_OVERFLOW under spark.sql.ansi.enabled=true, eliminate repeated mapped-model recommendation scans and index collection, add focused regressions, rerun Scala/codegen/Python validation, update the existing PR, trigger Azure Pipelines, and request another re-review.

## Linked Sources
- Pull request and review context: microsoft#2594
- Feature request: microsoft#2275
- Original pull request: microsoft#2283
- Repository review policy: .github/skills/code-review/SKILL.md

## Rationale
Use Spark SQL try_cast in both cast directions rather than pre-cast comparisons so out-of-range values become null and are filtered even with ANSI mode enabled. Compute compatibility once while fitting and persist it with conservative false defaults for legacy models, avoiding full mapping scans on every recommendation call. New model mappings are contiguous, so mapped models rank the score vector directly; only mapping-less legacy models collect actual candidate indices to preserve gapped-ID correctness.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Configure a deterministic repository-local Git committer identity before replaying PR commits onto the Spark 3.5 and Spark 4.1 release branches. Distinguish genuine merge conflicts from rebase infrastructure failures and preserve successful rebase diagnostics.
* ci: preserve sbt retry helper during release replay

## Summary
Stage the sbt retry helper outside the repository before switching to Spark release branches, and parameterize the shared cache template so it can invoke that stable path after rebase.

## Prompting Intent
Investigate why Spark 3.5 and Spark 4.1 compatibility checks still failed after PR microsoft#2608, reproduce the failure with PR microsoft#2595 changes, implement the complete hotfix, and validate the real release replay path.

## Linked Sources
- Failing PR: microsoft#2595
- Prior identity hotfix: microsoft#2608
- Failed Azure build: https://msdata.visualstudio.com/b9b2accc-2d1c-45b3-9d24-0eb5d78cc47f/_build/results?buildId=229969678

## Rationale
The rebased working tree intentionally comes from the Spark release branch, so master-only CI helpers cannot remain repository-relative. Copying the helper to Agent.TempDirectory preserves release-specific dependency resolution and avoids moving cache warming ahead of the rebase, where exact cache hits could hide missing release dependencies.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: replay only release-relevant PR changes

## Summary
Replace commit-history rebasing with a three-way application of the synthetic PR merge tree's release-relevant patch onto each Spark release branch.

## Prompting Intent
Validate the compatibility hotfix with PR microsoft#2595's real source changes while ensuring CI-only commits do not conflict with old Spark branches that predate the current pipeline and helper files.

## Linked Sources
- Validation PR source: microsoft#2595
- Prior identity hotfix: microsoft#2608
- Failed Azure build: https://msdata.visualstudio.com/b9b2accc-2d1c-45b3-9d24-0eb5d78cc47f/_build/results?buildId=229969678

## Rationale
The compatibility job needs the effective PR content on the release tree, not unrelated CI and documentation commits. Building the patch from the synthetic merge commit preserves GitHub's merge result, handles source branches behind master, retains three-way conflict detection, and avoids requiring commit identity.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* ci: focus release compatibility on Spark 4.1 compilation

## Summary
Remove the redundant Spark 3.5 release matrix leg and replace broad Spark 4.1 runtime suites with full test compilation of the effective PR patch.

## Prompting Intent
Explain why the release compatibility jobs exist and keep fixing the failures exposed by validation PR microsoft#2610, accounting for master already targeting Spark 3.5.

## Linked Sources
- Original compatibility PR: microsoft#2550
- Streamlining PR: microsoft#2583
- Integration validation PR: microsoft#2610
- Azure validation build: https://msdata.visualstudio.com/b9b2accc-2d1c-45b3-9d24-0eb5d78cc47f/_build/results?buildId=229984834

## Rationale
Normal PR validation already compiles and tests master on Spark 3.5, so replaying onto the older spark3.5 maintenance snapshot duplicates coverage and introduces unrelated JVM drift. Spark 4.1 test compilation catches cross-version source and test API breakage, while the existing master test fan-out supplies runtime coverage without rerunning broad, memory-heavy suites on a constrained compatibility agent.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: SynapseML CI <synapseml-ci@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Apply the exact master follow-up patch to the already synced master baseline
for normal merging into the two Spark ports.

## Prompting Intent
Resolve the sync review findings without importing newly merged CI policy
changes that still require separate approval.

## Linked Sources
- Source commit: 8ea6dfe
- Master prerequisite: microsoft#2732
- Spark sync review: microsoft#2734 (comment)
- Review records: reviews/pr-2732/task-job-wait-errors-attempt-1-review-*.md

## Rationale
Master's ordinary prerequisite branch has been rebased onto newer CI changes.
Preserve the earlier sync ancestry and carry only this reviewed source,
documentation, and report-layout correction. Verify patch equivalence and
shared helper content against the master source commit. Each port receives
this commit by a normal merge and performs its own JDK 17 validation.
The master patch passed both compilation/style checks and 53 cleanup tests.
No pipeline, dependency, or release configuration changes are included.
The Gemini-family review limitation remains explicit.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Carry the reviewed master-first job-wait correction and review-record cleanup
into this port by a normal merge. Place this port's own historical reports
under its numbered PR directory.

## Prompting Intent
Resolve current-head sync review findings while retaining the port runtime,
CI policy, disabled Fabric E2E, and requested deletion-confirmation cadence.

## Linked Sources
- Master prerequisite: microsoft#2732
- Spark 4.0 sync: microsoft#2733
- Spark 4.1 review: microsoft#2734 (comment)
- Review records: reviews/pr-2732/task-job-wait-errors-attempt-1-review-*.md

## Rationale
The master prerequisite was rebased after master acquired approval-gated CI
changes. Apply its exact follow-up patch to the previously synced master
baseline, then merge that portable branch into each port. This retains merge
ancestry without importing unapproved pipeline changes. Shared helper content
must match the master fix, and each port must pass compilation, test compilation,
both Scala style checks, and all 53 tracker/naming tests before this commit.
Historical report names, reviewed revisions, findings, and resolutions remain
available in numbered PR directories.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Rana Singh (ranadeepsingh) added a commit to ranadeepsingh/SynapseML that referenced this pull request Sep 22, 2026
## Summary
Carry the reviewed master-first job-wait correction and review-record cleanup
into this port by a normal merge. Place this port's own historical reports
under its numbered PR directory.

## Prompting Intent
Resolve current-head sync review findings while retaining the port runtime,
CI policy, disabled Fabric E2E, and requested deletion-confirmation cadence.

## Linked Sources
- Master prerequisite: microsoft#2732
- Spark 4.0 sync: microsoft#2733
- Spark 4.1 review: microsoft#2734 (comment)
- Review records: reviews/pr-2732/task-job-wait-errors-attempt-1-review-*.md

## Rationale
The master prerequisite was rebased after master acquired approval-gated CI
changes. Apply its exact follow-up patch to the previously synced master
baseline, then merge that portable branch into each port. This retains merge
ancestry without importing unapproved pipeline changes. Shared helper content
must match the master fix, and each port must pass compilation, test compilation,
both Scala style checks, and all 53 tracker/naming tests before this commit.
Historical report names, reviewed revisions, findings, and resolutions remain
available in numbered PR directories.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ranadeepsingh Rana Singh (ranadeepsingh) changed the title chore: sync latest master into spark4.0 chore: sync master fixes into spark4.0 Sep 22, 2026
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/review

@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

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

## Summary
Reject malformed nested relation metadata instead of discarding dependency
edges. Preserve earlier deletion failures when a later metadata read aborts,
and avoid self-suppression when cleanup reports a reused exception.
Add fake-client regressions, document the accepted relation shape, and retain
the review findings and their resolutions.

## Prompting Intent
The engineer requested separate worktrees and sync pull requests carrying
relevant master changes into spark4.0 and spark4.1, using the SynapseML PR loop.
Review of that sync exposed these cleanup defects. Isolate portable fixes on
master first rather than maintaining different cleanup implementations on ports.

## Linked Sources
- microsoft#2728
- microsoft#2728 (comment)
- AGENTS.md: cross-version changes land on master before port integration
- .github/skills/synapseml-pr-loop/SKILL.md
- reviews/fabric-cleanup-relations-20260921/

## Rationale
A partial dependency graph can authorize unsafe deletion, so unknown metadata
must abort inventory collection. Keep outer empty/null relation semantics and
valid nested GUID references. Preserve the current inventory exception while
attaching earlier deletion errors, including failed job-history or schedule
reads; never continue deleting after the metadata read fails.
Identity guards retain real failures instead of replacing them with a
self-suppression exception. This changes test infrastructure only, not public
SparkML APIs, dependency pins, pipeline settings, or runtime enablement.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Keep recoverable DELETE errors separate from inventory and confirmation errors.
Abort the candidate loop when confirmation fails, preserving the original
exception and earlier deletion failures. Cover all read sites, previous-error
and repeated-error combinations, and the bounded multi-job confirmation case.
Register extracted failure tests on the existing CI-selected tracker suite.
Normalize machine-local paths in review records without changing their findings.

## Prompting Intent
The engineer requested isolated master sync PRs for Spark 4.0 and Spark 4.1
through the SynapseML PR loop. Resolve the current-head review findings before
rerunning validation, and carry portable corrections through master first.

## Linked Sources
- microsoft#2732 (comment)
- microsoft#2733
- microsoft#2734
- microsoft#2734 (comment)
- microsoft#2734 (comment)
- microsoft#2734 (comment)
- microsoft#2734 (comment)
- microsoft#2734 (comment)
- microsoft#2734 (comment)
- microsoft#2734 (comment)
- pipeline.yaml: explicit FabricTestArtifactTrackerSuite selection
- reviews/pr-2708/README.md: review-record publication conventions
- reviews/fabric-cleanup-relations-20260921/

## Rationale
A failed post-DELETE inventory read must not permit another DELETE. Capture
only actual DELETE failures as recoverable results; keep confirmation outside
that boundary and use one nonfatal abort handler for the full candidate loop.
An unconfirmed deletion also stops the run, while independent jobs may still
be attempted after an ordinary DELETE error. Reuse the existing helper instead
of adding tagged exception wrappers or disabling style rules.
Mix extracted tests into the already scheduled suite so CI executes them without
changing pipeline configuration. Preserve historical review content while
replacing private checkout/log locations with portable evidence references.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Restrict per-artifact cleanup recovery to NonFatal. Interrupts and fatal
cleanup errors now escape even when the notebook body has already failed.
Preserve the body error as suppressed where supported, with an identity guard.
Add 15 throwable/body combinations and a shared-instance regression to the
existing CI-selected tracker suite, and document the behavior.

## Prompting Intent
The engineer requested separate master sync pull requests for spark4.0 and
spark4.1 using the SynapseML PR loop. Address the verified cleanup review
finding on master first, then carry the exact commit into both port branches
without changing their runtime baselines.

## Linked Sources
- Finding: microsoft#2734 (comment)
- Master prerequisite: microsoft#2732
- Spark 4.0 sync: microsoft#2733
- Spark 4.1 sync: microsoft#2734
- Original cleanup work: microsoft#2728
- Review records: reviews/fabric-cleanup-relations-20260921/task-fatal-cleanup-attempt-1-review-*.md

## Rationale
Use NonFatal for recoverable cleanup and explicitly rethrow excluded errors
after retaining the original failure. Keep the body's catch-and-rethrow and
ordinary cleanup-error suppression unchanged. Regressions demonstrated both
fatal masking and lost body diagnostics before their fixes. The fixed master
passes compile, test compile, production/test Scala style, and all 48 tracker
and naming tests. Review records retain the unavailable Gemini-family gate;
they do not claim complete three-family review or full Azure validation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Check deletion immediately, then at most ten more times with 30-second waits
per artifact. Preserve the existing fail-closed ordering and error handling.
Inject the sleep duration so tests verify 30000 ms and a 300000 ms wait budget.
Expand boundary coverage and document that HTTP request time is additional.

## Prompting Intent
The engineer explicitly requested 30-second polling with a five-minute
maximum, superseding the earlier one-minute request. Match the existing
bounded confirmation pattern, keep one deletion call per candidate, and
carry the portable master-first fix into both Spark sync pull requests.

## Linked Sources
- Engineer request: "update it so it polls every 30 seconds with a max timeout of 5 mins"
- Master prerequisite: microsoft#2732
- Original bounded polling: microsoft#2728
- Spark 4.0 sync: microsoft#2733
- Spark 4.1 sync: microsoft#2734
- Review records: reviews/pr-2732/task-cleanup-polling-30s-attempt-1-review-*.md

## Rationale
Use eleven reads and ten waits rather than a shared or wall-clock deadline,
matching the referenced per-item wait-budget semantics. Duration-aware
sleeper injection tests the actual requested delays without real sleeps.
Regressions cover immediate, first, middle, and final success, fresh child
and parent budgets, exhaustion, inventory errors, conflicting metadata,
interrupts, and protected consumers. Five unchanged failure tests move into
the existing mix-in to preserve the 800-line limit and CI test registration.
The old 31-read/two-second policy failed the new assertions. The final master
passes core compile, test compile, production/test Scala style, and all 50
tracker/naming tests. No runtime pins, pipeline policy, or release tooling
changes are included. Gemini-family review remains explicitly unavailable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Use one exception boundary for smoke and notebook job waits. Restore interrupt
status, rethrow the original interrupt or fatal error, and retain notebook
context for ordinary failures. Add deterministic regressions and document the
contract. Move cleanup review history under its numbered PR directory and
correct a misleading timing statement while preserving its original wording
as explicitly labeled historical feedback.

## Prompting Intent
Complete the requested Spark sync PR loop and address all current-head review
findings without changing runtime pins, CI policy, or Fabric enablement.
Preserve the requested 30-second, per-item five-minute waiting budget.

## Linked Sources
- Smoke wait review: microsoft#2734 (comment)
- Report placement review: microsoft#2734 (comment)
- Timing wording review: microsoft#2732 (comment)
- Master prerequisite: microsoft#2732
- Review records: reviews/pr-2732/task-job-wait-errors-attempt-1-review-*.md

## Rationale
Share the notebook path's existing exception policy rather than maintaining a
second catch-all in smoke tests. The original smoke await/assert semantics and
resource lifecycle remain unchanged. After behavior-preserving extraction,
the previous catch-all failed the interrupt and fatal-error regressions.
Master compilation, test compilation, both Scala style checks, and all 53
tracker/naming tests pass. Tests use an actual interrupted Await without
contacting Fabric. No public SparkML signature or serialized parameter changes.
Gemini-family review remains unavailable rather than being reported as passed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Merge master 0a7fdaf into the existing
Spark 4.0 sync. Import the portable test cleanup and conservative notebook
selection changes while retaining the Spark 4.0 runtime and Python compatibility.

## Prompting Intent
The user requested updating both existing Spark sync PRs with the latest master
changes, maximizing master compatibility while honoring Spark- and
Python-specific differences.

## Linked Sources
- Sync PR: microsoft#2733
- Cleanup prerequisite: microsoft#2732
- Test retirement: microsoft#2735
- Notebook selection: microsoft#2736
- Master: microsoft@0a7fdaf
- Review evidence: reviews/pr-2733/task-latest-master-20260922-attempt-1-review-*.md

## Rationale
Use a normal merge to retain master's ancestry, including the landed cleanup
fixes already present in this PR. Accept the obsolete Python runner deletion
rather than preserving its irrelevant Scala-version edit. Keep Fabric E2E
disabled and assert that port requirement in the imported selector wiring test.
The selector itself matches master. Production code, dependency pins, runtime
profiles, streaming scheduling, and existing Spark/Python adaptations remain
unchanged from the previously validated port head.
Strengthen the full-test override regression with valid skippable merge metadata
and the non-PR bypass regression with a detection tripwire. Document the disabled
Fabric boundary accurately. These review fixes do not change selector behavior
or enable unsupported runtime jobs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

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

## Summary
Replace checkout-specific metadata in the latest-master review headers with
a generic description. Preserve reviewed revisions, fingerprints, source
references, findings, and resolution history.

## Prompting Intent
Address current-head review feedback while updating the existing Spark sync
PRs, without changing the reviewed code or branch-specific runtime behavior.

## Linked Sources
- microsoft#2733
- microsoft#2734 (comment)
- microsoft#2734 (comment)
- microsoft#2734 (comment)
- Review-record convention: reviews/pr-2708/README.md

## Rationale
Apply the same artifact-only correction to both ports and to round 1 as well
as the three reported headers. A direct six-theme metadata audit verifies
the correction; the completed source reviews and local validation remain
applicable because no executable code, tests, or configuration changed.
Fresh current-head Azure validation remains required after publication.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Rana Singh (ranadeepsingh) added a commit to ranadeepsingh/SynapseML that referenced this pull request Sep 22, 2026
## Summary
Replace checkout-specific metadata in the latest-master review headers with
a generic description. Preserve reviewed revisions, fingerprints, source
references, findings, and resolution history.

## Prompting Intent
Address current-head review feedback while updating the existing Spark sync
PRs, without changing the reviewed code or branch-specific runtime behavior.

## Linked Sources
- microsoft#2733
- microsoft#2734 (comment)
- microsoft#2734 (comment)
- microsoft#2734 (comment)
- Review-record convention: reviews/pr-2708/README.md

## Rationale
Apply the same artifact-only correction to both ports and to round 1 as well
as the three reported headers. A direct six-theme metadata audit verifies
the correction; the completed source reviews and local validation remain
applicable because no executable code, tests, or configuration changed.
Fresh current-head Azure validation remains required after publication.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/review

@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

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

Label: chore

## Summary
Merge master 681bd96 into the existing
Spark 4.0 sync PR. Import the external-contributor review procedure, PR writing
and readiness guidance, bounded Azure monitor, and its regression tests.

## Prompting Intent
The engineer merged another PR into master and asked to include its contents
in both Spark branch PRs and get them ready. Keep separate worktrees, maximize
master compatibility, and preserve necessary Spark and Python differences.

## Linked Sources
- New master changes: microsoft#2730
- Spark 4.0 sync: microsoft#2733
- Spark 4.1 sibling sync: microsoft#2734
- Master source: microsoft@681bd96
- Repository branch and validation rules: AGENTS.md and .github/skills/synapseml-branches/
- Current integration review evidence: reviews/pr-2733/task-master-2730-sync-attempt-1-review-*

## Rationale
Use a normal merge, not a rebase or force push. Eight incoming paths retain
master's exact contents. Strengthen one shared regression fixture so valid
success-shaped JSON cannot hide an ignored CLI failure. A memory-only guard
mutation proves that the new assertion detects the regression. Production
watcher behavior is unchanged; no port-specific adaptation is needed.
Leave production code, dependencies, runtime profiles, templates, pipeline
configuration, and existing coverage exclusions unchanged. Previous-head CI
is a baseline only; publish and audit fresh validation for the resulting head.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Rana Singh (ranadeepsingh) added a commit to ranadeepsingh/SynapseML that referenced this pull request Sep 22, 2026
Label: chore

## Summary
Merge master 681bd96 into the existing
Spark 4.1 sync PR. Import the external-contributor review procedure, PR writing
and readiness guidance, bounded Azure monitor, and its regression tests.

## Prompting Intent
The engineer merged another PR into master and asked to include its contents
in both Spark branch PRs and get them ready. Keep separate worktrees, maximize
master compatibility, and preserve necessary Spark and Python differences.

## Linked Sources
- New master changes: microsoft#2730
- Spark 4.1 sync: microsoft#2734
- Spark 4.0 sibling sync: microsoft#2733
- Master source: microsoft@681bd96
- Repository branch and validation rules: AGENTS.md and .github/skills/synapseml-branches/
- Current integration review evidence: reviews/pr-2734/task-master-2730-sync-attempt-1-review-*

## Rationale
Use a normal merge, not a rebase or force push. Eight incoming paths retain
master's exact contents. Strengthen one shared regression fixture so valid
success-shaped JSON cannot hide an ignored CLI failure. A memory-only guard
mutation proves that the new assertion detects the regression. Production
watcher behavior is unchanged; no port-specific adaptation is needed.
Leave production code, dependencies, runtime profiles, templates, pipeline
configuration, and existing coverage exclusions unchanged. Previous-head CI
is a baseline only; publish and audit fresh validation for the resulting head.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ranadeepsingh Rana Singh (ranadeepsingh) changed the title chore: sync master fixes into spark4.0 chore: bring latest master fixes to Spark 4.0 Sep 22, 2026
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

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

@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/review

@ranadeepsingh
Rana Singh (ranadeepsingh) merged commit afbb3fa into microsoft:spark4.0 Sep 22, 2026
81 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants