The protected releases encountered two blockers: the full111-test Windows acceptance suite ran into its600-second process budget, and Microsoft's signing action dependency installer conflicted with the caller's NuGet source mapping. A subsequent completed run exposed an immediate keyboard assertion reading jk before the required jkg value. Allow900 seconds for each full published/installed suite and60 minutes for all three suites plus packaging/update probes. Individual test deadlines, assertions and filters remain unchanged. Keep the exact jkg assertion, first awaiting that exact native textbox value within the existing10-second deadline; FlaUI5.0.0's UntilInputIsProcessed only sleeps100ms. Add this exact case to the focused hosted regression job. No input is replayed and a genuinely lost key still fails. Pin published immutable standards1.1.1 at96cbdf208a15c9c524676bd15ff9e323228a952b. The owner personally reviewed its signing fix in PR44; it merged normally and production builder release38322016784 succeeds. The fixed official dependency staging verifies the exact package SHA256 and NuGet signatures without changing application package source mapping, OIDC trust or signing verification. Preserve only the previously approved exact Syft entry in the setup plan, retaining restrictive container regression tests. Refs #33. EXE/ZIP first, MSI next release (#36), following the latest owner decision. No app release exists; preserved failed1.0.0 tags will not be rewritten. New app candidates will use1.0.1/stable and1.0.1-beta.1/dev after this reviewed exact-head CI passes. Validation: zero-warning app/test builds and test formatting;42 process/registry/setup boundary tests pass, zero skips; configured PowerShell analysis, actionlint, medium-and-above workflow security gate and all commit hooks pass. The scan's five preexisting low self-repository recommendations remain unchanged. Fresh full native/published/installed hosted acceptance is running. Local baseline and changed keyboard runs both stop earlier at missing FindText, so neither verifies the hosted jkg fix. Temporary fixture diagnostics removed; original user previews/profiles preserved. Substantial AI assistance: Codex GPT-6. Genuine final-head maintainer review under K22-AI-01 is required before merge. This PR contains no application behavior change or weakened assertion. --------- Signed-off-by: James Maes <james@kof22.com> Co-authored-by: Codex GPT-6 <noreply@openai.com>
4.1 KiB
Releasing MarkdownViewr
Releases follow the
KofTwentyTwo release standard.
Pushing a protected v* tag on main runs .github/workflows/release.yml,
which calls the shared release-velopack.yml workflow in KofTwentyTwo/standards.
Workflow baseline
The signing release builder is pinned to standards v1.1.1 (96cbdf208a15c9c524676bd15ff9e323228a952b); other shared gates retain v0.1.2. The release caller checks main ancestry and reruns build, coverage, formatting, UI tests, security scans and CodeQL before publication.
The AppKit dependency locks now match the published 0.1.0 packages. Before changing any package version, regenerate the affected locks and verify a locked restore with a clean package cache.
Versioning and channels
The version is the tag without the leading v, in strict semver.
| Tag | Version | GitHub Release | Velopack channel |
|---|---|---|---|
v1.2.3 |
1.2.3 |
stable | stable |
v1.2.3-beta.1 |
1.2.3-beta.1 |
prerelease | dev |
An installed copy only updates within its own channel. Directory.Build.props holds
VersionPrefix, the next expected release; local builds are <prefix>-dev. Bump it in a
pull request right after each release.
Run the installed channel smoke test before releasing. It verifies real stable/dev upgrades and published-output startup with local fixtures.
What a release does
The shared workflow (SLSA Build L3: the build definition lives in KofTwentyTwo/standards):
- Validates strict SemVer and repeats locked restore, zero-warning build, unit tests, and the 100% coverage gate.
- Publishes the app unpackaged and self-contained (and the single-file command line), signs the owned binaries and packs them with Velopack: Setup, portable zip, full and delta update packages.
- Generates CycloneDX SBOMs, writes
SHA256SUMS, and attests provenance and SBOMs. - Creates a draft GitHub Release with every asset and generated notes, then publishes it (releases are immutable).
The optional winget job in release.yml then submits the manifest update for stable
releases.
Optional Scoop/Chocolatey candidate generation supports CLI and GUI portable payloads, using final-byte hashes and verified provenance. Follow the distribution presets; no package feed is updated by default.
One-time setup (owner)
- Environment
release(Settings → Environments) with a deployment rule that allows only tags matchingv*. - Code signing: complete the signing configuration, pin
its published reviewed builder, then enable
sign: truewith an explicit owned-file catalog. The preflight blocks unsigned publication and incomplete protected-environment configuration before any release build starts. - winget (optional): submit the first stable release by hand with
wingetcreate new, then addWINGET_TOKENto thereleaseenvironment and the repository variableWINGET_PACKAGE_ID.
Cutting a release
-
Make sure
mainis green and the conformance check passes:pwsh ../standards/tools/Test-RepoConformance.ps1 -Repository KofTwentyTwo/MarkdownViewr.Windows -LocalPath . -
For a minor or major release, open a release checklist issue from the standards template and complete it (security assessment, threat model review, scan results).
-
Tag
mainand push the tag:git switch main git pull git tag -s v0.1.0 -m "v0.1.0" git push origin v0.1.0 -
Watch the release workflow, then verify the release as described in the developer guide.
-
Open a pull request that bumps
VersionPrefixinDirectory.Build.props.
When something fails
- Before the release is published: nothing is public. Delete the draft
(
gh release delete v0.1.0 --yes), fix the cause, and re-run the workflow. - A published release is broken: never reuse its version; installed copies may have seen it. Fix forward with a new patch release.