Current-OAuth-scope data, no re-consent: subscriber bars for both tiers (500 fan-funding / 1,000 ad-revenue; the 2027-02-01 doubling is versioned date-aware data in YppThresholds), 3-uploads/90d, live standing from channels.list auditDetails, self-reported 2FA/AdSense checkboxes + deep links (Google 2-Step / youtube.com/earn), and the "what counts" education. Every refresh appends a YppSnapshot (SQLite v10) so the analytics slice has history from day one. - ChannelStatsService (channels.list statistics,auditDetails,contentDetails + playlistItems.list, virtual CaptureCurrentAsync = test seam); YppTrackerViewModel mirrors LiveBroadcastFormViewModel. - MainViewModel.Ypp.cs: Ypp property, ChannelStatsFactoryOverride seam, one-open-at-a-time drawer exclusivity (both directions); account sign-in/out/restore hooks in Account.cs. - PreviewPane.xaml: TextPullOutHost is now a drawer bank [broadcast][ypp][stacked white tabs]; outside-click collapse covers both drawers. MainWindow.xaml.cs updated. - Wait - watchers: the whole feature already reviewed against YouTube's own docs (YPP Earn tab + API availability) before building — see TASKS/task-39-ypp-journey-tracker.md. - ONE integration test: YppPullOutTests (snapshot capture/persist + checklist round-trip + drawer exclusivity). 313/313 pass, 0 warnings. - Memory in same commit: TASKS.md row, ai.md Journey-tracker bullet (roadmap→reality), HANDOFF.md. Slice 2 (Analytics yt-analytics.readonly re-consent → watch-hours/Shorts + velocity/ETA + sparkline) is queued behind this, not merged.
5.0 KiB
HANDOFF — 2026-09-22 (TASK 39 YPP journey tracker slice 1 implemented, UNCOMMITTED)
Branch / Commit State
main HEAD = 4e0915a — feat(backdrop): Capture Window… in-app window pin (TASK 38, Good Dog
ONE test) (PUSHED 523c17b..4e0915a). Working tree DIRTY — ONE uncommitted work unit:
Unit — TASK 39 slice 1 (YPP journey tracker, current-scope data), this session:
M Controls/PreviewPane.xaml
M MainWindow.xaml.cs
M Services/LayoutStore.Migrations.cs
M ViewModels/MainViewModel.cs
M ViewModels/MainViewModel.Account.cs
?? Models/YppStatSnapshot.cs
?? Models/YppThresholds.cs
?? Services/ChannelStatsService.cs
?? Services/LayoutStore.Ypp.cs
?? Services/YppTrackerViewModel.cs
?? ViewModels/MainViewModel.Ypp.cs
?? ytLive.Tests/YppPullOutTests.cs
?? TASKS/task-39-ypp-journey-tracker.md
M TASKS.md
M ai.md
Build (via temp OutDir): 0 warnings / 0 errors. Full suite 313/313 pass (312 + the new
YppPullOutTests).
⚠️ Open action items / landmines
- The app is RUNNING on the desktop (
ytLivepid 8696 was seen lockingbin\net8.0…\ytLive.dll) — normaldotnet buildtobinfails with MSB3021/MSB3027 until it's closed. Sessions verified the build with-p:OutDir=C:\Users\gramp\AppData\Local\Temp\ytLive-build39\ -p:UseAppHost=falseand ran vstest against the temp dll. Close the app before committing/final verification. subscriberCountis rounded to 3 significant figures by Google — near-threshold ETA/bar reads are coarse; documented inTASK 39doc + the drawer'sWhatCountstext.- LayerReorderPersistenceTests.RealMouseDrag… flaked once pre-TASK-38 (fullscreen game on the desktop); unrelated, re-ran green.
- Slice 2 (Analytics) needs Google re-consent —
yt-analytics.readonlyadded toYouTubeAuthService.Scope(line 18) triggers it; do NOT merge with slice-1 work. - Polar product
d105dfa1…still$99/yr— must become one-time before launch (carried; seeTASKS/task-10-monetization.md).MARCOM.md/MONETIZATION.mdare gitignored — never commit.
What this session did (TASK 39 slice 1 — creator ruling 2026-09-21, plan 2026-09-22)
Add the "YPP" pull-out below Stream Settings on the Live screen's right edge. Current-OAuth-
scope data (no re-consent) shown in-app: subscriber bars for both tiers (500 f.funding / 1,000 ad —
the 1,000/4,000h/10M→8,000h/20M doubling on 2027-02-01 handled as versioned data in
YppThresholds), 3-uploads/90d bar, live standing from auditDetails, self-reported 2FA/AdSense
checkboxes + deep links, and the "what counts" education text. Every refresh appends a YppSnapshot
(SQLite v10) so slice 2's velocity/ETA has history from day one.
ChannelStatsService(channels.list statistics,auditDetails,contentDetails+playlistItems.list, virtualCaptureCurrentAsync= test seam);YppTrackerViewModelmirrorsLiveBroadcastFormViewModel(drawer state + commands);MainViewModel.Ypp.cswiresYpp,ChannelStatsFactoryOverride, and one-open-at-a-time exclusivity (both directions); account hooks inMainViewModel.Account.cs.PreviewPane.xaml—TextPullOutHostis now a drawer bank: [broadcast drawer][ypp drawer] [stacked white-tab column]; same animated-width pattern (To=320, 0.2s CubicEase). Outside-click collapse inMainWindow.xaml.cscovers both.IsClickInsideDrawerunchanged.- Good Dog = ONE integration test (
YppPullOutTests): connected-VM snapshot capture + persistence + checklist round-trip + drawer toggles; real-window exclusivity both ways.
Next step
- Close the running ytLive, rebuild in place, run full suite again (313/313).
./scripts/scope-check.sh "<declared file list>"audit.- User reviews/commits (code + memory in SAME commit, per rules). No push unless the user says.
- Then TASK 39 slice 2 (Analytics scope re-consent → watch-hours/Shorts + velocity/ETA +
sparkline) per
TASKS/task-39-ypp-journey-tracker.md.
Critical working rules (unchanged, still binding)
- Good Dog = ONE integration test per change.
- Scope lock: declare the exact file list before editing; run
scripts/scope-check.shbefore commit. No "while I'm here" edits. - Run from WSL always uses the Windows dotnet host (
/mnt/c/Program Files/dotnet/dotnet.exe) with quoted paths and--TestCaseFilterfor filtered vstest runs. - ai.md + code in the SAME commit; rewrite HANDOFF.md at session end.
Where the machine facts live
%APPDATA%\ytLive\ytLive.db= real layout DB (layout.dbis a 0-byte legacy file). sqlite3 at/root/android-sdk/platform-tools/sqlite3. Schema is now user_version = 10.- ffmpeg/ffprobe:
/mnt/c/Program Files/Krita (x64)/bin/with Windows paths. ai.md§Screen backdrop capture = authoritative backdrop/capture-key/heal doc (incl. TASK 38).ai.md§Monetization awareness = authoritative monetization roadmap (incl. the TASK 39 journey-tracker state). YPP thresholds/date doubling live there +Models/YppThresholds.cs.- Business/marcom facts:
MONETIZATION.md+MARCOM.md(both gitignored).