52 lines
3.4 KiB
Markdown
52 lines
3.4 KiB
Markdown
# HANDOFF — session state
|
||
|
||
> Current operational state, read right after `TASKS.md`. Trust this file as the
|
||
> truth of what is in flight — do not re-derive from git/fs unless it points at
|
||
> a problem. Conventions: [`schema.md`](schema.md). Rewrite this file at session
|
||
> end, compaction, or any interruption.
|
||
|
||
## Session state (last updated: 2026-08-13)
|
||
|
||
- **Branch:** `main`. TASK 4 **ship step 5.5** is **committed and pushed** (`ac60a26`,
|
||
"TASK 4 ship step 5.5: social bar bug fixes + bar on the live output").
|
||
- **This session (follow-up):** the drag-snap from 5.5 failed in practice — it snapped
|
||
up but wouldn't come back down (jitter around the deadzone, per the user). **Superseded
|
||
by a click-toggle** (user decision, KISS): `MainWindow.SocialBar_MouseLeftButtonDown`
|
||
→ `MainViewModel.ToggleSocialBarPosition()` flips the bar top ⇄ bottom; the bar rides
|
||
`{Binding SocialBarTop}` alone; `SocialBarSnap` + its 2 tests removed. Build 0 warnings,
|
||
**153 tests passing** (155 − 2 snap units). **Uncommitted:** this click-toggle change +
|
||
its memory corrections (TASKS.md / ai.md / HANDOFF). Next action: commit + push.
|
||
- **Verified:** 0 warnings; 153/153 tests pass.
|
||
- **Landmines:**
|
||
- Never set a local `Canvas.SetTop` on the social bar — a local value permanently
|
||
overrides `{Binding SocialBarTop}` (the `ClearValue` lesson from 5.5).
|
||
- The pump reads the active scene on a background thread while the UI can still
|
||
edit it — a concurrent-mutation exception is contained (logged + `Failed` +
|
||
the pump stops), not a crash. The background thread + video pipeline is the
|
||
new reality since ship step 5.
|
||
- `StopAsync` must stop the encoder (closes stdin) **before** awaiting the pump
|
||
loop — closing stdin unblocks a write stuck on pipe backpressure; the reverse
|
||
order deadlocks.
|
||
- `FramePump.IsRunning` must be set true before the loop starts (a completed-task
|
||
delay can run the first iteration synchronously on the caller's thread).
|
||
- `StartAsync` never throws; the VM fires-and-forgets it. `Failed` while live
|
||
flips `StreamStatus.Error` (minimal — real health surfacing is ship step 6).
|
||
- The heal runs off the UI thread and applies via the dispatcher; a config swap
|
||
mid-heal (dialog Save) can orphan the healed values on the old entries — harmless
|
||
(best-effort, re-healed next load).
|
||
- Tests never instantiate `MainViewModel` directly except the round-clip
|
||
integration test (a real `MainWindow`), which never goes live — keep it that way.
|
||
- Sandbox can't reach outbound HTTPS — the subdomain-probe logic is verified via
|
||
stub-handler tests only, not against the real `mastodon.llamachile.tube`.
|
||
- **Next step:** commit + push the click-toggle follow-up. Then TASK 4 ship step 6 —
|
||
health stats: bind `FramePump.HealthUpdated` (bitrate/FPS/duration) into the bottom
|
||
bar. Nothing else queued — do not expand the task queue on your own. Optional, not
|
||
queued: rewriting the healed entry's `ProfileUrl` to
|
||
`https://mastodon.llamachile.tube/@gramps` (user must say the word).
|
||
|
||
- **Secret/DB/port facts live:** OAuth client id/secret in `Helpers/OAuthCredentials.cs`;
|
||
OAuth session token in `Helpers/TokenStore.cs` (DPAPI → `%APPDATA%\ytLlive\ytLlive.auth`);
|
||
layout DB `%APPDATA%\ytLlive\ytLlive.db` (schema v8; `SocialEntry.Software`
|
||
column is a column-presence migration like the others, no version bump); OAuth callback
|
||
`http://localhost:8765/oauth2/callback`; crash log `%APPDATA%\ytLlive\startup.log`.
|