Files
LlamaCasty/HANDOFF.md
T
gramps ecb329e578 fix(ui): drawers close on any click outside the rail — TEST was the missing third
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.
2026-09-25 08:18:25 -07:00

4.4 KiB
Raw Blame History

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 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. 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.
  2. Push decision is the creator's (repo ~13 ahead). If pushed, note the commit id in this file.
  3. 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.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.