Conversation
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>
|
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: 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 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>
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
PipeExtractwhose input is neither an image nor a document validates to apipe_validationitem on its pipe and file that says which input to redeclare. The builder'svalidate_ops.validate_pipeandvalidate_allnow 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'svalidate_all_corealso 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.PipeLLMFactoryErrorno 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
PipeLLMFactoryErrorrefusals 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.