Skip to content

templates/minimax/music-video: no way to supply an existing portrait as <Picture 1> — reusing a standing cast means copying the whole template inline #146

Description

@dkackman

tool/endpoint: run_workflow / validate_workflow on templates/minimax/music-video
workspace: qa-ep13
found: while running TESTER_TASK.md (episode 13), model opus via provider anthropic, against dw 0.4.0-beta.4 on lem.

What I wanted

The standing QA cast has portraits kept as shared assets (asset:qa-cast/priya-portrait.jpg). I wanted the music-video shape with an existing cast member as the singer, rather than a freshly drawn one — the same reuse dialogue-short supports.

Why I couldn't

music-video's singer is wired end to end through its own generate step. The shot step's image reference is:

{ "reference_type": "variable:image_reference_type", "from_previous_result": "draw_singer" }

from_previous_result: "draw_singer" is structural — it lives in steps[3].pipeline.arguments.references[0], not in variables. The shots list's fields are name, prompt, start_frame only, so there is no per-entry references either. The only knob exposed is singer_portrait_prompt, which changes what gets drawn, never whether an existing image is used instead.

So arguments={...} cannot express it at any level, and the workaround is to fetch the full definition with get_workflow and resubmit the entire ~120-line workflow as inline_workflow with one reference changed to "from_file": "asset:qa-cast/priya-portrait.jpg". That works (job fddbaed74355, succeeded), but it means:

  • carrying a private copy of the template, which silently stops tracking upstream fixes to it — exactly the drift #90-style composition-by-name exists to avoid;
  • an estimate.basis of unknown instead of catalog, so the run can't be priced from the template's measured history;
  • the same copy for every future episode that reuses the cast.

Repro

get_workflow(name="templates/minimax/music-video")          # references[0] is from_previous_result
list_workflows(shape="sequence")                            # lists[].shots.fields = name, prompt, start_frame

No arguments value reaches steps[3].pipeline.arguments.references[0].

expected

Some supported way to supply an existing image as <Picture 1> without copying the template. dialogue-short already has the shape of the answer — its shot references take from_file with an asset: path, which is what makes a standing cast reusable there.

The cheapest version that would have unblocked me is a singer_portrait variable defaulting to null, with the reference reading from it when set and falling back to draw_singer otherwise. Worth noting that the elision engine already makes that clean on its own: in my inline copy draw_singer became unreferenced and the plan elided it before the run (plan.elided_steps, and a matching job.warnings line), so the generate step costs nothing when a portrait is supplied — no conditional-step machinery needed.

That is a suggestion about shape, not a requirement — if there's a better fit with how templates are meant to expose references generally, or if this is better solved once across every identity-referenced template rather than in this one, that's your call.

not blocking

I got episode 13 made via the inline copy. Filing it because it's a workaround I had to invent, and the next episode reusing the cast in this shape would have to invent it again.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions