docs(70): queue the Live Window App overlay layer

Record the creator's Live-only, single-layer scope and distinguish it from the
existing session-scoped Capture Window backdrop pin. Include HWND lifecycle,
protected-window, visual-only, and duplicate-underlay boundaries.

Reference scan: Microsoft HWND capture item API and OBS Window Capture:
https://learn.microsoft.com/en-us/windows/win32/api/windows.graphics.capture.interop/nf-windows-graphics-capture-interop-igraphicscaptureiteminterop-createforwindow
https://obsproject.com/kb/window-capture-sources
This commit is contained in:
2026-11-11 07:42:37 -08:00
parent 4e5b4e3999
commit 2c5a3d8c11
3 changed files with 49 additions and 3 deletions
+2 -2
View File
@@ -2,7 +2,7 @@
## State ## State
- `main`, worktree clean. App work is pushed through `b265d42`; TASK 69 queue update is local only. - `main`. App code is pushed through `b265d42`; queue-only docs commits are local.
- **Done:** TASK 35 scene-linked audio, TASK 55 disk hygiene, TASK 65 replay clips, TASK 37 defaults/current split. - **Done:** TASK 35 scene-linked audio, TASK 55 disk hygiene, TASK 65 replay clips, TASK 37 defaults/current split.
- TASK 37: SQLite keeps an immutable default snapshot beside build-stamped current rows; App Settings can - TASK 37: SQLite keeps an immutable default snapshot beside build-stamped current rows; App Settings can
restore the staged scene or all scenes, offline only. Webcam identity survives both restore paths. restore the staged scene or all scenes, offline only. Webcam identity survives both restore paths.
@@ -12,7 +12,7 @@
## Next action ## Next action
- Queue: **40·A/C/D → Move → 9·5 → 14·16/17/18 → 66 → 67 → 68 → 69 → 36**. - Queue: **40·A/C/D → Move → 9·5 → 14·16/17/18 → 66 → 67 → 68 → 69 → 70 → 36**.
- Ask creator before TASK 68 about first-run ON-AIR default; before gold pass, settle the Release - Ask creator before TASK 68 about first-run ON-AIR default; before gold pass, settle the Release
single-instance mutex behavior. single-instance mutex behavior.
- TASK 34 scheduling and TASK 50 recording publish are retired; YouTube owns those surfaces. - TASK 34 scheduling and TASK 50 recording publish are retired; YouTube owns those surfaces.
+2 -1
View File
@@ -9,7 +9,7 @@
**Creator ruling 2026-11-09 — finish the queue before the new features, gold pass always last.** **Creator ruling 2026-11-09 — finish the queue before the new features, gold pass always last.**
`40·A/C/D → Move → 9·5 → 14 (remaining slices) → 66 → 67 → 68 → 69 → 36` `40·A/C/D → Move → 9·5 → 14 (remaining slices) → 66 → 67 → 68 → 69 → 70 → 36`
The rule behind the two retirements below: **do not rebuild the platform's own surface.** Scheduling, 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 → publishing, moderation and channel management are YouTube's; the app owns capture → scene → sound →
@@ -31,6 +31,7 @@ output.
| 67 | ☐ | **Per-event alert videos** — a clip per monetization event, falling back to the default | [`task-67`](TASKS/task-67-per-event-alert-videos.md) | | 67 | ☐ | **Per-event alert videos** — a clip per monetization event, falling back to the default | [`task-67`](TASKS/task-67-per-event-alert-videos.md) |
| 68 | ☐ | **Editing while live** + first-run On-Air state matching the 1-2-3 screen | [`task-68`](TASKS/task-68-edit-while-live.md) | | 68 | ☐ | **Editing while live** + first-run On-Air state matching the 1-2-3 screen | [`task-68`](TASKS/task-68-edit-while-live.md) |
| 69 | ☐ | **Chat sample-preview toggle** — per-layer control to show/hide mock chat in the preview; real messages unaffected, never output | [`task-69`](TASKS/task-69-chat-preview-toggle.md) | | 69 | ☐ | **Chat sample-preview toggle** — per-layer control to show/hide mock chat in the preview; real messages unaffected, never output | [`task-69`](TASKS/task-69-chat-preview-toggle.md) |
| 70 | ☐ | **Window App layer** — capture one selected running app window as a visual layer over Live's game/display capture | [`task-70`](TASKS/task-70-window-app-layer.md) |
| 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`](TASKS/task-36-gold-pass.md) | | 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`](TASKS/task-36-gold-pass.md) |
| 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`](docs/ai/decisions.md) | | 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`](docs/ai/decisions.md) |
| 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`](docs/ai/decisions.md) | | 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`](docs/ai/decisions.md) |
+45
View File
@@ -0,0 +1,45 @@
# TASK 70 — Window App layer
**Status:** ☐ Queued (creator request 2026-11-11); scheduled after TASK 69 and before the gold pass.
## Request and locked limits
Add a **Window App** layer that captures a specific running app window and composites it above the
Live scene's game/display Background. Example: show a terminal over a game. This is an ordinary
foreground visual layer, not the existing TASK 38 **Capture Window…** action, which replaces the
locked Background itself.
- Available in **Live only**.
- At most **one Window App layer** may be active in the layout.
- It cannot remove or mask the target from the underlying game/display capture. If the app is already
visible in those captured pixels, it may appear twice; do not select the game/already-captured app as
the overlay target.
- Visual only; no independent per-app audio capture or routing.
- Enumerate visible top-level windows of other processes. A process with several windows may offer
several titled entries; this selects a window, not every window owned by the process.
## Capture boundaries
- Target HWNDs are session-scoped. Never resurrect a raw HWND after restart: Windows can recycle it to
an unrelated window. The creator must select the window again for a new session.
- If the target closes, minimizes, suspends rendering, or cannot be captured, its image may freeze,
disappear, or go black; release the dead capture rather than leaving an apparently live layer.
- Secure/protected content may be returned black or excluded by Windows. This is an OS restriction,
not something LlamaCasty can bypass.
## Acceptance
- Add → Window App lists eligible windows and selection adds one Live-scene layer above the Background.
- The source updates while its target window is running, independent of whether another window covers it.
- The app refuses a second Window App layer and refuses adding this source outside Live.
- Target closure/failure is surfaced and releases the capture; restarting never reuses a saved HWND.
- One Good Dog integration test drives a fake capture source/enumerator. A real Windows visual check is
required before commit.
## Reference scan
- Windows Graphics Capture exposes HWND-targeted items via
[`IGraphicsCaptureItemInterop::CreateForWindow`](https://learn.microsoft.com/en-us/windows/win32/api/windows.graphics.capture.interop/nf-windows.graphics.capture.interop-igraphicscaptureiteminterop-createforwindow).
- OBS's [Window Capture source](https://obsproject.com/kb/window-capture-sources) confirms the intended
foreground-source behavior; Windows documents that protected windows may be black or omitted in
[New Ways to do Screen Capture](https://blogs.windows.com/windowsdeveloper/2019/09/16/new-ways-to-do-screen-capture/).