Skip to content

chore(release): prepare 0.89.0 - #651

Merged
padak merged 3 commits into
mainfrom
chore/release-0.89.0
Aug 23, 2026
Merged

chore(release): prepare 0.89.0#651
padak merged 3 commits into
mainfrom
chore/release-0.89.0

Conversation

@padak

@padak padak commented Aug 22, 2026

Copy link
Copy Markdown
Member

Release prep for 0.89.0. pyproject.toml, plugin.json and marketplace.json were already renumbered by #643; this PR completes the changelog and the documentation gates for everything else merged since v0.88.0.

Release contents

PR Issue What ships
#643 -- config delete never purges on a repeated delete (locate-first guard + per-call transport retry opt-out); new config restore and config trash-list; all three mirrored on kbagent serve
63475d4 #649 sync diff/sync push are branch-scoped: after a dev-branch pull re-targets the manifest, production diff no longer classifies the whole main/ tree as added (one push from duplicating the project); cross-tree configs land in a new orphaned report bucket
69831c7 #644 config new --push --output-dir scaffolds carry _keboola.config_id and land in the creation branch's subtree, so the next sync push adopts instead of duplicating (34-duplicate incident)
607fa7e #650 flow scaffold _config.yml gains the _keboola block + push-compatible shape (version: 2, definition under _configuration_extra) — a pushed flow is no longer empty
5313801 #648 Process: version bumps + changelog move out of feature PRs into dedicated release PRs (vNEXT placeholder convention) — this PR is the first to follow it
#647 #599 token create / token refresh pre-flight the acting token and fail fast with MISSING_MASTER_TOKEN (exit 3) instead of the Storage API's generic 500 on a non-admin token
#646 -- sync clone override files (--bucket-map/--variable-values/--instance-rename) reject nested mappings/lists instead of silently stringifying them into bucket IDs; shared yaml_input.py now backs both sync clone and describe-batch
#645 #640 storage describe-batch --from-file rejects malformed shapes / null descriptions / coercion-colliding duplicate keys with a structured INVALID_ARGUMENT (exit 2) before any write. Behaviour change -- it used to raise an AttributeError traceback partway through, half-applied
#620 AI-3757 / SUPPORT-17393 component sync-action forwards the root config's authorization + runtime into configData, so OAuth / Service-Account components (keboola.ex-linkedin-ads) stop failing with an opaque empty-body 400
#642 -- storage table-detail human output shows column descriptions
#517 #513 Stable metavar contract in scripts/gen_command_reference.py (count flags, composites, enum choices; deterministic across Click/Typer versions)
#586 #585 Test gating the documented prompt budget against the enforced PROMPT_BYTE_BUDGET
#641 -- Docs-only reference-gap fixes from the 0.88.0 audit

Changelog

Adds the seven bullets above to the 0.89.0 block and decorates the existing #643 bullets with their PR reference so the block reads consistently. Every first sentence is self-contained and under the 160-char headline cap (kbagent changelog default view).

