Files
ytLlive/HANDOFF.md
T

3.4 KiB
Raw Blame History

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. 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_MouseLeftButtonDownMainViewModel.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.