Files
LlamaCasty/HANDOFF.md
T
gramps 3bf053a3b1 TASK 31: SceneGraph design + baked-crust compositor optimization
Design captured in TASKS.md, pattern note in ai.md, handoff updated.
2026-08-31 11:38:12 -07:00

117 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HANDOFF — Session State
## Branch / Commit State
**`main`**, working tree is **CLEAN**. `origin/main` == `85893ea` (pushed).
**Pushed** (reached `origin/main` == `85893ea`, incl. tags): Phase 1 commit `0` +
refactor commits `1..11` + **Phase 2 commits `12..18`** + the `Controls/index.md`
docs commit `cb54637` + **Phase 3 splits A–E** (tags `refactor-commit-A..E`) +
**Commit F (Recording, `refactor-commit-F`)** + **Commit G (ChatOverlayLayer,
`refactor-commit-G`)**. Everything is pushed; nothing local-only.
**Commit log (all pushed):**
| Commit | Hash | Tag | Payload |
|--------|------|-----|---------|
| docs | `cb54637` | — | `Controls/index.md` |
| A | `6944db8` | `refactor-commit-A` | split `MainViewModel.cs` core → **495** |
| B | `31362d1` | `refactor-commit-B` | split `MainViewModel.Streaming.cs` → **330** |
| C | `fab2e09` | `refactor-commit-C` | split `MainViewModel.Background.cs` → **418** |
| D | `d3271a0` | `refactor-commit-D` | trim `SocialsDialogViewModel.cs` → **334** |
| E | `dcb3637` | `refactor-commit-E` | split `LayoutStore.cs` → 6 partials |
| F | `3107f92` | `refactor-commit-F` | extract recording concern → `MainViewModel.Recording.cs` |
| G | `85893ea` | `refactor-commit-G` | **first true decomposition** → `Services/ChatOverlayLayer.cs` |
## What's In Flight
Nothing code-in-flight — working tree clean.
**TASK 31 designed:** SceneGraph component + baked-crust compositor optimization.
Design captured in `TASKS.md`, pattern note in `ai.md`. Ready to implement.
**The directive (2026-08-31, user):** rewrite the project, breaking files into
**functional components to compliment AI retrieval/processing** — NOT line-count
chasing. Line count is a guideline for context management, not a design goal.
**What was done:**
- **Phase 3 (A–E):** every production `.cs` ≤ 500, grouped by concern. These are
*partial shuffles* — same class, same shared state. Marginal for retrieval.
- **Commit F:** recording-output concern → `MainViewModel.Recording.cs` (partial).
- **Commit G — the real win:** `Services/ChatOverlayLayer.cs` is a genuine
owner-state component (buffer + renderer + timers + preview + live `RenderFrame`);
`MainViewModel.Chat.cs` 194 → 44 (thin binding facade). First true decomposition.
**Expert diagnostic (recorded in `ai.md` → Key patterns):** the remaining partials
(Audio, Webcam, Background, Scenes, Socials…) are **binding glue over already-
extracted services** (`AudioMixer`, `CameraManager`, `ScreenCaptureManager`,
`ChatBoxRenderer`, `SocialValidator`). They have no cohesive owner-state blob to
peel — forcing extraction adds coupling. **Chat was the one clean peel.**
**Next (recommended):** the one remaining *genuine* big decomposition is the
**scene-graph segment** (the `Scenes`/`StagedScene`/element-inventory backbone
every feature hangs off). This is a real architectural redesign — a `SceneGraph`
owner-object with narrow seams — that touches the binding surface and needs
design review, NOT an unsupervised autonomous peel. Do not attempt it blind pre-1.0.
**Pending bus:** `ViewModels/index.md` Phase 3 tracker has rows A–E (closed);
Phase 3 marked COMPLETE. Watch-list (under limit, no action): `Controls/PreviewPane.xaml.cs`
(464), `ViewModels/MainViewModel.Audio.cs` (408).
## 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)**, pushed at `1f4624c`.
- 500-line compliance: **Phase 3 complete (A–E, all ≤500)**, pushed.
- **True decomposition: Commit G — `Services/ChatOverlayLayer.cs` shipped + pushed** (first owner-state component; pattern recorded in `ai.md`).
- **Next (design-needed, do NOT blind-peel):** the scene-graph segment (`SceneGraph` owner-object) — the one remaining genuine big decomposition; touches binding surface, needs review.
- 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-31)
- Ran the **500-line Phase 3 split to completion** (A–E), then the continuation.
- **Re-structuring principle (user correction, 2026-08-31):** split by
**functionality**, so an AI can process one concern per file; the 500-line
count is a **ceiling**, NOT the target. Do not pad or reshape code to a number.
- **Correction of a false premise:** my plan to "extract FFmpegEncoder /
StreamHealthMonitor / FramePump" was a no-op — those already exist as
`Services/Encoder/*`. The honest seams were (F) the recording concern and
(G) the chat overlay.
- **Commit G = first TRUE decomposition:** `ChatOverlayLayer` owns chat state +
behavior; `MainViewModel.Chat.cs` 194 → 44 thin facade. This is the pattern
that actually compliments AI retrieval (one self-contained unit per feature),
unlike the partial shuffles of A–E, which only marginalize context because
every partial still shares the god-object's state.
- **Accident caught & recovered (Commit D):** a `> ViewModels/SocialsDialogViewModel.cs`
write that truncated the file it was reading left it at 1 line; restored via
`git checkout --`, re-ran from temp files. **Lesson** in `MyMistakes.md`: never
`awk … > SRC` while awking SRC; stage cuts into temp files, then assemble.
- Everything through G is **pushed to `origin/main` (`85893ea`)** with tags A–G.