Renames AssemblyName to LlamaCasty before the first Steam depot — Steamworks is explicit that renaming a live exe is painful, so this had to land first, not later. Four assembly-qualified pack URIs carried the old name, not three: MainWindow (window icon), OverlayHost (logo), RenameRecordingDialog and KeepBroadcastDialog. Pack URIs resolve by assembly name at runtime, so a stale one compiles, passes every test and then silently renders nothing the first time that view opens. AssemblyIdentityTests guards both halves — the assembly name, and no source XAML still naming the legacy assembly. Packaging/Package.appxmanifest and package-msix.sh carry the exe name too. scripts/publish.sh replaces the by-hand publish: single-file win-x64, ReadyToRun, ffmpeg beside the exe, and it refuses to finish if ffmpeg, LICENSE, PRIVACY.md or THIRD-PARTY-NOTICES.txt are missing, or if a test assembly leaked in. That last guard exists because the first publish was wrong in a way no test could see: PublishSingleFile + IncludeNativeLibrariesForSelfExtract bundled the libav*.dll family into the exe — a 9-file output with no ffmpeg folder and a 182 MB binary, so the locator would have found nothing at runtime. ExcludeFromSingleFile="true" on the content keeps the folder a folder. Diffing against a control publish without the single-file flags found it; guessing at item globs wasted two attempts first (recorded in MyMistakes.md). Measured: 127 MB exe + 129 MB ffmpeg = 257 MB depot. Tests: AssemblyIdentity, StorePackaging, BuildStamp, BundledFonts all pass; app builds with 0 warnings.
2.6 KiB
2.6 KiB
HANDOFF — 2026-11-01 (the exe is LlamaCasty.exe; the depot folder builds and verifies)
State
- Branch
main, level withoriginthrough8f79b20; this unit (the artifact rename) is local. - The shipped exe is
LlamaCasty.exe.AssemblyNamerenamed; four pack URIs fixed (the docs said three —KeepBroadcastDialog.xaml:5was the fourth); manifest, MSIX script andStorePackagingTestsfollow. Guarded byytLive.Tests/AssemblyIdentityTests.cs. scripts/publish.shstagesartifacts/steam-stageand refuses to finish ifffmpeg\, the licence, privacy or notices file is missing, or test assemblies leaked in. Output 257 MB.- Distribution is Steam-exclusive (creator ruling 2026-10-31): free app + paid edition as a
Steam DLC; the $10/month plan sold off-Steam by Polar and stated, never sold, in-app.
commercial.md→ Channels is policy;Distribution.mdis depot mechanics. - Entitlement is
steamDlcOwned || polarKeyValid;steam_api64.dllships beside the exe and the app must start without Steam, falling back to free. - Site is live with Steam (
a9d07ce).www.llamacasty.com301s to the apex.
Next action
- OutputProfile gate — ≤921,600 px / ≤30 fps for the stream and the recorder, greyed tier entries, plus the TASK 53 geometry tests that pin every tier.
- Then the entitlement seam (
IEntitlement, Steam DLC path behind a fake, Polar path) and the licence UI. - Steamworks: App ID waiting on identity verification; then depot, store page (public 2 weeks before release) and the DLC app.
Landmines
- ⛔
ExcludeFromSingleFile="true"on the ffmpeg content — without it the publisher bundles libav*.dll into the exe and the app ships unable to find ffmpeg. Recipe inMyMistakes.md. - Nothing may gate a feature. The only paid delta is the output profile;
ShowBrandFlashstaysfalseand entitlement must never enable it. - No checkout inside a Steam build — the Wallet rule. The monthly is named, never sold, in-app.
- The org access token never ships.
organization_idis public; the token is not. - The site publishes the model, never the numbers, and never takes payment or links a checkout.
- No self-updater and no version banner: Steam updates the app.
- Pre-existing: the full test suite hangs (WASAPI teardown) — per-class runs only; and
ytLive.Testscarries 3 xUnit analyzer warnings the app-only gate does not see. - Not every hex is a theme colour —
BorderColorPalette/chat defaults are USER DATA; on-stream graphics come fromOutputPalette. A red settings control is still a bug.