Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/nexu-io-od-media-generation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 218% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -60% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -44% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -42% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -2% | 0% |
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.
jsonc{ "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. Default16:9. The contracts MediaAspect union enumerates the legal values.
provider — left blank by default so the daemon picks the user'sconfigured 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 thesaved 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.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 5,619 | 23,819 | +324% | 1 | 1 | 0% | 759 | 2,410 | +218% | 0 | 0 | — |
case-02 | fail→pass | 40,605 | 13,867 | -66% | 1 | 1 | 0% | 8,239 | 3,288 | -60% | 0 | 0 | — |
case-03 | fail→pass | 28,228 | 12,512 | -56% | 1 | 1 | 0% | 5,146 | 2,899 | -44% | 0 | 0 | — |
case-09 | pass→pass | 9,203 | 3,521 | -62% | 1 | 1 | 0% | 1,426 | 1,267 | -11% | 0 | 0 | — |
case-04 | pass→pass | 12,676 | 7,083 | -44% | 1 | 1 | 0% | 2,010 | 1,977 | -2% | 0 | 0 | — |
case-05 | pass→pass | 3,699 | 2,222 | -40% | 1 | 1 | 0% | 578 | 1,036 | +79% | 0 | 0 | — |
case-06 | fail→pass | 10,767 | 2,109 | -80% | 1 | 1 | 0% | 1,738 | 1,014 | -42% | 0 | 0 | — |
case-07 | pass→pass | 5,026 | 3,385 | -33% | 1 | 1 | 0% | 811 | 1,246 | +54% | 0 | 0 | — |
case-08 | pass→pass | 8,341 | 3,032 | -64% | 1 | 1 | 0% | 1,290 | 1,197 | -7% | 0 | 0 | — |
case-10 | fail→pass | 9,634 | 3,809 | -60% | 1 | 1 | 0% | 1,432 | 1,409 | -2% | 0 | 0 | — |
case-11 | fail→pass | 15,846 | 2,098 | -87% | 1 | 1 | 0% | 2,492 | 1,042 | -58% | 0 | 0 | — |
case-12 | fail→pass | 17,224 | 2,210 | -87% | 1 | 1 | 0% | 2,518 | 1,038 | -59% | 0 | 0 | — |
case-13 | fail→pass | 9,560 | 3,135 | -67% | 1 | 1 | 0% | 1,475 | 1,176 | -20% | 0 | 0 | — |
case-14 | pass→pass | 14,945 | 2,362 | -84% | 1 | 1 | 0% | 2,414 | 1,142 | -53% | 0 | 0 | — |
case-15 | fail→pass | 38,377 | 2,413 | -94% | 1 | 1 | 0% | 6,715 | 1,048 | -84% | 0 | 0 | — |
case-16 | fail→pass | 27,341 | 1,899 | -93% | 1 | 1 | 0% | 4,766 | 996 | -79% | 0 | 0 | — |
case-17 | fail→pass | 14,074 | 1,805 | -87% | 1 | 1 | 0% | 2,096 | 982 | -53% | 0 | 0 | — |
case-18 | fail→pass | 13,191 | 1,874 | -86% | 1 | 1 | 0% | 2,050 | 961 | -53% | 0 | 0 | — |
case-19 | fail→pass | 13,733 | 2,190 | -84% | 1 | 1 | 0% | 2,308 | 1,034 | -55% | 0 | 0 | — |
case-20 | fail→pass | 15,368 | 2,070 | -87% | 1 | 1 | 0% | 2,279 | 986 | -57% | 0 | 0 | — |
case-21 | fail→pass | 6,889 | 1,880 | -73% | 1 | 1 | 0% | 968 | 1,002 | +4% | 0 | 0 | — |
case-22 | fail→pass | 29,987 | 3,668 | -88% | 1 | 1 | 0% | 4,761 | 1,359 | -71% | 0 | 0 | — |
case-23 | fail→pass | 13,541 | 3,489 | -74% | 1 | 1 | 0% | 2,179 | 1,345 | -38% | 0 | 0 | — |
case-24 | fail→pass | 8,539 | 4,326 | -49% | 1 | 1 | 0% | 1,394 | 1,457 | +5% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +75 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.