Skip to content

Conversation

@PureWeen
Copy link
Member

@PureWeen PureWeen commented Jan 27, 2026

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 from this PR and let us know in a comment if this change resolves your issue. Thank you!

Description

Weekly merge of main into net11.0.

This PR brings the latest changes from main branch into the net11.0 branch.

Merge Conflict Resolutions

  • stage-device-tests.yml: Kept CoreCLR iOS/MacCatalyst stages from net11.0, added Windows Helix stages from main
  • ci-device-tests.yml: Took main's arm64 pool (Azure Pipelines + macOS-15-arm64)
  • device-tests.yml: Took main's Helix structure, kept net11.0's CoreCLR exclusions for controls, updated tfm to net11.0
  • Controls.Xaml.UnitTests.csproj: Merged both warning suppressions (CA2252 from net11.0, MAUIG2045 from main)

Checklist

  • Verify CI passes
  • Review merge conflict resolutions above

rmarinho and others added 30 commits January 13, 2026 11:38
# Conflicts:
#	eng/pipelines/device-tests.yml
This pull request makes updates to the `Directory.Build.props` file to
adjust build and target platform configurations, particularly for manual
test projects and app packaging.

Build and platform configuration changes:

* Disabled automatic Appx bundle generation by setting
`<AppxBundle>Never</AppxBundle>`, which can help avoid unnecessary
packaging steps during builds.

Manual test platforms logic update:

* Changed the way manual test target frameworks
(`MauiManualTestsPlatforms`) are aggregated for each platform (Windows,
Android, MacCatalyst, iOS) to append to the existing list instead of the
device tests list, improving consistency and potentially preventing
duplicate or unintended test platform inclusions.
This pull request updates the following dependencies

