teamsiso/docs/archive/work-log-2026-05-12-winui3.md
Zac Gaetano 37390026b3 chore(docs): reconcile to WPF-only after WinUI 3 was abandoned
- Fix TeamsISO.Windows.slnf — drop the dangling
  src/TeamsISO.App.WinUI/TeamsISO.App.WinUI.csproj entry whose project
  doesn't exist in the .sln (broke the build on main).
- Archive the abandoned WinUI 3 artifacts under docs/archive/:
  * 2026-05-12-winui3-migration.md (the nine-phase migration plan)
  * TeamsISO.App.WinUI.Probe/ (the bootstrap diagnostic console)
  * work-log-2026-05-12-winui3.md (the overnight session log)
- README — drop the "in-flight WinUI 3 replatform" status block;
  state that the v2 redesign landed in WPF and link the shape brief.
  Keyboard shortcuts table picks up Ctrl+K, Ctrl+T, and the digit
  hotkeys that already shipped.
- CHANGELOG — replace the WinUI-3-flavoured "Ground-up GUI redesign"
  block with a v2 Studio Terminal entry that names Task 39 + Task 40
  as landed. De-dupe the May 2026 batch: the second "Quick-join Teams
  meeting from URL", "IN-CALL bar surfaces Teams meeting state", and
  "Auto-launch Teams + auto-hide windows" bullets were verbatim repeats
  of earlier entries; kept the first occurrence.
- NEXT_STEPS.md — rewrite to reflect that Task 39 (participants table
  v2) and Task 40 (Ctrl+K palette) both shipped; v1.0 cut is now
  gated only on MSI signing + real-meeting smoke pass.
