No feature branches pre-1.0: all work on main

This commit is contained in:
2026-08-24 09:15:56 -07:00
parent 708b336da7
commit b899ff053f
3 changed files with 18 additions and 23 deletions
+7 -5
View File
@@ -7,16 +7,18 @@ memory as a linked map of markdown files — read it before doing anything.
BEFORE any planning or coding, follow this rule: BEFORE any planning or coding, follow this rule:
> ONE integration test per branch, ONE test per PR. > ONE integration test per change.
When the user asks for changes that would involve multiple integration tests: When the user asks for changes that would involve multiple integration tests:
1. Identify the ONE specific use case/test they want to work on 1. Identify the ONE specific use case/test they want to work on
2. Do NOT create branches or PRs for multiple tests 2. Focus ONLY on the single use case until it's complete and tests pass
3. Focus ONLY on the single use case until it's complete and tests pass
> *A good dog learns one trick perfectly before learning the next.* > *A good dog learns one trick perfectly before learning the next.*
>
> PRs that address multiple integration tests will be REJECTED. **No feature branches pre-1.0 (decided 2026-08-24):** solo dev, pre-1.0 — all
work lands directly on `main`, committed and pushed per work unit. No
`taskNN-*` branches, no PRs. The scope discipline above is about test focus,
not git mechanics.
MUST read the architecture guide before planning or modifying the codebase: MUST read the architecture guide before planning or modifying the codebase:
[`ai.md`](ai.md) (+ [`schema.md`](schema.md) for the memory-map conventions). [`ai.md`](ai.md) (+ [`schema.md`](schema.md) for the memory-map conventions).
+9 -17
View File
@@ -1,21 +1,14 @@
# HANDOFF — Session State # HANDOFF — Session State
## Branch ## Branch
`task26-webcam-menu-gate` @ `ef710c5` — TASK 26 committed (not pushed). Working tree now carries **TASK 27, NOT yet committed** (commit on your word). Parent chain: `task25-backgrounds` @ `7dd140a` (pushed), still unmerged to main. **`main`** @ `708b336` — committed and pushed, working tree clean. **No feature branches pre-1.0
(decided 2026-08-24): all work lands on `main` per work unit; every `taskNN-*` branch deleted**
(TASK 24/25/26+27 fast-forwarded into main; stale `social-bar`/`webcam-validation` removed too).
## Shipped: TASK 27 — YouTube Chat layer gate + legacy label heal ## Shipped (this session, now all on main)
- TASK 26 — webcam (+) menu gates on the app-wide identity (`CanAddWebcam` = staged != null && `_webcam == null`; XAML binding + tooltip; test `WebcamMenuGateTests`).
Creator follow-up to TASK 26: "do the same thing with the YouTube chat layer" + make the Layers-row label match the (+) picklist. - TASK 27 — YouTube Chat layer one-per-layout gate (`CanAddYouTubeChat`, AddSource refuses a second) + legacy label heal ("Chat" → "YouTube Chat" on LoadLayout; creator renames untouched; test `ChatLayerGateTests`). Creator's ask: "do the same thing with the YouTube chat layer" + make the Layers row match the (+) picklist.
- Suite: 225 total, 224 pass — only failure is the known pre-existing `AudioPipelineTests.Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback`. Build 0 warnings. Docs (ai.md/TASKS rows 27-28/HANDOFF) shipped in the same commits.
1. **Gate:** `CanAddYouTubeChat` = `StagedScene != null && !Scenes.Any(s => s.Elements.OfType<Source>().Any(e => e.Type == SourceType.ChatBox))` — one chat layer per layout; the (+) item greys out while any scene carries one. Raised in the StagedScene setter + `OnElementsChanged`; `AddSource` refuses a second as defense in depth. XAML `IsEnabled` + tooltip "One chat layer at a time — it's already in your stream".
2. **Label heal:** layers added by commit `65641d8` were named "Chat"; LoadLayout heals exactly that un-renamed default to "YouTube Chat" so the Layers row matches the picklist. Creator renames untouched; idempotent.
3. **Test (Good Dog Rule — ONE):** `ChatLayerGateTests.LegacyChatName_Heals_And_CanAddYouTubeChat_Gates_On_The_Existing_Layer` — real window + temp DB with a legacy "Chat" ChatBox row in Starting: healed on load, persisted on save, greyed cross-scene + in-scene, re-enabled after `RemoveSourceCommand`.
4. **Suite: 225 total, 224 pass** — only failure is the known pre-existing `AudioPipelineTests.Mix_HonorsProviderGains_AndGameMute_KillsTheLoopback`. Build 0 warnings.
5. **Docs same commit:** ai.md (chat rule + heal next to the webcam gate), TASKS.md TASK 3 row 28, this file.
## Shipped: TASK 26 — webcam (+) menu gates on the app-wide identity
`CanAddWebcamToStagedScene` → **`CanAddWebcam`** = `StagedScene != null && _webcam == null` (`MainViewModel.cs:308`), raised at StagedScene setter / `ReacquireWebcam` / `OnElementsChanged` / `_webcam` create / last-config removal; XAML binding renamed, tooltip verbatim. ONE integration test `WebcamMenuGateTests.CanAddWebcam_Gates_On_The_AppWide_Webcam_Identity`. Committed `ef710c5` with ai.md/TASKS row 27/HANDOFF docs.
## ⚠️ Landmines ## ⚠️ Landmines
@@ -28,9 +21,8 @@ Creator follow-up to TASK 26: "do the same thing with the YouTube chat layer" +
- **Dead code flagged, not touched:** `ShowWebcamCommand` / `CanShowWebcamInStagedScene` are wired in the VM but bound nowhere — audit item, separate branch if wanted. - **Dead code flagged, not touched:** `ShowWebcamCommand` / `CanShowWebcamInStagedScene` are wired in the VM but bound nowhere — audit item, separate branch if wanted.
## Next steps ## Next steps
1. Commit TASK 27 (code + docs, one commit), push both branches. 1. Creator visual pass on Windows: add YouTube Chat to any scene → (+) item greys everywhere; legacy "Chat"-named row (if present) shows as "YouTube Chat"; remove → re-enables. Same for the webcam row.
2. Creator visual pass on Windows: add YouTube Chat to any scene → (+) item greys everywhere; legacy "Chat"-named row (if present) shows as "YouTube Chat"; remove → re-enables. 2. Relaunch app once so the real `%APPDATA%` DB self-heals (backgrounds + chat label).
3. Merge `task25-backgrounds` + `task26-webcam-menu-gate` + this branch to main per Good Dog Rule (one integration test each ✓); relaunch app once so the real `%APPDATA%` DB self-heals (backgrounds + chat label).
## Build ## Build
```bash ```bash
+2 -1
View File
@@ -84,7 +84,8 @@ WSL can't run net8.0-windows tests:
dotnet.exe vstest "C:\...\ytLive.Tests\bin\Debug\net8.0-windows10.0.19041.0\ytLive.Tests.dll" dotnet.exe vstest "C:\...\ytLive.Tests\bin\Debug\net8.0-windows10.0.19041.0\ytLive.Tests.dll"
``` ```
Good Dog Rule: ONE integration test per branch, ONE test per PR. Current: TokenStore DPAPI Good Dog Rule: ONE integration test per change (no feature branches pre-1.0 — work lands on
`main`, see AGENTS.md). Current: TokenStore DPAPI
roundtrip/corrupt/missing/clear, OAuth exchange/refresh/ClearSession, CameraManager refcount + roundtrip/corrupt/missing/clear, OAuth exchange/refresh/ClearSession, CameraManager refcount +
frame pump + failure handling (fakes for the WinRT seams), real-`MainWindow` round-clip frame pump + failure handling (fakes for the WinRT seams), real-`MainWindow` round-clip
interaction test, LayoutStore delete roundtrip, LayoutStore pre-round-rect-dims roundtrip, interaction test, LayoutStore delete roundtrip, LayoutStore pre-round-rect-dims roundtrip,