Skip to content

Fix iOS Shell badge color bleed - #36026

Merged
jfversluis merged 1 commit into
net11.0from
jfversluis-fix-ios-shell-badge-colors
Jun 22, 2026
Merged

Fix iOS Shell badge color bleed#36026
jfversluis merged 1 commit into
net11.0from
jfversluis-fix-ios-shell-badge-colors

Conversation

@jfversluis

Copy link
Copy Markdown
Member

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

Fixes #35948 by avoiding per-item UITabBarAppearance badge color updates for iOS/MacCatalyst Shell tab badges. UIKit can render badge appearance state from the selected tab across other visible tabs, causing badge colors to bleed between Shell tabs. Badge colors now stay on the native UITabBarItem path, and badge text attributes are applied for normal, selected, disabled, and focused states.

Testing

  • dotnet build src/Controls/tests/DeviceTests/Controls.DeviceTests.csproj -c Release -f net11.0-ios -r iossimulator-arm64 /p:TreatWarningsAsErrors=false /p:CodesignRequireProvisioningProfile=false /p:ValidateXcodeVersion=false
  • dotnet xharness apple test --app artifacts/bin/Controls.DeviceTests/Release/net11.0-ios/iossimulator-arm64/Microsoft.Maui.Controls.DeviceTests.app --target ios-simulator-64_26.4 --device ABC02C6A-A076-4C9F-B651-610FDA4BA06A -o artifacts/log/shell-ios-net11-final4 --timeout 01:00:00 -v --set-env=TestFilter=Category=Shell — 209 passed, 0 failed

Avoid writing per-item UITabBarAppearance badge colors so UIKit does not render the selected tab badge appearance across other visible Shell tabs. Keep badge colors on the UITabBarItem path and cover independent badge colors with active Shell tab bar appearance.

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

Or

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

@github-actions github-actions Bot added area-controls-shell Shell Navigation, Routes, Tabs, Flyout platform/ios platform/macos macOS / Mac Catalyst labels Jun 19, 2026
@kubaflo

This comment has been minimized.

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jun 19, 2026
@MauiBot MauiBot added 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 Jun 19, 2026
MauiBot

This comment was marked as outdated.

MauiBot

This comment was marked as outdated.

@kubaflo

This comment has been minimized.

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jun 20, 2026

@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.

