Skip to content

Release v0.29.0 - #99

Merged
lchoquel merged 2 commits into
mainfrom
release/v0.29.0
Sep 27, 2026
Merged

lchoquel merged 2 commits into
mainfrom
release/v0.29.0

Conversation

@lchoquel

@lchoquel lchoquel commented Sep 27, 2026 •

Copy link
Copy Markdown
Member

Release v0.29.0

Bumps version from 0.28.1 to 0.29.0. Promotes dev → main.

Changelog

Highlights

A caught error reaches the caller with its reason and its place. A run of an invalid bundle is refused before any pipe runs with the same located validation items /validate gives, a failed run names the pipe that failed and its root fault, and a run the caller's own method refuses keeps its explanation under STRICT disclosure.

Added

  • Validation items carry more locators: a TOML syntax error's item carries the 1-based line and column the parser stopped at, an unresolved_concept item carries declared_concepts, and the new unknown_model item carries model_reference (the reference as the bundle wrote it), model_type and suggestions (the model deck's close matches of that kind), with an unsafe rename fix when there is exactly one. The OpenAPI artifact publishes the new fields and the new unknown_model value of PipeValidationErrorType.
  • A run graph marks a list-valued stuff: every io item of a graph_spec carries multiplicity, true when the stuff is a list, a fixed-count one included, and null otherwise, so a renderer can show a Document[] input or a Record[] output as a list. The schema also admits a positive integer, which the runtime does not emit.

Changed

  • Pinned pipelex 0.67.0 (Breaking): up from ==0.66.1, exactly, the release that carries the located error reporting the entries below describe. The .pipelex/ config shipped here already sits at the current schema, so no migration is required. The next step of an invalid-bundle verdict, its user_action.detail, now reads "Edit the bundle as each validation error says: apply its suggested fix where it has one, after confirming an unsafe one".
  • The run routes refuse an invalid bundle with its validation verdict (Breaking): POST /v1/execute and POST /v1/start answer every refusal of the bundle while it loads, before any pipe runs, with the 422 ValidateBundleError problem document carrying the same located validation_errors POST /v1/validate gives, which STRICT disclosure keeps. A misspelled concept or a wiring mismatch used to answer a 500, a TOML fault a 422 without items, and an unknown model the raw model-choice error. An entry pipe the bundle does not declare still answers its own PipeNotFoundError.
  • A failed run reports its root fault, located at the failing pipe (Breaking): a run failure's problem document carries the error_type, title, type, error_domain and status of the innermost Pipelex error rather than the run-level wrapper's, and its detail opens with Pipe '<pipe>' failed (<entry pipe> → … → <pipe>):, so a consumer branching on error_type == "PipelineExecutionError" branches on the root fault's type. A run the caller's own method refuses, such as a PipeCondition whose outcome is fail, a PipeParallel branch whose multiplicity does not fit its field, a step missing a required input or an inline model the deck does not define, answers a 422 with a detail STRICT disclosure keeps, where it answered 500 with An internal error occurred.. The completion webhook's error carries the same report.
  • Every load-time refusal is an item of the validation verdict (Breaking): POST /v1/validate, POST /v1/resolve, POST /v1/codegen and POST /v1/build/* answer any refusal of the submitted bundle, an unknown model and a pipe factory's refusal included, as a 200 is_valid: false verdict with a located item, where some of them escaped as a no-verdict problem document.
  • A failing dry run is one located dry_run item per failing pipe (Breaking): an invalid verdict's validation_errors carries one dry_run item per pipe whose dry run failed, with the pipe_code, domain_code and source of the innermost pipe that failed, where it carried a single message-only item for the whole sweep. Its message is the failure's own when that is caller-facing and its title otherwise, so a configuration fault met during a dry run no longer reaches the caller through the verdict.
  • POST /v1/codegen stamps engine_version 0.67.0: the stamp is the pinned pipelex version, so a codegen.lock committed against 0.66.1 no longer matches until it is regenerated. POST /v1/build/runner carries the same stamp.

Fixed

  • A verdict names no path on the server: an item located inside a package a method depends on by address names the bundle by the package's address and its path inside it, and an item located in one of the server's own library directories carries no source or field_path naming its file, so STRICT disclosure no longer hands a caller a path on the host.

Closes L-260927-fd4b9b

🤖 Generated with Claude Code


Summary by cubic

Releases v0.29.0, pinning pipelex 0.67.0 (up from ==0.66.1) and promoting dev → main with the located error reporting that release carries onto the run routes and validation verdicts.

Breaking

  • POST /v1/execute and POST /v1/start refuse an invalid bundle before any pipe runs with a 422 ValidateBundleError carrying the same validation_errors /v1/validate gives; previously they answered 500 or the raw model-choice error.
  • A failed run reports its root fault instead of the run-level wrapper, and the detail names the failing pipe and its path from the entry pipe. Caller-caused run failures now answer 422 with the explanation kept under STRICT disclosure, where they answered 500 with An internal error occurred.
  • A failing dry run is one located dry_run item per failing pipe instead of a single message-only item for the whole sweep.
  • POST /v1/codegen and POST /v1/build/runner stamp engine_version 0.67.0, so a codegen.lock from 0.66.1 no longer matches until regenerated.

Added

  • Validation items carry line/column on TOML syntax errors, declared_concepts on unresolved concepts, and the new unknown_model item carries the model reference, type, and close-match suggestions.
  • A graph_spec io item marks list-valued stuff with multiplicity: true.

Written for commit 5958658. Summary will update on new commits.

Review in cubic

lchoquel and others added 2 commits September 27, 2026 13:06
Pins pipelex 0.67.0, the release that carries the sprint's located error
reporting, so pipelex-server can move its pipelex-api tag and its
pipelex pin together. The run routes now refuse an invalid bundle before
any pipe runs with the 422 validation verdict, a failed run reports its
root fault at the failing pipe under STRICT as well, and a failing dry
run is one located item per failing pipe; new tests pin each of those on
the wire, and the OpenAPI artifact, the error docs and the changelog
follow.

Advances L-260927-538d31

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Pins `pipelex` 0.67.0 with `pipelex-api` and relocks, carrying that
release's located error reporting onto the run routes and docs.

**Breaking**
- `POST /v1/execute` and `POST /v1/start` refuse an invalid bundle
before any pipe runs with a 422 `ValidateBundleError` carrying the same
`validation_errors` `/v1/validate` gives, where misspelled concepts,
wiring mismatches, TOML faults, and unknown models used to answer 500s
or raw errors.
- A failed run's problem document reports the root fault instead of the
run-level wrapper: `error_type`, `title`, `type`, `error_domain`, and
status are the innermost Pipelex error's, and `detail` names the failing
pipe and its path.
- Caller-caused run failures now answer 422 with an unredacted `detail`
under STRICT, where they answered 500.
- A failing dry run is one `dry_run` item per failing pipe, located at
the innermost pipe that failed, instead of a single message-only item
for the whole sweep. The invalid verdict's `message` is the lone item's
message when there is one, and `N validation errors (first: …)` when
there are several.
- Validation items can carry `line`/`column` on TOML syntax errors and
`model_reference`/`model_type`/`suggestions` (plus an `unsafe`
suggested-fix rename when there is exactly one match) on the new
`unknown_model` item.
- `POST /v1/codegen` and `POST /v1/build/runner` stamp `engine_version`
`0.67.0`, so a `codegen.lock` from 0.66.1 no longer matches until
regenerated.

**Tests and docs**
- New tests pin the run-route refusals, the located dry-run items, and
the root-fault reporting under VERBOSE and STRICT disclosure.
- The OpenAPI artifact, error docs, and changelog document the new items
and fields, the run graph's `multiplicity: true` list marker, the
`fixed` contract multiplicity with its `item_count` on `/validate`
(`Text[3]` reports `multiplicity: fixed`, `item_count: 3`), and that an
item beside a server's own library directories never names a host file
path.

<sup>Written for commit 617fbda.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/Pipelex/pipelex-api/pull/98?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@lchoquel
lchoquel merged commit 2271d83 into main Sep 27, 2026
17 checks passed
@lchoquel
lchoquel deleted the release/v0.29.0 branch September 27, 2026 11:14
@github-actions github-actions Bot locked and limited conversation to collaborators Sep 27, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant