Default reference pipeline for image, video, and audio projects — routes through media-image / media-video / media-audio atoms based on the project kind, wraps the output in a live artifact, and devloops on critique-theater until the score converges.
This scenario plugin is the bundled default for projects whose
metadata.kind is image, video, or audio. The web client and the
daemon both look up defaultScenarioPluginIdForKind(kind) from
@open-design/contracts and, when no other plugin is applied, bind
this scenario at project / run creation time.
{
"stages": [
{ "id": "discovery", "atoms": ["discovery-question-form"] },
{ "id": "plan", "atoms": ["todo-write"] },
{ "id": "generate", "atoms": ["media-image", "media-video", "media-audio", "live-artifact"] },
{
"id": "critique", "atoms": ["critique-theater"],
"repeat": true,
"until": "critique.score>=4 || iterations>=3"
}
]
}
The generate stage lists all three media atoms even though a single
run only calls one of them. Picking the right atom is the agent's job:
metadata.kind === 'image' → media-imagemetadata.kind === 'video' → media-videometadata.kind === 'audio' → media-audioIf the user picks this plugin manually without a media-typed project,
prefer media-image and explain the assumption in the first reply.
Every media atom takes the same kernel of inputs and returns a media
artifact reference that live-artifact can wrap:
prompt — the rendered useCase.query after input substitution.aspect — one of 1:1 / 16:9 / 9:16 / 4:3 / 3:4. Default
16:9. The contracts MediaAspect union enumerates the legal
values.provider — left blank by default so the daemon picks the user's
configured provider for this media kind
(see Settings → Media providers).
Only set this when the user names a provider explicitly.After the media atom returns:
<cwd>/media/<timestamp>.<ext>.live-artifact to register a preview surface pointing at the
saved file. The preview is what the user sees in the right pane.critique-theater reads the artifact, scores it across the standard
five dimensions, and emits a critique.score signal. The until
clause stops the loop at score ≥ 4 or three iterations, whichever
comes first. Use the critique notes to drive the next media call's
prompt, not to re-pick the media atom.
Enterprise editions that need a different default for media work
should ship a sibling scenario plugin and add the right mapping in
@open-design/contracts/scenario-defaults, not patch this manifest.
Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/od-media-generation · pinned to the source commit
# Run from your project root
git clone https://github.com/nexu-io/open-design.git .skillboard-tmp
git -C .skillboard-tmp checkout 9881cff70e02be86c2a58130af512011ba23d4af
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/plugins/_official/scenarios/od-media-generation" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/nexu-io/open-design.git .skillboard-tmp
git -C .skillboard-tmp checkout 9881cff70e02be86c2a58130af512011ba23d4af
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/plugins/_official/scenarios/od-media-generation" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/od-media-generation
Scanner static-checks@0.1.0 · commit 9881cff70e02. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
No static rules matched. This is not a safety guarantee.