.github/workflows/release-velopack.yml (reusable): the release pipeline of the Windows reference architecture, built in KofTwentyTwo/standards so provenance names it as the builder (SLSA Build L3, K22-CI-30).
build (Windows, read-only): strict SemVer tag → channel dev (prerelease) or stable; re-runs the gates (locked restore, -warnaserror Release build, tests, coverage gate; K22-CI-31); publishes the app unpackaged + self-contained (WindowsPackageType=None, WindowsAppSDKSelfContained=true, no trimming) and an optional single-file CLI.
package (Windows, release environment): optional Azure Trusted Signing over OIDC (azure/login + azure/artifact-signing-action) beforevpk pack, and vpk pack --azureTrustedSignFile so Setup.exe is signed too. sign defaults to false (exception EX-0002). Delta baseline via vpk download github (continue-on-error on a channel's first release). Keeps only this build's assets from assets.<channel>.json, with releases.<channel>.json trimmed to them, which is how vpk upload builds its feed. CLI zipped as <app-id>-cli-<runtime>-<version>.zip.
sbom (Linux): CycloneDX 1.6 of the published app and CLI (pinned Syft), attested against Setup.exe, portable zip, full package, CLI zip.
attest (Linux): SHA256SUMS over every asset (including the fixed-name Setup/portable/feed files, K22-REL-03), provenance for all.
release (Linux): draft with all assets + generated notes, then publish (immutable releases).
templates/workflows/release-velopack.yml: caller, plus an optional winget job (stable only, WINGET_TOKEN in the caller's release environment, wingetcreate v1.12.13.0 pinned by URL + SHA-256).
Docs: K22-CI-30 names the workflow; standards/releases.md (assets table, signing, winget); README workflow table; the reference architecture's pipeline section now describes exactly what runs.
Why
The Windows app template (and gclo's migration) needs a shared, attested release path; this replaces gclo's in-repo release.yml.
How tested
actionlint clean; zizmor --offline default and pedantic: no findings on the reusable workflow (the template's only finding is its {{STANDARDS_SHA}} placeholder, same as the other templates); markdownlint-cli2 0.23.3: 0 issues; gitleaks clean.
Not yet run in Actions; the first real run will be the Windows app template's first tag (see below).
Not verifiable without a real tag run
vpk CLI flags (--outputDir, --azureTrustedSignFile) and the asset/feed layout come from the Velopack 1.2.161 sources; the trimmed releases.<channel>.json mirrors vpk upload's feed but has not been read back by an installed app yet.
Whether vars.* in the reusable workflow resolve from the caller's release environment (needed only when sign: true).
Whether vpk pack re-signs binaries already signed by the signing action (harmless either way).
Syft SBOM depth for a self-contained WinUI publish folder.
## What
- **`.github/workflows/release-velopack.yml`** (reusable): the release pipeline of the Windows reference architecture, built in KofTwentyTwo/standards so provenance names it as the builder (SLSA Build L3, K22-CI-30).
- **build** (Windows, read-only): strict SemVer tag → channel `dev` (prerelease) or `stable`; re-runs the gates (locked restore, `-warnaserror` Release build, tests, coverage gate; K22-CI-31); publishes the app unpackaged + self-contained (`WindowsPackageType=None`, `WindowsAppSDKSelfContained=true`, no trimming) and an optional single-file CLI.
- **package** (Windows, `release` environment): optional Azure Trusted Signing over OIDC (`azure/login` + `azure/artifact-signing-action`) **before** `vpk pack`, and `vpk pack --azureTrustedSignFile` so Setup.exe is signed too. `sign` defaults to false (exception EX-0002). Delta baseline via `vpk download github` (continue-on-error on a channel's first release). Keeps only this build's assets from `assets.<channel>.json`, with `releases.<channel>.json` trimmed to them, which is how `vpk upload` builds its feed. CLI zipped as `<app-id>-cli-<runtime>-<version>.zip`.
- **sbom** (Linux): CycloneDX 1.6 of the published app and CLI (pinned Syft), attested against Setup.exe, portable zip, full package, CLI zip.
- **attest** (Linux): `SHA256SUMS` over every asset (including the fixed-name Setup/portable/feed files, K22-REL-03), provenance for all.
- **release** (Linux): draft with all assets + generated notes, then publish (immutable releases).
- **`templates/workflows/release-velopack.yml`**: caller, plus an optional `winget` job (stable only, `WINGET_TOKEN` in the caller's `release` environment, `wingetcreate` v1.12.13.0 pinned by URL + SHA-256).
- Docs: K22-CI-30 names the workflow; `standards/releases.md` (assets table, signing, winget); README workflow table; the reference architecture's pipeline section now describes exactly what runs.
## Why
The Windows app template (and gclo's migration) needs a shared, attested release path; this replaces gclo's in-repo `release.yml`.
## How tested
- actionlint clean; zizmor `--offline` default and pedantic: no findings on the reusable workflow (the template's only finding is its `{{STANDARDS_SHA}}` placeholder, same as the other templates); markdownlint-cli2 0.23.3: 0 issues; gitleaks clean.
- Not yet run in Actions; the first real run will be the Windows app template's first tag (see below).
## Not verifiable without a real tag run
- `vpk` CLI flags (`--outputDir`, `--azureTrustedSignFile`) and the asset/feed layout come from the Velopack 1.2.161 sources; the trimmed `releases.<channel>.json` mirrors `vpk upload`'s feed but has not been read back by an installed app yet.
- Whether `vars.*` in the reusable workflow resolve from the caller's `release` environment (needed only when `sign: true`).
- Whether `vpk pack` re-signs binaries already signed by the signing action (harmless either way).
- Syft SBOM depth for a self-contained WinUI publish folder.
Generated with [Claude Code](https://claude.com/claude-code)
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
.github/workflows/release-velopack.yml(reusable): the release pipeline of the Windows reference architecture, built in KofTwentyTwo/standards so provenance names it as the builder (SLSA Build L3, K22-CI-30).dev(prerelease) orstable; re-runs the gates (locked restore,-warnaserrorRelease build, tests, coverage gate; K22-CI-31); publishes the app unpackaged + self-contained (WindowsPackageType=None,WindowsAppSDKSelfContained=true, no trimming) and an optional single-file CLI.releaseenvironment): optional Azure Trusted Signing over OIDC (azure/login+azure/artifact-signing-action) beforevpk pack, andvpk pack --azureTrustedSignFileso Setup.exe is signed too.signdefaults to false (exception EX-0002). Delta baseline viavpk download github(continue-on-error on a channel's first release). Keeps only this build's assets fromassets.<channel>.json, withreleases.<channel>.jsontrimmed to them, which is howvpk uploadbuilds its feed. CLI zipped as<app-id>-cli-<runtime>-<version>.zip.SHA256SUMSover every asset (including the fixed-name Setup/portable/feed files, K22-REL-03), provenance for all.templates/workflows/release-velopack.yml: caller, plus an optionalwingetjob (stable only,WINGET_TOKENin the caller'sreleaseenvironment,wingetcreatev1.12.13.0 pinned by URL + SHA-256).standards/releases.md(assets table, signing, winget); README workflow table; the reference architecture's pipeline section now describes exactly what runs.Why
The Windows app template (and gclo's migration) needs a shared, attested release path; this replaces gclo's in-repo
release.yml.How tested
--offlinedefault and pedantic: no findings on the reusable workflow (the template's only finding is its{{STANDARDS_SHA}}placeholder, same as the other templates); markdownlint-cli2 0.23.3: 0 issues; gitleaks clean.Not verifiable without a real tag run
vpkCLI flags (--outputDir,--azureTrustedSignFile) and the asset/feed layout come from the Velopack 1.2.161 sources; the trimmedreleases.<channel>.jsonmirrorsvpk upload's feed but has not been read back by an installed app yet.vars.*in the reusable workflow resolve from the caller'sreleaseenvironment (needed only whensign: true).vpk packre-signs binaries already signed by the signing action (harmless either way).Generated with Claude Code