[marker]: <> (Begin:a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95)
## From https://github.com/dotnet/xharness
- **Subscription**:
[a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95](https://maestro.dot.net/subscriptions?search=a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95)
- **Build**:
[20260114.3](https://dev.azure.com/dnceng/internal/_build/results?buildId=2879409)
([297352](https://maestro.dot.net/channel/2/github:dotnet:xharness/build/297352))
- **Date Produced**: January 14, 2026 9:16:36 PM UTC
- **Commit**:
[31e0b8e08f57890f7b7004b93361d69cd4b21079](dotnet/xharness@31e0b8e)
- **Branch**: [main](https://github.com/dotnet/xharness/tree/main)

[DependencyUpdate]: <> (Begin)

- **Dependency Updates**:
  - From [11.0.0-prerelease.26062.2 to 11.0.0-prerelease.26064.3][1]
     - Microsoft.DotNet.XHarness.CLI
     - Microsoft.DotNet.XHarness.TestRunners.Common
     - Microsoft.DotNet.XHarness.TestRunners.Xunit

[1]: dotnet/xharness@185cb0f...31e0b8e

[DependencyUpdate]: <> (End)


[marker]: <> (End:a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95)

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
<!--
!!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING
MAIN. !!!!!!!
-->

### Description of Change

<img width="1680" height="102" alt="image"
src="https://github.com/user-attachments/assets/e67209d5-74e6-4baf-8043-dcef4ac1301b"
/>

In collection view, where the binding context changes frequently, it is
important for the base class `BindableObject` to be super efficient.

In this case I'm doing some micro optimizations (avoiding a `foreach`
when not needed) and moving `Shell` related attached properties' binding
context propagation to `Page` (the only real target of those
properties).
@azure-pipelines
Copy link

Azure Pipelines successfully started running 3 pipeline(s).

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Weekly merge bringing main into net11.0, including pipeline, testing infrastructure, and tooling/documentation updates.

Changes:

  • Updated Azure Pipelines/Helix configurations (macOS 15 pools, Windows Helix device tests, build id variable rename).
  • Enabled stricter XML-doc enforcement (CS1591 as error) in several projects and added/expanded XML docs.
  • Expanded repo agent/skill documentation and test scripts (Windows support in local test scripts, updated skill docs).

Reviewed changes

Copilot reviewed 111 out of 2087 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific/Label.xml Removed generated API doc XML for Tizen-specific Label
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.TizenSpecific/Entry.xml Removed generated API doc XML for Tizen-specific Entry
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific/TabbedPage.xml Removed generated API doc XML for GTK-specific TabbedPage
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific/NavigationPage.xml Removed generated API doc XML for GTK-specific NavigationPage
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.GTKSpecific/BoxView.xml Removed generated API doc XML for GTK-specific BoxView
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific/ViewCell.xml Removed generated API doc XML for Android-specific ViewCell
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific/SwipeView.xml Removed generated API doc XML for Android-specific SwipeView
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific/ShellItem.xml Removed generated API doc XML for Android-specific ShellItem
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific/ListView.xml Removed generated API doc XML for Android-specific ListView
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific/Entry.xml Removed generated API doc XML for Android-specific Entry
src/Controls/docs/Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific.AppCompat/NavigationPage.xml Removed generated API doc XML for Android AppCompat NavigationPage
src/Controls/docs/Microsoft.Maui.Controls.Internals/TypedBindingBase.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/ResourcesChangedEventArgs.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/Registrar.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/PropertyPropagationExtensions.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/ProfileDatum.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/PreserveAttribute.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/NotifyCollectionChangedEventArgsExtensions.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/NavigationRequestType.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/NameScope.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/InvalidationTrigger.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/GIFImageParser.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/GIFHeader.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/GIFDecoderFormatException.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/GIFColorTable.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/GIFBitmapDecoder.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/EvalRequested.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/EffectUtilities.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/DynamicResource.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/DependencyResolver.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/DataTemplateExtensions.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/ContentPageEx.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/AsyncValueExtensions.xml Removed generated API doc XML for internal type
src/Controls/docs/Microsoft.Maui.Controls.Internals/ActionSheetArguments.xml Removed generated API doc XML for internal type
src/Controls/Foldable/src/WindowSpanModeStateTrigger.cs Added missing XML docs for public constructor
src/Controls/Foldable/src/TwoPaneView.cs Added missing XML docs for public constructor
src/Controls/Foldable/src/SpanModeStateTrigger.cs Added missing XML docs for public constructor
src/Controls/Foldable/src/HostBuilderExtensions.cs Added XML docs for extension API
src/Controls/Foldable/src/DualScreenInfo.cs Added XML docs for public constructor
src/Controls/Foldable/src/Controls.Foldable.csproj Enforced CS1591 as error for Foldable controls
src/Compatibility/Core/src/Compatibility.csproj Enforced CS1591 as error for Compatibility project
src/BlazorWebView/src/Wpf/Microsoft.AspNetCore.Components.WebView.Wpf.csproj Enforced CS1591 as error for WPF BlazorWebView
src/BlazorWebView/src/WindowsForms/Microsoft.AspNetCore.Components.WebView.WindowsForms.csproj Enforced CS1591 as error for WinForms BlazorWebView
src/BlazorWebView/src/Maui/Microsoft.AspNetCore.Components.WebView.Maui.csproj Enforced CS1591 as error for MAUI BlazorWebView
eng/pipelines/ui-tests.yml Updated macOS pool and iOS version matrix
eng/pipelines/handlers.yml Fixed build id variable spelling and references
eng/pipelines/device-tests.yml Added Helix path for device tests and updated iOS versions
eng/pipelines/common/variables.yml Fixed build id variable spelling
eng/pipelines/common/sdk-insertion.yml Fixed OfficialBuildId variable reference
eng/pipelines/common/device-tests-jobs.yml Updated iOS “latest” simulator API version
eng/pipelines/ci.yml Switched macOS template test stages to Arm64 pool
eng/pipelines/ci-uitests.yml Updated internal/public pools and macOS image selection
eng/pipelines/ci-official.yml Fixed OfficialBuildId variable reference
eng/pipelines/ci-device-tests.yml Migrated Windows device tests to Helix and updated macOS pools
eng/pipelines/arcade/variables.yml Fixed OfficialBuildId handling and added PR prerelease labeling
eng/pipelines/arcade/stage-unit-tests.yml Enabled fail-on-issue template
eng/helix_xharness.proj Added Windows device test work items and new queues
eng/devices/windows.cake Comment clarifying WindowsAppSDKSelfContained configuration
eng/Versions.props Updated XHarness versions
eng/Version.Details.xml Updated XHarness dependency versions and SHAs
Directory.Build.props Set AppxBundle=Never and fixed MauiManualTestsPlatforms concatenation
.github/skills/write-tests/SKILL.md Added metadata/compatibility
.github/skills/verify-tests-fail-without-fix/SKILL.md Expanded documentation and output artifacts section
.github/skills/try-fix/references/output-structure.md Added reference documentation
.github/skills/try-fix/references/example-invocation.md Added reference documentation
.github/skills/try-fix/references/compile-errors.md Added reference documentation
.github/skills/pr-finalize/references/complete-example.md Added reference documentation
.github/skills/pr-build-status/SKILL.md Expanded functionality docs (Helix log retrieval)
.github/skills/find-reviewable-pr/SKILL.md Updated agent name reference
.github/scripts/shared/Build-AndDeploy.ps1 Added Windows platform support
.github/scripts/BuildAndRunSandbox.ps1 Added Windows platform support
.github/scripts/BuildAndRunHostApp.ps1 Added Windows platform support
.github/instructions/uitests.instructions.md Clarified guidance text
.github/instructions/android.instructions.md Added Android platform guidance doc
.github/copilot-instructions.md Expanded guidance on skills vs agents and added skill list
.github/agents/pr/post-gate.md Added protocol/clarifications for state file usage
.github/agents/pr.md Updated state file location and added completion protocol
.github/agents/learn-from-pr.md Added new agent definition doc
.config/dotnet-tools.json Updated XHarness CLI tool version

@@ -59,41 +66,58 @@
<HelixPreCommand Include="export XHARNESS_LOG_WITH_TIMESTAMPS=true" />
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

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

This HelixPreCommand uses export, which is POSIX-shell syntax and is likely to fail on Windows Helix work items (where commands typically run under cmd.exe/PowerShell). Since this PR adds Windows Helix work items, the precommand should be conditioned to non-Windows targets or replaced with a Windows-compatible environment setting for Windows runs.

Copilot uses AI. Check for mistakes.
Comment on lines +103 to +108
| File | Description |
|------|-------------|
| `verification-report.md` | Comprehensive markdown report with test results and full logs |
| `verification-log.txt` | Text log of the verification process |
| `test-without-fix.log` | Full test output from run without fix |
| `test-with-fix.log` | Full test output from run with fix |
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

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

These markdown tables start each row with ||, which renders as an extra empty column in most markdown renderers. Update the table rows to start with a single | so the table renders correctly.

Copilot uses AI. Check for mistakes.
Comment on lines +190 to +195
| Aspect | Skills | Agents |
|--------|--------|--------|
| **Invoke** | `/skill-name` or direct request | Delegate to agent |
| **Output** | Analysis, recommendations | Actions, changes applied |
| **Interaction** | Interactive discussion | Autonomous workflow |
| **Example** | `/learn-from-pr` → recommendations | learn-from-pr agent → applies changes |
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

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

This table uses || at the start of each row, which will render with an unintended leading empty column. Use a single leading | per row to ensure correct markdown table formatting.

Copilot uses AI. Check for mistakes.
PureWeen and others added 2 commits January 27, 2026 09:35
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Summary

Refactors the test-writing infrastructure from a monolithic agent to a
dispatcher + skills architecture for better maintainability and
extensibility.

## Changes

### Skills
- **Renamed** `write-tests` → `write-ui-tests` (clearer naming)
- **Added** `write-xaml-tests` skill for XAML unit tests (credit:
@StephaneDelcroix)

### Agents  
- **Renamed** `uitest-coding-agent` → `write-tests-agent`
- **Simplified** from 635 lines to 79 lines (dispatcher pattern)
- Agent now determines test type and invokes appropriate skill

### References Updated
- README-AI.md
- copilot-instructions.md
- pr.md
- sandbox.instructions.md
- agents.instructions.md
- pr-finalize/SKILL.md

## Architecture

| Before | After |
|--------|-------|
| `uitest-coding-agent.md` (635 lines) | `write-tests-agent.md` (79
lines) - dispatcher |
| `write-tests/SKILL.md` | `write-ui-tests/SKILL.md` - UI tests |
| — | `write-xaml-tests/SKILL.md` - XAML unit tests |

## Future Work

- Wire `write-xaml-tests` into `write-tests-agent` dispatch table
- Add additional test type skills (unit tests, integration tests)

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
rmarinho and others added 3 commits January 28, 2026 11:44
### Description of Change

This pull request introduces a new developer skill for running .NET MAUI
device tests locally on iOS simulators. It adds comprehensive
documentation and two PowerShell scripts to streamline building,
running, and managing device tests using xharness and the .NET SDK. The
scripts automate simulator selection, build configuration, and test
execution, making it easier for developers to verify iOS compatibility
and run targeted tests.

**Skill documentation and workflow:**

- Added `.github/skills/run-device-tests/SKILL.md` with detailed
instructions, prerequisites, usage scenarios, supported projects,
example commands, and workflow for running device tests on iOS
simulators using xharness and PowerShell.

**Device test automation scripts:**

- Added `Run-DeviceTests.ps1` script to build and run specified MAUI
device test projects on iOS simulators, supporting options for iOS
version selection, test filtering, build-only mode, and output directory
customization. The script also summarizes test results and failed tests.
- Added `List-Simulators.ps1` script to enumerate available iOS
simulators, with support for filtering by iOS version and showing only
booted simulators, helping users select appropriate test targets.

---------

Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
Co-authored-by: Jakub Florkowski <kubaflo123@gmail.com>
@dotnet dotnet deleted a comment from azure-pipelines bot Jan 28, 2026
@dotnet dotnet deleted a comment from azure-pipelines bot Jan 28, 2026
@dotnet dotnet deleted a comment from azure-pipelines bot Jan 28, 2026
@dotnet dotnet deleted a comment from azure-pipelines bot Jan 28, 2026
kubaflo and others added 2 commits January 28, 2026 09:24
> [!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

Adds a new `ai-summary-comment` skill for posting automated progress
comments on GitHub PRs.

**New files added:**
- `.github/skills/ai-summary-comment/SKILL.md` - Skill definition and
usage guide
- `.github/skills/ai-summary-comment/IMPROVEMENTS.md` - Documentation of
dynamic section extraction improvements
- `.github/skills/ai-summary-comment/NO-EXTERNAL-REFERENCES-RULE.md` -
Self-contained comment requirements
-
`.github/skills/ai-summary-comment/scripts/post-ai-summary-comment.ps1`
- Main script for posting aggregated PR comments
-
`.github/skills/ai-summary-comment/scripts/post-pr-finalize-comment.ps1`
- PR finalize comment script
- `.github/skills/ai-summary-comment/scripts/post-try-fix-comment.ps1` -
Try-fix phase comment script
-
`.github/skills/ai-summary-comment/scripts/post-verify-tests-comment.ps1`
- Test verification comment script
-
`.github/skills/ai-summary-comment/scripts/post-write-tests-comment.ps1`
- Write tests comment script

**Key features:**
- Dynamic section extraction from PR state files
- Flexible regex pattern matching for section titles
- Two-level validation (errors vs warnings)
- Debug mode for troubleshooting
- Creates single aggregated review comment with collapsible sections per
commit
…agnostics (#33705)

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

This PR addresses multiple sources of UI test flakiness identified from
analyzing the last 10 main branch UITest CI runs.

### 1. Screenshot Timing Fixes (`retryTimeout` parameter)

Many visual tests were failing intermittently because screenshots were
taken before animations/transitions completed. Added `retryTimeout:
TimeSpan.FromSeconds(2)` to tests that tap buttons and immediately
verify screenshots:

**FeatureMatrix tests (39 files):**
- All BoxView, Border, Brush, Button, CarouselView, CollectionView,
ContentView, Frame, GraphicsView, Image, ImageButton, Label, ScrollView,
Shadow, Shapes, Stepper, SwipeView, Switch, WebView tests

**Issue tests:**
- Issue10563 (SwipeView open/close)
- Issue27730 (Shadow update when clipping)
- Issue26662 (Dynamic FontImageSource color)

### 2. Instrumentation Crash Recovery

Added detection and recovery for Android instrumentation crashes that
were causing entire test fixtures to fail:

- Added `IsInstrumentationCrash()` method with 12 crash signatures
(socket hang up, ECONNRESET, session terminated, etc.)
- Added recovery in `FixtureSetup` and `TestSetup` that calls
`base.Reset()` to recreate the Appium driver session
- This allows tests to recover from transient instrumentation failures
instead of failing the entire fixture

### 3. OneTimeSetUp Diagnostic Attachment Fix

Fixed an issue where diagnostic files (logcat, screenshots) attached
during `OneTimeSetUp` failures were not visible in Azure DevOps test
results:

- NUnit limitation: `TestContext.AddTestAttachment` in `OneTimeSetUp`
attaches to fixture context, not individual tests
- Azure DevOps only displays per-test attachments
- Solution: Store diagnostic file paths during fixture setup failures,
then re-attach them to each individual test in `TearDown`

## Changes

### Infrastructure (`src/TestUtils/src/UITest.NUnit/UITestBase.cs`)
- Added `_fixtureSetupDiagnosticFiles` list and `_fixtureSetupFailed`
flag
- Modified `TearDown` to re-attach fixture diagnostic files to each test
- Added `storeForReattachment` parameter to `SaveDeviceDiagnosticInfo`
and `SaveUIDiagnosticInfo`

### MAUI Test Base
(`src/Controls/tests/TestCases.Shared.Tests/UITest.cs`)
- Added `IsInstrumentationCrash()` detection with 12 crash signatures
- Added crash recovery in `FixtureSetup` and `TestSetup`

### Test Files
- 39 FeatureMatrix test files: Added `retryTimeout`
- Issue10563.cs: Added `retryTimeout` to SwipeView screenshot tests
- Issue27730.cs: Added `retryTimeout` to shadow update test
- Issue26662.cs: Added `retryTimeout` to dynamic color test

## Testing

Validated through multiple CI runs:
- Build 1270034: iOS/macOS all passed, Android CoreClr passed after
retry
- Build 1270368: Identified additional timing issues in Issue27730 and
Issue26662
- Build 1270512: In progress with latest fixes
@PureWeen
Copy link
Member Author

@copilot can you cherry pick this commit f955690 to this PR please

Copy link
Contributor

Copilot AI commented Jan 28, 2026

@PureWeen I've opened a new pull request, #33745, to work on those changes. Once the pull request is ready, I'll request review from you.

# Conflicts:
#	eng/pipelines/common/provision.yml
kubaflo and others added 8 commits January 29, 2026 00:02
Adds automatic PR label management to the verify-tests-fail-without-fix
skill. After test verification completes, the skill now updates labels
on the PR to indicate verification status.

**New Labels:**
- s/ai-reproduction-confirmed - Tests correctly FAIL without fix
- s/ai-reproduction-failed - Tests PASS without fix

**Files Changed:**
- SKILL.md - Added PR Labels documentation section
- verify-tests-fail.ps1 - Added Update-VerificationLabels function

---------

Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
> [!NOTE]
> Are you waiting for the changes in this PR to be merged?
> It would be very helpful if you could [test the resulting
artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from
this PR and let us know in a comment if this change resolves your issue.
Thank you!

## Summary

Updates the try-fix skill based on consolidated review from 4 AI models
(Gemini 3 Pro, Claude Sonnet 4.5, Codex 5.2, Claude Opus 4.5), validated
against the [agentskills.io
specification](https://agentskills.io/specification).

## Changes

| Change | Rationale |
|--------|-----------|
| Add `compatibility` field to frontmatter | Documents PowerShell, git,
and device requirements per spec |
| Delete `references/output-structure.md` | Content already in SKILL.md
- eliminates duplication |
| Standardize result values to `Pass`/`Fail`/`Blocked` | Was
inconsistent (`PASS`/`FAIL` vs `Pass`/`Fail`) |
| Add `Blocked` as valid result.txt value | For device/emulator
unavailability scenarios |
| Add `Tee-Object` capture to Step 6 | Fixes missing `test-output.log`
capture in workflow |
| Reduce 🚨 markers from 8 to 4 | Kept only critical warnings to reduce
warning fatigue |

## Validation

- ✅ SKILL.md under 500 lines (407 lines)
- ✅ Under 5000 token recommendation
- ✅ No prohibited auxiliary files
- ✅ All frontmatter fields valid per spec
- ✅ Progressive disclosure maintained (references/ for
compile-errors.md, example-invocation.md)

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
…33771)

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

Refactors `post-pr-finalize-comment.ps1` to produce a cleaner, more
readable PR finalization comment format:

**Before:** Single collapsible section per review with merged
Title/Description content
**After:** Two separate collapsible sections (Title and Description) for
better scannability

#### Changes:
- Replace per-review collapsible sections with dedicated Title and
Description sections
- Remove legacy `ReviewNumber` and `ReviewDescription` parameters (no
longer needed)
- Add `TitleIssues` parameter for direct title issue specification
- Auto-detect `TitleStatus` from "Title Assessment" section in summary
files
- Always replace existing finalize comment instead of merging reviews
- Broaden GitHub API comment fetch to `?per_page=100` to handle PRs with
many comments
- Simplify status defaulting logic

### Issues Fixed

N/A - Internal tooling improvement
## Description

Improves the issue-triage skill to prevent common workflow mistakes and
ensure proper usage of GitHub CLI.

## Changes

### 1. Prerequisites and Validation
- Added GitHub CLI (gh) prerequisite checks to both scripts
- Scripts now exit gracefully with installation instructions if gh is
not found
- Updated SKILL.md with Prerequisites section and installation guide for
all platforms

### 2. Milestone Logic Fixes
- Fixed init-triage-session.ps1 to use Invoke-RestMethod for fetching
milestones (doesn't require gh)
- Added documentation: milestone names must come from session output,
not assumptions
- Included examples of correct vs incorrect milestone suggestions

### 3. Workflow Documentation
- Added critical rule: ALWAYS use skill scripts, never ad-hoc GitHub API
queries
- Documented Step 6: Automatically reload issue batches when empty
(don't prompt user)
- Added Common Mistakes section with anti-patterns table
- Explained what each script does and why to use them

### 4. Testing
- ✅ Verified init-triage-session.ps1 works with gh installed
- ✅ Verified query-issues.ps1 applies proper exclusion filters
- ✅ Confirmed prerequisite check catches missing gh CLI

## Why These Changes

During a triage session, the agent bypassed the skill's scripts and used
ad-hoc GitHub queries, which missed important exclusion filters
(s/needs-info, s/needs-repro, area-blazor, etc.). This resulted in
incorrect issue counts and suggestions.

Additionally, the agent assumed milestone names like "SR2" and "SR3"
without checking what milestones actually exist, leading to invalid
suggestions.

These changes ensure future agents (and users) follow the proper
workflow and use accurate data.

## Version Bump

- Version: 2.2 → 2.3
…#33727)

AGP 8.11.1 auto-selects build-tools 35.0.0 for compileSdk 35, which
isn't commonly installed. This causes build failures in the Android
native module.

## Changes

- **src/Core/AndroidNative/maui/build.gradle**
  - Bump `compileSdk` from 35 to 36
- Add explicit `buildToolsVersion "36.0.0"` to override AGP's
auto-selection
  - Bump `targetSdk` from 35 to 36
  
- **src/Core/AndroidNative/build.gradle**
- Replace deprecated `buildDir` with `layout.buildDirectory` (Gradle 8+
API)

- **eng/Versions.props**
  - Remove `IsDefault="True"` from API 35 (only API 36 is default now)
  - Remove `AndroidSdkBuildToolsVersion` property (no longer needed)

- **eng/pipelines/common/ui-tests-build-sample.yml**
  - Remove outdated FIXME comment about API 35

- **src/Provisioning/Provisioning.csproj**
- Remove build-tools provisioning line (gradle file now explicitly
specifies version)

```gradle
android {
    compileSdk 36
    buildToolsVersion "36.0.0"  // Override AGP auto-selection
    namespace "microsoft.maui"
    
    defaultConfig {
        minSdk 21
        targetSdk 36
        ...
    }
}
```

Explicit buildToolsVersion takes precedence over AGP inference, ensuring
builds use an available version.

The `AndroidSdkBuildToolsVersion` MSBuild property has been removed as
it's no longer necessary - the gradle file now directly manages the
build-tools version. Build-tools can be installed through Android SDK
Manager or other standard Android development tools as needed.

<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

Create a PR with these changes. They should be good to go and need no
further updates

<analysis>
**Chronological Review:**
1. Initial phase: User requested checkout of DecorView-Fix PR branch,
rebase to main, and create test sample
2. First build attempt: BuildTasks failed with build-tools 35.0.0 not
found error
3. Investigation phase: Determined AGP 8.11.1 tries to use build-tools
35.0.0 for compileSdk 35
4. First fix attempt: Changed compileSdk to 36, still failed until
explicit buildToolsVersion added
5. Exploration phase: User asked to test AGP 9.x upgrade on new branch
6. AGP upgrade failure: Microsoft.Android.Sdk.Windows 36.1.12
incompatible with Gradle 9.x due to Kotlin type safety
7. Documentation phase: Created detailed bug reports for Microsoft
Android SDK team
8. Final resolution: User decided on minimal build-tools fix approach
9. Branch creation: Created fix-android-build-tools-36 with surgical
changes
10. Cleanup phase: Verified changes, removed untracked files from
previous experiments

**Intent Mapping:**
- Message 1: "checkout the following branch...rebase it to main, write a
sample on the sandbox project" - Test DecorView-Fix PR
- Message 2: "can you build the BuildTasks please" - Compile BuildTasks
solution
- Message 3: "just build it with debug please and then open the
-windows.slnf in VS" - Build configuration clarification
- [6 messages omitted in context]
- "why do you like that better than option 2?" - Comparing fix
approaches
- "yes, please make that change and then lets see if it compiles" -
Approve specific fix
- "did we need to set buildToolsVersion or does just setting compileSdk
do enough?" - Understanding fix necessity
- "delete the artifacts folder before testing again" - Clean build
verification
- "why is buildtoolsversion needed now but never was before? please
figure it out" - Root cause analysis
- "so why doesn't bumping compileSdk to 36 cause it to try and use
build-tools 36?" - Understanding AGP behavior
- "what is AGP and should we bump AGP?" - Context on Android Gradle
Plugin
- "switch to the main branch, checkout a new branch, bump AGP and
compileSDK and see if things build" - Test AGP upgrade path
- "is agp 9.0 a good version to bump to? or should we try even higher?"
- Version selection guidance
- "are you sure it requires breaking changes? can you work on fixing our
code so that AGP 9.2.0 works" - Challenge incompatibility claim
- "are you positive about this? are you just blaming MSFT for your own
inability to make this work?" - Verify technical accuracy
- "can you summarize why you think it's not compatible" - Consolidate
reasoning
- "is there anything official you can find to indicate that
Microsoft.Android.Sdk.Windows 36.1.12 doesn't support gradle 9" -
Request documentation
- "can you give me specific errors I can show someone from that team?" -
Prepare bug report
- "alright lets go with the build tools and compilesdk fix for now, can
you create a new branch with those changes and make sure we are sync
with origin main" - Final decision on approach
- "sorry keep going" - Continue after interruption
- "what are all the changes made? is there anything lingering or are
these all the changes you made for build tools?" - Verify clean state
- "yes please clean the untracked files we only want changes around
updating gradle bits here" - Final cleanup request

**Technical Inventory:**
- .NET 10.0.100 (net10.0)
- Microsoft.Android.Sdk.Windows 36.1.12
- Android Gradle Plugin (AGP) 8.11.1 (current stable)
- Gradle 8.13
- Android compileSdk/targetSdk levels (35 vs 36)
- Android build-tools (33.0.0, 36.0.0 installed; 35.0.0 not installed)
- Kotlin type safety in Gradle 9.x
- MSBuild target system
- Git workflow (branches, rebasing, cherry-picking)
- DecorView-Fix PR: SafeArea padding handling for AdjustResize mode

**Code Archaeology:**
- src/Core/AndroidNative/maui/build.gradle: Gradle configuration for
MAUI Android native library (compileSdk, targetSdk, buildToolsVersion)
- src/Core/AndroidNative/build.gradle: Top-level Gradle config (clean
task with buildDir → layout.buildDirectory)
- src/Core/AndroidNative/gradle/wrapper/gradle-wrapper.properties:
Gradle version definition (8.13)
- eng/Versions.props: MSBuild version properties
(AndroidSdkBuildToolsVersion)
-
artifacts/obj/Core/Debug/net10.0-android36.0/gradle/net.android.init.gradle.kts:
Generated Kotlin file causing AGP 9.x failures
- src/Controls/samples/Controls.Sample.Sandbox/: Test files created for
DecorView-Fix testing
- KeyboardTestPage.xaml/.cs: Test page with multiple Entry fields
- MainActivity.cs: Modified for AdjustResize mode
- App.xaml.cs: Modified for Shell with bottom tabs

**Progress Assessment:**
Completed:
- ✅ DecorView-Fix PR analyzed and rebased to main
- ✅ Sandbox test sample created (on separate branch)
- ✅ Root cause identified: AGP tries to use build-tools 35.0.0 for
compileSdk 35
- ✅ AGP 9.x upgrade tested and determined incompatible with current SDK
- ✅ Bug reports created for Microsof...

</details>



<!-- START COPILOT CODING AGENT SUFFIX -->

Created from Copilot CLI via the copilot delegate command.

<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

---------

Co-authored-by: Shane Neuville (HE/HIM) <shneuvil@microsoft.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: jonathanpeppers <840039+jonathanpeppers@users.noreply.github.com>
Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: Shane Neuville <shane94@hotmail.com>
### Description of Change

This pull request updates the build and test infrastructure to improve
platform-specific builds, streamline build conditions, and enhance macOS
integration test reliability. The changes reorganize project selection
logic in `Build.props`, update build pipeline pool configurations to use
a shared macOS pool, and adjust environment variable handling for
integration tests.

**Build system and pipeline improvements:**

* Refactored `eng/Build.props` to separate build logic for pack-only,
full build, and device test scenarios, adding more precise conditions
and additional build properties for macOS and Windows builds.
* Updated Azure DevOps pipeline pool configurations in
`eng/pipelines/ci.yml` to use the `AcesShared` pool with specific
demands for macOS jobs, replacing previous references to `Azure
Pipelines` and hosted images.
[[1]](diffhunk://#diff-07a82fab001c5b336d89cb64918f0a88b6b66f03d88d67e0fa13c65202455120L77-R79)
[[2]](diffhunk://#diff-07a82fab001c5b336d89cb64918f0a88b6b66f03d88d67e0fa13c65202455120L100-R113)
* Removed the `Agent.OSVersion` demand for macOS device test pools in
`eng/pipelines/device-tests.yml`, simplifying agent selection.
[[1]](diffhunk://#diff-d2d1c388a0fb3196dbfcdab96421bc88336637a3d44480c96717f92d000facaeL74)
[[2]](diffhunk://#diff-d2d1c388a0fb3196dbfcdab96421bc88336637a3d44480c96717f92d000facaeL83)

**Integration test and environment variable handling:**

* Changed integration test pipeline logic in
`eng/pipelines/arcade/stage-integration-tests.yml` to always set
`SKIP_XCODE_VERSION_CHECK=true` for macOS jobs, and refactored the logic
for setting `IOS_TEST_DEVICE` to be more precise for iOS test
categories.
* Updated `TestEnvironment.SkipXcodeVersionCheck` in
`TestEnvironment.cs` to always return `true` (unless overridden by
environment variable), ensuring Xcode version checks are always skipped
locally and in CI.

**Build script adjustments:**

* Removed explicit build properties from the Microsoft.Maui.sln build
command in the arcade build pipeline, relying on the new logic in
`Build.props` for property management.
# Conflicts:
#	eng/pipelines/ci.yml
#	eng/pipelines/common/provision.yml
@rmarinho rmarinho merged commit 6417271 into net11.0 Jan 30, 2026
22 of 28 checks passed
@rmarinho rmarinho deleted the merge/main-to-net11.0 branch January 30, 2026 18:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

p/0 Current heighest priority issues that we are targeting for a release.

Projects

None yet

Development

Successfully merging this pull request may close these issues.