Files
LlamaCasty/TASKS.md
T
gramps b2e8b26b6e docs(tasks): the surge week, coding only — five days sized at 3-5 units each
Non-coding is parked on Valve (identity verification, store page, depot); the week is code,
tests, debugging, polish. Ordered by what actually blocks a public build: entitlement seam
and licence UI (days 1-2), greyed tiers (2), visibility picker (3), stream resilience (3-4),
output contract (4), gold pass (5).

Sized honestly against the measured rate: ~50 units remain, 15-25 fit in five days, so the
plan names week-2 candidates and the five items that should not block launch at all
(scheduled streams, scene audio, defaults split, YPP slice 2, feedback batch).

Every unit carries the same definition of done — clean build, per-class tests, verify.sh on
the declared scope, and the falsified doc corrected in the same commit.
2026-11-01 07:31:52 -08:00

102 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TASKS — the active queue
> One line per live item; the detail lives in `TASKS/task-*.md`. Done work is in
> [`TASKS/archive.md`](TASKS/archive.md) (2026-10-29 snapshot of the old catalogue). Retired
> decisions are in [`docs/ai/decisions.md`](docs/ai/decisions.md).
> Markers: ☐ queued · 🔶 in progress · ⏳ blocked · ⏸ deferred · ❌ retired.
## Surge week — coding only (starts 2026-11-02)
**Non-coding is parked** (Steam identity verification, store page, depot upload, marketing) — it is
waiting on Valve, not on us. The week is code, tests, debugging, polish. Sized at 3–5 units a day;
~50 units remain overall, so this plan is the five days, not the whole queue.
**Definition of done for every unit:** clean build 0 warnings · per-class tests green ·
`./scripts/verify.sh` with the declared scope · commit with the doc fact it falsifies, corrected.
| Day | Unit | Done when |
|---|---|---|
| **1** | **Entitlement seam** — `IEntitlement` (`HasDlc`, `IsValid`), Steam DLC impl on `Steamworks.NET` behind the interface, fake for tests, `HasProOutput` consumes it; app starts without Steam → free | Fake proves the resolution; real impl compiles; Steam-less launch shows free |
| **1–2** | **Licence UI** — four states, upgrade path per state, 7/1/0-day notices, "monthly is on the website, not Steam" line, licence ID in About | Each state renders from the fake; no modal, never blocks Start |
| **2** | **Greyed tier entries** — dropdown marks the four Pro tiers, keeps them clickable, routes to the upgrade path | Free user sees 720p30 available and the rest annotated |
| **3** | **Visibility picker + `UpdateBroadcast`** — replace the forced-Private lock, hide TEST | A public broadcast can be started and changed while live |
| **3–4** | **TASK 32 stream resilience** — blip retry → measured grace → amber RECONNECTING → one-click Back on air → fragmented MP4 → ingest pre-flight | A killed network recovers without ending the broadcast |
| **4** | **TASK 53 output contract** — geometry test per tier, 9:16 end-to-end, recorded file matches output | Every tier pinned by a test; the cap cannot drift |
| **5** | **TASK 36 gold pass** — screens/layers audit on real Windows, native verification, branding-flash decision | The audit list is empty |
**Week 2 candidates, in order:** 3·17 Text layer · 21 media wiring · 55 disk hygiene ·
40·A/C/D settings · preview undo · 9·5 webcam identity · `StreamConfig` defaults ·
3·20 reward persistence · 33 bandwidth step-down · 49 profanity filter · 50 publish recording.
**Explicitly after launch (complete-v1 ruling risks the date):** 34 scheduled streams · 35
scene audio · 37 defaults split · 39·2 YPP slice 2 · 14 feedback batch — each is a week-apiece item
and none blocks a public build.
## Next up (after the surge slice)
**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`](TASKS/task-03-capture-pipeline.md) |
| 21 | 🔶 | Media source: acquisition wiring + file picker + loop/volume UI (decoder, manager, pacing, loop all shipped — **no `AcquireAsync` caller exists**) | [`task-21`](TASKS/task-21-media-source.md) |
| — | ☐ | Transitions **Move**: per-layer carry-across-scenes flag, per-scene placement, fixed z band | [`ui-surface`](docs/ai/ui-surface.md) |
| 55·2–3 | ☐ | Disk hygiene: delete `%TEMP%` alert clips on close + sweep at startup; low-disk guard before REC (slice 1 shipped) | [`task-55`](TASKS/task-55-disk-hygiene.md) |
| 40·A/C/D | ☐ | App Settings: active-camera picker; persist output resolution + surface transition defaults + confirm-before-End; accent consolidation | [`task-40`](TASKS/task-40-app-settings-round.md) |
| 3·20 | ☐ | RewardEvent persistence: canonical `RewardEvents` table + `superChatEvents.list` 30-day backfill (the session report and journey read it) | [`task-03`](TASKS/task-03-capture-pipeline.md) |
| 32 | ☐ | Stream resilience: blip retry → measured grace + amber "RECONNECTING" → one-click Back on air → fragmented MP4 → ingest pre-flight | [`task-32`](TASKS/task-32-stream-resilience.md) |
| 33 | ☐ | Bandwidth auto step-down: pure policy over dropped-frame rate, one-way within a broadcast | [`task-33`](TASKS/task-33-bandwidth-step-down.md) |
| 34 | ☐ | Scheduled streams (Text-drawer version) | [`task-34`](TASKS/task-34-scheduled-streams.md) |
| 35 | ☐ | Scene-linked audio | [`task-35`](TASKS/task-35-scene-linked-audio.md) |
| 37 | ☐ | Defaults vs current layout split (build-id); enables one-click revert to defaults | [`task-37`](TASKS/task-37-defaults-current-split.md) |
| — | ☐ | **Preview undo (Ctrl+Z / Ctrl+Shift+Z)** — in edit mode, revert the last preview change (drag, resize, add, remove, property edit); bounded stack, cleared on scene change or layout load. The natural partner to 37: undo covers the slip, defaults cover the mess | this line |
| 39·2 | ☐ | YPP slice 2: Analytics scopes, watch-hours/Shorts velocity + ETA | [`task-39`](TASKS/task-39-ypp-journey-tracker.md) |
| 49 | ☐ | Chat profanity filter: local, opt-in, **non-persistent**, user-supplied word list | [`task-49`](TASKS/task-49-chat-profanity-filter.md) |
| 50 | ☐ | One-button publish of the local recording (resumable upload) | [`task-50`](TASKS/task-50-publish-recording.md) |
| 53 | ☐ | Output-format contract: pin every tier with a geometry test, prove 9:16 end-to-end, recorded file matches output | [`task-53`](TASKS/task-53-output-formats.md) |
| 54 | 🔶 | Freemium: EULA + privacy shipped; **no licence path built** — needs the entitlement seam, the output-profile cap and the licence UI below; site copy still says free forever | [`task-54`](TASKS/task-54-marcom-free-merch.md) |
| — | ☐ | **Steamworks entitlement** — `steam_api64.dll` + `SteamAPI.Init`, `BIsDlcInstalled(dlcAppId)` behind `IEntitlement`, free profile when Steam is absent | [`commercial`](docs/ai/commercial.md) |
| — | ☐ | **Entitlement seam** — Polar customer-portal path for the monthly (org ID public, org token never in the app), `conditions: {channel_id}`, 7–14 day lease, `--activate` CLI. **No claim page, no server** | [`commercial`](docs/ai/commercial.md) |
| — | 🔶 | **OutputProfile gate** — resolver + `EncoderOptions` wiring **done** (`Models/OutputProfile.cs`, one ffmpeg/two outputs, dev override); remaining: greyed tier entries in the dropdown, entitlement wiring | [`commercial`](docs/ai/commercial.md) |
| — | ☐ | **Licence UI** — four states, 7/1/0-day notices, "monthly is on the website, not Steam" line, portal link, licence ID in About | [`commercial`](docs/ai/commercial.md) |
| — | ☐ | **System messages** — `SystemMessage` + `MessageCenter`, strip above the dock, dedupe by key, short history, never composited | [`ui-surface`](docs/ai/ui-surface.md) |
| — | ☐ | **Steam packaging** — rename, `publish` output + `steam_api64.dll`, depot, `steamcmd` upload, store page + assets, DLC app | [`Distribution.md`](Distribution.md) |
| — | ☐ | **Training-video series** — capture the first 8–10 recurring questions as videos on `@llamacasty`; each is documentation, channel content and monetization at once | MARCOM → support→content loop |
| 9·5 | ☐ | Webcam identity key reconciliation | [`task-09`](TASKS/task-09-live-stream-management.md) |
| 14 | 🔶 | Creator feedback batch — branch 3+ | [`task-14`](TASKS/task-14-creator-feedback-batch.md) |
| — | ☐ | 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`](TASKS/task-36-gold-pass.md) |
| 48 | ⏸ | Distribution & packaging — route settled 2026-10-31 (winget/portable first; Steam + Store parked). Build steps: [`Distribution.md`](Distribution.md); starts after the entitlement seam | [`task-48`](TASKS/task-48-distribution-msix.md) |
| 10 | ❌ | 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 written | [`task-10`](TASKS/task-10-monetization.md) |
## 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
`UpdateBroadcast` in the same unit (it is the only code that can change a broadcast's privacy).
- **Kill the dev multi-instance affordance** — `Helpers/InstanceProfile.cs` is already `#if DEBUG`;
re-prove it on a Release build.
- **Release engineering** — `scripts/publish.sh` **done** (self-contained win-x64, `ffmpeg\`
guarded, no test artifacts), `LlamaCasty.exe` assembly rename **done**, full license texts beside
`THIRD-PARTY-NOTICES.txt` (TASK 4 req 9). Outstanding: Debug-only `InternalsVisibleTo`.
- **Gold pass** (TASK 36): the screens/layers audit, native-Windows verification, and the
branding-flash decision.
## Research
[`research-youtube-api.md`](TASKS/research-youtube-api.md) · [`research-store-certification.md`](TASKS/research-store-certification.md)