Skip to content

Release v0.17.0 - #152

Merged
lchoquel merged 10 commits into
mainfrom
release/v0.17.0
Oct 25, 2026
Merged

lchoquel merged 10 commits into
mainfrom
release/v0.17.0

Conversation

@lchoquel

Copy link
Copy Markdown
Member

Release v0.17.0

Bumps version from 0.16.0 to 0.17.0. Promotes dev → main.

Changelog

Added

  • pipelex-inputs and pipelex-run look among your team's files first: before asking you for a file a method input takes, and when you name one that is not on disk, such as "the invoice uploaded this morning", the skills look among your organization's files with the Pipelex tools' mthds_list_files and pass the file you settle on by its pipelex-storage:// address, so nothing is uploaded again. With a version of the tools older than that listing, they ask for the file as before and name the npx -y @pipelex/mcp@latest refresh.
  • Synthetic files upload as the method's test files: when pipelex-inputs uploads the files pipelex-synthetic-inputs made, it passes kind: "test" to mthds_prepare_inputs, so your organization's files list them as test files of the saved method, named by its bare catalog id or by the bundle directory's link, and a preparation that also uploads your own files does so in a second call, which keeps yours ordinary uploads. A published address, a version or draft id, a directory linked to no saved method, a role that may not record test files and a version of the tools older than test files all upload them as ordinary files, and the skill says which.

Changed

  • pipelex-integrate sends the method's tree (Breaking): the call site the skill writes runs the method with its whole bundle directory as the method's tree, directory: BUNDLE_DIR on @pipelex/sdk 0.48.0 and tree=BUNDLE_DIR on pipelex-sdk 0.48.0, the floors step 8 now installs, so the template files a bundle's PipeDocGen steps name travel with every run in either language, and its docstring names prepareInputs with the same tree. A refresh raises an older pin and rewrites a module that still sends mthds_contents or resources; a python-structures project whose pipelex, once step 8 has run, still pins a pipelex-sdk from before the tree keeps the older module, and over a bundle naming template files the skill stops there as before. The skill judges that by the pipelex-sdk the project will run on after step 8, syncing the environment first when the version cannot be read, and takes the older module and the stop when it still cannot.
  • pipelex-integrate records and checks the tree a run sends (Breaking): the skill passes a local bundle to the workshop as its folder and records the files it sent, and both drift gates list the bundle with the MTHDS standard's own lister, the one the SDK sends it with, so a file a .gitignore inside the bundle or the manifest's exclude keeps out of the run is out of the types and the gate too, and a .gitignore edit that changes which bundle or template files the tree carries makes the gate report stale-source. A METHODS.toml above the bundle is now a stop at step 1, before anything is generated, and the gates name its cure, moving the bundle out from under it or integrating the package's own directory, instead of sending you to a refresh that could never clear it; a bundle the workshop cannot read as a folder is a stop as well, since no other submission is the tree the call site sends. A refresh re-copies the new gate; the TypeScript gate finds that mthds beside @pipelex/sdk in node_modules or, under Yarn Plug'n'Play, through pnpapi, and gives no verdict when it is missing or older than the floor's, and the Python gate when pipelex-sdk is below the floor.
  • pipelex-inputs uploads your files where they lie, and a method's folder keeps only inputs.json (Breaking): the skill no longer copies your files into inputs/ beside the method or writes inputs.prepared.json there; it uploads each file from where you keep it, an Office file as the PDF it exports into a temporary directory, and writes the pipelex-storage:// address it gets back into inputs.json, which pipelex-run then runs as it stands, sending a value that still names a local file back to pipelex-inputs to be uploaded first. pipelex-synthetic-inputs makes its files in a fresh temporary directory by default, on its own too, and reports their path and their name among your organization's files, so anything that read the copies under inputs/ or a method folder's inputs.prepared.json now reads the addresses in inputs.json, which resolve only inside the organization that uploaded the files. A pipelex-lab case is the exception and keeps its copies under cases/<case>/inputs/ with its prepared file beside them, so that it runs from any clone, and folders an earlier release prepared are not migrated.
  • The validation hook sends the method's tree: the check.mjs bundle every target runs on a .mthds edit now sends the edited file's method to validation as the tree a run would send, rooted at the nearest METHODS.toml, every file the MTHDS membership rule keeps under its root rather than only its .mthds files and the templates its steps name. Names starting with a dot, such as .env, a run's inputs file, and what a .gitignore inside the tree or the manifest's exclude keeps out stay on your machine, and so does a file the hook's secret screen finds, named like a key or credentials file or holding a private key or a provider's key, which the verdict's note names without quoting it; a bundle or manifest that looks like a secret sends nothing, under a note. A .gitignore above the tree, such as a repository's root one, still keeps nothing out, and the screen recognizes only well-known shapes, so keep keys and credentials out of a method's directory, or list them in a .gitignore inside it. A tree holding a symbolic link, or past the hook's size caps, still passes the validation silently.
  • The validation hook names each problem item of a refused method (Breaking): when the server sends no Markdown with an invalid verdict, the block reason the check.mjs bundle builds now gives every problem item of the verdict's errors[] a line of its own, with its code, its sentence and where it happened, such as its pipe and its file, and the item's suggested fix beneath it, where against a server speaking the MTHDS problem document it named no item at all. A server still answering the older shape is no longer read: the bundle ignores its validation_errors[], so when such a server also ignores the render request, the block reason holds the verdict's message alone and names none of its faults. It is rebuilt on @pipelex/sdk 0.54.1 and @pipelex/tools-wasm 0.6.1, and its lint, its format and the request its validate stage sends are unchanged, except that its User-Agent names 0.54.1.
  • The skills read the Pipelex tools' errors as problem documents (Breaking): every skill now reads a failed tool call by its problem's code, domain, retry and next_step, a verdict's faults as errors[] items, its warnings as problem items such as pipelex.docgen.template_warning, and a failed run by its run_error, which is what the workshop sends from the release that moves its errors to the MTHDS problem document, instead of the class, retryable, hint and kind of an error, validation_errors[] outside the catalog's save and publish, and a run's failure_message, which it no longer sends. So a missing or refused key, a role, the organization's credit or an unreachable API stops a skill with the tool's next step relayed verbatim, the catalog tells an unknown id from a link naming another method, a version suffix and an empty stored source by their codes, pipelex-inputs reads a preparation failure by its code, and a failed run keeps the support line the tool's summary ends with; use these skills with a workshop that sends problem documents.

