Skip to content

[automated] Merge branch 'main' => 'net11.0'#36798

Open
github-actions[bot] wants to merge 7 commits into
net11.0from
merge/main-to-net11.0
Open

[automated] Merge branch 'main' => 'net11.0'#36798
github-actions[bot] wants to merge 7 commits into
net11.0from
merge/main-to-net11.0

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

I detected changes in the main branch which have not been merged yet to net11.0. I'm a robot and am configured to help you automatically keep net11.0 up to date, so I've opened this PR.

This PR merges commits made on main by the following committers:

  • jonathanpeppers
  • PureWeen
  • kubaflo
  • Tamilarasan-Paranthaman

Instructions for merging from UI

This PR will not be auto-merged. When pull request checks pass, complete this PR by creating a merge commit, not a squash or rebase commit.

merge button instructions

If this repo does not allow creating merge commits from the GitHub UI, use command line instructions.

Instructions for merging via command line

Run these commands to merge this pull request from the command line.

git fetch
git checkout main
git pull --ff-only
git checkout net11.0
git pull --ff-only
git merge --no-ff main

# If there are merge conflicts, resolve them and then run git merge --continue to complete the merge
# Pushing the changes to the PR branch will re-trigger PR validation.
git push https://github.com/dotnet/maui HEAD:merge/main-to-net11.0
or if you are using SSH
git push git@github.com:dotnet/maui HEAD:merge/main-to-net11.0

After PR checks are complete push the branch

git push

Instructions for resolving conflicts

⚠️ If there are merge conflicts, you will need to resolve them manually before merging. You can do this using GitHub or using the command line.

Instructions for updating this pull request

Contributors to this repo have permission update this pull request by pushing to the branch 'merge/main-to-net11.0'. This can be done to resolve conflicts or make other changes to this pull request before it is merged.
The provided examples assume that the remote is named 'origin'. If you have a different remote name, please replace 'origin' with the name of your remote.

git fetch
git checkout -b merge/main-to-net11.0 origin/net11.0
git pull https://github.com/dotnet/maui merge/main-to-net11.0
(make changes)
git commit -m "Updated PR with my changes"
git push https://github.com/dotnet/maui HEAD:merge/main-to-net11.0
or if you are using SSH
git fetch
git checkout -b merge/main-to-net11.0 origin/net11.0
git pull git@github.com:dotnet/maui merge/main-to-net11.0
(make changes)
git commit -m "Updated PR with my changes"
git push git@github.com:dotnet/maui HEAD:merge/main-to-net11.0

Contact .NET Core Engineering (dotnet/dnceng) if you have questions or issues.
Also, if this PR was generated incorrectly, help us fix it. See https://github.com/dotnet/arcade/blob/main/.github/workflows/scripts/inter-branch-merge.ps1.

kubaflo and others added 7 commits July 22, 2026 15:02
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Summary

- Permanently remove the `/review rerun` comment job and its
authorization, labeling, summary, and comment-minimization steps.
- Explicitly reject the removed subcommand so it cannot fall through to
the generic `/review` matcher.
- Remove user-facing and agent-generated guidance that advertises the
command.
- Keep the rerun queue, scanner, and trusted workflow-dispatch
infrastructure used by the automatic replacement in #36358.

## Testing

- `Invoke-Pester -Path @('.github/scripts/ReviewTrigger.Tests.ps1',
'.github/scripts/Post-AISummaryComment.Tests.ps1') -Output Detailed`
- `gh aw compile leak-fixer` with gh-aw v0.82.14

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->

### Description of Change

