Files
LlamaCasty/TASKS.md
T
gramps 1e4017df03 feat(webcam): resource lifecycle startup slice — poll-on-start, single-cam lock, persistent Layers alert
The creator couldn't add a webcam to Live (grayed app-wide) and nothing in the
app explained why. Ground truth from the live DB: one Webcam identity AND one
WebcamSceneConfig in the Chat scene — so the gray was the single-identity rule
working, but the reason was unobservable. This slice makes the webcam a
resource the app validates and locks, mirroring how OBS reserves its devices.

At startup we enumerate the OS once (ValidateWebcamResourceStartupAsync, fired
after LoadLayout, stored as WebcamStartupValidationTask for tests to await):
- 0 webcams -> app runs on, layer inactive, no alarm
- exactly 1 -> attempt CameraManager.AcquireAsync as an app-wide lock; on
  failure show a persistent red alert at the bottom of the Layers panel
  (WebcamLockAlert + Retry) that re-polls every 5s and clears itself the
  moment the camera locks, or on any first real frame
- >=2 -> deliberately no auto-lock; camera selection belongs to the App
  Settings dialog (gear) — next slice

CameraManager.IsRunning(deviceId) tells the pass a session already exists
(started OR still starting) so loaded identity configs count as the lock and
the pass never double-acquires. Test seams mirror LayoutPathOverride:
CameraEnumeratorOverride / CameraFrameSourceFactoryOverride so the startup
probe never touches real hardware under test.

Good Dog test: WebcamStartupResourceTests x3 — single-cam locked + app runs on,
zero-cams no-alarm/no-lock, lock-fails -> red alert -> Retry -> clears. Full
suite 304/304, build 0 warnings, scope-check passed.

Docs in-commit: TASKS Open items + ai.md Webcam section + HANDOFF rewrite.
Also corrects the record: 'NVIDIA Broadcast opens the webcam exclusively' was a
suspect-list claim (CameraConflictProbe reads process names only, no handles)
— not restated as fact.
2026-09-17 08:03:58 -07:00

6.8 KiB
Raw Blame History

ytLlive — Task List

Catalog: task files live in TASKS/ (one file per task). This file is the index. Memory-map conventions: schema.md; architecture/decisions: ai.md.

Checklist markers — every task's Status line uses the same states:

  1. ✅ — completed / shipped
  2. 🔶 — in progress
  3. ⏳ — blocked / waiting
  4. ☐ — not started / queued
  5. ❌ — exception (known-issue, deliberately excluded, or merged)

2026-09-01 — v1 = feature-complete ruling: there is no v1.x. Everything queues to v1 or to "Out of product — permanently" (file end). Read those two sections before adding or reviving anything here.


Task catalog

