Check Steam ownership of the paid app with BIsSubscribedApp; keep Debug fake ownership out of Release. Ref: https://partner.steamgames.com/doc/api/ISteamApps#BIsSubscribedApp
10 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 · simple demo-to-paid status and Steam store link · system messages (SystemMessage/MessageCenter strip) · Debug-only InternalsVisibleTo |
Fake covers owned/not-owned; Release fails closed without Steam or the paid app ID; ownership sets the app-wide flag |
| 2 · Tue — release blockers | Visibility picker + UpdateBroadcast · StreamConfig defaults · TASK 53 output contract (geometry test per tier, 9:16 e2e) · 9·5 webcam identity key · Move transitions (per-layer carry-across-scenes) |
A public broadcast starts and changes while live; every tier pinned by a test |
| 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 | 3·17 Text layer · 21 media acquisition wiring + file picker + loop/volume UI · 49 chat profanity filter · 34 scheduled streams | Text layer renders/persists; media file plays, loops, has volume; 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)
TASK 3·17 — the Text layer is scheduled in the surge (day 4). Placeholder detail retained for
the unit itself: AddSource creates it 0×0, all four compositor paths continue past it,
FramePump's hash skips it, it is not draggable, and it has no text/font/colour properties or
persistence. Text content, font family/size/weight/style, colour, alignment, drag/resize,
persisted; renderer mirrors Services/ChatBoxRenderer.cs.
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 3·17 ☐ NEXT Text layer — content, font family/size/weight/style, colour, alignment, drag/resize, persisted task-0321 🔶 Media source: acquisition wiring + file picker + loop/volume UI (decoder, manager, pacing, loop all shipped — no AcquireAsynccaller exists)task-21— ☐ 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 ☐ RewardEvent persistence: canonical RewardEventstable +superChatEvents.list30-day backfill (the session report and journey read it)task-0332 ☐ Stream resilience: blip retry → measured grace + amber "RECONNECTING" → one-click Back on air → fragmented MP4 → ingest pre-flight task-3233 ☐ Bandwidth auto step-down: pure policy over dropped-frame rate, one-way within a broadcast task-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: Analytics scopes, watch-hours/Shorts velocity + ETA task-3949 ☐ Chat profanity filter: local, opt-in, non-persistent, user-supplied word list task-4950 ☐ One-button publish of the local recording (resumable upload) task-5053 ☐ Output-format contract: pin every tier with a geometry test, prove 9:16 end-to-end, recorded file matches output task-5354 🔶 Freemium: EULA + privacy shipped; free Steam Demo and paid app use one codebase; ownership path and demo conversion UI remain in the rows below 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 done (Models/OutputProfile.cs, one ffmpeg/two outputs, dev override); remaining: greyed tier entries driven byIsAppOwnedcommercial— ☐ Demo conversion UI — owned users get higher tiers; demo users see greyed tiers and a Steam store link. No key entry, subscription notices, or portal commercial— ☐ System messages — SystemMessage+MessageCenter, strip above the dock, dedupe by key, short history, never compositedui-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— ☐ Small: StreamConfigdefaults (TargetBitrate=6000,1920x1080) are stale — the dropdown drivesStreamHealththis line 36 ☐ 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.
1.0 gates (before the first shipped build)
- Visibility picker — replace the always-Private lock, hide the TEST button, and wire
UpdateBroadcastin the same unit (it is the only code that can change a broadcast's privacy). - 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.