Silent-drift surfaces (convention #17)

Gates

  • make check -- green (5934 passed, 12 skipped), including skill-check, version-check, command-sync-check, changelog-check, check-error-codes, check-sentinel-guards, loc-check.
  • make version-gate-check -- All 438 version gates across 72 versions resolve to a release.
  • make version-sync -- no changes (already at 0.89.0).

No tag and no GitHub release here -- that happens after e2e verification.

Live e2e verification (2026-08-22, project e2e-snowflake, CLI run from this branch)

Business Release Notes — draft for the 0.89.0 GitHub Release

The release pipeline generates the release body from changelog.py automatically. This section is the business-oriented summary to paste above the generated changelog (or use as the announcement text in Slack/e-mail).

Keboola CLI 0.89.0 — your configurations just became much harder to lose

A retry can no longer destroy a configuration. The Storage API overloads DELETE: the first call soft-deletes a configuration into the trash, but an identical second call — exactly what every agent, CI script, or impatient human does after a timeout — purged it permanently, rows, versions and metadata included. kbagent config delete now checks state first and never sends a DELETE at anything that is not live, and the HTTP layer no longer auto-retries this specific call. Deleting is now genuinely reversible: new config restore brings a trashed configuration back, and config trash-list shows what is in the trash. All three are also available over the kbagent serve REST API.

Bulk documentation is now all-or-nothing. storage describe-batch used to crash with a Python traceback partway through a malformed YAML file — leaving your project half-described. It now validates the whole file before the first write and reports exactly which key is wrong, its actual type, and a copy-pasteable example. A typo now costs you one clear error message instead of a cleanup session.

OAuth-connected components now work from the CLI. component sync-action (e.g. listing LinkedIn Ads accounts) failed with an opaque 400 for any component authorized via OAuth, because the CLI never forwarded the authorization reference. It does now — matching what the Keboola MCP server always did. (AI-3757 / SUPPORT-17393)

Column documentation is visible where you look for it. storage table-detail now shows column descriptions in its human-readable output — completing the 0.88.0 work that made kbagent write descriptions where the UI, MCP and warehouse COMMENTs read them.

For AI agents specifically: every one of these changes tightens the structured-error contract agents depend on — malformed input now fails fast with INVALID_ARGUMENT exit 2 before any write, destructive retries are idempotent, and all agent-facing docs (kbagent context, the kbagent skill references, gotchas) are version-tagged for 0.89.0.

sync push can no longer duplicate your whole project. After working in a dev branch, a production sync diff used to classify every production config as "new" — one confirmation away from creating each of them again. Diff and push are now scoped to a single branch tree and anything left over is reported as orphaned with a reconcile hint, never pushed. (#649) In the same spirit, config new --push scaffolds now remember the ID of the config they created, so the next push updates it instead of creating a duplicate (#644), and scaffolded flows are finally pushable at all (#650).

Token administration fails clean, not cryptic. token create and token refresh now check up front that the acting token is a master (admin) token and explain exactly what is missing, instead of letting the Storage API answer 500 Application error. (#647, closing the #599 investigation)

sync clone no longer accepts silently broken override files. A misplaced colon in a --bucket-map file used to produce a bucket literally named "{'new': 'in.c-new'}" in the target project; now the file is rejected up front with the offending key named. (#646)

Plus: a stable machine-readable format contract for the generated command reference (#517), a CI guard keeping documented limits in sync with enforced ones (#586), and reference-doc fixes from the 0.88.0 audit (#641).

Upgrade: kbagent update (or your package manager's own upgrade command — see kbagent version --json's upgrade_hint).

After merging (for @padak)

  1. Merging this PR puts main at 0.89.0. Release = push the tag: git tag v0.89.0 <merge-commit-sha> && git push origin v0.89.0 — the pipeline builds the wheel, creates the GitHub Release (body from changelog), and pushes chocolatey. Paste the business notes above into the release body if you want them on the release page.
  2. Landed after this PR was first opened and now included: fix(token): pre-flight master-token guard on token create/refresh #647 (closed token create: persistent upstream 500 on POST /v2/storage/tokens surfaces as a blind retry + generic error, no actionable guidance #599), fix(sync): reject non-scalar values in sync clone override files #646, sync: production diff/push after 'sync pull --branch' flags the whole orphaned main/ tree as added (mass-duplicate risk) #649, config new --output-dir --push writes a scaffold without the created config ID → duplicates on next sync push #644, config new: flow scaffold _config.yml lacks the _keboola block, sync push sees component 'unknown' #650 and the docs: version bumps move out of feature PRs into dedicated release PRs #648 release-process change — the branch is rebased to carry all their changelog entries, and every vNEXT placeholder from the feature PRs is resolved to v0.89.0 here (per the new docs: version bumps move out of feature PRs into dedicated release PRs #648 process). Not in this release: PR fix(AI-3750): stop duplicate _ui_dist wheel entry (hatchling >= 1.30) #623 (wheel _ui_dist fix) — awaiting @Matovidlo's confirmation; it targets the next release once he responds.

Open in Devin Review

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@padak
padak force-pushed the chore/release-0.89.0 branch from 0c038c2 to a298a08 Compare August 22, 2026 22:01
@padak

padak commented Aug 22, 2026

Copy link
Copy Markdown
Member Author

Post-rebase verification: CI green on head a298a08 (check + 3.12 + 3.13 + Windows regression suite), and the live describe-batch e2e (~/kbagent/e2e/describe_batch_validation_e2e.py, project e2e-snowflake) re-ran against this exact head 11/11 passed — confirming #646's shared yaml_input.py extraction did not change describe-batch behavior. Ready to merge; after merging, release = push the v0.89.0 tag.

padak added 2 commits August 23, 2026 10:43
pyproject/plugin.json/marketplace.json were already renumbered to 0.89.0 by
v0.88.0.

Changelog: adds 0.89.0 entries for #645 (describe-batch --from-file shape
validation, issue #640), #642 (table-detail human column descriptions), #620
(sync-action forwards root authorization/runtime), #517 (stable metavar
contract, issue #513), #586 (documented prompt budget gated against the
enforced one, issue #585) and #641 (docs-only), and decorates the existing

Silent-drift surfaces:

* gotchas.md -- resolves both "(Release step: ... tag this sentence)"
  placeholders. Both were left by commits AFTER the v0.88.0 tag (#642 and
  #645), so both are tagged (since v0.89.0), not 0.88.0. Adds the #620 gotcha:
  below 0.89.0 a sync action on an OAuth / Service-Account component died with
  an opaque empty-body 400 because the broker reference was never forwarded.
* #620 shipped with no doc surfaces at all -- CLAUDE.md, AGENT_CONTEXT and
  commands-reference.md now carry the forwarding rule (root only, never
  row-overridden, only when non-empty) with its version gate.
* #645 never reached CLAUDE.md -- the describe-batch shape check and its
  behaviour change are recorded there now; commands-reference gains the
  version tag.
* #642's human Description column is version-tagged in CLAUDE.md,
  commands-reference.md, AGENT_CONTEXT and storage-describe-workflow.md.
* #643 was otherwise complete; adds the two surfaces it did not touch --
  safe-write-workflow.md (delete is reversible; never blind-retry on <= 0.88.x)
  and a keboola-expert.md matrix row for delete/restore/trash-list.
  keboola-expert.md is 49 774 B, well inside the 70 000 B budget.

make check green: 5934 passed, 12 skipped. version-gate-check resolves all 438
markers across 72 versions.
…XT gates

Rebased onto main, which added four more merged PRs to the release scope.

Changelog (0.89.0):

* Fix (#649): sync diff/push scoped to a single branch tree; cross-tree
  manifest entries are reported under the new `orphaned` bucket instead of
  being planned as creates (a production diff after a dev-branch pull was one
  push away from duplicating the whole project).
* Fix (#644): `config new --push --output-dir` stamps the created config's ID
  into the scaffold and writes it into the branch it was actually created in,
  so the next `sync push` adopts it instead of POSTing a duplicate.
* Fix (#650): the `keboola.flow` scaffold gains the `_keboola` footer and the
  push-compatible `version: 2` / `_configuration_extra` shape.
* Internal (#648): version bumps and changelog entries now happen only in a
  dedicated release PR; feature PRs tag version-gated docs with `vNEXT`.

vNEXT placeholders: 17 usages rewritten to the released version across
CLAUDE.md, keboola-expert.md, gotchas.md, commands-reference.md,
branch-workflow.md, scaffold-workflow.md, sync-workflow.md and
AGENT_CONTEXT (context.py). The only surviving `vNEXT` mentions are the three
CLAUDE.md lines that document the convention itself.

Rebase conflict: gotchas.md storage-descriptions bullet -- both sides kept
(main's reflow plus the release commit's added pre-0.89.0 sentence).

keboola-expert.md is 50 113 B, inside the 70 000 B budget. make check green
(6009 passed, 12 skipped); version-gate-check resolves all 450 markers across
72 versions.
@padak
padak force-pushed the chore/release-0.89.0 branch from a298a08 to db6c8dd Compare August 23, 2026 08:49
@padak

padak commented Aug 23, 2026

Copy link
Copy Markdown
Member Author

Extended live e2e sweep (project e2e-snowflake, CLI run from this branch at 2c77a8f) — every release item that is live-testable in the e2e environment now has a live check:

@padak
padak merged commit b5373a1 into main Aug 23, 2026
4 checks passed
@padak
padak deleted the chore/release-0.89.0 branch August 23, 2026 09:33
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.

token create: persistent upstream 500 on POST /v2/storage/tokens surfaces as a blind retry + generic error, no actionable guidance

1 participant