# Task Status File
01 Initial Scaffold ✅ Done TASKS/task-01-initial-scaffold.md
02 YouTube OAuth2 Authentication ✅ Done TASKS/task-02-oauth2-auth.md
03 Capture Pipeline (Scenes/Sources) 🔶 In progress — 27/30 items done; items 16, 17, 20 open TASKS/task-03-capture-pipeline.md
04 RTMP Ingest to YouTube ✅ Done — all 7 items shipped TASKS/task-04-rtmp-ingest.md
05 Layout Persistence (SQLite) ✅ Done TASKS/task-05-layout-persistence.md
06 UI polish batch ✅ Done TASKS/task-06-ui-polish-batch.md
07 Meter scaling amplification ✅ Done TASKS/task-07-meter-scaling.md
08 Audio milestone ✅ SHIPPED 2026-08-14 TASKS/task-08-audio-milestone.md
09 YouTube Live Stream Management ⏳ In progress — items 1–3, 4 shipped; item 5 open; item 6 locked (TASK 36) TASKS/task-09-live-stream-management.md
10 Monetization: watermark-only subscription + Polar billing 🔶 In progress — steps 1–7 shipped TASKS/task-10-monetization.md
11 Post-pause polish batch (creator's 8 review issues) ✅ SHIPPED 2026-08-15 TASKS/task-11-polish-batch.md
12 Master limiter on the live mix ☐ Queued TASKS/task-12-master-limiter.md
13 Social media launch kit 🔶 Scoped — queued after v1 TASKS/task-13-social-launch-kit.md
14 Creator feedback batch 🔶 In progress — Branch 2 shipped TASKS/task-14-creator-feedback-batch.md
15 Stock scene background images ✅ Shipped TASKS/task-15-scene-backgrounds.md
16 Kill infinity display ✅ Shipped TASKS/task-16-kill-infinity-display.md
17 Web source rendering (WebView2) ✅ Done TASKS/task-17-web-source-rendering.md
18 Local recording ✅ Shipped a9eb360 (2026-08-29) TASKS/task-18-local-recording.md
19 Scene transitions MERGED → TASK 23 (Control Surface UX) TASKS/task-19-scene-transitions.md
20 Hotkeys (keyboard shortcuts) ✅ Done — shipped 2026-08-26 TASKS/task-20-hotkeys.md
21 Media source (video file playback) 🔶 In progress — UI picker remaining TASKS/task-21-media-source.md
22 Audio sync offset ✅ Done (2026-08-31) TASKS/task-22-audio-sync-offset.md
23 Studio mode MERGED → TASK 23 (Control Surface UX) TASKS/task-23-studio-mode.md
24 Toast notifications ✅ Done (2026-08-23) TASKS/task-24-toast-notifications.md
25 Background consolidation ✅ Done (2026-08-23) TASKS/task-25-background-consolidation.md
30 Gear menu cleanup + Default Location for Recordings + preview layout ✅ Done (2026-08-29) TASKS/task-30-gear-cleanup-preview-layout.md
31 SceneGraph component + static/dynamic compositor optimization ✅ Done (2026-08-31) TASKS/task-31-scenegraph-optimization.md
32 Stream resilience ☐ Queued (2026-09-01) TASKS/task-32-stream-resilience.md
33 Bandwidth auto step-down ☐ Queued (2026-09-01) TASKS/task-33-bandwidth-step-down.md
34 Scheduled streams (Text-drawer version) ☐ Queued (2026-09-01) TASKS/task-34-scheduled-streams.md
35 Scene-linked audio ☐ Queued (2026-09-01) TASKS/task-35-scene-linked-audio.md
36 Gold pass ☐ Queued (2026-09-01) TASKS/task-36-gold-pass.md

Open items (at a glance)

  • TASK 3 — items 16 (Text source), 17 (Alerts), 20 (Alerts precursor: RewardEvent capture) open
  • TASK 9 — item 5 open (webcam identity key reconciliation)
  • TASK 10 — Velopack update URL pending
  • TASK 12 — queued future
  • TASK 13 — queued post-v1
  • TASK 14 — Branch 2 shipped; branch 3+ in progress
  • TASK 21 — UI picker slice remaining (Windows-only verification pending)
  • TASK 32–36 — all queued future work (2026-09-01)
  • Webcam resource lifecycle (2026-09-17) — startup slice shipped: OS poll at start, single-camera auto-lock, persistent red alert in the Layers panel on lock failure (re-polls until resolved). Next slices (user-queued): multi-camera webcam selector in the App Settings dialog (gear), static (+) catalog rows (Background, YouTubeEvent, quoted labels) with reason-greying.

YouTube Live API research facts

See TASKS/research-youtube-api.md — authoritative facts for v3 build.


Out of product — permanently

These were explicitly ruled out:

  • D3D11 swap compositor (superseded by software compositor; TASK 3 item 16)
  • Background removal (ONNX/DirectML; TASK 3 item 19)
  • OBS-style source expansion (game capture, browser source, media playlist, VLC, color-key, MIDI — the minimal source set is deliberate; creators who need more have graduated to OBS)
  • Multi-layout (auto-save, single layout; multi-layout = OBS territory)
  • Cross-process stream resume (API makes it impossible; creator ruling 2026-09-01)