Fixed

  • Your test documents no longer travel as files of the method: the documents pipelex-inputs copied and pipelex-synthetic-inputs rendered into inputs/ beside a bundle, and the inputs.prepared.json written there, were sent with every validation, run and catalog save of the method and stored with it, since the method's tree keeps out only inputs.json and reads no .gitignore above the method's folder. The skills no longer write either beside a method, and before its first call on a bundle an earlier release prepared, pipelex-run adds * to the .gitignore of each inputs/ beside an inputs.json and /inputs.prepared.json to the .gitignore beside that file, each only where the line is missing and saying so, so a second run changes nothing.
  • pipelex-inputs anchors the .gitignore entries it writes: an inputs.json or inputs.prepared.json entry written into the bundle directory's own .gitignore was a bare name, which git matched at every depth below, so an inputs.json you commit elsewhere in the folder was silently ignored from then on. The entries now start with /, naming only the file beside the bundle.
  • The development environment is built on Python 3.13: make install built .venv on the newest Python on the machine, so on Python 3.15 pydantic-core was compiled from source and failed to load, and every integrate gate test failed. The repository now pins 3.13 in .python-version, the version CI runs, the next make install rebuilds an environment made on another Python, PYTHON_VERSION=<version> make install tries another one, and make check fails when the pin, the floors in pyproject.toml and the workflows disagree.

🤖 Generated with Claude Code

https://claude.ai/code/session_01ChCUgUaFZK7FTEAc8uPAVL

lchoquel and others added 10 commits October 20, 2026 00:47
The release skill still described the Mistral Vibe build from before the
native plugin, as a tree naming no version with no manifest to stamp.
Since the native plugin, `make build` stamps `pipelex-vibe/plugin.json`
with the target's version, which the 0.16.0 release restamped, so the
skill now lists it among the generated manifests, the release commit's
files and the landing's readings.

