docs: rewrite HANDOFF for Phase 2 completion (MainWindow.xaml → 6 controls)
Working tree clean. Phase 1 (pushed) + Phase 2 (local-only, commits 12-18 with tags) both complete. Push checkpoint reached: next step is 'git push origin main && git push --tags' on explicit user approval. Landmines updated with the XAML extraction gotchas (control xmlns, name-looked-up host stubs, window-resources converter rule).
This commit is contained in:
+65
-54
@@ -4,39 +4,43 @@
|
|||||||
|
|
||||||
**`main`**, working tree is **CLEAN**.
|
**`main`**, working tree is **CLEAN**.
|
||||||
|
|
||||||
Commits `46978b8` (AGENTS push policy), `fc33022` (HANDOFF), and refactor
|
Both split phases are now complete. Phase 1 (view-model partials) is pushed;
|
||||||
commits `0–5` through `e286719` are **pushed** (incl. `refactor-commit-0..5`).
|
Phase 2 (MainWindow.xaml → UserControls) is complete but **local-only**.
|
||||||
Refactor commits **6–11 are LOCAL ONLY** (policy 2026-08-30: no per-commit
|
|
||||||
push; `git push --tags` only at a user-agreed milestone / "push it"):
|
|
||||||
|
|
||||||
| Commit | Hash | Tag | Partial | Lines |
|
**Pushed** (reached `origin/main` == `14d3ed4`, incl. tags): Phase 1 commit `0`
|
||||||
|--------|------|-----|---------|-------|
|
and refactor commits `1..11` (`refactor-commit-0..11`), plus policy/HANDOFF.
|
||||||
| 6 Audio | `c1126a5` | `refactor-commit-6` | `MainViewModel.Audio.cs` | 408 |
|
|
||||||
| 7 Trax | `535a501` | `refactor-commit-7` | `MainViewModel.Trax.cs` | 132 |
|
|
||||||
| 8 Socials | `c41ff7f` | `refactor-commit-8` | `MainViewModel.Socials.cs` | 161 |
|
|
||||||
| 9 Streaming | `e1006a0` | `refactor-commit-9` | `MainViewModel.Streaming.cs` | 787 |
|
|
||||||
| 10 Chat | `3b77a13` | `refactor-commit-10` | `MainViewModel.Chat.cs` | 194 |
|
|
||||||
| 11 Overlays | `1efde5a` | `refactor-commit-11` | `MainViewModel.Overlays.cs` | 194 |
|
|
||||||
|
|
||||||
Nightly summary: **Phase 1 complete.** The plan was 11 partials + scaffold;
|
**LOCAL ONLY (Phase 2 — 12, 13, 14, 15, 16, 17, 18)** — policy 2026-08-30: no
|
||||||
all live in `ViewModels/`. Core `MainViewModel.cs` shrank 1,890 → **758
|
per-commit push; `git push` only at a user-agreed milestone / "push it".
|
||||||
lines**. Every change: clean build (0 warnings), `scripts/verify.sh` (246
|
**Push pending on explicit user approval:**
|
||||||
passed + 2 known failures only), `scripts/scope-check.sh` with explicit file
|
|
||||||
args, `ViewModels/index.md` updated in the SAME commit, tagged
|
| Commit | Hash | Tag | Control | From Loc |
|
||||||
`refactor-commit-N`, no per-commit push.
|
|--------|------|-----|---------|----------|
|
||||||
|
| 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
|
## What's In Flight
|
||||||
|
|
||||||
Nothing code-in-flight — working tree clean, Phase 1 done.
|
Nothing code-in-flight — working tree clean, **Phase 2 complete**.
|
||||||
|
|
||||||
**Next (queued, not started): Phase 2 — split `MainWindow.xaml` (1,681 lines)
|
**Phase 2 result:** `MainWindow.xaml` carved 1,681 → **123 lines** (a shell over
|
||||||
into UserControls.** Same rules: one work unit per control, docs in the same
|
6 UserControls under `Controls/`, namespace `ytLive.Controls`). Every change:
|
||||||
commit, verify + scope-check, commit locally, `git push` only on user go.
|
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.
|
||||||
|
|
||||||
**Push pending:** refactor commits 6–11 + their tags are local. The Session-1
|
**Next:**
|
||||||
push checkpoint was never reached because the user directive was to run the
|
- If user says "push": `git push origin main && git push --tags` (7 commits 12-18
|
||||||
series to completion; Phase 1 completion is the natural milestone to push on
|
+ their tags).
|
||||||
explicit user confirmation.
|
- 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
|
## Landmines
|
||||||
|
|
||||||
@@ -45,44 +49,51 @@ explicit user confirmation.
|
|||||||
`RoundClipInteractionTests.Round_Clip_Corner_Is_Grabbable_And_Shape_Is_Circle`.
|
`RoundClipInteractionTests.Round_Clip_Corner_Is_Grabbable_And_Shape_Is_Circle`.
|
||||||
- **Tests occasionally abort early (236/237)** — known flake, accepted by `verify.sh`.
|
- **Tests occasionally abort early (236/237)** — known flake, accepted by `verify.sh`.
|
||||||
- **App running locks `ytLive.exe`** → build fails MSB3027. Kill PID before building.
|
- **App running locks `ytLive.exe`** → build fails MSB3027. Kill PID before building.
|
||||||
- **Implicit usings are SDK-default but partials must still carry their own
|
- **WinForm crash from `Window_PreviewMouseLeftButtonDown`** — handled in-side the
|
||||||
domain usings** (they do not inherit core's): `ICommand`/`ObservableCollection`/
|
preview/left panel; don't add handlers that deref `OriginalSource` unguarded.
|
||||||
`WriteableBitmap`/`DispatcherTimer` etc. are NOT implicit. Grep-verified usings:
|
- **Controls cannot see `Window.Resources`** (converter rule, Commit 13): any
|
||||||
- Audio: Input, Media, Threading, `NAudio.CoreAudioApi`, `ytLive`, Helpers, Models, Services, Services.Audio
|
StaticResource the window once supplied must live at app level in
|
||||||
- Trax: IO, Media, `Microsoft.Win32`, Helpers, Models, Services.Audio
|
`Themes/Controls.xaml`. The 7 converters were promoted there.
|
||||||
- Socials: Windows, Input, Media, `ytLive`, Helpers, Models, Services, Services.Compositor
|
- **Some control XAML needs its own `xmlns:models` / `xmlns:Helpers`** — a moved
|
||||||
- Streaming: ObjectModel, IO, Windows, Input, Threading, `Microsoft.Win32`, Helpers, Models, Services, Services.Encoder
|
block lost its namespace when it left MainWindow's root (LeftPanel hit this,
|
||||||
- Chat: ObjectModel, Media, Media.Imaging, Threading, Helpers, Models, Services
|
MC2000 "key null"). Always add the model/helper xmlns on each control root.
|
||||||
- Overlays: Diagnostics, IO, Input, Helpers
|
- **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
|
- **Pre-commit gate:** `scripts/verify.sh` (0-warning build + full tests) and
|
||||||
`scripts/scope-check.sh "file1" …` — scope-check REQUIRES explicit file args.
|
`scripts/scope-check.sh "file1" …` — scope-check REQUIRES explicit file args.
|
||||||
- Build from WSL with the Windows dotnet host only (see `AGENTS.md`).
|
- Build from WSL with the Windows dotnet host only (see `AGENTS.md`).
|
||||||
|
|
||||||
## Todo state
|
## Todo state
|
||||||
|
|
||||||
- MainViewModel refactor: **Phase 1 complete (11/11 partials + scaffold).**
|
- MainViewModel refactor: **Phase 1 complete (11/11 partials)**, pushed.
|
||||||
`ViewModels/index.md` has a per-partial table row (code↔commit map in the
|
- MainWindow.xaml refactor: **Phase 2 complete (6/6 controls)**, local-only.
|
||||||
tracker section). Core row now describes only what remains (ctor wiring,
|
|
||||||
lifecycle, source commands, WebView2 hosting, frame-pump seam,
|
|
||||||
`SelectedElement`, `BrandFlash*`, `BuildCompositorOptions`/`ResolveOutputFrame`).
|
|
||||||
- TASK 3: 27/30 (preview compositor 16, text source 17, alerts 20 still open).
|
- 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 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 18: shipped, creator verification pending. TASK 19/23, 20, 21-A: shipped.
|
||||||
- TASK 22 (audio sync offset): not started — required for v1.
|
- TASK 22 (audio sync offset): not started — required for v1.
|
||||||
- Monitoring: cross-partial private access is the point of partial classes —
|
|
||||||
no moved member re-declared anywhere; moved setters reference other partials
|
|
||||||
purely by name.
|
|
||||||
|
|
||||||
## Session summary (2026-08-30)
|
## Session summary (2026-08-30)
|
||||||
|
|
||||||
- Ran the MainViewModel split to completion under the standing directive
|
- Ran the **MainWindow.xaml split to completion** under the standing "continue
|
||||||
("continue until you can continue no longer" — no interruption prompts).
|
without stopping" directive — no interruption prompts, no `question` tool.
|
||||||
- Commits 9 (Streaming), 10 (Chat), 11 (Overlays) landed locally, each ~8:40
|
- Commits 12–18 landed locally, each: cut → 0-warning build → verify (246 pass +
|
||||||
back-to-back: cut → 0-warning build → verify (246 pass + 2 known) →
|
2 known) → scope-check → index.md in-commit → `git tag refactor-commit-N`. No push.
|
||||||
scope-check → index.md in-commit → `git tag refactor-commit-N`. No push.
|
- **Commit 15 (PreviewPane** the hardest: 1920×1080 canvas + drag/select/resize/
|
||||||
- Streaming was the hardest cut (interleaved props, master-frame consts,
|
hit-test, webcam menu handlers, social glow, audio meters. A dropped outer
|
||||||
session timer, health pipeline, record rename-on-stop); Chat and Overlays
|
`Border` (background/glow/margin) was caught and restored same-commit.
|
||||||
were clean contiguous cuts. One build fix each: Streaming needed
|
- **Commit 17 (LeftPanel)** the biggest: property editors + chat autoscroll
|
||||||
`ObjectModel`/`Input`, Chat needed `Media.Imaging` for `WriteableBitmap`.
|
(moved to self-subscribe on `Loaded`), drag-to-reorder, snapshot revert/accept
|
||||||
- Docs kept honest throughout: `index.md` rows for Streaming/Chat/Overlays,
|
family; window routes via `_leftPanel.IsClickInside` and
|
||||||
About-hub row re-pointed to the Overlays partial, core row trimmed each time.
|
`_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.
|
||||||
|
|||||||
Reference in New Issue
Block a user