Files
ytLlive/HANDOFF.md
T

70 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`. The **audio UX follow-up** (`9f9ed34`) is **committed and pushed**.
- **This session (round 2 — the game audio bar + meter fixes):**
1. **Meter scaling:** the bars looked dead on a flat scale — real speech/game RMS is
~0.01..0.1 linear, so the fill barely moved even at full volume. Added
`AudioLevelMeter.ToDisplay(float)`: maps 60..0 dBFS linearly onto 0..1. Both meters
(mic `MeterLevel`, game `GameMeterLevel`) now scale the raw level through it before
multiplying by volume. +2 unit tests.
2. **Game bar placement correction (user: it belongs in the preview, not the footer):**
moved the game audio bar OUT of the footer (footer back to two rows) and into the
**preview window** as a bottom-center dark chip overlaid on the live display
(`MainWindow.xaml`, in the `PreviewGrid` next to the OpacityChip). Monitoring UI
only — never rendered into the live output (the `SceneCompositor` is unaware of it).
3. **About button (user: stop jacking Notepad; standalone app):** the top-bar About
button that opened `THIRD-PARTY-NOTICES.txt` in the OS viewer is GONE (button +
`AboutButton_Click` removed). The **ytLlive wordmark (top-left) is now clickable**
and opens the existing in-app About overlay (`OpenAboutCommand`). Queued as task 21:
make a real logo + expand the About overlay into the creator's hub (premium / coffee
/ socials links + a scrolling licensing/legal panel, all in-app).
- **Uncommitted:** this round-2 work — `Services/Audio/AudioLevelMeter.cs`,
`ViewModels/MainViewModel.cs`, `MainWindow.xaml` (scaling + game bar + logo/About),
`MainWindow.xaml.cs` (AboutButton_Click + unused usings removed), `ytLive.Tests/AudioMixerTests.cs`
(2 new `ToDisplay` tests), memory docs (TASKS.md — incl. new task 21, ai.md,
Services/index.md, ViewModels/index.md, HANDOFF, THIRD-PARTY-NOTICES.txt).
- **Verified:** build 0 warnings, 0 errors; **169 tests passing** (full suite).
- **Landmines:**
- Never set a local `Canvas.SetTop` on the social bar — a local value permanently
overrides `{Binding SocialBarTop}` (the `ClearValue` lesson from 5.5).
- `AudioMixer` meter `Push` is unconditional **by design now**: `OnMicSample`/
`OnLoopbackSample` compute the level first, then raise the event — a
`?.Invoke(meter.Push(...))` short-circuit skipped the meter update when
nothing was subscribed (found by `RestartMic_ResetsLevel`, fixed).
- `MicConnected` comes from the source `Started` event, raised right after
`StartRecording()` succeeds — tests must `MarkStarted()` the fake source
before asserting connection state.
- Zero mic devices at startup = red dot AND the mixer is never started, so
loopback + the game bar can't run either (no capture at all) — acceptable.
- The game detector is polled on the UI thread via a 250ms `DispatcherTimer`;
`OnGameAudioPollTick` wraps `Poll()` in try/catch + `AppLog`.
- 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.
- `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.
- 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 — `HttpSocialValidator` stub-handler tests
only, never the real instance.
- **Next step:** commit + push the audio UX follow-up (the whole uncommitted set
above in one commit). 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`.