docs(next-steps): cold-start launch fix verified — 3 launch paths green
Some checks failed
CI / build-and-test (push) Failing after 26s
Some checks failed
CI / build-and-test (push) Failing after 26s
This commit is contained in:
parent
09e5b59dfd
commit
e01fa364e8
1 changed files with 112 additions and 66 deletions
178
NEXT_STEPS.md
178
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
|
**Origin tip: `09e5b59` — fix: cold-start discovery + installer shortcuts +
|
||||||
`docs/shapes/2026-05-13-teamsiso-v2-studio-terminal.md`. Aesthetic
|
single-instance hardening.**
|
||||||
register: "broadcast-engineering instrument" — Linear's keyboard-first
|
|
||||||
density × Avid console legibility. Goes hard against the "screams AI"
|
|
||||||
failure mode.
|
|
||||||
|
|
||||||
**WinUI 3 replatform: abandoned.** The early-May scoping concluded that
|
The "I install, I click the shortcut, no participants" bug is fixed. Three
|
||||||
the redesign is purely view-layer (XAML + theme tokens + view-models);
|
independent changes in one commit because all three were chasing the same
|
||||||
doing it in WPF is strictly less work than fighting WinUI 3 activation +
|
operator report:
|
||||||
DataGrid replacement. The migration plan + bootstrap probe are archived
|
|
||||||
under `docs/archive/` for the record.
|
|
||||||
|
|
||||||
**Shell:**
|
1. **`NdiDiscoveryService.RunAsync` — immediate first poll + fast ramp.**
|
||||||
- Default Windows title bar (no custom chromeless caption buttons).
|
`PeriodicTimer.WaitForNextTickAsync` waits the full interval before its
|
||||||
- 32px header — Wild Dragon mark + "TeamsISO" wordmark left; three icon
|
first tick, so for a 500ms discovery interval the operator stared at
|
||||||
buttons right (⌘K command palette, theme toggle, settings gear).
|
"no ndi sources yet" for half a second on every cold start. Now: poll
|
||||||
- 40px transport strip — single mono line:
|
once up front (picks up whatever the NDI runtime has already cached),
|
||||||
`● 02:14:32 PART 4 · LIVE 2 CTRL :9755`. Cyan dot + timer only when
|
then run a 200ms inner loop for ~3 seconds while mDNS replies trickle
|
||||||
at least one ISO live.
|
in, then settle to the operator-configured interval. Both loops share
|
||||||
- Body — alert banner + update banner + action toolbar + participants
|
a try/finally so the NDI finder is always disposed.
|
||||||
DataGrid + (conditional) meeting bar at the bottom.
|
2. **`MainViewModel.IsDiscovering` + new empty-state copy.** New boolean
|
||||||
- Settings — slide-over drawer (420px from right) with OUTPUT / NETWORK /
|
property, true for 8s after engine start as long as no participants
|
||||||
APP tabs. Scrim click or Esc dismisses.
|
have arrived. `MainWindow.xaml` swaps the empty-state copy on this
|
||||||
- v1 leftovers (72px rail, 380px permanent settings panel, six-column
|
binding:
|
||||||
footer) are gone.
|
- `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:**
|
**MSI:** `installer/bin/x64/Release/TeamsISO-Setup-0.9.0-rc5.msi` (372 KB).
|
||||||
- `Themes/Theme.Dark.xaml` + `Themes/Theme.Light.xaml` — color brushes
|
Already installed on this machine. Force-reinstall over an existing copy
|
||||||
only.
|
needs `REINSTALL=ALL REINSTALLMODE=amus` flags on msiexec because the wxs
|
||||||
- `Themes/WildDragonTheme.xaml` — styles + control templates (no color
|
`Version` is pinned to `1.0.0.0` and MajorUpgrade no-ops on same-version.
|
||||||
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`.
|
|
||||||
|
|
||||||
**Task 39 — participants table v2 (LANDED).**
|
## Verified launch paths (2026-05-16 11:22)
|
||||||
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).
|
|
||||||
|
|
||||||
**Task 40 — Ctrl+K command palette (LANDED).**
|
Tested by killing every TeamsISO process, then launching via each
|
||||||
`Views/CommandPaletteWindow.xaml` + `ViewModels/CommandPaletteViewModel.cs`
|
mechanism in turn and probing `http://localhost:9755/participants` after
|
||||||
ship a centered 560×360 floating window with fuzzy search across Quick /
|
4 seconds:
|
||||||
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.
|
|
||||||
|
|
||||||
**Hotkeys:**
|
| Mechanism | Result |
|
||||||
- `F1` — help / cheat sheet
|
|---|---|
|
||||||
- `Ctrl+K` (also `Ctrl+P`) — command palette
|
| Start Menu shortcut (`…\Wild Dragon\TeamsISO.lnk`) | OK — 2 participants |
|
||||||
- `Ctrl+T` — toggle theme (dark ↔ light)
|
| Public Desktop shortcut (`C:\Users\Public\Desktop\TeamsISO.lnk`) | OK — 2 participants |
|
||||||
- `Ctrl+M` — drop marker into every active recording
|
| Direct `.exe` double-click in Program Files | OK — 2 participants |
|
||||||
- `Ctrl+R` — refresh NDI discovery
|
|
||||||
- `Ctrl+Shift+S` — panic-stop every ISO
|
|
||||||
- `1`–`9` / `NumPad 1`–`9` — toggle the Nth visible participant's ISO
|
|
||||||
|
|
||||||
## 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:
|
## Open items
|
||||||
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.
|
|
||||||
|
|
||||||
## 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
|
```powershell
|
||||||
dotnet build TeamsISO.Windows.slnf -c Release
|
cd "C:\Users\zacga\Documents\Claude\Projects\Teams ISO"
|
||||||
.\src\TeamsISO.App\bin\Release\net8.0-windows\TeamsISO.exe
|
|
||||||
|
# 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`
|
If anything regresses the v2 shell, the rollback point for the WPF v1 shell
|
||||||
wrap the build + test + push flow.
|
(recording axed) is `1d1ce6a`; the v2-shell-without-table-redesign rollback
|
||||||
|
point is `c271303`.
|
||||||
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.
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue