Skip to content

Release v0.9.0 - #23

Merged
lchoquel merged 4 commits into
mainfrom
release/v0.9.0
Sep 2, 2026
Merged

Release v0.9.0#23
lchoquel merged 4 commits into
mainfrom
release/v0.9.0

Conversation

@thomashebrard

Copy link
Copy Markdown
Member

Release v0.9.0

Bumps version from 0.8.0 to 0.9.0.

Minor rather than patch. The SDK's own additions are backward-compatible, but the mthds pin moves from 0.11.1 to 0.13.0, and 0.13.0 makes json_schema required on PipeOutputContract — a closed shape, so a verdict from a runner predating the output payload schema now fails the parse. That is breaking for a consumer pointed at an older runner, and the repo's pre-1.0 rule sends a breaking change to the minor.

Changelog

Added

  • The validate report carries both structured views, and validate can ask for them. PipelexValidationReport gains input_form and output_form, and validate / validate_files gain a views parameter with VALIDATION_VIEW_INPUT_FORM and VALIDATION_VIEW_OUTPUT_FORM beside it. Neither existed here before: input_form shipped in pipelex-api at 0.18.0 and never reached this SDK, and output_form followed it — so a caller had no route to the two artifacts a form or a result renderer needs.

    Both are typed by importing the standard's own models rather than restated as opaque dicts, matching what pipe_io_contracts already does. Both are None rather than an empty map when absent: an opt-in view's absence means the request did not ask, not that the method has nothing to describe. views is sent only when asked, unlike render which this client always injects — the default response stays byte-identical for the callers that discard views.

Changed

  • Requires mthds 0.13.0 (breaking). See above.

Gate

make agent-check passes (ruff, pyright, mypy — 0 errors across 36 source files) and uv.lock is regenerated via make li.

The test suite was not run locally, at the user's standing request (too heavy for their machine) — CI's tests-check.yml matrix owns it. The unit suite did pass locally earlier in this work, on the change that is being released.

🤖 Generated with Claude Code

https://claude.ai/code/session_019VJ89z3Gza9CW25pQombFK

