Fixes a process-killing crash (issue class behind every UI-test failure and reproducible by real users): a second ContentDialog.ShowAsync() while one is open throws COMException 0x80000019; escaping an async void handler it took the whole app down as a stowed exception (0xc000027b in Microsoft.UI.Xaml.dll). All nine dialog sites now open through a single DialogGuard chokepoint that no-ops while a dialog is up, and App gains a last-resort UnhandledException net that logs to the activity log and keeps running.
Adds gclo.UiTests: FlaUI/UIA end-to-end tests driving the real gclo.exe against an isolated GCLO_DATA_DIR (new GcloPaths seam). Eight token-free tests: launch, navigation pane, connect card, Settings/About/wizard dialog round-trips, offline token input, and a regression test that reproduces the dialog collision. New non-required CI job runs them on a hosted runner (self-contained Windows App SDK build).
Adds the branded startup splash as an in-window overlay (brand gradient, wordmark, version + git hash, indeterminate strip, 800 ms hold + fade). Deliberately not a second Window: closing a window while UIA/assistive tech queries it is the crash class we just escaped.
Evidence
Root cause extracted from the WER minidump via dotnet-dump (pe on the unhandled exception showed the full managed stack: ShowAsync → ShowAccountWizardAsync → WorkspaceNav_SelectionChanged).
Regression test failed against the unfixed build (fresh crash dump on demand), passes after the fix.
Local gates: solution builds with -warnaserror (0 warnings), 201 unit tests, 8/8 UI tests, dotnet format clean.
## What
- **Fixes a process-killing crash** (issue class behind every UI-test failure and reproducible by real users): a second `ContentDialog.ShowAsync()` while one is open throws `COMException 0x80000019`; escaping an `async void` handler it took the whole app down as a stowed exception (`0xc000027b` in Microsoft.UI.Xaml.dll). All nine dialog sites now open through a single `DialogGuard` chokepoint that no-ops while a dialog is up, and `App` gains a last-resort `UnhandledException` net that logs to the activity log and keeps running.
- **Adds `gclo.UiTests`**: FlaUI/UIA end-to-end tests driving the real `gclo.exe` against an isolated `GCLO_DATA_DIR` (new `GcloPaths` seam). Eight token-free tests: launch, navigation pane, connect card, Settings/About/wizard dialog round-trips, offline token input, and a regression test that reproduces the dialog collision. New non-required CI job runs them on a hosted runner (self-contained Windows App SDK build).
- **Adds the branded startup splash** as an in-window overlay (brand gradient, wordmark, version + git hash, indeterminate strip, 800 ms hold + fade). Deliberately not a second `Window`: closing a window while UIA/assistive tech queries it is the crash class we just escaped.
## Evidence
- Root cause extracted from the WER minidump via `dotnet-dump` (`pe` on the unhandled exception showed the full managed stack: `ShowAsync` → `ShowAccountWizardAsync` → `WorkspaceNav_SelectionChanged`).
- Regression test failed against the unfixed build (fresh crash dump on demand), passes after the fix.
- Local gates: solution builds with `-warnaserror` (0 warnings), 201 unit tests, 8/8 UI tests, `dotnet format` clean.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What
ContentDialog.ShowAsync()while one is open throwsCOMException 0x80000019; escaping anasync voidhandler it took the whole app down as a stowed exception (0xc000027bin Microsoft.UI.Xaml.dll). All nine dialog sites now open through a singleDialogGuardchokepoint that no-ops while a dialog is up, andAppgains a last-resortUnhandledExceptionnet that logs to the activity log and keeps running.gclo.UiTests: FlaUI/UIA end-to-end tests driving the realgclo.exeagainst an isolatedGCLO_DATA_DIR(newGcloPathsseam). Eight token-free tests: launch, navigation pane, connect card, Settings/About/wizard dialog round-trips, offline token input, and a regression test that reproduces the dialog collision. New non-required CI job runs them on a hosted runner (self-contained Windows App SDK build).Window: closing a window while UIA/assistive tech queries it is the crash class we just escaped.Evidence
dotnet-dump(peon the unhandled exception showed the full managed stack:ShowAsync→ShowAccountWizardAsync→WorkspaceNav_SelectionChanged).-warnaserror(0 warnings), 201 unit tests, 8/8 UI tests,dotnet formatclean.🤖 Generated with Claude Code