- 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>
261 lines
13 KiB
Markdown
261 lines
13 KiB
Markdown
# 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
|