lchoquel and others added 4 commits August 29, 2026 05:48
…ate routes added (#19)

* Both method selectors in one pass: method_ref as a typed run source, method_id on the tooling routes, the crate routes added

The addressing-methods Phase 4 leg for pipelex-sdk (design: workspace wip/addressing-methods/design.md), mirroring @pipelex/sdk v0.16.0:

- method_ref is a typed keyword run source on execute/start/start_and_wait (layer 2 — the runner resolves it), pairing with nothing: client-side guards mirror the server's 422s against inline mthds_contents and method_id, while inline+method_id keeps its documented linkage exception and pipe_code beside method_ref stays legal. Provenance comes back typed: PipelexRunResultStart / PipelexExecuteResult carry method_provenance {address, tag, commit_sha}.
- validate takes method_ref= / method_id= keyword selectors under the strict tooling XOR (a selector body carries no mthds_contents key at all; mthds_sources is inline-only); resolve/codegen are added (pipelex_sdk/crate_models.py) with the typed method_id pass-through and the three-way XOR at construction; build_inputs gains the shared files-XOR-method_ref closure and refuses method_id with a teaching error.
- The reserved-extra guard spans both layers now (method_ref joins method_id), and a method_ref-carrying build_inputs/resolve/codegen gets a fetch-sized 3-minute budget so a cold-cache server clone is not misreported as an unreachable server. The run routes and validate already ride the 20-min blocking ceiling, so they need no budget change.
- Version cut in the same PR: v0.8.0, changelog heading dated 2026-08-29.

Hosted availability of the new selectors on api.pipelex.com follows the platform deploy (Phase 3); tests pin the wire bodies and guards against mocks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WoLcQhnFiPgVmDzHqPkRmQ

* fix: empty crate selectors normalize to absent before the XOR

Greptile round-1 fix on PR #19: files=[], method_ref="" (or whitespace-only),
and method_id="" counted as the sole selector under the non-None XOR in the
crate/build request models and reached the wire as unusable values. Field-level
validators now apply the same empty-as-absent rule the run routes'
_normalized_selector boundary gives: an empty selector alone is zero selectors
(the teaching XOR error at construction), and beside a real selector it is
simply absent — never sent. Tests cover all three empty forms, alone and beside
a real selector.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WoLcQhnFiPgVmDzHqPkRmQ

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* Carry the validate structured views: input_form and output_form

The client could not ask for either, and the report could not hold either.
So a caller using this SDK had no route to the two artifacts a result or a
form renderer needs — not a narrowing decision, just a gap: `input_form`
shipped in the API at 0.18.0 and never reached here, and `output_form`
followed it.

`views` is sent ONLY when asked, unlike `render`, which this client always
injects. That asymmetry is deliberate and matches the TypeScript SDK: the
point of an opt-in view is that the default response stays byte-identical,
and the highest-frequency callers — hook pipelines, CI gates, agent loops —
should not pay for bytes they discard.

Both fields are optional for the same reason. Presence is a function of the
request, so a required field would lie about every verdict that did not ask.

They stay `dict[str, Any]`, matching `pipe_io_contracts` beside them: this
envelope is transport, and restating the standard's shapes here would create
a second source of truth free to drift from the one the server emits.

* Type output_form from the standard, and pin mthds to reach it

The rebase brought a lot: dev has since added `views` to the client, a
`VALIDATION_VIEW_INPUT_FORM` token constant, and typed both
`pipe_io_contracts` and `input_form` by importing the standard's own models
instead of carrying them as `dict[str, Any]`. Most of my branch was
duplicating that, so it is gone: what remains is the half dev does not have.

`output_form` is typed `OutputForm | None` — imported, matching what dev did
to its twin, rather than the opaque dict I first wrote. `None` rather than an
empty map, and that distinction carries weight here where it does not on
`pipe_io_contracts`: an opt-in view's absence means the request did not ask,
not that the method has nothing to describe. `VALIDATION_VIEW_OUTPUT_FORM`
joins its sibling so a caller is not passing a bare string.

The `mthds` pin had to move to reach the module at all. `dependencies` says
`mthds==0.11.1`, which predates `mthds.protocol.output_form`, and bumping it
would not help: 0.12.0 is on PyPI but its wheel carries `input_form.py` and
nothing beside it. So `[tool.uv.sources]` points at mthds-python's merged
`dev` by SHA — dev-and-CI metadata only, so a `pip install` still resolves the
pin above. It makes CI honest and does not make a release correct: the pin
must move to a published version and this block must be deleted, together.

* Depend on the published mthds 0.13.0, and drop the git pin

mthds-python shipped the output-form change as 0.13.0, so the temporary
`[tool.uv.sources]` entry pointing at a branch SHA is gone and the dependency
is an ordinary published version again.

The pin also moves off 0.11.1, which predated `mthds.protocol.output_form`
entirely — so `pip install pipelex-sdk` and CI now resolve the same thing,
which they did not while the source block was carrying CI on its own.

* Add json_schema to the output contract fixture

`PipeOutputContract.json_schema` became required when the output side gained a
payload schema, and the contracts are CLOSED shapes — so a fixture written
before it fails the parse rather than being tolerated. That closure is
deliberate: it is what makes a contract from an older runner a loud failure
instead of a silently half-read object.

The empty schema rather than a plausible one: this fixture is about the
envelope parsing, and a shape here would invite an assertion that belongs in a
test about schemas.
@lchoquel
lchoquel merged commit dee8062 into main Sep 2, 2026
17 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Sep 2, 2026
@lchoquel
lchoquel deleted the release/v0.9.0 branch September 8, 2026 14:14
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.

2 participants