Pin pipelex 0.57.0 and carry a run's I/O artifacts on /execute - #72
Conversation
Moves this repo's pipelex pin from 0.56.0 to 0.57.0 and lands the consumer half of the change that release enables. The pin is breaking, in a way the OpenAPI diff does not show: pipelex 0.57.0 moves to mthds 0.14.0, whose MTHDS_STANDARD_VERSION was cut from 1.0.0 to 2.0.0, so every crate /v1/resolve emits and every crate /v1/build/runner normalizes is now stamped mthds_version "2.0.0". Crate fingerprints are unaffected, since mthds_version is excluded from the hashed payload by design. The MTHDS Protocol version is unchanged at 0.6.0, so GET /v1/version moves only its runtime_version. The .pipelex/ config schema did not move. _pipe_output_from_run_output now rehydrates pipe_io_artifacts_dump and pipe_io_artifacts_error inside the same strict=False model_validate that already reverses graph_spec_dump, so the synchronous /execute response carries the run's I/O artifacts beside its execution graph. PipeOutputWire needed no edit: it subclasses PipeOutput, so both fields arrived by inheritance and were already in the committed OpenAPI artifact. docs/pipe-run.md documents the new pair and closes a pre-existing gap by documenting graph_spec and graph_assembly_error, which the response reference had never listed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KXNdmYQgikcZSza6YHrW6f
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
…r slot Round-1 review fixes on top of the pipelex 0.57.0 bump. Almost all of this is prose from the previous commit that turned out to be factually wrong. The null condition was the headline defect: the reference and the changelog both said `pipe_io_artifacts` is null when the run assembled no graph. The real gate is `describe_pipe_io and graph_spec is not None`, where `describe_pipe_io` is `is_generate_graph and graphs_inclusion.graphspec_json`, so a run with `graphspec_json = false` returns a non-null graph with null artifacts and a null error — a state the docs described as impossible. Both settings are named now, along with the fact that `runtime.tracing.is_enabled` does not gate assembly at all: it selects a trace-emission backend, and the in-memory tracer accumulates regardless. Also corrected: the artifacts cover the run library's *own* pipes, so a graph node contributed by a dependency package has no entry; the changelog's claim that a client which ignored `graph_spec` sees no difference, which is wrong because `PipeOutputWire` publishes `additionalProperties: false`; and the omission of the `codegen` engine_version stamp, which moves to 0.57.0 and invalidates any `codegen.lock` committed against 0.56.0. `docs/pipe-validate.md` still described `input_form` as the only supported `views` token and carried no field reference for `output_form`, which has been wrong since that view shipped in v0.22.0 — so the cross-reference added for the artifacts pointed at a page that did not document half of what it claimed. The changelog is restructured to the workspace rule it was breaking: sections in Added/Changed/Fixed order, one paragraph per bullet, no rationale essays. On the test: the artifacts assertion was already load-bearing, but the `pipe_io_artifacts_error` assertion only checked the field's own default, so dropping that key from the rehydration would have stayed green. The stub can now carry a failed-build message and a new test drives it end to end through the SPI round-trip; removing the key fails that test and only that test. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KXNdmYQgikcZSza6YHrW6f
Review pass — profile 4, round 1Ran four local reviewers, each in a clean context over One coverage caveat, stated honestly: gstack's internal Codex sub-pass timed out at 540s and never emitted its final report, so only its partial probes were merged. The directly-launched Codex reviewer completed, so the adversarial angle is covered. FixedAlmost all of it was prose from
Checks are green: Deferred, each with a traceThe one design question worth flagging: Owned by Owned by RejectedCosmetic line-length findings (127 chars, under ruff's 150 limit), a 🤖 Generated with Claude Code |
What
Moves this repo's
pipelexpin from0.56.0to0.57.0, and lands the consumer half of the change that release enables: the synchronous/v1/executeresponse now carries the run's I/O artifacts beside its execution graph.The pin — breaking
pipelex0.57.0 brings thePipeIOArtifactscarrier and its SPI transport. It is a breaking bump for callers of this server, in a way the OpenAPI diff does not show: 0.57.0 moves tomthds0.14.0, whoseMTHDS_STANDARD_VERSIONwas cut from1.0.0to2.0.0. Every cratePOST /v1/resolveemits, and every cratePOST /v1/build/runnernormalizes, is now stampedmthds_version: "2.0.0", so a consumer comparing that field against1.0.0has to move. Crate fingerprints are unaffected —mthds_versionis excluded from the hashed payload by design — so an artifact cached by fingerprint stays valid across this bump. The MTHDS Protocol version is unchanged at0.6.0, soGET /v1/versionmoves only itsruntime_version..pipelex/needed no migration:pipelex migrate --dry-runreports every configuration file on this machine already at the current schema.Because it is breaking, this is a cross-repo signal: the hosted plane pins
pipelexat several sites and consumespipelex-apiby git tag, sopipelex-serverhas to move too. Not changed from here.The rehydration
_pipe_output_from_run_outputnow mapspipe_io_artifacts_dumpandpipe_io_artifacts_errorinside the samestrict=Falsemodel_validatethat already reversesgraph_spec_dump./executereturns a fullmodel_dumpwith no field allowlist, so populating the field is all that was needed to put it on the wire.PipeOutputWireneeded no edit: it subclassesPipeOutput, so both fields arrived by inheritance — they are the OpenAPI lines the pin bump itself added.make openapi-checkpasses with no re-export.Tests
Two added to
tests/unit/test_execute_dispatch.py, driving the realserialize_completed_output→ rehydrate round-trip rather than a hand-built payload:test_pipe_io_artifacts_survive_strict_false_rehydration— all three members survive under the standard's own names, plus the null error slot. Verified non-vacuous: reverting the two rehydration lines makes it fail and leaves the rest passing.test_pipe_io_artifacts_absent_when_the_run_carried_none— a traced-off run sendsnull, not a missing key or a fabricated empty carrier. This one is a shape guard: it passes with or without the rehydration.Docs
docs/pipe-run.mddocuments the new pair, and closes a pre-existing gap by documentinggraph_spec/graph_assembly_error— which that response reference had never listed at all, so a caller could not learn from it that the graph was on the wire.Checks
make agent-check,make agent-testandmake openapi-checkall exit 0.Closes L-260907-c772e9
🤖 Generated with Claude Code
https://claude.ai/code/session_01KXNdmYQgikcZSza6YHrW6f
Summary by cubic
Pins
pipelexto 0.57.0 and carries a run's I/O artifacts on/v1/execute:pipe_output.pipe_io_artifactsandpipe_io_artifacts_errornow sit besidegraph_spec, null unless the run generated a graph withgraphs_inclusion.graphspec_jsonon.docs/pipe-run.mddocuments the new pair and finally listsgraph_spec, closing a reference gap;docs/pipe-validate.mdgains theoutput_formview it shipped without. New tests drive the real serialize → rehydrate round-trip, including a failed artifact build pinning the error slot. Closes L-260907-c772e9.Migration
pipelex0.57.0 pulls inmthds0.14.0, whoseMTHDS_STANDARD_VERSIONmoves from1.0.0to2.0.0, so every crate/v1/resolveemits and/v1/build/runnernormalizes is stampedmthds_version: "2.0.0"and consumers comparing against1.0.0must move. Fingerprints are unaffected, so cached artifacts stay valid./v1/codegennow stampsengine_version0.57.0, so acodegen.lockcommitted against0.56.0must be regenerated.PipeOutputWirepublishesadditionalProperties: false, so a strictly-validating client generated from the previous artifact rejects the added fields until regenerated..pipelex/config schema did not move; the hosted plane pinspipelexat several sites and consumespipelex-apiby git tag, so it must move in lockstep.Written for commit b20b02d. Summary will update on new commits.