chore(release): 0.56.0 — maintenance re-release (redo after #389 merge collision)#399
Merged
Conversation
…livery 0.55.0 sat in main across three builds (#383, #379, #388) under one version number, so users on an interim 0.55.0 build never received the reference-data commands via `kbagent update` (the auto-update check is version-only: 0.55.0 >= 0.55.0 reads as up-to-date). Bump to 0.56.0 gives auto-update a strictly-greater target. No code changes; reference-data stays recorded under 0.55.0 and its since-tags remain correct.
padak
added a commit
that referenced
this pull request
Jun 4, 2026
main shipped v0.56.0 as a maintenance re-release (#399) — claiming the 0.56.0 version, git tag, and GitHub Latest release — to push the 0.55.0 reference-data commands through the auto-update version gate. The conditional-flows work therefore moves to 0.57.0. Bumps pyproject + plugin.json + marketplace.json + uv.lock, and rewrites every (since v0.56.0) doc tag to v0.57.0 across CLAUDE.md, README, keboola-expert.md, gotchas.md, commands-reference.md, flow/schedule workflows, AGENT_CONTEXT, and code comments. The changelog 0.57.0 key carries the conditional-flows entry; the 0.56.0 maintenance entry is preserved.
padak
added a commit
that referenced
this pull request
Jun 4, 2026
* feat(flow)!: conditional flows support, drop orchestrator (0.56.0)
--component-id removed from all flow subcommands and the /flows REST
surface; orchestrator configs dropped from flow list (legacy count
warning). Payload validation runs against the live conditional-flow JSON
Schema fetched at runtime from the AI Service component registry (never
bundled), with semantic-only graceful degradation when the fetch fails.
New flow validate [--project] and flow schema --full. Detail rendering
rewritten for conditional flows. INVALID_FLOW_DAG renamed to
INVALID_FLOW_DEFINITION. Docs and plugin surfaces synced.
* fix(flow): address PR review findings
- add POST /flows/validate and GET /flows/{project}/schema REST routes
to keep the 1:1 CLI-to-REST parity for the new flow commands; routes
are declared before the path-param routes so literal segments win
- add router call tests for both endpoints (incl. route-ordering guards
and the fetch-failure degrade/502 paths)
- document why the broad except in _fetch_flow_schema is intentional
(httpx errors do not subclass OSError; any failure must degrade)
- use ErrorCode.NOT_FOUND enum instead of raw string in flow_service
- hoist deferred json/rich.syntax imports to module top in commands/flow.py
- schedule-workflow.md: switch example target to keboola.flow and note
legacy orchestrator schedules still appear in schedule list
* refactor(flow): hoist flow_validation import to module top
Follow-up to the review-fix commit: the deferred import inside
flow_validate() was the last remaining one; flow_validation is pure
(stdlib + jsonschema), so module-level import is circular-import safe.
* fix(tests): make parallel list_jobs asserts thread-safe
TestPullJobsFallback asserted MagicMock.call_count on a path where
_fetch_jobs_per_config calls the mock from a ThreadPoolExecutor.
MagicMock.call_count is incremented without a lock (read-modify-write),
so concurrent calls lose updates -- reproducible locally with a lowered
sys.setswitchinterval (30/30 runs lose increments) and surfaced in CI
where coverage tracing widens the race window (observed 174 != 200).
call_args_list.append IS atomic under the GIL, so assert on
len(call_args_list) instead; the 200-config test additionally checks
the distinct (component_id, config_id) pairs to guarantee exactly-once
fetching. Production code is unaffected (results were already collected
under an explicit lock).
* fix(flow): use product names in legacy-flows warning
'3 legacy keboola.orchestrator flow(s) ... migrate to keboola.flow' read
like internal component IDs; reword to product terminology: 'Legacy
Flows were dropped in 0.56.0; migrate them to Conditional Flows'.
* chore(release): retarget conditional flows to 0.57.0
main shipped v0.56.0 as a maintenance re-release (#399) — claiming the 0.56.0 version, git tag, and GitHub Latest release — to push the 0.55.0 reference-data commands through the auto-update version gate. The conditional-flows work therefore moves to 0.57.0.
Bumps pyproject + plugin.json + marketplace.json + uv.lock, and rewrites every (since v0.56.0) doc tag to v0.57.0 across CLAUDE.md, README, keboola-expert.md, gotchas.md, commands-reference.md, flow/schedule workflows, AGENT_CONTEXT, and code comments. The changelog 0.57.0 key carries the conditional-flows entry; the 0.56.0 maintenance entry is preserved.
* refactor(flow): FlowSchemaFetch dataclass + close two test gaps
Addresses self-review findings on the conditional-flows work:
- Replace the (schema, reason) tuple from FlowService._fetch_flow_schema / fetch_flow_schema with a frozen FlowSchemaFetch dataclass (CONTRIBUTING.md forbids new semantically-distinct tuple returns). Updates all six src call sites (flow_service, flows router, flow command) and the tuple mocks in test_flow_service / test_flow_cli / test_server_router_calls.
- Add a structural integer-id rejection test (test_flow_validation): an integer id is rejected only when the live schema is supplied; without a schema the semantic checks coerce it and stay silent.
- Add router-level tests that POST/PATCH /flows/{project} call create_flow / update_flow WITHOUT component_id, proving the orchestrator-drop is enforced at the REST layer (FlowCreate/FlowUpdate silently drop a legacy component_id).
* fix(flow): address fresh review findings (stale doc code, dead helper)
- docs/build-your-own-client.md: INVALID_FLOW_DAG -> INVALID_FLOW_DEFINITION. The error code was renamed in this PR; the client-docs example still referenced the removed name (docs/ was outside the original rename sweep, which only grepped src/ + tests/).
- Remove the dead _count_phases_tasks helper from flow_service.py: the conditional-flows rewrite orphaned it (zero src callers, exercised only by an isolated test) and it carried a banned tuple[int, int] return. Drops its two tests too.
---------
Co-authored-by: Petr <petr@keboola.com>
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.
Re-do of #389
#389 was marked MERGED but its content never landed on
main— it collided with #391 (test e2e) merging at the same time, and #391's content won the merge commit.origin/mainis still 0.55.0 with no 0.56.0 changelog entry. This re-applies the lostfc2efe6(cherry-picked clean onto current main).Why 0.56.0 (unchanged from #389)
0.55.0 lived in
mainacross three builds under one version number, so users on an interim 0.55.0 build never get thereference-datacommands viakbagent update(auto-update is version-only:0.55.0 >= 0.55.0→ skips reinstall). Bump to 0.56.0 gives a strictly-greater/releases/latesttarget.Scope
make version-syncpropagated plugin.json/marketplace.json/uv.lock).since v0.55.0tags correct.make checkgreen (3843 passed).