Skip to content

[Extensibility] SingleProject: Register neutral-TFM backends - #36654

Merged
kubaflo merged 15 commits into
net11.0from
kubaflo/35021-backend-activation
Jul 30, 2026
Merged

[Extensibility] SingleProject: Register neutral-TFM backends#36654
kubaflo merged 15 commits into
net11.0from
kubaflo/35021-backend-activation

Conversation

@kubaflo

@kubaflo kubaflo commented Jul 18, 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

This is one focused part of the external-backend extensibility effort. It implements registration identity + compile activation for SingleProject — Phases 1–3 of #35021, scoped to the child issue #36650 (SingleProject: Register and activate external backends for neutral TFMs). It deliberately does not add app-head manifest/entitlement/resource hooks (those are later phases of #35021).

PR #35045 landed the data-driven folder-selection machinery only in inflight/current; this PR ports that machinery to net11.0 and extends it with backend identity and neutral-TFM activation.

It builds directly on the MauiPlatformSpecificFolder registration item (from #35045) rather than introducing a competing registration item, and extends it so an external backend NuGet can identify and activate a backend for both activation paths described in #35021:

  1. Recognized platform TFMTargetPlatformIdentifier(s) resolves (e.g. ios, maccatalyst, android).

  2. Neutral TFM fallback — the inner build is a plain net11.0 and the backend opts in via a selector property (default MauiActiveBackend), e.g. the GTK / Linux backend:

    <TargetFrameworks>net11.0-ios;net11.0</TargetFrameworks>
    <MauiActiveBackend Condition="'$(TargetFramework)' == 'net11.0'">gtk</MauiActiveBackend>
    <PackageReference Include="Platform.Maui.Linux.Gtk4" Version="..." />

What changed

  • Additive MauiPlatformSpecificFolder metadata:
    • BackendIdentity — stable backend key (e.g. gtk). Built-in platforms now declare it too, so they describe themselves through the same registration shape.
    • ActivationProperty — the property that selects this backend on a neutral TFM (defaults to the well-known MauiActiveBackend).
    • ActivationValue — the value that activates this backend (defaults to BackendIdentity).
  • _MauiNormalizePlatformSpecificFolders back-fills the plural TargetPlatformIdentifiers contract, defaults the activation metadata, and resolves the activation property's value (via MSBuild dynamic property dereference), pre-normalizing whitespace/case so the collect condition stays parseable.
  • _MauiCollectPlatformSpecificCompileItems keeps a folder's Platforms/<Backend>/**/*.cs when any of: the recognized TargetPlatformIdentifier(s) match; the resolved activation value matches ActivationValue (neutral-TFM activation); or it is an unconditioned/condition-gated folder. Only the active backend's compile items survive the blanket Platforms/** removal.
  • Exact preservation of existing built-in, shared-folder (e.g. Platforms/Appleios;maccatalyst), singular-metadata backward-compat, and design-time ExcludeFromCurrentConfiguration flow (_MauiUnflipKeptCompileItemMetadata also un-greys neutral-activated backend folders in the IDE).

Tests

Adds focused MSBuild unit tests in Controls.Xaml.UnitTests (they import the real shipping SingleProject targets):

  • recognized TPI + shared folders (ios/maccatalyst/android, whitespace/tab tolerant);
  • neutral net11.0 GTK-style activation (only the activated backend compiles; a recognized built-in folder stays excluded);
  • non-matching backend exclusion (wrong MauiActiveBackend, and unset);
  • recognized platform TFMs ignore a neutral backend selector, preventing GTK files from leaking into Android/iOS builds;
  • custom ActivationProperty/ActivationValue;
  • singular-metadata backward compatibility;
  • trailing-slash sibling-folder safety and non-platform shared-folder participation;
  • genuine item-Condition gating (a MauiPlatformSpecificFolder mapping that carries its own Condition participates only when it evaluates true, and is stripped when false);
  • shared-folder participation on both neutral TFMs and recognized Android TFMs, covering unconditioned and condition-gated mappings;
  • malformed backend metadata whose authored activation value resolves to empty is excluded on neutral and recognized TFMs;
  • design-time metadata contract — _MauiUnflipKeptCompileItemMetadata flips ExcludeFromCurrentConfiguration back to false on a kept shared folder's Compile item (asserted directly via a diagnostic Message target on a non-platform build);
  • built-in active-platform Compile items keep their existing order while shared/custom kept items still receive the active-configuration metadata flip.

Targeted local validation: the complete 37-case MSBuildTests.SingleProject_* matrix was exercised against the actual shipping SingleProject targets — see the validation note below.

Validation note: The MSBuild evaluation/order and include-exclude decisions were additionally validated by running the actual shipping Microsoft.Maui.Controls.SingleProject.Before.targets / .targets through standalone MSBuild evaluation across every scenario above (neutral+backend, neutral+no-backend, custom property on/off, recognized TPI, and built-in preservation), confirming correct compile-item selection and the design-time ExcludeFromCurrentConfiguration=false flip on kept items.

Scope / relationship to #35021

Issues Fixed

Part of #35021
Fixes #36650

Current-head review fix (c2bd01e9df)

  • Branch A now uses normalized activation metadata, so an ActivationValue that normalizes to empty is treated as unset and follows the legacy always-include path instead of silently excluding the folder.
  • The non-platform shared-folder test now covers a whitespace-only activation value; the complete MSBuildTests.SingleProject_* matrix passes 32/32.
  • The current-head Copilot review is clean with zero unresolved threads; replacement CI builds 1530551 / 1530553 / 1530555 are active.

Final fail-closed activation fix (d99d5e6c1d)

  • An authored ActivationValue that normalizes to empty is excluded on both neutral and recognized TFMs instead of being reclassified as a shared always-include folder.
  • Dedicated neutral/iOS regressions prevent backend-only source leakage; the complete MSBuildTests.SingleProject_* matrix passes 34/34.
  • All review threads are resolved and auto-merge remains armed.

Compile-order preservation (7ab5012a5f)

  • _MauiUnflipKeptCompileItemMetadata skips built-in platform items that are already active, avoiding an unnecessary remove/re-add while continuing to flip kept shared/custom folders to ExcludeFromCurrentConfiguration=false.
  • Current-head main CI executed both regressions successfully: SingleProject_UnflipKeptCompileItemMetadata_PreservesAlreadyActiveCompileItemOrder and SingleProject_UnflipKeptCompileItemMetadata_SetsExcludeFromCurrentConfigurationFalseForKeptSharedFolder.
  • The current-head improved review is clean with zero unresolved threads.

Unresolved activation fail-closed fix (83ab69d62ec)

  • The legacy always-include branch now requires all backend identity/activation metadata to be absent, so an authored ActivationProperty with an ActivationValue that expands to empty cannot leak backend source into every TFM.
  • The neutral/iOS regression failed 2/2 before the fix and passes afterward; the complete SingleProject matrix passes 37/37.
  • All review threads are resolved; current-head improved review and full CI are active.

Bare activation-value compatibility boundary (dc4b4015966)

  • Documents that a bare ActivationValue="$(UnsetProperty)" expands to empty during MSBuild project evaluation and is indistinguishable from an intentional legacy shared-folder mapping by normalization time. Conditional backends must also declare ActivationProperty or BackendIdentity so malformed metadata remains visible and fails closed.
  • Adds neutral-TFM and iOS regression coverage for that compatibility boundary (2/2 pass). The primary metadata-bearing fail-closed behavior remains unchanged.
  • Exact current-head improved review 14820391 and CI builds 1533543 / 1533545 / 1533547 are active; prior-head reviews were canceled after the documentation-only follow-ups. Auto-merge remains armed with the merge-commit method.

Extends the SingleProject MauiPlatformSpecificFolder registration contract so
an external backend NuGet can identify and activate a backend for both
recognized platform TFMs and a neutral TFM, keying compile selection off one
resolved backend identity.

Registration identity + compile activation only (Phase 1/2/3 scope of #35021).
App-head manifest/resource hooks are intentionally out of scope for this PR.

Changes:
- MauiPlatformSpecificFolder gains additive metadata: BackendIdentity (stable
  backend key), ActivationProperty (neutral-TFM selector property name, defaults
  to the well-known MauiActiveBackend), and ActivationValue (defaults to
  BackendIdentity). Built-in platforms now also declare BackendIdentity so they
  describe themselves through the same registration shape.
- _MauiNormalizePlatformSpecificFolders back-fills the plural
  TargetPlatformIdentifiers contract and resolves the activation property value
  (MSBuild dynamic property dereference), pre-normalizing whitespace/case so the
  collect condition stays parseable.
- _MauiCollectPlatformSpecificCompileItems keeps a folder when its recognized
  TargetPlatformIdentifier(s) match, OR when its ActivationProperty value matches
  ActivationValue (neutral-TFM backend activation, e.g. net11.0 + GTK), OR when it
  is an unconditioned/condition-gated folder. Only the active backend's
  Platforms/<Backend> files compile.
- Existing built-in, shared-folder (e.g. Platforms/Apple for ios;maccatalyst),
  singular-metadata backward-compat, and design-time ExcludeFromCurrentConfiguration
  flow are preserved exactly.
- Adds focused MSBuild unit tests: recognized TPI + shared folders, neutral
  net11.0 GTK-style activation, non-matching backend exclusion, custom activation
  property/value, singular-metadata backward compatibility, trailing-slash sibling
  safety, and non-platform/condition-gated participation.

Part of #35021
Part of #36650

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 66f84348-6476-4097-8b7f-f240338e85c3
Copilot AI review requested due to automatic review settings July 18, 2026 14:54
@kubaflo
kubaflo temporarily deployed to copilot-pat-pool July 18, 2026 14:54 — with GitHub Actions Inactive
@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 -- 36654

Or

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

@kubaflo
kubaflo temporarily deployed to copilot-pat-pool July 18, 2026 14:54 — with GitHub Actions Inactive
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).
There may be pipelines that require an authorized user to comment /azp run to run.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Implements SingleProject compile-item activation for external backends when the inner build uses a neutral TFM (e.g., net11.0), by extending the existing MauiPlatformSpecificFolder contract with backend identity + activation metadata and updating compile filtering accordingly (part of #35021 / #36650).

Changes:

  • Extend MauiPlatformSpecificFolder normalization to back-fill TargetPlatformIdentifiers, default activation metadata, and resolve activation-property values for neutral-TFM selection.
  • Add a new allow-list collection step so only the active platform/backend’s Platforms/<Backend>/** compile items survive the blanket Platforms/** removal, and un-grey kept items in the IDE.
  • Add MSBuild unit tests covering shared folder mappings, trailing-slash safety, non-platform builds, singular-metadata compatibility, and neutral-TFM activation (including custom activation property/value).

Reviewed changes

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

File Description
src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs Adds focused MSBuild tests that validate recognized-TPI matching and neutral-TFM backend activation via MauiPlatformSpecificFolder metadata.
src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.targets Introduces compile allow-list collection + IDE metadata unflip, and updates platform compile-item removal to preserve explicitly kept items.
src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.Before.targets Normalizes MauiPlatformSpecificFolder metadata (plural TPI backfill, activation defaults, dynamic activation-property resolution, normalized compare values).

@kubaflo

This comment has been minimized.

@kubaflo
kubaflo temporarily deployed to copilot-pat-pool July 18, 2026 14:57 — with GitHub Actions Inactive
@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jul 18, 2026
@kubaflo
kubaflo temporarily deployed to copilot-pat-pool July 18, 2026 14:58 — with GitHub Actions Inactive
@github-actions github-actions Bot added the area-tooling XAML & C# Hot Reload, XAML Editor, Live Visual Tree, Live Preview, Debugging label Jul 18, 2026
@kubaflo
kubaflo temporarily deployed to copilot-pat-pool July 18, 2026 14:58 — with GitHub Actions Inactive
@MauiBot MauiBot added s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels Jul 18, 2026
@kubaflo
kubaflo requested a review from Redth July 18, 2026 17:26
MauiBot

This comment was marked as outdated.

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Expert Review — 1 findings

See inline comments for details.

Prevent MauiActiveBackend from adding neutral backend files to recognized Android, iOS, and other platform inner builds, with focused regression coverage.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 66f84348-6476-4097-8b7f-f240338e85c3
Copilot AI review requested due to automatic review settings July 18, 2026 17:51
@kubaflo

This comment has been minimized.

@kubaflo

kubaflo commented Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

/azp run

@azure-pipelines

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:783

  • The dashed "---" banner comment is a section-separator style that the repo guidelines discourage (it’s effectively a fake region header). Consider replacing it with a simple single-line comment so the file stays consistent and avoids noise.
		// --- SingleProject platform-folder registration & activation ---------------
		//

Keep the SingleProject activation test overview as a normal explanatory comment per repository conventions.

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

Copilot-Session: 66f84348-6476-4097-8b7f-f240338e85c3
@kubaflo

kubaflo commented Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the current-head repository-style note in e354686b4ec by replacing the dashed fake-region banner with the existing plain explanatory comment. No test or production behavior changed.

@kubaflo

This comment has been minimized.

@kubaflo

kubaflo commented Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

/azp run

@azure-pipelines

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

@kubaflo

This comment has been minimized.

1 similar comment
@kubaflo

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.targets:164

  • The comment about cross-item-type batching is misleading: the blanket <Compile Update> sets ExcludeFromCurrentConfiguration=true, but the per-TPI updates at the top of this file then flip the active platform’s items back to false, so batching is typically two iterations (true/false), not a single iteration. This matters because it’s the reason the Condition must remain in place and how it behaves when active items are already false.
        the blanket <Compile Update> at the top of this file always marks
        every $(PlatformsProjectFolder)/** file as ExcludeFromCurrentConfiguration=true,
        so this batches into a single iteration; do NOT "simplify" away the
        Condition without first re-verifying that contract still holds, or

Describe the true and false ExcludeFromCurrentConfiguration batches accurately so the removal guard is not simplified incorrectly.

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

Copilot-Session: 66f84348-6476-4097-8b7f-f240338e85c3
@kubaflo

kubaflo commented Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the current-head low-confidence batching-comment issue in c73b7025c18. The comment now accurately explains the true/false ExcludeFromCurrentConfiguration batches and why removal must stay guarded. No behavior changed.

@kubaflo

This comment has been minimized.

@kubaflo

kubaflo commented Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

/azp run

@azure-pipelines

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

@kubaflo

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated no new comments.

@kubaflo

This comment has been minimized.

@PureWeen PureWeen left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Round-6 adversarial re-review — 3 independent reviewers with adversarial consensus

Re-fetched the PR at HEAD c73b7025 and reviewed the three new commits (dc4b4015 "Document bare backend activation values", e354686b "Remove fake region from activation tests", c73b7025 "Clarify SingleProject removal batching") from scratch. Each reviewer diffed executable-vs-comment content at the byte level and re-ran the full over-exclusion matrix with real dotnet msbuild builds. Multi-round self-correction applied: dc4b4015 was written in response to my round-5 ⚠️, so findings against its lines were run through the dispute round.

Primary question — does dc4b4015 FIX the round-5 bare-AV ⚠️, or only DOCUMENT it?

DOCUMENTED-NOT-FIXED (by design), and honestly so. 3/3 reviewers confirmed the Branch A condition expression is byte-identical between 83ab69d6 and c73b7025 — the executable allow-list logic did not change. A bare ActivationValue="$(UnsetProperty)" with no ActivationProperty/BackendIdentity still resolves to all-four-empty metadata (indistinguishable from a legacy shared folder) and still compiles everywhere — reproduced on neutral and -p:TargetPlatformIdentifier=ios. What the commit changes is the framing: it documents the limitation in the Branch A comment, states the contract ("conditional backends must also declare ActivationProperty or BackendIdentity"), and — via the new test — codifies the bare form as intended legacy-shared-folder behavior.

The new test SingleProject_BareUnresolvedActivationValueUsesLegacySharedFolderBehavior ([InlineData("")], [InlineData("ios")]) asserts the bare-AV folder DOES compile. All 3 reviewers verified it passes on HEAD and is a real gate in its own direction — tightening Branch A to exclude the bare form in a scratch copy turns the test RED. So it's a genuine compatibility lock, not a vacuous test.

⚠️ The residual is documented, not closed — and a behavioral fix is feasible (correcting the record)

The bare-AV form still fails open silently. This is a reproduced, documented, test-locked compatibility behavior — not a defect introduced by these commits, and not a merge blocker. But one point deserves correction, because it affects how the tradeoff should be described:

Two of three reviewers argued a behavioral fix is impossible in pure MSBuild (absent attribute and authored-but-resolves-empty both read as ""). I verified this claim independently and it is too strong — a behavioral distinction is achievable with an ItemDefinitionGroup default acting as a sentinel:

ItemDefinitionGroup ActivationValue = __ABSENT__  ⇒
  absent attribute        → %(ActivationValue) = __ABSENT__   (inherits default)
  ActivationValue="$(unset)" → %(ActivationValue) = ""         (authored value overrides default)
  ActivationValue="gtk"      → %(ActivationValue) = gtk

The default is applied only when the attribute is absent, so an authored-but-empty value is distinguishable and Branch A could fail closed on it. The cost is real, though: __ABSENT__ becomes observable public metadata on every folder that doesn't author ActivationValue (including the built-ins and legacy shared folders), so it would have to be threaded through the normalization / back-fill / Branch A+B conditions — non-trivial complexity and regression surface for an edge case the contract already declares unsupported.

Net: documenting + contract + a compatibility-locking test is a defensible engineering choice for round 6, but it is not the only possible answer. If the team later decides a stray ActivationValue="$(Foo)" (the most minimal authoring slip) warrants protection, the sentinel path is available.

c73b7025 "Clarify SingleProject removal batching" — comment-only

3/3 confirmed: the _MauiPlatformCompileToRemove Condition, Include glob, and Exclude are byte-identical to 83ab69d6. Only the explanatory comment changed (and it's now more accurate — it correctly describes the true-batch + active-platform-flipped-false-batch under a real global TPI). No behavioral change. The full empirical matrix re-passes on HEAD:

  • ⭐ No-attribute legacy shared folder still compiles everywhere (neutral + all 5 recognized TFMs) — the top legacy-breakage risk, clean.
  • ✅ Legit gtk activates in both forms (ActivationValue="gtk" and bare BackendIdentity="gtk") with MauiActiveBackend=gtk on neutral; does not leak into recognized TFMs.
  • ✅ Each built-in (ios/android/maccatalyst/windows/tizen) selects only its own folder.
  • ✅ Whitespace-only and unresolved-with-metadata ActivationValue compile nowhere on neutral AND ios (fail closed).
  • 7ab5012a Compile item order (Before|Active|After) intact, no duplicate Compile items, design-time ExcludeFromCurrentConfiguration=false unflip fires on kept folders.

e354686b "Remove fake region from activation tests" — scaffolding-only

3/3 confirmed the two removed lines are a decorative // --- … --- banner + blank comment. No assertion, test method, or [InlineData] was removed or weakened.

💡 Suggestion

The PR description/changelog should state the bare-AV behavior explicitly as "documented as intentional legacy-compat behavior, not closed" rather than implying the round-5 finding was fixed — so downstream readers understand a stray ActivationValue="$(unset)" compiles everywhere by design.

Bottom line

No ❌ blocking issues. The three new commits are comment / test / scaffolding only; the executable targets are byte-identical to the round-5-certified 83ab69d6, and the full fail-closed + over-exclusion + ordering matrix re-passes cleanly. The round-5 ⚠️ is handled honestly — documented in code, locked by a real regression test, with the contract spelled out — rather than silently marked resolved. The one carried ⚠️ (bare-AV fails open by design; a sentinel-based fix is feasible-but-costly) is non-blocking. Merge-ready on code merit. CI status is out of scope (net11.0 base is red for unrelated reasons).

Review methodology: 3 independent reviewers with adversarial consensus. This is a COMMENT-only review — approval is a human decision.

@kubaflo

kubaflo commented Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

Current-head validation evidence: improved review 14820391 did not review code because setup never wrote its completion sentinel; the review-result step explicitly classifies this as setup/infrastructure, not a Copilot finding. Independent round-6 adversarial review on exact HEAD c73b7025 found no merge-blocking issue. UI 1533545 failed Build Sample App (Windows) because DotNet.csproj could not delete stale SDK manifest WorkloadManifest.json while another process held it (MSB3231); this is unrelated to SingleProject metadata/comments. I am allowing remaining UI jobs to finish before a UI-only rerun.

@PureWeen PureWeen left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Adversarial code review — no issues found

No correctness, regression, security, data-loss, ordering, shared-config, or test-adequacy issues survived review.

What looks right: the activation/removal pipeline preserves legacy shared folders and built-in platform selection while adding neutral-TFM backend activation; malformed metadata fails closed when backend intent is present, and the documented bare-value compatibility boundary is locked by a direction-sensitive regression test.

Test coverage: 3/3 reviewers independently exercised the exact PR-HEAD shipping targets with real MSBuild probes across neutral/shared folders, both GTK activation forms, all five built-ins, whitespace and unresolved activation cases, compile ordering, duplicate registration, wrapper import timing, and design-time metadata unflip. The added 37-case matrix imports the real shipping targets and includes discriminating positive, negative, adjacent, ordering, and metadata assertions.

Prior review status: current-head findings and author responses were reconciled; no previously reported blocking issue remains unresolved, and this fresh pass found no contradictory evidence.

Verdict: clean on code merit. No inline findings.

Methodology: 3 independent reviewers with adversarial consensus.

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

AI Review Summary

ℹ️ The review agent did not produce a full summary on this run (an infrastructure issue on the CI agent), but the deep UI tests completed — their results are below. Re-comment /review for a fresh full review.

Deep UI tests — 359 passed, 0 failed across 3 categories on platform-pool agent (replaces in-process counts above).

🧪 UI Test Execution Results (deep, platform pool)

Category Tests Snapshot diffs
Button 71/73 ✓ 1 diff PNG
Label 96/98 ✓
Layout 192/195 ✓
📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)

@MauiBot

MauiBot commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

AI Review Summary

@kubaflo — new AI review results are available based on this last commit: c73b702.

Gate Passed Confidence Low Platform Android


🗂️ Review Sessions — click to expand
🚦 Gate — Test Before & After Fix

Gate Result: ✅ PASSED

Platform: ANDROID · Base: net11.0 · Merge base: 4ba564df

Test Without Fix (expect FAIL) With Fix (expect PASS)
📄 MSBuildTests MSBuildTests ✅ FAIL — 314s ✅ PASS — 214s
🔴 Without fix — 📄 MSBuildTests: FAIL ✅ · 314s

Error-relevant lines (filtered from the build log):

   at System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(Object obj, IntPtr* args)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.Maui.Controls.MSBuild.UnitTests.MSBuildTests.SingleProject_SharedPlatformFolderMappingsAreRespected(String targetPlatformIdentifier, String targetPlatformIdentifiers, Boolean shouldIncludeAppleSharedFile) in /_/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:line 848
   at System.RuntimeMethodHandle.InvokeMethod(ObjectHandleOnStack target, Void** arguments, ObjectHandleOnStack sig, BOOL isConstructor, ObjectHandleOnStack result)
   at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr)
   at InvokeStub_MSBuildTests.SingleProject_SharedPlatformFolderMappingsAreRespected(Object, Span`1)
   at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.Maui.Controls.MSBuild.UnitTests.MSBuildTests.SingleProject_PlatformFolderWithoutTrailingSlashDoesNotMatchSiblingFolders(String includePath, String targetPlatformIdentifier) in /_/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:line 914
   at InvokeStub_MSBuildTests.SingleProject_PlatformFolderWithoutTrailingSlashDoesNotMatchSiblingFolders(Object, Span`1)
   at Microsoft.Maui.Controls.MSBuild.UnitTests.MSBuildTests.SingleProject_CustomActivationPropertyAndValueActivateBackend(String switchValue, Boolean shouldIncludeFooFile) in /_/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:line 1695
   at Microsoft.Maui.Controls.MSBuild.UnitTests.MSBuildTests.SingleProject_ConditionGatedFolderParticipatesOnlyWhenConditionIsTrue(String conditionValue, String targetPlatformIdentifier, Boolean shouldIncludeConditionalFile) in /_/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:line 1231
   at InvokeStub_MSBuildTests.SingleProject_ConditionGatedFolderParticipatesOnlyWhenConditionIsTrue(Object, Span`1)
   at Microsoft.Maui.Controls.MSBuild.UnitTests.MSBuildTests.SingleProject_UnflipKeptCompileItemMetadata_PreservesAlreadyActiveCompileItemOrder() in /_/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:line 1405
   at Microsoft.Maui.Controls.MSBuild.UnitTests.MSBuildTests.SingleProject_SingularPlatformFolderMetadataRemainsBackwardCompatible(String targetPlatformIdentifier, Boolean shouldIncludeLegacyFile) in /_/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:line 1463
   at InvokeStub_MSBuildTests.SingleProject_SingularPlatformFolderMetadataRemainsBackwardCompatible(Object, Span`1)
   at Microsoft.Maui.Controls.MSBuild.UnitTests.MSBuildTests.SingleProject_NeutralTfmActivatesBackendByIdentity() in /_/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:line 1528
   at Microsoft.Maui.Controls.MSBuild.UnitTests.MSBuildTests.SingleProject_BareUnresolvedActivationValueUsesLegacySharedFolderBehavior(String targetPlatformIdentifier) in /_/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:line 1039
   at InvokeStub_MSBuildTests.SingleProject_BareUnresolvedActivationValueUsesLegacySharedFolderBehavior(Object, Span`1)
   at System.Reflection.MethodBaseInvoker.InvokeWithOneArg(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.Maui.Controls.MSBuild.UnitTests.MSBuildTests.SingleProject_NonPlatformBuildExcludesPlatformSpecificFoldersButKeepsSharedFolder() in /_/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:line 983
   at Microsoft.Maui.Controls.MSBuild.UnitTests.MSBuildTests.SingleProject_RecognizedTfmIgnoresNeutralBackendSelector() in /_/src/Controls/tests/Xaml.UnitTests/MSBuild/MSBuildTests.cs:line 1586
🟢 With fix — 📄 MSBuildTests: PASS ✅ · 214s

(no coded error found; showing last 1200 chars)

oid", shouldIncludeLegacyFile: False) [3 s]
  Passed SingleProject_SingularPlatformFolderMetadataRemainsBackwardCompatible(targetPlatformIdentifier: "ios", shouldIncludeLegacyFile: True) [2 s]
  Passed SingleProject_CodesignEntitlementsRespected [4 s]
  Passed SingleProject_DefaultEntitlementsUsedWhenNoCustomSet [2 s]
  Passed SingleProject_NeutralTfmActivatesBackendByIdentity [3 s]
  Passed DesignTimeBuild [7 s]
  Passed SingleProject_BareUnresolvedActivationValueUsesLegacySharedFolderBehavior(targetPlatformIdentifier: "ios") [3 s]
  Passed SingleProject_BareUnresolvedActivationValueUsesLegacySharedFolderBehavior(targetPlatformIdentifier: "") [5 s]
  Passed SingleProject_NonPlatformBuildExcludesPlatformSpecificFoldersButKeepsSharedFolder [3 s]
  Passed RandomEmbeddedResource [4 s]
  Passed SingleProject_RecognizedTfmIgnoresNeutralBackendSelector [3 s]
  Passed TargetsShouldSkip [7 s]
[xUnit.net 00:03:02.13]     TouchXamlFile [SKIP]
[xUnit.net 00:03:02.13]       source gen changes
[xUnit.net 00:03:02.14]   Finished:    Microsoft.Maui.Controls.Xaml.UnitTests
  Skipped TouchXamlFile [1 ms]
Test Run Successful.
Total tests: 57
     Passed: 55
    Skipped: 2
 Total time: 3.0502 Minutes
📁 Fix files reverted (2 files)
  • src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.Before.targets
  • src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.targets

📱 UI Tests — Button,Label,Layout

Detected UI test categories: Button,Label,Layout

Deep UI tests — 359 passed, 0 failed across 3 categories on platform-pool agent (replaces in-process counts above).

🧪 UI Test Execution Results (deep, platform pool)

Category Tests Snapshot diffs
Button 71/73 ✓ 1 diff PNG
Label 96/98 ✓
Layout 192/195 ✓
📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)

📋 Pre-Flight — Context & Validation

Issue: #36650 - SingleProject: Register and activate external backends for neutral TFMs
PR: #36654 - [Extensibility] SingleProject: Register neutral-TFM backends
Platforms Affected: android (requested test platform); build/MSBuild SingleProject infrastructure broadly affects all MAUI SingleProject builds
Files Changed: 2 implementation, 1 test

Key Findings

  • PR [Extensibility] SingleProject: Register neutral-TFM backends #36654 adds MauiPlatformSpecificFolder backend identity and neutral-TFM activation metadata so external backends can register platform folders and be selected on neutral TFMs such as net11.0.
  • The linked issue SingleProject: Register and activate external backends for neutral TFMs #36650 requires reuse of MauiPlatformSpecificFolder, exactly one active neutral backend, recognized platform TFI behavior preservation, and focused MSBuild tests.
  • Gate was already completed before this run and passed; this pre-flight did not re-run or overwrite gate output.
  • Prior review discussion includes several earlier activation-leak and metadata-coverage concerns that the current PR mostly addresses.
  • Independent code review found a remaining correctness risk in _MauiUnflipKeptCompileItemMetadata: kept shared/custom compile items that require unflipping are removed and re-added, which can move them to the end of @(Compile).

Code Review Summary

Verdict: NEEDS_CHANGES
Confidence: low
Errors: 1 | Warnings: 0 | Suggestions: 0

Key code review findings:

  • src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.targets:135_MauiUnflipKeptCompileItemMetadata reorders kept shared/custom compile items by removing and re-including them; a reproduced Before.cs, Platforms/Shared/Shared.cs, After.cs order became Before|After|Shared instead of Before|Shared|After.

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #36654 Extends MauiPlatformSpecificFolder metadata (BackendIdentity, ActivationProperty, ActivationValue), normalizes activation metadata, keeps recognized-TPI or neutral-activated compile items, and unflips kept design-time compile metadata after platform removal. ✅ PASSED (Gate) Microsoft.Maui.Controls.SingleProject.Before.targets, Microsoft.Maui.Controls.SingleProject.targets, MSBuildTests.cs Original PR; gate output already exists under gate/ and was not modified.

🔬 Code Review — Deep Analysis

Code Review — PR #36654

Independent Assessment

What this changes: Adds MauiPlatformSpecificFolder backend identity/activation metadata so SingleProject can keep external backend source folders for neutral TFMs, plus MSBuild tests for activation/exclusion cases.
Inferred motivation: Enable external backends such as GTK/Linux to participate in net11.0 inner builds without leaking sources into built-in platform TFMs.

Reconciliation with PR Narrative

Author claims: Implements Phases 1–3 of #35021/#36650: registration identity, neutral-TFM compile activation, fail-closed malformed metadata handling, design-time metadata fixes, and tests.
Agreement/disagreement: The activation/exclusion logic broadly matches the claim, but the design-time unflip target introduces a compile item ordering regression for kept shared/custom backend files.

Prior Review Reconciliation

Prior ❌ Error Finding Source Status Evidence
Neutral backend selector could leak GTK files into recognized Android/iOS builds MauiBot inline major ✅ Fixed Current _MauiCollectPlatformSpecificCompileItems activation branch requires $(TargetPlatformIdentifier) == '', and SingleProject_RecognizedTfmIgnoresNeutralBackendSelector covers this.
Condition-gated/shared folder tests did not cover claimed cases MauiBot moderate ✅ Fixed Current tests include condition-gated folder coverage across neutral/recognized builds.
Design-time ExcludeFromCurrentConfiguration metadata was not asserted MauiBot moderate ✅ Fixed SingleProject_UnflipKeptCompileItemMetadata_SetsExcludeFromCurrentConfigurationFalseForKeptSharedFolder asserts emitted metadata.
Shared-folder branch not covered on recognized TPI MauiBot moderate ✅ Fixed Condition/shared-folder tests now exercise recognized platform identifiers.

Blast Radius Assessment

  • Runs for all instances: Yes — this is shared SingleProject MSBuild infrastructure for all SingleProject builds.
  • Startup impact: No runtime startup impact, but build/design-time evaluation impact is broad.
  • Static/shared state: No runtime static state; MSBuild item state is globally affected within the project build.

CI Status

  • Required-check result: gh pr checks --required could not run because gh is unauthenticated. Public check-run API shows current commit overall pending, with many checks in progress and at least one completed failure (Build UITests Windows Sample App Build Sample App (Windows)).
  • Classification: undetermined / pending.
  • Action taken: Invoked azdo-build-investigator; its required ci-analysis skill was unavailable in this environment. Confidence capped low.

External Output Contract

Consumer token/pattern Producer location Producer emission condition Consumer assumption Ordinary negative case Downstream effect
N/A N/A No changed external-tool output classifier found; regex use normalizes authored MSBuild metadata, not external output. N/A N/A N/A

Findings

❌ Error — _MauiUnflipKeptCompileItemMetadata reorders kept shared/custom compile items

src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.SingleProject.targets:135

The unflip target removes kept Compile items and re-adds them with ExcludeFromCurrentConfiguration=false. That appends any kept item that actually needed unflipping to the end of @(Compile). The current order-preservation test only covers an already-active Windows item with metadata already false, so it does not cover the shared/custom backend path this target primarily changes.

I reproduced a minimal case:

Before.cs, Platforms/Shared/Shared.cs, After.cs with <MauiPlatformSpecificFolder Include="Platforms\Shared\" /> becomes:

ORDER: Before|After|Shared

Expected preservation is Before|Shared|After. This can affect order-sensitive generators or metadata production for shared/custom backend files. The target should preserve item position while changing metadata, and add a regression test for an actually unflipped kept item.

Failure-Mode Probing

  • Neutral backend selected on net11.0: activation branch only runs when TargetPlatformIdentifier is empty; selected backend files are kept.
  • Recognized TFI plus MauiActiveBackend=gtk: activation branch is guarded off, so GTK files do not leak into Android/iOS.
  • Whitespace-only activation value: original metadata prevents legacy branch; normalized value is empty, so it fails closed.
  • Bare unresolved ActivationValue: documented as compatibility boundary; indistinguishable from legacy shared mapping at target time.
  • Kept shared/custom file requiring unflip: remove/re-add changes compile order, confirmed by reproduction.

Verdict: NEEDS_CHANGES

Confidence: low
Summary: The core activation logic appears substantially improved, but the unflip target introduces a concrete compile item ordering regression for kept shared/custom folders. CI is also pending/undetermined, so this should not be treated as ready.


🛠️ Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 expert/code-review loop Add a compiled MSBuild task that projects the full @(Compile) list in order and flips only kept items. ❌ FAIL 3 files Failed with MSB4062 because the task assembly was not available from the source buildTransitive import path used by the MSBuild tests.
2 expert/code-review loop Pure-MSBuild ordered projection of the full @(Compile) list; flip only exact kept-item matches. ✅ PASS 2 files Passed focused unflip tests (3/3) and full MSBuildTests.SingleProject_* regression matrix (40/40). Addresses the code-review ordering finding without a compiled task.
PR PR #36654 Current remove/re-add unflip plus backend identity/activation metadata normalization. ✅ PASSED (Gate) 3 files Original PR. Gate was already completed before this run and was not re-run or overwritten. Code review found an additional compile-order risk for kept shared/custom items.

Cross-Pollination

Model Round New Ideas? Details
gpt-5.5 / maui-expert-reviewer 1 Yes Proposed compiled task ordered projection (try-fix-1).
gpt-5.5 / maui-expert-reviewer 2 Yes After MSB4062 failure, proposed pure-MSBuild ordered projection (try-fix-2).

Exhausted: No — stopped because candidate #2 passed the focused and regression tests and is demonstrably better than the PR's current unflip implementation for the reviewed ordering issue.
Selected Fix: Candidate #2 — preserves @(Compile) order for kept shared/custom items that need unflipping, avoids a compiled task dependency, preserves unrelated metadata, and passed the relevant SingleProject matrix.


📝 Recommended PR Title & Description

Assessment: ✏️ Recommend updating — the current metadata is strong, but the winning fix adds an order-preserving _MauiUnflipKeptCompileItemMetadata change and regression test that the current description does not mention.

Recommended title

[Extensibility] SingleProject: Register neutral-TFM backends

Recommended description

## Description of Change

This is **one focused part** of the external-backend extensibility effort. It implements **registration identity + compile activation** for SingleProject — Phases 1–3 of #35021, scoped to the child issue #36650 (*SingleProject: Register and activate external backends for neutral TFMs*). It deliberately does **not** add app-head manifest/entitlement/resource hooks (those are later phases of #35021).

PR #35045 landed the data-driven folder-selection machinery only in `inflight/current`; this PR ports that machinery to `net11.0` and extends it with backend identity and neutral-TFM activation.

It builds directly on the `MauiPlatformSpecificFolder` registration item (from #35045) rather than introducing a competing registration item, and extends it so an external backend NuGet can identify and activate a backend for **both** activation paths described in #35021:

1. **Recognized platform TFM** — `TargetPlatformIdentifier(s)` resolves (e.g. `ios`, `maccatalyst`, `android`).
2. **Neutral TFM fallback** — the inner build is a plain `net11.0` and the backend opts in via a selector property (default `MauiActiveBackend`), e.g. the GTK / Linux backend:

   ```xml
   <TargetFrameworks>net11.0-ios;net11.0</TargetFrameworks>
   <MauiActiveBackend Condition="'$(TargetFramework)' == 'net11.0'">gtk</MauiActiveBackend>
   <PackageReference Include="Platform.Maui.Linux.Gtk4" Version="..." />

What changed

  • Additive MauiPlatformSpecificFolder metadata:
    • BackendIdentity — stable backend key (e.g. gtk). Built-in platforms now declare it too, so they describe themselves through the same registration shape.
    • ActivationProperty — the property that selects this backend on a neutral TFM (defaults to the well-known MauiActiveBackend).
    • ActivationValue — the value that activates this backend (defaults to BackendIdentity for non-TPI backend registrations).
  • _MauiNormalizePlatformSpecificFolders back-fills the plural TargetPlatformIdentifiers contract, defaults the activation metadata, and resolves the activation property's value (via MSBuild dynamic property dereference), pre-normalizing whitespace/case so the collect condition stays parseable.
  • _MauiCollectPlatformSpecificCompileItems keeps a folder's Platforms/<Backend>/**/*.cs when any of: the recognized TargetPlatformIdentifier(s) match; the resolved activation value matches ActivationValue (neutral-TFM activation); or it is an unconditioned/condition-gated folder. Only the active backend's compile items survive the blanket Platforms/** removal.
  • _MauiUnflipKeptCompileItemMetadata un-greys neutral-activated/shared backend folders in design-time builds while preserving the original @(Compile) order. It updates only exact kept-item matches and avoids the remove/re-add ordering regression for shared/custom backend files.
  • Exact preservation of existing built-in, shared-folder (e.g. Platforms/Appleios;maccatalyst), singular-metadata backward-compat, design-time ExcludeFromCurrentConfiguration flow, trailing-slash sibling safety, and condition-gated folder behavior.

Tests

Adds focused MSBuild unit tests in Controls.Xaml.UnitTests (they import the real shipping SingleProject targets):

  • recognized TPI + shared folders (ios/maccatalyst/android, whitespace/tab tolerant);
  • neutral net11.0 GTK-style activation (only the activated backend compiles; a recognized built-in folder stays excluded);
  • non-matching backend exclusion (wrong MauiActiveBackend, and unset);
  • recognized platform TFMs ignore a neutral backend selector, preventing GTK files from leaking into Android/iOS builds;
  • custom ActivationProperty/ActivationValue;
  • singular-metadata backward compatibility;
  • trailing-slash sibling-folder safety and non-platform shared-folder participation;
  • genuine item-Condition gating;
  • design-time ExcludeFromCurrentConfiguration=false restoration for kept shared/backend files;
  • preservation of @(Compile) order and unrelated metadata when kept shared/custom backend items are unflipped.

Issues Fixed

Fixes #36650
Part of #35021
Builds on #35045



</details>

---

<details>
<summary><strong>🏁 Report — Final Recommendation</strong></summary>
<br/>

## Comparative report — PR #36654

### Candidates

| Rank | Candidate | Regression tests | Assessment |
|---:|---|---|---|
| 1 | `pr-plus-reviewer` | ✅ Passed by equivalence to `try-fix-2` (`SingleProject_UnflipKeptCompileItemMetadata` 3/3 and `MSBuildTests.SingleProject_` 40/40); sandbox patch applied cleanly and `git diff --check` passed | Best candidate. Keeps the PR's backend identity/neutral-TFM activation design and applies the expert review fix so `_MauiUnflipKeptCompileItemMetadata` no longer reorders kept shared/custom backend compile items. |
| 2 | `try-fix-2` | ✅ Passed focused unflip tests 3/3 and full SingleProject matrix 40/40 | Technically equivalent to `pr-plus-reviewer` for the actionable reviewer fix. Ranked below `pr-plus-reviewer` only because the requested Phase 1 candidate is the PR fix plus expert feedback, while this is the same patch represented as an independent try-fix candidate. |
| 3 | `pr` | ✅ Gate passed, but expert review found a missed regression | The core backend activation behavior is sound and gate passed, but the current remove/re-add unflip implementation can perturb `@(Compile)` order for kept shared/custom backend items. This must rank below passing candidates that fix that regression. |
| 4 | `try-fix-1` | ❌ Failed | The compiled-task approach could preserve order conceptually, but failed with MSB4062 because the task assembly is not available from the source `buildTransitive` import path used by the MSBuild tests. Per the ranking rule, failed candidates rank below passing candidates. |

### Winning candidate

**Winner:** `pr-plus-reviewer`

`pr-plus-reviewer` preserves the PR's intended SingleProject external-backend extensibility model and incorporates the expert review's actionable ordering fix without introducing a compiled task dependency. It is effectively the already-passing `try-fix-2` patch applied as reviewer feedback to the PR, so it avoids the raw PR's compile-order regression while retaining the evidence from the full SingleProject test matrix.

### Recommendation

Proceed with the PR only after applying the `pr-plus-reviewer` ordered-projection change and the new shared-folder order regression test. The raw PR should not be taken as-is because it leaves a concrete build item ordering regression in `_MauiUnflipKeptCompileItemMetadata`.


</details>

</details>
<!-- SESSION:c73b702 END -->

---

<details>
<summary><strong>🧭 Next Steps</strong> — review latest findings</summary>
<br/>

No alternative fix was selected for this run. Review the session findings and CI results before merging.

</details>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-tooling XAML & C# Hot Reload, XAML Editor, Live Visual Tree, Live Preview, Debugging p/0 Current heighest priority issues that we are targeting for a release. s/agent-changes-requested AI agent recommends changes - found a better alternative or issues s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-gate-passed AI verified tests catch the bug (fail without fix, pass with fix) s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants