Skip to content

[Testing] SafeArea Feature Matrix Test Cases for ContentPage#34877

Merged
kubaflo merged 30 commits into
dotnet:inflight/currentfrom
TamilarasanSF4853:safearea-feature-matrix
Apr 17, 2026
Merged

[Testing] SafeArea Feature Matrix Test Cases for ContentPage#34877
kubaflo merged 30 commits into
dotnet:inflight/currentfrom
TamilarasanSF4853:safearea-feature-matrix

Conversation

@TamilarasanSF4853
Copy link
Copy Markdown
Contributor

This pull request adds a new SafeArea feature matrix test page to the test application, providing a comprehensive UI for testing and demonstrating SafeArea handling across platforms. It introduces new XAML pages, view models, and platform-specific logic to visualize, interact with, and inspect SafeArea insets and behaviors, especially for Android and iOS.

New SafeArea Feature Matrix:

  • Added a new SafeAreaFeaturePage and entry point to the test gallery, allowing users to navigate to SafeArea test scenarios from the main test app (CorePageView.cs, SafeAreaFeaturePage.xaml, SafeAreaFeaturePage.xaml.cs). [1] [2] [3]

SafeArea Content Page and UI:

  • Implemented SafeAreaContentPage.xaml and code-behind, providing a visual grid with labeled edge indicators, controls for toggling SafeArea regions, and real-time display of SafeArea insets. The page supports interaction and keyboard testing, and updates dynamically on size or inset changes. [1] [2]

Platform-specific and Utility Logic:

  • Added SafeAreaExtensions with platform-specific logic to fetch and format SafeArea insets for display, supporting both Android and iOS/MacCatalyst.
  • On Android, implemented a listener for window inset changes (e.g., keyboard show/hide) to update the UI in real time.

These changes provide a robust foundation for testing SafeArea behavior in the app, making it easier to validate layout correctness across devices and platforms.

Issues Found:
#34846
#34847
#34872

@dotnet-policy-service dotnet-policy-service Bot added the community ✨ Community Contribution label Apr 8, 2026
@dotnet-policy-service
Copy link
Copy Markdown
Contributor

Hey there @@TamilarasanSF4853! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed.

@dotnet-policy-service dotnet-policy-service Bot added the partner/syncfusion Issues / PR's with Syncfusion collaboration label Apr 8, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 8, 2026

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 34877

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 34877"

@Ahamed-Ali Ahamed-Ali added area-safearea Issues/PRs that have to do with the SafeArea functionality area-testing Unit tests, device tests labels Apr 8, 2026
@sheiksyedm
Copy link
Copy Markdown
Contributor

/azp run maui-pr-uitests

@sheiksyedm sheiksyedm marked this pull request as ready for review April 14, 2026 08:22
Copilot AI review requested due to automatic review settings April 14, 2026 08:22
@sheiksyedm sheiksyedm added this to the .NET 10 SR7 milestone Apr 14, 2026
@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

Copy link
Copy Markdown
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

Adds a new SafeArea “feature matrix” experience to the Controls TestCases HostApp and a corresponding Appium/NUnit test suite to validate ContentPage SafeAreaEdges behavior (including keyboard + orientation scenarios) on Android/iOS.

Changes:

  • Introduces a new SafeArea feature entry page and a SafeArea ContentPage test UI (plus options modal + view model) in TestCases.HostApp.
  • Adds platform-specific utilities to read/format safe area + keyboard inset info for display in the UI.
  • Adds a new FeatureMatrix UI test fixture (SafeArea_ContentPageFeatureTests) that drives the new UI and asserts element positions.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 12 comments.

Show a summary per file
File Description
src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/SafeArea_ContentPageFeatureTests.cs Adds Appium-based tests validating ContentPage SafeAreaEdges/keyboard/orientation behavior.
src/Controls/tests/TestCases.HostApp/FeatureMatrix/SafeArea/SafeAreaViewModel.cs Adds view model for uniform/per-edge safe area configuration plus padding/background options.
src/Controls/tests/TestCases.HostApp/FeatureMatrix/SafeArea/SafeAreaOptionsPage.xaml Adds UI for configuring SafeAreaEdges per-edge/uniform and toggling padding/background.
src/Controls/tests/TestCases.HostApp/FeatureMatrix/SafeArea/SafeAreaOptionsPage.xaml.cs Wires up options UI events to update the SafeAreaViewModel and close the modal.
src/Controls/tests/TestCases.HostApp/FeatureMatrix/SafeArea/SafeAreaFeaturePage.xaml Adds the SafeArea feature matrix landing page UI (button to open ContentPage scenario).
src/Controls/tests/TestCases.HostApp/FeatureMatrix/SafeArea/SafeAreaFeaturePage.xaml.cs Adds SafeArea feature entry navigation and button click handler to open the scenario page.
src/Controls/tests/TestCases.HostApp/FeatureMatrix/SafeArea/SafeAreaExtensions.cs Adds platform-specific logic to fetch/format safe area + IME/cutout inset info.
src/Controls/tests/TestCases.HostApp/FeatureMatrix/SafeArea/ContentPage/SafeAreaContentPage.xaml Adds the visual test layout with edge indicators, controls, and inset readout label.
src/Controls/tests/TestCases.HostApp/FeatureMatrix/SafeArea/ContentPage/SafeAreaContentPage.xaml.cs Adds code-behind for updating inset label and Android inset listener/SoftInput mode.
src/Controls/tests/TestCases.HostApp/CoreViews/CorePageView.cs Registers the new “SafeArea Feature Matrix” in the gallery list.

