e2ecc248e0
Four builds (89/90 + two) burned proving the alert video was PERFECT: real h264 1280x720, 240 frames decoded, alert audio in the live mix, and the shipped asset byte-identical (md5 0ee1f496…) to the creator's llamacasty-dancingLlama-thankyou.mp4 with every sampled frame full bright content. Build 90's new diagnostics then showed the frame reaching BOTH consumers every second for the whole clip — `Alert preview: frame=680x200 a255` and `Output resolver: frame 680x200 playing=True` — an opaque, correctly-sized frame, handed over and never seen. Root cause: Controls/PreviewPane.xaml keeps the per-element Image Collapsed unless a DataTrigger fires, and there was no IsAlertBox trigger (only IsImageSource / IsChatBox / IsWebSource / IsWebcam). The alert box's Image was therefore Collapsed forever. Chat boxes rendered because they HAVE a trigger — that asymmetry is the whole clue, and it is why removing/re-adding the layer could never fix it. Fix: an IsAlertBox DataTrigger beside the IsChatBox one. Two Good Dog tests, because the existing fakes had been hiding this: - AlertBoxPreviewVisibilityTests (red `Expected: Visible / Actual: Collapsed`, now green) drives the real MainWindow + PreviewPane and asserts the bound Image is Visible — the first alert test that crosses the XAML at all. - AlertClipOutputTests is the first test in the repo to run a REAL codec: pinned ffmpeg generates a clip, the real AlertClipDecoder + AlertOverlayLayer + SceneCompositor composite it, and the box rect must be a colourful picture that DIFFERS from idle. It passed while the feature was broken in the app — which is exactly why it was needed: it exonerated decode+layer+compositor and pointed the hunt at the last hop. Also keeps the two once-per-second alert diagnostics (resolver + preview) that settled it, pending the creator's call on whether to keep them. Notes: the pinned BtbN ffmpeg has no libx264, so the test clip is -c:v mpeg4. SceneCompositor.Render fills its base with opaque black, so the test compares against an idle render rather than counting non-zero bytes. MediaSource has the same missing trigger in PreviewPane.xaml — left unfixed as out of scope, noted in HANDOFF. Full suite 324/324. Lesson recorded in MyMistakes.md rule (5): a producer that hands over a correct frame has still delivered nothing — when output arrives and the user still sees nothing, stop auditing the producer and audit the consumer's VISIBILITY.
73 lines
4.3 KiB
Markdown
73 lines
4.3 KiB
Markdown
# HANDOFF — 2026-09-26, end of session
|
|
|
|
## Where we are
|
|
`main`, **5 local commits ahead of `origin/main` (= `ecb329e`), NOTHING PUSHED.**
|
|
Last pushed commit is still `ecb329e`. Do not push without the creator saying so.
|
|
|
|
| commit | what |
|
|
|---|---|
|
|
| `a11b15e` | TASK 47 alert video (first landing) |
|
|
| `7b940b6` | poller-thread marshal crash fix |
|
|
| `80038ff` | silent-decoder fallback + diagnostics |
|
|
| `aea0670` | video pacing via `FfmpegFrameRateProbe` |
|
|
| (last, unpushed) | **the real alert fix: `PreviewPane.xaml` `IsAlertBox` trigger** + 2 Good Dog tests + resolver/preview diagnostics |
|
|
|
|
## THE ANSWER (do not re-derive this)
|
|
The alert video was **never drawn**, never mis-decoded. Build 90's diagnostics showed
|
|
`Alert preview: frame=680x200 a255` and `Output resolver: frame 680x200 playing=True`
|
|
every second for the whole clip — a real, opaque, correctly-sized frame reaching BOTH
|
|
consumers. `Controls/PreviewPane.xaml` keeps the per-element `Image` `Collapsed` unless a
|
|
DataTrigger fires, and there was **no `IsAlertBox` trigger** (only IsImageSource /
|
|
IsChatBox / IsWebSource / IsWebcam). Chat boxes rendered; alert boxes never could.
|
|
Removing/re-adding the layer could not have fixed it.
|
|
|
|
Clip itself is fine: DB asset `941785b0-d022-45fa-a8a2-2cd59ae2ba48` is byte-identical
|
|
(md5 `0ee1f4960dd3b23dee5930a2af79d410`) to the creator's
|
|
`C:\Users\gramp\Downloads\llamacasty-dancingLlama-thankyou.mp4` — h264 1280x720 10s,
|
|
every sampled frame full bright content.
|
|
|
|
## Working tree
|
|
Clean apart from the uncommitted work unit above (it is committed; check `git status`).
|
|
If the app is running, `ytLive.dll`/`.exe` are LOCKED and any build fails with MSB3021/
|
|
MSB3027 — the creator must close ytLive first. That is normal, not a broken build.
|
|
|
|
## Build / test commands (Windows host, always)
|
|
```bash
|
|
"/mnt/c/Program Files/dotnet/dotnet.exe" build "C:\Users\gramp\Documents\Code\projects\ytLive\ytLive.csproj" --no-restore
|
|
"/mnt/c/Program Files/dotnet/dotnet.exe" vstest "C:\Users\gramp\Documents\Code\projects\ytLive\ytLive.Tests\bin\Debug\net8.0-windows10.0.19041.0\ytLive.Tests.dll"
|
|
```
|
|
Last full suite: **324/324 pass**. Run it with ytLive CLOSED or the RealMouseDrag env
|
|
flake fires.
|
|
|
|
## Queued next (creator's words, 2026-09-26) — the Good Dog queue
|
|
1. **Test-console chat must not clear the chat window.** "when I add a chat message from
|
|
the test console, or from any console, that chat text should not clear the current
|
|
chat window."
|
|
2. **Test pull-out chat input: 20px right padding** — the text box is clipped at the right
|
|
edge of the div; needs 20px padding against the div's right side.
|
|
3. **Test pull-out chat input: Enter inserts a newline**, it must not send.
|
|
4. Verify the alert video live on the next build (the fix is in; nobody has SEEN it play
|
|
yet). This is the confirmation step for the commit above.
|
|
|
|
## Landmines / facts worth keeping
|
|
- The pinned BtbN ffmpeg has **no libx264** — generate test clips with `-c:v mpeg4`.
|
|
- `SceneCompositor.Render` fills its base with **opaque black**, so "any non-zero byte"
|
|
is not proof a layer painted. Compare against an idle render, or count COLOURFUL px.
|
|
- `sqlite3` on WSL: `/home/gramps/android-sdk/platform-tools/sqlite3`. Extract a BLOB with
|
|
`SELECT writefile('/tmp/opencode/x.bin', Data) FROM Asset WHERE Id='…'` (Linux paths
|
|
only — a `C:/…` path creates a junk `C:` dir IN THE REPO; one was made and removed).
|
|
- Layout DB: `/mnt/c/Users/gramp/AppData/Roaming/ytLlive/ytLlive.db` (tables: `Asset`
|
|
`Id/Hash/Data`, `Settings`, `Source`, `Scene`, …). Alert default video setting key:
|
|
`AlertDefaultVideoAssetId`. ffmpeg/ffprobe live in
|
|
`/mnt/c/Users/gramp/AppData/Roaming/ytLlive/tools/` (run the `.exe` directly from WSL).
|
|
- Two diagnostics were ADDED and are still in the tree (once-per-second, alert only):
|
|
`Output resolver: alert box …` (MainViewModel.cs) and `Alert preview: box …`
|
|
(AlertOverlayLayer.cs). Decide with the creator whether to keep them or strip them now
|
|
that the root cause is known.
|
|
- `PreviewPane.xaml` has the same latent gap for `IsMediaSource` (no trigger either) —
|
|
NOT fixed (out of scope), noted as a follow-up.
|
|
- Known perf item, untouched: FramePump stalls ~140-180ms renders
|
|
(`render=full-render split=0 … totalMs=140`). Unrelated to the alert bug.
|
|
- YouTube rejects the `complete` transition (403) at end-of-stream; `enableAutoStop`
|
|
finishes the broadcast. Harmless, already handled.
|