Release v0.7.0 - #18
Merged
Merged
Conversation
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
Confidence Score: 5/5The 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 |
Member
Author
|
Codex Review: Didn't find any major issues. Nice work! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
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.7.0
Bumps version from
0.6.0to0.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
bump-mthds) and companion script (upstream_notes.py) to automate bumping themthdsdependency, regenerating locks, and adapting the codebase to upstream protocol changes.Changed
mthdsto an exact version (mthds==0.11.1) instead of a floor (>=0.8.2), ensuring the SDK and its strictextra="forbid"protocol models are always tested against the exact upstream version and preventing runtime parse failures from uncoordinated resolutions.pipelexpins 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)PipelexValidationReport.input_formandpipe_io_contractsare now strictly typed via the standard's own client models (mthds.protocol.input_form.InputFormandmthds.protocol.pipe_io_contracts.PipeIOContracts) rather than opaque dictionaries. As a result, reports with older contracts (e.g. booleanoptionalinstead ofpresence, or missingmultiplicity/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.protocolstays the one import path for the vocabulary — andbundle_blueprint/graph_specstay opaque, since nothing published declares them. (Breaking)DocumentIteminstead ofDocumentField), so code narrowing a list's item must target the item layer (the named layer silently failsisinstancechecks). Input-form parsing is also tightened to reject contradictoryrequired/presencecombinations,gatingon optional slots, and explicitnulls on wire slots (exceptdefault_value). (Breaking)model_extra. The two regimes nest rather than spread, and a test pins both halves.mthdsmodels (ValidationReport,InvalidValidationReport,ValidationDiagnostic) inruntime-evaluated-base-classes, preventing Pydantic resolution errors from annotations mistakenly moved intoTYPE_CHECKINGblocks.README.mdanddocs/architecture.mdto reflect the move from opaque dictionaries to typed MTHDS imports, detailing strictness boundaries and narrowing strategies, anddocs/ci-cd.mdto record that third-party actions are allowlisted at the enterprise level by exact commit SHA.Fixed
PipelexValidationReportnow outputs the real input-form field shapes instead of an opaque object (resolved via the bump tomthds0.11.1).sigstore/gh-action-sigstore-pythonto an enterprise-allowlisted SHA for v3.5.0 (790bc6befb9d733738f18d8f895854b453640ec9), resolving a deterministicUnsignedMetadataErrorcaused by a Sigstore TUF trust-root rotation that broke the previousv3.0.0tag.Summary by cubic
Releases v0.7.0 with two breaking changes:
mthdsmoves to an exact pin, andPipelexValidationReport'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
mthdsis pinned at==0.11.1(was>=0.8.2);pipelexpins the same version, so the two pins must move in step or a co-install fails to resolve.input_formis nowInputForm | Noneandpipe_io_contractsis nowPipeIOContracts, so input slots readpresenceandmultiplicityas enums.DocumentItem, notDocumentField); narrow a list's item at the item layer, since the named layer silently failsisinstance.required/presence,gatingon optional slots, and explicitnulls on wire slots (exceptdefault_value).model_extra.Also in this release
sigstore/gh-action-sigstore-pythonto an allowlisted SHA (v3.5.0), fixing the TUF root-rotationUnsignedMetadataErrorfrom thev3.0.0tag.mthdsmodels as runtime-evaluated base classes, preventing pydantic resolution errors from annotations moved intoTYPE_CHECKING.bump-mthdsClaude skill andupstream_notes.pyscript to automate futuremthdsbumps, and updatesREADME.md,docs/architecture.md, anddocs/ci-cd.md.Closes L-260827-4cf826.
Written for commit 7940ab9. Summary will update on new commits.