diff --git a/HANDOFF.md b/HANDOFF.md index 5edf406..c1d775d 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,91 +1,31 @@ # HANDOFF — Session State ## Branch -`main` — clean, last push `8951141` (TASK 10 shipped). TRAX meter fix pushed `e06bfa4`. -All Control Surface UX work is **uncommitted** — build passes 0 warnings/0 errors. - -## ⚠️ IN FLIGHT: repo-wide Backdrop→Background rename (multi-session) -Models already renamed (`Source.IsBackground`, `Scene.HasBackground`/`CustomBackgroundPath`, -`SceneCatalog.HasBackground`, `Source` enum `Background`). Status per file: -- ✅ `ViewModels/MainViewModel.cs` — full case-sensitive rename done; compiles clean. -- ✅ `MainWindow.xaml.cs` + `MainWindow.xaml` — renamed; full solution builds 0 warnings/0 errors. -- ✅ `Services/Compositor/SceneCompositor.cs` — CS0128 duplicate locals fixed. -- ⏳ `Services/LayoutStore.cs` — C# members renamed, but DB column strings - (`HasBackdrop`/`IsBackdrop`) are **schema** and intentionally still say Backdrop: - renaming them needs a real migration (new user_version) touching every existing DB. - The V5-backfill unit test's raw CREATE TABLE must keep `IsBackdrop` to match — - blanket-renaming it breaks `V5_Database_Backfill_Removes_NonLive_Backgrounds` - (verified: migration can't see flags, Live source loses `IsBackground`). -- ✅ `ytLive.Tests` — all 5 files blanket-renamed (class/method/var/comment names + - C# property accesses); `BackdropTests.cs` → `BackgroundTests.cs`. Tests: 207/208 pass; - the only red is pre-existing `AudioPipelineTests.Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback` - (unrelated gain-math assert at AudioPipelineTests.cs:373, zero backdrop occurrences). -- Pending elsewhere: leftover "backdrop" doc comments (`Source.cs`, `SceneCatalog.cs`, - `ScreenCaptureManager.cs`, `ScreenCaptureFrameSource.cs`, `MainWindow.xaml:769`), - asset files + csproj (`Assets/*-backdrop.jpg` — pack-URI strings in MainViewModel now say - `-background.jpg` so default-scene seeding silently no-ops until assets+csproj are renamed). +`main` — clean at `4b9a8e5` (Control Surface UX: pill toggle, background rename, per-scene properties). ## What shipped this session -1. **TASK 10 — Polar billing + Velopack auto-updates (steps 1–7)** — full license key activation flow -2. **TRAX meter double-attenuation fix** — removed redundant slider multiplication +1. **TASK 10 — Polar billing + Velopack auto-updates (steps 1–7)** +2. **TRAX meter double-attenuation fix** 3. **LAN infrastructure documented** — all servers in `ai.md` + `CREDENTIALS.md` -4. **llamavault NFS/SMB diagnosis** — zombie SMB session from power outage, fixed by killing stale PID +4. **llamavault NFS/SMB diagnosis** +5. **Control Surface UX** — all 10 phases complete (StagedScene/LiveScene, thumbnails, edit gating, transitions, brand rename) +6. **Sliding pill toggle** — green ON (#22c55e) / red OFF (#ef4444), replaces checkbox +7. **Backdrop → Background** — full C# rename, SQL column rename with migration, asset files renamed, `Source.IsBackground` `new` → `override` fix, legacy "Backdrop" display name migration +8. **Geometry mismatch error** — red text when custom background aspect ratio >5% off 16:9 +9. **Per-scene background properties** — pill toggle + custom path persist per-scene via Settings table -## Active work: Control Surface UX (TASK 19/23 merged) — ALL PHASES COMPLETE - -**Design philosophy:** Director's control surface, not an editor. Five scene monitors above one central live monitor. Click thumbnail = transition (live) or stage (offline). Edit mode only when offline. Live/Recording = read-only. Right-click + drag locked when live. - -### Phases completed (ALL) -1. ✅ **Phase 1:** `StagedScene`/`LiveScene` split + `IsEditMode` in MainViewModel -2. ✅ **Phase 2:** Left panel two-state (edit: layers+props, live: chat) -3. ✅ **Phase 3:** Right panel eliminated -4. ✅ **Phase 4:** Thumbnail strip above center monitor + `Scene.Snapshot` + placeholder snapshots -5. ✅ **Phase 5:** Edit-mode gating (drag/resize/context menus blocked when live) -6. ✅ **Phase 6:** `TransitionService.cs` (Cut/Fade/Move) + `SceneCompositor.BlendFrames()` -7. ✅ **Phase 7:** `FramePump` integrated with `TransitionService` -8. ✅ **Phase 8:** Thumbnail click → `TransitionToScene()` wiring -9. ✅ **Phase 9:** Brand rename "ytLlive" → "LlamaCasty" (user-visible strings) -10. ✅ **Phase 10:** `LayoutStore.SaveTransitionSettings()` / `LoadTransitionSettings()` - -### Key decisions -- **Mode is implicit:** offline = edit, live/recording = read-only. No toggle button. -- **Left panel = one panel, two states:** offline → LAYERS + PROPERTIES; live → YouTube Live Chat (entire panel replaced, never coexists) -- **No (=>) transition button:** clicking a thumbnail directly triggers the transition -- **Thumbnail glow:** active scene gets brand-red `#e94560` border via `IsStaged` data trigger -- **Right panel eliminated:** chat moved to left panel (live mode only) -- **5 thumbnails above center monitor**, 120px height, uniform grid. Placeholder colored boxes until compositor snapshots added. -- **Transitions:** Cut + Fade + Move (v1). Go Live always = Cut. Duration persisted to Settings table. -- **Brand rename:** "ytLlive" → "LlamaCasty" across all XAML, VM strings, service strings. File paths (`%APPDATA%\ytLlive\`) intentionally NOT renamed. - -### Architecture changes -- `ActiveScene` → split into `StagedScene` (central monitor, editable) + `LiveScene` (encoder output, read-only) -- `IsEditMode` = derived property: `StreamStatus == StreamStatus.Offline` -- `TransitionService` — transition state machine with Start/Tick/BlendFrame -- `SceneCompositor.BlendFrames()` — crossfade between two VideoFrames -- `Scene.Snapshot` + `Scene.IsStaged` — thumbnail image and staged indicator -- `FramePump` — now accepts `TransitionService` + `fromSceneProvider`, blends during transitions - -### Files changed -- `ViewModels/MainViewModel.cs` — StagedScene/LiveScene split, IsEditMode, TransitionToScene, snapshots, brand rename, transition persistence -- `MainWindow.xaml` — 2-col layout, thumbnail strip, left panel two-state, right panel deleted, brand rename -- `MainWindow.xaml.cs` — Thumbnail click, edit-mode gating, context menu gating, dead code cleanup -- `Models/Scene.cs` — Snapshot, IsStaged properties -- `Services/Compositor/SceneCompositor.cs` — BlendFrames() static method -- `Services/Encoder/FramePump.cs` — transition support in render loop -- `Services/TransitionService.cs` — **new** — Cut/Fade/Move transition engine -- `Services/LayoutStore.cs` — SaveTransitionSettings/LoadTransitionSettings/UpsertSetting - -### What still needs testing -- Runtime visual testing (need Windows display to run) -- Actual transition animation quality (Fade + Move) -- Thumbnail generation from real scene compositor (currently placeholder colors) -- Drag-reorder of thumbnails (not yet implemented) +## Background properties (fully shipped) +- `Scene.UseDefaultBackground` (bool, default true) + `Scene.CustomBackgroundPath` (string?) +- Persisted as `BackgroundUseDefault_{sceneId}` / `BackgroundPath_{sceneId}` in Settings table +- Pill toggle ON → loads default asset from DB; OFF → loads custom file path +- Custom path preserved when toggled back ON (not cleared) +- Geometry mismatch: aspect ratio check ±5% of 16:9, shows expected 1920×1080 ## Build ```bash taskkill.exe /F /IM ytLive.exe # if running -"/mnt/c/Program Files/dotnet/dotnet.exe" build "C:\Users\gramp\Documents\Code\projects\ytLive\ytLive.csproj" --no-restore +"/mnt/c/Program Files/dotnet/dotnet.exe" build "C:\Users\gramp\Documents\Code\projects\ytLive\ytLive.csproj" ``` **0 warnings, 0 errors.** @@ -102,11 +42,10 @@ taskkill.exe /F /IM ytLive.exe # if running | Key prefix | `LCYT-` | ## Next steps -1. **Visual testing** — run on Windows display, verify layout, transitions, thumbnail strip +1. **Visual testing** — run on Windows display, verify pill toggle, background properties per-scene 2. **Thumbnail drag-reorder** — reorder scenes via drag on thumbnail strip 3. **Real snapshot generation** — replace placeholder colors with compositor-rendered thumbnails 4. **Transition dropdown UI** — add XAML control to pick transition type + duration -5. **Commit** — all this work needs to be committed once visually verified ## v1 vision > A streaming tool that's intuitive and ready to go out-the-gate with nothing held back.