dragon-iso/docs/superpowers/plans/_NEXT.md
Zac Gaetano b2666236ec feat(ui): toast feedback for settings actions; refresh _NEXT.md
Adds a small auto-dismissing pill notification at the bottom-center of the participants area: 'Settings saved' on Apply Changes, 'Transcoder topology applied — restart Teams to take effect' after the one-click NDI groups setup. ToastViewModel owns its own DispatcherTimer and resets the dismissal countdown on successive calls, so the most recent message is always the one visible. Hooked into MainViewModel and threaded into GlobalSettingsViewModel via constructor injection.

_NEXT.md rewritten to reflect the May 2026 hardening pass: separates engine / UI / networking / Phase E.1 / diagnostics / CI / tests sections, lists every shipped item, and re-prioritizes the remaining work (Phase E.2-E.3 embedded Teams, code-signing the MSI, refresh-discovery affordance, output thumbnail previews, settings panel UX, auto-disable on departure, operator presets).
2026-05-09 09:30:04 -04:00

7 KiB
Raw Blame History

Plan Backlog

Completed phases

  • Phase A — Engine Foundation (tag: phase-a-complete) — domain model, parsers, participant tracker, frame processor, config, fakes, CI gate.
  • Phase B-1 — Pipeline Orchestration (tag: phase-b-1-complete) — NdiReceiver, NdiSender, ExponentialBackoff, NdiRuntimeProbe, IsoPipeline supervisor, IsoController.
  • Phase B-2 — Real NDI Interop (tag: phase-b-2-complete) — NdiInteropPInvoke against NDI 6 SDK, managed BGRA scaler, TeamsISO.Console headless smoke runner, NdiVersion constants.
  • Phase C — WPF UI (tag: phase-c-complete) — MVVM helpers, ParticipantViewModel, GlobalSettingsViewModel, AlertBannerViewModel, MainViewModel, MainWindow XAML with participants DataGrid + settings sidebar + alert banner, App.xaml DI bootstrap.
  • Hardening + brand pass — May 2026 — see "Done since the May 2026 hand-off" below.
  • Phase D — WiX Installer & Forgejo release — WiX v5 MSI scaffold, ARP icon wired, tag-push release workflow that builds + uploads MSI as a release asset.

Done since the May 2026 hand-off

Engine

  • Forward-slash project paths in TeamsISO.sln so .slnf filters work on Windows MSBuild.
  • NdiNativeLibraryResolver resolves Processing.NDI.Lib.x64.dll via NDI_RUNTIME_DIR_V6 (with V5 / V4 fallbacks), so the engine starts on installs where the NDI dir isn't on PATH.
  • NdiVersion.ExpectedRuntimeVersionPrefix updated to match the shipping NDI 6 banner format (NDI SDK WIN64 …).
  • NdiSourceParser accepts current Teams desktop's MS Teams - <name> brand format (plus legacy Teams and defensive Microsoft Teams); reserved suffixes (Active Speaker, Audio, Audio Mix, Screen Share) are recognized in both legacy and dash-prefixed forms.
  • NDI groups end-to-end (discovery + output): INdiInterop.CreateFinder(string?) and CreateSender(string, string?) populate p_groups; IsoController threads them through from EngineConfig.NdiGroups.
  • ParticipantTracker surfaces NdiSourceKind.ActiveSpeaker as a synthetic routable row named "Active Speaker" with a deterministic v5-GUID Id derived from auto-mix:<machine>.
  • IsoHealthStats wired end-to-end: live receiver/sender/processor refs published from the inner pipeline, frame counters / source resolution / running FPS (30-frame moving window) / drops + duplicates / pipeline state surfaced via IsoController.GetStats.
  • Rolling daily file logging at %LOCALAPPDATA%\TeamsISO\Logs\ via Serilog.Sinks.File.

