Release Notes - v0.16.0¶
Overview¶
This release ships three features: per-category render controls for the Markdown generator (with a new collapse-Dependencies-by-default), the RMI trailer flow (INIT-SCHANGELOG-001), which flows Refs: git trailers from commits into pre-populated rmis on changelog entries, and build-provenance version reporting so the CLI self-identifies between releases.
Highlights¶
- Human-facing Markdown collapses the Dependencies category to a one-line summary by default
- New
--exclude-categories,--collapse-categories, and--expand-categoriesflags for fine-grained control - RMI trailer flow:
Refs:trailers on commits flow into pre-populatedrmison generated entries - New plural
rmisfield on entries, preferred over the legacy singularrmi version/--versionreport build provenance (version, commit, build time, dirty flag) from build info
Category Render Controls¶
Collapse & Exclude Categories¶
The renderer can now omit a category entirely or render it as a one-line entry count instead of listing every entry:
# Restore the full dependency list (either works)
schangelog generate CHANGELOG.json --expand-categories Dependencies
schangelog generate CHANGELOG.json --full
# Collapse additional noisy categories
schangelog generate CHANGELOG.json --collapse-categories "Build,Tests"
# Omit categories entirely
schangelog generate CHANGELOG.json --exclude-categories "Dependencies,Build"
A collapsed category renders as:
Programmatic equivalents are available on renderer.Options:
opts := renderer.DefaultOptions().
WithCollapseCategories("Build").
WithExcludeCategories("Tests").
WithExpandCategories("Dependencies") // override the collapse default
md := renderer.RenderMarkdownWithOptions(cl, opts)
Behavior Change¶
The default and standard presets now collapse the Dependencies category. This is a breaking change to generated Markdown output:
- Projects that carry
dependenciesentries will see those sections collapse to a one-line count on the nextgenerate. - The full detail is unchanged in
CHANGELOG.jsonand can be restored per-invocation with--fullor--expand-categories Dependencies. - The
coreandminimalpresets are unaffected — they already drop Dependencies via tier filtering.
Precedence Rules¶
--exclude-categorieswins over--collapse-categoriesfor the same category (the section is omitted, not summarized).--expand-categoriesis applied last, so it overrides both preset collapse defaults and an explicit--collapse-categories.
RMI Trailer Flow¶
Refs: RMI-<SLUG>-<NNN> git trailers on commits now flow through parse-commits into pre-populated rmis on generated changelog entries, so roadmap traceability is curated rather than transcribed.
Trailer Parsing (parse-commits)¶
parse-commits extracts roadmap item IDs from a commit's Refs: trailers and carries them as rmis on each parsed commit, in both TOON and JSON output. Multiple trailers per commit and multiple IDs per trailer are supported and deduplicated; the existing #123 issue-ref extraction is unchanged.
Plural rmis Field¶
Entries gain an additive rmis []string field and a WithRMIs builder:
A curated entry often summarizes several commits spanning multiple RMIs, which the singular rmi cannot express. The legacy rmi is retained for back-compatibility and treated as a one-element rmis.
Pre-Populated Generation¶
init --from-tags fills each generated entry's rmis from the underlying commits' trailers (deduplicated, sorted). initiative is never auto-populated — with an RMI present it is derivable downstream.
Validation¶
schangelog validate (rich mode) adds W006 (a string in rmis is not a well-formed RMI-<SLUG>-<NNN> ID) and W007 (a singular rmi disagrees with rmis).
Convention¶
- Populate
rmison entries tied to roadmap items. - Set
initiativeonly for entries with no RMI. - Carry
Refs:trailers on commits and letparse-commits/initdo the population.
This release dogfoods the convention: its own changelog entries carry rmis.
CLI Versioning & Build Provenance¶
schangelog version and --version now report the real build even for binaries built between releases or from an uncommitted tree. When goreleaser's ldflags aren't stamped, the values fall back to the Go toolchain's embedded build info:
schangelog v0.16.0-3-gabc1234-dirty [development build]
commit: abc1234def56 (modified)
built: 2026-08-23T17:02:32Z
go: go1.26.5 darwin/arm64
- A plain
go install/go buildbinary reports its module version (or(devel)), commit, build time, and dirty flag — neverdev/none/unknown. make buildstampsgit describe --tags --always --dirtyfor the readablevX.Y.Z-N-gSHA-dirty"commits-past-tag" string.- Inspect any binary without running it via
go version -m <binary>.
See the CLI Versioning guide for the full convention.