docs(tasks): six days, all remaining code — no week 2, no after-launch list

Correcting my own plan: the surge is six calendar days (Mon 2 - Sat 7), Saturday included,
and it finishes the coding side. Every open row is assigned to a day; the week-2 and
after-launch sections are gone because there are no such sections.

Days: licensing (entitlement, licence UI, greyed tiers, system messages), release blockers
(visibility picker, output contract, webcam identity, Move transitions), resilience (TASK 32,
bandwidth step-down), content and media (text layer, media wiring, profanity filter,
scheduled streams), data and settings (reward persistence, YPP slice 2, defaults split,
scene audio, settings round, disk hygiene), finish and prove (publish recording, undo, gold
pass, full sweep).

Target 6-8 units a day against a measured baseline of 3-5 — that gap is the surge. If a day
overruns, the smallest item moves; a launch blocker never does. Day 6 is the only polish day.
This commit is contained in:
2026-11-01 07:35:38 -08:00
parent 68fdacc12d
commit 600088c794
+23 -26
View File
@@ -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) |