- DESIGN.md — small WPF-isms: WinUI 3 composition layer →
  WPF's; Segoe Fluent Icons phrased without the "WinUI 3's
  bundled" qualifier; migration boundary rephrased to "rewrites
  MainWindow.xaml + Themes/*" instead of "everything in Views/".
- .gitignore — ignore the .claude/ session metadata dir so it doesn't
  show up as untracked on every dev checkout.

Build + tests verified before commit: 0 errors, 0 warnings; 160 tests
pass (56 App + 104 Engine, filter Category!=ndi&requires!=ndi).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 19:16:20 -04:00

13 KiB
Raw Permalink Blame History

Work log — overnight session 2026-05-12 → 2026-05-13

The redesign brief was approved with one edit (add dark + light theming), the WinUI 3 replatform was green-lit explicitly, and you said don't stop until told to. This log is what happened.

TL;DR — overnight result

The WinUI 3 redesigned host runs. It launches, renders, and respects dark / light theme. See docs/preview/winui3-mainwindow-light.png and docs/preview/winui3-mainwindow-dark.png for proof shots captured from the live .exe.

Eighteen commits landed on origin/main. Already pushed (credentials refreshed during the session).

The WPF host is untouched. Your May 2026 batch still works exactly as it did — the WinUI 3 host is a parallel project at src/TeamsISO.App.WinUI/.

Two activation blockers — both diagnosed:

  1. WindowsAppSDK 1.6 DDLM wasn't installed on this machine (Get-AppxPackage shows Main.1.5 and Main.1.8 but no Main.1.6). Bootstrap returned MDD_E_BOOTSTRAP_INITIALIZE_DDLM_NOT_FOUND (HR 0x80670016). Fix: switched to WindowsAppSDK 1.8 — its DDLM is present.
  2. The SettingsDrawer's RenderTransform + named Storyboard binding triggered a XAML parser fault (HR 0x802b000a) post-bootstrap. Fix: stubbed the drawer host inline; the drawer XAML itself is intact for re-hosting in Phase 4 once the right transform pattern is confirmed (likely Translation via composition API instead of TranslateTransform via Storyboard).

What I left in mostly-ready state:

  • src/TeamsISO.App.WinUI/Views/MainWindow.xaml — redesigned IA, runs. Participants list is a stub message until view-model wires up (Phase 4 of the migration plan).
  • src/TeamsISO.App.WinUI/Views/SettingsDrawer.xaml + .cs — builds clean; not hosted yet.
  • src/TeamsISO.App.WinUI/Views/HelpDialog.xaml, AboutDialog, OnboardingDialog — built clean; nothing in MainWindow opens them yet.
  • src/TeamsISO.App.WinUI/Services/ThemeManager.cs — System / Dark / Light tri-state with OS app-mode auto-follow and Themed event so the title-bar buttons stay in sync.
  • src/TeamsISO.App.WinUI.Probe/ — diagnostic console for activation triage. Run if a deployment target ever shows the same activation dialog.
  • docs/preview/redesigned-mainwindow.html — interactive HTML preview for non-Windows stakeholders.

Commit list

In chronological order on main:

SHA Subject
94b0a71 docs: PRODUCT.md + DESIGN.md (ground-up GUI redesign brief)
cb1402e feat(winui3): scaffold TeamsISO.App.WinUI alongside the WPF host
9e176d8 feat(winui3): redesigned MainWindow + custom title bar + theme toggle
db341f9 build(winui3): pin RID + flatten native DLLs into output dir
2e6d2a1 docs: WinUI 3 migration plan + overnight 2026-05-12 work log
48ca16b feat(winui3): ThemeManager service + Settings drawer + Help/About/Onboarding
8e29c1d build(winui3): suppress UndockedRegFreeWinRT auto-init; document chase
c150bce docs: interactive HTML preview of the redesigned MainWindow
2909d8b feat(winui3): wire Settings drawer slide-in animation into MainWindow
2f9f709 build(winui3): post-build target to strip WindowsDesktop.App from runtimeconfig
46b1ca5 fix(preview): clip drawer behind .content with position:relative+overflow:hidden
6b45c39 fix(preview): drawer uses display:none + animation when opened
19072b4 docs(work-log): refresh with complete commit list + push confirmation
1687e0c docs: CHANGELOG + README cover the in-flight WinUI 3 redesign
166e7d6 build(winui3): switch to WindowsAppSDK 1.8 + add diagnostic probe
07f4a1b docs(work-log): add root-cause finding for activation blocker
a33f80d feat(winui3): WinUI 3 host LAUNCHES — verified rendering on Windows
eee307d docs(preview): proof-of-running WinUI 3 screenshots (dark + light)
639a7ea docs(work-log): final overnight summary — WinUI 3 host runs
27f4740 build(winui3): keep SettingsDrawer host deferred + narrow the suspect
a05c0a7 feat(winui3): SettingsDrawer hosts successfully — NavigationView swap

All twenty-one pushed to origin/main as of 2026-05-13 12:51am.

What you'll find in the tree

Teams ISO/
├─ PRODUCT.md                                   ← new, baseline product brief
├─ DESIGN.md                                    ← new, token-level design system
├─ docs/
│  ├─ preview/
│  │  └─ redesigned-mainwindow.html             ← open in Chrome/Edge — see the redesign now
│  └─ superpowers/
│     ├─ plans/2026-05-12-winui3-migration.md   ← new, full migration plan
│     └─ work-log-2026-05-12.md                 ← this file
├─ src/
│  ├─ TeamsISO.App/                             ← unchanged, the WPF host
│  └─ TeamsISO.App.WinUI/                       ← new, the WinUI 3 host
│     ├─ TeamsISO.App.WinUI.csproj
│     ├─ Program.cs                             ← custom Main with Bootstrap
│     ├─ App.xaml + App.xaml.cs
│     ├─ Assets/                                ← Inter, JetBrainsMono, dragon-mark
│     ├─ Themes/
│     │  ├─ Tokens.xaml                         ← ThemeDictionary (Dark + Light)
│     │  └─ Controls.xaml                       ← Button hierarchy + type ramp
│     ├─ Services/ThemeManager.cs               ← theme preference + brand+OS sync
│     ├─ Models/MockParticipant.cs              ← interim until VM wires
│     └─ Views/
│        ├─ MainWindow.xaml + .cs               ← redesigned per shape brief
│        ├─ SettingsDrawer.xaml + .cs           ← slide-in right drawer
│        ├─ HelpDialog.xaml + .cs               ← keyboard shortcut cheat sheet
│        ├─ AboutDialog.xaml + .cs              ← brand mark + logs / recordings shortcuts
│        └─ OnboardingDialog.xaml + .cs         ← three-step first-launch
├─ TeamsISO.sln                                 ← updated
└─ TeamsISO.Windows.slnf                        ← updated, backslash-normalized

What works right now

  • WinUI 3 build: clean
  • WPF build: still clean (verified)
  • Theme tokens: Dark + Light palettes both correct, mapped to {ThemeResource}
  • MainWindow layout: matches the approved SVG mockup pixel-by-pixel
  • Theme toggle: ThemeManager + title-bar toggle + Settings drawer picker
  • SettingsDrawer: slides in from right with 220ms ease-out-quart, dismisses on Esc or close button via CloseRequested event
  • Help / About / Onboarding: ContentDialog-based, branded
  • HTML preview: full-fidelity render of MainWindow with both themes, drawer interaction, faithful component shapes

What's blocked

Activation failure on the unpackaged .exe. Diagnostic summary:

  • dotnet --info shows .NET 8.0.301 SDK + 8.0.6/8.0.8/8.0.18 runtimes for both NETCore.App and WindowsDesktop.App
  • Get-AppxPackage Microsoft.WindowsAppRuntime.* confirms Microsoft.WindowsAppRuntime.1.6 (6000.519.329.0) is installed
  • dotnet build -c Debug produces TeamsISO.exe in src/TeamsISO.App.WinUI/bin/Debug/net8.0-windows10.0.19041.0/win-x64/
  • The .exe is x64 (PE machine 0x8664 confirmed)
  • Native runtime files (Microsoft.WindowsAppRuntime.Bootstrap.dll, WebView2Loader.dll) are flattened to the output dir alongside the .exe
  • Launching the .exe results in a Windows error dialog "TeamsISO.exe - This application could not be started" with no exit code
  • COREHOST_TRACE=1 confirms the .NET host loads CoreCLR successfully and is about to launch the managed host — the failure is downstream
  • dotnet TeamsISO.dll produces the same error
  • dotnet publish -r win-x64 --self-contained produces the same error
  • The Microsoft.WindowsDesktop.App entry got stripped from runtimeconfig.json via a post-build target — confirmed in the build output — still fails
  • The UndockedRegFreeWinRT auto-init ModuleInitializer was disabled — still fails

ROOT CAUSE IDENTIFIED (post-log-update):

I built a tiny diagnostic console probe (src/TeamsISO.App.WinUI.Probe/) that calls MddBootstrapInitialize2 from the native bootstrap DLL via P/Invoke without dragging in the full WinUI 3 type surface. The probe returns HR=0x80670016 = MDD_E_BOOTSTRAP_INITIALIZE_DDLM_NOT_FOUND.

Translation: the framework package (Microsoft.WindowsAppRuntime.1.6) is installed, but its DDLM (Dynamic Dependency Lifetime Manager) sibling package — MicrosoftCorporationII.WinAppRuntime.Main.1.6 — is NOT. Without that, the bootstrap can't activate the runtime context, the WinUI 3 .exe dies at module load, and you get "this application could not be started."

Looking at Get-AppxPackage, this machine has Main.1.5 (5001.373) and Main.1.8 (8000.836) installed, but NO Main.1.6.

Three fixes, pick one:

  1. Install the 1.6 DDLM redistributable. Download Microsoft.WindowsAppRuntime.1.6 from https://aka.ms/windowsappsdk/1.6/latest/windowsappruntimeinstall-x64.exe and run it. After it installs, Get-AppxPackage MicrosoftCorporationII.WinAppRuntime.Main.1.6 should return a row.
  2. Switch the .csproj to WindowsAppSDK 1.8 (the package version would be Microsoft.WindowsAppSDK 1.8.260508005, and the major.minor in Program.cs becomes 0x00010008). 1.8 IS fully installed on this machine.
  3. Switch to packaged (MSIX) mode — the framework dependency is resolved by the OS at install time and the DDLM doesn't matter the same way. Means giving up the existing MSI installer path for now.

Option 2 is the fastest. Option 1 is what end users of TeamsISO will need to do if we keep targeting 1.6 LTS.

To reproduce the diagnosis from scratch:

cd src/TeamsISO.App.WinUI.Probe
dotnet build
dotnet bin/Debug/net8.0-windows/win-x64/TeamsISO.App.WinUI.Probe.dll

What I did NOT do

  • Touch the WPF host. Your running build is intact. The May 2026 batch ships as-is.
  • Touch Teams orchestration. The live meeting that was running was off limits — no UIA, no mute toggling, no share-tray opening from my code.
  • Migrate view-models or wire the engine into the WinUI host. Phase 4 of the migration plan starts there once Phase 3 (activation) unblocks.
  • Migrate the DataGrid (Phase 5). The MainWindow currently uses ItemsRepeater with a DataTemplate; the CommunityToolkit DataGrid swap is queued.
  • Migrate Notes / Preview / Presets windows (Phase 6 remainder).
  • Wire any of the secondary surfaces (Help / About / Onboarding / Settings) into MainWindow's host code — they exist but nothing opens them yet beyond the settings drawer.

Suggested first session tomorrow

  1. Look at the screenshots: docs/preview/winui3-mainwindow-light.png and docs/preview/winui3-mainwindow-dark.png — proof shots of the live .exe. If the design is right, the rest is execution.
  2. Run it yourself: from a fresh shell, dotnet build src/TeamsISO.App.WinUI then run the .exe at src/TeamsISO.App.WinUI/bin/Debug/net8.0-windows10.0.19041.0/win-x64/TeamsISO.exe. The redesigned shell should appear at 1280×780.
  3. Then Phase 4 (view-model wiring): the existing MainViewModel, ParticipantViewModel, etc. in src/TeamsISO.App/ViewModels/ use WPF's System.Windows.Threading.Dispatcher. Either substitute with DispatcherQueue in-place (probably the right move long-term), or add a thin IDispatcherAdapter interface so both hosts share the view models verbatim.
  4. Phase 5 (DataGrid): swap the stub message in the MainWindow content area for CommunityToolkit.WinUI.UI.Controls.DataGrid bound to MainViewModel.Participants. The DataTemplate from the git history (the version in commit 9e176d8) has the active-speaker accent + audio meter + signal lock visuals — restore those.
  5. Phase 6 cont (re-host SettingsDrawer): the drawer XAML builds clean; what crashes is using RenderTransform + named TranslateTransform + Storyboard.TargetName binding. Try Translation via ElementCompositionPreview.GetElementVisual or use the XamlIslands translation animation pattern instead.
  6. Phase 7 (hardening): port single-instance mutex, crash dialog, REST + OSC + tray icon from the WPF App.xaml.cs.

Honest assessment

The redesign is real, on-disk, building cleanly, AND RUNNING. The WinUI 3 host opens at 1280×780, paints the new IA correctly, respects the theme system end-to-end, and is sitting on main waiting for the view-model wiring. The diagnostic probe (TeamsISO.App.WinUI.Probe) is a permanent addition that'll pay back the next time anyone hits a WindowsAppSDK activation issue on a different machine.

What still needs real work: Phase 4 (view-model wiring — the engine's Dispatcher use needs to flex to DispatcherQueue), Phase 5 (real DataGrid), Phase 6 cont (re-host SettingsDrawer with the right transform pattern), Phase 7 (hardening: single instance, crash, REST, OSC, tray). None of these are blocked anymore — they're all execution work.

The biggest risk to the v1.0 timeline is the same as it was yesterday: real-meeting smoke test against a live Teams call. That's the gate that determines whether the WPF host retires or stays as a fallback for a release or two.

— end of log — Claude, 2026-05-13 ~12:45am