UI

  • WPF rebuilt around Wild Dragon brand × Microsoft Teams flush layout — left rail with real dragon-mark logo (clickable → About dialog), chromeless title bar with custom min/max/close caption controls, cyan accent.
  • Inter Variable + JetBrains Mono Variable bundled as <Resource> so typography matches wilddragon.net regardless of system fonts.
  • App icon teamsiso.ico (7 sizes) on taskbar / window / About / WiX MSI ARP.
  • Single-instance enforcement via per-user named Mutex with broadcast bring-to-front.
  • Empty-state placeholder when no Teams sources are visible (faded dragon + checklist).
  • Live frame counters in the Source / Live columns (in/out/drops, source resolution, running FPS).
  • Per-pipeline state surfaced in the ISO toggle: ● LIVE (cyan), ● ERROR (coral), ● NO SIGNAL (amber), (processing).
  • "Stop all ISOs" emergency button at the participants header.
  • Hide-(Local) toggle so the user's own self-preview is filtered from the participants list.
  • Window position / size / state persisted to %LOCALAPPDATA%\TeamsISO\window.json, multi-monitor safe.
  • Tooltips on every interactive control in the settings panel + per-row textbox + ISO toggle.

Networking automation

  • One-click transcoder topology button in Settings: writes %APPDATA%\NDI\ndi-config.v1.json so all local senders broadcast on teamsiso-input and local receivers see both public + teamsiso-input. Engine settings auto-flip to receive-from teamsiso-input and emit-on public. Atomic write with timestamped backup of the prior config.

Phase E.1 starter (embedded Teams)

  • Spec at docs/superpowers/specs/2026-05-08-embedded-teams-orchestration.md (three-phase rollout: launcher → window orchestration → in-app meeting controls).
  • Rail "Launch / Stop Teams" toggle: launches via ms-teams: URI / ms-teams.exe / classic Update.exe --processStart, asks to confirm WM_CLOSE of all running Teams windows when toggled while Teams is up.

Diagnostics

  • TeamsISO.Console --list-sources enumerates raw NDI source names visible to the local finder for ~5 seconds; debugging tool for setup issues.
  • TeamsISO.Console --version prints engine version + build SHA + .NET + OS + NDI runtime banner + exit-code legend, for support tickets.
  • About dialog inside the WPF host with the same info.

CI / Release / Docs

  • Forgejo CI is green: actions/upload-artifact@v3 (Forgejo doesn't support v4 yet).
  • .forgejo/workflows/release.yml: tag-push (v*.*.*) builds + tests + publishes + builds the MSI on a Windows runner and attaches it to the auto-created Forgejo release via the REST API.
  • docs/RELEASING.md walks through cutting a release and flags the code-signing TODO.

Tests

  • 78 unit tests passing; 9 NDI integration tests gated behind --filter requires=ndi (runtime probe, finder + sender lifecycle on default and custom groups, loopback discovery, full pipeline frame round-trip asserting 1080p normalization).

Next

  1. Phase E — Embedded Teams orchestration (continued). E.2 (window orchestration: hide Teams' main window once launched, forward keyboard shortcuts via SendInput) and E.3 (Microsoft Graph or UIAutomation in-call controls) per the spec at docs/superpowers/specs/2026-05-08-embedded-teams-orchestration.md.

  2. Code-signing the MSI. installer/TeamsISO.Installer.wixproj has a SignOutput property hook but no cert; for v1.0 wire a signtool invocation from a CI secret. SmartScreen will warn on first launch until that lands.

  3. Toast / inline feedback for "Apply Changes" and other settings actions (currently silent unless an error occurs).

  4. Rail "Refresh sources" affordance — force a discovery rescan, useful right after applying a new transcoder topology when the operator wants Teams to reconnect.

  5. Output thumbnail previews in the participant DataGrid — small live-frame previews of each ISO output. Complex (needs WPF WriteableBitmap from the Pipeline's last ProcessedFrame); deferred until v1.5.

  6. Settings panel UX tightening. It's getting long; consider an Accordion or tabs for OUTPUT FORMAT / NDI NETWORK / DISPLAY rather than one scrolling stack.

  7. Auto-disable on participant departure (configurable). Today an ISO stays "enabled" if its participant leaves; the source goes null. Optional toggle: tear down the pipeline automatically when a participant has been gone past the rename window.

  8. Operator presets. "Save current ISO assignments to a named preset" + "Load preset on next launch" so an operator with a recurring show doesn't have to re-toggle every meeting.