Skip to content

[automated] Merge branch 'net11.0' => 'release/11.0.1xx-rc1' - #37786

Open
github-actions[bot] wants to merge 19 commits into
release/11.0.1xx-rc1from
merge/net11.0-to-release/11.0.1xx-rc1
Open

[automated] Merge branch 'net11.0' => 'release/11.0.1xx-rc1'#37786
github-actions[bot] wants to merge 19 commits into
release/11.0.1xx-rc1from
merge/net11.0-to-release/11.0.1xx-rc1

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

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

This PR merges commits made on net11.0 by the following committers:

  • jfversluis
  • github-actions[bot]
  • dotnet-maestro[bot]
  • Vignesh-SF3580
  • IlGalvo
  • SuthiYuvaraj
  • kubaflo
  • missymessa
  • PureWeen
  • Copilot

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 net11.0
git pull --ff-only
git checkout release/11.0.1xx-rc1
git pull --ff-only
git merge --no-ff net11.0

# 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/net11.0-to-release/11.0.1xx-rc1
or if you are using SSH
git push git@github.com:dotnet/maui HEAD:merge/net11.0-to-release/11.0.1xx-rc1

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/net11.0-to-release/11.0.1xx-rc1'. 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/net11.0-to-release/11.0.1xx-rc1 origin/release/11.0.1xx-rc1
git pull https://github.com/dotnet/maui merge/net11.0-to-release/11.0.1xx-rc1
(make changes)
git commit -m "Updated PR with my changes"
git push https://github.com/dotnet/maui HEAD:merge/net11.0-to-release/11.0.1xx-rc1
or if you are using SSH
git fetch
git checkout -b merge/net11.0-to-release/11.0.1xx-rc1 origin/release/11.0.1xx-rc1
git pull git@github.com:dotnet/maui merge/net11.0-to-release/11.0.1xx-rc1
(make changes)
git commit -m "Updated PR with my changes"
git push git@github.com:dotnet/maui HEAD:merge/net11.0-to-release/11.0.1xx-rc1

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.

Copilot AI and others added 19 commits August 18, 2026 15:14
<!-- 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!

### Root Cause

MAUI's release flow implemented NuGet.org authentication, retries,
conflict handling, quota rotation, and publishing in
`eng/scripts/push_nuget_org.ps1`. Gather and push failures could also
continue without failing the release. The repository additionally
carried a duplicate internal release YAML.

### Description of Change

This makes `eng/pipelines/ci-official-release.yml` the canonical release
pipeline and moves package publication to the approved 1ES release path:

- Resolve the BAR build once and run one fail-fast `darc gather-drop`,
limited to BAR NuGet package assets rather than unrelated symbol/blob
assets.
- Preserve package include/exclude behavior and validate non-empty
workload-pack and workload-manifest sets.
- Produce separate SBOM-backed `MauiPacksForNuGet` and
`MauiManifestsForNuGet` artifacts.
- Publish from production `releaseJob` jobs with `1ES.PublishNuget@1`,
`useDotNetTask: false`, and the protected `nuget.org (dotnetframework)`
service connection.
- Require workload packs to publish and become resolvable before
manifest approval is available.
- Remove `maui-release-internal.yml`, `push_nuget_org.ps1`, raw API-key
inputs, and the arbitrary feed URL.
- Document the canonical release and recovery procedure.

No public API changes are involved.

### Duplicate and Partial-Publish Recovery

