diff --git a/projects/judge-dashboard/index.html b/projects/judge-dashboard/index.html
index 76f8723..0d3d869 100644
--- a/projects/judge-dashboard/index.html
+++ b/projects/judge-dashboard/index.html
@@ -1590,8 +1590,8 @@
-
Total cost (internal)
+
+ Total cost
—
@@ -1669,7 +1669,7 @@
Step 5: Generate variants
{ label: "Holiday gift", headline: "Make hers unforgettable", subhead: "From the icon to the everyday", cta: "Shop the collection" },
{ label: "Fragrance loyalist", headline: "Your signature, refined", subhead: "Three icons, one collection", cta: "Discover" }
],
- formats: ["1:1", "9:16"]
+ formats: ["1:1", "9:16", "4:5"]
},
uploads: {
hero1: { preview_url: `${PRESET_ASSET_BASE}/chanel/hero1.jpg`, runflow_uri: `${PRESET_ASSET_BASE}/chanel/hero1.jpg`, filename: "hero1.jpg" },
@@ -1680,16 +1680,22 @@ Step 5: Generate variants
runs: [
{"hero_idx": 1, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-1x1.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 1, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-9x16.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 1, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-1x1.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 1, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-9x16.jpg", "cost": null, "duration_ms": null},
- {"hero_idx": 2, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-1x1.jpg", "cost": 0.027811, "duration_ms": 39172},
+ {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 2, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-1x1.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-9x16.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-1x1.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-9x16.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 3, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-1x1.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 3, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-9x16.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c1-4x5.jpg", "cost": 0.028979, "duration_ms": 40824},
{"hero_idx": 3, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-1x1.jpg", "cost": null, "duration_ms": null},
- {"hero_idx": 3, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-9x16.jpg", "cost": null, "duration_ms": null}
+ {"hero_idx": 3, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-9x16.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg", "cost": 0.026492, "duration_ms": 37290}
]
},
{
@@ -1704,7 +1710,7 @@ Step 5: Generate variants
{ label: "Performance marketer", headline: "Variants overnight, on-brand", subhead: "Cut creative-refresh costs by 4x", cta: "Get started" },
{ label: "Indie founder", headline: "Ship the ad today", subhead: "From one hero to a full set", cta: "Try Runflow" }
],
- formats: ["16:9", "4:5"]
+ formats: ["16:9", "4:5", "1:1"]
},
uploads: {
hero1: { preview_url: `${PRESET_ASSET_BASE}/runflow/hero1.jpg`, runflow_uri: `${PRESET_ASSET_BASE}/runflow/hero1.jpg`, filename: "hero1.jpg" },
@@ -1715,16 +1721,22 @@ Step 5: Generate variants
runs: [
{"hero_idx": 1, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-16x9.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 1, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c1-1x1.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 1, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-16x9.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 1, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h1-c2-1x1.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-16x9.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 2, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c1-1x1.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-16x9.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 2, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h2-c2-1x1.jpg", "cost": 0.025475, "duration_ms": 35885},
{"hero_idx": 3, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-16x9.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-4x5.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 3, "cut_idx": 1, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c1-1x1.jpg", "cost": 0.026282, "duration_ms": 37070},
{"hero_idx": 3, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-16x9.jpg", "cost": null, "duration_ms": null},
- {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null}
+ {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 3, "cut_idx": 2, "format": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-1x1.jpg", "cost": null, "duration_ms": null}
]
},
{
@@ -1739,7 +1751,7 @@ Step 5: Generate variants
{ label: "Performance marketer", headline: "Variants overnight, on-brand", subhead: "Cut creative-refresh costs by 4x", cta: "Get started" },
{ label: "Indie founder", headline: "Ship the ad today", subhead: "From one hero to a full set", cta: "Try Runflow" }
],
- formats: ["9:16", "16:9"]
+ formats: ["9:16", "16:9", "4:5"]
},
uploads: {
hero1: { preview_url: `${PRESET_ASSET_BASE}/ikea/hero1.jpg`, runflow_uri: `${PRESET_ASSET_BASE}/ikea/hero1.jpg`, filename: "hero1.jpg" },
@@ -1750,16 +1762,22 @@ Step 5: Generate variants
runs: [
{"hero_idx": 1, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-9x16.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 1, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-16x9.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 1, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c1-4x5.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 1, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-9x16.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 1, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-16x9.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 1, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h1-c2-4x5.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-9x16.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-16x9.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 2, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c1-4x5.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-9x16.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 2, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-16x9.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 2, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h2-c2-4x5.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 3, "cut_idx": 1, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-9x16.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 3, "cut_idx": 1, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-16x9.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 3, "cut_idx": 1, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c1-4x5.jpg", "cost": null, "duration_ms": null},
{"hero_idx": 3, "cut_idx": 2, "format": "9:16", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-9x16.jpg", "cost": null, "duration_ms": null},
- {"hero_idx": 3, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-16x9.jpg", "cost": null, "duration_ms": null}
+ {"hero_idx": 3, "cut_idx": 2, "format": "16:9", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-16x9.jpg", "cost": null, "duration_ms": null},
+ {"hero_idx": 3, "cut_idx": 2, "format": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-4x5.jpg", "cost": null, "duration_ms": null}
]
}
];
@@ -2094,15 +2112,18 @@ Step 5: Generate variants
`Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.`
].filter(Boolean);
- const hero2 = urlOrUpload("hero2") || logo || heroUrl;
- const hero3 = urlOrUpload("hero3") || logo || heroUrl;
+ // The workflow requires three reference fields, but mixing different heroes
+ // in one run causes the model to composite them together (e.g. all three
+ // perfume bottles in a single Chanel ad). Per the runflow-ad-creative skill,
+ // satisfy all three slots with the SAME hero — each (hero × angle × format)
+ // gets its own clean run.
return {
"prompt": promptLines.join(" "),
"aspect_ratio": aspect || "1:1",
"logo": logo,
"primary_design_ref": heroUrl,
- "Aux Reference 1": hero2,
- "Aux Reference 2": hero3
+ "Aux Reference 1": heroUrl,
+ "Aux Reference 2": heroUrl
};
}
@@ -3080,7 +3101,7 @@ Step 5: Generate variants
const pos = visible.indexOf(LIGHTBOX_IDX) + 1;
document.getElementById("lightboxCaption").innerHTML =
`${pos}/${visible.length} · Hero ${r.hero_idx} · Angle ${r.cut_idx} · ${r.format}` +
- (IS_ADMIN ? ` · $${(r.cost||0).toFixed(3)}` : "") +
+ ` · $${(r.cost||0).toFixed(3)}` +
` · ${((r.duration_ms||0)/1000).toFixed(1)}s`;
updateLightboxRateButtons();
}
diff --git a/projects/judge-dashboard/presets/chanel/runs/h1-c1-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h1-c1-4x5.jpg
new file mode 100644
index 0000000..c9f7ea4
Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h1-c1-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/chanel/runs/h1-c2-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h1-c2-4x5.jpg
new file mode 100644
index 0000000..864a598
Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h1-c2-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/chanel/runs/h2-c1-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h2-c1-4x5.jpg
new file mode 100644
index 0000000..16496c1
Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h2-c1-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/chanel/runs/h2-c2-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h2-c2-4x5.jpg
new file mode 100644
index 0000000..72e26aa
Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h2-c2-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/chanel/runs/h3-c1-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h3-c1-4x5.jpg
new file mode 100644
index 0000000..a1c1896
Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h3-c1-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg b/projects/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg
new file mode 100644
index 0000000..5ed153e
Binary files /dev/null and b/projects/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/ikea/runs/h1-c1-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h1-c1-4x5.jpg
new file mode 100644
index 0000000..8b44ea9
Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h1-c1-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/ikea/runs/h1-c2-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h1-c2-4x5.jpg
new file mode 100644
index 0000000..f89f40a
Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h1-c2-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/ikea/runs/h2-c1-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h2-c1-4x5.jpg
new file mode 100644
index 0000000..5098013
Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h2-c1-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/ikea/runs/h2-c2-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h2-c2-4x5.jpg
new file mode 100644
index 0000000..b86fe52
Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h2-c2-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/ikea/runs/h3-c1-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h3-c1-4x5.jpg
new file mode 100644
index 0000000..eaaf44b
Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h3-c1-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/ikea/runs/h3-c2-4x5.jpg b/projects/judge-dashboard/presets/ikea/runs/h3-c2-4x5.jpg
new file mode 100644
index 0000000..7f65e6a
Binary files /dev/null and b/projects/judge-dashboard/presets/ikea/runs/h3-c2-4x5.jpg differ
diff --git a/projects/judge-dashboard/presets/runflow/runs/h1-c1-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h1-c1-1x1.jpg
new file mode 100644
index 0000000..0ce6690
Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h1-c1-1x1.jpg differ
diff --git a/projects/judge-dashboard/presets/runflow/runs/h1-c2-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h1-c2-1x1.jpg
new file mode 100644
index 0000000..6dec32a
Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h1-c2-1x1.jpg differ
diff --git a/projects/judge-dashboard/presets/runflow/runs/h2-c1-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h2-c1-1x1.jpg
new file mode 100644
index 0000000..db037b7
Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h2-c1-1x1.jpg differ
diff --git a/projects/judge-dashboard/presets/runflow/runs/h2-c2-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h2-c2-1x1.jpg
new file mode 100644
index 0000000..655a2e0
Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h2-c2-1x1.jpg differ
diff --git a/projects/judge-dashboard/presets/runflow/runs/h3-c1-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h3-c1-1x1.jpg
new file mode 100644
index 0000000..a108808
Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h3-c1-1x1.jpg differ
diff --git a/projects/judge-dashboard/presets/runflow/runs/h3-c2-1x1.jpg b/projects/judge-dashboard/presets/runflow/runs/h3-c2-1x1.jpg
new file mode 100644
index 0000000..478ee04
Binary files /dev/null and b/projects/judge-dashboard/presets/runflow/runs/h3-c2-1x1.jpg differ
diff --git a/projects/judge-dashboard/tools/build-presets.py b/projects/judge-dashboard/tools/build-presets.py
index 46f0f63..1dd149f 100644
--- a/projects/judge-dashboard/tools/build-presets.py
+++ b/projects/judge-dashboard/tools/build-presets.py
@@ -87,7 +87,11 @@ def poll(run_id, max_wait=900, interval=5):
return {"status_code": "timeout", "failure_message": "client poll timeout", "output": r.get("output")}
time.sleep(interval)
-def build_payload(hero_url, aspect, cut, brand, logo_url, aux1_url, aux2_url):
+def build_payload(hero_url, aspect, cut, brand, logo_url, _unused_aux1=None, _unused_aux2=None):
+ """Per the runflow-ad-creative skill: each (hero × angle × format) is its
+ own clean run with the SAME hero in all three reference slots. Passing
+ different heroes to Aux Reference 1/2 causes the model to composite them
+ (e.g. three perfume bottles in one Chanel ad)."""
lines = [
"Produce a brand-locked ad variant from the provided primary design reference.",
f'Headline text: "{cut["headline"]}".' if cut.get("headline") else "",
@@ -106,8 +110,8 @@ def build_payload(hero_url, aspect, cut, brand, logo_url, aux1_url, aux2_url):
"aspect_ratio": aspect or "1:1",
"logo": logo_url or "",
"primary_design_ref": hero_url,
- "Aux Reference 1": aux1_url or logo_url or hero_url,
- "Aux Reference 2": aux2_url or logo_url or hero_url,
+ "Aux Reference 1": hero_url,
+ "Aux Reference 2": hero_url,
}
def download(url, dest):
@@ -125,7 +129,7 @@ def download(url, dest):
{"label": "Holiday gift", "headline": "Make hers unforgettable", "subhead": "From the icon to the everyday", "cta": "Shop the collection"},
{"label": "Fragrance loyalist", "headline": "Your signature, refined", "subhead": "Three icons, one collection", "cta": "Discover"},
],
- "formats": ["1:1", "9:16"],
+ "formats": ["1:1", "9:16", "4:5"],
},
{
"id": "runflow",
@@ -136,7 +140,7 @@ def download(url, dest):
{"label": "Performance marketer", "headline": "Variants overnight, on-brand", "subhead": "Cut creative-refresh costs by 4x", "cta": "Get started"},
{"label": "Indie founder", "headline": "Ship the ad today", "subhead": "From one hero to a full set", "cta": "Try Runflow"},
],
- "formats": ["16:9", "4:5"],
+ "formats": ["16:9", "4:5", "1:1"],
},
{
"id": "ikea",
@@ -147,7 +151,7 @@ def download(url, dest):
{"label": "Performance marketer", "headline": "Variants overnight, on-brand", "subhead": "Cut creative-refresh costs by 4x", "cta": "Get started"},
{"label": "Indie founder", "headline": "Ship the ad today", "subhead": "From one hero to a full set", "cta": "Try Runflow"},
],
- "formats": ["9:16", "16:9"],
+ "formats": ["9:16", "16:9", "4:5"],
},
]