TASKS.md 467 → 66 lines: one line per live item, detail stays in TASKS/ task-*.md. The old catalogue (63 rows of paragraph status prose plus the historical narration) is preserved verbatim as TASKS/archive.md — a 2026-10-29 snapshot, not the live queue. The "out of product" list and every retired decision moved to docs/ai/decisions.md with cause of death. HANDOFF.md 440 → 40 lines, and it is now OVERWRITTEN, not appended: branch, what's in flight, next action, live landmines, pending creator checks. History belongs to git log; the previous handoff is reachable at ee3c592:HANDOFF.md. docs/ai/decisions.md (new) collects what no longer governs: the paid tier and its pricing, Polar, Store IAP, the Store route and why it died, the deleted Velopack updater, signing economics, the retired monetization ideas, and the permanent out-of-product list. Facts that lived in the old ai.md "Current limitations" section were re-homed rather than dropped with the router rewrite: OAuth/DPAPI/session behaviour → docs/ai/youtube-api.md; paths, persistence and the Google project number → docs/ai/environment.md. verify.sh caps now cover all four always-read files (AGENTS 210, ai 100, HANDOFF 40, TASKS 120). Docs-only unit: scope-check run, no build.
5.6 KiB
5.6 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.
Next up
TASK 3·17 — the Text layer. The TextOverlay source type exists as a placeholder and nothing
else does: 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.
The unit: text content, font family/size/weight/style, colour, alignment, drag/resize, persisted;
renderer mirrors Services/ChatBoxRenderer.cs. One Good Dog test.
Queue
| Task | Status | Scope | Detail |
|---|---|---|---|
| 3·17 | ☐ NEXT | Text layer — content, font family/size/weight/style, colour, alignment, drag/resize, persisted | task-03 |
| 21 | 🔶 | Media source: acquisition wiring + file picker + loop/volume UI (decoder, manager, pacing, loop all shipped — no AcquireAsync caller exists) |
task-21 |
| — | ☐ | Transitions Move: per-layer carry-across-scenes flag, per-scene placement, fixed z band | ui-surface |
| 55·2–3 | ☐ | Disk hygiene: delete %TEMP% alert clips on close + sweep at startup; low-disk guard before REC (slice 1 shipped) |
task-55 |
| 40·A/C/D | ☐ | App Settings: active-camera picker; persist output resolution + surface transition defaults + confirm-before-End; accent consolidation | task-40 |
| 3·20 | ☐ | RewardEvent persistence: canonical RewardEvents table + superChatEvents.list 30-day backfill (the session report and journey read it) |
task-03 |
| 32 | ☐ | Stream resilience: blip retry → measured grace + amber "RECONNECTING" → one-click Back on air → fragmented MP4 → ingest pre-flight | task-32 |
| 33 | ☐ | Bandwidth auto step-down: pure policy over dropped-frame rate, one-way within a broadcast | task-33 |
| 34 | ☐ | Scheduled streams (Text-drawer version) | task-34 |
| 35 | ☐ | Scene-linked audio | task-35 |
| 37 | ☐ | Defaults vs current layout split (build-id); enables one-click revert to defaults | task-37 |
| 39·2 | ☐ | YPP slice 2: Analytics scopes, watch-hours/Shorts velocity + ETA | task-39 |
| 49 | ☐ | Chat profanity filter: local, opt-in, non-persistent, user-supplied word list | task-49 |
| 50 | ☐ | One-button publish of the local recording (resumable upload) | task-50 |
| 53 | ☐ | Output-format contract: pin every tier with a geometry test, prove 9:16 end-to-end, recorded file matches output | task-53 |
| 54 | 🔶 | Marcom: free-forever copy live; merch POD + About links queued | task-54 |
| 9·5 | ☐ | Webcam identity key reconciliation | task-09 |
| 14 | 🔶 | Creator feedback batch — branch 3+ | task-14 |
| — | ☐ | Small: StreamConfig defaults (TargetBitrate=6000, 1920x1080) are stale — the dropdown drives StreamHealth |
this line |
| 36 | ☐ | Gold pass — the v1 gate, always the last unit (see 1.0 gates) | task-36 |
| 48 | ⏸ | Distribution & packaging — deferred to near-v1 (creator ruling 2026-10-26); route contradiction settled in one sweep then | task-48 |
| 10 | ❌ | Retired with free-forever; a Polar teardown runs only if a paid tier ever returns | task-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.sh(self-contained win-x64, no test artifacts), Debug-onlyInternalsVisibleTo, theLlamaCasty.exeassembly rename (three pack URIs, incl.MainWindow.xaml:14), full license texts besideTHIRD-PARTY-NOTICES.txt(TASK 4 req 9). - Gold pass (TASK 36): the screens/layers audit, native-Windows verification, and the branding-flash decision.