@@ -426,89 +426,17 @@ internal static void UpdateTabBarItemBadge(UITabBarItem tabBarItem, ShellSection
{
var attrs = new UIStringAttributes { ForegroundColor = badgeTextColor.ToPlatform() };
tabBarItem.SetBadgeTextAttributes(attrs, UIControlState.Normal);

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.

[major] iOS/macCatalyst Platform Specifics — This method now relies only on direct UITabBarItem badge APIs, but it never clears any per-item StandardAppearance/ScrollEdgeAppearance that may already be attached to the item on iOS 15+. Those appearances continue participating in badge rendering and can override/bleed badge colors when tabs are selected or items are refreshed. Clear the per-item appearances before applying BadgeColor/SetBadgeTextAttributes so stale appearance state cannot win over the direct item values.

@MauiBot MauiBot added s/agent-fix-win AI found a better alternative fix than the PR s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates and removed s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-fix-win AI found a better alternative fix than the PR labels Jun 20, 2026
MauiBot

This comment was marked as outdated.

@MauiBot MauiBot added s/agent-fix-win AI found a better alternative fix than the PR and removed s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-review-in-progress AI review is currently running for this PR labels Jun 20, 2026
MauiBot

This comment was marked as outdated.

@MauiBot MauiBot added the s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates label Jun 20, 2026
@MauiBot MauiBot removed the s/agent-fix-win AI found a better alternative fix than the PR label Jun 20, 2026
@MauiBot MauiBot added s/agent-fix-win AI found a better alternative fix than the PR and removed s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates labels Jun 20, 2026
MauiBot

This comment was marked as outdated.

@MauiBot MauiBot added 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 and removed s/agent-fix-win AI found a better alternative fix than the PR labels Jun 21, 2026

@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

@jfversluis — new AI review results are available based on this last commit: 2f8ab65. To request a fresh review after new comments or commits, comment /review rerun.

Gate Passed Confidence Low Platform iOS


🚀 Next Steps — review latest findings

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

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

Gate Result: ✅ PASSED

Platform: IOS · Base: net11.0 · Merge base: bcb20a61

Test Without Fix (expect FAIL) With Fix (expect PASS)
📱 ShellBadgeTests (ShellTabBadgeColorsStayIndependentAcrossSelectedTabs) Category=Shell ✅ FAIL — 280s ✅ PASS — 116s
🔴 Without fix — 📱 ShellBadgeTests (ShellTabBadgeColorsStayIndependentAcrossSelectedTabs): FAIL ✅ · 280s

(truncated to last 15,000 chars)

ts[6221:42284] 2) 	[FAIL] Shell Tab Badge Colors Stay Independent Across Selected Tabs   Test name: Shell Tab Badge Colors Stay Independent Across Selected Tabs
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9526180]    Assembly:  [Microsoft.Maui.Controls.DeviceTests, Version=11.0.0.0, Culture=neutral, PublicKeyToken=null]
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9526240] 2026-06-21 06:00:31.952512-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    Exception messages: Assertion timed out   Exception stack traces:    at Microsoft.Maui.DeviceTests.AssertHelpers.AssertEventually(Func`1 assertion, Int32 timeout, Int32 interval, String message)
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9527860] 2026-06-21 06:00:31.952601-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ShellBadgeTests.<>c__DisplayClass4_0.<<ShellTabBadgeColorsStayIndependentAcrossSelectedTabs>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9527990] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9528950] 2026-06-21 06:00:31.952713-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass17_1`1.<<CreateHandlerAndAddToWindow>b__1>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9529060] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9529110]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass31_0`1.<<SetupWindowForTests>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9529150] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9530190] 2026-06-21 06:00:31.952811-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass31_0`1.<<SetupWindowForTests>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9530330] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9530370]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass3_0.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9532570] 2026-06-21 06:00:31.952922-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9532710]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass2_0`1.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9532760] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9532800] 2026-06-21 06:00:31.953047-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass17_0`1.<<CreateHandlerAndAddToWindow>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9532840] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9532870]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass3_0.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9533160] 2026-06-21 06:00:31.953200-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9533200]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass2_0`1.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9533240] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9534630] 2026-06-21 06:00:31.953280-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ShellBadgeTests.ShellTabBadgeColorsStayIndependentAcrossSelectedTabs()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9534880] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9534930]    Execution time: 2.3264908
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9534980]    Test trait name: Category
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9535020]       value: Shell
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9535900] 2026-06-21 06:00:31.953371-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284] 3) 	[FAIL] Shell Tab Badge Colors Persist After Native Tab Bar Item Updates   Test name: Shell Tab Badge Colors Persist After Native Tab Bar Item Updates
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9536940] 2026-06-21 06:00:31.953514-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    Assembly:  [Microsoft.Maui.Controls.DeviceTests, Version=11.0.0.0, Culture=neutral, PublicKeyToken=null]
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9537090]    Exception messages: Assertion timed out   Exception stack traces:    at Microsoft.Maui.DeviceTests.AssertHelpers.AssertEventually(Func`1 assertion, Int32 timeout, Int32 interval, String message)
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9537860] 2026-06-21 06:00:31.953629-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ShellBadgeTests.<>c__DisplayClass1_0.<<ShellTabBadgeColorsPersistAfterNativeTabBarItemUpdates>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9538010] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9538420] 2026-06-21 06:00:31.953722-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass17_1`1.<<CreateHandlerAndAddToWindow>b__1>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9538500] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9538540]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass31_0`1.<<SetupWindowForTests>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9538580] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9539600] 2026-06-21 06:00:31.953807-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass31_0`1.<<SetupWindowForTests>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9539700] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9541930] 2026-06-21 06:00:31.953889-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass3_0.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9542050] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9542100]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass2_0`1.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9542130] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9542180] 2026-06-21 06:00:31.954048-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass17_0`1.<<CreateHandlerAndAddToWindow>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9542210] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9542260]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass3_0.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9543270] 2026-06-21 06:00:31.954129-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9543410]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass2_0`1.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9543460] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9544480] 2026-06-21 06:00:31.954250-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ShellBadgeTests.ShellTabBadgeColorsPersistAfterNativeTabBarItemUpdates()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9544620] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9544660]    Execution time: 2.3191542
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9544700]    Test trait name: Category
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9544730]       value: Shell
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9545570] 2026-06-21 06:00:31.954357-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284] 4) 	[FAIL] Shell Tab Badge Text Color Clears To Default   Test name: Shell Tab Badge Text Color Clears To Default
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9545710]    Assembly:  [Microsoft.Maui.Controls.DeviceTests, Version=11.0.0.0, Culture=neutral, PublicKeyToken=null]
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9546870] 2026-06-21 06:00:31.954467-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    Exception messages: Assertion timed out   Exception stack traces:    at Microsoft.Maui.DeviceTests.AssertHelpers.AssertEventually(Func`1 assertion, Int32 timeout, Int32 interval, String message)
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9547930] 2026-06-21 06:00:31.954561-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ShellBadgeTests.<>c__DisplayClass3_0.<<ShellTabBadgeTextColorClearsToDefault>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9548050] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9548110]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass17_1`1.<<CreateHandlerAndAddToWindow>b__1>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9548990] 2026-06-21 06:00:31.954744-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9549070]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass31_0`1.<<SetupWindowForTests>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9549100] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9549950] 2026-06-21 06:00:31.954831-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass31_0`1.<<SetupWindowForTests>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9550170] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9550210]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass3_0.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9550260] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9551170] 2026-06-21 06:00:31.954909-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass2_0`1.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9551330] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9551950] 2026-06-21 06:00:31.954987-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.DeviceTests.ControlsHandlerTestBase.<>c__DisplayClass17_0`1.<<CreateHandlerAndAddToWindow>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9552040] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9552080]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass3_0.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9552130] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9553390] 2026-06-21 06:00:31.955082-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284]    at Microsoft.Maui.Dispatching.DispatcherExtensions.<>c__DisplayClass2_0`1.<<DispatchAsync>b__0>d.MoveNext()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9553490] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9553530]    at Microsoft.Maui.DeviceTests.ShellBadgeTests.ShellTabBadgeTextColorClearsToDefault()
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9553570] 2026-06-21 06:00:31.955158-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284] --- End of stack trace from previous location ---
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9553610]    Execution time: 2.3165878
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9553640]    Test trait name: Category
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9553670]       value: Shell
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9556420] 2026-06-21 06:00:31.955472-0700 Microsoft.Maui.Controls.DeviceTests[6221:42284] Tests run: 209 Passed: 205 Inconclusive: 0 Failed: 4 Ignored: 0
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9592980] 2026-06-21 06:00:31.959133-0700 Microsoft.Maui.Controls.DeviceTests[6221:41687] Xml file was written to the provided writer.
�[40m�[37mdbug�[39m�[22m�[49m: [06:00:31.9594100] 2026-06-21 06:00:31.959223-0700 Microsoft.Maui.Controls.DeviceTests[6221:41687] Tests run: 607 Passed: 205 Inconclusive: 0 Failed: 4 Ignored: 398
�[40m�[37mdbug�[39m�[22m�[49m: ==================== End of ApplicationLog ====================
�[40m�[37mdbug�[39m�[22m�[49m: 
�[40m�[32minfo�[39m�[22m�[49m: Uninstalling the application 'com.microsoft.maui.controls.devicetests' from 'iPhone 11 Pro'
�[40m�[37mdbug�[39m�[22m�[49m: 
�[40m�[37mdbug�[39m�[22m�[49m: Running /Applications/Xcode_26.0.1.app/Contents/Developer/usr/bin/simctl
�[40m�[37mdbug�[39m�[22m�[49m: Process simctl exited with 0
�[40m�[32minfo�[39m�[22m�[49m: Application 'com.microsoft.maui.controls.devicetests' was uninstalled successfully
�[40m�[32minfo�[39m�[22m�[49m: <<XHARNESS_RESULT_START>>
      {
        "version": 1,
        "machineName": "CJ4PTPQWTM-1",
        "exitCode": 1,
        "exitCodeName": "TESTS_FAILED",
        "platform": "apple",
        "device": "iPhone 11 Pro",
        "deviceOsVersion": "26.0",
        "files": [
          {
            "name": "test-ios-simulator-64_26.0-2F6E2B90-10C4-41EF-BCF4-15A79387A1F2.log",
            "type": "executionlog"
          },
          {
            "name": "list-ios-simulator-64_26.0-20260621_055902.log",
            "type": "devicelist"
          },
          {
            "name": "test-ios-simulator-64_26.0-20260621_055910.log",
            "type": "testlog"
          },
          {
            "name": "iPhone 11 Pro.log",
            "type": "systemlog"
          },
          {
            "name": "Microsoft.Maui.Controls.DeviceTests.log",
            "type": "systemlog"
          },
          {
            "name": "com.microsoft.maui.controls.devicetests.log",
            "type": "applicationlog"
          },
          {
            "name": "xunit-test-ios-simulator-64_26.0-20260621_055910.xml",
            "type": "xmllog"
          }
        ]
      }
      <<XHARNESS_RESULT_END>>
XHarness exit code: 1 (TESTS_FAILED)
  Passed: 0
  Failed: 0
  Tests completed with exit code: 1

🟢 With fix — 📱 ShellBadgeTests (ShellTabBadgeColorsStayIndependentAcrossSelectedTabs): PASS ✅ · 116s

(truncated to last 15,000 chars)

[49m: [06:02:21.8542750] 2026-06-21 06:02:21.853952-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:21.9997000] 2026-06-21 06:02:21.999331-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:22.1683860] 2026-06-21 06:02:22.167972-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:22.3343260] 2026-06-21 06:02:22.334078-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:22.4851380] 2026-06-21 06:02:22.484765-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:22.6316800] 2026-06-21 06:02:22.631300-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:22.8056490] 2026-06-21 06:02:22.805346-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:22.9767550] 2026-06-21 06:02:22.976288-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:23.1395800] 2026-06-21 06:02:23.139346-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:23.3035890] 2026-06-21 06:02:23.303292-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:23.4636080] 2026-06-21 06:02:23.463311-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:23.6216210] 2026-06-21 06:02:23.621320-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:23.7884960] 2026-06-21 06:02:23.788162-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:23.9355220] 2026-06-21 06:02:23.935224-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:24.0836650] 2026-06-21 06:02:24.083271-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:24.2627010] 2026-06-21 06:02:24.262372-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:24.4224590] 2026-06-21 06:02:24.422071-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:24.5901450] 2026-06-21 06:02:24.589701-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:24.7533780] 2026-06-21 06:02:24.753016-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:24.9047270] 2026-06-21 06:02:24.904357-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:25.0556380] 2026-06-21 06:02:25.055348-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:25.2222280] 2026-06-21 06:02:25.221815-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:25.3932080] 2026-06-21 06:02:25.392738-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:25.5556490] 2026-06-21 06:02:25.555171-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:25.7152650] 2026-06-21 06:02:25.714893-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:25.8728780] 2026-06-21 06:02:25.872524-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:26.0474690] 2026-06-21 06:02:26.047144-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:26.1998730] 2026-06-21 06:02:26.199566-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:26.3499550] 2026-06-21 06:02:26.349690-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:26.5005060] 2026-06-21 06:02:26.500206-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:26.6490660] 2026-06-21 06:02:26.648734-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:26.7977960] 2026-06-21 06:02:26.797435-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:26.9500640] 2026-06-21 06:02:26.949493-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:27.1006340] 2026-06-21 06:02:27.100325-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:27.2487660] 2026-06-21 06:02:27.248455-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:27.4011640] 2026-06-21 06:02:27.400745-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:27.5502000] 2026-06-21 06:02:27.549814-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:27.6994020] 2026-06-21 06:02:27.699060-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:27.8471390] 2026-06-21 06:02:27.846710-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:28.0011000] 2026-06-21 06:02:28.000743-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderContentAndFooterAllMeasureCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:28.2317110] 2026-06-21 06:02:28.231342-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutWithAsMultipleItemsRendersWithoutCrashing
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:28.4354210] 2026-06-21 06:02:28.435037-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] Empty Shell
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:28.7725270] 2026-06-21 06:02:28.772215-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] SearchHandlerRendersCorrectly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:29.5456410] 2026-06-21 06:02:29.545250-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] [RTILog] -[RTIInputSystemClient remoteTextInputSessionWithID:performInputOperation:]  perform input operation requires a valid sessionID. inputModality = Keyboard, inputOperation = <null selector>, customInfoType = UIEmojiSearchOperations
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:29.8261900] 2026-06-21 06:02:29.825868-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] HideSoftInputOnTapped Doesn't Crash If Entry Is Still Focused After Window Is Null
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:30.5207700] 2026-06-21 06:02:30.520362-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] [Snapshotting] Snapshotting a view (0x36a0a70b0, _TtCC5UIKit19NavigationButtonBar15ItemWrapperView) that has not been rendered at least once requires afterScreenUpdates:YES.
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:30.5210420] 2026-06-21 06:02:30.520699-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] [Snapshotting] Snapshotting a view (0x36a0aadf0, _TtCC5UIKit19NavigationButtonBar15ItemWrapperView) that has not been rendered at least once requires afterScreenUpdates:YES.
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:32.2263770] 2026-06-21 06:02:32.226096-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] Pages Do Not Leak
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:32.2267900] 2026-06-21 06:02:32.226530-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] TitleView can use constraints to expand area
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:32.4016520] 2026-06-21 06:02:32.401337-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] Shell add then remove items from selected item
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:32.4021190] 2026-06-21 06:02:32.401917-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] Shell TabBar Foreground Initializes Correctly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:32.4023120] 2026-06-21 06:02:32.402120-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] Shell TabBar Foreground Initializes Correctly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:32.5531740] 2026-06-21 06:02:32.552838-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderMinimumHeight
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:32.7097160] 2026-06-21 06:02:32.709403-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderMinimumHeight
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:32.8816500] 2026-06-21 06:02:32.881368-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderMinimumHeight
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:33.0387160] 2026-06-21 06:02:33.038416-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutHeaderMinimumHeight
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:33.1492180] 2026-06-21 06:02:33.148864-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] Shell Flyout Table View Has ScrollsToTop Disabled
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:33.1497590] 2026-06-21 06:02:33.149579-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] Shell TabBar Title Color Initializes Correctly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:33.1498820] 2026-06-21 06:02:33.149721-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] Shell TabBar Title Color Initializes Correctly
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:33.7430040] 2026-06-21 06:02:33.742604-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] Unbalanced calls to begin/end appearance transitions for <Microsoft_Maui_Controls_Platform_Compatibility_ShellSectionRenderer: 0x1680e4800>.
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:33.7450820] 2026-06-21 06:02:33.744652-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] TitleView Updates to Currently Visible Page
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:34.3666790] 2026-06-21 06:02:34.366329-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] [Snapshotting] Snapshotting a view (0x36c0b5d70, _TtCC5UIKit19NavigationButtonBar15ItemWrapperView) that has not been rendered at least once requires afterScreenUpdates:YES.
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:35.3457820] 2026-06-21 06:02:35.345474-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] Pushing the Same Page Disconnects Previous Toolbar Items
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:35.5096920] 2026-06-21 06:02:35.509240-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] 	[PASS] FlyoutContentSetsCorrectBottomPaddingWhenMinHeightIsSetForFlyoutHeader
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:35.5099980] 2026-06-21 06:02:35.509643-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] Microsoft.Maui.DeviceTests.ShellTests 47.8738176 ms
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:35.5120200] 2026-06-21 06:02:35.511815-0700 Microsoft.Maui.Controls.DeviceTests[6477:46073] Tests run: 209 Passed: 209 Inconclusive: 0 Failed: 0 Ignored: 0
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:35.5156230] 2026-06-21 06:02:35.515436-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] Xml file was written to the provided writer.
�[40m�[37mdbug�[39m�[22m�[49m: [06:02:35.5157250] 2026-06-21 06:02:35.515559-0700 Microsoft.Maui.Controls.DeviceTests[6477:46017] Tests run: 607 Passed: 209 Inconclusive: 0 Failed: 0 Ignored: 398
�[40m�[37mdbug�[39m�[22m�[49m: ==================== End of ApplicationLog ====================
�[40m�[37mdbug�[39m�[22m�[49m: 
�[40m�[32minfo�[39m�[22m�[49m: Uninstalling the application 'com.microsoft.maui.controls.devicetests' from 'iPhone 11 Pro'
�[40m�[37mdbug�[39m�[22m�[49m: 
�[40m�[37mdbug�[39m�[22m�[49m: Running /Applications/Xcode_26.0.1.app/Contents/Developer/usr/bin/simctl
�[40m�[37mdbug�[39m�[22m�[49m: Process simctl exited with 0
�[40m�[32minfo�[39m�[22m�[49m: Application 'com.microsoft.maui.controls.devicetests' was uninstalled successfully
�[40m�[32minfo�[39m�[22m�[49m: <<XHARNESS_RESULT_START>>
      {
        "version": 1,
        "machineName": "CJ4PTPQWTM-1",
        "exitCode": 0,
        "exitCodeName": "SUCCESS",
        "platform": "apple",
        "device": "iPhone 11 Pro",
        "deviceOsVersion": "26.0",
        "files": [
          {
            "name": "test-ios-simulator-64_26.0-2F6E2B90-10C4-41EF-BCF4-15A79387A1F2.log",
            "type": "executionlog"
          },
          {
            "name": "list-ios-simulator-64_26.0-20260621_060134.log",
            "type": "devicelist"
          },
          {
            "name": "test-ios-simulator-64_26.0-20260621_060139.log",
            "type": "testlog"
          },
          {
            "name": "iPhone 11 Pro.log",
            "type": "systemlog"
          },
          {
            "name": "Microsoft.Maui.Controls.DeviceTests.log",
            "type": "systemlog"
          },
          {
            "name": "com.microsoft.maui.controls.devicetests.log",
            "type": "applicationlog"
          },
          {
            "name": "xunit-test-ios-simulator-64_26.0-20260621_060139.xml",
            "type": "xmllog"
          }
        ]
      }
      <<XHARNESS_RESULT_END>>
XHarness exit code: 0
  Passed: 209
  Failed: 0
  Tests completed successfully

📁 Fix files reverted (2 files)
  • src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellItemRenderer.cs
  • src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellSectionRenderer.cs

📱 UI Tests — Shell

Detected UI test categories: Shell

Deep UI tests — 189 passed, 107 failed across 1 category on platform-pool agent (replaces in-process counts above).

🧪 UI Test Execution Results (deep, platform pool)

Category Tests Snapshot diffs
Shell 189/311 (107 ❌) 106 diff PNGs
Shell — 107 failed tests
VerifyShell_TabBarForegroundColor
System.InvalidOperationException : 
Snapshot different than baseline: VerifyShell_TabBarForegroundColor.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyShell_TabBarForegroundColor.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test
...
VerifyFlyoutSelectedCurrentItem
System.InvalidOperationException : 
Snapshot different than baseline: VerifyFlyoutSelectedCurrentItem.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyFlyoutSelectedCurrentItem.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test att
...
VerifyFlyoutBackgroundColor
System.InvalidOperationException : 
Snapshot different than baseline: VerifyFlyoutBackgroundColor.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyFlyoutBackgroundColor.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment 
...
TabBarVisibilityHidesOnPage1UsingDirectSet
System.InvalidOperationException : 
Snapshot different than baseline: TabBarVisibilityHidesOnPage1UsingDirectSet.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: TabBarVisibilityHidesOnPage1UsingDirectSet.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseli
...
VerifyShellFlyout_FlyoutBehaviorDisabled
System.InvalidOperationException : Unable to extract difference percentage from exception message.
at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 296
   at Microsoft.Maui.TestCases.Tests.ShellFeatureTests.FlyoutScreenshot() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShellFeatureMatrixTests.cs:line 1018
   at Microsoft.Maui.TestCases.Tests.ShellFeatureTests.VerifyShellFlyout_FlyoutBehaviorDisabled() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShellFeatureMatrixTests.cs:line 697
   at System.RuntimeMethodHandle.InvokeMethod(ObjectHandleOnStack target, Void** arguments, ObjectHandleOnStack sig, BOOL isConstructor, ObjectHandleOnStack result)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr,
...
NavBarUpdatesWhenSwitchingShellContent
System.InvalidOperationException : 
Snapshot different than baseline: NavBarUpdatesWhenSwitchingShellContent.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: NavBarUpdatesWhenSwitchingShellContent.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image
...
PaddingWithoutSafeArea
Assert.That(somePaddingValue, Is.GreaterThan(zeroPaddingValue))
  Expected: greater than 316
  But was:  316
at Microsoft.Maui.TestCases.Tests.Issues.ShellInsets.PaddingWithoutSafeArea() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/ShellInsets.cs:line 140

1)    at Microsoft.Maui.TestCases.Tests.Issues.ShellInsets.PaddingWithoutSafeArea() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/XFIssue/ShellInsets.cs:line 140
ShouldFlyoutTextWrapsInLandscape
System.InvalidOperationException : 
Snapshot different than baseline: ShouldFlyoutTextWrapsInLandscape.png (size differs - baseline is 2436x974 pixels, actual is 2622x1056 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: ShouldFlyoutTextWrapsInLandscape.png (size differs - baseline is 2436x974 pixels, actual is 2622x1056 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test att
...
ShellPages_PresentationModeNotAnimated
System.InvalidOperationException : 
Snapshot different than baseline: ShellPages_PresentationModeNotAnimated.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: ShellPages_PresentationModeNotAnimated.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image
...
VerifyShellFlyout_HeightAndWidthWithBackgroundImage
System.InvalidOperationException : Unable to extract difference percentage from exception message.
at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 296
   at Microsoft.Maui.TestCases.Tests.ShellFeatureTests.VerifyShellFlyout_HeightAndWidthWithBackgroundImage() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShellFeatureMatrixTests.cs:line 599
   at System.RuntimeMethodHandle.InvokeMethod(ObjectHandleOnStack target, Void** arguments, ObjectHandleOnStack sig, BOOL isConstructor, ObjectHandleOnStack result)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
VerifyShellFlyout_BackgroundImageAndBackDrop
System.InvalidOperationException : Unable to extract difference percentage from exception message.
at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 296
   at Microsoft.Maui.TestCases.Tests.ShellFeatureTests.VerifyShellFlyout_BackgroundImageAndBackDrop() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShellFeatureMatrixTests.cs:line 619
   at System.RuntimeMethodHandle.InvokeMethod(ObjectHandleOnStack target, Void** arguments, ObjectHandleOnStack sig, BOOL isConstructor, ObjectHandleOnStack result)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
VerifyShell_IsVisible
System.InvalidOperationException : 
Snapshot different than baseline: VerifyShell_IsVisible.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyShell_IsVisible.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download 
...
SearchHandlerVisibilityChangesToCollapsible
System.InvalidOperationException : 
Snapshot different than baseline: SearchHandlerVisibilityChangesToCollapsible.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: SearchHandlerVisibilityChangesToCollapsible.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the base
...
ShellAppearanceUpdatesWhenChangingShellSectionToTab_2
System.InvalidOperationException : 
Snapshot different than baseline: ShellAppearanceUpdatesWhenChangingShellSectionToTab_2.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: ShellAppearanceUpdatesWhenChangingShellSectionToTab_2.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), 
...
VerifyExistingTabTitle
System.InvalidOperationException : 
Snapshot different than baseline: VerifyExistingTabTitle.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyExistingTabTitle.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or downloa
...
ShellPages_ForegroundColor
System.InvalidOperationException : 
Snapshot different than baseline: ShellPages_ForegroundColor.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: ShellPages_ForegroundColor.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or
...
TabBarVisibilityAfterMultiLevelPopToRoot
System.InvalidOperationException : 
Snapshot different than baseline: TabBarVisibilityAfterMultiLevelPopToRoot.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: TabBarVisibilityAfterMultiLevelPopToRoot.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline i
...
VerifyShellFlyout_ShellContentAndBackgroundColor
System.InvalidOperationException : Unable to extract difference percentage from exception message.
at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 296
   at Microsoft.Maui.TestCases.Tests.ShellFeatureTests.VerifyShellFlyout_ShellContentAndBackgroundColor() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShellFeatureMatrixTests.cs:line 790
   at System.RuntimeMethodHandle.InvokeMethod(ObjectHandleOnStack target, Void** arguments, ObjectHandleOnStack sig, BOOL isConstructor, ObjectHandleOnStack result)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
LargeTitleTransitionsOnScroll
System.InvalidOperationException : 
Snapshot different than baseline: Issue33037_BeforeScroll.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: Issue33037_BeforeScroll.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or downl
...
ShellPages_PresentationModeAnimated
System.InvalidOperationException : 
Snapshot different than baseline: ShellPages_PresentationModeAnimated.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: ShellPages_PresentationModeAnimated.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See 
...
VerifyShellFlyoutContentAlignedInRTL
System.InvalidOperationException : 
Snapshot different than baseline: VerifyShellFlyoutContentAlignedInRTL.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyShellFlyoutContentAlignedInRTL.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
Se
...
VerifyShell_TabBarForegroundColorAndTitleColor
System.InvalidOperationException : 
Snapshot different than baseline: VerifyShell_TabBarForegroundColorAndTitleColor.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyShell_TabBarForegroundColorAndTitleColor.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update th
...
NavigationBarShouldRemainHiddenAfterNavigatingBack
System.InvalidOperationException : 
Snapshot different than baseline: NavigationBarShouldRemainHiddenAfterNavigatingBack.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: NavigationBarShouldRemainHiddenAfterNavigatingBack.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then u
...
VerifyShellFlyoutBackgroundImage
System.InvalidOperationException : 
Snapshot different than baseline: VerifyShellFlyoutBackgroundImage.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyShellFlyoutBackgroundImage.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test a
...
VerifyShellFlyout_BackgroundImage
System.InvalidOperationException : Unable to extract difference percentage from exception message.
at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 296
   at Microsoft.Maui.TestCases.Tests.ShellFeatureTests.VerifyShellFlyout_BackgroundImage() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShellFeatureMatrixTests.cs:line 826
   at System.RuntimeMethodHandle.InvokeMethod(ObjectHandleOnStack target, Void** arguments, ObjectHandleOnStack sig, BOOL isConstructor, ObjectHandleOnStack result)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
VerifyShellFlyout_BackgroundImageAspect_Fill
System.InvalidOperationException : Unable to extract difference percentage from exception message.
at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 296
   at Microsoft.Maui.TestCases.Tests.ShellFeatureTests.VerifyShellFlyout_BackgroundImageAspect_Fill() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShellFeatureMatrixTests.cs:line 575
   at System.RuntimeMethodHandle.InvokeMethod(ObjectHandleOnStack target, Void** arguments, ObjectHandleOnStack sig, BOOL isConstructor, ObjectHandleOnStack result)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
VerifyTemplateViewMarginOnInitialDisplay
System.InvalidOperationException : 
Snapshot different than baseline: VerifyTemplateViewMarginOnInitialDisplay.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: VerifyTemplateViewMarginOnInitialDisplay.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline i
...
ShellPages_ShowTitleViewHidden
System.InvalidOperationException : 
Snapshot different than baseline: ShellPages_ShowTitleViewHidden.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: ShellPages_ShowTitleViewHidden.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attac
...
VerifyShellFlyout_BackgroundImageSetToNull
System.InvalidOperationException : Unable to extract difference percentage from exception message.
at Microsoft.Maui.TestCases.Tests.UITest.VerifyScreenshot(String name, Nullable`1 retryDelay, Nullable`1 retryTimeout, Int32 cropLeft, Int32 cropRight, Int32 cropTop, Int32 cropBottom, Double tolerance) in /_/src/Controls/tests/TestCases.Shared.Tests/UITest.cs:line 296
   at Microsoft.Maui.TestCases.Tests.ShellFeatureTests.VerifyShellFlyout_BackgroundImageSetToNull() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/ShellFeatureMatrixTests.cs:line 660
   at System.RuntimeMethodHandle.InvokeMethod(ObjectHandleOnStack target, Void** arguments, ObjectHandleOnStack sig, BOOL isConstructor, ObjectHandleOnStack result)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
SearchHandlerVisibilityChangesToExpanded
System.InvalidOperationException : 
Snapshot different than baseline: SearchHandlerVisibilityChangesToExpanded.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline image.
See test attachment or download the build artifacts to get the new snapshot file.

More info: https://aka.ms/visual-test-workflow


iOS 26 visual tests require an iPhone 11 Pro simulator for correct screen resolution.
To create the simulator, run:
  xcrun simctl create "iPhone 11 Pro" com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro com.apple.CoreSimulator.SimRuntime.iOS-26-0

Then run the tests targeting the new simulator.
  ----> VisualTestUtils.VisualTestFailedException : 
Snapshot different than baseline: SearchHandlerVisibilityChangesToExpanded.png (size differs - baseline is 1124x2286 pixels, actual is 1206x2472 pixels)
If the correct baseline has changed (this isn't a a bug), then update the baseline i
...

(+77 more — see TRX in artifact)

📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)


🔁 Regression Cross-Reference

🔍 Regression Cross-Reference

🟡 Overlaps with prior bug-fix PRs — same files modified, but no exact line revert detected.

File Fix PR Fixed issue(s)
src/Controls/src/Core/Compatibility/Handlers/Shell/iOS/ShellItemRenderer.cs #33337 #33158

🛫 Pre-Flight — Context & Validation

Issue: #35948 - iOS Shell tab badge color visual regression (title unavailable; GitHub CLI unauthenticated)
PR: #36026 - iOS Shell badge color fix
Platforms Affected: iOS, MacCatalyst
Files Changed: 2 implementation, 1 test

Key Findings

  • PR changes iOS/MacCatalyst Shell badge styling in ShellItemRenderer/ShellSectionRenderer, replacing per-item UITabBarAppearance badge mutation with direct UITabBarItem.BadgeColor and SetBadgeTextAttributes(...) updates.
  • Device tests in ShellBadgeTests.iOS.cs add coverage for two tabs with different badge colors after selected-tab changes.
  • GitHub CLI is unauthenticated in this environment, so issue body, PR body, review comments, and required-check status could not be fully fetched with gh. Local PR commit b2749ed0c0 was used as the authoritative code context.

Code Review Summary

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

Key code review findings:

  • ⚠️ ShellBadgeTests.iOS.cs:47 / ShellBadgeTests.iOS.cs:239 verify native UITabBarItem properties but not rendered badge pixels, leaving a coverage gap for UIKit appearance rendering/global appearance override behavior.

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #36026 Remove per-item UITabBarAppearance badge mutation; use direct UITabBarItem.BadgeColor and badge text attributes across states ✅ PASSED (Gate) ShellItemRenderer.cs, ShellSectionRenderer.cs, ShellBadgeTests.iOS.cs Original PR; gate was completed before this task and must not be rerun

🔬 Code Review — Deep Analysis

Code Review — PR #36026

Independent Assessment

What this changes: Removes iOS/MacCatalyst Shell badge UITabBarAppearance mutation and relies on UITabBarItem.BadgeColor plus badge text attributes for Normal/Selected/Disabled/Focused states.
Inferred motivation: Avoid per-tab badge colors bleeding from the selected tab into other visible tabs.

Reconciliation with PR Narrative

Author claims: Fixes #35948 by avoiding per-item UITabBarAppearance badge color updates.
Agreement/disagreement: The code matches the claim. The approach is plausible, but rendered badge color is not directly verified.

Prior Review Reconciliation

No prior ❌ Error findings found. Prior [major] inline concern about stale per-item appearances was reviewed; current fresh item creation path no longer creates those appearances.

Blast Radius Assessment

  • Runs for all instances: Yes — all iOS/MacCatalyst Shell tab badge updates.
  • Startup impact: No direct startup path.
  • Static/shared state: No new static/shared state.

CI Status

  • Required-check result: gh pr checks --required unavailable (gh auth login required). Public check-runs show maui-pr failed.
  • Classification: likely unrelated/undetermined; failures shown are AOT template warning-file/JDK/provisioning style failures, not Shell badge code.
  • Action taken: invoked azdo-build-investigator; confidence capped low.

Findings

⚠️ Warning — Rendered global-appearance scenario is not directly verified

ShellBadgeTests.iOS.cs:47 and helpers at ShellBadgeTests.iOS.cs:239 assert native UITabBarItem properties, but not the rendered badge pixels. Since #35948 is a visual regression involving UIKit appearance rendering, this leaves a coverage gap if global UITabBar.StandardAppearance still overrides direct item badge values.

Failure-Mode Probing

  • Tab without badge colors: BadgeValue, BadgeColor, and text attributes are reset to null.
  • Handler/item refresh: ShellSectionRenderer.UpdateTabBarItem() reapplies badge state to the replacement item.
  • Multiple selected tabs: New test covers independent item properties after selection change, but not rendered output.

Verdict: NEEDS_DISCUSSION

Confidence: low
Summary: Code direction matches the reported root cause, and no definite source bug was found. However CI is red/required status could not be verified, and the key visual rendering path still needs stronger evidence before LGTM.


🛠️ Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 try-fix Keep iOS 15+ per-item UITabBarAppearance, but always allocate isolated appearances and set/clear badge state there instead of copying shared tab bar appearances ✅ PASS 3 files More UIKit-appearance coverage than the PR, but materially more complex and allocates two appearance objects per item/update; not demonstrably better than the PR's simpler direct-property fix
2 try-fix Reapply every visible tab item's badge state after Shell selection changes and tab bar appearance recomputation ✅ PASS 2 files Adds defense-in-depth lifecycle hooks, but the passing behavior still relies on the same direct-property payload as the PR; extra hooks are not proven necessary by the regression test
3 try-fix Clear badge background/text attributes from shared UITabBar.StandardAppearance/ScrollEdgeAppearance after Shell appearance updates while keeping per-item badge properties authoritative ❌ FAIL 2 files Required iOS Shell device-test command failed before test execution in 3/3 runs with NETSDK1005 missing net10.0-ios assets target; approach not empirically validated
4 try-fix Keep direct UITabBarItem badge properties but explicitly clear existing per-item StandardAppearance/ScrollEdgeAppearance badge customizations on every badge update ❌ FAIL 3 files Built and ran after restoring the local runner patch; existing Shell badge tests passed, but the added stale-appearance regression timed out and self-review recorded a major logic/correctness finding
PR PR #36026 Remove per-item UITabBarAppearance badge mutation; use direct UITabBarItem.BadgeColor and badge text attributes across states ✅ PASSED (Gate) 3 files Original PR

Cross-Pollination

Model Round New Ideas? Details
claude-opus-4.6 2 No Direct UITabBarItem.BadgeColor + SetBadgeTextAttributes is the canonical Apple path; remaining root-cause angles were exhausted by candidates #1-#4
claude-opus-4.7 2 No PR's direct per-item properties are the simplest fix; per-item isolation, lifecycle hooks, global appearance cleanup, and stale cleanup cover the meaningful alternatives
gpt-5.3-codex 2 No PR direct APIs are the simplest validated root-cause fix; alternatives are covered or riskier
gpt-5.5 2 No PR addresses shared UITabBarAppearance state mutation with the simplest robust path; other distinct strategies were more complex or unproven

Exhausted: Yes
Selected Fix: PR #36026 — the PR's direct UITabBarItem badge-property approach is the simplest validated fix. Candidate #1 passed but is more complex and allocates per-item appearances; candidate #2 passed but adds unproven lifecycle reapplication; candidate #3 was not empirically validated due build/restore failure; candidate #4 failed a stale-appearance regression.


🏁 Report — Final Recommendation

Comparative Fix Report — PR #36026

Ranking

Rank Candidate Regression result Assessment
1 pr ✅ Passed Best balance of correctness, simplicity, and validation. It removes the root cause by no longer writing Shell badge colors into per-item UITabBarAppearance, while still applying native UITabBarItem badge color/text state across all relevant control states.
2 pr-plus-reviewer ✅ Passed Equivalent to pr; the expert reviewer had no actionable feedback to apply, so this is not a distinct improvement over the raw PR.
3 try-fix-2 ✅ Passed Adds lifecycle reapplication after selection and Shell appearance recomputation, but its passing behavior depends on the same direct UITabBarItem badge payload as the PR. The extra hooks are defense-in-depth without a failing test proving they are necessary.
4 try-fix-1 ✅ Passed Uses isolated per-item UITabBarAppearance instances. This validates successfully, but it is more complex, allocates additional appearance objects on updates, and keeps badge styling on the appearance path the PR intentionally avoids.
5 try-fix-3 ❌ Failed Sanitizes shared tab bar appearance badge fields, but the required regression command failed before test execution and the candidate was not empirically validated. Per ranking rules, it must stay below passing candidates.
6 try-fix-4 ❌ Failed Attempts stale per-item appearance cleanup while using direct badge properties, but its added stale-appearance regression timed out and self-review recorded a major correctness issue. Per ranking rules, it must stay below passing candidates.

Candidate comparison

pr and pr-plus-reviewer are identical because the expert reviewer produced no actionable inline findings. The PR's approach is the smallest validated fix: it stops mutating per-item UITabBarAppearance badge colors and relies on the native UITabBarItem badge APIs, including text attributes for normal, selected, disabled, and focused states.

try-fix-1 is validated but chooses a heavier model: keep the iOS 15+ appearance pipeline and isolate every per-item appearance. That may cover more UIKit appearance surface, but it also preserves the same category of appearance-state complexity that caused the bug and adds per-update allocations.

try-fix-2 is also validated and low risk, but its added lifecycle reapplication hooks are not proven necessary by the regression. The core payload remains the PR's direct UITabBarItem update, so it is best treated as a possible future hardening step rather than the preferred fix now.

try-fix-3 and try-fix-4 both rank below all passing candidates. Candidate 3 was not validated because the build/test command failed before execution, and candidate 4 failed its own stale-appearance regression despite passing existing Shell badge tests.

Winner

Winner: pr

The raw PR fix wins because it is the simplest empirically validated solution, directly removes the shared/per-item appearance badge mutation path responsible for color bleed, and received no actionable expert-review corrections. Failed candidates are ranked below all passing candidates as required.

@jfversluis
jfversluis merged commit bed3626 into net11.0 Jun 22, 2026
35 of 42 checks passed
@jfversluis
jfversluis deleted the jfversluis-fix-ios-shell-badge-colors branch June 22, 2026 12:15
@github-actions github-actions Bot added this to the .NET 11.0-preview6 milestone Jun 22, 2026
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 23, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-controls-shell Shell Navigation, Routes, Tabs, Flyout platform/ios platform/macos macOS / Mac Catalyst 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.

3 participants