v1.0.1 and the beta.3 rehearsal crash at startup (0xc000027b in Microsoft.UI.Xaml.dll). Root cause in #87: the shared release workflow builds Release (framework-dependent) and then publishes self-contained into the same obj, and the incremental _GenerateProjectPriFileCore target skipped because its new inputs (the Windows App SDK .pri files from the NuGet cache) were older than the index it had already written. The published gclo.pri was 115 KB instead of 2.3 MB and lacked the WinUI theme resources.
gclo/gclo.csproj: WindowsPackageType=None and WindowsAppSDKSelfContained=true unconditionally. gclo ships only unpackaged and self-contained, so build and publish now share one resource configuration and the incremental index is always right.
release.yml: new smoke job between the gates and the shared release. It restores, builds Release and publishes with the shared workflow's exact commands (same incremental obj state), then runs the FlaUI suite against the published gclo.exe through GCLO_UITEST_EXE. release needs it, so a build that does not start can never be published again.
docs/RELEASING.md: the smoke job in "Watch the workflow".
v1.0.1 marked prerelease with a warning in its notes ("A broken release" runbook), so stable installs stop receiving it.
1.0.0 reinstalled on the maintainer's machine.
How it was tested
From clean bin/obj with the workflow's exact sequence (locked restore, dotnet build gclo.slnx -c Release -p:Platform=x64, the publish command): before the csproj change gclo.pri = 115,816 bytes and the app exits 0xC000027B; after it the build and the publish both give 2,298,032 bytes and the published app opens its main window.
actionlint clean.
Next: tag v1.0.2-beta.1, install it on a clean machine, then v1.0.2.
## What
v1.0.1 and the beta.3 rehearsal crash at startup (`0xc000027b` in `Microsoft.UI.Xaml.dll`). Root cause in #87: the shared release workflow builds Release (framework-dependent) and then publishes self-contained into the same `obj`, and the incremental `_GenerateProjectPriFileCore` target skipped because its new inputs (the Windows App SDK `.pri` files from the NuGet cache) were older than the index it had already written. The published `gclo.pri` was 115 KB instead of 2.3 MB and lacked the WinUI theme resources.
- `gclo/gclo.csproj`: `WindowsPackageType=None` and `WindowsAppSDKSelfContained=true` unconditionally. gclo ships only unpackaged and self-contained, so build and publish now share one resource configuration and the incremental index is always right.
- `release.yml`: new `smoke` job between the gates and the shared release. It restores, builds Release and publishes with the shared workflow's exact commands (same incremental `obj` state), then runs the FlaUI suite against the published `gclo.exe` through `GCLO_UITEST_EXE`. `release` needs it, so a build that does not start can never be published again.
- `docs/RELEASING.md`: the smoke job in "Watch the workflow".
Closes #87 (part of #62). Shared-workflow follow-up filed as KofTwentyTwo/standards#22.
## Done outside this PR
- v1.0.1 marked prerelease with a warning in its notes ("A broken release" runbook), so stable installs stop receiving it.
- 1.0.0 reinstalled on the maintainer's machine.
## How it was tested
- From clean `bin`/`obj` with the workflow's exact sequence (locked restore, `dotnet build gclo.slnx -c Release -p:Platform=x64`, the publish command): before the csproj change `gclo.pri` = 115,816 bytes and the app exits `0xC000027B`; after it the build and the publish both give 2,298,032 bytes and the published app opens its main window.
- `actionlint` clean.
- Next: tag `v1.0.2-beta.1`, **install it on a clean machine**, then `v1.0.2`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
## zizmor /
runtime artifacts potentially vulnerable to a cache poisoning attack: this step
[Show more details](https://github.com/KofTwentyTwo/gclo/security/code-scanning/7)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What
v1.0.1 and the beta.3 rehearsal crash at startup (
0xc000027binMicrosoft.UI.Xaml.dll). Root cause in #87: the shared release workflow builds Release (framework-dependent) and then publishes self-contained into the sameobj, and the incremental_GenerateProjectPriFileCoretarget skipped because its new inputs (the Windows App SDK.prifiles from the NuGet cache) were older than the index it had already written. The publishedgclo.priwas 115 KB instead of 2.3 MB and lacked the WinUI theme resources.gclo/gclo.csproj:WindowsPackageType=NoneandWindowsAppSDKSelfContained=trueunconditionally. gclo ships only unpackaged and self-contained, so build and publish now share one resource configuration and the incremental index is always right.release.yml: newsmokejob between the gates and the shared release. It restores, builds Release and publishes with the shared workflow's exact commands (same incrementalobjstate), then runs the FlaUI suite against the publishedgclo.exethroughGCLO_UITEST_EXE.releaseneeds it, so a build that does not start can never be published again.docs/RELEASING.md: the smoke job in "Watch the workflow".Closes #87 (part of #62). Shared-workflow follow-up filed as KofTwentyTwo/standards#22.
Done outside this PR
How it was tested
bin/objwith the workflow's exact sequence (locked restore,dotnet build gclo.slnx -c Release -p:Platform=x64, the publish command): before the csproj changegclo.pri= 115,816 bytes and the app exits0xC000027B; after it the build and the publish both give 2,298,032 bytes and the published app opens its main window.actionlintclean.v1.0.2-beta.1, install it on a clean machine, thenv1.0.2.🤖 Generated with Claude Code
@@ -90,0 +109,4 @@# No NuGet cache: a release workflow must not consume runtime-generated# caches (zizmor cache-poisoning); the locked restore is deterministic.- name: Set up .NET SDKuses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0zizmor /
runtime artifacts potentially vulnerable to a cache poisoning attack: this step
Show more details