Skip to content

chore(release): prepare v0.3.0 and pin release signing identity in docs - #284

Merged
santosr2 merged 5 commits into
mainfrom
chore/release-0.3.0
Aug 31, 2026
Merged

chore(release): prepare v0.3.0 and pin release signing identity in docs#284
santosr2 merged 5 commits into
mainfrom
chore/release-0.3.0

Conversation

@santosr2

@santosr2 santosr2 commented Aug 31, 2026

Copy link
Copy Markdown
Owner

What and why

Release prep for v0.3.0: version bumps for the Go project (0.2.0 → 0.3.0) and the VS Code extension (0.2.1 → 0.3.0), an upgrade-guide entry for the rule-ID renames, and the tightened verification commands promised in #279.

Why: This release was originally planned as v0.2.1, but a patch is the wrong classification. #258 renamed public rule IDs — style.block-label-case split into style.resource-name-convention and style.data-name-convention, style.{variable,output,local}-naming gained -name-convention suffixes, and lint.terraform-naming-convention was removed. Those IDs are config keys, terratidy:ignore targets, and SARIF rule IDs, so existing configs break. Worse, internal/config does not reject unrecognized rule keys, so a config left on the old IDs loads without error and silently stops applying its overrides. git-cliff already routes that commit into a Breaking Changes group, which would have appeared under a patch heading. pkg/sdk itself is unchanged apart from doc comments, so gorelease stays clean.

The VS Code extension follows the major.minor matches Go rule from vscode/.bumpversion.toml, landing on 0.3.0 — the "versions realign here" case that config already anticipates.

On the verification side, the documented cosign identity used --certificate-identity-regexp 'https://github.com/santosr2/TerraTidy', which matches any workflow on any ref in the repository. It is now pinned to the exact release.yml@refs/tags/vX.Y.Z identity, and gh attestation verify gained --signer-workflow and --source-ref. A new .bumpversion.toml entry keeps those pinned tags in step with the version. The guide also records why the strict command fails against v0.2.0: those artifacts were published by dispatching from main, so the certificate names refs/heads/main and commit bc6433c rather than the tag.

Refs #279

How to test

mise run check          # fmt, vet, lint, test — passes
mise run docs:build     # MkDocs builds clean
cd vscode && bun run compile

mise run version:show           # 0.3.0
mise run vscode:version:show    # 0.3.0
mise run changelog:preview      # Breaking Changes section is present

After the tag is pushed, the tightened command should verify against the v0.3.0 artifacts:

gh release download v0.3.0 --repo santosr2/terratidy -p 'checksums.txt*'
cosign verify-blob checksums.txt \
  --bundle checksums.txt.bundle \
  --certificate-identity 'https://github.com/santosr2/TerraTidy/.github/workflows/release.yml@refs/tags/v0.3.0' \
  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com'

Notes for reviewers

mise run bump:minor does not produce a stable minor version. pre_l carries optional_value = "final" with values = ["alpha", "beta", "rc", "final"], so a minor bump resets the pre-release part and lands on 0.3.0-alpha. Reaching 0.3.0 took bump:minor followed by bump:stable. The mise.toml descriptions claimed otherwise, so the last commit corrects them (and CLAUDE.md) to say these tasks open a pre-release cycle. The serialization itself is left as-is on purpose: resetting to alpha is what lets a pre-1.0 project start a new alpha cycle, and bump:stable is the documented way to finish one.

bump:pre has a related sharp edge, now documented rather than changed: run from a stable version it serializes the optional final label and yields 0.3.0-final.2.

The v0.2.0 certificate is not fixable. Re-signing needs a workflow at the tag's commit that has a workflow_dispatch trigger (it does not), re-pushing the tag re-runs the GoReleaser v2.15.0 build that #250 fixed, and re-pointing the tag breaks the module proxy entry. The guide documents the workaround (rebuild from the tag and compare checksums, since builds are reproducible) instead.

CHANGELOG.md is untouched — git-cliff regenerates it from the release workflow after the tag is cut.

The v0.2.0 release notes now carry a warning about the mislabeled certificate, and #279 has a comment explaining the switch from v0.2.1 to v0.3.0. The one remaining step after merge is pushing the signed v0.3.0 tag.

Checklist

  • I have read the CONTRIBUTING guidelines
  • My code follows the project's code style
  • I have added tests that prove my fix/feature works
  • All checks pass (mise run check runs fmt, vet, lint, and test)
  • I have updated documentation as needed
  • My commits follow Conventional Commits

🤖 Generated with Claude Code

santosr2 and others added 4 commits August 31, 2026 22:29
The naming rules consolidated in #258 changed public rule IDs:
style.block-label-case split into style.resource-name-convention and
style.data-name-convention, style.{variable,output,local}-naming gained
-name-convention suffixes, and lint.terraform-naming-convention was
removed. Those IDs are config keys, suppression annotation targets, and
SARIF rule IDs, and unrecognized keys are ignored rather than rejected,
so a stale config loads cleanly and silently drops its overrides.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The documented cosign identity regexp matched any ref in the repository,
so it accepted a signature from any workflow on any branch. Pin the exact
release.yml identity and tag ref, and pass --signer-workflow and
--source-ref to gh attestation verify. Add a bumpversion entry so the
pinned refs/tags/vX.Y.Z tracks the version alongside the existing
download commands.

Record why the strict command fails against v0.2.0: those artifacts were
published by dispatching from main, so the certificate names
refs/heads/main and commit bc6433c rather than the tag.

Refs #279

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
bump:patch, bump:minor, and bump:major were described as landing on a
stable version, but pre_l resets to alpha whenever a higher part is
bumped, so each one opens a pre-release cycle instead. Cutting 0.3.0
took bump:minor followed by bump:stable. Describe that, and note that
bump:pre run from a stable version serializes the optional final label
and yields 0.3.0-final.2.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@santosr2
santosr2 merged commit 0b3d3aa into main Aug 31, 2026
45 of 46 checks passed
@santosr2
santosr2 deleted the chore/release-0.3.0 branch August 31, 2026 22:49
santosr2 added a commit that referenced this pull request Sep 1, 2026
git-cliff ends its output with a blank line, and update-changelog commits
CHANGELOG.md without running pre-commit. The extra newline lands on main
and fails end-of-file-fixer on every later PR, since pre-commit/action
runs --all-files.

It has been cycling since v0.2.0: ffe738c generated it broken, 6b23df7
silently repaired it, and efcba7d broke it again with the v0.3.0 release.
PR #284 passed only because it landed inside the repaired window.

Collapse trailing newlines in the job so it stops recurring, and fix the
file on main via the hook itself rather than by hand, since CHANGELOG.md
is generated.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant