diff --git a/TASKS.md b/TASKS.md index 0cd51a2..7961ad2 100644 --- a/TASKS.md +++ b/TASKS.md @@ -5,43 +5,40 @@ > 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) +## The surge — six days, all remaining coding (2026-11-02 → 11-07) -**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. +**Every open coding row is assigned below.** No later phase, no "after launch" list. Target is +**6–8 units a day** (above the measured 3–5 baseline — that is the point of a surge). If a day +overruns, the smallest item moves to the next day; a launch blocker never moves. -**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. +**Rules, every unit, no exceptions:** one Good Dog test · clean build 0 warnings · per-class tests +green · `./scripts/verify.sh` on the declared scope · commit with the doc fact it falsifies +corrected. No new scope mid-week; anything discovered goes on a list for day 6. -| Day | Unit | Done when | +| Day | Units | 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 | +| **1 · Mon** — licensing | `IEntitlement` seam + Steam DLC impl + fake · `HasProOutput` on the seam · greyed tier entries · licence UI four states + 7/1/0-day notices + "monthly is on the website, not Steam" · licence ID in About · system messages (`SystemMessage`/`MessageCenter` strip) · Debug-only `InternalsVisibleTo` | Fake drives all four states; Steam-less launch is the free profile; About shows the licence ID | +| **2 · Tue** — release blockers | Visibility picker + `UpdateBroadcast` · `StreamConfig` defaults · TASK 53 output contract (geometry test per tier, 9:16 e2e) · 9·5 webcam identity key · Move transitions (per-layer carry-across-scenes) | A public broadcast starts and changes while live; every tier pinned by a test | +| **3 · Wed** — resilience | TASK 32: blip retry → measured grace → amber RECONNECTING → one-click Back on air → fragmented MP4 → ingest pre-flight · 33 bandwidth step-down | Killing the network mid-broadcast recovers without ending it | +| **4 · Thu** — content & media | 3·17 Text layer · 21 media acquisition wiring + file picker + loop/volume UI · 49 chat profanity filter · 34 scheduled streams | Text layer renders/persists; media file plays, loops, has volume; scheduled stream created | +| **5 · Fri** — data & settings | 3·20 RewardEvent persistence + `superChatEvents.list` backfill · 39·2 YPP slice 2 · 37 defaults-vs-current split · 35 scene-linked audio · 40·A/C/D settings round · 55·2–3 disk hygiene | Session report reads persisted events; defaults can be reverted; temp clips cleaned | +| **6 · Sat** — finish & prove | 50 publish recording · preview undo (Ctrl+Z) · 14 creator feedback batch · 36 gold pass · full sweep: clean build, whole per-class suite, `publish.sh` artifact, EULA/privacy/notices in the artifact · commit + push | Gold pass list empty; artifact stages; suite green; pushed | -**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. +**Day 6 is the only polish day.** No polish passes before it — a surge dies on cosmetic passes taken +in the middle. ## 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. +**TASK 3·17 — the Text layer** is scheduled in the surge (day 4). Placeholder detail retained for +the unit itself: `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. Text content, font family/size/weight/style, colour, alignment, drag/resize, +persisted; renderer mirrors `Services/ChatBoxRenderer.cs`. ## Queue +> Every open coding row here is assigned to a surge day above. Rows still marked ☐ on +> 2026-11-07 are a failure of the plan, not a scheduling note. | 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) |