chore(release): complete the 0.86.0 changelog and drop the phantom 0.85.1 - #619
Merged
Conversation
…85.1 The version bump to 0.86.0 already landed on main (#615), but the release notes it produces were incomplete in two ways. Missing entries. PR #616 (`token list`, plus the retry-policy and exceptionId changes) carried no changelog note at all -- its commit message says "No version bump: this lands in a stack of PRs released as one version. The (since v0.86.0) doc tags assume 0.86.0 and the bump PR must confirm that", and the bump PR did not. `make changelog-check` cannot catch this: it verifies every published GitHub release has an entry, not that every merged PR has a note. #556/#606 (merge-request endpoints, Layer 3) and #610 (winget job disabled) were likewise unannounced. All four are added. Phantom 0.85.1. pyproject went 0.85.0 -> 0.85.1 (#614) -> 0.86.0 (#615) without a tag in between, so 0.85.1 exists only as a changelog bucket -- no release, no artifact, nobody running it. `format_whats_new` shows the notes of the *target* version only, so every user upgrading 0.85.0 -> 0.86.0 would have silently missed those four fixes (Azure ciphertext prefix, the `parameters` wrapper, GCP/Azure sync ciphertext, the encrypt-values docs). The bucket is folded into 0.86.0 verbatim. The same phantom leaked into the agent-facing version gates, which is the worse half: `keboola-expert.md` told users to "upgrade to 0.85.1+" and four gotchas.md entries were tagged `(since v0.85.1)` -- a version nobody can install. Retagged to 0.86.0, along with two source comments. Three of the new notes had to lead with a shorter sentence to satisfy `test_newest_release_notes_are_not_truncated` (the headline is the note's first sentence, capped at 160 chars). No behaviour change; documentation and release metadata only.
padak
force-pushed
the
claude/version-0-86-0-release-f260eb
branch
from
August 20, 2026 03:52
490eac7 to
9a66796
Compare
…recognised prefix
Two findings from Devin's review of this PR, plus one they could not see.
The serve route for `token list` was cited as `GET /tokens/{project}`. Both
halves are wrong: the router carries `prefix="/token"` (singular) and the
operation is registered at `/{project}/list`, so the real path is
`GET /token/{project}/list` -- confirmed against the runtime OpenAPI schema,
not the source, because that is what a caller actually hits. Worth noting the
review's proposed correction (`/tokens/{project}/list`) is itself wrong on the
prefix; taking it verbatim would have swapped one 404 for another.
`CI:` is not a recognised note prefix. `_PREFIX_STYLES` / `_PREFIX_RE` in
commands/changelog.py define the set, the module docstring states the contract,
and an unrecognised label renders unhighlighted. Retitled to `Note:`, which
also reads better: the winget job being disabled has a user-facing consequence
(WinGet users stay on the last published version), so burying it under a dim
`Internal:` would understate it.
The finding Devin could not report: the four notification notes carried by
#615/#618 have no prefix at all. They were outside this PR's diff, so no
reviewer looking at the diff would flag them -- but they ship in the same
release block and break the same contract, leaving half of v0.86.0 rendering
flat. Prefixed `New:` / `Note:` with no change of meaning. Every 0.86.0 note
now matches `_PREFIX_RE`, verified by asserting over the live CHANGELOG rather
than by reading.
Each replacement is written to disk on its own. Running several in one script
means a later failed assert discards the earlier successful writes, which is
precisely how #618's stale "server-side ?event=" claim survived its own fix
pass.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Release-metadata only. The version bump to
0.86.0already landed on main (#615); this completes the release notes it generates and removes a version that never shipped.Rebased onto main after #617 and #618 merged — see "Interaction with #617 / #618" below.
Why
1. Three merged PRs had no changelog entry
git log v0.85.0..mainis eight commits. Three were unannounced:kbagent token list, POST/PATCH no longer retried on 5xx,exceptionIdsurfaced#616 is the notable one — its own commit message says "No version bump: this lands in a stack of PRs released as one version. The
(since v0.86.0)doc tags assume 0.86.0 and the bump PR must confirm that." The bump PR did not. The(since v0.86.0)tags inkeboola-expert.mdandgotchas.mdwere already correct; only the changelog was missing, sokbagent changelogand the GitHub release body would both have shipped without it.make changelog-checkcannot catch this — it verifies that every published GitHub release has an entry, not that every merged PR has a note.The retry-policy change in particular is user-visible behaviour that deserves an announcement: a failed
POST/PATCHis no longer retried, and a 500 on an unretried write now reportsretryable=false.2.
0.85.1is a phantom versionpyproject.tomlwent0.85.0→0.85.1(#614) →0.86.0(#615) with no tag in between. There is nov0.85.1tag, no GitHub release, no wheel — nobody is running it.format_whats_new()shows the notes of the target version only, not intermediate ones. So every user upgrading0.85.0→0.86.0would have silently missed four fixes that were sitting in the0.85.1bucket: the AzureKBC::ProjectSecureKV::prefix (#607), theparameterswrapper (#605), GCP/Azure ciphertext insync diff(#612), and theencrypt valuesdocs correction (#613).The bucket is folded into
0.86.0verbatim — no wording changed, only the parent key.3. The phantom leaked into the agent-facing version gates
This is the worse half, and exactly the silent-drift class CLAUDE.md convention #17 warns about:
plugins/kbagent/agents/keboola-expert.mdtold users to "Upgrade to 0.85.1+" — a version they cannot installgotchas.mdentries were tagged(since v0.85.1)sync/secrets.pyandservices/data_app_service.pydated behaviour to0.85.1All retagged to
0.86.0.Interaction with #617 / #618
Both landed on main while this was open; this branch is rebased on top of them.
0.86.0bucket (it corrected the--eventnote and added the Branch-column note, folding into 0.86.0 for the same "not yet released" reason). That was the one conflict; resolved by keeping both — fix(notification): narrow --event client-side; the service ignores ?event= #618's corrected notification wording is untouched, and the five new entries follow it.gotchas.mdcontent and auto-merged. Documentation-only follow-up to feat(token): addtoken list, stop retrying non-idempotent writes (#599) #616's client namespace, no CLI surface, so no changelog entry.0.85.1reference;grep -rn "0\.85\.1"oversrc/,plugins/,docs/andCLAUDE.mdis now empty.Notes
Three of the new entries had to be rewritten to lead with a shorter opening sentence:
test_newest_release_notes_are_not_truncatedenforces that a note's first sentence — which is what the post-update banner andkbagent changelogrender as the headline — fits in 160 chars.keboola-expert.mdstays at 61999 bytes, one byte under the 62000 cap (the retag is length-neutral).Verification
make check— green (5691 passed, 12 skipped) after the rebasemake changelog-check— all 45 stable releases have entriesmake version-check— pyproject / plugin.json / marketplace.json / uv.lock all at 0.86.0uv run python scripts/gen_release_notes.py --version 0.86.0— renders 14 entries, no--releasedcatch-up flag needed now that the phantom bucket is goneNo behaviour change.