Skip to content

fix(release)!: declare the breaking changes, so the version stops understating them - #105

Merged
ichabodcole merged 1 commit into
mainfrom
fix/declare-breaking-changes
Sep 15, 2026
Merged

ichabodcole merged 1 commit into
mainfrom
fix/declare-breaking-changes

Conversation

@ichabodcole

Copy link
Copy Markdown
Owner

Declares the breaking changes this release carries, so release-please recuts #104 as 3.0.0 instead of 2.3.0. See docs/releases/3.0.0-breaking-changes.md.

…erstating them

The release was cut as 2.3.0 — a MINOR — for a release that moves exit codes and
wire contracts on six spells. Not one of its 521 commits carried a `!` or a
`BREAKING CHANGE:` footer, which is the only thing release-please reads, so the
generated changelog had `### Features` and `### Bug Fixes` and no breaking
section at all.

⛔ AND THE ABSENCE WAS AN ACTIVE SIGNAL, NOT MERELY A GAP. The same CHANGELOG
carries real `### ⚠ BREAKING CHANGES` sections for earlier releases, so a
consumer scanning it learns this project flags breaks when they happen — and
reads their absence on this release as "there are none". Anyone pinned `^2`
would have taken exit-code changes silently.

⚠ AND THE COUNT WAS WRONG EVERY TIME IT WAS SAID. Drafts of the release note,
and this session's own summaries, said "twelve breaking changes" — a figure
counted at an earlier commit and repeated without being re-derived. Enumerated
at the release commit: FIFTEEN wire-and-exit-code changes plus one removed human
affordance. `docs/releases/3.0.0-breaking-changes.md` is the list, grouped by
what an integrator would act on: exit codes, depended-on behaviour, the event
stream. Where a count and a list disagree, trust the list.

Typed `fix` rather than `docs` deliberately: this corrects release metadata that
would have misinformed consumers about compatibility, and a type whose section
is hidden by default is the wrong place to put a notice that must be rendered.

BREAKING CHANGE: Exit codes and event-stream contracts changed on six spells.
Exit codes: "no session" moved 2 → 5 on glamour, imago and bounty (joining
magpie and mind-mapper); bounty's cooperative refusals moved off exit 1 to 6
`conflict` / 5 `not_found` with stdout now empty; grapevine `pull` on a missing
channel 2 → 5 and `send` to an archived channel 2 → 6; mind-mapper's
needs-project and 409 family 2 → 6 and unknown entity → 5; a bare invocation is
now exit 2 on grapevine, magpie and glamour where it exited 0.
Behaviour: grapevine's read verbs (`pull`, `read`, `wait`, `triage`, bare
`topic <name>`) now 404 instead of silently creating the channel; `--timeout 0`
reversed meaning on magpie and bounty to "never idle-close"; magpie's
`--timeout` now means "linger after the last subscriber leaves" rather than
"longest idle while connected"; unknown flags are rejected and flags are scoped
to their verb.
Event stream: mind-mapper's cursor field is `id`, not `seq`, and its keepalive
is `: hb`, not `: keepalive`; SSE streams now open with a `: connected` comment
on astrolabe, magpie, glamour and bounty; bounty's presence frames left the
replay log and carry no `id`; imago's proposal frames carry the proposal as
`proposalId` instead of overwriting the `id` cursor.
UI: grapevine's watch surface drops the per-row close button for a context menu.
The full list, with the reasoning for each, is
`docs/releases/3.0.0-breaking-changes.md`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BiZGj5ZTDSZi1mB8YtuRcx
@ichabodcole
ichabodcole merged commit 6fbdf3d into main Sep 15, 2026
1 check passed
ichabodcole added a commit that referenced this pull request Sep 15, 2026
…said otherwise

Ruleset "Main Gate" (`22059514`) was created 2026-09-01T18:39:36-07:00 — the day
after the backlog item asking for it was filed — is `enforcement: active` on
`~DEFAULT_BRANCH`, and requires the status check `gate`. It ran and passed on
both PRs that went into `main` for the 3.0.0 release (#104 4m38s, #105 4m25s).
Nobody closed the item, so for two weeks the tree asserted the opposite.

⛔ AND IT REACHED A PUBLISHED RELEASE NOTE. The 3.0.0 note lists as a standing
limit that "`gate` has to be marked required in GitHub's settings, and no agent
can do that — until a human does, a red `gate` does not block a merge", and adds
that a check which caught two real defects on its first outings "is not yet
allowed to block a merge". Both are false, and they are frozen in the
`develop`→`main` merge commit body. The note cites the backlog item by filename
for the detail, so closing that item with the evidence is the only correction
that reaches a reader once the merge commit is published.

⚠ THE REASONING ERROR, WHICH IS THE PART WORTH KEEPING. The note said of the
workflow header's assertion: "nothing in this tree can confirm it — treat that
sentence as an instruction to a human, not a statement of fact." The first half
was true; the conclusion was not. `gh api repos/<owner>/<repo>/rulesets` reads
repo configuration directly, and the same session used `gh` freely for PRs, runs
and logs the whole time. **"Not verifiable from the tree" was silently upgraded
to "not verifiable"**, and a stale backlog item was then taken as current state
because nothing in the tree contradicted it.

The investigation's clause that seeded it ("not something an agent can land or
verify") is corrected in place rather than rewritten: landing is Cole's,
verifying is one API call. `.github/workflows/ci.yml`'s header was right all
along and is unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BiZGj5ZTDSZi1mB8YtuRcx
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