Conversation
…aller-facing Under STRICT disclosure a caller whose own method was wrong read "An internal error occurred." with a 500, because the errors those mistakes raise were neither input-domain nor caller-facing. The classes involved are also raised for faults that are not the caller's, so the raise site classifies the one error it raises, through the new PipelexError.as_caller_fault(): a PipeParallel combine whose branch results do not fit its output, a pipe started without a required input, and a model lookup for a reference the deck neither defines nor names, which only an inline setting of the method can have named. A model the deck itself names but does not serve stays a redacted config error, and the failures left out (a model output that does not fit, a PipeFunc crash, an unusable input resource, a template render, a working-memory miss) say why where they are raised. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…coped A value in a deck setting table that no reference parses from is now checked against the deck's own entries instead of being taken as the caller's, and a model the deck serves only as another type counts as undefined for the lookup that refused it. The as_caller_fault docstring now says a wrapper inherits the domain but not the caller-facing flag. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…that model A scalar default or override is stored as a ModelReference, which the scan of the deck's own entries skipped, so a deck default naming a model the deployment does not serve, or serves as another type, read as the caller's fault. The model-not-found page now says the check at load does not tell a model of another type apart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A default or override spelled with the handle: prefix reaches the lookup by its bare name, so recording its raw spelling left a deck-named model reading as the caller's fault. The alias, waterfall and preset spellings already reach the lookup as names the deck names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review round 3, profile 4, bar necessity, over this PR's diff against feature/Located-run-failure at fb964b2. Reviewers: cubic, codex:review, codex:adversarial, code-review (medium). Fixed in 8869d29: a deck's handle default or override spelled with the Rejected: the missing-input gate on a nested pipe (code-review), reachable only through a broken runtime invariant, as round 1 verified; the PipeParallel combine disclosing custom-validator text (codex:adversarial), refuted for runs that send only .mthds content, since the combine's one raise path formats pydantic errors through Pipelex's own formatter. Deferred and handed to the sprint: a stale scalar deck default failing at setting resolution as a caller-facing ModelChoiceNotFoundError (codex:review, unverified, pre-existing and fenced with the deck-side reclassification); a duplicate list of deck-named models beside ModelManager._collect_deck_referenced_handles (cubic, unverified); a deployment's own .py structure class validator text reaching STRICT through the combine (verified residual, not reachable from .mthds content). round 4 — bar freeze — profile 4 (derived) — the round-3 pass at profile 4 fixed under its bar; the ladder puts this pass at freeze |
A run that fails on the caller's own method now reads its reason under STRICT disclosure: a missing required input, a PipeParallel whose branches do not fit the combined concept, and a model that only the method's inline setting names are classified at their raise sites as input-domain and caller-facing, through a new `PipelexError.as_caller_fault()`, so a hosted run answers 422 with the located message instead of "An internal error occurred." A model that the deck itself names but does not serve stays config-domain and redacted, and the failures left unclassified (template renders, function crashes, model output that does not fit its structure) say why at their raise sites.
Closes L-260925-648ee6
🤖 Generated with Claude Code
Summary by cubic
A run that fails on the caller's own method now reports its reason under STRICT disclosure instead of
An internal error occurred.with a 500.PipelexError.as_caller_fault()lets the raise site classify one error as the caller's own fault (inputdomain, 422, caller-facing message) even when other instances of the same class are not.PipeParallelwhose branch results do not fit its output, a pipe started without a required input, and a model reference that only the method's inline setting can have named.config-domain and redacted, including deck defaults and overrides written as settings, matched by the name the lookup receives.PipeFunccrashes, unusable input resources, template renders, working-memory misses) now say why at their raise sites.Migration
as_caller_fault()must ensure their message names only the caller's own method and data, since STRICT disclosure will keep it.Closes L-260925-648ee6.
Written for commit 8869d29. Summary will update on new commits.