Skip to content

build(changelog): cliff.toml renders breaking releases as ordinary features — 0.18.0 and 0.20.0 both affected #26

Description

@MichaelTaylor3d

Task

cliff.toml does not render breaking changes as breaking, so every breaking release ships in
CHANGELOG.md as an ordinary feature row.

Found by a review gate that had itself asserted the opposite — it claimed adding ! to a subject would
fix the changelog, then measured it and retracted that half on the record. The measurement:

  • cliff.toml mentions breaking once, as protect_breaking_commits = true — which only stops
    breaking commits being filtered out, it does not mark them.
  • The body template never references commit.breaking.
  • There is no breaking parser group.

Proof is in this repo's own changelog: #18 shipped as feat! and rendered with no marker at all.

Why it matters

A consumer's only warning that a release will not compile against their code is the changelog. Today
they get a compile error instead of a signal, and this crate is a wire contract — its whole job is to
be depended on by two independent implementors.

Two already-published releases are affected: 0.18.0 and 0.20.0, both genuinely breaking (each added
ControlHandler methods without defaults), both rendering as ordinary features.

Scope

Fix the config so a breaking commit renders as such, then regenerate. CHANGELOG.md is
cliff-generated — never hand-edit it; the fix is the config plus a regenerate, or the next run
silently reverts it.

One constraint that rules out the obvious approach: a footer-only parser will not work here. This
crate announces breakage with ! in the subject and has no BREAKING CHANGE: footers at all, so
a rule keyed on the footer would match nothing and pass as clean — a vacuous fix.

Backfill 0.18.0 and 0.20.0 in the same pass.

Evidence

  • Prove the negative first: confirm a feat! commit currently renders without a marker — that is
    the defect, and it is what your fix must change.
  • After the fix, regenerate and show the marker present for both backfilled versions.
  • Read passed-counts, never ok. If you add a guard test, prove it can fail — a changelog check that
    passes against the unfixed config is worse than none.

Cross-references

Found during: #25 (eco#3127's wire contract, merged as a9fcbefc
as feat(wallet)!) — the ! there is durable and greppable in git log and matches the crate's best
precedent, but it does not reach the changelog until this is fixed.

Also worth a line while the file is open: SPEC §4.2a's authority rule is normative in the SPEC but
absent from the rustdoc
a consumer reads on docs.rs — which is where the adapter actually gets written.
Same shape bit dig-keystore today: SPEC and rustdoc disagreeing, with the rustdoc being the half a
developer reads.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions