70 lines
4.3 KiB
Markdown
70 lines
4.3 KiB
Markdown
# HANDOFF — 2026-09-25 (TASK 46 shipped + PUSHED: drawers close on any outside click, TEST included)
|
||
|
||
## Branch / Commit State
|
||
|
||
`main` HEAD = new commit for TASK 46 (drawer click-outside dismiss for all three tabs);
|
||
previous: TASK 45 commit (chat-insert 400 fix), `0981a72`. **PUSHED 2026-09-25
|
||
(creator directive after successful testing): `origin/main` = `197ee81..ecb329e`,
|
||
up to date, 0 ahead.**
|
||
|
||
**Working tree CLEAN after this unit's commit.**
|
||
|
||
## ⚠️ The unit that just shipped (creator directive)
|
||
|
||
"when the test slide-out is active, then any click off the div should close the div —
|
||
this behaviour applies to all tabs, not just TEST."
|
||
|
||
- **Root cause:** right-rail slides (Stream Settings / YPP / TEST, all inside
|
||
`TextPullOutHost`) close on outside clicks via `MainWindow.Window_PreviewMouseLeftButtonDown`
|
||
— but that handler only closed `BroadcastForm` + `Ypp`; **`TestSession` was never in the
|
||
close list**, so the TEST drawer ignored outside clicks. The XAML comment even said "both".
|
||
- **Fix (TASK 46, `TASKS/task-46-drawer-click-outside-close.md`):** add
|
||
`TestSession.CloseDrawerCommand` to the same `!IsClickInsideDrawer` branch; corrected
|
||
the stale "both" comment. No containment change needed — all three share the rail host.
|
||
|
||
**Good Dog:** ONE integration test — the existing
|
||
`TestStream_DockTooling_And_ThreeWayDrawerExclusivity` section-2 window test was extended:
|
||
opens TEST and Stream Settings, raises a window-root `PreviewMouseLeftButtonDown` (source =
|
||
window ⇒ outside the rail; deterministic, no OS mouse, immune to the fullscreen mouse-steal
|
||
flake), asserts each closes.
|
||
**Gate: clean build 0 warnings; full vstest 318/318 passed** (the LayerReorder
|
||
real-mouse-drag test passed this run too).
|
||
|
||
## Follow-ups queued (NOT done in this unit)
|
||
|
||
- **TASK 3 item 20 persistence half** — the canonical `RewardEvents` SQLite table +
|
||
`superChatEvents.list` (30-day) backfill + session-report rollup (events still parse to
|
||
`ChatMessage` in memory only).
|
||
- TASK 3 item 16 (Text source) still open; TASK 40 units A/C/D queued; TASK 32–36 queued.
|
||
|
||
## Around the task (carried facts)
|
||
|
||
- RealMouseDrag tests no-op while a game/fullscreen window steals the mouse (POE 2 seen
|
||
2026-09-22) — **close fullscreen windows before full-suite runs**; the single test
|
||
passes in isolation when re-run alone. AudioPipeline timing flake similar.
|
||
- Test-env trap: saved OAuth session loads synchronously → force `vm.IsConnected` in signed-in tests.
|
||
- `subscriberCount` YPP slice 2 needs re-consent — do not merge with other units. `$99/yr` Polar
|
||
must become one-time before launch. `MARCOM.md`/`MONETIZATION.md` gitignored — never commit.
|
||
- Latent bug the YPP 403 masked: statistics are JSON **strings** — always the ValueKind-first
|
||
`ReadInt64` (MyMistakes recipe), never `GetInt64`.
|
||
- **API facts (TASK 44 + 45):** a liveChatId fetch at broadcast-insert time (lifecycleStatus
|
||
`ready`) returns nothing by design — missing liveChatId ≈ "broadcast not live yet", not an
|
||
auth failure, until ~20s post push. And `400 MISSING_REQUIRED_FIELD` from
|
||
`liveChat/messages.insert` = wrong body shape (missing `snippet.type`), NOT auth/scope.
|
||
- **WPF test technique (TASK 46):** a `MouseButtonEventArgs { RoutedEvent = Mouse.PreviewMouseLeftButtonDownEvent }` raised on the window root deterministically simulates an "outside the drawer rail" click — InputBindings/MouseBindings are NOT triggered by `RaiseEvent` (only by the real InputManager), so no tab toggles fire.
|
||
- Every committed change needs a **close + relaunch** of the running app to be seen — running
|
||
builds are live; verify can't run while the exe is locked.
|
||
|
||
## Next step
|
||
|
||
1. Nothing is in-flight to verify on the drawer path (creator confirmed the behavior
|
||
on the last run).
|
||
2. When scoped: TASK 3 item 20 (RewardEvents persistence half) draws next.
|
||
3. `origin/main` is current (`ecb329e`); future commitments push at the next creator-approved milestone.
|
||
|
||
## Critical working rules (unchanged, still binding)
|
||
|
||
- **Good Dog = ONE integration test per change.** Scope lock + `./scripts/scope-check.sh` before commit.
|
||
- Windows dotnet host for all WSL builds (`/mnt/c/Program Files/dotnet/dotnet.exe`, quoted paths).
|
||
- 0 warnings on real clean builds (verify only, never incremental). One runtime model.
|
||
- No menus/polls with the creator; decisions asked once then held; do the work, then report. |