Four things derived this session superseded what the plan said twenty-four hours earlier,
and the docs are corrected where each one died:
**Licensing needs no server.** Polar's customer-portal endpoints authenticate on the key
itself plus the public organization_id; the org access token is only needed to create
products. Channel binding rides in `conditions: {channel_id}`, re-checked on every
validate — so the "claim page" (a hosted OAuth flow that wrote the UC id onto the key)
and the key database it implied are deleted. Device management, key rotation and
subscription auto-revocation are Polar's; four states, one lease, no callback endpoint.
**Signing is deferred until two subscribers.** It never removes the day-one SmartScreen
warning (EV's instant-bypass died in 2024), so buying it before revenue buys only the
publisher line. Renamed to Azure Artifact Signing, $9.99/mo Basic, and it requires a
paid Azure subscription. Year-one fixed cost drops from ~$135 to ~$15.
**The Store account is free.** Microsoft waived the $19 individual fee and removed the
$99 company fee in May 2026, which makes the Store the only zero-cost route to a
Microsoft-signed install — the free answer to SmartScreen, noted beside the paid one.
**Support is a filter, not a promise.** Email, best effort, no SLA, refunds on request
without argument; no training service, no helpdesk. A repeated question becomes a
training video on @llamacasty, which is content and monetization instead of a ticket.
GitHub issues on the releases repo are the deliberate friction.
Also settled: binaries live in a second Gitea repo (`llamacasty-releases`) push-mirrored
to a public GitHub repo — issues and assets public, code private, one publish direction
(a git mirror carries refs, not GitHub Release assets); `@llamacasty` is
standard-verified with intermediate features, so live streaming, >15 min uploads and
custom thumbnails work today and no SIM or ID is needed; and OAuth comes out of Testing
mode by publishing the app (100-user lifetime cap, no 7-day token death).
TASKS.md now opens with the four-day surge slice — artifact shape, output gate,
entitlement seam, real-machine day — because those are what the first public release
waits on. HANDOFF.md rewritten. MyMistakes.md gains the Polar recipe and the
"verify means three different things" entry. MARCOM.md gains the support→content loop
and the surface roles.
8.0 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
The surge week (4 days, in this order). Not every row below — this slice only, because it is what the first public release is waiting on:
- Artifact shape —
LlamaCasty.exerename (three pack URIs),scripts/publish.sh, portable mode. Ends with a zip that runs on a clean machine. - OutputProfile gate — ≤921,600 px / ≤30 fps for the stream and the recorder, greyed tier entries, plus the TASK 53 geometry tests that pin every tier.
- Entitlement seam —
IEntitlementagainst Polar's customer-portal API with a fake for tests,--activateparsing, system messages. - Real-machine day — licence UI skeleton, a clean-profile install, a test broadcast.
Detail: commercial.md → Output profile / Entitlement;
Distribution.md. Day 5, if the four go well: the visibility picker (a hard
prerequisite for any public build).
TASK 3·17 — the Text layer stays the first product row after the surge. 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 | 🔶 | 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 |
| — | ☐ | Entitlement seam — IEntitlement over Polar's customer-portal API (org ID public, org token never in the app), conditions: {channel_id}, 2 activations, 7–14 day lease, --activate CLI. No claim page, no server |
commercial |
| — | ☐ | OutputProfile gate — ≤921,600 px / ≤30 fps for stream and recording, greyed tier entries, live re-resolve, never mid-stream | commercial |
| — | ☐ | Licence UI — key entry + four states, 7/1/0-day notices, portal link, licence ID in About | commercial |
| — | ☐ | System messages — SystemMessage + MessageCenter, strip above the dock, dedupe by key, short history, never composited |
ui-surface |
| — | ☐ | Packaging — rename, scripts/publish.sh, portable mode; then llamacasty-releases repo + Gitea→GitHub push mirror, gh release create, winget manifest. Signing deferred until two subscribers |
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 |
| 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 — route settled 2026-10-31 (winget/portable first; Steam + Store parked). Build steps: Distribution.md; starts after the entitlement seam |
task-48 |
| 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 |
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.