Skip to content

Fix RemovePossibleQueryString to also strip URL fragments#35550

Closed
kubaflo wants to merge 19 commits into
inflight/currentfrom
fix/hybridwebview-fragment-stripping
Closed

Fix RemovePossibleQueryString to also strip URL fragments#35550
kubaflo wants to merge 19 commits into
inflight/currentfrom
fix/hybridwebview-fragment-stripping

Conversation

@kubaflo

@kubaflo kubaflo commented May 20, 2026

Copy link
Copy Markdown
Contributor

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 of Change

WebUtils.RemovePossibleQueryString only stripped query strings (?) but not URL fragments (#). This caused HybridWebView to fail loading local files when the URL contained a fragment identifier (e.g. index.html#code=abc).

The fix uses IndexOfAny to find the first ? or # delimiter and strips everything from that point forward.

Supersedes #31597.

Issues Fixed

Fixes #31472

dependabot Bot and others added 19 commits May 7, 2026 08:48
Updated [Magick.NET-Q8-AnyCPU](https://github.com/dlemstra/Magick.NET)
from 14.10.4 to 14.12.0.

<details>
<summary>Release notes</summary>

_Sourced from [Magick.NET-Q8-AnyCPU's
releases](https://github.com/dlemstra/Magick.NET/releases)._

## 14.12.0

### What's Changed
- Added `FixByteOrder` to the `DcmReadDefines` (#​1976)
- Added `IconWriteDefines`.

### Related changes in ImageMagick since the last release of Magick.NET:
- Correct bug in `Composite` when using `CopyAlpha` (#​1985)
- Fixed incorrect orientation of JPEG compressed TIFF images (#​1991)
- Heap-Buffer-Overflow write of single zero byte when parsing xml
(GHSA-cr67-pvmx-2pp2)
- Stack Overflow in DestroyXMLTree
(GHSA-fwvm-ggf6-2p4x)
- Out-of-Bounds read in sample operation
(GHSA-pcvx-ph33-r5vv)
- Stack Overflow via Recursive FX Expression Parsing
(GHSA-f4qm-vj5j-9xpw)
- Heap Buffer Overflow in ImageMagick MVG decoder
(GHSA-x9h5-r9v2-vcww)
- Heap overflow caused by integer overflow/wraparound in viff encoder on
32-bit builds
(GHSA-v67w-737x-v2c9)
- Stack-buffer-overflow in MNG encoder with oversized pallete
(GHSA-98cp-rj9f-6v5g)
- Integer overflow in despeckle operation causes heap buffer overflow on
32-bit builds
(GHSA-26qp-ffjh-2x4v)
- Off-by-One in MSL decoder could result in crash
(GHSA-5xg3-585r-9jh5)
- Heap buffer overflow when encoding JXL image with a 16-bit float
(GHSA-jvgr-9ph5-m8v4)
- Heap-use-after-free via XMP profile could result in a crash when
printing the values
(GHSA-r83h-crwp-3vm7)
- Heap buffer overflow (WRITE) in the YAML and JSON encoders
(GHSA-5592-p365-24xh)
- Heap out-of-bounds write in JP2 encoder
(GHSA-pwg5-6jfc-crvh)

### Library updates:
- ImageMagick 7.1.2-19 (2026-04-12)
- aom 3.13.3 (2026-04-02)
- openexr 3.4.9 (2026-04-03)
- freetype 2.14.3 (2026-03-22)
- gdk-pixbuf 2.44.6 (2026-03-31)
- harfbuzz 14.0.0 (2026-04-01)
- liblzma 5.8.3 (2026-04-31)
- libpng 1.6.56 (2026-03-25)

**Full Changelog**:
dlemstra/Magick.NET@14.11.1...14.12.0

## 14.11.1

### Related changes in ImageMagick since the last release of Magick.NET:
- Stack-buffer-overflow WRITE in InterpretImageFilename due to overflow
(GHSA-8793-7xv6-82cf)

### Library updates:
- ImageMagick 7.1.2-18 (2026-03-23)
- aom 3.13.2 (2026-03-19)
- openexr 3.4.7 (2026-03-15)
- harfbuzz 13.2.1 (2026-03-19)

**Full Changelog**:
dlemstra/Magick.NET@14.11.0...14.11.1

## 14.11.0

### What's Changed
- Added `DcmReadDefines`.

### Related changes in ImageMagick since the last release of Magick.NET:
- Access mode change for files created from 0666 to 0600
(ImageMagick/ImageMagick#8609)
- Heap-buffer-overflow in NewXMLTree could result in crash
(GHSA-gc62-2v5p-qpmp)

### Library updates:
- ImageMagick 7.1.2-17 (2026-03-16)
- openexr 3.4.6 (2026-03-01)
- freetype 2.14.2 (2026-03-01)
- harfbuzz 13.0.1 (2026-03-07)
- libxml2 2.15.2 (2026-03-03)

**Full Changelog**:
dlemstra/Magick.NET@14.10.4...14.11.0

Commits viewable in [compare
view](dlemstra/Magick.NET@14.10.4...14.12.0).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Magick.NET-Q8-AnyCPU&package-manager=nuget&previous-version=14.10.4&new-version=14.12.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts page](https://github.com/dotnet/maui/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bump OpenTelemetry packages to latest stable versions in the
maui-aspire-servicedefaults template:

- OpenTelemetry.Exporter.OpenTelemetryProtocol: 1.9.0 to 1.15.3
- OpenTelemetry.Extensions.Hosting: 1.9.0 to 1.15.3
- OpenTelemetry.Instrumentation.Http: 1.9.0 to 1.15.1
- OpenTelemetry.Instrumentation.Runtime: 1.9.0 to 1.15.1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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**:
[20260430.4](https://dev.azure.com/dnceng/internal/_build/results?buildId=2964906)
([312724](https://maestro.dot.net/channel/2/github:dotnet:xharness/build/312724))
- **Date Produced**: May 1, 2026 7:05:11 AM UTC
- **Commit**:
[92962e5c46ac08a66ded4c5696209cc60f1a232f](dotnet/xharness@92962e5)
- **Branch**: [main](https://github.com/dotnet/xharness/tree/main)

[DependencyUpdate]: <> (Begin)

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

[1]: dotnet/xharness@9d5a7e9...92962e5

[DependencyUpdate]: <> (End)


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

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.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!

## Description

Replaces `review-rules.md` (flat 345-line checklist) with a dimensional
expert review agent. Single source of truth for all review rules,
organized into 30 dimensions for per-dimension sub-agent evaluation.
Adds inline file:line PR comments alongside the existing wall-of-text
summary.

Extracted from 28k review comments across 5 maintainers via
[extraction-pipeline](https://github.com/dotnet/fsharp/blob/main/.github/agents/extraction-pipeline.md).
No functional code changes.

Recreated from #35062 on a dotnet/maui branch (originally opened from a
fork).

## What changed

**Before:** `review-rules.md` had 345 lines of flat rules. `code-review`
skill loaded them all into one context. Output was a single wall-of-text
PR comment.

**After:** Rules absorbed into `maui-expert-reviewer.md` as 30
dimensions with 200+ CHECK items. Each dimension runs as an independent
sub-agent with focused context. Output is inline file:line PR comments
via `inline-findings.json`.

## CI Flow

```
Review-PR.ps1 prompt:
  1. code-review → maui-expert-reviewer agent → inline-findings.json
  2. pr-review → Pre-Flight → Try-Fix → Report (sees findings, no duplication)

Posting:
  post-inline-review.ps1    → .json → GitHub file:line comments (NEW)
  post-ai-summary-comment.ps1 → {phase}/content.md → wall-of-text (existing)

CI: COMMENTS_VIA_FILE=true → agent writes .json, script posts
Local: agent writes .json, code-review posts directly via gh api
```

## Files

| Action | File | What |
|--------|------|------|
| **Add** | `agents/maui-expert-reviewer.md` | 30 dimensions, 200+
CHECKs, routing table |
| **Add** | `instructions/collectionview-{android,ios,windows}` |
Platform-isolated CV rules |
| **Add** |
`instructions/{handler-patterns,layout-system,performance-hotpaths,public-api,threading-async}`
| Domain-specific ambient guidance |
| **Add** | `scripts/post-inline-review.ps1` | Posts .json as GitHub PR
review |
| **Del** | `skills/code-review/references/review-rules.md` | Absorbed
into agent |
| **Mod** | `skills/code-review/SKILL.md` | Delegates to agent |
| **Mod** | `scripts/Review-PR.ps1` | Prompt + inline posting wiring |
| **Mod** | `eng/pipelines/ci-copilot.yml` | `COMMENTS_VIA_FILE` env var
|

---------

Co-authored-by: kubaflo <kubaflo@users.noreply.github.com>
Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com>
…View2 is not connected in Appium. (#35335)

### Description of Changes

- Recently, the Appium driver has not been connecting properly to the
native WebView2 control on Windows. While running locally using Appium
Inspector with the WebView control, the inspector is unable to recognize
the WebView and displays an error.

- Due to this Appium driver issue, the WebView lane in CI takes a long
time to run (approximately 3 hours) and eventually gets cancelled. As a
temporary workaround, the WebView lane has been temporarily removed from
the Windows CI pipeline to allow the CI process to complete more
quickly.
<img width="649" height="294" alt="image"
src="https://github.com/user-attachments/assets/68df006b-56d6-4bfa-870a-a4184f5b18b7"
/>
<img width="576" height="430" alt="image"
src="https://github.com/user-attachments/assets/40c222e8-4935-450d-be7e-5ee9245e9eb1"
/>


**Issue:** #35334
### Context

Add ability for maintainers to trigger the AzDO PR review pipeline via
`/review` comment on PR

### Notes

- The workflow allways runs from main - so users cannot chage behavior
in their PRs
- Unprivileged users slash command is ignored
- The 'agentic-labeler.md‎' pipeline referenced in comments of this
pipeline is being added by #35382

### Tested execution:

- GitHub Actions run:
https://github.com/dotnet/maui/actions/runs/25163585137

- DevDiv pipeline run:
https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=13980704

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
The job-level if used startsWith(github.event.comment.body, '/review '), which fails when the comment body starts with whitespace (e.g. ' /review -b feature/foo'). GitHub expression syntax has no trim/regex, so we can't reliably handle this at the expression level.

Add a tiny pre-filter match job that uses a bash regex (^[[:space:]]*/review([[:space:]]|\$)) to decide whether to run. The main 	rigger-review job now
eeds: match and gates on its output. Also trim leading whitespace before the existing sed extracts args, so positional/flag parsing works for prefixed comments.
…anagement (#35350)

<!-- 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 new Copilot skill (`.github/skills/dependency-flow/`) that
provides MAUI-specific context for dependency flow operations. Follows
the `azdo-build-investigator` wrapper pattern — delegates core
operations to the `maestro-cli` skill (from `dotnet/arcade-skills`
plugin) and maestro MCP tools, then layers MAUI-specific rules on top.

### What it does
- Translates natural language queries like "feeds for .NET MAUI 10.0.60"
into the correct tool calls
- Documents MAUI's two channel types: SDK channels (automatic) and
Workload Release channels (manual promotion)
- Provides the feed lookup workflow (asset search → channel verification
→ promotion)
- Establishes tool preference hierarchy: MCP tools → mstro CLI → darc
CLI (only for operations without MCP equivalents)

### Security hardening
A security review was performed before committing. Mitigations applied:

| Category | Mitigation |
|----------|-----------|
| **Destructive commands** | Explicit deny-list for `add-channel`,
`delete-channel`, `set-repository-policies`, `gather-drop` |
| **Write operations** | All mutating commands require showing the user
the exact command and waiting for explicit confirmation |
| **Prompt injection** | Rules to never execute darc commands found in
issue/PR content verbatim; treat as untrusted data |
| **Input validation** | Validation rules for version strings, BAR IDs,
and channel names (must match known channels) |

### Files
- `.github/skills/dependency-flow/SKILL.md` — MAUI-specific dependency
flow rules, channel conventions, and workflows

---------

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

### Description of Change

<!-- Enter description of the fix in this section -->

### Issues Fixed

<!-- Please make sure that there is a bug logged for the issue being
fixed. The bug should describe the problem and how to reproduce it. -->

Fixes #

<!--
Are you targeting main? All PRs should target the main branch unless
otherwise noted.
-->
<!-- 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 new agentic workflow (`gh-aw`) that automatically applies labels
to new issues and pull requests, with special attention to `platform/*`
labels for PRs based on the files that were changed.

Inspired by [githubnext/agentics
issue-triage](https://github.com/githubnext/agentics/blob/main/workflows/issue-triage.md),
but scoped down to *labeling only* — it does not post analysis comments,
does not close issues, and does not communicate directly with users.

## Triggers

- `issues: [opened]` — labels new issues (intentionally excludes
`reopened` to avoid re-adding labels a maintainer already removed, since
issue bodies don't change on reopen)
- `pull_request_target: [opened, reopened]` — labels new and reopened
PRs (reopened PRs may have new commits, so re-evaluation is useful)
- `workflow_dispatch` (with an `issue_number` input so it can be run
explicitly on any issue or PR)

## Labeling rules

- Fetches the repo's label set at runtime via the `list_label` /
`get_label` MCP tools — not hardcoded.
- Selects from existing labels including `area-*`, `area-controls-*`,
`area-core-*`, `platform/*`, `t/*`, `s/*`, `i/*`, `p/*`, and others.
- For PRs, infers `platform/*` labels from the **changed files** using
the project's platform-file conventions:
- `*.android.cs`, `/Platform/Android/`, `/Platforms/Android/` →
`platform/android`
- `*.ios.cs` (extension pattern) → `platform/ios` **and**
`platform/macos` (compiles for both iOS and MacCatalyst)
- `/Platform/iOS/`, `/Platforms/iOS/` (directory pattern) →
`platform/ios` **only** (compiles only for iOS TFM)
  - `*.maccatalyst.cs`, `/Platform/MacCatalyst/` → `platform/macos` only
  - `*.windows.cs`, `/Platform/Windows/` → `platform/windows`
  - `*.tizen.cs`, `/Tizen/` → `platform/tizen`
- Conservative by default: if nothing clearly applies, the agent calls
`noop` instead. One `add_labels` call allowed per run (`max: 1`).

## Security model

- **Read-only agent** — permissions are `contents: read`, `issues:
read`, `pull-requests: read`. The agent runs inside a sandboxed
container with no write credentials.
- **Safe-output writes** — label application happens in a separate
safe-output job with write permissions, capped at 1 call.
- **`roles: all`** — allows community contributors' issues/PRs to be
labeled. Safe because the agent is read-only and the only write surface
is `add_labels`.
- **`min-integrity: none`** — allows the MCP gateway to return content
from all authors (including first-time contributors), so the agent can
read the body it needs to label.
- **Prompt-injection guardrails** — explicit instructions telling the
agent to ignore labeling instructions in issue/PR bodies, never use an
`item_number` from untrusted text, and derive labels only from technical
content and file paths.
- **Noise suppression** — `noop`, `missing-tool`, `report-incomplete`,
and `report-failure` are all configured to not create tracker issues.

## Files

- `.github/workflows/agentic-labeler.md` — the agentic workflow source
- `.github/workflows/agentic-labeler.lock.yml` — compiled GitHub Actions
YAML (generated by `gh aw compile`, v0.68.3)

## Notes for reviewers

- This is consistent with the other `gh-aw` workflows in the repo
(`ci-doctor`, `copilot-evaluate-tests`, `daily-repo-status`).
- Draft because we may want to validate behavior on a few real
issues/PRs (via `workflow_dispatch`) before enabling on every new
issue/PR.

---------

Co-authored-by: Shane Neuville <shneuvil@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@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

Removes the dormant ci-doctor workflow and upgrades all remaining gh-aw
workflows from compiler v0.68.3 to v0.72.1.

## Changes

### Removed: ci-doctor
- Last ran March 26, 2026 — dormant for nearly 2 months
- Had `stop-after: +1mo` which likely auto-disabled it
- Sourced from upstream `github/gh-aw` template; can be re-added if
needed

### Upgraded: all workflows to gh-aw compiler v0.72.1

All three remaining workflows (`agentic-labeler`,
`copilot-evaluate-tests`, `daily-repo-status`) recompiled with the
latest stable compiler. Bug fixes picked up:

- `&&` expression corruption in AWF config JSON
- safe-outputs permission regression (token downgraded to `issues:read`
when `update-project` + `add-comment`/`add-labels` combined)
- Conclusion comment accuracy (was reporting ✅ even when safe_outputs
failed)
- `COPILOT_API_KEY` over-billing (10-100x premium request over-charge)
- Firewall binary v0.25.29 (healthcheck fix)

### Auto-fixes applied
- `checkout: false` added to `agentic-labeler` (saves ~10-30s runner
time — workflow only uses MCP/API tools, no source code needed)
- First-party `agentic-workflows.agent.md` auto-installed by v0.72.1
compiler (gh-aw coding-agent skill for creating/debugging workflows)

## Files

| File | Change |
|------|--------|
| `.github/workflows/ci-doctor.md` | **Deleted** |
| `.github/workflows/ci-doctor.lock.yml` | **Deleted** |
| `.github/workflows/agentic-labeler.md` | Added `checkout: false` |
| `.github/workflows/agentic-labeler.lock.yml` | Recompiled (v0.72.1) |
| `.github/workflows/copilot-evaluate-tests.lock.yml` | Recompiled
(v0.72.1) |
| `.github/workflows/daily-repo-status.lock.yml` | Recompiled (v0.72.1)
|
| `.github/aw/actions-lock.json` | Updated action pins |
| `.github/agents/agentic-workflows.agent.md` | **New** — first-party
gh-aw agent |

## Notes
- No source `.md` changes to `copilot-evaluate-tests` or
`daily-repo-status` — only lock file regeneration
- The `copilot-evaluate-tests` compile emits a pre-existing warning
about `bots:` + `slash_command:` interaction — not introduced by this PR

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.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!

Updates the Phase 2 multi-model exploration list in the `pr-review`
skill:

| Order | Before | After |
|-------|--------|-------|
| 1 | claude-opus-4.6 | claude-opus-4.6 (unchanged) |
| 2 | **claude-sonnet-4.6** | **claude-opus-4.7** |
| 3 | gpt-5.3-codex | gpt-5.3-codex (unchanged) |
| 4 | **gemini-3-pro-preview** | **gpt-5.5** |

Updated in both the model config table and the Phase 2 launch checklist
in `.github/skills/pr-review/SKILL.md`.

Co-authored-by: Copilot <223556219+Copilot@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

Adds 15 eval scenarios to the `agentic-labeler` skill, fixes a rule gap,
and adds explicit noop rules.

## Eval scenarios (15 total)

| Category | Count | Scenarios |
|----------|-------|-----------|
| Platform detection | 5 | `.android.cs`, `.ios.cs` dual-label,
`.windows.cs`, iOS dir-only vs extension, MacCatalyst-only (no ios) |
| Area detection | 4 | Shell, CollectionView, tooling (CI), XAML source
generator |
| Multi-platform | 1 | PR touching Android + iOS + Windows files |
| No platform / noop | 3 | Cross-platform issue, automated merge PR,
dependency bump with existing labels |
| Safety | 2 | Prompt injection resistance, PR status label caveat |

## Rule fixes

- **`Handlers/*/Android/` gap** — Files like
`Handlers/Items/Android/ItemContentView.cs` were not matched by the
platform table. Added this path pattern to the Android row.
- **Noop rules** — Added explicit "When to noop" section: automated
merge PRs, dependency bumps with existing labels, vague/ambiguous items.

## Eval methodology notes

The skill-validator pairwise comparison shows negative effective scores
on some scenarios — this is because the skill-aided agent uses more
tokens/time reading SKILL.md, not because labels are wrong.
Per-dimension analysis:
- **Task completion**: 0% regression across all scenarios (both agents
complete successfully)
- **Quality**: 0% to +100% improvement (skill helps on edge cases like
noop, Shell area)
- **Tokens**: -17% to -100% (reading SKILL.md costs tokens)
- **Time**: -11% to -89% (extra tool calls)

The evals should be treated as regression tests with
`--verdict-warn-only` — they catch accuracy regressions without blocking
on the inherent overhead of loading a skill file.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Per @PureWeen's review on the original PR, this workflow is no longer in
use. Replacing the permissions-block edit with a straight deletion.

No functional change beyond removing the unused trigger.

Signed-off-by: Arpit Jain <arpitjain099@gmail.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!

### Problem

The `/review` slash command in `.github/workflows/review-trigger.yml` is
silently skipped when the comment body has any **leading whitespace**
before `/review`.

Concrete example:
- Comment posted on #35432:
#35432 (comment)
- Body (raw bytes): `' /review -b feature/regression-check'` — note the
leading space (`0x20`).
- Result: workflow run
https://github.com/dotnet/maui/actions/runs/25824871590 → **skipped**.

### Root cause

The job-level guard was:

```yaml
if: >-
  github.event_name == 'workflow_dispatch' ||
  (github.event.issue.pull_request &&
   (github.event.comment.body == '/review' ||
    startsWith(github.event.comment.body, '/review ')))
```

`startsWith(' /review ...', '/review ')` returns `false`, so the job is
skipped. GitHub expression syntax has no `trim` or regex, so we can't
fix this purely at the expression level. The `Parse parameters` step had
the same blind spot — `sed -n 's|^/review[[:space:]]*||p'` produces
empty `ARGS` if the body doesn't start with `/review`.

### Fix

1. **New tiny `match` pre-filter job** that uses a bash regex
(`^[[:space:]]*/review([[:space:]]|$)`) to decide whether the comment is
a `/review` command. It allows arbitrary leading whitespace (spaces,
tabs, newlines) but still requires `/review` to be a standalone token
(won't match `/reviewfoo` or comments that merely mention `/review`
mid-sentence).
2. **`trigger-review` now `needs: match`** and gates on its output,
keeping the rest of the job structure intact.
3. **Trim leading whitespace before `sed`** in `Parse parameters`, so
flag/positional parsing works on prefixed comments like ` /review -b
feature/foo`.

### Verification

Local check of the regex against representative inputs:

| Body                                | Should match | Matches |
|-------------------------------------|--------------|---------|
| `/review`                           | yes          | yes     |
| `/review android`                   | yes          | yes     |
| ` /review -b feature/regression-check` (the failing case) | yes | yes
|
| `\t/review`                         | yes          | yes     |
| `   /review -p ios`                 | yes          | yes     |
| `/reviewfoo`                        | no           | no      |
| `please /review this`               | no           | no      |
| `not a command`                     | no           | no      |

The full end-to-end behavior will be exercised by the next `/review`
invocation on a PR that targets this branch.
<!-- 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

One-line fix: `max: 1` → `max: 10` in the agentic-labeler safe-output
config.

`max: 1` limited the number of labels per call to 1, silently dropping
`platform/*` labels whenever the agent also selected an `area-*` label
(which was every time).

Co-authored-by: Copilot <223556219+Copilot@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

Follow-up to #35540. That PR fixed the `add-labels` truncation bug by
changing the source `.md` from `max: 1` to `max: 10`, but did **not**
regenerate the compiled `.lock.yml`. The deployed workflow on `main`
therefore still embeds the old config and continues to silently drop all
but one label per labeler run.

Running `gh aw compile .github/workflows/agentic-labeler.md` locally
produces this 17-line diff in the lock file. The substantive changes
are:

- `frontmatter_hash` updated to match the new `.md` source (so the lock
file no longer fails the `ERR_CONFIG: Lock file outdated` check on every
dispatch)
- safe-outputs `config.json` now emits `{"add_labels":{"max":10}}` (was
`{"add_labels":{"max":1}}`)
- the agent system prompt now declares `add_labels(max:10)`, so the
orchestrator knows it can return multiple labels in one call
- heredoc delimiters rotate as expected on every recompile

No behaviour changes beyond what #35540 already intended. This is purely
the missing `gh aw compile` output.

## Verification

1. Before this PR: every `gh workflow run agentic-labeler.lock.yml`
dispatch fails with `ERR_CONFIG: Lock file ... is outdated! The workflow
file ... frontmatter has changed.` (confirmed across 26 attempted
backfill dispatches on the affected items in #35540 audit).
2. With this PR locally, `git diff` shows only the lock file changed; no
`.md` modifications.
3. After merge, dispatching the workflow once via `gh workflow run
agentic-labeler.lock.yml --repo dotnet/maui --ref main -f
issue_number=<N>` against an affected item should now successfully apply
multiple `area-*` + `platform/*` labels in a single run (matching #35540
intent).

## Why this happened

PR #35540 was a documentation-style line-edit on the source `.md` and
the author appears to have skipped the mandatory `gh aw compile` step.
The repo currently has no CI check that recompiles the lock file and
rejects out-of-sync commits — adding such a guard is a separate
follow-up.

The misleading guidance in `~/.agents/skills/gh-aw-guide` (which
contributed to the original `max: 1` bug) is being reviewed in parallel
via a multi-model audit — fixes will land in a separate PR against that
skill repo.

Co-authored-by: bot <bot@test>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
RemovePossibleQueryString only stripped query strings (?) but not
URL fragments (#). This caused HybridWebView to fail loading local
files when the URL contained a fragment identifier (e.g. index.html#code=abc).

Now uses IndexOfAny to find the first '?' or '#' delimiter, stripping
everything from that point forward.

Fixes #31472

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

🚀 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 -- 35550

Or

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

@kubaflo kubaflo changed the base branch from main to inflight/current May 20, 2026 18:33
@kubaflo kubaflo closed this May 20, 2026
@kubaflo kubaflo deleted the fix/hybridwebview-fragment-stripping branch May 20, 2026 18:34
@github-actions github-actions Bot added the area-infrastructure CI, Maestro / Coherency, upstream dependencies/versions label May 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-infrastructure CI, Maestro / Coherency, upstream dependencies/versions

Projects

None yet

Development

Successfully merging this pull request may close these issues.

HybridWebViewQueryStringHelper.RemovePossibleQueryString removes '?' but not other special characters e.g. '#'

8 participants