Skip to content

feature/Bundle-refusal-verdicts · L-260925-de5f3b - #1264

Closed
lchoquel wants to merge 5 commits into
devfrom
feature/Bundle-refusal-verdicts
Closed

lchoquel wants to merge 5 commits into
devfrom
feature/Bundle-refusal-verdicts

Conversation

@lchoquel

@lchoquel lchoquel commented Sep 26, 2026 •

Copy link
Copy Markdown
Member

Every refusal of the caller's input raised while a bundle is loaded now becomes a validation verdict item instead of a no-verdict fault, with the unknown model as the worked example: a located unknown_model item carrying the pipe, field path, reference as written, model type and the deck's suggestions, plus an unsafe rename-model fix when there is exactly one. Other input-domained refusals at pipe build are located on their pipe through the new PipeLoadRefusalError, and the bare and agent validate commands answer them with exit 1 and the invalid-bundle output rather than exit 2 or a traceback.

Closes L-260925-de5f3b

🤖 Generated with Claude Code


Summary by cubic

Every refusal of the caller's input raised while a bundle is loaded now becomes a validation verdict item instead of a no-verdict fault. The worked example is the unknown model: a pipe whose model field names a handle, alias, preset or waterfall the deck does not define now validates to one unknown_model item carrying the field path, the reference as written, the model type and the deck's suggestions, plus an unsafe rename-model fix when the deck offers exactly one suggestion. The bare and agent validate commands now answer load-time refusals and failing dry runs with exit 1 and the invalid-bundle output where they used to exit 2 or print a traceback.

  • Other input refusals raised while building a pipe are wrapped in the new PipeLoadRefusalError, located on the pipe and its source file.
  • Pipes built from a dependency package get the same locating, so their refusals name the dependency's file.
  • A refusal raised while building a synthetic helper of a preliminary_text PipeLLM is located on the authored pipe and field via the elaboration metadata the crate now carries.
  • The unsafe rename-model fix is not accepted by --select/--ignore, and pipelex fix bundle never applies it on its own.

Written for commit 5312fcc. Summary will update on new commits.

Review in cubic

lchoquel and others added 5 commits September 26, 2026 18:20
Every input-domained refusal raised while loading a bundle now becomes a
ValidateBundleError item instead of a no-verdict fault. The unknown model is
the worked example: the operator raises a located PipeOperatorModelChoiceError
(input domain, caller-facing) that the cascade turns into a pipe_validation
item with the unknown_model code, the field path, the reference as written,
its model type and the deck's close matches, plus a rename-model fix when
there is exactly one. Other input refusals at pipe build are wrapped in the
new PipeLoadRefusalError, located on the pipe and its source. The bare and
agent validate commands route their library load through the cascade, so
they exit 1 with the invalid verdict, and a failing dry run under
`pipelex validate pipe` or `--all` renders the panel rather than a traceback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FigDssaJrvNcmbnBedi7oq
The rename-model fix is now UNSAFE: its one suggestion is a fuzzy match over
the deck's names, which can be a different model, so `pipelex fix bundle`
never applies it on its own. The availability handler's docstring again says
validate passes exit code 2 for a model no backend serves. The CLI docs now
say that agent `validate pipe` answers a failing dry run with the DryRunError
envelope, and that a refusal whose class does not declare the input domain
still leaves as no verdict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FigDssaJrvNcmbnBedi7oq
…nselectable

A refusal raised while building a synthetic helper of a preliminary_text
PipeLLM is now located on the authored pipe and field, because the library
crate carries the elaborator's metadata beside its source map; before, the
unknown_model item named `<code>__structure` and its fix targeted a table
the author never wrote. Pipes of a dependency package are built under the
same locating context as the main load, so their refusals name their file.
The unsafe rename-model code is no longer accepted by --select/--ignore, and
the "suggested fix not applied" tip counts only safe fixes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A dependency package's pipes are built outside the main load loop. These
tests load one through `_load_single_dependency` and check that an unknown
model names the dependency's file, that a preliminary_text helper's refusal
lands on the authored pipe and field, and that any other input refusal
becomes a PipeLoadRefusalError located on the pipe. Each test fails when the
locating wrapper is removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The comment above KNOWN_FIX_CODES still said it held every code the planner
can emit while the lines below it said rename-model is left out on purpose.
It now says what the set is: the SAFE rules the fix loop can apply, with an
UNSAFE rule such as rename-model kept out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@lchoquel

Copy link
Copy Markdown
Member Author

Superseded by #1276, which carries this branch's commits and landed on dev as a7924f6.

@lchoquel lchoquel closed this Sep 27, 2026
@github-actions github-actions Bot locked and limited conversation to collaborators Sep 27, 2026
@lchoquel
lchoquel deleted the feature/Bundle-refusal-verdicts branch September 27, 2026 16:46
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