Internal build
[3050066](https://dev.azure.com/dnceng/internal/_build/results?buildId=3050066)
proved that the service connection authenticates, but also proved that
the external-feed-backed task fails on HTTP 409 even with
`allowPackageConflicts: true`. Task-level retries are unsafe after a
partial batch because the retry can immediately encounter duplicates
created by the first attempt.

The final implementation therefore:

- Generates an `expected-packages.json` identity manifest for each
immutable artifact.
- Rejects duplicate package identities, duplicate package file names,
and unexpected `.nupkg` files before publication.
- Verifies the copied helper's SHA-256 before execution.
- Filters packages already visible through NuGet.org's flat-container
API before publishing.
- Uses separate recovery-only `nugetAlreadyAttemptedPackFilters` and
`nugetAlreadyAttemptedManifestFilters` parameters for packages accepted
but not yet visible during NuGet.org validation lag.
- Runs `1ES.PublishNuget@1` only when packages remain and does not use
task-level retries.
- Verifies the complete expected package set with transient-query
retries and a 30-minute deadline.

### Internal Validation

- Internal branch:
[`copilot/replace-custom-nuget-publishing`](https://dev.azure.com/dnceng/internal/_git/dotnet-maui?version=GBcopilot%2Freplace-custom-nuget-publishing)
- Final internal commit:
[`adf2ad774cd3a2092450df153e6b46a09a127552`](https://dev.azure.com/dnceng/internal/_git/dotnet-maui/commit/adf2ad774cd3a2092450df153e6b46a09a127552?refName=refs%2Fheads%2Fcopilot%2Freplace-custom-nuget-publishing)
- Build 3050066 confirmed the registered `dotnet-maui-release`
definition already executes the canonical YAML, so no
pipeline-definition migration is needed.
- Build
[3050237](https://dev.azure.com/dnceng/internal/_build/results?buildId=3050237)
showed that a fail-fast unfiltered gather stops on a missing Foldable
symbol blob even though the shipping NuGet package downloads
successfully. The gather now uses Darc's slash-free package-asset
convention to exclude symbol/blob paths while remaining fail-fast for
every publishable package.
- Build
[3050279](https://dev.azure.com/dnceng/internal/_build/results?buildId=3050279)
confirmed the package-only gather succeeds and the `nuget.org
(dotnetframework)` connection authenticates: it published
`Microsoft.AspNetCore.Components.WebView.Maui.10.0.100`, then NuGet.org
rejected
`Microsoft.AspNetCore.Components.WebView.Maui.Msi.arm64.10.0.100` with
HTTP 403. The first package lists `dotnetframework` as an owner; the MSI
package lists only `Microsoft` and `Xamarin`. This is a NuGet.org
package-ownership/service-connection blocker, not a pipeline task-wiring
failure.
- Pester 5.9.0: 1,668 tests passed, including 15 package-filtering/retry
tests and 3 release-pipeline regression tests.
- PowerShell parsing, YAML parsing, documentation spellcheck, and
whitespace validation pass.

Before production use, either the service-connection identity must be
granted ownership of every MAUI package (including Xamarin-owned MSI
packages), or the release pipeline must be given an approved
Xamarin-scoped NuGet.org service connection. Once that external
credential issue is resolved, rerun the same commit and BAR selection;
the recovery logic will omit the package already published by build
3050279 and continue with the remaining set.

### What Not to Do

- Do not rely on `allowPackageConflicts` for an external NuGet.org feed;
build 3050066 proved it does not make 409 responses successful.
- Do not add task-level retries around a multi-package publish; they are
not safe after partial publication.
- Do not restore broad `--continue-on-error` gather behavior; exclude
non-release symbol/blob assets and keep publishable package gathering
fail-fast.
- Do not gather a different BAR drop while recovering a partial release;
rerun the same commit and selection filters.
- Do not exclude the Xamarin-owned MSI packages to make the build green;
they are shipping assets and require a credential with matching
NuGet.org ownership.

### Issues Fixed

Fixes #36567

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: rmarinho <1235097+rmarinho@users.noreply.github.com>
Co-authored-by: Rui Marinho <me@ruimarinho.net>
Copilot-Session: 150fe76a-707e-48ca-9e9d-38bfccead829
<!-- 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

Enhance local net11 preview release-readiness runs with automatic health
checks for the internal official `dotnet-maui` Azure DevOps pipeline
(definition 1095, `dnceng/internal`). The local release-readiness
skill/agent explicitly requests enriched output, then independently
discovers builds for `refs/heads/net11.0` and the evaluated release
branch when it exists. It requests a bounded, queue-time-ordered
five-build window and prefers the newest exact-HEAD build, then scans in
queue order while skipping candidates proven stale and buffering
indeterminate evidence. Disagreeing possible outcomes remain UNKNOWN; a
later proven-current failure remains RED only when every buffered
candidate is also a completed failure/cancellation. A terminal window
containing only same-branch failed/canceled indeterminate builds is
`failed-or-stale` and BLOCKED because every possible build is either red
or stale.

The check reports build status, ID/number, source SHA, and URL. Current
successful builds are green; failures/cancellations are red; partial
success is a WATCH state requiring manual review; running builds are in
progress; builds behind the newest trigger-eligible commit are stale;
missing or malformed evidence is unknown. When branch HEAD advances,
bounded local Git evaluates exact first-parent history and merge-result
changes against `eng/pipelines/ci-official.yml`. Successful no-op or
excluded-only advances remain current, while add/revert and
merge-result-only source changes still require a newer official build. A
conclusive Git non-ancestor result is stale; unavailable Git evidence
remains unknown unless every possible same-branch result is
independently blocking.

### Public/internal boundary

Direct script output remains public-safe by default. GitHub Actions
skips the internal query before invoking Azure CLI, while the local
skill/agent explicitly passes `'-PublicSafe:$false'` for enriched
artifacts that remain local. Public-safe output omits internal branch
records, build IDs/numbers, SHAs, URLs, and the local-only table.

Missing local Azure authentication fails open. Partial failures preserve
successful branch evidence, so known red/stale results cannot disappear.
Azure, GitHub, and local Git subprocesses have bounded execution;
process exit and redirected-output draining share the same deadline.
Local Git runs from the explicit repository root, performs a bounded
fetch of only the evaluated branch when objects are absent, and maps
unavailable currency evidence through the outcome lattice rather than
assuming current or stale. Windows `.cmd`/`.bat` Azure CLI launchers run
through `ComSpec` with structured arguments. Manual build overrides are
accepted only when the build belongs to definition 1095, and
Azure-controlled build numbers are constrained to the expected numeric
format before entering agent-facing output.

### Tests

- `pwsh -NoProfile -File
.github/skills/release-readiness/tests/Test-ReleaseReadiness.ps1` —
2,276 passed, 0 failed
- PowerShell parser validation for the helper, preview engine, and test
harness
- Live local smoke successfully queried both requested refs through the
enriched local path
- First-parent empty-commit, same-tree merge, merge-result source
change, add/revert, non-ancestor, missing-object, exact/proven-current
candidate selection, old-SHA retry, uncertain-failed/older-green
UNKNOWN, uncertain-failed/older-failed RED, blank-source-SHA/canceled
certainty, terminal failed-or-stale Details/NextAction, public-safe
generic BLOCKED rendering, explicit-CWD, Windows launcher,
trigger-exclusion, exact-path, timeout, auth-ordering, malformed-output,
and public-redaction fixtures
- GitHub Actions/public-safe smoke confirms the internal fetcher is not
invoked and internal coordinates remain absent

### Design tradeoffs

- Azure CLI remains the local adapter so public automation gains no
credentials or SDK dependency.
- A five-build, server-ordered window keeps the query bounded; selection
skips conclusively stale candidates, buffers uncertainty, and reports
only outcomes common to every possible currency result.
- Certain terminal blocking uses a distinct `failed-or-stale`
classification rather than falsely claiming the selected build is
current; local guidance restores currency evidence before choosing
failure repair versus a current-HEAD rerun, while public-safe output
remains generic.
- Local Git inspects exact first-parent commit and merge-result paths
rather than an aggregate compare diff, preventing second-parent history
and net-zero merges from producing false stale results while preserving
add/revert evidence.
- Missing local objects trigger one bounded fetch of the evaluated ref;
unresolved evidence remains UNKNOWN unless every possible outcome
blocks, while a conclusive non-ancestor result is stale.
- Total authentication unavailability is skipped; partial access loss
retains observed branch evidence.
- `-InternalBuildId` remains a diagnostic override, but normal local
skill/agent runs use branch-based discovery.

### Issues Fixed

N/A

---------

Co-authored-by: PureWeen <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 0e39d9d4-19e4-45f5-80f1-2bb3035c18c9
Removes the repository-owned VG20 import and synchronizes the relevant
Arcade credential-removal changes on `main`.

Tracked by https://dev.azure.com/dnceng/internal/_workitems/edit/12131

Copilot-Session: e890b71a-c1aa-416c-a15c-be8da9fdd9b4
Reset patterns:
- global.json
- NuGet.config
- eng/Version.Details.xml
- eng/Versions.props
- eng/common/*
### Description of Change

Replace MAUI's long-lived `dn-bot-ceapex-package-r` dependency with a
short-lived Entra token for OneLocBuild package restores.

- Acquire the Azure DevOps token through the existing DevDiv
`dnceng-onelocbuild-ceapex` workload-identity service connection.
- Reuse Arcade's shared `get-federated-access-token.yml` helper.
- Pass the resulting secret `CeapexEntraToken` to OneLocBuild for the
ceapex LCL/LocTools feeds.
- Keep the existing GitHub PR authentication unchanged.

The DevDiv service connection is configured for workload identity
federation and MAUI pipeline 13330 is authorized to use it.

### Validation

- Parsed the updated pipeline as YAML.
- Verified the shared federated-token helper exists on this branch.
- Verified the legacy ceapex PAT is no longer referenced by MAUI's
repo-owned localization pipeline.

### Issues Fixed

Tracks [dnceng work item
10151](https://dev.azure.com/dnceng/internal/_workitems/edit/10151).

Copilot-Session: 80f6a0c6-7947-4200-bb78-7f0fc01d671a
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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:

* missymessa
* PureWeen
* Copilot

## 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.

<img alt="merge button instructions"
src="https://i.imgur.com/GepcNJV.png" width="300" />

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.

``` sh
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
```

<details>
<summary>or if you are using SSH</summary>

```
git push git@github.com:dotnet/maui HEAD:merge/main-to-net11.0
```

</details>


After PR checks are complete push the branch
```
git push
```

## Instructions for resolving conflicts

:warning: If there are merge conflicts, you will need to resolve them
manually before merging. You can do this [using GitHub][resolve-github]
or using the [command line][resolve-cli].

[resolve-github]:
https://help.github.com/articles/resolving-a-merge-conflict-on-github/
[resolve-cli]:
https://help.github.com/articles/resolving-a-merge-conflict-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
```

<details>
    <summary>or if you are using SSH</summary>

```
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
```

</details>

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.

Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
Reset patterns:
- global.json
- NuGet.config
- eng/Version.Details.xml
- eng/Versions.props
- eng/common/*
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:

* missymessa

## 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.

<img alt="merge button instructions"
src="https://i.imgur.com/GepcNJV.png" width="300" />

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.

``` sh
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
```

<details>
<summary>or if you are using SSH</summary>

```
git push git@github.com:dotnet/maui HEAD:merge/main-to-net11.0
```

</details>


After PR checks are complete push the branch
```
git push
```

## Instructions for resolving conflicts

:warning: If there are merge conflicts, you will need to resolve them
manually before merging. You can do this [using GitHub][resolve-github]
or using the [command line][resolve-cli].

[resolve-github]:
https://help.github.com/articles/resolving-a-merge-conflict-on-github/
[resolve-cli]:
https://help.github.com/articles/resolving-a-merge-conflict-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
```

<details>
    <summary>or if you are using SSH</summary>

```
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
```

</details>

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.

Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
#37650)

<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->
<!-- 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!

### Issue Description

In CollectionView2 , `FindItemIndexInSource` locates an item by
iterating through the collection exposed by ICollectionView. On Windows,
this collection is not a standard managed List<T> but a WinRT-projected
ICollectionView returned by CollectionViewSource.View.

During execution, FindItemIndexInSource calls GetEnumerator() on the
ICollectionView and relies on the Windows SDK projection layer
(Microsoft.Windows.SDK.NET.Ref) to convert the native WinRT iterator
into a managed IEnumerator.

When the project is pinned to WindowsSdkPackageVersion 10.0.19041.41,
this conversion fails and GetEnumerator() throws `"Unexpected type for
enumerator"` before `FindItemIndexInSource` can begin iterating or
comparing items. As a result, FindItemIndexInSource cannot determine the
item's index and the operation fails.

### Description of Change
As a defensive fix, we updated FindItemIndexInSource to iterate and
compare items directly rather than depending on enumeration of the
native ICollectionView. This makes the lookup path more resilient and
avoids crashes caused by WinRT projection issues such as the Unexpected
type for enumerator exception in older Windows SDK projections.

### Issues Fixed
Fixes #37535 

### Tested the behaviour in the following platforms
- [ ] Android
- [x] Windows
- [ ] iOS
- [ ] Mac

### Note: 
`foreach` is generally preferred when processing every item, especially
when indexed access may be inefficient. However, our selection logic
requires both the item and its index, and `for` also avoids the faulty
WinRT enumerator, making it the more appropriate fix here


### Why is a test not added?

A test was not added because the issue is not reproducible on .NET 11
with the SDK versions currently used in the test environment. The crash
occurs only when the project is explicitly pinned to
Microsoft.Windows.SDK.NET.Ref 10.0.19041.41, where the WinRT projection
layer throws Unexpected type for enumerator.

Since .NET 11 automatically resolves to 10.0.19041.44, the issue no
longer reproduces and the test would always pass. As a result, a
regression test would not be able to reliably validate the failure
scenario or the fix, so no additional test was added.

### Output Screenshot
Before Issue Fix | After Issue Fix |
|----------|----------|
|<video width="100" height="100" alt="Before Fix"
src="https://github.com/user-attachments/assets/21cf35b2-747a-4d05-b11b-1870f087163e">|<video
width="100" height="100" alt="After Fix"
src="https://github.com/user-attachments/assets/1d73c77d-7f5d-429d-a7cb-a709e5c4dc44">|
…37426)

### Description of Change

WebAuthenticator previously relied on platform-specific pending state
and completion paths. This made lifecycle edge cases difficult to handle
consistently: dismissing Android authentication UI could leave the
awaiting task pending, concurrent requests could replace shared state,
and callback, cancellation, and cleanup paths were not always bound to
the same request identity.

This PR consolidates request ownership and completion while preserving
the existing public API and WebAuthenticator's provider-agnostic role.

The change:

- introduces a process-wide, identity-safe request manager that permits
one active built-in authentication;
- guarantees exactly-once completion across callbacks, native
cancellation, caller cancellation, and failures;
- validates callback scheme, host, effective port, and path before
consuming a request;
- routes callbacks to the active built-in request before delegating
unhandled callbacks to a custom `IWebAuthenticator`;
- passes non-matching lifecycle callbacks through without completing the
active built-in request, so custom authenticators and other lifecycle
handlers can process unrelated deep links;
- keeps identity-bound native Auth Tab and `ASWebAuthenticationSession`
completions terminal when their callback URI is missing or invalid;
- routes Android Custom Tab and system-browser fallbacks through a
request-owned intermediate activity, so returning the application task
without a callback cancels the same request even if an external browser
task remains open;
- limits Android caller cleanup to the matching live intermediate
activity and never creates a cleanup activity;
- uses Auth Tab only for supported HTTPS callback routes; non-default
HTTPS ports retain the callback-activity Custom Tab/system-browser path;
- normalizes `ASWebAuthenticationSession` callback, cancellation, and
cleanup handling on Apple platforms; HTTPS callbacks require iOS or Mac
Catalyst 17.4+, the default port, and Associated Domains, while earlier
OS versions must use a custom-scheme callback;
- retains the reserved Windows `AppInstance` route for the process
lifetime, avoiding the known unreliable unregister/re-register sequence
while allowing a later WebAuthenticator route to replace it;
- preserves a pre-existing application-owned `AppInstance` key and
documents the required cooperative activation routing;
- preserves redacted Windows route-registration and Android/Windows
browser-launch messages while retaining caught causes through
`InnerException`;
- preserves non-cancellation Apple `NSError` details and caught
session-start exceptions beneath redacted outer failures, while
propagating `FeatureNotSupportedException` unchanged;
- keeps diagnostic logging redacted at callback and application-decoder
boundaries;
- updates the Essentials sample to use the existing zero-configuration
public broker while clarifying that it demonstrates browser transport
and callback delivery, not production OAuth architecture;
- adds contributor-oriented design documentation and focused unit/device
coverage.

A second valid built-in authentication throws
`InvalidOperationException` while leaving the original request active.

Applications should serialize authentication attempts, such as by
disabling sign-in actions while a request is pending. This intentionally
replaces the previous behavior where a new request canceled the first.

Callback matching is intentionally strict: scheme and host are
case-insensitive, the effective port must match, and a non-root path
uses ordinal equality. Query and fragment are ignored, and an expected
root path does not constrain the callback path. This follows the
redirect URI comparison requirements in [RFC 6749 section
3.1.2.3](https://www.rfc-editor.org/rfc/rfc6749.html#section-3.1.2.3)
and the URI comparison rules in [RFC 3986 section
6.2.2.1](https://www.rfc-editor.org/rfc/rfc3986.html#section-6.2.2.1).

The persistent Windows route avoids `UnregisterKey()` because [Windows
App SDK issue
#4420](microsoft/WindowsAppSDK#4420) remains
open. The replacement behavior is documented from the [Windows App SDK
2.3.1
source](https://github.com/microsoft/WindowsAppSDK/blob/v2.3.1/dev/AppLifecycle/AppInstance.cpp)
and the A-to-B activation evidence from #36640.

### Issues Fixed

Fixes #32766

Related to #36640

### Validation

- Focused request-manager and URI-matching tests: 61/61 passed.
- Essentials unit tests: 513/513 passed.
- Android DeviceTests: 381/381 passed, including 20/20 WebAuthenticator
tests.
- Windows WebAuthenticator DeviceTests: 28/28 passed.
- Full Windows DeviceTests: 291 passed, 14 skipped, and one unchanged
unrelated culture-sensitive Preferences failure.
- Essentials/PublicAPI builds passed across .NET, .NET Standard,
Android, Windows, iOS, and Mac Catalyst.
- iOS and Mac Catalyst compile-only validation passed; no Apple runtime
host was available.
- Android and Windows samples: browser authentication success and
cancellation validated manually.
- Repository-native scoped formatter verification and `git diff
--check`: passed.

Thanks in advance!
@kubaflo

Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
…of a back arrow (#37642)

> [!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!

### Issue Details
On Android, after navigating to a page through Shell's flyout menu, the
toolbar incorrectly shows the ☰ hamburger icon instead of the expected ←
back arrow.
**Note:** Issue occurs randomly.

### Regression PR
PR #34758
 
### Root Cause
The handler reuses the same ShellToolbarTracker and DrawerArrowDrawable
across navigations. The drawable is shared between the toolbar and
ActionBarDrawerToggle. When the flyout closes, ActionBarDrawerToggle
updates the shared drawable during its animation. This can overwrite the
back-arrow state and make the toolbar display the hamburger icon.
 
The legacy renderer creates a new ShellToolbarTracker for each page, so
the drawable is not reused across navigations and the issue does not
occur.
 
### Description of Change
Added a separate DrawerArrowDrawable for the toolbar's back-arrow icon
instead of reusing the drawer toggle's drawable. This keeps the drawer
animation and toolbar icon independent and prevents the animation from
changing the displayed back-arrow state. Custom icons are unaffected.

### Issues Fixed
Fixes #37532

### Screenshots

| Before Issue Fix | After Issue Fix |
|----------|----------|
| <video width="300" height="600"
src="https://github.com/user-attachments/assets/65f8fb3e-4ec6-48a9-a126-64e221c9f992">
| <video width="300" height="600"
src="https://github.com/user-attachments/assets/5c382fb0-6abf-4a7c-a6e4-34c84efab70a">
|
…sts (refs #37629) (#37676)

> [!CAUTION]
> agentic threat detected
> Threat detection flagged this output in warn mode. Manual review is
REQUIRED before any follow-up automation.
> <!-- gh-aw-threat-detected -->
>
> <details>
> <summary>Details</summary>
>
> Potential security threats were detected in the agent output.
>
> Review the [workflow run
logs](https://github.com/dotnet/maui/actions/runs/32369230921) for
details.
> </details>


> [!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!

Workflow artifact: ci-fix
Artifact kind: help
Refs: #37629
Target branch: net11.0
Attempt: 1/10



## Attempt 1 of 10

Enable nullable annotations for the Windows SwipeItem device-test source
file.

### Previous attempts (prior commits on this PR)

None; this is the first attempt.

This attempt differs by enabling the file's existing nullable contracts
rather than suppressing CS8632 or removing its annotations.

## Root cause

`SwipeItemMenuItemHandlerTests.Windows.cs` uses nullable reference
annotations in its image-source test doubles, but the file is compiled
with nullable annotations disabled. The Windows Core.DeviceTests build
therefore reports CS8632 at line 438 and the other annotated
declarations.

## Fix

Add `#nullable enable` at file scope so the existing nullable return
types, completion sources, and captured source properties compile in the
intended annotations context.

## What is unverified / where I need help

- The Windows device-test target cannot be built or run on this Linux
runner.
- Please confirm the Windows unpackaged Core.DeviceTests build compiles
and the SwipeView category passes.

## Validation

- Command: `not run because the Windows device-test target requires a
Windows device-test rig`
- Result: not run

## Evidence

- Original failing build:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1557918
- Latest verified-failing build:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1557918

---
Filed by
[`ci-status-fix-net11`](https://github.com/dotnet/maui/blob/main/.github/workflows/ci-status-fix-net11.md).
This is the single PR for #37629: the workflow watches its
own CI and pushes up to **10 attempts on this same PR** (it never opens
a second PR). It advances only when the fix's own build settles red and
that red is caused by the fix. Comments, reviews, and commits do not
transfer ownership; the loop remains autonomous until this PR is closed.
Eligible `CHANGES_REQUESTED` reviews are handled through Track C. After
10 attempts it stops and defers to humans. In round 1 a maintainer still
needs to comment `/azp run maui-pr` (plus the gated uitests/devicetests
legs when relevant) to exercise each new commit.

> Generated by [CI Failure Fixer
(net11.0)](https://github.com/dotnet/maui/actions/runs/32369230921) ·
gpt56 · 510.6 AIC · ⌖ 54.7 AIC · ⊞ 31K ·
[◷](https://github.com/search?q=repo%3Adotnet%2Fmaui+%22gh-aw-workflow-id%3A+ci-status-fix-net11%22&type=pullrequests)

<!-- gh-aw-agentic-workflow: CI Failure Fixer (net11.0), engine:
copilot, model: gpt-5.6-sol, id: 32369230921, workflow_id:
ci-status-fix-net11, run:
https://github.com/dotnet/maui/actions/runs/32369230921 -->

<!-- gh-aw-workflow-id: ci-status-fix-net11 -->
<!-- gh-aw-workflow-call-id: dotnet/maui/ci-status-fix-net11 -->

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
#37561) (#37678)

> [!CAUTION]
> agentic threat detected
> Threat detection flagged this output in warn mode. Manual review is
REQUIRED before any follow-up automation.
> <!-- gh-aw-threat-detected -->
>
> <details>
> <summary>Details</summary>
>
> Potential security threats were detected in the agent output.
>
> Review the [workflow run
logs](https://github.com/dotnet/maui/actions/runs/32369230921) for
details.
> </details>


> [!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!

Workflow artifact: ci-fix
Artifact kind: help
Refs: #37561
Target branch: net11.0
Attempt: 1/10



## Attempt 1 of 10

Make the synthetic Appium drag gesture dwell briefly over its
destination before releasing the pointer.

### Previous attempts (prior commits on this PR)

None; this is the first attempt.

This attempt differs by correcting the generated input sequence rather
than retrying the test, increasing an assertion timeout, or weakening
the required DragOver assertion.

## Root cause

The generic drag action moves to the destination and releases
immediately. On Windows, the pointer can be released before the target
processes a drag-over input frame, so DragStarting, Drop, and
DropCompleted can occur while the test's `DragOverEventsLabel` never
changes.

## Fix

Add a 250 ms pointer pause after reaching the destination and before
pointer-up. The pause is part of the single synthetic gesture and allows
the target to process DragOver before the drop; it does not retry the
gesture or alter the test assertion.

## What is unverified / where I need help

- Windows UI tests cannot run on this Linux runner.
- Please confirm `DragEvents` passes on the Windows Gestures UI-test leg
and that other drag-and-drop tests remain green.

## Validation

- Command: `not run because Windows UI tests require a Windows runner`
- Result: not run

## Evidence

- Original failing build:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1554813
- Latest verified-failing build:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1554813

---
Filed by
[`ci-status-fix-net11`](https://github.com/dotnet/maui/blob/main/.github/workflows/ci-status-fix-net11.md).
This is the single PR for #37561: the workflow watches its
own CI and pushes up to **10 attempts on this same PR** (it never opens
a second PR). It advances only when the fix's own build settles red and
that red is caused by the fix. Comments, reviews, and commits do not
transfer ownership; the loop remains autonomous until this PR is closed.
Eligible `CHANGES_REQUESTED` reviews are handled through Track C. After
10 attempts it stops and defers to humans. In round 1 a maintainer still
needs to comment `/azp run maui-pr` (plus the gated uitests/devicetests
legs when relevant) to exercise each new commit.

> Generated by [CI Failure Fixer
(net11.0)](https://github.com/dotnet/maui/actions/runs/32369230921) ·
gpt56 · 510.6 AIC · ⌖ 54.7 AIC · ⊞ 31K ·
[◷](https://github.com/search?q=repo%3Adotnet%2Fmaui+%22gh-aw-workflow-id%3A+ci-status-fix-net11%22&type=pullrequests)

<!-- gh-aw-agentic-workflow: CI Failure Fixer (net11.0), engine:
copilot, model: gpt-5.6-sol, id: 32369230921, workflow_id:
ci-status-fix-net11, run:
https://github.com/dotnet/maui/actions/runs/32369230921 -->

<!-- gh-aw-workflow-id: ci-status-fix-net11 -->
<!-- gh-aw-workflow-call-id: dotnet/maui/ci-status-fix-net11 -->

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
#37720)

This pull request updates the following dependencies

[marker]: <> (Begin:abba2d18-eaa5-438c-b3c3-4d22ef33159d)
## From https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- **Subscription**:
[abba2d18-eaa5-438c-b3c3-4d22ef33159d](https://maestro.dot.net/subscriptions?search=abba2d18-eaa5-438c-b3c3-4d22ef33159d)
- **Build**:
[20260820.2](https://dev.azure.com/dnceng/internal/_build/results?buildId=3053067)
([327923](https://maestro.dot.net/channel/8297/azdo:dnceng:internal:dotnet-optimization/build/327923))
- **Date Produced**: August 20, 2026 6:30:48 PM UTC
- **Commit**:
[eb2e9a7ebf54cdb4bc0ade04a042a23ee1568a6f](https://dev.azure.com/dnceng/internal/_git/dotnet-optimization?_a=history&version=GCeb2e9a7ebf54cdb4bc0ade04a042a23ee1568a6f)
- **Branch**:
[refs/heads/main](https://dev.azure.com/dnceng/internal/_git/dotnet-optimization?version=GBrefs/heads/main)

[DependencyUpdate]: <> (Begin)

- **Dependency Updates**:
  - From [1.0.0-prerelease.26407.1 to 1.0.0-prerelease.26420.2][1]
     - optimization.android-x64.MIBC.Runtime

[1]:
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization/branches?baseVersion=GCe960b77a63b94a4b7c1f077c2d325d003a461d2d&targetVersion=GCeb2e9a7ebf54cdb4bc0ade04a042a23ee1568a6f&_a=files

[DependencyUpdate]: <> (End)


[marker]: <> (End:abba2d18-eaa5-438c-b3c3-4d22ef33159d)

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
…ted fixture state (refs #36722) (#37626)

> [!WARNING]
> **Threat Detection Engine Failure** — The analysis engine could not
complete. This is a tooling failure, not a security finding.
> <!-- gh-aw-threat-engine-error -->
>
> <details>
> <summary>What happened</summary>
>
> The threat detection results could not be parsed.
>
> Review the [workflow run
logs](https://github.com/dotnet/maui/actions/runs/32201586189) for
details.
> </details>


> [!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!

Workflow artifact: ci-fix
Artifact kind: deflake
Refs: #36722
Target branch: net11.0
Attempt: 1/10


## Attempt 1 of 10

Make every CollectionView Header/Footer test start from a fresh app
state and independently enter the Header/Footer feature page.

### Previous attempts (prior commits on this PR)

None.

This attempt differs by removing the fixture's ordered shared-state
dependency instead of increasing timeouts, adding retries, or weakening
assertions.

## Root cause
After an earlier test failure resets navigation to the CollectionView
feature-matrix page, later tests in
`CollectionView_HeaderFooterFeatureTests.cs` still assume the nested
Header/Footer page is active and time out waiting for `Options`. Only
the first ordered test previously entered that nested page.

Flake class: test-quality

## Why this was flaky
The fixture reused app and navigation state across the entire class.
Build 1554813 showed an earlier Header/Footer test failure followed by a
cascade of `VerifyHeader*` timeouts, while adjacent CollectionView legs
passed. The later tests depended on the first ordered test having
navigated through `HeaderFooterViewButton`.

## De-flake
Override the existing `ResetAfterEachTest` fixture mechanism and enter
the Header/Footer page from `FixtureSetup`, so each test establishes its
own deterministic starting state. No assertion was weakened, no timeout
was increased, and no retry attribute was added.

## Fix
The change moves navigation setup out of the first test and into
per-test fixture setup, preserving the same test actions while removing
cross-test ordering and state leakage.

## What is unverified / where I need help
- The Android UI test requires a device/emulator and could not be
validated on this runner.
- Please confirm the API 30 CollectionView leg completes without the
post-failure `VerifyHeader*` timeout cascade and that the per-test reset
cost is acceptable.

## Validation
- Command: `not run because this Android device UI-test de-flake is not
runner-validatable`
- Result: not run

## Evidence
- Original failing build (from tracking issue):
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1520373
- Latest verified-failing build:
https://dev.azure.com/dnceng-public/public/_build/results?buildId=1554813

---
Filed by
[`ci-status-fix-net11`](https://github.com/dotnet/maui/blob/main/.github/workflows/ci-status-fix-net11.md).
This is the single PR for #36722: the workflow watches its
own CI and pushes up to **10 attempts on this same PR** (it never opens
a second PR). It advances only when the fix's own build settles red and
that red is caused by the fix. Comments, reviews, and commits do not
transfer ownership; the loop remains autonomous until this PR is closed.
Eligible `CHANGES_REQUESTED` reviews are handled through Track C. After
10 attempts it stops and defers to humans. In round 1 a maintainer still
needs to comment `/azp run maui-pr` (plus the gated uitests/devicetests
legs when relevant) to exercise each new commit.

> Generated by [CI Failure Fixer
(net11.0)](https://github.com/dotnet/maui/actions/runs/32201586189) ·
gpt56 · 332.8 AIC · ⊞ 31K ·
[◷](https://github.com/search?q=repo%3Adotnet%2Fmaui+%22gh-aw-workflow-id%3A+ci-status-fix-net11%22&type=pullrequests)

<!-- gh-aw-agentic-workflow: CI Failure Fixer (net11.0), engine:
copilot, model: gpt-5.6-sol, id: 32201586189, workflow_id:
ci-status-fix-net11, run:
https://github.com/dotnet/maui/actions/runs/32201586189 -->

<!-- gh-aw-workflow-id: ci-status-fix-net11 -->
<!-- gh-aw-workflow-call-id: dotnet/maui/ci-status-fix-net11 -->

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
<!-- 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

Follow-up to #37420, which exposed gesture recognizer dispatch hooks for
third-party `IGesturePlatformManager` implementations.

This change hardens the newly public contract based on post-merge review
feedback:

- Validates required `sender` inputs before command or event dispatch
for tap and all pointer dispatch methods.
- Makes `DropGestureRecognizer.SendDrop` validate synchronously before
returning its processing task, so fire-and-forget callers still receive
an immediate `ArgumentNullException`.
- Publishes `SendDragLeave` and `SendDrop` with non-nullable parameter
and return annotations across every Controls.Core PublicAPI TFM.
- Clears stale active-drag state when a replacement drag starts,
including when that replacement is canceled or handled.
- Documents the infrastructure-only intent and exception behavior
consistently.

The existing public `DropGestureRecognizer.SendDragOver` behavior is
intentionally unchanged.

### Validation

- Controls.Core gesture tests: 62 passed, 0 failed.
- PublicAPI validation passed for `net11.0`, `netstandard2.0`,
`netstandard2.1`, `net11.0-ios26.5`, `net11.0-maccatalyst26.5`, and both
Windows TFMs.
- Android validation is locally blocked by the unavailable Android API
37 SDK platform; its PublicAPI entries use the same analyzer-derived
shared declarations. Tizen is not included in the local target framework
set and uses the same declarations.

### Issues Fixed

Follow-up to #37338 and #37420.

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8a985776-9569-4caf-917c-64051900e5c6
Co-authored-by: Jakub Florkowski <42434498+kubaflo@users.noreply.github.com>
## Description

Replace the .NET MAUI app and multi-project template bot artwork with
the new .NET 11 rocket image. The PNG includes balanced transparent
padding, uses aspect-correct resource sizing, and the default XAML
layouts add 20 points of top spacing and updated accessibility text.

The unused legacy bot SVG is removed from the Blazor Hybrid and Blazor
Hybrid/Web templates without changing their rendered UI.

## Screenshots

| Android | iOS |
| --- | --- |
| <img
src="https://github.com/user-attachments/assets/024ade30-eeb1-4a09-8945-d3cfaac1faf6"
width="320" alt="Generated .NET MAUI app on Android showing the new .NET
11 rocket bot" /> | <img
src="https://github.com/user-attachments/assets/845ba4af-9e1b-403e-8830-88ad8cb086b2"
width="320" alt="Generated .NET MAUI app on iOS showing the new .NET 11
rocket bot" /> |

### Mac Catalyst

<img
src="https://github.com/user-attachments/assets/9df45084-372f-4847-ae53-76b2a1037a6b"
width="720" alt="Generated .NET MAUI app on Mac Catalyst showing the new
.NET 11 rocket bot" />

## Validation

- Packed and installed `Microsoft.Maui.Templates.net11` in an isolated
template hive
- Generated and built `maui` and `maui-multiproject` projects
- Built and launched the default app on Android, iOS, and Mac Catalyst
- Visually checked the new artwork on all three available platforms

---------

Copilot-Session: 8945f3ba-6c8c-47f4-9f24-7b387a607f3e
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.

@dotnet-policy-service dotnet-policy-service Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Auto-approved automated inter-branch merge.

@kubaflo

kubaflo commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

/azp run

@azure-pipelines

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

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.

8 participants