a9d5f29084
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.
89 lines
5.0 KiB
Markdown
89 lines
5.0 KiB
Markdown
# 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** (`ytLive` pid 8696 was seen locking `bin\net8.0…\ytLive.dll`)
|
|
— normal `dotnet build` to `bin` fails with MSB3021/MSB3027 until it's closed. Sessions verified
|
|
the build with `-p:OutDir=C:\Users\gramp\AppData\Local\Temp\ytLive-build39\ -p:UseAppHost=false`
|
|
and ran vstest against the temp dll. Close the app before committing/final verification.
|
|
- **`subscriberCount` is rounded to 3 significant figures** by Google — near-threshold ETA/bar
|
|
reads are coarse; documented in `TASK 39` doc + the drawer's `WhatCounts` text.
|
|
- **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.readonly` added to
|
|
`YouTubeAuthService.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; see
|
|
`TASKS/task-10-monetization.md`). `MARCOM.md`/`MONETIZATION.md` are 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`, virtual `CaptureCurrentAsync` = test seam); `YppTrackerViewModel` mirrors
|
|
`LiveBroadcastFormViewModel` (drawer state + commands); `MainViewModel.Ypp.cs` wires `Ypp`,
|
|
`ChannelStatsFactoryOverride`, and **one-open-at-a-time exclusivity** (both directions);
|
|
account hooks in `MainViewModel.Account.cs`.
|
|
- `PreviewPane.xaml` — `TextPullOutHost` is now a drawer bank: [broadcast drawer][ypp drawer]
|
|
[stacked white-tab column]; same animated-width pattern (To=320, 0.2s CubicEase). Outside-click
|
|
collapse in `MainWindow.xaml.cs` covers both. `IsClickInsideDrawer` unchanged.
|
|
- **Good Dog = ONE integration test** (`YppPullOutTests`): connected-VM snapshot capture +
|
|
persistence + checklist round-trip + drawer toggles; real-window exclusivity both ways.
|
|
|
|
## Next step
|
|
|
|
1. Close the running ytLive, rebuild in place, run full suite again (313/313).
|
|
2. `./scripts/scope-check.sh "<declared file list>"` audit.
|
|
3. User reviews/commits (code + memory in SAME commit, per rules). No push unless the user says.
|
|
4. 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.sh` before
|
|
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 `--TestCaseFilter` for 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.db` is 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). |