chore(release): prepare 0.89.0 - #651
Merged
Merged
Conversation
padak
force-pushed
the
chore/release-0.89.0
branch
from
August 22, 2026 22:01
0c038c2 to
a298a08
Compare
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. |
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
force-pushed
the
chore/release-0.89.0
branch
from
August 23, 2026 08:49
a298a08 to
db6c8dd
Compare
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:
|
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.
Release prep for 0.89.0.
pyproject.toml,plugin.jsonandmarketplace.jsonwere already renumbered by #643; this PR completes the changelog and the documentation gates for everything else merged sincev0.88.0.Release contents
config deletenever purges on a repeated delete (locate-first guard + per-call transport retry opt-out); newconfig restoreandconfig trash-list; all three mirrored onkbagent serve63475d4sync diff/sync pushare branch-scoped: after a dev-branch pull re-targets the manifest, production diff no longer classifies the wholemain/tree asadded(one push from duplicating the project); cross-tree configs land in a neworphanedreport bucket69831c7config new --push --output-dirscaffolds carry_keboola.config_idand land in the creation branch's subtree, so the nextsync pushadopts instead of duplicating (34-duplicate incident)607fa7e_config.ymlgains the_keboolablock + push-compatible shape (version: 2, definition under_configuration_extra) — a pushed flow is no longer empty5313801vNEXTplaceholder convention) — this PR is the first to follow ittoken create/token refreshpre-flight the acting token and fail fast withMISSING_MASTER_TOKEN(exit 3) instead of the Storage API's generic 500 on a non-admin tokensync cloneoverride files (--bucket-map/--variable-values/--instance-rename) reject nested mappings/lists instead of silently stringifying them into bucket IDs; sharedyaml_input.pynow backs both sync clone and describe-batchstorage describe-batch --from-filerejects malformed shapes / null descriptions / coercion-colliding duplicate keys with a structuredINVALID_ARGUMENT(exit 2) before any write. Behaviour change -- it used to raise anAttributeErrortraceback partway through, half-appliedcomponent sync-actionforwards the root config'sauthorization+runtimeintoconfigData, so OAuth / Service-Account components (keboola.ex-linkedin-ads) stop failing with an opaque empty-body 400storage table-detailhuman output shows column descriptionsscripts/gen_command_reference.py(count flags, composites, enum choices; deterministic across Click/Typer versions)PROMPT_BYTE_BUDGETChangelog
Adds the seven bullets above to the
0.89.0block 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 changelogdefault view).Silent-drift surfaces (convention #17)
gotchas.md-- both(Release step: ... tag this sentence)placeholders resolved.git blameputs both on commits after thev0.88.0tag (feat(storage): show column descriptions intable-detailhuman output #642 at thetable-detailDescription column, fix(storage): reject malformed describe-batch --from-file shapes with a structured error (#640) #645 at thedescribe-batchshape check), so both are tagged(since v0.89.0), not 0.88.0. New fix(AI-3757): forward authorization/runtime in component sync-action #620 gotcha added under "Native parity commands".CLAUDE.md,AGENT_CONTEXT(context.py) andcommands-reference.mdnow carry the forwarding rule (root only, never row-overridden, only when non-empty) with its version gate.CLAUDE.md-- the shape check and the behaviour change are recorded there now;commands-reference.mdgains the version tag.table-detailhuman output #642 -- the humanDescriptioncolumn is version-tagged inCLAUDE.md,commands-reference.md,AGENT_CONTEXTandstorage-describe-workflow.md.safe-write-workflow.md(delete is reversible; never blind-retry on<= 0.88.x) and akeboola-expert.mdmatrix row for delete / restore / trash-list.keboola-expert.mdis 49 774 B, inside the 70 000 B budget.Gates
make check-- green (5934 passed, 12 skipped), includingskill-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)~/kbagent/e2e/describe_batch_validation_e2e.py): valid batch applies;tables:as a list → exit 2INVALID_ARGUMENTnaming the key, nothing applied before the error;nulldescription rejected; duplicate coerced keys (1:vs"1":) rejected;buckets: []back-compat no-op confirmed; the exact issue storage describe-batch: malformed --from-file crashes with a traceback instead of a validation error #640 repro produces a structured error with no traceback.status: deleted; repeated delete →status: already_in_trash, exit 0, with the explicit "a second DELETE would purge it permanently" message (no purge sent);config trash-listfinds the config;config restore→status: restored(version bumped);config detailconfirms it is alive; cleanup delete OK.table-detailhuman output #642 are covered by CI (metavar grammar walks the live command tree; the budget test runs in every suite; table-detail rendering has unit tests).Business Release Notes — draft for the 0.89.0 GitHub Release
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 deletenow 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: newconfig restorebrings a trashed configuration back, andconfig trash-listshows what is in the trash. All three are also available over thekbagent serveREST API.Bulk documentation is now all-or-nothing.
storage describe-batchused 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-detailnow 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_ARGUMENTexit 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 pushcan no longer duplicate your whole project. After working in a dev branch, a productionsync diffused 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 asorphanedwith a reconcile hint, never pushed. (#649) In the same spirit,config new --pushscaffolds 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 createandtoken refreshnow check up front that the acting token is a master (admin) token and explain exactly what is missing, instead of letting the Storage API answer500 Application error.(#647, closing the #599 investigation)sync cloneno longer accepts silently broken override files. A misplaced colon in a--bucket-mapfile 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 — seekbagent version --json'supgrade_hint).After merging (for @padak)
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.vNEXTplaceholder from the feature PRs is resolved tov0.89.0here (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_distfix) — awaiting @Matovidlo's confirmation; it targets the next release once he responds.