docs(next-steps): cold-start launch fix verified — 3 launch paths green
Some checks failed
CI / build-and-test (push) Failing after 26s

This commit is contained in:
Zac Gaetano 2026-05-16 11:24:37 -04:00
parent 09e5b59dfd
commit e01fa364e8

View file

@ -1,81 +1,127 @@
# Where we left off — v2 "Studio Terminal" shell complete (2026-05-15)
# Where we left off — cold-start launch fix shipped (2026-05-16 morning)
## What's done on main
## What just landed (verified on this machine)
**v2 shape locked.** Approved brief at
`docs/shapes/2026-05-13-teamsiso-v2-studio-terminal.md`. Aesthetic
register: "broadcast-engineering instrument" — Linear's keyboard-first
density × Avid console legibility. Goes hard against the "screams AI"
failure mode.
**Origin tip: `09e5b59` — fix: cold-start discovery + installer shortcuts +
single-instance hardening.**
**WinUI 3 replatform: abandoned.** The early-May scoping concluded that
the redesign is purely view-layer (XAML + theme tokens + view-models);
doing it in WPF is strictly less work than fighting WinUI 3 activation +
DataGrid replacement. The migration plan + bootstrap probe are archived
under `docs/archive/` for the record.
The "I install, I click the shortcut, no participants" bug is fixed. Three
independent changes in one commit because all three were chasing the same
operator report:
**Shell:**
- Default Windows title bar (no custom chromeless caption buttons).
- 32px header — Wild Dragon mark + "TeamsISO" wordmark left; three icon
buttons right (⌘K command palette, theme toggle, settings gear).
- 40px transport strip — single mono line:
`● 02:14:32 PART 4 · LIVE 2 CTRL :9755`. Cyan dot + timer only when
at least one ISO live.
- Body — alert banner + update banner + action toolbar + participants
DataGrid + (conditional) meeting bar at the bottom.
- Settings — slide-over drawer (420px from right) with OUTPUT / NETWORK /
APP tabs. Scrim click or Esc dismisses.
- v1 leftovers (72px rail, 380px permanent settings panel, six-column
footer) are gone.
1. **`NdiDiscoveryService.RunAsync` — immediate first poll + fast ramp.**
`PeriodicTimer.WaitForNextTickAsync` waits the full interval before its
first tick, so for a 500ms discovery interval the operator stared at
"no ndi sources yet" for half a second on every cold start. Now: poll
once up front (picks up whatever the NDI runtime has already cached),
then run a 200ms inner loop for ~3 seconds while mDNS replies trickle
in, then settle to the operator-configured interval. Both loops share
a try/finally so the NDI finder is always disposed.
2. **`MainViewModel.IsDiscovering` + new empty-state copy.** New boolean
property, true for 8s after engine start as long as no participants
have arrived. `MainWindow.xaml` swaps the empty-state copy on this
binding:
- `IsDiscovering=true` → "scanning for ndi sources…" with a cyan dot
- `IsDiscovering=false` → "no ndi sources visible — is teams in a
meeting?" + Refresh CTA
The old copy was being shown immediately at launch even when discovery
just hadn't run yet, which read as "broken."
3. **Single-instance mutex moved from `Local\` to `Global\`.** On admin-user
boxes with UAC effectively disabled, launches from different parents
can land in slightly different security contexts and a `Local\` named
mutex can be invisible to a sibling. `Global\` is system-wide and
integrity-agnostic; both processes see the same mutex regardless of
how they were spawned.
4. **`installer/Package.wxs` — Desktop shortcut component added.** Now
installs both `C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Wild Dragon\TeamsISO.lnk`
AND `C:\Users\Public\Desktop\TeamsISO.lnk`. Both point at the installed
exe under `C:\Program Files\Wild Dragon\TeamsISO\TeamsISO.exe`. (Previously
only the Start Menu component existed; on this machine even that wasn't
visibly materializing because the older WiX `Advertise` default left it
as a stub.)
**Theme system:**
- `Themes/Theme.Dark.xaml` + `Themes/Theme.Light.xaml` — color brushes
only.
- `Themes/WildDragonTheme.xaml` — styles + control templates (no color
brushes; every brush ref is `DynamicResource`).
- `Services/ThemeManager.cs` — swaps the merged dictionary at runtime;
reads `HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme`
for System mode; subscribes to `SystemEvents.UserPreferenceChanged`;
persists via `UIPreferences.Theme`.
**MSI:** `installer/bin/x64/Release/TeamsISO-Setup-0.9.0-rc5.msi` (372 KB).
Already installed on this machine. Force-reinstall over an existing copy
needs `REINSTALL=ALL REINSTALLMODE=amus` flags on msiexec because the wxs
`Version` is pinned to `1.0.0.0` and MajorUpgrade no-ops on same-version.
**Task 39 — participants table v2 (LANDED).**
Five columns: 24px state LED, name + codec caption, 110px audio meter,
130px mono output name, 100px ISO pill. 52px rows. Full-row
active-speaker tint (replaces the v1 left-stripe).
## Verified launch paths (2026-05-16 11:22)
**Task 40 — Ctrl+K command palette (LANDED).**
`Views/CommandPaletteWindow.xaml` + `ViewModels/CommandPaletteViewModel.cs`
ship a centered 560×360 floating window with fuzzy search across Quick /
Teams / Presets / Output / Network / App categories. ↑/↓ navigates,
Enter invokes, Esc closes. The header ⌘K button and Ctrl+K (also Ctrl+P)
keyboard binding both open it.
Tested by killing every TeamsISO process, then launching via each
mechanism in turn and probing `http://localhost:9755/participants` after
4 seconds:
**Hotkeys:**
- `F1` — help / cheat sheet
- `Ctrl+K` (also `Ctrl+P`) — command palette
- `Ctrl+T` — toggle theme (dark ↔ light)
- `Ctrl+M` — drop marker into every active recording
- `Ctrl+R` — refresh NDI discovery
- `Ctrl+Shift+S` — panic-stop every ISO
- `1``9` / `NumPad 1``9` — toggle the Nth visible participant's ISO
| Mechanism | Result |
|---|---|
| Start Menu shortcut (`…\Wild Dragon\TeamsISO.lnk`) | OK — 2 participants |
| Public Desktop shortcut (`C:\Users\Public\Desktop\TeamsISO.lnk`) | OK — 2 participants |
| Direct `.exe` double-click in Program Files | OK — 2 participants |
## What's queued
All three discover the Teams meeting's NDI sources (Active Speaker +
Brendon Power in today's testing) within the cold-start grace window.
Pre-1.0 cut is gated on:
1. Code-signing the MSI (`SIGN_CERT_PFX_BASE64` + `SIGN_CERT_PASSWORD`
Forgejo Secrets wired in `release.yml`).
2. A real-meeting smoke pass on a host with a live NDI runtime.
## Open items
## Build + run
**Pre-1.0 cut is gated on:**
1. Code-signing the MSI. `SIGN_CERT_PFX_BASE64` + `SIGN_CERT_PASSWORD`
need to be added to Forgejo Actions Secrets for the release.yml
workflow to start producing signed MSIs. Without that, downstream
users get the "Windows protected your PC" SmartScreen warning.
2. Real-meeting smoke pass on a non-dev host with a live NDI runtime.
**Other items still on the queue (from issue #1 polish-pass status):**
- **Item 21**`TeamsLauncher` fallback chain test coverage. Needs an
`IProcessLauncher` seam refactor before the URI handler → AppX → process-exe
order can be unit-pinned. Half-day of work; not blocking.
## Where the layout sits
**Shell:** Default Windows title bar; 32px header (Wild Dragon mark +
wordmark + ⌘K / theme / settings icons); 40px transport strip
(`● 02:14:32 PART 4 · LIVE 2 CTRL :9755`); body = alert/update banners +
action toolbar + participants DataGrid + conditional meeting bar.
**Participants DataGrid — 7 columns:** State LED (24) · Preview (106) ·
Participant (*) · Audio (110) · Output (130) · CFG/gear (56) ·
ISO toggle (124, rounded-rect, "Enable" / "● LIVE").
**Theme:** `Themes/Theme.Dark.xaml` + `Themes/Theme.Light.xaml` split from
`WildDragonTheme.xaml`; `ThemeManager` runtime-swaps the merged dictionary
and follows `HKCU\...\Personalize\AppsUseLightTheme`.
**Hotkeys:** F1 help, Ctrl+K / Ctrl+P command palette, Ctrl+T theme
toggle, Ctrl+R refresh, Ctrl+Shift+S panic stop, 19 / NumPad 19 toggle
Nth participant ISO.
## Build, install, run cheatsheet
```powershell
dotnet build TeamsISO.Windows.slnf -c Release
.\src\TeamsISO.App\bin\Release\net8.0-windows\TeamsISO.exe
cd "C:\Users\zacga\Documents\Claude\Projects\Teams ISO"
# Build + test
dotnet build TeamsISO.sln -c Release # 0 warnings / 0 errors
dotnet test TeamsISO.sln -c Release --no-build # 246/246 passing
# Publish + MSI
$v = "0.9.0-rcN"
dotnet publish src/TeamsISO.App/TeamsISO.App.csproj `
-c Release -r win-x64 --self-contained false `
-o publish/TeamsISO /p:Version=$v
dotnet build installer/TeamsISO.Installer.wixproj -c Release /p:Version=$v
# Install (force overwrite same-version)
Start-Process msiexec.exe -Verb RunAs -Wait -ArgumentList `
'/i', '"installer\bin\x64\Release\TeamsISO-Setup-' + $v + '.msi"', `
'/qn', '/norestart', 'REINSTALL=ALL', 'REINSTALLMODE=amus'
# Launch (any of these)
Start-Process "C:\Program Files\Wild Dragon\TeamsISO\TeamsISO.exe"
Start-Process "C:\Users\Public\Desktop\TeamsISO.lnk"
Start-Process "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Wild Dragon\TeamsISO.lnk"
```
The shipped helpers `build-and-test.ps1` and `commit-and-push.ps1`
wrap the build + test + push flow.
If something regresses, `1d1ce6a` is the rollback point for the WPF v1
shell (recording was axed at that commit), and `c271303` is the v2
shell-without-table-redesign rollback point.
If anything regresses the v2 shell, the rollback point for the WPF v1 shell
(recording axed) is `1d1ce6a`; the v2-shell-without-table-redesign rollback
point is `c271303`.