- Adds the recently released `10.0.90` and `11.0.0-preview.6` versions
to the bug report issue template dropdowns.
…eed guidance (#36497)

<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Summary

Release-readiness reports identified the right blockers, but did not
always provide enough precise, safe instructions for a release captain
or future agent to complete them. This PR makes the SR transition
workflows explicit and test-backed.

- Require a fix PR to be merged and verified on `main` before
recommending `/backport to release/...`.
- Document the Arcade backport path and the manual `git cherry-pick -x`
conflict fallback.
- Document and detect the SR servicing flip: preserve `PatchVersion`,
set `PreReleaseVersionLabel=servicing`, and enable stable package
versions only on the release branch.
- Teach the next-cycle `main` bump as a separate one-file, one-line PR,
including the exact title and XML edit. For SR9 → SR10 this is `Update
PatchVersion from 90 to 100` and `<PatchVersion>90</PatchVersion>` →
`<PatchVersion>100</PatchVersion>`.
- Preserve `SdkBandVersion`, `PreReleaseVersionLabel=ci.main`, and
`StabilizePackageVersion=false` on `main`, matching the SR7/SR8/SR9
precedent.
- **Surface the per-build validation feed for the ship Assessment.**
When a promoted BAR build exists for SR HEAD,
`Get-MaestroOperationalChecks` now derives and emits the
`darc-pub-dotnet-maui-<sha8>` NuGet feed URL (the `Ship Assessment
validation feed` check) to paste into the DevDiv ship **Assessment**,
plus the `darc get-asset` confirm command. It reports `WATCH` when the
build isn't promoted — no default channel → no promotion → no feed → the
Assessment has nothing to link (the SR9 miss).
- Add focused coverage for backport recommendations, servicing
transitions, the triple-digit SR9 → SR10 bump, promoted/unpromoted feed
cases, and the valid post-ship/no-in-flight transition before the next
SR branch is cut.
- Keep preview readiness available when GitHub's GraphQL PR-list
endpoint is unhealthy by falling back to bounded REST queries with
conservative field mapping and complete merged-PR pagination.

## Release workflow captured

| Operation | Target | Required behavior |
|---|---|---|
| Source fix backport | Merged source PR on `main` | Post `/backport to
release/<branch>` only after main ancestry is verified |
| SR stabilization | `release/<major>.0.1xx-sr<N>` | Keep its
`PatchVersion`; switch to `servicing` and stable packages after the
final backport |
| Next-cycle preparation | `main` | Change only `PatchVersion` to
`(N+1)*10`; keep SDK-band and CI prerelease settings unchanged |
| Ship Assessment feed | `release/<major>.0.1xx-sr<N>` build | Add
default channel → promote the build → link the per-build
`darc-pub-dotnet-maui-<sha8>` feed in the DevDiv Assessment so
CSI/customers can validate the exact candidate packages |

## What not to do

- Do not recommend a backport command for a fix that exists only on
`inflight/current`.
- Do not combine the `main` next-cycle bump with the release branch
servicing flip.
- Do not change `SdkBandVersion` or copy servicing settings onto `main`.
- Do not create the ship Assessment without the per-build validation
feed — if the SR branch has no BAR default channel the build is never
promoted and no `darc-pub-dotnet-maui-<sha8>` feed exists to link.
- Do not let the report mutate release or `main` refs, or create
channels / promote builds / edit the Assessment; the skill remains
report-only (it only derives and surfaces the feed URL).

## Validation

- The added and affected release-readiness assertions pass, including
the exact SR9 → SR10 title/XML guidance, promoted (`READY`) / unpromoted
(`WATCH`) feed cases, common-ancestry main-revert detection, the
shipped-SR + next-candidate state with no in-flight SR, and GraphQL→REST
PR-discovery fallback pagination.
- The complete release-readiness harness reports **1069 passing
assertions and 0 failures**.
- A live preview-readiness smoke-run completed successfully through REST
fallback while GitHub's GraphQL endpoint was returning HTTP 502.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: kubaflo <kubaflo@users.noreply.github.com>
Copilot-Session: cf5a6299-1e58-4157-b7fd-b85efaa14755
Copilot-Session: 04bf990b-a216-41df-aa75-08f62a1ecaf0
Copilot-Session: 136770fc-91e0-451c-8a4d-ea6a176f30e8
Copilot-Session: d00747b7-96f3-4e7a-8dfb-e3a48db04b2d
Copilot-Session: 4c228cec-8795-4bd5-a86c-c3fede46d534
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

### Description of Change

Automates visual snapshot evidence in `/review tests`. When public AzDO
results contain failed screenshot comparisons, the command now emits
exactly one test-failure analysis comment containing bounded, expandable
baseline/actual/diff panels.

Visual evidence remains supplementary: it does not change
`gate.verdictCeiling`, deterministic attribution, or the merge-readiness
verdict.

#### One-comment flow

1. Trusted pre-activation code discovers failed visual results through
the public AzDO `resultsbybuild` API, including retry-suffixed
attachments such as `Snapshot[1].png` and `Snapshot-diff[1].png`.
2. It resolves baselines from the exact source version tested by AzDO
and maps runtime evidence to the correct snapshot directory (`ios-26`,
`android-notch-36`, `mac`, or `windows`).
3. It streams and validates bounded PNG assets, then stores them on
`review-tests-assets` using immutable commit-pinned
`raw.githubusercontent.com` URLs.
4. The Copilot agent emits the normal single `add_comment` analysis
payload with a trusted insertion marker.
5. A sealed post-step validates the published asset manifest and injects
as many expandable comparison panels as fit into that same comment. Each
collapsed panel shows a conservative relationship label:
- `Likely PR-caused` for an exact test/platform base regression or
directly changed snapshot/test;
- `Likely unrelated` for an exact base/known-issue match without direct
visual scope;
   - `Needs human investigation` for unmatched or mixed evidence.
6. Excess comparisons are summarized as omitted instead of creating a
companion comment.

The local `.github/scripts/Review-Tests.ps1 -PostComment` path uses the
same merger. It also recognizes complete reports returned in Copilot's
final response, preserving nested evidence code fences without wrapping
a second title or badge section.

### Security and Failure Safety

- PR text, logs, test names, attachment metadata, changed files, and
visual labels remain untrusted input.
- The merger script and visual context are copied to a root-owned
location before the workflow checks out the untrusted PR branch.
- The post-step runs without `COPILOT_GITHUB_TOKEN`, `GH_TOKEN`, or
`GITHUB_TOKEN`.
- AzDO attachment URLs must match the expected public project and
attachment route.
- Published assets are size-bounded, signature-checked PNGs with
validated dimensions and repository paths.
- Raw image URLs must match the exact repository, asset commit, PR
directory, and safe filename.
- Labels are HTML-escaped and `@` is neutralized before insertion.
- Relationship labels use fixed trusted text. Untrusted attribution
values are never rendered, and same-named snapshots changed on another
platform do not count as PR scope.
- The final body is checked panel-by-panel against conservative limits
of 45 URLs, 10 mentions, and 60,000 UTF-16 characters, below gh-aw's
throwing limits.
- The analysis JSON update is atomic (written to a temp file, then
renamed over the original). Invalid context, malformed output, missing
analysis payloads, limit failures, and dry-run/noop output leave the
original analysis unchanged.
- The publisher never creates or patches PR comments; only the existing
gh-aw `add_comment` payload is mutated.

### What NOT to Do

- Do not use the ordinary anonymous AzDO test-runs listing for
discovery; it redirects to sign-in. Use the public failed-results
endpoint.
- Do not resolve baselines from the current PR head; use the source
version actually tested by the selected AzDO build.
- Do not let the agent construct or trust visual asset URLs.
- Do not publish a second companion comment; merge bounded panels into
the single analysis payload.

### Validation

- 98 focused Pester tests pass.
- Changed PowerShell scripts parse successfully.
- `gh aw compile copilot-review-tests --approve` completes without
errors or warnings.
- A real `agent_output.json` from gh-aw run
[29674953402](https://github.com/dotnet/maui/actions/runs/29674953402)
was replayed through the post-step:
  - one `add_comment` item remained one item;
  - five visual panels were inserted;
  - the final body contained 26 URLs, one mention, and 9,585 characters.

### Live Single-Comment Examples

The exact local `/review tests` path from this branch posted or repaired
these merged comments after the PRs' `/azp run` pipelines completed:

| PR | Single merged result | Included evidence | Relationship labels |
Final limits |
| --- | --- | --- | --- | --- |
| #36413 | [Test-failure analysis with visual
panels](#36413 (comment))
| 5 panels / 15 images | 1 PR-caused, 4 investigate | 23 URLs, 13,156
chars |
| #36631 | [Test-failure analysis with visual
panels](#36631 (comment))
| 6 panels / 18 images | 2 PR-caused, 4 investigate | 31 URLs, 21,367
chars |
| #36395 | [Test-failure analysis with visual
panels](#36395 (comment))
| 11 panels / 33 images; 19 omitted | 11 investigate | 43 URLs, 19,858
chars |
| #36404 | [Test-failure analysis with visual
panels](#36404 (comment))
| 14 panels / 40 images; 81 omitted | 14 investigate | 45 URLs, 23,779
chars |
| #35846 | [Test-failure analysis with visual
panels](#35846 (comment))
| 10 panels / 30 images; 9 omitted | 10 investigate | 43 URLs, 22,496
chars |
| #36277 | [Test-failure analysis with visual
panels](#36277 (comment))
| 7 panels / 19 images | 3 PR-caused, 4 investigate | 31 URLs, 18,355
chars |
| #36170 | [Test-failure analysis with visual
panels](#36170 (comment))
| 11 panels / 33 images; 8 omitted | 11 investigate | 44 URLs, 23,180
chars |
| #35578 | [Test-failure analysis with visual
panels](#35578 (comment))
| 12 panels / 36 images; 50 omitted | 12 investigate | 44 URLs, 25,443
chars |
| #36672 | [Test-failure analysis with visual
panels](#36672 (comment))
| 14 panels / 40 images; 9 omitted | 14 investigate | 45 URLs, 25,915
chars |
| #31755 | [Test-failure analysis with visual
panels](#31755 (comment))
| 12 panels / 36 images; 3 omitted | 12 investigate | 44 URLs, 22,728
chars |
| #34637 | [Test-failure analysis with visual
panels](#34637 (comment))
| 9 panels / 27 images; 81 omitted | 9 investigate | 43 URLs, 22,325
chars |
| #35156 | [Test-failure analysis with visual
panels](#35156 (comment))
| 2 panels / 6 images | 1 PR-caused, 1 investigate | 19 URLs, 11,911
chars |
| #35885 | [Test-failure analysis with no visual
failures](#35885 (comment))
| 0 panels / 0 images | No visual failures detected | 8 URLs, 4,239
chars |
| #36577 | [Test-failure analysis with visual
panels](#36577 (comment))
| 1 panel / 3 images | 1 investigate | 44 URLs, 21,768 chars |
| #36212 | [Test-failure analysis with no visual
failures](#36212 (comment))
| 0 panels / 0 images | No visual failures detected | 5 URLs, 5,982
chars |

Each result contains one `Tests Failure Analysis` title and one merged
review marker. Across 114 rendered panels, all 336 embedded image URLs
returned HTTP 200. Seven panels were safely classified as likely
PR-caused; no panel in this sample had enough exact evidence to be
safely classified as likely unrelated, so the remaining 107 stayed at
`Needs human investigation`. Another 260 comparisons were omitted safely
by the comment limits.

The latest eight-example batch was regenerated concurrently, and #36672,
#31755, #34637, #35156, #35885, #36577, and #36212 were added afterward.
The current [`review-tests-assets`
head](f937993)
retains the full asset history.

The protected `copilot-pat-pool` environment rejects feature-branch
`workflow_dispatch` runs before job execution. The live local-runner
examples validate comment generation and asset publication, while the
real gh-aw output replay validates the workflow post-step mutation
without weakening that branch protection.

### Issues Fixed

N/A - reviewer workflow enhancement.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: kubaflo <kubaflo@users.noreply.github.com>
Copilot-Session: a280b482-e102-4ca0-9ff9-1cfe1946e21f
Copilot-Session: d00747b7-96f3-4e7a-8dfb-e3a48db04b2d
Copilot-Session: 478d195b-20f3-4bc6-aeed-f6aa88b55fda
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

### Description of Change

Set `tools.github.integrity-proxy: false` for the regression-corpus
scanner's deterministic pre-agent `gh` calls while retaining
`min-integrity: approved` for every agent MCP read. The scanner
continues to emit only validated structural IDs, labels, and merge SHAs;
fetched prose never enters the agent prompt. The generated lock file is
updated in the same commit.

### Root Cause

The deterministic pre-activation pass inherited gh-aw's integrity proxy
because the agent uses `min-integrity: approved`. The proxy redacted
maintainer-authored attribution fields before
`Find-RegressionFixPRs.ps1` could apply its own
OWNER/MEMBER/COLLABORATOR checks, so [production run
29947778128](https://github.com/dotnet/maui/actions/runs/29947778128)
completed successfully but emitted `usableCount: 0` and opened no draft
PR.

The two trust boundaries remain separate: the pre-pass applies its
deterministic maintainer-association validation to live REST data, while
the agent's GitHub MCP gateway still enforces approved integrity.

### Validation

- 77 Pester tests passed
- Production-shaped scan resolved fix PR #35768 to introducing PR #31931
at `af540589fc5a3b053cd8c08334d0ca5a0125451b`, source `pr-body`, with
`usableCount: 1`
- `gh aw compile regression-corpus-scanner --strict`: 0 errors, 0
warnings; recompilation parity confirmed
- Generated `pre_activation` contains no integrity/CLI proxy injection;
agent MCP remains `min-integrity: approved`
- Vally 0.10 strict lint passed for the code-review eval corpus
- Three independent adversarial reviewers found no significant issues
(3/3 consensus)

### Issues Fixed

N/A - fixes the regression-corpus scanner behavior observed in the
linked production run.

Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e0da256b-eef3-41b1-b532-0d8557106c0c
<!-- Please let the below note in for people that find this PR -->
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

Context: #24744
Context: #24952

### Description of Change

`Java.Interop.ExportAttribute` is annotated with
`[RequiresUnreferencedCode]`, so every use of `[Export]` produces an
IL2026 trim warning and depends on `Java.Interop.Export.dll` reflection
at runtime. #24744 established the alternative: declare an abstract
class in `src/Core/AndroidNative` and `override` it, which lets the Java
Callable Wrapper generator emit the method — and its
`@android.webkit.JavascriptInterface` annotation — statically.

This adds `T:Java.Interop.ExportAttribute` to `eng/BannedSymbols.txt` so
the pattern is enforced by RS0030 going forward, instead of relying on
reviewers to catch it. The message points at
`HybridJavaScriptInterface.java` as the working example:

```
T:Java.Interop.ExportAttribute;[Export] pulls in Java.Interop.Export dynamic features that are not trimming or AOT friendly. Declare an abstract class in src/Core/AndroidNative and override it instead, see src/Core/AndroidNative/maui/src/main/java/com/microsoft/maui/HybridJavaScriptInterface.java
```

Adding the ban flagged the one remaining offender,
`RefreshViewWebViewScrollCapture.ScrollCaptureState.SetCanScrollUp()`:

```
src/Core/src/Platform/Android/RefreshViewWebViewScrollCapture.cs(209,4): error RS0030:
The symbol 'Java.Interop.ExportAttribute' is banned in this project: [Export] pulls in
Java.Interop.Export dynamic features that are not trimming or AOT friendly. ...
```

So it is fixed the same way #24744 did: a new
`RefreshViewJavaScriptInterface` abstract class in the `maui.aar` Java
sources, with `ScrollCaptureState` deriving from it. The
`[RequiresUnreferencedCode("Java.Interop.Export uses dynamic
features.")]` suppression on `SetCanScrollUp()` is no longer needed and
is removed.

Note the base type is deliberately an **abstract class** and not an
interface. #24952 reverted `HybridJavaScriptInterface` from an interface
back to a class because Java does not inherit method annotations from
interfaces — the generated JCW silently lost
`@android.webkit.JavascriptInterface` and the JavaScript bridge stopped
working. The same applies here.

The remaining `[Export]` usages in the repo are all
`Foundation.ExportAttribute` (Apple), which is a different type and is
unaffected by this ban.

### Issues Fixed

None; this is a proactive lint rule plus the one cleanup it surfaced.

### Testing

Verified locally by building `src/Core/src/Core.csproj` for
`net10.0-android36.0`:

- **Before the fix** — build fails with `error RS0030` at
`RefreshViewWebViewScrollCapture.cs(209,4)`, confirming the new
banned-symbol entry is actually enforced.
- **After the fix** — `Microsoft.Maui.dll` builds clean, including the
Gradle step that compiles the new Java file into `maui.aar`.

No behavior change is expected at runtime: the exported Java method name
is still `setCanScrollUp`, and `[JavascriptInterface]` remains on the C#
override, matching the shipping `HybridWebViewHandler` pattern.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 7fb11a38-1848-4bb2-8b5c-7853dcad56bb
Reset patterns:
- global.json
- NuGet.config
- eng/Version.Details.xml
- eng/Versions.props
- eng/common/*
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).
There may be pipelines that require an authorized user to comment /azp run to run.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants