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.
Task
cliff.tomldoes not render breaking changes as breaking, so every breaking release ships inCHANGELOG.mdas an ordinary feature row.Found by a review gate that had itself asserted the opposite — it claimed adding
!to a subject wouldfix the changelog, then measured it and retracted that half on the record. The measurement:
cliff.tomlmentionsbreakingonce, asprotect_breaking_commits = true— which only stopsbreaking commits being filtered out, it does not mark them.
commit.breaking.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
ControlHandlermethods without defaults), both rendering as ordinary features.Scope
Fix the config so a breaking commit renders as such, then regenerate.
CHANGELOG.mdiscliff-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 noBREAKING CHANGE:footers at all, soa 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
feat!commit currently renders without a marker — that isthe defect, and it is what your fix must change.
ok. If you add a guard test, prove it can fail — a changelog check thatpasses against the unfixed config is worse than none.
Cross-references
Found during: #25 (eco#3127's wire contract, merged as
a9fcbefcas
feat(wallet)!) — the!there is durable and greppable ingit logand matches the crate's bestprecedent, 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.