Slice 3. 589 green, 0 warnings. - **`FramePump.ChangeEncoderAsync`** is a full pump stop/start, not an encoder swap. A swap leaves an in-flight submit pointing at a disposed process, and that faults the loop — which ends the broadcast, the one thing a quality step-down must never do. `StopAsync` already awaits the loop and flushes, so this reuses the tested path and costs one short freeze, which the ladder accepts. - **`MainViewModel.StepDown`**: one planner per broadcast, subscribed to `StatsReported`, unsubscribed on every stop path. The pump thread only decides; the restart is posted to the dispatcher, because the act stops the loop that raised the event. - **The creator's choice is not rewritten**: `_encoderTierOverride` changes what the encoder emits while the dropdown keeps showing what they picked, and the badge adds `· lowered` so the two never disagree silently. - Copy comes from `StepDownPlanner.Describe` (machine cause owns it, upload cause blames the upload); the log gets the cause-tagged line for support. Test: `EncoderRestartTests` runs a real pump with a fake encoder, changes the tier, and asserts a NEW encoder started at the new fps/bitrate and produced a frame — the regression that would otherwise ship as "it lowered the badge and the stream died". Remaining for 33: shed our own capture cost before the fps step, and the session-report line.
12 KiB
TASKS — the active queue
One line per live item; the detail lives in
TASKS/task-*.md. Done work is inTASKS/archive.md(2026-10-29 snapshot of the old catalogue). Retired decisions are indocs/ai/decisions.md. Markers: ☐ queued · 🔶 in progress · ⏳ blocked · ⏸ deferred · ❌ retired.
The surge — six days, all remaining coding (2026-11-02 → 11-07)
Every open coding row is assigned below. No later phase, no "after launch" list. Target is 6–8 units a day (above the measured 3–5 baseline — that is the point of a surge). If a day overruns, the smallest item moves to the next day; a launch blocker never moves.
Rules, every unit, no exceptions: one Good Dog test · clean build 0 warnings · per-class tests
green · ./scripts/verify.sh on the declared scope · commit with the doc fact it falsifies
corrected. No new scope mid-week; anything discovered goes on a list for day 6.
| Day | Units | Done when |
|---|---|---|
| 1 · Mon — licensing | Paid-app ownership check (BIsSubscribedApp) + Debug fake + app-wide IsAppOwned · greyed tier entries · About conversion copy + llamacasty.com link · current-launch Logs tab (replaces the separate system-message strip) · Debug-only InternalsVisibleTo |
A locked tier opens About without changing the selected free tier or leaving the app; the site opens only from its link |
| 2 · Tue — release blockers | Visibility flow (creator-selected at release; development/test stays Private) · OutputProfile entitlement: 30 fps free / 60 fps paid regardless of resolution · StreamConfig defaults |
Visibility is selectable at creation and live-editable; the 30/60-fps gate is tested; remaining Day 2 items stay queued |
| 3 · Wed — resilience | TASK 32: blip retry → measured grace → amber RECONNECTING → one-click Back on air → fragmented MP4 → ingest pre-flight · 33 bandwidth step-down | Killing the network mid-broadcast recovers without ending it |
| 4 · Thu — content & media | Text layer renders/persists; media file plays, loops; scheduled stream created | |
| 5 · Fri — data & settings | 3·20 RewardEvent persistence + superChatEvents.list backfill · 39·2 YPP slice 2 · 37 defaults-vs-current split · 35 scene-linked audio · 40·A/C/D settings round · 55·2–3 disk hygiene |
Session report reads persisted events; defaults can be reverted; temp clips cleaned |
| 6 · Sat — finish & prove | 50 publish recording · preview undo (Ctrl+Z) · 14 creator feedback batch · 36 gold pass · full sweep: clean build, whole per-class suite, publish.sh artifact, EULA/privacy/notices in the artifact · commit + push |
Gold pass list empty; artifact stages; suite green; pushed |
Day 6 is the only polish day. No polish passes before it — a surge dies on cosmetic passes taken in the middle.
Next up (after the surge slice)
Start here: TASK 33 (bandwidth step-down) — the last unbuilt piece of the resilience row, and the only launch blocker left in code. Then TASK 34 (scheduled streams; its two research flags must be cited first), then 35 / 37 / 40·A/C/D / 55·2–3. TASK 32 is complete, Back on air included.
Queue
Every open coding row here is assigned to a surge day above. Rows still marked ☐ on 2026-11-07 are a failure of the plan, not a scheduling note.
Task Status Scope Detail 53 ✅ Output-format contract — six size/FPS modes, vertical YouTube playback, and recordings visually accepted task-53— ✅ Output entitlement code: free at 30 fps / paid at 60 fps regardless of resolution; Steam App ID is still pending commercial3·17 ✅ Text layer — content, font family/size/weight/style, colour, alignment, drag/resize, persisted (done 2026-11-04) task-0321 ✅ Media source: video file added from the (+) menu decodes, composites, plays its soundtrack, loops, and stops with its last reference (done 2026-11-05) task-2164 ✅ Green/Blue Screen — detect + key from the decode pipe, offer on add, Amount/Softness/Fringe, opt-in auto-apply, alert clips included, persisted (done 2026-11-05) task-64— ☐ Transitions Move: per-layer carry-across-scenes flag, per-scene placement, fixed z band ui-surface55·2–3 ☐ Disk hygiene: delete %TEMP%alert clips on close + sweep at startup; low-disk guard before REC (slice 1 shipped)task-5540·A/C/D ☐ App Settings: active-camera picker; persist output resolution + surface transition defaults + confirm-before-End; accent consolidation task-403·20 ✅ Session report — derived from superChatEvents.liston demand, not persisted (YouTube is the authority; no ledger). Per-currency totals, money off by default (done 2026-11-05)task-0332 ✅ Stream resilience: fragmented MP4, blip retry, poll-driven RECONNECTING (no countdown — YouTube's cutoff is not a constant), ingest pre-flight, one-click Back on air ( BackOnAirTests)task-3233 🔶 Auto step-down — StepDownPolicy+ 12 unit tests done 2026-11-09 (two ladders, budgets, floors, cooldown, ambiguity, recovery behind a flag); policy, planner, VM watch, encoder relaunch and the toast are in (17 tests); remaining: shed our own capture cost before the fps step, and the session-report linetask-3334 ☐ Scheduled streams (Text-drawer version) task-3435 ☐ Scene-linked audio task-3537 ☐ Defaults vs current layout split (build-id); enables one-click revert to defaults task-37— ✅ Preview undo (Ctrl+Z / Ctrl+Shift+Z) — done 2026-11-01: Models/PreviewHistory+MainViewModel.Preview, one step per gesture, gated onEditingActive, cleared on layout load. Property edits not yet in the stackui-surface39·2 ✅ YPP slice 2 — three eligibility bars (subs / watch hours / Shorts views) from Analytics, dated thresholds with a staleness test, "x of 3 criteria met" (done 2026-11-05) task-3949 ❌ Chat profanity filter — retired 2026-11-05: YouTube owns moderation (blocked words + hold for review run before the API). Replaced by not rendering YouTube's moderation markers (tombstones / no-display events) task-4950 ☐ One-button publish of the local recording (resumable upload) task-5054 🔶 Freemium: EULA + privacy shipped; one codebase for free Demo + paid app. Blocked on Valve: identity verification pending, tax review up to 30 business days; app IDs, store page and build review all follow task-54— 🔶 Steam ownership — BIsSubscribedApp(paidAppId)+ Debug fake + app-wideIsAppOwned; paid app ID awaits Steamworkscommercial— ❌ Polar subscription path — retired 2026-11-01 with the one-price model. Design kept in decisions.md, not builtdecisions— ✅ OutputProfile gate — resolver + EncoderOptionswiring (Models/OutputProfile.cs, one ffmpeg/two outputs, dev override); higher tiers followIsAppOwnedcommercial— ✅ Demo conversion UI — owned users get higher tiers; non-owners see greyed tiers, and selecting one opens About with conversion copy and an explicit llamacasty.com link. No browser opens until the link is clicked commercial— ✅ System-message strip replaced by Logs tab — current launch's newest 500 raw AppLog entries, newest-first; no prior-launch import or logging-policy changes ui-surface— ☐ Steam packaging — publishoutput +steam_api64.dll, paid app and associated Demo setup, depot,steamcmdupload, store pages + assetsDistribution.md— ☐ Training-video series — capture the first 8–10 recurring questions as videos on @llamacasty; each is documentation, channel content and monetization at onceMARCOM → support→content loop 9·5 ☐ Webcam identity key reconciliation task-0914 🔶 Creator feedback batch — branch 3+ task-14— ❌ Retired: StreamConfigdefaults are unused; encoder output comes from the selected quality tierModels/index.md36 ☐ Gold pass — the v1 gate, always the last unit (see 1.0 gates) task-3648 ⏸ Distribution & packaging — route settled 2026-10-31 (winget/portable first; Steam + Store parked). Build steps: Distribution.md; starts after the entitlement seamtask-4810 ❌ Retired 2026-10-08; superseded by the TASK 54 rows above — the Polar design it described is rebuilt as a lease ( commercial.md), not revived as writtentask-10
Pending the creator's hands (not programming)
- ✅ App Settings grouping + right-click gear — reported working 2026-10-29.
- ✅ Transition picker/durations, Wipe, preview + program transitions — reported working 2026-10-29.
- ✅ Brand logo layer — reported working 2026-10-29.
- ⏳ Vertical-tier camera check (Live tile inside the band, Chat rect-only) — outstanding.
- ⏳ Webcam cadence: a Release take in the failing geometry (vertical tier first) blocks Units 1–2. No fix until a reading names the stage.
Creator-requested follow-ups (park for Day 6)
- Group controls under This PC and YouTube.
- ON-AIR opens a preflight using the saved visibility default and an explicit Start Broadcast — [scope] action.
- Persistent Help icon immediately left of Edit opens the creator-triggered, app-only 1-2-3 first-broadcast guide. Keep copy top-aligned and high-contrast; never composite the guide into broadcast output.
- Add YouTube category selection; send tags through the video API; support thumbnail upload.
- Add tooltips to settings tabs and make Logs wrapping effective.
1.0 gates (before the first shipped build)
- Release visibility flow — default to Private; let the creator choose Private/Unlisted/Public
in the ON-AIR preflight and change it live through
UpdateBroadcast; keep development/test runs forced Private. Hide the separate TEST button as already decided for v1. - Kill the dev multi-instance affordance —
Helpers/InstanceProfile.csis already#if DEBUG; re-prove it on a Release build. - Release engineering —
scripts/publish.shdone (self-contained win-x64,ffmpeg\guarded, no test artifacts),LlamaCasty.exeassembly rename done, full license texts besideTHIRD-PARTY-NOTICES.txt(TASK 4 req 9). Outstanding: Debug-onlyInternalsVisibleTo. - Gold pass (TASK 36): the screens/layers audit, native-Windows verification, and the branding-flash decision.