Skip to content

Release v0.7.0 - #18

Merged
lchoquel merged 9 commits into
mainfrom
release/v0.7.0
Aug 28, 2026
Merged

Release v0.7.0#18
lchoquel merged 9 commits into
mainfrom
release/v0.7.0

Conversation

@lchoquel

@lchoquel lchoquel commented Aug 28, 2026

Copy link
Copy Markdown
Member

Release v0.7.0

Bumps version from 0.6.0 to 0.7.0. This release carries breaking changes, so the minor moves per the repo's pre-1.0 rule.

Closes L-260827-4cf826

Changelog

Added

  • Automation: New Claude skill (bump-mthds) and companion script (upstream_notes.py) to automate bumping the mthds dependency, regenerating locks, and adapting the codebase to upstream protocol changes.

Changed

  • Dependency: Pinned mthds to an exact version (mthds==0.11.1) instead of a floor (>=0.8.2), ensuring the SDK and its strict extra="forbid" protocol models are always tested against the exact upstream version and preventing runtime parse failures from uncoordinated resolutions. pipelex pins the same version, so the two co-install; the two pins must now move in step, because two exact pins on different versions do not resolve at all. (Breaking)
  • Typing: PipelexValidationReport.input_form and pipe_io_contracts are now strictly typed via the standard's own client models (mthds.protocol.input_form.InputForm and mthds.protocol.pipe_io_contracts.PipeIOContracts) rather than opaque dictionaries. As a result, reports with older contracts (e.g. boolean optional instead of presence, or missing multiplicity/item_count) no longer parse; the hosted API emits the reshaped contracts and there is intentionally no compatibility shim for older runners. The types are used, never re-exported — mthds.protocol stays the one import path for the vocabulary — and bundle_blueprint / graph_spec stay opaque, since nothing published declares them. (Breaking)
  • Parsing: List items in input forms now parse into nameless unions (e.g. DocumentItem instead of DocumentField), so code narrowing a list's item must target the item layer (the named layer silently fails isinstance checks). Input-form parsing is also tightened to reject contradictory required/presence combinations, gating on optional slots, and explicit nulls on wire slots (except default_value). (Breaking)
  • Strictness: The imported artifacts are closed shapes, but the report envelope around them stays extension-open — an unrelated field a future server adds to the report still parses and still rides model_extra. The two regimes nest rather than spread, and a test pins both halves.
  • Linting: Updated Ruff to include mthds models (ValidationReport, InvalidValidationReport, ValidationDiagnostic) in runtime-evaluated-base-classes, preventing Pydantic resolution errors from annotations mistakenly moved into TYPE_CHECKING blocks.
  • Documentation: Updated README.md and docs/architecture.md to reflect the move from opaque dictionaries to typed MTHDS imports, detailing strictness boundaries and narrowing strategies, and docs/ci-cd.md to record that third-party actions are allowlisted at the enterprise level by exact commit SHA.

Fixed

  • Serialization: Generating a serialization-mode JSON Schema from PipelexValidationReport now outputs the real input-form field shapes instead of an opaque object (resolved via the bump to mthds 0.11.1).
  • CI/CD: Fixed the GitHub Actions publish workflow by pinning sigstore/gh-action-sigstore-python to an enterprise-allowlisted SHA for v3.5.0 (790bc6befb9d733738f18d8f895854b453640ec9), resolving a deterministic UnsignedMetadataError caused by a Sigstore TUF trust-root rotation that broke the previous v3.0.0 tag.

Summary by cubic

Releases v0.7.0 with two breaking changes: mthds moves to an exact pin, and PipelexValidationReport's input-form and pipe-I/O fields are typed by the standard's own models instead of opaque dicts. Payloads from runners predating the contract reshape now fail to parse, so the minor rolls per the pre-1.0 rule.

Breaking changes

  • mthds is pinned at ==0.11.1 (was >=0.8.2); pipelex pins the same version, so the two pins must move in step or a co-install fails to resolve.
  • input_form is now InputForm | None and pipe_io_contracts is now PipeIOContracts, so input slots read presence and multiplicity as enums.
  • List items parse into nameless item models (DocumentItem, not DocumentField); narrow a list's item at the item layer, since the named layer silently fails isinstance.
  • Input-form parsing rejects contradictory required/presence, gating on optional slots, and explicit nulls on wire slots (except default_value).
  • The imported artifacts are closed shapes, but the report envelope stays extension-open; unrelated future report fields still parse and ride model_extra.

Also in this release

  • Serialization-mode JSON Schema now emits the real input-form field shapes instead of an opaque object.
  • Publish workflow pins sigstore/gh-action-sigstore-python to an allowlisted SHA (v3.5.0), fixing the TUF root-rotation UnsignedMetadataError from the v3.0.0 tag.
  • Ruff now treats the three mthds models as runtime-evaluated base classes, preventing pydantic resolution errors from annotations moved into TYPE_CHECKING.
  • Adds the bump-mthds Claude skill and upstream_notes.py script to automate future mthds bumps, and updates README.md, docs/architecture.md, and docs/ci-cd.md.

Closes L-260827-4cf826.

Written for commit 7940ab9. Summary will update on new commits.

Review in cubic

lchoquel and others added 9 commits August 27, 2026 02:06
The input-form descriptor and the pipe I/O contracts are MTHDS artifacts that
this SDK only carries. Until now it carried them opaquely, and the reason given
was ownership: a second copy of a vocabulary owned elsewhere would be free to
drift from the runtime that emits it. That reasoning was right and its
conclusion has expired. When the call was made no published Python package
declared either artifact, so "type it here" could only mean "copy it here";
since mthds 0.9.0 the standard's own client declares both, so typing them means
importing them. One declaration per language, and nothing here to drift from.

