Licensing posture changes to closed-source commercial software (creator ruling 2026-10-30): free tier caps output at 720p30, a paid licence unlocks 1080p ($10/month or $400 lifetime). - LICENSE is now an End User License Agreement: grant, what you may do with your own content, no redistribution/reverse engineering, third-party components prevail, updates at publisher discretion, warranty and liability limits, termination, governing law. - ADDITIONAL-TERMS.md deleted — those were GPL §7 terms and have no meaning under the EULA. - THIRD-PARTY-NOTICES.txt keeps every third-party obligation and drops the GPL header and §6 source offer; it states plainly that LlamaCasty ships no source. - PRIVACY.md is new: exactly what is written locally (layout DB, DPAPI token, capped log, recordings you choose), what leaves the machine (Google's APIs only, with your account), and the standing promises (chat rendered never stored, no telemetry, no ad SDKs). - README, docs/ai/product.md, docs/ai/decisions.md and TASKS.md record the decision and the obligations that still bind (ffmpeg LGPL as a separate process, OFL fonts, CC0 icons, model provenance, notices in the About screen). Deliberately NOT decided here: key issuance/verification and the resolution gate itself. Earlier GPL builds remain GPL for the versions that shipped under it.
67 lines
5.7 KiB
Markdown
67 lines
5.7 KiB
Markdown
# 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.
|
||
|
||
## 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`](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) |
|
||
| 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 | 🔶 | Licensing posture changed 2026-10-30: **freemium** (720p30 free, $10/mo or $400 lifetime) — EULA + privacy shipped; site copy still says free forever, entitlement/keys not built | [`task-54`](TASKS/task-54-marcom-free-merch.md) |
|
||
| 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 — deferred to near-v1 (creator ruling 2026-10-26); route contradiction settled in one sweep then | [`task-48`](TASKS/task-48-distribution-msix.md) |
|
||
| 10 | ❌ | Retired with free-forever; a Polar teardown runs only if a paid tier ever returns | [`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` (self-contained win-x64, no test artifacts),
|
||
Debug-only `InternalsVisibleTo`, the `LlamaCasty.exe` assembly rename (three pack URIs, incl.
|
||
`MainWindow.xaml:14`), full license texts beside `THIRD-PARTY-NOTICES.txt` (TASK 4 req 9).
|
||
- **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)
|