Creator: '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.' MainWindow.Window_PreviewMouseLeftButtonDown already closed the Stream Settings and YPP drawers on any click outside TextPullOutHost, but its close list skipped TestSession — so the TEST drawer never dismissed on an outside click. Fix: run TestSession.CloseDrawerCommand in the same outside-click branch. All three drawers share the rail host, so the containment check is unchanged. Good Dog: ONE integration test — the existing TestStream window section now raises a window-root PreviewMouseLeftButtonDown (source = window => outside the rail; deterministic, no OS mouse) and asserts the TEST and Stream Settings drawers both close. Gate: clean build 0 warnings, full vstest 318/318.
4.4 KiB
HANDOFF — 2026-09-25 (TASK 46 shipped: 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. Repo is ~13 commits ahead of
pushed 197ee81 — push is the creator's call (sub-milestone decision, not per-commit).
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 viaMainWindow.Window_PreviewMouseLeftButtonDown— but that handler only closedBroadcastForm+Ypp;TestSessionwas 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): addTestSession.CloseDrawerCommandto the same!IsClickInsideDrawerbranch; 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
RewardEventsSQLite table +superChatEvents.list(30-day) backfill + session-report rollup (events still parse toChatMessagein 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.IsConnectedin signed-in tests. subscriberCountYPP slice 2 needs re-consent — do not merge with other units.$99/yrPolar must become one-time before launch.MARCOM.md/MONETIZATION.mdgitignored — never commit.- Latent bug the YPP 403 masked: statistics are JSON strings — always the ValueKind-first
ReadInt64(MyMistakes recipe), neverGetInt64. - 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. And400 MISSING_REQUIRED_FIELDfromliveChat/messages.insert= wrong body shape (missingsnippet.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 byRaiseEvent(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
- Creator verifies the drawer behavior on the next run: open any of Stream Settings / YPP / TEST and click anywhere outside the rail — the drawer closes (TEST was the only one that didn't). Clicking the vertical tab again still toggles it.
- Push decision is the creator's (repo ~13 ahead). If pushed, note the commit id in this file.
- When scoped: TASK 3 item 20 (RewardEvents persistence half) draws next.
Critical working rules (unchanged, still binding)
- Good Dog = ONE integration test per change. Scope lock +
./scripts/scope-check.shbefore 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.