Files
LlamaCasty/HANDOFF.md
T
gramps abfab25685 build: the exe is LlamaCasty.exe, and the publish script proves the artifact
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.
2026-11-01 07:01:50 -08:00

2.6 KiB

HANDOFF — 2026-11-01 (the exe is LlamaCasty.exe; the depot folder builds and verifies)

State

  • Branch main, level with origin through 8f79b20; this unit (the artifact rename) is local.
  • The shipped exe is LlamaCasty.exe. AssemblyName renamed; four pack URIs fixed (the docs said three — KeepBroadcastDialog.xaml:5 was the fourth); manifest, MSIX script and StorePackagingTests follow. Guarded by ytLive.Tests/AssemblyIdentityTests.cs.
  • scripts/publish.sh stages artifacts/steam-stage and refuses to finish if ffmpeg\, 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.md is depot mechanics.
  • Entitlement is steamDlcOwned || polarKeyValid; steam_api64.dll ships beside the exe and the app must start without Steam, falling back to free.
  • Site is live with Steam (a9d07ce). www.llamacasty.com 301s to the apex.

Next action

  1. 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.
  2. Then the entitlement seam (IEntitlement, Steam DLC path behind a fake, Polar path) and the licence UI.
  3. 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 in MyMistakes.md.
  • Nothing may gate a feature. The only paid delta is the output profile; ShowBrandFlash stays false and 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_id is 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.Tests carries 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 from OutputPalette. A red settings control is still a bug.