{
  "schemaVersion": "1.0",
  "item": {
    "slug": "ad-designer",
    "name": "Ad Designer",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/baitoxkevin/ad-designer",
    "canonicalUrl": "https://clawhub.ai/baitoxkevin/ad-designer",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/ad-designer",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=ad-designer",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/prompt-templates.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/ad-designer"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/ad-designer",
    "agentPageUrl": "https://openagent3.xyz/skills/ad-designer/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ad-designer/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ad-designer/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Ad Designer",
        "body": "Generate marketing ad images from campaign-planner creative briefs. Wrap nano-banana-pro with brand-aware prompt construction, aspect ratio handling, and a self-review loop that catches quality issues before marking images final."
      },
      {
        "title": "Roles",
        "body": "Ad Designer (this skill) — sole executor\nnano-banana-pro — image generation engine (upstream dependency)\ncampaign-planner — upstream source of creative briefs\nbrand-bible-builder — upstream source of brand visual identity"
      },
      {
        "title": "Prerequisites",
        "body": "Verify before starting:\n\ncommand -v uv\ntest -n \"$GEMINI_API_KEY\"\ntest -f ~/.codex/skills/nano-banana-pro/scripts/generate_image.py\n\nIf uv is missing: tell the user to install it with curl -LsSf https://astral.sh/uv/install.sh | sh.\nIf GEMINI_API_KEY is unset: tell the user to export it from Google AI Studio.\nIf the script is missing: tell the user the nano-banana-pro skill must be installed first."
      },
      {
        "title": "Step 1: Collect Inputs",
        "body": "Identify which inputs are present in the conversation or filesystem:\n\nInputSourceWhere to find itCreative brief(s)campaign-planner skill/tmp/marketing/campaigns/<brand>-campaign-plan.json → ad_creatives[] array, or inline in conversationBrand biblebrand-bible-builder skill/tmp/marketing/brands/<brand>/brand-bible.md or inlineAspect ratioUser or briefDefaults to 1:1 if not specifiedResolution modeUserDefaults to draft (1K) unless user says \"final\" or \"4K\"\n\nIf the creative brief is missing, ask:\n\n\"I need a creative brief to generate the ad. Run /campaign-planner first, or paste the brief details: headline, visual direction, CTA, and target audience.\"\n\nIf the brand bible is missing, proceed with neutral visual defaults — note this in the output and recommend running /brand-bible-builder for on-brand results."
      },
      {
        "title": "Step 2: Read Brand Bible Visual Identity",
        "body": "Open the brand bible and extract these fields into a working reference:\n\nPrimary colors — hex codes or descriptors (e.g. #1A2E5A deep navy, #F5A623 amber)\nSecondary / accent colors — supporting palette\nFont style — serif vs sans-serif, weight, mood descriptor (e.g. \"bold geometric sans\", \"light editorial serif\")\nImagery style — photography vs illustration, lifestyle vs product-only, color grading mood (warm/cool/muted/vibrant)\nLayout pattern — minimal and clean vs content-dense, whitespace-heavy vs layered\nTone — formal, casual, bold, playful, premium, approachable\n\nKeep this as a 6-field internal reference. Do not show it to the user. Use it when constructing prompts in Step 3."
      },
      {
        "title": "Step 3: Construct Image Generation Prompt",
        "body": "Apply these rules every time. They are non-negotiable."
      },
      {
        "title": "Core Rules (from best-practice image generation)",
        "body": "Rule 1 — Less is more. Short, focused prompts outperform long descriptive ones. Target 15–30 words for the visual description. Cut adjectives that repeat the same idea.\n\nRule 2 — No logos, brand names, or company names. Never include the brand name, product name, logo description, or any trademark in the prompt. The generation engine hallucinates these badly and they must be added in post-production.\n\nRule 3 — Only include text that is explicitly specified. If the brief specifies a headline to appear in the image, include it exactly as written — no paraphrasing. If no text is specified, do not add any text to the prompt. Do not include CTAs, taglines, or copy unless the brief explicitly says to render text.\n\nRule 4 — Describe emotion and composition, not data. Instead of \"a woman saving money on her bills,\" write \"confident woman, bright home office, warm morning light, relaxed expression.\" The emotion communicates the message; the model handles the rest.\n\nRule 5 — Translate brand colors without naming the brand. Convert hex codes to descriptors: #1A2E5A → \"deep navy\", #F5A623 → \"warm amber\". Use these color words in the prompt naturally."
      },
      {
        "title": "Prompt Construction Formula",
        "body": "Assemble the prompt in this order:\n\n[SUBJECT] — who or what is the focal element\n[SETTING] — environment or background context\n[MOOD / EMOTION] — feeling the image should evoke\n[COMPOSITION] — framing, shot type, perspective\n[LIGHTING] — quality and direction of light\n[COLOR PALETTE] — 2–3 colors derived from brand bible\n[STYLE] — photography/illustration style from brand bible\n[AVOID] — explicit exclusions (text, logos, clutter, etc.)\n\nDo not use all 8 fields every time. Use only those relevant to the brief. A 5-field prompt is often stronger than an 8-field one."
      },
      {
        "title": "Example Construction",
        "body": "Brief input:\n\nheadline: \"Finally, sleep that works\"\nvisual_direction: \"Woman waking up refreshed, natural light bedroom\"\ncta: \"Try free tonight\"\ntarget_persona: \"Aisha, 28, KL, stressed professional\"\n\nBrand bible: warm coral #E8735A, off-white #FAF7F2, editorial sans-serif, warm and minimal photography style.\n\nConstructed prompt:\n\nYoung woman waking up peacefully, sunlit minimalist bedroom, linen textures,\nwarm coral and off-white tones, soft morning light through sheer curtains,\nclose-up on relaxed expression, warm editorial photography style\n\nWhat was excluded: brand name, CTA text, product name, headline text (no text was specified for visual rendering)."
      },
      {
        "title": "Step 4: Select Aspect Ratio",
        "body": "Map the brief's platform or format to the correct ratio flag and pixel dimensions:\n\nPlatform / FormatRatioPixel DimensionsUse CaseInstagram / Facebook Feed1:11080 × 1080Square feed postInstagram Story / Reel9:161080 × 1920Full-screen verticalFacebook Feed (portrait)4:51080 × 1350Taller feed post, more screen areaYouTube / LinkedIn Cover16:91920 × 1080Landscape / banner\n\nIf the brief does not specify a platform, default to 1:1.\n\nFor carousel ads: generate all cards at the same ratio. Use 1:1 unless the brief specifies otherwise.\n\nPass the ratio to the script via --resolution. The nano-banana-pro script handles internal sizing. Generate at 1K for drafts, 4K for finals."
      },
      {
        "title": "Step 5: Generate Images",
        "body": "Create the output directory:\n\nmkdir -p /tmp/marketing/assets/images"
      },
      {
        "title": "Single image generation",
        "body": "Use this command pattern. Always use absolute path for the script.\n\nuv run ~/.codex/skills/nano-banana-pro/scripts/generate_image.py \\\n  --prompt \"<constructed prompt>\" \\\n  --filename \"/tmp/marketing/assets/images/<timestamp>-<brief-id>-draft.png\" \\\n  --resolution 1K\n\nFilename format: yyyy-mm-dd-hh-mm-ss-<brief-id>-draft.png\n\nbrief-id: lowercase kebab-case derived from the brief headline (e.g. finally-sleep-works)\nUse current date/time for timestamp"
      },
      {
        "title": "Draft-first workflow",
        "body": "Always follow this sequence:\n\nDraft at 1K — generate first at 1K for fast feedback. Present to user.\nIterate — if issues found in self-review (Step 6), adjust prompt and regenerate at 1K. Max 3 attempts.\nFinal at 4K — only after user approves the draft or after self-review passes. Change filename suffix from -draft to -final, set --resolution 4K."
      },
      {
        "title": "Carousel ads",
        "body": "Generate each card as a separate image. Naming convention:\n\nyyyy-mm-dd-hh-mm-ss-<brief-id>-card-01-draft.png\nyyyy-mm-dd-hh-mm-ss-<brief-id>-card-02-draft.png\n\nEnsure visual consistency across cards:\n\nUse the same color palette descriptor in every card's prompt\nUse the same style descriptor in every card's prompt\nUse the same lighting descriptor in every card's prompt\nVary only the subject and composition per card"
      },
      {
        "title": "Step 6: Self-Review Loop (CRITICAL)",
        "body": "After generating each image, perform a structured self-review before presenting to the user. Do not skip this step.\n\nRun through this checklist for every generated image:\n\nCheckPass ConditionFail ActionText accuracyAny specified text appears correctly and is readableSimplify prompt; add explicit text instructionNo hallucinated logosNo brand marks, wordmarks, icons, or watermarks visibleAdd \"no logos, no text, no watermarks\" to avoid clauseNo hallucinated brand namesNo company names or product names rendered as textAdd \"no brand names, no product names\" to avoid clauseAspect ratioMatches requested formatRe-run with correct ratio flagColor alignmentDominant colors match brand palette intentStrengthen color descriptors in promptOverall qualityImage is coherent, professional, on-briefRebuild prompt from scratch using simpler structure"
      },
      {
        "title": "Fail response",
        "body": "If any check fails:\n\nIdentify the specific failure from the table above.\nApply the corresponding fail action to the prompt.\nRegenerate at 1K.\nRe-run the self-review checklist on the new image.\nStop after 3 total attempts. If still failing on attempt 3, present the best result to the user with a note explaining what the issue is and what was tried.\n\nDo not present a failing image silently. Always tell the user what was wrong and what fix was applied."
      },
      {
        "title": "Step 7: HITL — Present for User Review",
        "body": "After self-review passes (or after 3 attempts), present the results:\n\nAd image(s) generated for: [brief headline]\n\nDraft(s) saved to /tmp/marketing/assets/images/:\n  [timestamp]-[brief-id]-draft.png   ← [ratio] | 1K\n\nSelf-review: [PASS / notes on any issues found and fixed]\n\nReview the image and reply with one of:\n  A) Approve → I'll upscale to 4K final\n  B) Adjust → describe what to change\n  C) Skip → move to next brief\n\nWait for the user's response before generating the 4K final or moving to the next brief.\n\nIf the user says \"adjust\" or describes changes:\n\nApply the change to the prompt (keep changes minimal — one diff at a time)\nRegenerate at 1K\nRe-run self-review\nPresent again\n\nIf the user approves:\n\nRegenerate at 4K with -final filename suffix\nConfirm: \"Final saved: /tmp/marketing/assets/images/[filename]-final.png\""
      },
      {
        "title": "Step 8: Process Multiple Briefs",
        "body": "If the input contains multiple briefs (e.g. from a campaign-planner JSON with 3–5 image ad entries), process them sequentially. Complete the full cycle (generate → self-review → HITL approval → final) for each brief before moving to the next.\n\nAfter all briefs are processed, present a summary:\n\nAll ad images complete.\n\nGenerated:\n  /tmp/marketing/assets/images/[file-1]-final.png   [ratio]\n  /tmp/marketing/assets/images/[file-2]-final.png   [ratio]\n  /tmp/marketing/assets/images/[file-3]-final.png   [ratio]\n\nNext step: run /meta-ads-publisher to upload these to your ad account,\nor /campaign-planner to review the full campaign."
      },
      {
        "title": "Error Handling",
        "body": "ErrorActionError: No API key provided.Tell user to run export GEMINI_API_KEY=<key> and retryError loading input image:Verify the --input-image path exists; fix path and retryquota / 403 / permission API errorWrong key or quota exceeded; ask user to check Google AI Studio quotaScript not found at ~/.codex/skills/...nano-banana-pro skill is not installed; tell user to install it from ClawHubuv: command not foundRun `curl -LsSf https://astral.sh/uv/install.shImage generation returns blank/emptyPrompt may be too restrictive; remove avoid clauses and simplify to subject + style only"
      },
      {
        "title": "File Paths Reference",
        "body": "/tmp/marketing/\n├── assets/\n│   └── images/\n│       ├── yyyy-mm-dd-hh-mm-ss-<brief-id>-draft.png    ← draft outputs\n│       └── yyyy-mm-dd-hh-mm-ss-<brief-id>-final.png    ← approved 4K finals\n├── brands/<brand>/\n│   └── brand-bible.md                                   ← brand visual reference\n└── campaigns/\n    └── <brand>-campaign-plan.json                       ← input brief source"
      }
    ],
    "body": "Ad Designer\n\nGenerate marketing ad images from campaign-planner creative briefs. Wrap nano-banana-pro with brand-aware prompt construction, aspect ratio handling, and a self-review loop that catches quality issues before marking images final.\n\nRoles\nAd Designer (this skill) — sole executor\nnano-banana-pro — image generation engine (upstream dependency)\ncampaign-planner — upstream source of creative briefs\nbrand-bible-builder — upstream source of brand visual identity\nPrerequisites\n\nVerify before starting:\n\ncommand -v uv\ntest -n \"$GEMINI_API_KEY\"\ntest -f ~/.codex/skills/nano-banana-pro/scripts/generate_image.py\n\n\nIf uv is missing: tell the user to install it with curl -LsSf https://astral.sh/uv/install.sh | sh. If GEMINI_API_KEY is unset: tell the user to export it from Google AI Studio. If the script is missing: tell the user the nano-banana-pro skill must be installed first.\n\nStep 1: Collect Inputs\n\nIdentify which inputs are present in the conversation or filesystem:\n\nInput\tSource\tWhere to find it\nCreative brief(s)\tcampaign-planner skill\t/tmp/marketing/campaigns/<brand>-campaign-plan.json → ad_creatives[] array, or inline in conversation\nBrand bible\tbrand-bible-builder skill\t/tmp/marketing/brands/<brand>/brand-bible.md or inline\nAspect ratio\tUser or brief\tDefaults to 1:1 if not specified\nResolution mode\tUser\tDefaults to draft (1K) unless user says \"final\" or \"4K\"\n\nIf the creative brief is missing, ask:\n\n\"I need a creative brief to generate the ad. Run /campaign-planner first, or paste the brief details: headline, visual direction, CTA, and target audience.\"\n\nIf the brand bible is missing, proceed with neutral visual defaults — note this in the output and recommend running /brand-bible-builder for on-brand results.\n\nStep 2: Read Brand Bible Visual Identity\n\nOpen the brand bible and extract these fields into a working reference:\n\nPrimary colors — hex codes or descriptors (e.g. #1A2E5A deep navy, #F5A623 amber)\nSecondary / accent colors — supporting palette\nFont style — serif vs sans-serif, weight, mood descriptor (e.g. \"bold geometric sans\", \"light editorial serif\")\nImagery style — photography vs illustration, lifestyle vs product-only, color grading mood (warm/cool/muted/vibrant)\nLayout pattern — minimal and clean vs content-dense, whitespace-heavy vs layered\nTone — formal, casual, bold, playful, premium, approachable\n\nKeep this as a 6-field internal reference. Do not show it to the user. Use it when constructing prompts in Step 3.\n\nStep 3: Construct Image Generation Prompt\n\nApply these rules every time. They are non-negotiable.\n\nCore Rules (from best-practice image generation)\n\nRule 1 — Less is more. Short, focused prompts outperform long descriptive ones. Target 15–30 words for the visual description. Cut adjectives that repeat the same idea.\n\nRule 2 — No logos, brand names, or company names. Never include the brand name, product name, logo description, or any trademark in the prompt. The generation engine hallucinates these badly and they must be added in post-production.\n\nRule 3 — Only include text that is explicitly specified. If the brief specifies a headline to appear in the image, include it exactly as written — no paraphrasing. If no text is specified, do not add any text to the prompt. Do not include CTAs, taglines, or copy unless the brief explicitly says to render text.\n\nRule 4 — Describe emotion and composition, not data. Instead of \"a woman saving money on her bills,\" write \"confident woman, bright home office, warm morning light, relaxed expression.\" The emotion communicates the message; the model handles the rest.\n\nRule 5 — Translate brand colors without naming the brand. Convert hex codes to descriptors: #1A2E5A → \"deep navy\", #F5A623 → \"warm amber\". Use these color words in the prompt naturally.\n\nPrompt Construction Formula\n\nAssemble the prompt in this order:\n\n[SUBJECT] — who or what is the focal element\n[SETTING] — environment or background context\n[MOOD / EMOTION] — feeling the image should evoke\n[COMPOSITION] — framing, shot type, perspective\n[LIGHTING] — quality and direction of light\n[COLOR PALETTE] — 2–3 colors derived from brand bible\n[STYLE] — photography/illustration style from brand bible\n[AVOID] — explicit exclusions (text, logos, clutter, etc.)\n\n\nDo not use all 8 fields every time. Use only those relevant to the brief. A 5-field prompt is often stronger than an 8-field one.\n\nExample Construction\n\nBrief input:\n\nheadline: \"Finally, sleep that works\"\nvisual_direction: \"Woman waking up refreshed, natural light bedroom\"\ncta: \"Try free tonight\"\ntarget_persona: \"Aisha, 28, KL, stressed professional\"\n\n\nBrand bible: warm coral #E8735A, off-white #FAF7F2, editorial sans-serif, warm and minimal photography style.\n\nConstructed prompt:\n\nYoung woman waking up peacefully, sunlit minimalist bedroom, linen textures,\nwarm coral and off-white tones, soft morning light through sheer curtains,\nclose-up on relaxed expression, warm editorial photography style\n\n\nWhat was excluded: brand name, CTA text, product name, headline text (no text was specified for visual rendering).\n\nStep 4: Select Aspect Ratio\n\nMap the brief's platform or format to the correct ratio flag and pixel dimensions:\n\nPlatform / Format\tRatio\tPixel Dimensions\tUse Case\nInstagram / Facebook Feed\t1:1\t1080 × 1080\tSquare feed post\nInstagram Story / Reel\t9:16\t1080 × 1920\tFull-screen vertical\nFacebook Feed (portrait)\t4:5\t1080 × 1350\tTaller feed post, more screen area\nYouTube / LinkedIn Cover\t16:9\t1920 × 1080\tLandscape / banner\n\nIf the brief does not specify a platform, default to 1:1.\n\nFor carousel ads: generate all cards at the same ratio. Use 1:1 unless the brief specifies otherwise.\n\nPass the ratio to the script via --resolution. The nano-banana-pro script handles internal sizing. Generate at 1K for drafts, 4K for finals.\n\nStep 5: Generate Images\n\nCreate the output directory:\n\nmkdir -p /tmp/marketing/assets/images\n\nSingle image generation\n\nUse this command pattern. Always use absolute path for the script.\n\nuv run ~/.codex/skills/nano-banana-pro/scripts/generate_image.py \\\n  --prompt \"<constructed prompt>\" \\\n  --filename \"/tmp/marketing/assets/images/<timestamp>-<brief-id>-draft.png\" \\\n  --resolution 1K\n\n\nFilename format: yyyy-mm-dd-hh-mm-ss-<brief-id>-draft.png\n\nbrief-id: lowercase kebab-case derived from the brief headline (e.g. finally-sleep-works)\nUse current date/time for timestamp\nDraft-first workflow\n\nAlways follow this sequence:\n\nDraft at 1K — generate first at 1K for fast feedback. Present to user.\nIterate — if issues found in self-review (Step 6), adjust prompt and regenerate at 1K. Max 3 attempts.\nFinal at 4K — only after user approves the draft or after self-review passes. Change filename suffix from -draft to -final, set --resolution 4K.\nCarousel ads\n\nGenerate each card as a separate image. Naming convention:\n\nyyyy-mm-dd-hh-mm-ss-<brief-id>-card-01-draft.png\nyyyy-mm-dd-hh-mm-ss-<brief-id>-card-02-draft.png\n\n\nEnsure visual consistency across cards:\n\nUse the same color palette descriptor in every card's prompt\nUse the same style descriptor in every card's prompt\nUse the same lighting descriptor in every card's prompt\nVary only the subject and composition per card\nStep 6: Self-Review Loop (CRITICAL)\n\nAfter generating each image, perform a structured self-review before presenting to the user. Do not skip this step.\n\nRun through this checklist for every generated image:\n\nCheck\tPass Condition\tFail Action\nText accuracy\tAny specified text appears correctly and is readable\tSimplify prompt; add explicit text instruction\nNo hallucinated logos\tNo brand marks, wordmarks, icons, or watermarks visible\tAdd \"no logos, no text, no watermarks\" to avoid clause\nNo hallucinated brand names\tNo company names or product names rendered as text\tAdd \"no brand names, no product names\" to avoid clause\nAspect ratio\tMatches requested format\tRe-run with correct ratio flag\nColor alignment\tDominant colors match brand palette intent\tStrengthen color descriptors in prompt\nOverall quality\tImage is coherent, professional, on-brief\tRebuild prompt from scratch using simpler structure\nFail response\n\nIf any check fails:\n\nIdentify the specific failure from the table above.\nApply the corresponding fail action to the prompt.\nRegenerate at 1K.\nRe-run the self-review checklist on the new image.\nStop after 3 total attempts. If still failing on attempt 3, present the best result to the user with a note explaining what the issue is and what was tried.\n\nDo not present a failing image silently. Always tell the user what was wrong and what fix was applied.\n\nStep 7: HITL — Present for User Review\n\nAfter self-review passes (or after 3 attempts), present the results:\n\nAd image(s) generated for: [brief headline]\n\nDraft(s) saved to /tmp/marketing/assets/images/:\n  [timestamp]-[brief-id]-draft.png   ← [ratio] | 1K\n\nSelf-review: [PASS / notes on any issues found and fixed]\n\nReview the image and reply with one of:\n  A) Approve → I'll upscale to 4K final\n  B) Adjust → describe what to change\n  C) Skip → move to next brief\n\n\nWait for the user's response before generating the 4K final or moving to the next brief.\n\nIf the user says \"adjust\" or describes changes:\n\nApply the change to the prompt (keep changes minimal — one diff at a time)\nRegenerate at 1K\nRe-run self-review\nPresent again\n\nIf the user approves:\n\nRegenerate at 4K with -final filename suffix\nConfirm: \"Final saved: /tmp/marketing/assets/images/[filename]-final.png\"\nStep 8: Process Multiple Briefs\n\nIf the input contains multiple briefs (e.g. from a campaign-planner JSON with 3–5 image ad entries), process them sequentially. Complete the full cycle (generate → self-review → HITL approval → final) for each brief before moving to the next.\n\nAfter all briefs are processed, present a summary:\n\nAll ad images complete.\n\nGenerated:\n  /tmp/marketing/assets/images/[file-1]-final.png   [ratio]\n  /tmp/marketing/assets/images/[file-2]-final.png   [ratio]\n  /tmp/marketing/assets/images/[file-3]-final.png   [ratio]\n\nNext step: run /meta-ads-publisher to upload these to your ad account,\nor /campaign-planner to review the full campaign.\n\nError Handling\nError\tAction\nError: No API key provided.\tTell user to run export GEMINI_API_KEY=<key> and retry\nError loading input image:\tVerify the --input-image path exists; fix path and retry\nquota / 403 / permission API error\tWrong key or quota exceeded; ask user to check Google AI Studio quota\nScript not found at ~/.codex/skills/...\tnano-banana-pro skill is not installed; tell user to install it from ClawHub\nuv: command not found\tRun `curl -LsSf https://astral.sh/uv/install.sh\nImage generation returns blank/empty\tPrompt may be too restrictive; remove avoid clauses and simplify to subject + style only\nFile Paths Reference\n/tmp/marketing/\n├── assets/\n│   └── images/\n│       ├── yyyy-mm-dd-hh-mm-ss-<brief-id>-draft.png    ← draft outputs\n│       └── yyyy-mm-dd-hh-mm-ss-<brief-id>-final.png    ← approved 4K finals\n├── brands/<brand>/\n│   └── brand-bible.md                                   ← brand visual reference\n└── campaigns/\n    └── <brand>-campaign-plan.json                       ← input brief source"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/baitoxkevin/ad-designer",
    "publisherUrl": "https://clawhub.ai/baitoxkevin/ad-designer",
    "owner": "baitoxkevin",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/ad-designer",
    "downloadUrl": "https://openagent3.xyz/downloads/ad-designer",
    "agentUrl": "https://openagent3.xyz/skills/ad-designer/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ad-designer/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ad-designer/agent.md"
  }
}