Files
MarkdownViewr.Windows/docs/RELEASING.md
T
james.maesandCodex GPT-6 38dd5c1488 feat: implement Windows MarkdownViewr (#35)
This replaces the blocked history in PR #3 with one properly attributed,
signed/DCO commit. The owner personally reviewed and approved PR #3 in
the release session.

**No file changes from the approved candidate:** both
baee14f492 and
e605df62c4 have exact Git tree
a85912cbad. Original PR #3 and its commits
are preserved for review history. Historical commits were locally signed
but GitHub reported no_user; protected merge checks those introduced
commits even for squash merging. This commit resolves attribution
without bypassing or weakening signature rules.

The reader, Settings, themes, source highlighting/split, live reload,
file associations, Print/PDF, About credits, toolbar/footer/editor
fixes, user-first README/screenshots and developer guides are exactly
the approved implementation. Stable/dev separation and protected Azure
signing caller are unchanged.

Evidence:
- Approved tree baee14f / CI38285775463 passes all checks. Downloaded
focused29/29, published111/111, stable110/110 and dev110/110 TRXs have
zero failures/skips. Core coverage100% lines/98.86% branches; actual
update/restart/coexistence/default-preservation receipts verify.
- New single-commit hooks, online workflow security, signing and DCO
pass. GitHub must rerun all required checks on this commit; results are
not copied across SHAs.
- Live repository setup validates18 Actions-bound checks, with only
fuzzing added and all prior protections preserved.
- OpenSSF project15417 is now owner-reviewed and saved at70% under
owner-confirmed CDLA-Permissive2.0. This is an in-progress assessment,
not a passing badge.
- Production CI OIDC and signed1.0/dev publication remain required;
local representative signing is not CI proof.

Substantial AI assistance: Codex (GPT-6). Supersedes PR #3. Release work
remains tracked in #33.

Closes #4, #6, #7, #8, #9, #10, #11, #12, #13, #14, #15, #16, #17, #18,
#19, #20, #21, #22, #23, #24, #25, #26, #27, #28, #29, #32, #34.
Refs #1, #5, #30, #31, #33.

Signed-off-by: James Maes <james@kof22.com>
Co-authored-by: Codex GPT-6 <noreply@openai.com>
2026-10-12 14:01:42 -05:00

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.0 (93b1d6163a4c466ae443e98b62786fc4d80d33bd); 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):

  1. Validates strict SemVer and repeats locked restore, zero-warning build, unit tests, and the 100% coverage gate.
  2. 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.
  3. Generates CycloneDX SBOMs, writes SHA256SUMS, and attests provenance and SBOMs.
  4. 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)

  1. Environment release (Settings → Environments) with a deployment rule that allows only tags matching v*.
  2. Code signing: complete the signing configuration, pin its published reviewed builder, then enable sign: true with an explicit owned-file catalog. The preflight blocks unsigned publication and incomplete protected-environment configuration before any release build starts.
  3. winget (optional): submit the first stable release by hand with wingetcreate new, then add WINGET_TOKEN to the release environment and the repository variable WINGET_PACKAGE_ID.

Cutting a release

  1. Make sure main is green and the conformance check passes: pwsh ../standards/tools/Test-RepoConformance.ps1 -Repository KofTwentyTwo/MarkdownViewr.Windows -LocalPath .

  2. 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).

  3. Tag main and push the tag:

    git switch main
    git pull
    git tag -s v0.1.0 -m "v0.1.0"
    git push origin v0.1.0
    
  4. Watch the release workflow, then verify the release as described in the developer guide.

  5. Open a pull request that bumps VersionPrefix in Directory.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.