Skip to content

Pin pipelex 0.57.0 and carry a run's I/O artifacts on /execute - #72

Merged
lchoquel merged 2 commits into
devfrom
chore/BumpPipelex
Sep 8, 2026
Merged

Pin pipelex 0.57.0 and carry a run's I/O artifacts on /execute#72
lchoquel merged 2 commits into
devfrom
chore/BumpPipelex

Conversation

@lchoquel

@lchoquel lchoquel commented Sep 8, 2026

Copy link
Copy Markdown
Member

What

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 synchronous /v1/execute response now carries the run's I/O artifacts beside its execution graph.

The pin — breaking

pipelex 0.57.0 brings the PipeIOArtifacts carrier 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 to mthds 0.14.0, whose MTHDS_STANDARD_VERSION was cut from 1.0.0 to 2.0.0. Every crate POST /v1/resolve emits, and every crate POST /v1/build/runner normalizes, is now stamped mthds_version: "2.0.0", so a consumer comparing that field against 1.0.0 has to move. Crate fingerprints are unaffectedmthds_version is excluded from the hashed payload by design — so an artifact cached by fingerprint stays valid across this bump. The MTHDS Protocol version is unchanged at 0.6.0, so GET /v1/version moves only its runtime_version.

.pipelex/ needed no migration: pipelex migrate --dry-run reports 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 pipelex at several sites and consumes pipelex-api by git tag, so pipelex-server has to move too. Not changed from here.

The rehydration

_pipe_output_from_run_output now maps pipe_io_artifacts_dump and pipe_io_artifacts_error inside the same strict=False model_validate that already reverses graph_spec_dump. /execute returns a full model_dump with no field allowlist, so populating the field is all that was needed to put it on the wire.

PipeOutputWire needed no edit: it subclasses PipeOutput, so both fields arrived by inheritance — they are the OpenAPI lines the pin bump itself added. make openapi-check passes with no re-export.

Tests

Two added to tests/unit/test_execute_dispatch.py, driving the real serialize_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 sends null, 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.md documents the new pair, and closes a pre-existing gap by documenting graph_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-test and make openapi-check all exit 0.

Closes L-260907-c772e9

🤖 Generated with Claude Code

https://claude.ai/code/session_01KXNdmYQgikcZSza6YHrW6f


Summary by cubic

Pins pipelex to 0.57.0 and carries a run's I/O artifacts on /v1/execute: pipe_output.pipe_io_artifacts and pipe_io_artifacts_error now sit beside graph_spec, null unless the run generated a graph with graphs_inclusion.graphspec_json on. docs/pipe-run.md documents the new pair and finally lists graph_spec, closing a reference gap; docs/pipe-validate.md gains the output_form view 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

  • pipelex 0.57.0 pulls in mthds 0.14.0, whose MTHDS_STANDARD_VERSION moves from 1.0.0 to 2.0.0, so every crate /v1/resolve emits and /v1/build/runner normalizes is stamped mthds_version: "2.0.0" and consumers comparing against 1.0.0 must move. Fingerprints are unaffected, so cached artifacts stay valid.
  • /v1/codegen now stamps engine_version 0.57.0, so a codegen.lock committed against 0.56.0 must be regenerated.
  • PipeOutputWire publishes additionalProperties: 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 pins pipelex at several sites and consumes pipelex-api by git tag, so it must move in lockstep.

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

Review in cubic

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

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
@lchoquel

lchoquel commented Sep 8, 2026

Copy link
Copy Markdown
Member Author

Review pass — profile 4, round 1

Ran four local reviewers, each in a clean context over d2a8abe: cubic, Codex (adversarial), the official code-review skill at high, and gstack-review. Fixes are in b20b02d.

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.

Fixed

Almost all of it was prose from d2a8abe that turned out to be factually wrong, plus one test that overclaimed.

What Evidence
The documented null condition was wrong — all four reviewers found this independently. The docs 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_generate_graph and graphs_inclusion.graphspec_json. With graphspec_json = false you get a non-null graph, null artifacts and a null error — a state the docs called impossible. pipe_run.py:93, pipeline_run_setup.py:284
runtime.tracing.is_enabled does not gate assembly at all — it selects a trace-emission backend; the in-memory tracer accumulates regardless. Documented, because it is the natural wrong guess. pipeline_run_setup.py:256-284
The scope claim overstated — the artifacts cover the run library's own pipes, so a graph node contributed by a dependency package has no entry. interpreter_hub.py:346, pipe_run.py:129-132
The new cross-reference pointed at a stale pagedocs/pipe-validate.md had zero occurrences of output_form and still called input_form the only supported views token, wrong since v0.22.0. Both fixed. validate.py:56
A changelog claim was wrong — "a client that already ignored graph_spec sees no difference" is false: PipeOutputWire publishes additionalProperties: false, so a strictly-validating client generated from the previous artifact rejects the added fields. committed artifact
Undisclosed churn/v1/codegen stamps engine_version from the pipelex version, so every artifact header and every codegen.lock moves to 0.57.0. Now in the changelog. codegen.py:149,157
The changelog broke this workspace's own rule — section order and one-paragraph-per-bullet. Restructured. .claude/rules/changelog.md
A test overclaimed — 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 now carries a failed-build message and a new test drives it through the SPI round-trip. Verified by mutation: removing the key fails that test and only that test. test_execute_dispatch.py

Checks are green: agent-check, agent-test, openapi-check. The OpenAPI artifact needed no re-export — these fixes are docs, changelog and tests only.

Deferred, each with a trace

The one design question worth flagging: /execute ships the full library's artifacts unconditionally, where /validate gates the same two behind opt-in views — measured ~8x amplification against submitted source, scaling with library size rather than with what the run touched. Filed rather than reversed here, because shipping the artifacts beside the graph is what the item asked for and what upstream ratified; the proportionate fix is a per-request inclusion flag, not a mid-branch reversal.

Owned by pipelex-api: the per-request inclusion flag; three assembly-error strings riding a 200 body outside ERROR_DISCLOSURE; working_memory_raw published but never rehydrated, so structurally always null; GET /v1/version unable to express the standard-version cut; and the tautological mthds_version assertion that let this bump's breaking wire change pass green.

Owned by pipelex: a Field(exclude=True) field still appearing in the derived input form with its default value — confirmed directly, and the exposure widened by this PR; the crate fingerprint excluding mthds_version, so caches cannot tell a 1.0.0 crate from a 2.0.0 one; unbounded form expansion and deep-descriptor serialization failure; and output overrides reportedly absent from the artifacts. The last two are recorded as unverified reviewer claims, flagged as such in the items.

Rejected

Cosmetic line-length findings (127 chars, under ruff's 150 limit), a strict=True docstring nit that code-review withdrew itself, and one claim I checked and could not confirm: that the feature is inert by default because .pipelex/pipelex.toml sets is_enabled = false. That setting is [runtime.tracing], not the graph gate — is_generate_graph and graphspec_json are both true in the packaged config, so the feature is on by default. Had I taken it at face value it would have gone into the docs as a false statement.

🤖 Generated with Claude Code

https://claude.ai/code/session_01KXNdmYQgikcZSza6YHrW6f

@lchoquel
lchoquel merged commit 85a9674 into dev Sep 8, 2026
15 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Sep 8, 2026
@lchoquel
lchoquel deleted the chore/BumpPipelex branch September 8, 2026 08:50
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