Skip to content

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-categories flags for fine-grained control
  • RMI trailer flow: Refs: trailers on commits flow into pre-populated rmis on generated entries
  • New plural rmis field on entries, preferred over the legacy singular rmi
  • version/--version report 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:

### Dependencies

- _17 dependency updates_

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 dependencies entries will see those sections collapse to a one-line count on the next generate.
  • The full detail is unchanged in CHANGELOG.json and can be restored per-invocation with --full or --expand-categories Dependencies.
  • The core and minimal presets are unaffected — they already drop Dependencies via tier filtering.

Precedence Rules

  • --exclude-categories wins over --collapse-categories for the same category (the section is omitted, not summarized).
  • --expand-categories is 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:

entry := changelog.NewEntry("Add streaming support").
    WithRMIs("RMI-MYREPO-042", "RMI-MYREPO-044")

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 rmis on entries tied to roadmap items.
  • Set initiative only for entries with no RMI.
  • Carry Refs: trailers on commits and let parse-commits/init do 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 build binary reports its module version (or (devel)), commit, build time, and dirty flag — never dev/none/unknown.
  • make build stamps git describe --tags --always --dirty for the readable vX.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.