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.
This commit is contained in:
2026-11-01 07:31:52 -08:00
parent f189c5e328
commit b2e8b26b6e
2 changed files with 37 additions and 22 deletions
+7 -5
View File
@@ -18,11 +18,13 @@
## Next action
1. **Greyed tier entries + entitlement wiring** — the rule is in place and tested
(`Models/OutputProfile.cs`); the dropdown still shows every tier as equally available, and
`HasProOutput` is `IsPremium || DeveloperMode` with no Steam DLC path yet.
2. Then the **entitlement seam** (`IEntitlement`: Steam DLC via `steam_api64.dll`, Polar lease).
3. Steamworks: App ID waits on identity verification; then depot, store page and the DLC app.
**Tomorrow, day 1 of the surge: the entitlement seam.** `IEntitlement` (`HasDlc`, `IsValid`), the
Steam DLC implementation on `Steamworks.NET` behind it, a fake for tests, and `HasProOutput`
consuming the interface instead of `IsPremium` directly. The Steam-less path must fall back to the
free profile. Then the licence UI's four states against the fake.
Full week in `TASKS.md` → "Surge week — coding only": day 2 greyed tiers, day 3 visibility picker,
days 3–4 stream resilience, day 4 output contract, day 5 gold pass.
## Landmines
+30 -17
View File
@@ -5,27 +5,40 @@
> decisions are in [`docs/ai/decisions.md`](docs/ai/decisions.md).
> Markers: ☐ queued · 🔶 in progress · ⏳ blocked · ⏸ deferred · ❌ retired.
## Next up
## Surge week — coding only (starts 2026-11-02)
**The surge week (3 days, in this order).** Not every row below — this slice only, because it is
what the first public release is waiting on. Day 1 (artifact shape) is **done**: the exe is
`LlamaCasty.exe` and `scripts/publish.sh` stages the depot folder.
**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.
1. **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.
2. Then the **entitlement seam** (`IEntitlement`, Steam DLC path behind a fake, Polar path) and the
licence UI.
**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.
Detail: [`commercial.md`](docs/ai/commercial.md) → Output profile / Entitlement;
[`Distribution.md`](Distribution.md). After that: the visibility picker (a hard prerequisite for
any *public* build).
| 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 |
**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.
**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