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.
This commit is contained in:
2026-11-01 07:01:50 -08:00
parent 8f79b20a18
commit abfab25685
15 changed files with 240 additions and 54 deletions
+11 -15
View File
@@ -7,22 +7,18 @@
## Next up
**The surge week (4 days, in this order).** Not every row below — this slice only, because it is
what the first public release is waiting on:
**The surge week (3 days, in this order).** Not every row below — this slice only, because it is
what the first public release is waiting on. Day 1 (artifact shape) is **done**: the exe is
`LlamaCasty.exe` and `scripts/publish.sh` stages the depot folder.
1. **Artifact shape** — `LlamaCasty.exe` rename (three pack URIs), `dotnet publish` profile with
`steam_api64.dll` beside the exe. Ends with a build that starts standalone and falls back to the
free profile.
2. **OutputProfile gate** — ≤921,600 px / ≤30 fps for the stream **and** the recorder, greyed tier
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.
3. **Entitlement seam** — `IEntitlement` with the Steam DLC path and a fake for tests, Polar's
customer-portal path for the monthly, `--activate` parsing, system messages.
4. **Real-machine day** — licence UI skeleton, a Steam-less launch proving the free profile, a test
broadcast.
2. Then the **entitlement seam** (`IEntitlement`, Steam DLC path behind a fake, Polar path) and the
licence UI.
Detail: [`commercial.md`](docs/ai/commercial.md) → Output profile / Entitlement;
[`Distribution.md`](Distribution.md). Day 5, if the four go well: the visibility picker (a hard
prerequisite for any *public* build).
[`Distribution.md`](Distribution.md). After that: the visibility picker (a hard prerequisite for
any *public* build).
**TASK 3·17 — the Text layer** stays the first product row after the surge. The `TextOverlay` source
type exists as a placeholder and nothing else does: `AddSource` creates it 0×0, all four compositor
@@ -80,9 +76,9 @@ Dog test.
`UpdateBroadcast` in the same unit (it is the only code that can change a broadcast's privacy).
- **Kill the dev multi-instance affordance** — `Helpers/InstanceProfile.cs` is already `#if DEBUG`;
re-prove it on a Release build.
- **Release engineering** — `scripts/publish.sh` (self-contained win-x64, no test artifacts),
Debug-only `InternalsVisibleTo`, the `LlamaCasty.exe` assembly rename (three pack URIs, incl.
`MainWindow.xaml:14`), full license texts beside `THIRD-PARTY-NOTICES.txt` (TASK 4 req 9).
- **Release engineering** — `scripts/publish.sh` **done** (self-contained win-x64, `ffmpeg\`
guarded, no test artifacts), `LlamaCasty.exe` assembly rename **done**, full license texts beside
`THIRD-PARTY-NOTICES.txt` (TASK 4 req 9). Outstanding: Debug-only `InternalsVisibleTo`.
- **Gold pass** (TASK 36): the screens/layers audit, native-Windows verification, and the
branding-flash decision.