Release prep 1.0.0: version bump, appcast cleanup, stable-release tagging#923
Conversation
…ging
Prepares master for the 1.0.0 stable cut (run release.sh with no version
arg so its in-place CFBundleVersion=<full-string> auto-bump never runs).
- Info.plist: CFBundleShortVersionString 1.0.0-beta3 → 1.0.0;
CFBundleVersion 3 → 4 so Sparkle sees 1.0.0 as newer than beta3
(build-and-sign.sh writes <sparkle:version> from CFBundleVersion).
- appcast.xml: remove the stale "Version 1.0.0" entry (sparkle:version=1,
pointing at a non-existent v1.0.0 release) left over from a prior local
run — it would otherwise sit alongside the real 1.0.0 entry as a broken,
never-offered update.
- release.sh: mark GitHub Release --prerelease only for versions carrying a
semver pre-release suffix; stable X.Y.Z publishes as "Latest release".
Scalar + ${x:+...} keeps it safe under set -u on bash 3.2.
- CHANGELOG.md: cut [1.0.0] section from [Unreleased] (security: cmd-feature
removal; features; known limitations).
Helper Info.plist intentionally untouched: bumping it changes the bundled
privileged helper and can trigger a re-approval prompt on auto-update.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Review: Release prep 1.0.0Overall this is a tight, well-scoped release-prep PR. The rationale is clearly documented and the changes are minimal. A few notes below. ✅ What's correctInfo.plist version bumps — appcast.xml cleanup — The removed entry had Pre-release detection logic —
CHANGELOG — Cutting the 1.0.0 section from Unreleased looks correct. Dropping the internal CI notes ("CI enforces coverage non-regression…") and the release-blocker issue reference is appropriate for a user-facing changelog. The Security section leading the 1.0.0 entry is a good call given the Minor findings
PRERELEASE_FLAG=""
if [[ "$VERSION" == *-* ]]; then
PRERELEASE_FLAG="--prerelease"
fi
...
${PRERELEASE_FLAG:+"$PRERELEASE_FLAG"} \Because the flag string is a constant ( ${PRERELEASE_FLAG:+--prerelease} \No functional difference; just removes one indirection. Not a blocker.
--notes "See [release notes](https://github.com/malpern/KeyPath/releases/tag/v${VERSION}) for details."The body of the GitHub Release links back to the same release page. This is pre-existing behavior (not introduced here), but worth fixing at some point — e.g., linking to the CHANGELOG or a help guide instead. CHANGELOG missing comparison links Keep a Changelog convention expects a footer link block like: These are optional if the repo doesn't use them today, but worth adding at some point for navigability. Not blocking for 1.0.0.
No concerns on
Verdict: Ready to merge. The minor notes above are all post-1.0 cleanup candidates, nothing blocking. |
Burndown now plots actual through Sat (no leftover Thu projection): Sat is the current marker near the floor; ~3h of execution left (RC + smoke + publish), not feature work. Verdict reflects release-prep #923 merged (version → 1.0.0/build 4, appcast + squatting-tag cleanup) with the signed RC building. Footer timestamp Wed → Sat 2026-06-13; drops the overclaimed "auto-synced" wording (it's hand-maintained). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* Dashboard: Friday morning state — all Thu work merged, today is notes + screenshots 6 of 10 gates closed. Thursday's two Neovim detail-page bugs (#903 wrong component, #908 sheet clipping) are on master. Verdict + schedule updated to Friday: gates 8 (notes) and 9 (screenshot pass) close today, ~1h total; gate 7 RC + gate 10 video on Sat. Countdown to 1 day. * Dashboard: fix system category count clobbered by countdown replace The Fri-AM countdown edit globally replaced <span class=num>2</span> and accidentally knocked the 'system' category bar from its (already wrong) 2 down to 1. Real count is 3 (macOS Function Keys, Leader Key, Fast Navigation); categories now sum to 22 again. Caught by codex + claude review on #910. * Dashboard: Saturday release-day state — #899 + #921 merged, cutting the RC 8 of 10 gates closed. Countdown to 0 (TODAY). Verdict → 'Shipping today': cmd-removal + screenshot cleanup merged after gating two runner flakes (#922). Gate 7 (RC) now in-progress; gate 9 closed (screenshots stripped/preserved via #921/#920); gate 8 finalizing with qualified import framing. Also fixes the system category count (3, not the review-flagged 1). * Dashboard: Saturday release-day — burndown, verdict, footer to current Burndown now plots actual through Sat (no leftover Thu projection): Sat is the current marker near the floor; ~3h of execution left (RC + smoke + publish), not feature work. Verdict reflects release-prep #923 merged (version → 1.0.0/build 4, appcast + squatting-tag cleanup) with the signed RC building. Footer timestamp Wed → Sat 2026-06-13; drops the overclaimed "auto-synced" wording (it's hand-maintained). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * Dashboard: note overlay picker blocker found + fixed in RC QA (#924) RC QA surfaced the overlay output-type picker being unclickable; root-caused to WindowAnchoredPopover's identity-only Equatable discarding content updates, fixed and reworked into a drill-down with Launch App search (#924). Verdict now reflects re-cutting the RC from master with the fix. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Prepares
masterfor the 1.0.0 stable cut. Landing this first meansrelease.shcan run with no version arg, so its in-placeCFBundleVersion=<full-string>auto-bump (which Sparkle would mis-compare as older than beta3) never runs, and thev1.0.0tag captures a tree that already says1.0.0.Changes
Info.plist—CFBundleShortVersionString1.0.0-beta3→1.0.0;CFBundleVersion3→4.build-and-sign.shwrites<sparkle:version>fromCFBundleVersion, so4 > 3is what makes existing beta3 users get offered the update.appcast.xml— remove the staleVersion 1.0.0entry (sparkle:version=1, enclosure pointing at a non-existentv1.0.0release) left over from a prior local run. With1 < 3it was a permanently-unofferable broken entry; leaving it would put a bogus 1.0.0 next to the real one.release.sh— mark the GitHub Release--prereleaseonly for versions with a semver pre-release suffix (e.g.1.0.0-beta4); stableX.Y.Znow publishes as Latest release. Scalar +${x:+...}form keeps it safe underset -uon bash 3.2 (macOS).CHANGELOG.md— cut[1.0.0]section from[Unreleased](security:cmd-feature removal; feature list; known limitations).Deliberately NOT changed
Sources/KeyPathHelper/Info.pliststays at1.1.0/2. It already drifted from the app before this release; bumping it changes the bundled privileged helper and can trigger a re-approval prompt for existing users on auto-update. Reconciling helper versioning is a clean post-1.0 follow-up.Verification
plutil -lint Info.plist✓xmllint --noout appcast.xml✓ (well-formed; only beta3 + the to-be-appended 1.0.0 entry remain)bash -n release.sh✓ and prerelease logic unit-checked:1.0.0 → Latest,1.0.0-beta4 → --prereleaseAlso done out-of-band on this clone
v1.0.0–v1.0.4,v1.0.4-2) — 2022-era inherited Kanata tags never pushed to KeyPath's origin — sorelease.shcan createv1.0.0. SHAs recorded; commits stay reachable.After merge: pull master →
release-candidate.sh(signed/notarized QA in /Applications) → smoke →release.sh 1.0.0.