5.0 KiB
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-12)
-
Branch:
main— the social bar v2 push is committed + pushed (9873eed, 18 files, +1878/−321, 112 tests passing, 0 warnings). Working tree is dirty with the post-push docs backfill only (ai.md, README.md, TASKS.md schema section, THIRD-PARTY-NOTICES.txt) — ready to commit when the user says so. -
Finished this session (round 3): user's live-test report said the mastodon icon still didn't show for
@gramps@llamachile.tube. Root cause: the identity domainllamachile.tubeis YunoHost-SSO-gated —/.well-known/nodeinfo,/@gramps, and webfinger all answer with the SSO login page, so nodeinfo returned nothing and the icon fell back to the honeycomb glyph. The real instance lives atmastodon.llamachile.tube, and only the bare roothttps://llamachile.tube/302s to it ("default app" redirect). Fix:HttpSocialValidator.TryFetchFediverseSoftwareAsyncnow, when nodeinfo on the identity domain fails, follows the root redirect (ResolveInstanceHostAsync, readsresp.RequestMessage.RequestUri.Host) and re-runs the nodeinfo lookup on the resolved host. New testFediverseHandle_RootRedirectToSubdomain_ResolvesSoftware. Build: 0 warnings. Tests: 112 passing. -
What landed (all rounds this session):
- Fediverse icon resolution —
DetectServicemaps@user@domainto the newSocialService.Fediverse(wasLink/chain icon). On validate,HttpSocialValidatorbest-effort GETshttps://{domain}/.well-known/nodeinfo, follows the first nodeinfolinks[].href, readssoftware.name, and returns it inSocialLookupResult.FediverseSoftware.SocialEntry/SocialSlotViewModelcarryFediverseSoftware;SocialServiceIcons.LogoDataForFediverse(software)maps it to a bundled logo (mastodon/peertube/pixelfed/misskey/lemmy/pleroma/ firefish — Simple Icons CC0), falling back to theFediverseIconDatahoneycomb glyph for unknown software (GoToSocial/Sharkey/Akkoma aren't in Simple Icons). Nodeinfo failure still validates — the glyph falls back. - Redirect resolution (round 3) — identity domains that 302 their root to the real instance (YunoHost default-app subdomains) resolve software via the root redirect when identity-domain nodeinfo is SSO-blocked.
- Persistence — new
SocialEntry.Software TEXTcolumn viaMigrateSocialEntryTable()(column-presence pattern, same as the others); saved/loaded alongside Service/Handle/ProfileUrl. - Icon colors —
IconButtonstyle gainsForeground="#d0d0d0"(Themes/Controls.xaml); the dialog's trash button overridesForeground="#e94560"(SocialsDialog.xaml). All otherIconButtonusages arePathcontent with explicitFill, so unaffected.
- Fediverse icon resolution —
-
Landmines:
LayoutStore.Socialsis only populated byLoad()— tests must callstore.Load()before asserting it.DetectService("justaname")→ Website with empty handle; only unparseable input or@user@domainyields Link/Fediverse.- Dialog sign-in provider is
Func<Task<YouTubeChannel?>>; test fakes must returnTask.FromResult(sync-completed) so the fire-and-forget command settles before the next assert. SocialBarBottomTop = 1040literal lives inMainWindow.xaml.cs(the VM'sMasterFrameHeightis private).Cancel_AbortsInFlightValidation_WithoutMutatingSlotrelies on the BlockingValidator's gate completing synchronously (noRunContinuationsAsynchronously) — the assertions run afterGate.TrySetResultreturns because the awaited continuation executes inline.- Nodeinfo cancellation test cancels mid-lookup via a counting stub; the
post-fetch
ct.IsCancellationRequestedcheck is what reportsCanceled. - Round-3 redirect fallback fires only when identity-domain nodeinfo fails;
the root follow happens automatically (HttpClient default auto-redirect),
and
RequestMessage.RequestUri.Hostis read from the final response.
-
Next step: TASK 4 ship step 3 — the encoder + RTMP push (FFmpeg subprocess: frames via stdin, stderr health parsing, FLV mux + push to the cached reusable stream's ingestion URL). Nothing else queued — do not expand the task queue on your own.
-
Secret/DB/port facts live: OAuth client id/secret in
Helpers/OAuthCredentials.cs; OAuth session token inHelpers/TokenStore.cs(DPAPI →%APPDATA%\ytLlive\ytLlive.auth); layout DB%APPDATA%\ytLlive\ytLlive.db(schema v8; the newSocialEntry.Softwarecolumn is a column-presence migration like the others, no version bump); OAuth callbackhttp://localhost:8765/oauth2/callback; crash log%APPDATA%\ytLlive\startup.log.