Repository navigation
Runner: a Listing run whose only other tiles need copy ends "partial", not "failed" - #41
Merged
Merged
Conversation
…al, not failed finishRun counted a deliverable only as a succeeded leaf step. The hero (compose_main) is not a leaf: every other tile depends on it. When those tiles all end needs_input (copy missing), no succeeded leaf exists and the run ended failed, though the hero is exportable. docs/spec/api.md and listing.md (G7, T-T3) say such a run is partial. A succeeded step whose dependents all ended needs_input now counts as a deliverable. needs_input is only returned by Listing code steps, so Product Shoot, Motion and Identity outcomes do not change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ds failed Pins the other half of the partial rule: the hero-is-a-deliverable change must not let a failed compliance check (gating step) end the run partial when the remaining tiles are skipped for lack of copy. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
wilsonhj
added a commit
that referenced
this pull request
Oct 31, 2026
…, not "failed" (#41) * Runner: a Listing hero whose other tiles need copy ends the run partial, not failed finishRun counted a deliverable only as a succeeded leaf step. The hero (compose_main) is not a leaf: every other tile depends on it. When those tiles all end needs_input (copy missing), no succeeded leaf exists and the run ended failed, though the hero is exportable. docs/spec/api.md and listing.md (G7, T-T3) say such a run is partial. A succeeded step whose dependents all ended needs_input now counts as a deliverable. needs_input is only returned by Listing code steps, so Product Shoot, Motion and Identity outcomes do not change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Runner test: a Listing run whose main image fails compliance still ends failed Pins the other half of the partial rule: the hero-is-a-deliverable change must not let a failed compliance check (gating step) end the run partial when the remaining tiles are skipped for lack of copy. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What was wrong
finishRun(lib/pipeline/runner.ts) only counted a succeeded leaf step as a deliverable. On Listing, the hero (compose_main) is not a leaf, because every other tile depends on it. When every other tile endsneeds_input(copy missing), there is no succeeded leaf, so the run endedfailedeven though the hero succeeded and can be exported.docs/spec/api.md(run status) sayspartialmeans "finished with a deliverable", and the Listing spec (G7, T-T3, and api.md §2.3 "Missing copy") says a run withneeds_inputtiles endspartial.needs_inputbeing inBADis correct: it is what keeps the run from beingsucceeded. Only the deliverable check was wrong.Reproduce (mock Comfy,
succeededscenario)POST
/api/pipelines/listingwith a transparent product PNG and either:{"assets":["gallery_callouts","gallery_contents"],"productImages":[{"upload":"product"}]}, or{"scope":"story", ...}with no copy at all.Before:
cutoutandcompose_mainsucceeded, every other tileneeds_input, runfailed. After: runpartial. (scope: "gallery"was alreadypartial, only because the angles/detail/in-use tiles are succeeded leaves.)Change
A succeeded step whose dependents all ended
needs_inputnow counts as a deliverable, alongside leaves. Only Listing code steps returnneeds_input, so Product Shoot, Motion and Identity outcomes don't change (their tests pass unchanged).Not covered here: a hero whose dependent tile failed (e.g.
text_too_long, or a failed diffusion job) still makes the runfailedwhen no other leaf succeeded. Fixing that needs the definition to name its deliverable steps, which would changePipelineDefinition, so I left it out of this PR.Tests
tests/pipeline/runner.test.ts› "a Listing run whose only other tiles need copy ends partial: the hero is a deliverable" (fails before withfailed, passes after).pnpm lint && pnpm typecheck && pnpm testpass (427/427). I re-ran the three POSTs above againstpnpm devwith the mock.Based on main after #34 (which edited the same lines of
finishRun), so the two don't conflict.🤖 Generated with Claude Code