Skip to content

docs(changelog): restore the [0.2.0] heading I deleted - #14

Merged
brayniac merged 1 commit into
mainfrom
fix/restore-020-changelog-heading
Sep 18, 2026
Merged

brayniac merged 1 commit into
mainfrom
fix/restore-020-changelog-heading

Conversation

@brayniac

Copy link
Copy Markdown
Contributor

2c98ee2 (#13) removed the ## [0.2.0] - 2026-09-18 heading, folding the whole
released section back under [Unreleased].

Restored: the [0.2.0] and [0.1.0] sections are byte-identical to
8c0a7bf, verified with diff, and [Unreleased] again holds only the seq
correction.

How

#13 removed two superseded entries with:

j = s.find("\n- ",   i + 1)
k = s.find("\n### ",  i + 1)
end = min(x for x in (j, k, len(s)) if x > 0)

That deletes from the entry to the next bullet or subheading. The entry being
removed happened to be the last one before ## [0.2.0], so the nearest
match was inside the released section and the cut swallowed the heading on the
way. A delete whose end is "the next thing that looks like a boundary" cannot
tell what kind of boundary it found.

Why nothing caught it

CI does not read CHANGELOG structure. And release.yml checks only the section
for the version being released — so a corrupted older section is invisible
to it permanently. A 0.2.1 release would have passed every check with 0.2.0's
notes destroyed in the repository.

Verified by hand instead: extraction now yields 48 non-blank lines for 0.2.0,
66 for 0.1.0, and 0 for 0.2.1 as it should until a release PR dates it.

🤖 Generated with Claude Code

2c98ee2 removed the `## [0.2.0] - 2026-09-18` heading, folding the whole
released section back under [Unreleased]. The 0.2.0 and 0.1.0 sections are
restored byte-identical to 8c0a7bf; [Unreleased] again holds only the seq
correction.

My own fault and worth naming, because it is the same shape as the other
mistakes today. The commit removed two superseded entries with:

    j = s.find("\n- ", i + 1)
    k = s.find("\n### ", i + 1)
    end = min(x for x in (j, k, len(s)) if x > 0)

That deletes from the entry to the next bullet or subheading. The entry it was
removing happened to be the LAST one before `## [0.2.0]`, so the nearest match
was inside the released section and the cut swallowed the heading on the way.
A delete whose end is "the next thing that looks like a boundary" has no idea
what kind of boundary it found.

Nothing caught it. CI does not read CHANGELOG structure, and release.yml checks
only the section for the version being released -- so a corrupted OLDER section
is invisible to it permanently. Had this not been noticed by hand, 0.2.0's
release notes would have stayed wrong in the repository forever while every
future release passed its checks.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@brayniac
brayniac merged commit 8392070 into main Sep 18, 2026
6 checks passed
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