Release v0.9.0 - #23
Merged
Merged
Conversation
…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.
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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 v0.9.0
Bumps version from
0.8.0to0.9.0.Minor rather than patch. The SDK's own additions are backward-compatible, but the
mthdspin moves from 0.11.1 to 0.13.0, and 0.13.0 makesjson_schemarequired onPipeOutputContract— 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
validatecan ask for them.PipelexValidationReportgainsinput_formandoutput_form, andvalidate/validate_filesgain aviewsparameter withVALIDATION_VIEW_INPUT_FORMandVALIDATION_VIEW_OUTPUT_FORMbeside it. Neither existed here before:input_formshipped inpipelex-apiat 0.18.0 and never reached this SDK, andoutput_formfollowed 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_contractsalready does. Both areNonerather 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.viewsis sent only when asked, unlikerenderwhich this client always injects — the default response stays byte-identical for the callers that discard views.Changed
mthds0.13.0 (breaking). See above.Gate
make agent-checkpasses (ruff, pyright, mypy — 0 errors across 36 source files) anduv.lockis regenerated viamake li.The test suite was not run locally, at the user's standing request (too heavy for their machine) — CI's
tests-check.ymlmatrix 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