diff --git a/projects/judge-dashboard/api/submit-ratings.mjs b/projects/judge-dashboard/api/submit-ratings.mjs
index f984d9f..f91ce6e 100644
--- a/projects/judge-dashboard/api/submit-ratings.mjs
+++ b/projects/judge-dashboard/api/submit-ratings.mjs
@@ -50,16 +50,21 @@ export default async function handler(req, res) {
const r = rated[idx];
try {
const tile = `H${r.hero_idx ?? "?"}·C${r.cut_idx ?? "?"}·${r.format ?? "?"}`;
- let fileUploadId = null;
- if (r.image) {
- fileUploadId = await uploadImageToNotion(notionKey, r.image, `${tile}.png`);
- }
+ // Upload both the rated output AND the input hero in parallel so Goke
+ // can correlate ratings back to what the workflow actually saw.
+ const [fileUploadId, heroFileUploadId] = await Promise.all([
+ r.image ? uploadImageToNotion(notionKey, r.image, `${tile}-output.png`) : null,
+ r.hero_url ? uploadImageToNotion(notionKey, r.hero_url, `${tile}-hero.png`).catch(e => { console.warn(`hero upload failed for ${tile}:`, e?.message); return null; }) : null,
+ ]);
const page = await createNotionPage(notionKey, databaseId, {
voter: judge,
company,
vote: r.rating,
feedback: (r.feedback || "").trim(),
fileUploadId,
+ heroFileUploadId,
+ heroSourceUrl: r.hero_url || "",
+ prompt: (r.prompt || "").trim(),
sourceUrl: r.image || "",
tile,
briefLabel,
@@ -154,6 +159,8 @@ async function createNotionPage(token, databaseId, row) {
if (row.tile) properties["Tile"] = { rich_text: [{ text: { content: row.tile } }] };
if (row.briefLabel) properties["Brief label"] = { rich_text: [{ text: { content: row.briefLabel } }] };
if (row.sourceUrl) properties["Source URL"] = { url: row.sourceUrl };
+ if (row.heroSourceUrl) properties["Hero source URL"] = { url: row.heroSourceUrl };
+ if (row.prompt) properties["Prompt"] = { rich_text: [{ text: { content: row.prompt.slice(0, 1900) } }] };
if (row.costUsd != null) properties["Cost USD"] = { number: row.costUsd };
if (row.runtimeSeconds != null) properties["Runtime s"] = { number: row.runtimeSeconds };
if (row.fileUploadId) {
@@ -161,6 +168,11 @@ async function createNotionPage(token, databaseId, row) {
files: [{ name: row.tile || "image", type: "file_upload", file_upload: { id: row.fileUploadId } }],
};
}
+ if (row.heroFileUploadId) {
+ properties["Hero image"] = {
+ files: [{ name: `${row.tile || "hero"}-hero`, type: "file_upload", file_upload: { id: row.heroFileUploadId } }],
+ };
+ }
const res = await fetch(`${NOTION_API_BASE}/pages`, {
method: "POST",
headers: notionHeaders(token, true),
diff --git a/projects/judge-dashboard/index.html b/projects/judge-dashboard/index.html
index 0d3d869..53fd134 100644
--- a/projects/judge-dashboard/index.html
+++ b/projects/judge-dashboard/index.html
@@ -1678,24 +1678,24 @@
Step 5: Generate variants
brandLogo: { preview_url: `${PRESET_ASSET_BASE}/chanel/logo.png`, runflow_uri: `${PRESET_ASSET_BASE}/chanel/logo.png`, filename: "logo.png" }
},
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": 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": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/chanel/runs/h3-c2-4x5.jpg", "cost": 0.026492, "duration_ms": 37290}
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"},
+ {"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": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Make hers unforgettable\". Subhead text: \"From the icon to the everyday\". Call to action: \"Shop the collection\". Audience: Holiday gift. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"},
+ {"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": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Your signature, refined\". Subhead text: \"Three icons, one collection\". Call to action: \"Discover\". Audience: Fragrance loyalist. Primary brand color: #09090B. Use the typography of: Couture. Visual tone: premium. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/chanel/hero3.jpg"}
]
},
{
@@ -1719,24 +1719,24 @@ Step 5: Generate variants
brandLogo: { preview_url: `${PRESET_ASSET_BASE}/runflow/logo.png`, runflow_uri: `${PRESET_ASSET_BASE}/runflow/logo.png`, filename: "logo.png" }
},
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": "1:1", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/runflow/runs/h3-c2-1x1.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/runflow/runs/h1-c1-16x9.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"},
+ {"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": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"},
+ {"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": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #09090B. Secondary brand color: #FBBF24. Use the typography of: Bricolage Grotesque. Visual tone: minimal. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/runflow/hero3.jpg"}
]
},
{
@@ -1760,24 +1760,24 @@ Step 5: Generate variants
brandLogo: { preview_url: `${PRESET_ASSET_BASE}/ikea/logo.jpg`, runflow_uri: `${PRESET_ASSET_BASE}/ikea/logo.jpg`, filename: "logo.jpg" }
},
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": "4:5", "status": "succeeded", "image": "https://templates.runflow.io/judge-dashboard/presets/ikea/runs/h3-c2-4x5.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/ikea/runs/h1-c1-9x16.jpg", "cost": null, "duration_ms": null, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero1.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero2.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Variants overnight, on-brand\". Subhead text: \"Cut creative-refresh costs by 4x\". Call to action: \"Get started\". Audience: Performance marketer. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"},
+ {"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, "prompt": "Produce a brand-locked ad variant from the provided primary design reference. Headline text: \"Ship the ad today\". Subhead text: \"From one hero to a full set\". Call to action: \"Try Runflow\". Audience: Indie founder. Primary brand color: #0058A3. Secondary brand color: #FFDB00. Use the typography of: Noto Sans. Visual tone: playful. Place the provided logo in a prominent corner safe zone. Preserve the focal subject from the primary design reference. Avoid warped text or floating overlays.", "hero_url": "https://templates.runflow.io/judge-dashboard/presets/ikea/hero3.jpg"}
]
}
];
@@ -1972,6 +1972,8 @@ Step 5: Generate variants
status: r.image || r.local_image ? "succeeded" : "failed",
cost: r.cost ?? null,
duration_ms: r.duration_ms ?? null,
+ prompt: r.prompt || null,
+ hero_url: r.hero_url || p.uploads?.[`hero${r.hero_idx}`]?.preview_url || null,
}));
const payload = {
id: batchId,
@@ -2912,6 +2914,8 @@ Step 5: Generate variants
image: r.image, cost: r.cost, duration_ms: r.duration_ms,
rating: LIKES[r.id] || null,
feedback: FEEDBACK[r.id] || null,
+ prompt: r.prompt || r.payload?.prompt || null,
+ hero_url: r.hero_url || r.payload?.primary_design_ref || null,
})),
};
try {
diff --git a/projects/judge-dashboard/tools/build-presets.py b/projects/judge-dashboard/tools/build-presets.py
index 1dd149f..439c183 100644
--- a/projects/judge-dashboard/tools/build-presets.py
+++ b/projects/judge-dashboard/tools/build-presets.py
@@ -158,7 +158,7 @@ def download(url, dest):
def main():
# Phase 1: submit every (hero × cut × format) in parallel — Runflow handles
# the queue, we just collect run_ids and poll them as a batch afterwards.
- jobs = [] # list of dicts: pid, hi, ci, fmt, run_id
+ jobs = [] # list of dicts: pid, hi, ci, fmt, run_id, prompt, hero_url
for p in PRESETS:
pid = p["id"]
pdir = PRESETS_DIR / pid
@@ -172,11 +172,7 @@ def main():
if (pdir / "runs" / local_name).exists():
print(f" ⏭ {pid} h{hi}c{ci}{fmt}: already on disk, skip")
continue
- payload = build_payload(
- hero_url, fmt, cut, p["brand"], logo_url,
- hero_urls[1] if len(hero_urls) > 1 else hero_url,
- hero_urls[2] if len(hero_urls) > 2 else hero_url,
- )
+ payload = build_payload(hero_url, fmt, cut, p["brand"], logo_url)
try:
sub = submit(payload)
rid = sub.get("run_id") or sub.get("id")
@@ -184,7 +180,10 @@ def main():
print(f" ✗ {pid} h{hi}c{ci}{fmt}: submit had no run id")
continue
print(f" → {pid} h{hi}c{ci}{fmt}: submitted {rid}")
- jobs.append({"pid": pid, "hi": hi, "ci": ci, "fmt": fmt, "run_id": rid})
+ jobs.append({
+ "pid": pid, "hi": hi, "ci": ci, "fmt": fmt, "run_id": rid,
+ "prompt": payload["prompt"], "hero_url": hero_url,
+ })
except Exception as e:
print(f" ✗ {pid} h{hi}c{ci}{fmt}: submit error: {e}")
print(f"\nsubmitted {len(jobs)} runs, polling…\n")
@@ -231,27 +230,35 @@ def poll_job(job):
results_by_key[key] = {**r, "status": "succeeded", "image": img_url, "cost": float(final.get("cost") or 0) or None, "duration_ms": final.get("duration_ms")}
print(f" ⚠ {key}: download failed: {e}")
- # Phase 3: assemble output by preset.
+ # Phase 3: assemble output by preset. Every tile gets the prompt + hero_url
+ # that produced it so Goke can correlate ratings to inputs in Notion.
out_presets = []
for p in PRESETS:
pid = p["id"]
+ hero_urls = [f"{ASSET_BASE}/{pid}/{f}" for f in p["heroes"]]
+ logo_url = f"{ASSET_BASE}/{pid}/{p['logo']}" if p.get("logo") else ""
runs = []
for hi in range(1, len(p["heroes"]) + 1):
for ci in range(1, len(p["cuts"]) + 1):
for fmt in p["formats"]:
key = f"{pid}/h{hi}c{ci}{fmt}"
r = results_by_key.get(key, {})
- # Fall back to disk if a prior pass already saved this combo.
local_name = f"h{hi}-c{ci}-{fmt.replace(':','x')}.jpg"
local_path = PRESETS_DIR / pid / "runs" / local_name
if not r and local_path.exists():
r = {"status": "succeeded", "image": f"{ASSET_BASE}/{pid}/runs/{local_name}"}
+ # Reconstruct the prompt + hero_url deterministically from
+ # the preset definition so skipped tiles get the right
+ # context (build_payload is pure given the same inputs).
+ payload = build_payload(hero_urls[hi-1], fmt, p["cuts"][ci-1], p["brand"], logo_url)
runs.append({
"hero_idx": hi, "cut_idx": ci, "format": fmt,
"status": r.get("status") or "failed",
"image": r.get("image"),
"cost": r.get("cost"),
"duration_ms": r.get("duration_ms"),
+ "prompt": payload["prompt"],
+ "hero_url": hero_urls[hi-1],
})
out_presets.append({"id": pid, "runs": runs})
pathlib.Path("/tmp/presets-output.json").write_text(json.dumps(out_presets, indent=2))