# HANDOFF — Session State ## Branch / Commit State **`main`**, working tree is **CLEAN**. Both split phases are now complete. Phase 1 (view-model partials) is pushed; Phase 2 (MainWindow.xaml → UserControls) is complete but **local-only**. **Pushed** (reached `origin/main` == `14d3ed4`, incl. tags): Phase 1 commit `0` and refactor commits `1..11` (`refactor-commit-0..11`), plus policy/HANDOFF. **LOCAL ONLY (Phase 2 — 12, 13, 14, 15, 16, 17, 18)** — policy 2026-08-30: no per-commit push; `git push` only at a user-agreed milestone / "push it". **Push pending on explicit user approval:** | Commit | Hash | Tag | Control | From Loc | |--------|------|-----|---------|----------| | 12 | `bc23b64` | `refactor-commit-12` | `Controls/BottomBar` | footer | | 13 | `6914252` | `refactor-commit-13` | `Controls/HealthBanner` | row 1 banner | | 14 | `90f5ad5` | `refactor-commit-14` | `Controls/TopBar` | row 0 top bar | | 15 | `c5e3466` | `refactor-commit-15` | `Controls/PreviewPane` | center preview | | 16 | `73397cf` | `refactor-commit-16` | `Controls/SceneThumbnailStrip` | row 0 strip | | 17 | `c9fd1bd` | `refactor-commit-17` | `Controls/LeftPanel` | row 1 col 0 | | 18 | `544208e` | `refactor-commit-18` | `Controls/OverlayHost` | overlay dialogs | ## What's In Flight Nothing code-in-flight — working tree clean, **Phase 2 complete**. **Phase 2 result:** `MainWindow.xaml` carved 1,681 → **123 lines** (a shell over 6 UserControls under `Controls/`, namespace `ytLive.Controls`). Every change: 0-warning build, `scripts/verify.sh` (246 pass + 2 known only), explicit-file `scripts/scope-check.sh`, `ViewModels/index.md` in the SAME commit, tagged `refactor-commit-N`, no per-commit push. **Next:** - If user says "push": `git push origin main && git push --tags` (7 commits 12-18 + their tags). - Then optional Phase 3 if queued. Nothing is queued beyond Phase 2. **Pending bus:** `ViewModels/index.md` Phase 2 tracker has rows 12–18 (closed); Phase 1 tracker closed. `Controls/` has `index.md`-style facts only if needed. ## Landmines - **Pre-existing test failures (do not chase):** `AudioPipelineTests.Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback` + `RoundClipInteractionTests.Round_Clip_Corner_Is_Grabbable_And_Shape_Is_Circle`. - **Tests occasionally abort early (236/237)** — known flake, accepted by `verify.sh`. - **App running locks `ytLive.exe`** → build fails MSB3027. Kill PID before building. - **WinForm crash from `Window_PreviewMouseLeftButtonDown`** — handled in-side the preview/left panel; don't add handlers that deref `OriginalSource` unguarded. - **Controls cannot see `Window.Resources`** (converter rule, Commit 13): any StaticResource the window once supplied must live at app level in `Themes/Controls.xaml`. The 7 converters were promoted there. - **Some control XAML needs its own `xmlns:models` / `xmlns:Helpers`** — a moved block lost its namespace when it left MainWindow's root (LeftPanel hit this, MC2000 "key null"). Always add the model/helper xmlns on each control root. - **Name-looked-up host stubs must stay in the window:** `WebViewHostPanel` (ctor `InitWebView2(WebViewHostPanel)`) and `ToastArea` (`NotificationService.InArea("ToastArea")`) are resolved by name from the window — keep them as window-root children, don't bury them in a control. OverlayHost deliberately left them in place (Commit 18) for this reason. - **Pre-commit gate:** `scripts/verify.sh` (0-warning build + full tests) and `scripts/scope-check.sh "file1" …` — scope-check REQUIRES explicit file args. - Build from WSL with the Windows dotnet host only (see `AGENTS.md`). ## Todo state - MainViewModel refactor: **Phase 1 complete (11/11 partials)**, pushed. - MainWindow.xaml refactor: **Phase 2 complete (6/6 controls)**, local-only. - TASK 3: 27/30 (preview compositor 16, text source 17, alerts 20 still open). - TASK 4: ✅ shipped. TASK 9: items 1–3 shipped; 4–7 open. TASK 10: steps 1–7; Velopack pending. - TASK 18: shipped, creator verification pending. TASK 19/23, 20, 21-A: shipped. - TASK 22 (audio sync offset): not started — required for v1. ## Session summary (2026-08-30) - Ran the **MainWindow.xaml split to completion** under the standing "continue without stopping" directive — no interruption prompts, no `question` tool. - Commits 12–18 landed locally, each: cut → 0-warning build → verify (246 pass + 2 known) → scope-check → index.md in-commit → `git tag refactor-commit-N`. No push. - **Commit 15 (PreviewPane** the hardest: 1920×1080 canvas + drag/select/resize/ hit-test, webcam menu handlers, social glow, audio meters. A dropped outer `Border` (background/glow/margin) was caught and restored same-commit. - **Commit 17 (LeftPanel)** the biggest: property editors + chat autoscroll (moved to self-subscribe on `Loaded`), drag-to-reorder, snapshot revert/accept family; window routes via `_leftPanel.IsClickInside` and `_leftPanel.OnSelectionChanged(vm)`. - **Commit 18 (OverlayHost)** the scope-decision: moved only the three dialogs; kept `WebViewHostPanel` + `ToastArea` as window-root stubs because their name-based lookups (WebView2 init, toast `InArea`) would break if buried in a control — a spin-guard decision, not a guess. - Two XAML extraction gotchas recorded: (a) a moved block losing its `xmlns` → MC2000 "key null" (Line n col m), fixed by adding `xmlns:models` on the control root; (b) re-deriving line numbers after each edit before `sed`/awk deletion ranges (the edit tool shifts numbers). - Push checkpoint reached; awaiting explicit "push" for commits 12–18 + tags.