@PureWeen PureWeen modified the milestones: .NET 10 SR7, .NET 10.0 SR8 Apr 14, 2026
kubaflo and others added 2 commits April 15, 2026 11:03
…t#34705)

## Summary

Extends the CI PR review pipeline to support **all test types** (UI
tests, device tests, unit tests, XAML tests) and restructures the review
flow by decoupling the gate from the copilot agent.

### Before
- Gate only supported UI tests (`TestCases.HostApp` /
`TestCases.Shared.Tests`)
- PRs with device tests, unit tests, or XAML tests were **skipped** by
the gate
- Gate ran as Phase 2 inside the copilot agent (4-phase: Pre-Flight →
Gate → Try-Fix → Report)
- Gate results were duplicated across all phase outputs
- AI summary comment included session history merging (841 lines of
code)

### After
- Gate supports **all test types** with auto-detection
- Gate runs as a **standalone script step** before the copilot agent
- Gate posts its own **separate PR comment** (`<!-- AI Gate -->`)
- AI summary is **simplified** (170 lines, always overwrites, no session
history)
- PR review is now 3 phases: Pre-Flight → Try-Fix → Report

## New Scripts

| Script | Purpose |
|--------|---------|
| `Detect-TestsInDiff.ps1` | Analyzes PR files, classifies tests by type
(UITest, DeviceTest, UnitTest, XamlUnitTest), extracts method names from
diffs |
| `post-gate-comment.ps1` | Posts/updates gate result as separate PR
comment |
| `RunTests.ps1` | Unified test runner entry point for all test types |

## Test Detection

```bash
pwsh .github/scripts/shared/Detect-TestsInDiff.ps1 -PRNumber 25129
```

```
📱 [DeviceTest] EditorTests (PlaceholderHorizontalTextAlignment)
   Filter:  Category=Editor
🖥️ [UITest] Issue10987
   Filter:  Issue10987
```

## New Review Flow

```
Step 0: Branch setup
Step 1: Gate (verify-tests-fail.ps1 — direct script, no copilot agent)
         → Posts <!-- AI Gate --> comment immediately
Step 2: PR Review (copilot agent — 3 phases: Pre-Flight, Try-Fix, Report)
         → Gate result passed in prompt
Step 3: Post AI Summary (<!-- AI Summary --> comment)
Step 4: Apply labels
```

## PR Comments (Two Separate Comments)

**Gate comment** (`<!-- AI Gate -->`):
```markdown
## 🚦 Gate — Test Verification
► Expand Full Gate — abc1234 · Fix editor alignment

### Gate Result: ✅ PASSED
| Step | Expected | Actual | Result |
| Without fix | FAIL | FAIL | ✅ |
| With fix | PASS | PASS | ✅ |
```

**AI Summary comment** (`<!-- AI Summary -->`):
Pre-Flight, Fix, Report sections only — no gate duplication.

## Key Changes

- **`verify-tests-fail.ps1`**: Auto-detects test type, routes to correct
runner (BuildAndRunHostApp, Run-DeviceTests, dotnet test), iterates over
all detected tests, `-Platform` mandatory
- **`Detect-TestsInDiff.ps1`**: Shared detection engine — reads
`[Category]` attributes for device test filtering, extracts method names
from PR diffs
- **`Review-PR.ps1`**: Gate as Step 1 (script), PR review as Step 2
(copilot), removed PR finalize step
- **`post-ai-summary-comment.ps1`**: Rewritten from 841 → 170 lines,
always overwrites
- **`pr-gate.md`**: Strict output template, no cross-phase duplication
rule
- **`pr-review/SKILL.md`**: 3 phases (removed Gate), no-duplication rule
- **`EstablishBrokenBaseline.ps1`**: Excludes
TestUtils/DeviceTests.Runners from fix file detection

## Verified

