591 green, 0 warnings.
- `Scene.SceneMutesMic` / `SceneMutesDesktop` are **nullable booleans**: null = leave the mix alone, so
a scene is passive until the creator says otherwise. Schema columns added, NULL for every existing
layout except one deliberate default.
- **Applied once when the scene takes the PROGRAM output** (`TransitionToScene`, only when live or
recording). Staging a scene offline is auditioning, not a stream edit — the test asserts that.
- **The creator is boss:** a manual mute survives any transition into a scene with no opinion; a scene
that does have one wins on its next entry. `SetMicMuted`/`SetGameMuted` are idempotent so a repeated
"mute" cannot clobber the level that unmute would restore.
- **BRB ships muted** (creator spec) for new layouts *and* via a one-time migration for existing rows
where the creator has never expressed an opinion.
- UI: two three-state checkboxes under the layers list ("When this scene goes live"), styled with
`PropertyPillCheck` so the theme test holds.
`SceneAudioTests` covers the whole rule in one integration test: default state, offline staging does
nothing, live entry mutes, manual unmute survives a passive scene, an opinionated scene wins, desktop
untouched, and all three states roundtrip through save/reload.
Needs the creator's eye: the checkboxes are new chrome in the left panel (indeterminate = passive).
5.5 KiB
5.5 KiB
TASKS — the active queue
One line per live item; the detail lives in
TASKS/task-*.md. Done work and the retired surge plan are inTASKS/archive.md. Retired decisions are indocs/ai/decisions.md. Markers: ☐ queued · 🔶 in progress · ⏳ blocked · ⏸ deferred · ❌ retired.
Next up
Creator ruling 2026-11-09 — finish the queue before the new features, gold pass always last.
37 → 40·A/C/D → 55·2–3 → Move → 9·5 → 14 (slices) → 65 → 66 → 67 → 68 → 36
The rule behind the two retirements below: do not rebuild the platform's own surface. Scheduling, publishing, moderation and channel management are YouTube's; the app owns capture → scene → sound → output.
Queue
| Task | Status | Scope | Detail |
|---|---|---|---|
| 35 | ✅ | Scene-linked audio — the scene remembers the room: BRB ships muted, three-state checkboxes per scene, applied once when the scene takes the program output (done 2026-11-10) | task-35 |
| 37 | ☐ | Defaults vs current layout split — separate branded defaults from the live workspace; enables one-click revert | task-37 |
| 40·A/C/D | ☐ | Settings round — active-camera picker; persist output resolution + surface transition defaults + confirm-before-End; accent consolidation | task-40 |
| 55·2–3 | ☐ | Disk hygiene — delete %TEMP% alert clips on close + sweep at startup; low-disk guard before REC (slice 1 shipped) |
task-55 |
| — | ☐ | Move transition — per-layer carry-across-scenes flag, per-scene placement, fixed z band | ui-surface |
| 9·5 | ☐ | Webcam identity key reconciliation — one stable identity per camera across re-plugs | task-09 |
| 14 | 🔶 | Creator feedback batch — Branch 2 shipped; Branch 3 = mic input gain, webcam blank/standby, opacity+geometry consistency, Show-in-folder on stop | task-14 |
| 65 | ☐ | Replay clips — 10/15/20 s (default 15), RAM ring of fragmented MP4, F10 to save; replay layer plays once then hides in Live and loops the last 1–3 elsewhere; silent by default; three kept | task-65 |
| 66 | ☐ | Timed ticker messages — "every N minutes show this", from a creator-written list | task-66 |
| 67 | ☐ | Per-event alert videos — a clip per monetization event, falling back to the default | task-67 |
| 68 | ☐ | Editing while live + first-run On-Air state matching the 1-2-3 screen | task-68 |
| 36 | ☐ | Gold pass — the v1 gate: screens/layers audit (every control does something), native-Windows verification, branding-flash decision. Always the last unit | task-36 |
| 34 | ❌ | Scheduled streams — retired 2026-11-09. YouTube owns scheduling and the reminder that makes it useful; the app neither creates nor displays scheduled broadcasts, and there is no value in a copy that can fall out of sync | decisions |
| 50 | ❌ | Publish recording — retired 2026-11-09. YouTube Studio owns upload (resumable, quota-aware, and it explains rejections). In-app publishing would also widen the OAuth consent to whole-channel video management. The recording lands in the creator's folder; the app adds "Show in folder" instead | decisions |
| 54 | 🔶 | Freemium: EULA + privacy shipped; one codebase for free Demo + paid app. Blocked on Valve — identity verification pending, tax review up to 30 business days | task-54 |
| — | 🔶 | Steam ownership — BIsSubscribedApp(paidAppId) + Debug fake + app-wide IsAppOwned; paid app ID awaits Steamworks |
commercial |
| — | ☐ | Steam packaging — publish output + steam_api64.dll, paid app and Demo, depots, steamcmd upload, store pages + capsule assets, measured system requirements |
Distribution.md |
| 48 | ⏸ | Distribution & packaging (winget/portable) — parked behind the entitlement seam | task-48 |
| — | ☐ | Training-video series — 32 subjects listed in youTubeTrainingVideos.md; each is documentation, channel content and support deflection at once |
youTubeTrainingVideos.md |
1.0 gates (before the first shipped build)
- Release visibility flow — default to Private; let the creator choose Private/Unlisted/Public at
creation and change it live through
UpdateBroadcast; keep development/test runs forced Private. - Kill the dev multi-instance affordance —
Helpers/InstanceProfile.csis#if DEBUG; re-prove on a Release build. - Single-instance guard — Release has none: two launches share one layout DB (read-whole/write-whole) and one audio pipe. A named mutex that activates the first window.
- Gold pass (TASK 36).
- Release engineering:
publish.shdone, exe rename done, full licence texts besideTHIRD-PARTY-NOTICES.txtneeded; Debug-onlyInternalsVisibleTooutstanding.