Closes L-261019-2584f7

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01AuJxXWGBBhCH6aLdcCduJx


<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Updates the release skill to reflect the Mistral Vibe native plugin,
whose `make build` now stamps `pipelex-vibe/plugin.json` with the
target's version. The skill previously described the Vibe tree as
carrying no version and no manifest; it now lists the Vibe manifest
among the generated manifests, the release commit's files, and the
landing's readings, matching what the 0.16.0 release already produced.

<sup>Written for commit bf0411e.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/Pipelex/pipelex-plugins/pull/143?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="View guided diff"
src="https://www.cubic.dev/buttons/review-in-cubic-light.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->

Co-authored-by: Claude Opus 5.5 <[email protected]>
pipelex-integrate's call sites and their `prepareInputs` pointers now
send the method's tree as the MTHDS `files` map, in TypeScript and in
Python, and the skill stops when a `METHODS.toml` lies above the bundle.
The validation hook is re-vendored onto @pipelex/sdk 0.48.1, which sends
the tree and keeps files that look like keys or credentials on the
machine. The hook docs, the README and the hook tests say exactly what
travels and what stays home.

Closes L-261017-9bdb38
Closes L-260913-6cac17
Leaves L-261022-e15b5d

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
`pipelex-integrate` call sites now send the method's whole bundle
directory as the method's tree (`directory: BUNDLE_DIR` in TypeScript,
`tree=BUNDLE_DIR` in Python) instead of a `.mthds` files list plus a
template `resources` map, so files a bundle's `PipeDocGen` steps name
travel in both languages. The validation hook is re-vendored onto
`@pipelex/sdk` 0.48.1, which sends the same tree and keeps key- or
credential-like files on the machine. The skill stops when a
`METHODS.toml` lies above the bundle.

**Migration**

- Both SDK floors move to 0.48.0; `mthds_contents`, `resources`, and the
call site's template-file helpers are gone.
- A refresh raises the pin and rewrites a module that still sends the
retired fields.
- Python projects on an older `pipelex-sdk` keep the old module, and the
skill stops over a templated bundle there.

**Hook and drift gates**

- The hook's validate stage sends the edited method as the tree after a
version handshake, and files that look like keys or credentials stay
home under a non-blocking note.
- Both gates list the tree with the MTHDS standard's lister; a
`METHODS.toml` above `bundle_dir` roots the tree there, reported with
cures instead of a refresh hint.
- The TypeScript gate finds that lister beside `@pipelex/sdk` and, under
Yarn Plug'n'Play, resolves it through `pnpapi`.
- Hook docs, the README, and the tests pin exactly what travels and what
stays home.

<sup>Written for commit 54fe264.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/Pipelex/pipelex-plugins/pull/144?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="View guided diff"
src="https://www.cubic.dev/buttons/review-in-cubic-light.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
The run and inputs skills now look among the team's files with the
workshop's `mthds_list_files` before asking for a file, and pass a
chosen file by its storage address instead of downloading and uploading
it again. When the factory makes synthetic test files for a saved
method, the inputs skill uploads them as that method's test files,
falling back to ordinary uploads when the folder is not linked to a
saved method or the workshop is older. A shared reference holds the
lookup rules for both skills, including refusing an Office file for an
input that reads only PDFs and pictures.

Closes L-261022-e88cbf
Advances L-261021-a262bf
Leaves L-261023-4fea78