PipelexValidationReport.pipe_io_contracts is now PipeIOContracts and
.input_form is now InputForm | None, both imported from mthds.protocol. A field
descriptor narrows on its kind and an input slot's presence and multiplicity
read as enums instead of coming out of a bare mapping. The types are used and
never re-exported, so mthds.protocol stays the one import path for the
vocabulary; bundle_blueprint and graph_spec stay opaque, for the reason that
used to cover all four.

Strictness composes rather than spreads, which is the part worth getting right.
The imported artifacts are closed shapes, so a member the standard does not
define fails the parse; the report envelope around them stays extension-open, so
an unrelated field a future server adds still rides model_extra. A test pins
both halves, and the reference engine emission committed in mthds-python parses
through the narrowed fields with an unknown report field alongside it.

The one break: a report whose contracts predate the presence/multiplicity
reshape no longer parses, where it used to ride through untyped. No shim.

Ruff's runtime-evaluated-base-classes gains the mthds report and diagnostic
models, because the narrowings extend those rather than BaseModel directly and
ruff matches only the bases a class statement names — without it the linter
moves these annotations into a TYPE_CHECKING block, where pydantic cannot
resolve them when it builds the model.

No release: Stage 3 of the input-form program records warrants under Unreleased
and cuts versions together at the cascade.

Advances L-260826-c9b76b

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bumping `mthds` here is not an ordinary dependency bump in two directions at
once: half the surface this client depends on is underscore-prefixed upstream
(`_send`, `_url`, `_post_validate`), so a patch release can move it without
calling it a break, and what this package re-exports or narrows makes an
upstream rename a breaking change to `pipelex-sdk`'s own API.

The skill follows the shape of the one in `pipelex` — floor tracks latest, ask
PyPI rather than the sibling checkout, digest the release notes before editing,
`make li` rather than `make update`, stop before committing — and replaces the
engine-specific parts with what actually bites here: a step that prints the
inherited seam before anything else (which also finds suppressions the bump just
made unnecessary, since `reportUnnecessaryTypeIgnoreComment` is off), the ruff
`runtime-evaluated-base-classes` list that names `mthds` classes by dotted path
and fails at runtime in pydantic when one moves, mypy beside pyright, and the
gates `agent-check` leaves out. `MTHDS_STANDARD_VERSION`, drift-check and the
test-badge steps are dropped because this repo has none of them.

`scripts/upstream_notes.py` is carried over verbatim; its path math already
resolves the workspace root from this repo.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J7i3k1ywvgYMEUhnmJzgRH
mthds 0.10.0 split the input-form field union by whether a node names
itself: a top-level field stays the named union (TextField,
DocumentField, ...), each now requiring a name, while a ListField.item
parses into the new nameless one (TextItem, DocumentItem, ...), which
refuses a name.

The contract test narrowed a list's item to DocumentField and went red.
It now narrows to DocumentItem and also asserts the negative, because
DocumentField subclasses DocumentItem: narrowing to the item layer alone
would still admit a named node, so only the pair pins the split. The
wire fixture was already nameless and needed no change.

The same stale guidance was in two docs, which matters more than the red
test did — a consumer following it writes an isinstance that still
imports, still typechecks, and silently takes the false branch.

The floor moves to mthds>=0.11.0 so the version this SDK tests against
is the version it demands. That span also tightens the input form's own
parse (required-vs-presence coherence, no explicit null on wire slots
except default_value, gating rejected on an optional slot); the existing
fixtures were already conformant.

Advances L-260827-a56c9c

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J7i3k1ywvgYMEUhnmJzgRH
…-protocol

Type the input-form descriptor and the pipe I/O contracts by importing mthds.protocol
The publish workflow signed release artifacts with
sigstore/gh-action-sigstore-python@v3.0.0, whose bundled sigstore-python
predates the Sigstore TUF trust-root rotation. That step now fails
deterministically with "root was signed by 0/3 keys", which would fail
the github-release job at the next release while PyPI publication — a
separate job — still succeeded, leaving a published package with no
GitHub release and no tag. That is what happened to mthds-python v0.9.0.

Pin the SHA 790bc6befb9d733738f18d8f895854b453640ec9 (v3.5.0), the same
one pipelex and mthds-python carry and the one the enterprise Actions
allowlist already permits. Record that allowlist constraint in
docs/ci-cd.md so the next version move does not stall on it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J7i3k1ywvgYMEUhnmJzgRH
ci-cd: pin the Sigstore action past the TUF root rotation
Moves the mthds requirement to an exact pin at 0.11.1, matching the
version pipelex v0.54.0 names, and rewrites the bump-mthds skill to
describe the exact-pin policy the repo actually follows.

Closes L-260827-4cf826

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NNwzjztLNo2Y95gP4RuawG
@greptile-apps

greptile-apps Bot commented Aug 28, 2026

Copy link
Copy Markdown

Confidence Score: 5/5

The PR appears safe to merge, with no concrete changed-code failure identified.

The version, lockfile, validation model changes, tests, documentation, and publishing workflow remain aligned, and no supported runtime or build path was shown to break.

Reviews (1): Last reviewed commit: "Release v0.7.0" | Re-trigger Greptile

@lchoquel

Copy link
Copy Markdown
Member Author

@codex

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit: 7940ab9a14

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@lchoquel
lchoquel merged commit f40c347 into main Aug 28, 2026
21 checks passed
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 28, 2026
@lchoquel
lchoquel deleted the release/v0.7.0 branch August 28, 2026 15:34
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