- Gate passed locally on Share device tests: without fix=FAIL ✅, with
fix=PASS ✅
- Detection tested on PRs: dotnet#25129, dotnet#34615, dotnet#34598, dotnet#31056
- Comments posted to 8 PRs from CI build artifacts

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…, security hardening (dotnet#34678)

## Description

Overhauls the `copilot-evaluate-tests` gh-aw workflow — switches to
on-demand triggers only (`/evaluate-tests` slash command + manual
`workflow_dispatch`), adds security hardening, and improves error
handling. No auto-runs on PR create/update.

### What Changed

**Triggers (on-demand only — no auto-runs)**
- Add `slash_command: evaluate-tests` — comment `/evaluate-tests` on a
PR to trigger
- Keep `workflow_dispatch` — manual trigger from Actions tab with PR
number input
- Disable `pull_request_target` — no auto-evaluation on PR create/update
- Add `bots: ["copilot-swe-agent[bot]"]` — Copilot-authored PRs can be
evaluated
- Add `labels: ["pr-review", "testing"]` — workflow runs are labeled

**Gate step (fast-fail for invalid requests)**
- Check PR is OPEN before evaluating (rejects closed/merged PRs with
clear message)
- Check for test source files in diff before spinning up agent
- Fall back to REST API for PRs with 300+ files (where `gh pr diff`
returns HTTP 406)
- All API errors surfaced with clear messages — no silent masking
- `exit 1` stops the workflow immediately — no wasted agent compute

**Access gating (`Checkout-GhAwPr.ps1`)**
- Reject fork PRs (`isCrossRepository` check)
- Verify PR author has write access (admin/write/maintain roles)
- Fix `ConvertFrom-Json` ordering — check exit code before JSON parsing
- Make infrastructure restore fatal on failure (was soft warning)
- Remove pre-delete pattern — `git checkout` overwrites in-place

**Workflow improvements**
- `hide-older-comments: true` — previous evaluations auto-collapse
- `report-as-issue: false` for noop — no issue created when nothing to
evaluate
- Timeout bumped 15 → 20 minutes
- Dry-run mode via `suppress_output` input (workflow_dispatch only)
- `Gather-TestContext.ps1` now receives `-PrNumber` parameter

**Security documentation (`gh-aw-workflows.instructions.md`)**
- Add "Before You Build" anti-patterns table — prefer built-in gh-aw
features
- Add Security Boundaries section with defense layers table
- Add Rules for gh-aw Workflow Authors (DO/DON'T list)
- Document `COPILOT_TOKEN` exposure and mitigations
- Add `slash_command` to fork behavior table
- Update `Checkout-GhAwPr.ps1` description to match current behavior

### Trigger Behavior

| Trigger | When it fires | Who can trigger |
|---------|---------------|-----------------|
| `/evaluate-tests` comment | Comment on a PR | Write-access
collaborators + copilot-swe-agent[bot] |
| `workflow_dispatch` | Actions tab → "Run workflow" → enter PR number |
Write-access collaborators |
| ~~`pull_request_target`~~ | ~~Auto on PR create/update~~ |
~~Disabled~~ |

### Security Model

Based on [GitHub Security Lab
guidance](https://securitylab.github.com/resources/github-actions-preventing-pwn-requests/):

- PR contents treated as **passive data** (read/analyze, never built or
executed)
- Agent runs in **sandboxed container** with `GITHUB_TOKEN` and `gh` CLI
scrubbed
- Write operations in **separate `safe_outputs` job** (not the agent)
- Agent output limited to `max: 1` comment via safe-outputs
- `Checkout-GhAwPr.ps1` rejects fork PRs and verifies write access
before checkout
- Infrastructure restore is fatal on failure — prevents running with
untrusted infra

### Validation

| Test | PR | Result |
|------|-----|--------|
| Open PR with tests | dotnet#34983 | ✅ Full success (gate → checkout → agent
→ comment) |
| No-test PR | dotnet#34876 | ✅ Gate fast-fail ("no test source files") |
| Merged PR | dotnet#34932 | ✅ Gate fast-fail ("MERGED — skipping") |

### Known Limitations

- Fork PRs via `/evaluate-tests` can supply modified `.github/skills/` —
accepted residual risk (agent sandboxed, output bounded). Tracked as
[gh-aw#18481](github/gh-aw#18481)
- `exit 1` in gate step shows ❌ in GitHub checks for no-test/closed PRs
— intentional (no built-in "skip" mechanism in gh-aw steps)
- `pull_request_target` commented out — can be re-enabled later for
auto-evaluation

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
PureWeen and others added 11 commits April 16, 2026 08:42
…net#34686)

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

## Summary

Adds automated milestone management for PRs and issues. A single
workflow handles both automatic milestoning on PR merge and manual
tag-based reconciliation after releases ship.

## Problem

When PRs merge, they often get milestoned for the wrong service release
or not milestoned at all. The actual release a PR ships in depends on
which Candidate PR carries the commits and when the SR branch is cut.
This creates milestone drift that makes release queries and notes
inaccurate.

## Solution

### Files

| File | Purpose |
|------|---------|
| `.github/scripts/Fix-MilestoneDrift.ps1` | Core engine — version
detection, milestone mapping, correction logic |
| `.github/scripts/Fix-MilestoneDrift.Tests.ps1` | 77 Pester unit tests
for all pure functions |
| `.github/workflows/fix-milestone-drift.yml` | Single workflow with
dual triggers (auto on merge + manual dispatch) |

---

## How It Works

### Version Detection

The source of truth is `eng/Versions.props`. For single-PR mode, the
script reads `MajorVersion` and `PatchVersion` **at the PR's merge
commit SHA** to determine what version the branch was building when the
PR merged.

### Milestone Mapping

| Patch | Example | Milestone | Rule |
|-------|---------|-----------|------|
| `0` | `10.0.0` | `.NET 10.0 GA` | Exact zero |
| `1-9` | `10.0.5` | `.NET 10.0 SR1` | Early patches |
| `N0` | `10.0.60` | `.NET 10 SR6` | patch / 10 |
| `N0+x` | `10.0.41` | `.NET 10 SR4.1` | Sub-patch = distinct milestone
|

Sub-patches are distinct — `.NET 10 SR4.1` != `.NET 10 SR4`. Script
warns and skips gracefully if the milestone doesn't exist on GitHub yet.

### Milestone Normalization

GitHub milestones have inconsistent naming (`.NET 10.0 SR4` vs `.NET 10
SR4`, `.NET 10.0 GA` vs `.NET 10 GA`). The script normalizes both SR and
GA forms as equivalent.

### Branch Ownership Detection

Reads `<MajorVersion>` from `eng/Versions.props` on `origin/main`. No
hardcoded version numbers — automatically handles version transitions
when `main` moves from .NET 10 to .NET 11.

### Merge-Up Protection

Checks each PR's `base.ref` to skip PRs from different .NET versions
(prevents merge-up commits from causing incorrect milestoning):

| `base.ref` | MainBranch=`main` | MainBranch=`net11.0` |
|------------|-------------------|---------------------|
| `main` | ✅ | ❌ |
| `inflight/*`, `darc/*` | ✅ | ❌ |
| `net11.0` | ❌ | ✅ |
| `release/10.*` | ✅ | ❌ |
| `release/11.*` | ❌ | ✅ |

### Linked Issue Detection

Scans PR title and body for:
- `fix/fixes/fixed/close/closes/closed/resolve/resolves/resolved #N`
- Same keywords + `https://github.com/dotnet/maui/issues/N`

Bare informational URLs are ignored. Results are deduplicated.

---

## Single Workflow, Two Triggers

### Auto: On PR Merge (`pull_request_target`)

Triggers on every PR merge to `main`, `net*.0`, `inflight/*`, or
`release/*`. Reads `Versions.props` at the merge commit, sets the
milestone on the PR and its linked issues. If the milestone doesn't
exist yet on GitHub, warns and skips gracefully (no red CI).

### Manual: Tag Reconciliation (`workflow_dispatch`)

| Input | Type | Default | Description |
|-------|------|---------|-------------|
| `pr_number` | string | _(empty)_ | Single PR to check |
| `tag` | string | _(empty)_ | Release tag to audit (e.g. `10.0.60`) |
| `apply` | boolean | `false` | Apply changes (default: dry-run) |
| `create_issue` | boolean | `false` | Create GitHub issue with report |

---

## Safety

| Rule | Purpose |
|------|---------|
| Dry-run by default (manual) | `workflow_dispatch` requires explicit
`apply` checkbox |
| Date cutoff (2026-01-01) | Never touches PRs merged before 2026 |
| Branch check | Skips merge-up PRs from different .NET versions |
| Deduplication | Same issue corrected once even if linked from multiple
PRs |
| Fixing-keyword URLs | Bare informational issue references ignored |
| Milestone must exist | Warns and skips gracefully if milestone not
found |
| Merge commit fetch | Fetches commit on demand for PRs merged to
inflight |
| Warning diagnostics | Silent failures in version detection log
warnings |
| GA tag support | Tag mode handles first release tag (no previous tag)
|
| Input sanitization | Workflow inputs flow through `env:` vars, not
inline interpolation |
| Error propagation | `Invoke-ApplyCorrections` throws on failure; CI
goes red |
| Zero-check guard | Tag mode throws when all PRs fail to fetch
(prevents false "all correct") |

---

## Known Limitations

- **Preview/RC milestones**: The script currently maps `PatchVersion=0`
to `.NET X.0 GA`. It does not read `PreReleaseVersionLabel` or
`PreReleaseVersionIteration` from `Versions.props`, so PRs merged to
`net11.0` during the preview phase will not be automatically milestoned
(the workflow gracefully skips with a warning). Preview milestone
support is planned as a follow-up.
- **GA tag rate limit**: Running `-Tag X.0.0` (the very first release
tag) in manual mode walks the full git history, which could exhaust
GitHub API rate limits on large repos.

---

## Test Suite

77 Pester unit tests covering all pure functions:

| Block | Tests | Coverage |
|-------|-------|----------|
| `ConvertTo-Milestone` | 17 | GA, SR1-SR10, sub-patches (SR4.1,
SR10.1), early patches, preview/invalid |
| `Test-MilestoneMatch` | 12 | Exact, normalization (SR + GA), sub-patch
distinction, null/empty |
| `Find-MatchingMilestone` | 5 | Direct, normalized, alternate format,
non-existent |
| `Find-PreviousTag` | 9 | Ordered traversal, boundaries, major-version
isolation |
| `Get-LinkedIssues` | 11 | Keywords (incl. close/resolve bare), URLs,
dedup, case |
| `Get-PatchVersion` | 4 | Valid, GA, large, invalid |
| `Test-IsReleaseTag` | 5 | Valid release, wrong major, preview, invalid
|
| `Test-PrBelongsToVersion` | 14 | main/net11.0 contexts, inflight,
darc, release, feature |

---

## Local Usage

```powershell
# Dry-run: check a single PR
./Fix-MilestoneDrift.ps1 -PrNumber 34620 -RepoPath . -Verbose

# Dry-run: audit all PRs in a tagged release
./Fix-MilestoneDrift.ps1 -Tag 10.0.50 -RepoPath . -Verbose

# Apply fixes
./Fix-MilestoneDrift.ps1 -PrNumber 34620 -Apply

# Full tag audit + apply + report issue
./Fix-MilestoneDrift.ps1 -Tag 10.0.50 -Apply -CreateIssue

# Run tests
Invoke-Pester ./Fix-MilestoneDrift.Tests.ps1 -Output Detailed
```

## Validated Results

- 77 Pester tests pass
- Single-PR: dotnet#34047 → `PatchVersion=50` at merge → `.NET 10 SR5` ✅
- Single-PR: dotnet#34620 (untagged) → `PatchVersion=60` at merge → `.NET 10
SR6` ✅
- Single-PR: dotnet#34553 (merged to inflight) → fetches commit, reads
`PatchVersion=60` ✅
- Tag mode: `10.0.50` → 78 PRs checked, 90 corrections, 0 duplicates, 0
false positives ✅
- 50-PR sample against 10.0.60 range → correctly identifies SR7→SR6
drift ✅
- .NET 11 preview PR dotnet#34252 → gracefully warns "milestone not found",
exits 0 ✅

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Jakub Florkowski <kubaflo123@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…t#34999)

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

## Summary

Follow-up to dotnet#34686. Adds preview/RC milestone support and release
branch detection to the milestone drift fixer.

## Problem

PRs merged to \`net11.0\` were not being milestoned because
\`Versions.props\` on that branch always has
\`PreReleaseVersionIteration=1\` regardless of which preview the PR
actually ships in. The iteration is only bumped on release branches.

## Solution

### Release Branch Detection (Primary)

New detection step checks release branches first using \`merge-base
--is-ancestor\`. For each PR, it finds the **earliest** release branch
containing the merge commit:

| Release Branch | Milestone |
|---|---|
| \`release/10.0.1xx\` | \`.NET 10.0 GA\` |
| \`release/10.0.1xx-sr5\` | \`.NET 10 SR5\` |
| \`release/11.0.1xx-preview1\` | \`.NET 11.0-preview1\` |
| \`release/11.0.1xx-preview3\` | \`.NET 11.0-preview3\` |
| \`release/12.0.1xx-rc1\` | \`.NET 12.0-rc1\` |

### Detection Order

1. **Explicit \`-Tag\`** — if provided
2. **Release branches** — \`merge-base --is-ancestor\` against
\`release/{Major}.0.1xx-*\` branches, earliest match wins
3. **Versions.props** at merge commit — fallback for PRs not yet on any
release branch
4. **Tag range search** — last resort

### Preview/RC Milestone Mapping

\`ConvertTo-Milestone\` now accepts optional pre-release label and
iteration:

| Input | Milestone |
|---|---|
| \`11.0.0 + preview + 3\` | \`.NET 11.0-preview3\` |
| \`12.0.0 + rc + 1\` | \`.NET 12.0-rc1\` |
| \`10.0.60\` (stable) | \`.NET 10 SR6\` (unchanged) |

## Validated Results

| PR | Base | Current Milestone | Script Result | Method |
|---|---|---|---|---|
| dotnet#33524 | net11.0 | .NET 11.0-preview1 | .NET 11.0-preview1 ✅ | Release
branch |
| dotnet#33233 | net11.0 | .NET 11.0-preview1 | .NET 11.0-preview1 ✅ | Release
branch |
| dotnet#30132 | net11.0 | .NET 11.0-preview3 | .NET 11.0-preview3 ✅ | Release
branch |
| dotnet#33834 | net11.0 | .NET 11.0-preview3 | .NET 11.0-preview3 ✅ | Release
branch |
| dotnet#34214 | net11.0 | .NET 11.0-preview2 | .NET 11.0-preview3 ✅ | Release
branch (drift caught!) |
| dotnet#34945 | net11.0 | .NET 11.0-preview4 | preview1 (fallback) |
Versions.props (no p4 branch yet) |
| dotnet#34620 | main | .NET 10 SR6 | .NET 10 SR6 ✅ | Release branch |
| dotnet#34047 | main | .NET 10 SR4.1 | .NET 10 SR5 ✅ | Release branch (drift
caught!) |

PR dotnet#34214 is a real drift example: milestoned preview2 by a human, but
actually on the preview3 release branch.

## Test Suite

88 Pester tests (11 new):
- 6 for \`ConvertTo-Milestone\` preview/RC mapping
- 5 for \`ConvertBranchToMilestone\` (GA, SR, preview, RC, non-release)

---------

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

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

Adds a daily GitHub Actions workflow that generates a prioritized,
actionable PR review queue as a GitHub issue -- with intelligent
turn-state detection that tells you **whose turn it is** on each PR.

### What it does
- Runs weekdays at 8:00 UTC (or on-demand via `workflow_dispatch`)
- Queries open PRs across `dotnet/maui` and `dotnet/docs-maui`
- Determines actionability for each PR using a layered heuristic:
1. **Bot detection** -- filters out maestro, dependabot,
copilot-reviewer, etc.
  2. **Blocked states** -- do-not-merge, stale labels
3. **Project board status** -- reads the MAUI SDK Ongoing board (Ready
To Review, In Progress, Changes Requested, Todo, Approved)
4. **Review decision** -- APPROVED, CHANGES_REQUESTED with
author-response detection
5. **"Who spoke last"** -- compares author activity (issue comments +
inline review-thread replies) against reviewer activity timestamps
- Creates a GitHub issue organized by actionability: FTE-actionable PRs
first, waiting-on-author collapsed, bot PRs collapsed
- Auto-closes previous queue issues to avoid clutter
- Filters out `stale` and `do-not-merge` PRs

### Implementation
Uses a **plain GitHub Action** (not gh-aw) since the task is
deterministic formatting -- no AI reasoning needed:
- ~30s runtime (vs ~2min with LLM)
- Zero LLM cost
- No `COPILOT_GITHUB_TOKEN` dependency -- just built-in `GITHUB_TOKEN`
- Deterministic output every run
- No prompt injection surface

### Changes
- **New**: `.github/workflows/pr-review-queue.yml` -- scheduled workflow
with `schedule`, `workflow_dispatch`, and `pull_request` (validation
only) triggers
- **Modified**: `query-reviewable-prs.ps1` -- adds:
  - `-OutputFormat markdown` option with actionability-grouped output
- `Get-ProjectBoardStatuses` -- paginates full project board for all
status columns
  - `Get-TurnState` -- 5-layer decision tree for "whose turn is it"
  - `Test-IsBot` -- bot account detection
  - Comment + review-thread analysis for author activity detection
  - `#Requires -Version 7.0` for null-coalescing operator

### Example output
The daily issue shows:
- **Actionability Summary** table (FTE-actionable count, waiting on
author, backlog, bot, blocked)
- **P/0 Priority** PRs with turn state
- **Ready to Merge** (approved PRs)
- **Needs FTE Review** (milestoned first, then by age, with turn-state
detail)
- **Waiting on Author** (collapsed `<details>` section)
- **Bot / Automated** (collapsed)
- **Queue Health** stats

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@kubaflo kubaflo changed the base branch from main to inflight/current April 17, 2026 09:01
@kubaflo kubaflo merged commit 9a605dd into dotnet:inflight/current Apr 17, 2026
19 of 31 checks passed
@github-actions github-actions Bot modified the milestones: .NET 10.0 SR8, .NET 10 SR7 Apr 17, 2026
devanathan-vaithiyanathan pushed a commit to Tamilarasan-Paranthaman/maui that referenced this pull request Apr 21, 2026
…34877)

This pull request adds a new SafeArea feature matrix test page to the
test application, providing a comprehensive UI for testing and
demonstrating SafeArea handling across platforms. It introduces new XAML
pages, view models, and platform-specific logic to visualize, interact
with, and inspect SafeArea insets and behaviors, especially for Android
and iOS.

**New SafeArea Feature Matrix:**

* Added a new `SafeAreaFeaturePage` and entry point to the test gallery,
allowing users to navigate to SafeArea test scenarios from the main test
app (`CorePageView.cs`, `SafeAreaFeaturePage.xaml`,
`SafeAreaFeaturePage.xaml.cs`).
[[1]](diffhunk://#diff-adf403d0453beb6436df5f6e4d418d2f62d9c7a1b549a22b048879127df36a38R131)
[[2]](diffhunk://#diff-380d690716fa32487df4ae7b8595ec4572a1a1721a4559ea35a899e74e58343cR1-R16)
[[3]](diffhunk://#diff-dad4ece76c112ffd01b1dce0067a0ab413eb456d4e3f134544803e4c97a97ee8R1-R28)

**SafeArea Content Page and UI:**

* Implemented `SafeAreaContentPage.xaml` and code-behind, providing a
visual grid with labeled edge indicators, controls for toggling SafeArea
regions, and real-time display of SafeArea insets. The page supports
interaction and keyboard testing, and updates dynamically on size or
inset changes.
[[1]](diffhunk://#diff-b98a7bc9dcecb68ca42535e422b7ed2e85562c227ead74765049aa274a9fc815R1-R132)
[[2]](diffhunk://#diff-d67f9bac2f2635bd4a8c7c97aefacbe5e14325d6e01813e2a6d920d58d6b7310R1-R89)

**Platform-specific and Utility Logic:**

* Added `SafeAreaExtensions` with platform-specific logic to fetch and
format SafeArea insets for display, supporting both Android and
iOS/MacCatalyst.
* On Android, implemented a listener for window inset changes (e.g.,
keyboard show/hide) to update the UI in real time.

These changes provide a robust foundation for testing SafeArea behavior
in the app, making it easier to validate layout correctness across
devices and platforms.

**Issues Found:**
dotnet#34846
dotnet#34847
dotnet#34872

---------
PureWeen pushed a commit that referenced this pull request Apr 22, 2026
This pull request adds a new SafeArea feature matrix test page to the
test application, providing a comprehensive UI for testing and
demonstrating SafeArea handling across platforms. It introduces new XAML
pages, view models, and platform-specific logic to visualize, interact
with, and inspect SafeArea insets and behaviors, especially for Android
and iOS.

**New SafeArea Feature Matrix:**

* Added a new `SafeAreaFeaturePage` and entry point to the test gallery,
allowing users to navigate to SafeArea test scenarios from the main test
app (`CorePageView.cs`, `SafeAreaFeaturePage.xaml`,
`SafeAreaFeaturePage.xaml.cs`).
[[1]](diffhunk://#diff-adf403d0453beb6436df5f6e4d418d2f62d9c7a1b549a22b048879127df36a38R131)
[[2]](diffhunk://#diff-380d690716fa32487df4ae7b8595ec4572a1a1721a4559ea35a899e74e58343cR1-R16)
[[3]](diffhunk://#diff-dad4ece76c112ffd01b1dce0067a0ab413eb456d4e3f134544803e4c97a97ee8R1-R28)

**SafeArea Content Page and UI:**

* Implemented `SafeAreaContentPage.xaml` and code-behind, providing a
visual grid with labeled edge indicators, controls for toggling SafeArea
regions, and real-time display of SafeArea insets. The page supports
interaction and keyboard testing, and updates dynamically on size or
inset changes.
[[1]](diffhunk://#diff-b98a7bc9dcecb68ca42535e422b7ed2e85562c227ead74765049aa274a9fc815R1-R132)
[[2]](diffhunk://#diff-d67f9bac2f2635bd4a8c7c97aefacbe5e14325d6e01813e2a6d920d58d6b7310R1-R89)

**Platform-specific and Utility Logic:**

* Added `SafeAreaExtensions` with platform-specific logic to fetch and
format SafeArea insets for display, supporting both Android and
iOS/MacCatalyst.
* On Android, implemented a listener for window inset changes (e.g.,
keyboard show/hide) to update the UI in real time.

These changes provide a robust foundation for testing SafeArea behavior
in the app, making it easier to validate layout correctness across
devices and platforms.

**Issues Found:**
#34846
#34847
#34872

---------
PureWeen pushed a commit that referenced this pull request Apr 28, 2026
This pull request adds a new SafeArea feature matrix test page to the
test application, providing a comprehensive UI for testing and
demonstrating SafeArea handling across platforms. It introduces new XAML
pages, view models, and platform-specific logic to visualize, interact
with, and inspect SafeArea insets and behaviors, especially for Android
and iOS.

**New SafeArea Feature Matrix:**

* Added a new `SafeAreaFeaturePage` and entry point to the test gallery,
allowing users to navigate to SafeArea test scenarios from the main test
app (`CorePageView.cs`, `SafeAreaFeaturePage.xaml`,
`SafeAreaFeaturePage.xaml.cs`).
[[1]](diffhunk://#diff-adf403d0453beb6436df5f6e4d418d2f62d9c7a1b549a22b048879127df36a38R131)
[[2]](diffhunk://#diff-380d690716fa32487df4ae7b8595ec4572a1a1721a4559ea35a899e74e58343cR1-R16)
[[3]](diffhunk://#diff-dad4ece76c112ffd01b1dce0067a0ab413eb456d4e3f134544803e4c97a97ee8R1-R28)

**SafeArea Content Page and UI:**

* Implemented `SafeAreaContentPage.xaml` and code-behind, providing a
visual grid with labeled edge indicators, controls for toggling SafeArea
regions, and real-time display of SafeArea insets. The page supports
interaction and keyboard testing, and updates dynamically on size or
inset changes.
[[1]](diffhunk://#diff-b98a7bc9dcecb68ca42535e422b7ed2e85562c227ead74765049aa274a9fc815R1-R132)
[[2]](diffhunk://#diff-d67f9bac2f2635bd4a8c7c97aefacbe5e14325d6e01813e2a6d920d58d6b7310R1-R89)

**Platform-specific and Utility Logic:**

* Added `SafeAreaExtensions` with platform-specific logic to fetch and
format SafeArea insets for display, supporting both Android and
iOS/MacCatalyst.
* On Android, implemented a listener for window inset changes (e.g.,
keyboard show/hide) to update the UI in real time.

These changes provide a robust foundation for testing SafeArea behavior
in the app, making it easier to validate layout correctness across
devices and platforms.

**Issues Found:**
#34846
#34847
#34872

---------
PureWeen pushed a commit that referenced this pull request Apr 29, 2026
This pull request adds a new SafeArea feature matrix test page to the
test application, providing a comprehensive UI for testing and
demonstrating SafeArea handling across platforms. It introduces new XAML
pages, view models, and platform-specific logic to visualize, interact
with, and inspect SafeArea insets and behaviors, especially for Android
and iOS.

**New SafeArea Feature Matrix:**

* Added a new `SafeAreaFeaturePage` and entry point to the test gallery,
allowing users to navigate to SafeArea test scenarios from the main test
app (`CorePageView.cs`, `SafeAreaFeaturePage.xaml`,
`SafeAreaFeaturePage.xaml.cs`).
[[1]](diffhunk://#diff-adf403d0453beb6436df5f6e4d418d2f62d9c7a1b549a22b048879127df36a38R131)
[[2]](diffhunk://#diff-380d690716fa32487df4ae7b8595ec4572a1a1721a4559ea35a899e74e58343cR1-R16)
[[3]](diffhunk://#diff-dad4ece76c112ffd01b1dce0067a0ab413eb456d4e3f134544803e4c97a97ee8R1-R28)

**SafeArea Content Page and UI:**

* Implemented `SafeAreaContentPage.xaml` and code-behind, providing a
visual grid with labeled edge indicators, controls for toggling SafeArea
regions, and real-time display of SafeArea insets. The page supports
interaction and keyboard testing, and updates dynamically on size or
inset changes.
[[1]](diffhunk://#diff-b98a7bc9dcecb68ca42535e422b7ed2e85562c227ead74765049aa274a9fc815R1-R132)
[[2]](diffhunk://#diff-d67f9bac2f2635bd4a8c7c97aefacbe5e14325d6e01813e2a6d920d58d6b7310R1-R89)

**Platform-specific and Utility Logic:**

* Added `SafeAreaExtensions` with platform-specific logic to fetch and
format SafeArea insets for display, supporting both Android and
iOS/MacCatalyst.
* On Android, implemented a listener for window inset changes (e.g.,
keyboard show/hide) to update the UI in real time.

These changes provide a robust foundation for testing SafeArea behavior
in the app, making it easier to validate layout correctness across
devices and platforms.

**Issues Found:**
#34846
#34847
#34872

---------
github-actions Bot pushed a commit that referenced this pull request May 6, 2026
This pull request adds a new SafeArea feature matrix test page to the
test application, providing a comprehensive UI for testing and
demonstrating SafeArea handling across platforms. It introduces new XAML
pages, view models, and platform-specific logic to visualize, interact
with, and inspect SafeArea insets and behaviors, especially for Android
and iOS.

**New SafeArea Feature Matrix:**

* Added a new `SafeAreaFeaturePage` and entry point to the test gallery,
allowing users to navigate to SafeArea test scenarios from the main test
app (`CorePageView.cs`, `SafeAreaFeaturePage.xaml`,
`SafeAreaFeaturePage.xaml.cs`).
[[1]](diffhunk://#diff-adf403d0453beb6436df5f6e4d418d2f62d9c7a1b549a22b048879127df36a38R131)
[[2]](diffhunk://#diff-380d690716fa32487df4ae7b8595ec4572a1a1721a4559ea35a899e74e58343cR1-R16)
[[3]](diffhunk://#diff-dad4ece76c112ffd01b1dce0067a0ab413eb456d4e3f134544803e4c97a97ee8R1-R28)

**SafeArea Content Page and UI:**

* Implemented `SafeAreaContentPage.xaml` and code-behind, providing a
visual grid with labeled edge indicators, controls for toggling SafeArea
regions, and real-time display of SafeArea insets. The page supports
interaction and keyboard testing, and updates dynamically on size or
inset changes.
[[1]](diffhunk://#diff-b98a7bc9dcecb68ca42535e422b7ed2e85562c227ead74765049aa274a9fc815R1-R132)
[[2]](diffhunk://#diff-d67f9bac2f2635bd4a8c7c97aefacbe5e14325d6e01813e2a6d920d58d6b7310R1-R89)

**Platform-specific and Utility Logic:**

* Added `SafeAreaExtensions` with platform-specific logic to fetch and
format SafeArea insets for display, supporting both Android and
iOS/MacCatalyst.
* On Android, implemented a listener for window inset changes (e.g.,
keyboard show/hide) to update the UI in real time.

These changes provide a robust foundation for testing SafeArea behavior
in the app, making it easier to validate layout correctness across
devices and platforms.

**Issues Found:**
#34846
#34847
#34872

---------
@github-actions github-actions Bot locked and limited conversation to collaborators May 17, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-safearea Issues/PRs that have to do with the SafeArea functionality area-testing Unit tests, device tests community ✨ Community Contribution partner/syncfusion Issues / PR's with Syncfusion collaboration

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants