Skip to content

feature/Some-refusals-escape-verdict · L-260926-537faf - #1272

Closed
lchoquel wants to merge 6 commits into
feature/Run-path-bundle-verdictfrom
feature/Some-refusals-escape-verdict
Closed

lchoquel wants to merge 6 commits into
feature/Run-path-bundle-verdictfrom
feature/Some-refusals-escape-verdict

Conversation

@lchoquel

@lchoquel lchoquel commented Sep 26, 2026 •

Copy link
Copy Markdown
Member

The pipe factories' refusal classes declared no error domain, so the verdict translation let them escape every validator raw; they are raised only while a pipe is built from its own blueprint, so they are now input-domained and caller-facing, and a PipeExtract with a non-image, non-document input validates to an item located on its pipe and file that says which input to redeclare. The builder's validate_ops.validate_pipe and validate_all now translate their library loads and dry runs as the validate commands do, keeping the entry-pipe lookup and the library teardown outside the translation.

Closes L-260926-537faf

🤖 Generated with Claude Code


Summary by cubic

The pipe factories' refusal classes declared no error domain, so the verdict translation let them escape every validator raw. They're now input-domained and caller-facing: a PipeExtract whose input is neither an image nor a document validates to a pipe_validation item on its pipe and file that says which input to redeclare. The builder's validate_ops.validate_pipe and validate_all now translate their library loads and dry runs as the validate commands do, while the entry-pipe lookup and library teardown stay outside the translation. The agent CLI's validate_all_core also keeps the file on an item raised while its libraries load, where it used to lose it because the refusal was translated only after the failed library was torn down. PipeLLMFactoryError no longer echoes a failing prompt: a pipe may inherit its domain's system prompt, which a host's library can declare, so a malformed host prompt would have reached an untrusted caller verbatim under STRICT disclosure where it used to be a redacted 500.

Refactors

  • PipeLLMFactoryError refusals now catch the template validation error the factory actually raises, report only the line of that prompt it fails at (Jinja2's own diagnosis names the offending token), and a refusal of a domain-inherited system prompt names that domain.

Written for commit 1fc308b. Summary will update on new commits.

Review in cubic

lchoquel and others added 5 commits September 26, 2026 21:27
The pipe factories' refusal classes (LLM, Compose, Extract, Condition,
Parallel) declared no domain, so the verdict translation's general arm let
them escape every validator raw. They are raised only while a pipe is built,
about its own blueprint, so they are now input-domained and caller-facing,
and a PipeExtract with a non-image, non-document input validates to an item
on its pipe and file that says which input to redeclare. The builder's
validate_ops.validate_pipe and validate_all now load and dry-run inside the
same translation, so a refusal there is the ValidateBundleError verdict.

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

validate_ops.validate_pipe translated its entry-pipe lookup, turning an
ambiguous code into an invalid bundle; the load and the dry run are now
translated on either side of it. validate_all translated after
acquire_and_validate had torn its library down, so a teardown fault became a
verdict and the source backfill read the wrong library; it now translates the
sweep while its library is current and tears down outside the translation. The
PipeLLM factory's user-prompt arm caught an error TemplateBlueprint never
raises, and its system-prompt message printed None for a prompt inherited from
the domain; both now report what failed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pe-verdict

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
validate_all_core translated acquire_library from outside, so a refusal raised while its
libraries loaded was translated only after acquire_library had torn the failed library down,
and the translation could no longer read the pipe's source: the item lost its file. The
directories are the caller's own, so acquire_library now translates their load itself
(library_dirs_are_callers=True), as validate_ops.validate_all does. The sweep stays
untranslated, keeping the documented DryRunError answer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PipeLLMFactoryError became caller-facing on this branch, and its messages quoted the prompt
that failed to parse, through both the appended source and the pydantic error's own text. A
pipe with no system prompt inherits its domain's, which a host's library may declare, so a
malformed host prompt reached an untrusted caller verbatim under STRICT disclosure, where it
used to be a redacted 500. The factory now reports Jinja2's diagnosis and line only. Also
corrects validate_ops.validate_all's stale reason for returning no pending_signatures.

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

Copy link
Copy Markdown
Member Author

Review round 3, profile 4, bar necessity. Reviewers: cubic, Codex review and adversarial, code-review (medium). Every fixed finding was confirmed by a verifier first.

Fixed in b6e4e14: PipeLLMFactoryError, now caller-facing, quoted the prompt that failed to parse, and a pipe inheriting its domain's system prompt could carry a host library's prompt to a caller under STRICT disclosure; the factory now gives Jinja2's diagnosis and line only. Also corrected the stale reason validate_ops.validate_all gave for returning no pending_signatures. Before the pass, 4719866 made the agent validate --all keep the file on a load refusal's item.

Deferred, handed to the sprint for filing: host-library load refusals answer as input 422s whatever their owner (already true of model-choice errors, now of factory refusals too); the bare pipelex validate --all still loses an item's file on a load refusal (verified, predates this branch). Unverified: an inherited system-prompt refusal is located on the pipe's file rather than the one declaring the prompt, and the validate-all lifecycle is spelled out in three places.

round 4 — bar necessity — profile 4 (derived) — the round-3 pass fixed a critical, so this pass is held to necessity rather than the ladder's freeze

Jinja2's own diagnosis names the token it stopped at, such as an unknown tag, so passing its
message on still carried words of a possibly host-owned inherited prompt to the caller. The
refusal now says only that the prompt does not parse and at which line of that prompt, which
also stops the line reading as a line of the bundle file.

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/Some-refusals-escape-verdict 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