🤖 Generated with [Claude Code](https://claude.com/claude-code)


<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
`pipelex-inputs` and `pipelex-run` now look among the team's files
before asking the user for one, passing the chosen file by its
`pipelex-storage://` address so nothing is re-uploaded.

- Adds a shared `team-files.md` reference that both skills read on
`mthds_list_files`, covering the organization's uploads, a method's test
files, and run outputs.
- Uploads synthetic files with `kind: "test"` so they become the saved
method's test files; a Mixed preparation takes two calls, and workshops
that don't acknowledge the kind fall back to asking for files as before.
- Refuses an Office file for a `Document` input that reads only PDFs and
pictures, and points the by-id lookup at the `.pipelex/method.json` link
location.

<sup>Written for commit ea2c1fa.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/Pipelex/pipelex-plugins/pull/145?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="View guided diff"
src="https://www.cubic.dev/buttons/review-in-cubic-light.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
The test documents `/pipelex-inputs` and `/pipelex-synthetic-inputs`
leave beside a bundle now mark themselves out of the method's tree:
`inputs/` gets a `.gitignore` holding `*`, and `inputs.prepared.json` an
anchored line in the bundle's own `.gitignore`, which the tree lister
reads where it never reads one above the tree root. Since every surface
sends a method's whole tree, these files were uploaded on every check
and run and stored by every catalog save; `/pipelex-run` now marks an
older bundle's `inputs/` at its next run, a lab case's committed
synthetic files stay in git, and the guard's remaining ignore entries
are anchored with a leading slash.

Closes L-261022-b695eb
Closes L-260924-9fd751

🤖 Generated with [Claude Code](https://claude.com/claude-code)


<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Keeps the files `pipelex-inputs` and `pipelex-synthetic-inputs` leave
beside a bundle out of the method's tree, so they stop being uploaded on
every check and run and stored by every catalog save.

**Behavior**
- `pipelex-inputs` writes a `.gitignore` holding `*` into `inputs/` and
an anchored `/inputs.prepared.json` line before its first call.
- `pipelex-run`'s pre-validate sweep marks bundles prepared before this
change at their next run, adding only missing lines.
- `pipelex-synthetic-inputs` marks the default `inputs/` itself; lab
synthetic cases stay unmarked and committed in git, while a user's own
case keeps the directory guard.
- The skills ask before marking an `inputs/` that sits beside neither a
`.mthds` file nor `inputs.json`, and the guard's remaining ignore
entries are anchored with a leading slash.

<sup>Written for commit f408115.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/Pipelex/pipelex-plugins/pull/146?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="View guided diff"
src="https://www.cubic.dev/buttons/review-in-cubic-light.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
The input skills stop copying test documents into a method's folder: a
user's file is uploaded to Files where it lies and named in
`inputs.json` by its `pipelex-storage://` address, synthetic files are
made in a temporary directory and uploaded as test files, and a method's
folder gets no `inputs.prepared.json`. A method's copies can therefore
never ship in a built wheel or travel with its tree. A lab case,
`lab/<method>/cases/<case>/`, is the one exception: it keeps its
committed copies and its prepared file, recognised by its location as
well as by the lab's request.

Closes L-260924-208499

🤖 Generated with [Claude Code](https://claude.com/claude-code)


<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Stops the input skills from copying documents and test files into a
method's folder, so those files can no longer ship inside a built wheel
or travel with a method's tree.

- `pipelex-inputs` uploads a user's file from where it lies and names it
in `inputs.json` by its `pipelex-storage://` address; it no longer
copies files into a method's folder or writes `inputs.prepared.json`
beside the bundle.
- `pipelex-synthetic-inputs` makes its files in a temporary directory
and uploads them as test files.
- A `pipelex-lab` case (`lab/<method>/cases/<case>/`) is the exception:
it keeps its committed copies and prepared file, recognized by its
location as well as by the lab's request.

**Migration**
- Folders an earlier release left behind are not migrated; `pipelex-run`
still sweeps and marks them.

<sup>Written for commit a6c6288.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/Pipelex/pipelex-plugins/pull/147?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="View guided diff"
src="https://www.cubic.dev/buttons/review-in-cubic-light.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
The environment was built on whatever Python was newest on the machine,
so a new worktree landed on 3.15 and failed to load `pydantic-core`. The
repo now pins 3.13 in `.python-version`, the Makefile reads and exports
it as `UV_PYTHON`, and the local MCP launcher keeps that export out of
the session it starts.

Closes L-261023-b7d250
Advances L-261023-8192c0

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01TuqArJByf4EdN7khSDRiPe


<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Pins the development environment to Python 3.13, which previously was
whichever Python was newest on the machine. A new worktree could land on
3.15, where `pydantic-core` has no published wheel and the one uv
compiled from source failed to load, breaking every integrate gate test.

- Commits `.python-version` and has the Makefile export it as
`UV_PYTHON`, so every uv command uses the pinned version;
`PYTHON_VERSION=<version> make install` tries another interpreter.
- CI workflows now read `.python-version` via `python-version-file`, and
the recipes workflow re-runs when it changes.
- `make check` fails when the pin disagrees with a floor in
`pyproject.toml` or a workflow names a Python of its own.
- The local MCP launcher keeps the Makefile's `UV_PYTHON` export and a
command-line `PYTHON_VERSION` out of the session it starts, so the
project the agent works in keeps its own pin.

Closes L-261023-b7d250

<sup>Written for commit 6ff4297.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/Pipelex/pipelex-plugins/pull/148?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="View guided diff"
src="https://www.cubic.dev/buttons/review-in-cubic-light.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
The validation hook now reads a refused method's verdict as the hosted
problem document carries it, naming each problem item with its location
and suggested fix in the block reason. The bundle is vendored from the
SDK branch for now and is re-vendored from the released pipelex-sdk
before this merges.

Closes L-261023-f21e88

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01Uzyvwk5dEQLz1LibAnaoNk


<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Re-vendors the validation hook from `@pipelex/sdk` 0.50.0 so it reads an
invalid verdict's `errors[]` as MTHDS problem items instead of the older
`validation_errors[]`. A block reason now names each problem item by its
code, sentence, pipe, and file, with its suggested fix beneath it,
without relying on the server's Markdown.

**Bug Fixes**
- Entries that are not objects or lack a string code or sentence are
skipped; non-conforming locations and suggested fixes are left out of
the reason.

**Migration**
- A server still answering the old verdict shape (`validation_errors[]`)
is no longer read, so its problems are no longer reported.

<sup>Written for commit f2278c6.
Summary will update on new commits.</sup>

<a
href="https://cubic.dev/pr/Pipelex/pipelex-plugins/pull/149?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="View guided diff"
src="https://www.cubic.dev/buttons/review-in-cubic-light.svg"></picture></a>

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
## TL;DR

- Every Pipelex skill reads a failed tool call by its problem document
(`code`, `domain`, `retry`, `next_step`), a verdict's faults as
`errors[]`, and a failed run by its `run_error`.
- The workshop moves its errors to the MTHDS problem document and no
longer sends `class`, `retryable`, `hint`, `kind`, `validation_errors[]`
outside the catalog's save and publish, or `failure_message`.
- ⚠️ Breaking: these skills need a workshop that sends problem
documents; with an older one they misread every error.

## Behaviour changes

- A missing or refused key, a role, the organization's credit or an
unreachable API is recognised by the error's `class` → by its problem's
`domain` and `code`, with the tool's `next_step` relayed verbatim.
- The catalog tells an unknown id, a link naming another method, a
version suffix and an empty stored source apart by their codes instead
of by message text.
- `pipelex-inputs` reads a preparation failure by its code; a refusal of
`kind` (a role that may not record test files, or a saved method the
platform no longer holds) falls back to an ordinary upload instead of
stopping.
- A failed run's report keeps the support line the tool's summary ends
with.
- Preparing by a published address no longer names a `config` error for
a package shipping in-process Python: that refusal never reaches
preparation and meets the run instead.

## Changes

**Skills**
- The shared partials `mcp-requirements`, `credentials`,
`validate-warnings` and `saved-copy-notice`, and every skill template
under `templates/skills/`, rewritten for the problem document.
- `pipelex-inputs`'s stop table, `references/prepare-errors.md`,
`references/synthetic.md` and `references/published-address.md`.
- The generated `pipelex/`, `pipelex-codex/` and `pipelex-vibe/` copies,
rebuilt.

**Tests**
- The skill assertions in `tests/unit/test_gen_skill_docs.py` and the
per-skill tests, moved to the new fields.
- `tests/unit/test_skill_error_fields.py` now refuses any shipped skill
file that names a retired workshop field.

## How it was verified

- `make build`, `make check` and `make agent-test`: passed.

## Documentation

- `CHANGELOG.md`, Unreleased: the breaking entry for the problem
document.
- `docs/decisions.md`: why the `kind` fallback sits in `pipelex-inputs`
rather than in the shared stops.

## Not done

- A stray `.DS_Store` under a target's `skills/` fails the error-field
test locally: L-261024-e68a68.
- The test-files changelog entry omits the erased saved method:
L-261024-8ecba8.

Closes L-261017-1b4ac0
Closes L-260923-4ce273

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01ChCUgUaFZK7FTEAc8uPAVL

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
## TL;DR

- The validation hook bundle `check.mjs` is rebuilt on `@pipelex/sdk`
0.54.1 with `@pipelex/tools-wasm` 0.6.1, so its validate stage's
`User-Agent` now names 0.54.1; its lint, its format and the request it
sends are otherwise unchanged.
- The release gate `make check-hook-fresh` refused the next release
because the vendored bundle still embedded `@pipelex/sdk` 0.53.0 and
`@pipelex/tools-wasm` 0.6.0, behind npm's latest engine and behind a
rebuild at pipelex-sdk `dev`.

## Behaviour changes

- The `User-Agent` of the hook's validate stage names `pipelex-sdk-js`
0.53.0 → 0.54.1.

## Changes

**Hook bundle**
- `templates/hooks/assets/check.mjs` re-vendored with `make vendor-hook`
from pipelex-sdk `dev` at `bc448bf`, which pins `@pipelex/tools-wasm`
0.6.1, and propagated by `make build` to `pipelex/hooks/check.mjs`,
`pipelex-codex/hooks/check.mjs` and `pipelex-vibe/hooks/check.mjs`.
- Provenance line: `@pipelex/sdk 0.53.0 (5dfe747) + @pipelex/tools-wasm
0.6.0 (npm)` → `@pipelex/sdk 0.54.1 (bc448bf) + @pipelex/tools-wasm
0.6.1 (npm)`.
- Below the banner the rebuild differs in three places. The inlined
engine's JavaScript loader is re-minified and loads the wasm module
through the new `rust-plugin` 3 entry point; the engine moved from 0.6.0
to 0.6.1 by dependency refreshes only, with its embedded MTHDS schema,
lint and formatter unchanged. `SDK_VERSION` reads 0.54.1.
`PipelexApiClient.getFile` gains the SDK's `withUseCreator`
normalization, which sets a file use's absent `created_by` to `null`;
the hook calls only `validate`, and the method is in the bundle only
because esbuild keeps a class's methods, so that change does not reach
the hook's users and the changelog does not mention it.

**Changelog**
- The existing `[Unreleased]` bullet "The validation hook names each
problem item of a refused method (Breaking)" is edited in place to name
`@pipelex/sdk` 0.54.1, `@pipelex/tools-wasm` 0.6.1 and a `User-Agent` of
0.54.1, since the unreleased section is the delta since the last
release.

## How it was verified

- `npm ci` in `pipelex-sdk/js` before the vendor, since its
`node_modules` still held tools-wasm 0.6.0; `make vendor-hook` printed
the new provenance line above.
- `make check-hook-fresh`: "The bundle embeds 0.6.1, which is npm's
latest", "A rebuild at dev is identical below the banner", "The vendored
hook bundle is current", exit 0.
- `make agent-check`: all checks passed, the provenance guard and the
notices check included ("Every package the hook bundle inlines is named
in its notices file"); it rewrote no file.
- `DO_NOT_TRACK=1 make agent-test`: all tests passed, the hook's sweep
over the corpus included.

## Documentation

- `CHANGELOG.md` `[Unreleased]`: the hook bullet names the new versions.
`docs/hooks.md` names no embedded version, so it needed no change.

Closes L-261025-087fe8

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01ChCUgUaFZK7FTEAc8uPAVL

Co-authored-by: Claude Opus 5.5 <[email protected]>
@lchoquel
lchoquel merged commit 01681f1 into main Oct 25, 2026
8 checks passed
@lchoquel
lchoquel deleted the release/v0.17.0 branch October 25, 2026 16:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant