[automated] Merge branch 'net11.0' => 'release/11.0.1xx-rc1' - #37786
Open
github-actions[bot] wants to merge 19 commits into
Open
[automated] Merge branch 'net11.0' => 'release/11.0.1xx-rc1'#37786github-actions[bot] wants to merge 19 commits into
github-actions[bot] wants to merge 19 commits into
Conversation
<!-- 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: Successfully started running 1 pipeline(s). There may be pipelines that require an authorized user to comment /azp run to run. |
Contributor
|
/azp run |
|
Azure Pipelines: Successfully started running 3 pipeline(s). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
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.
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.
or if you are using SSH
After PR checks are complete push the branch
Instructions for resolving conflicts
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.
or if you are using SSH
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.