docs(37): close defaults/current split and advance the queue
This commit is contained in:
+20
-30
@@ -1,40 +1,30 @@
|
||||
# HANDOFF — 2026-11-09 (TASK 33 done; queue re-ordered for 1.0)
|
||||
# HANDOFF — 2026-11-10 (TASK 37 complete; queue advances to TASK 40)
|
||||
|
||||
## State
|
||||
|
||||
- `main`. TASK 21 (video layer + soundtrack), TASK 64 (green/blue screen) and TASK 32·4 (fragmented MP4)
|
||||
are complete; TASK 49 is retired (YouTube owns chat moderation — we just don't paint tombstones).
|
||||
- **Starting art**: `Assets/starting-background.jpg` is the corrected onboarding screen; bundled art is
|
||||
hash-keyed into the layout DB, so `StampDefaultBackgroundAsset` compares bytes and re-stamps.
|
||||
- Left panel alert stack shipped: Steam licence indicator pinned at row 1, event rows LIFO, click →
|
||||
About or Logs with the event's lines painted. Detail: `docs/ai/ui-surface.md`.
|
||||
- Site: demo video (silent loop) is the hero; Starting screen is in the scenes section.
|
||||
- **TASK 33 complete** (`0fa3006`): cause-classified step-down — shed our capture cost, then fps →
|
||||
resolution for the machine; bitrate only for the upload; one-way with recovery behind a flag.
|
||||
- **Creator hands cleared 2026-11-09**: vertical camera check 1–6 pass; vertical cadence 29.8/s.
|
||||
- Tests: 588 green; `FAST=1 ./scripts/verify.sh` ≈ 4 min.
|
||||
- `main`, clean after this closeout. App commits remain local; do not push without a checkpoint request.
|
||||
- **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
|
||||
restore the staged scene or all scenes, offline only. Webcam identity survives both restore paths.
|
||||
- TASK 14·15 mic input gain was closed by creator test (−2.6 dB, works great); slices 16–18 remain.
|
||||
- Verification: **615 tests green, clean build with 0 warnings** (`FAST=1 ./scripts/verify.sh`).
|
||||
- Steam remains blocked on Valve identity/tax review; no app IDs or store page.
|
||||
|
||||
## Next action
|
||||
|
||||
- **Queue re-ordered (creator ruling):** 35 → 37 → 40 → 55 → Move → 9·5 → 14 slices → 65 (clips) →
|
||||
66 → 67 → 68 → 36. TASK 34 (scheduling) and 50 (publishing) are **retired** — platform's surface.
|
||||
- **New:** 65 replay clips, 66 timed ticker, 67 per-event alert videos, 68 edit-while-live.
|
||||
- Site repo commits are local (`llgit.llamachile.tube`); deploy is `./deploy.sh`, not a push.
|
||||
- Do not push the app absent a checkpoint request.
|
||||
- **Steam is a wait, not a task:** identity verification pending, tax review in Valve's queue (up to 30
|
||||
business days). No app IDs, no store page, Release entitlement fails closed.
|
||||
- Queue: **40·A/C/D → Move → 9·5 → 14·16/17/18 → 66 → 67 → 68 → 36**.
|
||||
- Ask creator before TASK 68 about first-run ON-AIR default; before gold pass, settle the Release
|
||||
single-instance mutex behavior.
|
||||
- TASK 34 scheduling and TASK 50 recording publish are retired; YouTube owns those surfaces.
|
||||
- Do not push app commits absent a checkpoint request.
|
||||
|
||||
## Landmines
|
||||
|
||||
- **The preview pane draws frame-source layers from a whitelist of DataTriggers.** A layer type with no
|
||||
trigger is invisible in the preview while its decode looks healthy. Add the trigger with the layer
|
||||
type; pin it with `MediaPreviewDisplayTests`.
|
||||
- **A bundled-art "version" heal cannot work**: the constant and the embedded resource are compiled at
|
||||
different moments, so a bump can race the image it is meant to ship. Compare bytes
|
||||
(`LayoutStore.AssetMatches`). Also: `AllBackgrounds()` returns only the LIVE scene's rows.
|
||||
- Pack URIs for bundled assets must be assembly-qualified (`/LlamaCasty;component/Assets/…`): the
|
||||
unqualified form resolves against the entry assembly, which is the test host under `dotnet test`.
|
||||
- Media sessions are keyed by **path + look** (`MainViewModel.MediaSessionKey`); never acquire by raw path.
|
||||
- **The audio pipe allows ONE server per name**; DEBUG suffixes it (id, else pid), Release does not.
|
||||
- Integration tests constructing `MainWindow` must set a temporary `LayoutPathOverride` and clear it in `finally`.
|
||||
- Preview frame-source layers need a `PreviewPane` DataTrigger; pin each new type with a visibility test.
|
||||
- Bundled-art healing compares bytes (`LayoutStore.AssetMatches`); a compiled version constant races its resource.
|
||||
- Pack URIs for bundled assets must be assembly-qualified (`/LlamaCasty;component/Assets/…`).
|
||||
- Media sessions are keyed by path + look; never acquire by raw path.
|
||||
- Audio pipe allows one server per name; DEBUG suffixes it, Release does not.
|
||||
- Any test constructing `MainWindow` must use a temporary `LayoutPathOverride` and clear it in `finally`.
|
||||
- Build with the Windows `dotnet.exe` host from WSL; read render numbers in Release.
|
||||
- Bundled FFmpeg stays outside the single-file exe (`ExcludeFromSingleFile="true"`).
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
**Creator ruling 2026-11-09 — finish the queue before the new features, gold pass always last.**
|
||||
|
||||
`37 → 40·A/C/D → Move → 9·5 → 14 (slices) → 66 → 67 → 68 → 36`
|
||||
`40·A/C/D → Move → 9·5 → 14 (remaining slices) → 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 →
|
||||
@@ -20,7 +20,7 @@ output.
|
||||
| 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`](TASKS/task-35-scene-linked-audio.md) |
|
||||
| 37 | ☐ | **Defaults vs current layout split** — separate branded defaults from the live workspace; enables one-click revert | [`task-37`](TASKS/task-37-defaults-current-split.md) |
|
||||
| 37 | ✅ | **Defaults vs current layout split** — immutable SQLite default snapshot, build-stamped current layout, staged-scene and all-scene reset controls (done 2026-11-10) | [`task-37`](TASKS/task-37-defaults-current-split.md) |
|
||||
| 40·A/C/D | ☐ | **Settings round** — active-camera picker; persist output resolution + surface transition defaults + confirm-before-End; accent consolidation | [`task-40`](TASKS/task-40-app-settings-round.md) |
|
||||
| 55 | ✅ | **Disk hygiene** — log rotation (5 MB, one roll), temp alert clips deleted on close + swept at startup, low-disk guard (block under 1 GB, warn under 5 GB at start, one warning under 2 GB mid-show) — done 2026-11-10 | [`task-55`](TASKS/task-55-disk-hygiene.md) |
|
||||
| — | ☐ | **Move transition** — per-layer carry-across-scenes flag, per-scene placement, fixed z band | [`ui-surface`](docs/ai/ui-surface.md) |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# TASK 37 — Defaults vs current layout split
|
||||
|
||||
**Status:** ☐ Queued (2026-09-20)
|
||||
**Status:** ✅ Complete (2026-11-10)
|
||||
|
||||
## Idea (creator directive 2026-09-20)
|
||||
|
||||
@@ -43,6 +43,20 @@ scene[0-4].layerList.[default | current].elementList
|
||||
- A `current` stamped by a different (older/newer) build-id falls back to `default`.
|
||||
- Revert-to-default restores `default` for one scene or all.
|
||||
|
||||
## Shipped 2026-11-10
|
||||
|
||||
- Current scene/source tables remain the live workspace. One-time `Default*` snapshot tables and
|
||||
background-path settings live in the same SQLite file; schema additions are mirrored into the
|
||||
snapshots. Existing profiles promote their saved layout once; a fresh profile snapshots its seeded
|
||||
layout before creator edits. Default asset references are retained during current-layout saves.
|
||||
- Startup restores the snapshot transactionally when the current build stamp differs. Matching builds
|
||||
keep the saved current layout. Camera identity is never replaced by a layout restore; default scene
|
||||
placements are rebound to the creator's currently selected camera.
|
||||
- App Settings offers **Restore staged scene** and **Restore all scenes**, disabled while live or
|
||||
recording. A one-scene reset saves pending changes in other scenes and keeps that scene staged.
|
||||
- Integration coverage: `LayoutStoreSnapshotTests` and `LayoutResetIntegrationTests`.
|
||||
**615 tests green; clean build, 0 warnings.**
|
||||
|
||||
## Cross-references
|
||||
|
||||
- `ai.md` — persistence architecture; `MyMistakes.md` — prior reorder persistence failures.
|
||||
- `ai.md` — persistence architecture; `MyMistakes.md` — prior reorder persistence failures.
|
||||
|
||||
@@ -159,7 +159,7 @@ The app is a **director's control surface**, not an editor. This replaces the OB
|
||||
**Current layout (2026-10-26 redesign commits):** `MainWindow` has a top bar and health banner, then a two-column work area with a fixed 360px left column and preview column. Its top row holds stream readouts/resolution on the left and the five-scene strip above the preview; the lower row holds the left panel and central preview. The bottom bar is now only a height-preserving spacer.
|
||||
|
||||
- **Left panel:** `EditingActive` is an explicit `EDIT` toggle, not a mode inferred from `StreamStatus`. On = scene layers + properties; off = a two-tab panel with **Live Chat** first/default and **Logs** second. Logs is a read-only view of up to 500 `AppLog` entries captured in this process; it does not load older `startup.log` contents or change file logging/rotation. Entries wrap and use the theme's type colors. Explicit Class 1/2 severity is independent of message type/source: Class 1 sorts above Class 2 in the pinned group; acknowledging unpins the entry but retains it in the chronological list. The staged scene is the preview/edit target; `LiveScene` is the program output.
|
||||
- **Settings is a right-edge drawer, not a modal (2026-11-01):** the gear rail tab opens `Controls/SettingsDrawer` in the same animated-width stack as Stream Settings / YPP / Socials / TEST (`SettingsDrawerOpen`, exclusive with the other four). Categories are section headings with their controls indented under them — Zoom holds *Zoom view shape* and *Zoom box follows*. The app menu (Report Bug / Feature Request / About) hangs off a **right-click on the LlamaCasty wordmark**; left-click still opens About. The modal shell keeps only Bug / Feature / About, which is why it no longer needs a scroll viewer.
|
||||
- **Settings is a right-edge drawer, not a modal (2026-11-01):** the gear rail tab opens `Controls/SettingsDrawer` in the same animated-width stack as Stream Settings / YPP / Socials / TEST (`SettingsDrawerOpen`, exclusive with the other four). Categories are section headings with their controls indented under them — Zoom holds *Zoom view shape* and *Zoom box follows*. TASK 37 adds **Restore staged scene** and **Restore all scenes** under Layout defaults; both are disabled while live or recording, and restoring a layout preserves the selected webcam. The app menu (Report Bug / Feature Request / About) hangs off a **right-click on the LlamaCasty wordmark**; left-click still opens About. The modal shell keeps only Bug / Feature / About, which is why it no longer needs a scroll viewer.
|
||||
- **Top bar:** the `EDIT` toggle sits beside the REC/ON-AIR session controls; the brand and account surfaces remain at the sides. Its background uses the idle surface color when stopped. Normal ON-AIR stays `Brush.Primary` red while connecting and turns `Brush.Positive` green only after YouTube reports the broadcast `live`; stopping restores the idle color. TEST stays gold for the entire test session. Its **right edge aligns with the layers panel below** (`TopBar` column 0 is a fixed **352** = work-area margin 8 + 360px column − the bar's own 16px padding), so the button and the panel share an edge. The **settings gear moved to the preview rail** (2026-11-01): first tab, orange (`Brush.Attention`), gear icon only — left-click opens the app menu (Settings / Bug / Feature / About), right-click goes straight to App Settings.
|
||||
- **Preview gestures (2026-11-01):** *edit mode* — left selects/drags/resizes, right opens the context menu, **Ctrl+right toggles the zoom box**. *Preview mode* — **left toggles the zoom box**, right opens the context menu; **Ctrl+right does nothing at all** (no chord while live or recording — one hand, always). ⚠️ **Both the Down and the Up event must be handled for a Ctrl+right-click**: WPF's `PopupControlService` opens a context menu on right-button-**up**, so suppressing only the down event leaves the menu appearing under the gesture (found 2026-11-01 in edit mode). Menus exist on the webcam layer and the backdrop; every other layer right-clicks through to the backdrop menu. Left-dragging with the zoom box open moves it, in both modes. **Ctrl-down closes it**: pressing Ctrl while the box is open dismisses it, so the same hand that opened it can put it away (`MainWindow_PreviewKeyDown`; the box cannot cancel itself on creation because Ctrl is already down before it exists). **Follow mode** is a Settings pill, default **off = Anchor**: with Follow on, dragging re-anchors the capture to the box centre (`ZoomFollowsBox`, persisted as the `Zoom.FollowBox` setting). **The gesture activates the box at the cursor**, not merely dismisses it: `ActivateZoom` no longer refuses when idle (it used to return unless `IsLive || IsRecording`, and `ToggleZoom` only ever dismissed — so the gesture did nothing at all outside a session until 2026-11-01). The social bar consumes its own click (toggle top ⇄ bottom), and the preview's tunnelling handler steps aside for it — otherwise the bar is unclickable in preview mode and drags the layer beneath it in edit mode.
|
||||
- **Preview undo/redo (2026-11-01):** `Ctrl+Z` / `Ctrl+Shift+Z`, window-level bindings, live only while `EditingActive` — undo with the preview showing program output would rewrite a scene nobody is looking at. `Models/PreviewHistory` snapshots element **references** plus geometry, visibility, order and membership, so move / resize / reorder / add / remove / hide all undo in one step per gesture (`PushPreviewUndo` is called once at drag or resize start, never inside the move loop). Property edits (colour, opacity, border, font) are **not** captured yet — stated in the type's doc comment so nobody assumes otherwise. The stack clears on layout load. Guard: `ytLive.Tests/PreviewHistoryTests.cs`.
|
||||
|
||||
Reference in New Issue
Block a user