From e01fa364e8238a1fc9a321f219414db5310ac813 Mon Sep 17 00:00:00 2001 From: Zac Gaetano Date: Sat, 16 May 2026 11:24:37 -0400 Subject: [PATCH] =?UTF-8?q?docs(next-steps):=20cold-start=20launch=20fix?= =?UTF-8?q?=20verified=20=E2=80=94=203=20launch=20paths=20green?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NEXT_STEPS.md | 178 +++++++++++++++++++++++++++++++------------------- 1 file changed, 112 insertions(+), 66 deletions(-) diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index 2bf81e2..f79767a 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -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, 1–9 / NumPad 1–9 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`.