Add CHANGELOG.md and use it as the release body (closes #17) - #26
Merged
Conversation
Closes #17. Adopts Keep a Changelog (https://keepachangelog.com) as the per-release history and notes that the project follows SemVer. The CHANGELOG covers v1.0.0 through v1.0.2 reconstructed from the git history, plus an [Unreleased] section capturing the post-v1.0.2 work merged on main — shellcheck CI (#6, #7), cache TTL (#8 / #3), the log.Fatal blast-radius fix (#10 / #2), and release-artifact verification (#25 / #12 / #1) — categorized as Added / Changed / Fixed / Security. The release workflow now points at CHANGELOG.md instead of README.md for the release body. Adopters reading "what changed in v1.4 vs v1.3?" on a release page get an actual answer instead of the project description, which is the trust-model gap #17 was about. Mechanics: - v1.0.2 entry calls out the isExecutableWritable fix as Security: the previous mask was checking owner-read (1<<7) and the sticky-bit area (1<<9) instead of group-write (0o020) and other-write (0o002), so the startup gate was a no-op against the bits its name claims to refuse. - Release dates derive from the lightweight tag commit dates (no tagger metadata exists on these tags). - Each release header is linked to a compare URL; PR/issue numbers in the body are reference-style links collected at the bottom. - README grows a small Changelog section pointing at the file. Discipline going forward: every PR with adopter-visible behavior should add a bullet under [Unreleased] in the appropriate category. At release time, [Unreleased] gets renamed to the new version with a date, and a fresh [Unreleased] is added at the top.
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #17.
Summary
Adds a hand-curated
CHANGELOG.mdcovering v1.0.0–v1.0.2 reconstructed from the git history, plus an[Unreleased]section for the work merged onmainsince v1.0.2. The release workflow now usesCHANGELOG.mdas the release body instead of the project README — so adopters reading "what changed in v1.4 vs v1.3?" on a release page actually get an answer.Why this shape
Keep a Changelog is the closest thing to an industry-standard format for hand-curated release notes — categorized (Added / Changed / Deprecated / Removed / Fixed / Security), reverse-chronological, dated, with comparison links between releases. It's better than auto-generated PR-title release notes (
generate_release_notes: true) for a security-sensitive tool because every change gets a deliberate human-readable line that says what and why, rather than the PR title du jour. The[Unreleased]section keeps an always-current preview of what the next tag will contain, which is the discipline that keeps the file from rotting.Reconstructed history
install.shswitched from build-from-source to download-prebuilt; README path fix.isExecutableWritable— the previous mask was checking owner-read (1<<7) and the sticky-bit area (1<<9) instead of group-write (0o020) and other-write (0o002), so the gate was a no-op against the bits its name claims to refuse.The companion
just use constantscommit (68af9c7) is a readability rewrite of the same lines and isn't called out separately — it's part of the same release.[Unreleased]sectionCaptures the post-v1.0.2 main-branch work, categorized:
cache_ttl(cache.go: cached responses never expire, so revoked SSH keys keep authenticating indefinitely #3, Add configurable cache TTL so revoked keys stop authenticating (closes #3) #8);sha256release-asset publication + verification (Release artifacts have no checksum or signature — adopters can't verify what they install #12, Publish sha256 alongside the release binary and verify on install (closes #12, #1) #25); shellcheck CI (Add shellcheck to CI (refs #1) #6, Simplify shellcheck discovery to .sh only (review feedback from #6) #7).install.shrewritten with workingcurl -fLO+--fail+ checksum verification (install.sh: curl -o is missing its filename argument, breaking the binary download #1, Release artifacts have no checksum or signature — adopters can't verify what they install #12, Publish sha256 alongside the release binary and verify on install (closes #12, #1) #25).log.Fatalno longer kills the process on HTTP errors (httpclient.go: GetURL calls log.Fatal on HTTP error, killing the process and dropping keys from healthy sources #2, Stop killing the process on HTTP fetch errors (closes #2) #10).Workflow change
That's the entire release-body change. Combined with the hand-curated content, it directly resolves #17 (release body hard-coded to README.md).
README
Adds a small "Changelog" section pointing at the file and noting the Keep-a-Changelog + SemVer commitments.
Going-forward discipline
Every PR with adopter-visible behavior should add a bullet under
[Unreleased]in the appropriate category. At release time,[Unreleased]gets renamed to the new version with the release date, and a fresh empty[Unreleased]is added at the top. (Worth capturing inCONTRIBUTING.mdif/when that lands — separate scope.)Test plan
./build.shgreen; tests still pass; coverage unchanged at 39.5% (no source change).shellcheck install.sh build.shgreen.CHANGELOG.mdrenders cleanly as Markdown; reference-style links resolve.Out of scope
CHANGELOG.mdsection.release-please,git-cliff, etc.). Hand-curated is the right fit for a security-sensitive tool at this size; revisit if PR volume grows.generate_release_notes: truein addition tobody_path). softprops/action-gh-release v1 doesn't merge them with a body_path; choosing one. Hand-curated wins here.https://claude.ai/code/session_013HnepY8MhhxrJJjE5ysW47
Generated by Claude Code