[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-openai-adobe-retouch-portraits":3,"mdc--udyu6c-key":33,"related-org-openai-adobe-retouch-portraits":4613,"related-repo-openai-adobe-retouch-portraits":4817},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":31,"mdContent":32},"adobe-retouch-portraits","batch retouch portrait photos","Bulk-retouch a folder of portrait photos using Adobe tools — designed for wedding photographers and event photographers who need fast, walk-away batch processing. Use this skill when the user says \"retouch my photos\", \"batch process these portraits\", \"process my wedding photos\", \"clean up this folder of images\", \"run my headshots through Adobe\", or uploads\u002Fselects a folder of photos and wants them polished and ready to review. Automatically applies auto-straighten, auto-tone, and auto-light to every image. Outputs a preview grid and download folder. Access: 🔐 Signed-In required | Gen AI: ❌ by default — optional background-only cleanup only where the surface permits generative AI (e.g. Codex); none on Claude\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"openai","OpenAI","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fopenai.png",[12,16,19],{"name":13,"slug":14,"type":15},"Creative","creative","tag",{"name":17,"slug":18,"type":15},"Photography","photography",{"name":20,"slug":21,"type":15},"Imaging","imaging",4888,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins","2026-08-28T15:09:10.386974","Apache-2.0",661,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":30},[],"OpenAI Plugins","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins\u002Ftree\u002FHEAD\u002Fplugins\u002Fadobe\u002Fskills\u002Fadobe-retouch-portraits","---\nname: adobe-retouch-portraits\ndescription: >\n  Bulk-retouch a folder of portrait photos using Adobe tools —\n  designed for wedding photographers and event photographers who need fast,\n  walk-away batch processing. Use this skill when the user says \"retouch my\n  photos\", \"batch process these portraits\", \"process my wedding photos\",\n  \"clean up this folder of images\", \"run my headshots through Adobe\", or\n  uploads\u002Fselects a folder of photos and wants them polished and ready to\n  review. Automatically applies auto-straighten, auto-tone, and auto-light\n  to every image. Outputs a preview grid and download folder.\n  Access: 🔐 Signed-In required | Gen AI: ❌ by default — optional background-only cleanup only where the surface permits generative AI (e.g. Codex); none on Claude\nlicense: Apache-2.0\ncompatibility: \"Runs on both widget-capable surfaces (e.g. Claude Cowork, which supports the asset_add_file picker and asset_preview_file preview widgets) and non-UI agents (e.g. Codex, where those widgets are unavailable). The default flow uses the widgets; each widget step has a text-only fallback. Local files are staged to Creative Cloud first; raw local paths are never passed to image tools.\"\nallowed-tools: adobe_mandatory_init image_list_presets asset_add_file read_widget_context asset_initialize_file_upload asset_finalize_file_upload asset_preview_file image_auto_straighten image_apply_auto_tone image_apply_adjustments image_select_subject image_apply_preset image_apply_lens_blur image_apply_gaussian_blur image_crop_and_resize image_fill_area create_firefly_board\nmetadata:\n  version: 3.1.0\n  visibility: public\n  surface: [claude, codex]\n---\n\n# Adobe Retouch Portraits\n\nA walk-away bulk retouching pipeline for photographers. The user selects their\nimages, optionally adds tweaks, and the agent runs the full batch using Adobe\nfor creativity tools.\n\n> **Surface note:** The default flow uses Adobe's MCP App widgets — the `asset_add_file` picker (Step 1) and the `asset_preview_file` preview (Steps 2c and 8). Follow it as written. Only if a widget tool is **not available on this surface** (e.g. Codex) use the *No-widget fallback* attached to that step. Present `AskUserQuestion` prompts as plain-text labeled options wherever no question widget exists.\n\n---\n\n## Generative AI Policy\n\n**This retouching pipeline is fully non-generative by default.** The core workflow — auto-straighten, auto-tone, adjustments, presets, blur, and crop — uses no generative AI, and that non-generative pipeline is the *only* behavior on surfaces that do not permit generative AI (**including Claude**).\n\n**Generative editing runs only where the surface permits it.** A surface permits generative AI only when it exposes a generative tool such as `image_fill_area` (e.g. Codex). Where no such tool is available (e.g. Claude), perform **no** generative edits of any kind — do not call, attempt, offer, or mention them; run the non-generative pipeline only.\n\n**Where generative AI is permitted, it is limited to backgrounds and kept minimal.** Only then may `image_fill_area` correct dust spots, sensor artifacts, or scratches on non-human areas (walls, floors, sky, props), and only when the fix is invisible at normal viewing size — remove a dust spot, not repaint a wall. **Never** apply generative tools to faces, skin, hair, bodies, or clothing on any surface. Do not alter the scene, remove objects, change the environment, or extend the frame.\n\nIf the user asks you to generatively modify a person (e.g. \"change her hair color\", \"make him look younger\"), clarify that this skill does not perform generative edits on people — and, on a surface with no generative capability at all, that generative editing isn't available here — then suggest a dedicated generative workflow instead.\n\n---\n\n## Tool Reference (Adobe for creativity connector)\n\n| Step                  | Tool                                                        | Notes                                              |\n| --------------------- | ----------------------------------------------------------- | -------------------------------------------------- |\n| Ingest                | `asset_add_file` + `read_widget_context`                    | Interactive file picker; resolve URIs via `read_widget_context` |\n| Ingest *(no-widget fallback)* | `asset_initialize_file_upload` + `asset_finalize_file_upload` | Only when `asset_add_file` is unavailable — stage a local file to CC |\n| Discover presets      | `image_list_presets`                                        | Once at startup; builds the smart preset plan      |\n| Straighten            | `image_auto_straighten`                                     | Per image                                          |\n| Auto-Tone             | `image_apply_auto_tone` (cameraRawFilter)                   | Per image                                          |\n| Tone adjustments      | `image_apply_adjustments`                                   | Batch — all tweaks in one call                     |\n| Subject\u002Fbody detect   | `image_select_subject`                                      | Face + body parts + clothes detection              |\n| Adaptive Enhancements | `image_apply_preset`                                        | Per image, opt-in (see Step 5)                     |\n| Background blur       | `image_apply_lens_blur`                                     | Per image, preferred — depth-aware bokeh           |\n| Heavy\u002Fstylized blur   | `image_apply_gaussian_blur`                                 | Per image, only if user explicitly requests heavy  |\n| Background cleanup    | `image_fill_area` (optional; generative)                    | Only where the surface permits generative AI (tool available, e.g. Codex) — backgrounds only, never people; **not used on Claude** |\n| Crop                  | `image_crop_and_resize`                                     | Per image                                          |\n| Sample preview        | `asset_preview_file`                                        | Before\u002Fafter on image[0] only *(no-widget fallback: present the URLs directly)* |\n| Final preview         | `asset_preview_file`                                        | All final URLs directly, no resize step *(no-widget fallback: present the URLs directly)* |\n| Firefly Board         | `create_firefly_board`                                      | Source presigned URLs from ingestion               |\n\n---\n\n## Step 0 - prereq: Initialize Adobe Tools\nCall `adobe_mandatory_init` first. This returns file handling rules and tool routing guidance required for the rest of the workflow.\n\n```json\n{ \"skill_name\": \"adobe-retouch-portraits\", \"skill_version\": \"3.1.0\" }\n```\n\nThis also tells you which widgets this surface supports and whether egress is enabled. If `asset_add_file` and `asset_preview_file` are available, follow the default flow (Steps 1, 2c, and 8 as written). If one is not available (e.g. Codex), use that step's *No-widget fallback*. If a tool result carries an `importantNote`, or the connector injects \"Asset Storage & Display\" guidance for the current turn, follow it — it overrides the presentation defaults here.\n\n---\n\n## Step 0b: Discover Available Presets\n\nCall `image_list_presets` immediately after init — before ingestion or user questions. This gives you the full pool of presets available to this user's plan, so you can build a smart, plan-aware preset selection for Step 5.\n\n```\nTool: image_list_presets\nParams: {}\n```\n\nFrom the returned list, build a **Preset Plan** by categorizing presets into four buckets. Use the naming signals below to classify each preset — these are heuristics, not hardcoded names, so apply judgment:\n\n### Preset Plan Buckets\n\n**1. Adaptive Person Presets** — target the subject's body, skin, clothing, or teeth\nNaming signals: `Adaptive`, `Subject`, `Portrait`, `Person`, `Skin`, `Body`, `Clothes`, `Outfit`, `Pop`, `Warm Pop`, `Enhance`, `Teeth`, `Whiten`, `Smile`, `Brighten`\nGoal: pick 1–3 presets that best boost the human subject. Prefer presets that target skin\u002Fbody or offer subject-level contrast\u002Fwarmth lift. Avoid presets that affect only sky or background. Any preset with teeth\u002Fsmile\u002Fwhiten signals should be included here so it is available when Whiten Teeth is selected in Step 2.\n\n**2. Global Mood \u002F Tone Preset** — overall tonal character of the image\nNaming signals: `Mood`, `Tone`, `Warm`, `Cool`, `Golden`, `Cinematic`, `Film`, `Natural`, `Airy`, `Fade`, `Matte`, `Classic`\nGoal: pick exactly **1** preset. Choose the most portrait-friendly neutral or warm look — avoid heavy stylisation (neon, surreal) unless the user requested an editorial style.\n\n**3. Global Toon \u002F Look Preset** — stylistic look treatment\nNaming signals: `Toon`, `Style`, `Look`, `Preset`, `Vintage`, `Retro`, `B&W`, `Mono`, `Haze`, `Glow`, `Edit`, `Creative`\nGoal: pick exactly **1** preset. Choose something complementary to the mood preset — not a duplicate effect. If the mood preset is already cinematic\u002Fwarm, choose a lighter stylistic touch.\n\n**4. Background Blur Preset** — softens background to flatter the subject\nNaming signals: `Blur Background`, `BG Blur`, `Bokeh`, `Depth`, `Focus`, `Defocus`\nGoal: pick exactly **1** blur-background preset. This replaces `image_apply_gaussian_blur` when the user opts into it.\n\n**Fallback strategy:**\n- If no preset matches a bucket, leave that bucket empty rather than forcing a poor fit.\n- If the plan returns no presets at all (403 or empty list), skip Step 5 entirely and note it in the summary: \"Adaptive enhancements not available — no presets found on this plan.\" **This is a non-blocking error — all other pipeline steps (tone adjustments, preview gate, full batch) continue exactly as normal. Only Step 5 is skipped.**\n- Buckets 2 and 3 are global mood\u002Fstyle layers — skip them if you cannot find a clearly portrait-appropriate match. It's better to skip than to apply an ill-fitting preset.\n\nStore the chosen presets as your **Preset Plan** before Step 2. The user's mood\u002Fstyle selection (collected in Step 2a) may refine which preset is chosen within each bucket — see Step 2a for guidance. Show the final plan to the user in the confirmation message (Step 2).\n\n---\n\n## Step 1: Image Ingestion\n\nCall `asset_add_file` with no parameters. This renders an interactive UI where\nthe user can:\n- **Browse CC storage** and select a folder or individual files\n- **Upload from device** (local files)\n- **In Cowork**: select a local folder path directly\n```\nTool: asset_add_file\nParams: {}\n```\n\n**Important:** `asset_add_file` returns `imageURIs: []` — this is expected and\nNOT an error. The actual URIs arrive in the **next user message** after the\nuser selects files. Wait for that follow-up before continuing.\n\nAfter receiving the URIs, call `read_widget_context` with `asset_add_file` to resolve them to correct presigned S3 URLs. Use those resolved URLs for all subsequent tool calls — `dcx-stage.adobe.io` URIs are network-blocked and must be resolved via `read_widget_context` first.\n\nCollect the resulting presigned URLs as `sourceURIs[]` and continue to Step 2a.\n\n> **No-widget fallback** *(only if `asset_add_file` is unavailable on this surface, e.g. Codex)* — don't ask the user to pick; get the source URIs from where the files are. `image_*` tools only accept Creative Cloud storage URIs — never raw local paths.\n>\n> | Source | Action |\n> |--------|--------|\n> | File(s) at a local path (e.g. `\u002Fmnt\u002Fuser-data\u002Fuploads\u002F…`) | **Check egress status from `adobe_mandatory_init` first.** If egress is enabled: stage each file programmatically — get file size and MIME type, call `asset_initialize_file_upload({ path: \"\u003Cfilename>\", media_type: \"\u003Cmime>\" })`, PUT the bytes to the returned upload URL, then `asset_finalize_file_upload({ filename: \"\u003Cfilename>\", transfer_document: \u003Cfrom initialize response> })`; use each returned presigned CC URL for downstream calls. If egress is disabled or programmatic upload fails, this fallback cannot proceed on this surface — surface the limitation to the user. |\n> | File(s) already in Creative Cloud | Reference them directly by their CC presigned URL. |\n>\n> The programmatic path uses neither `asset_add_file` nor `read_widget_context`. Collect the resulting presigned CC URLs as `sourceURIs[]`.\n\n---\n\n## Step 2a: Mood & Style Selection\n\nBefore presenting the pipeline plan, ask the user what mood and style they want for their portraits. This drives which presets are prioritised within the Preset Plan buckets.\n\n**If the user's message already states a clear mood\u002Fstyle** (e.g. \"warm and glowing\", \"dark and moody\", \"clean headshots\", \"editorial\"), infer it directly — skip this question and map it using the table below.\n\n**If no mood\u002Fstyle is specified**, post this message and ask:\n```\n📸 Got [N] photo(s)! Before I build your retouching plan — what kind of look are you going for?\n```\n\n```\nQuestion (single_select):\n  question: \"🎨 What mood or style do you want for these portraits?\"\n  options:\n    - \"Natural & Clean — true-to-life, polished, minimal\"\n    - \"Warm & Glowing — golden, soft, flattering\"\n    - \"Moody & Dramatic — dark, contrasty, editorial\"\n    - \"Bright & Airy — light, fresh, lifestyle\"\n    - \"Cinematic — film-inspired, desaturated, storytelling\"\n    - \"Bold & Vibrant — punchy, vivid, social-ready\"\n```\n\n**Hold** — do not proceed to Step 2 until the user replies. (This hold applies only when the question was asked. If mood\u002Fstyle was already inferred from the user's message, skip this hold and proceed directly to Step 2.)\n\n### Mood → Preset Plan guidance\n\nUse the selected mood to refine your Preset Plan (built in Step 0b). Within each bucket, prefer presets whose names align with the chosen mood:\n\n| Mood | Favour in Mood\u002FTone bucket | Favour in Toon\u002FLook bucket |\n|------|---------------------------|---------------------------|\n| Natural & Clean | `Natural`, `Clean`, `Classic`, `Neutral` | light\u002Fsubtle look |\n| Warm & Glowing | `Warm`, `Golden`, `Glow`, `Sunset`, `Amber` | warm complementary |\n| Moody & Dramatic | `Moody`, `Dark`, `Cinematic`, `Shadow`, `Drama` | `Matte`, `Fade`, `Vintage` |\n| Bright & Airy | `Airy`, `Bright`, `Light`, `Fresh` | soft, bright look |\n| Cinematic | `Cinematic`, `Film`, `Fade`, `Classic` | `Matte`, `Grain`, `Retro` |\n| Bold & Vibrant | `Vibrant`, `Pop`, `Bold`, `Vivid` | punchy look |\n\nIf the Preset Plan has multiple candidates in a bucket, pick the one that best matches the chosen mood. If only one preset exists in a bucket, use it regardless of mood.\n\n---\n\n## Step 2: Announce Pipeline + Offer Options\n\nOnce the mood\u002Fstyle is confirmed, check whether the user's message **already fully specifies** their enhancement, tweak, and crop preferences.\n\n**If preferences are fully stated upfront** (e.g. \"retouch with subject pop, no tweaks, crop 1:1\"), skip `AskUserQuestion` entirely and go straight to the confirmation message, then proceed directly to Step 2c (sample preview). The preview gate is mandatory — it runs even when all preferences are stated upfront. Do NOT start the full batch without it. Map their stated preferences using the button→parameter table below.\n\n**If preferences are not fully stated** (e.g. \"please retouch them\" with no further detail), post this message first:\n```\n📸 Got [N] photo(s)! The default pipeline will auto-straighten and auto-tone every image.\n\nLet me know if you'd like any extras 👇\n```\n\nThen call `AskUserQuestion` with these three questions:\n\n```\nQuestion 1 (multi_select):\n  question: \"✨ Adaptive AI enhancements (select any — or none to skip)\"\n  options:\n    - \"All\"\n    - \"Enhance Subject — adaptive preset boosts on the person, skin & clothes\"\n    - \"Mood & Tone — apply a portrait-flattering global tone look\"\n    - \"Toon & Style — apply a stylistic look treatment\"\n    - \"Blur Background — soft bg blur preset, respects edges\"\n    - \"Whiten Teeth — brightens teeth (smiles only)\"\n    - \"None\"\n\nQuestion 2 (multi_select):\n  question: \"🎛️ Manual tweaks (select any — or none to skip)\"\n  options:\n    - \"Recover highlights\"\n    - \"Lift shadows\"\n    - \"More contrast\"\n    - \"More vibrant\"\n    - \"Desaturate (muted tones)\"\n    - \"Blur background — depth-aware bokeh (standard)\"\n    - \"Heavy background blur — stylized gaussian blur\"\n    - \"None\"\n\nQuestion 3 (single_select):\n  question: \"✂️ Crop ratio\"\n  options:\n    - \"Auto (landscape→4:3, portrait→3:4)\"\n    - \"1:1 square\"\n    - \"4:5 portrait\"\n    - \"16:9 wide\"\n```\n\n**Hold processing until the user replies with their selections.**\n\n### Mapping button selections to parameters\n\n**Adaptive enhancements (mapped to Preset Plan built in Step 0b):**\n- \"All\" → run all four buckets (Adaptive Person + Mood + Toon + Blur BG), plus Whiten Teeth if face detected\n- \"Enhance Subject\" → apply all presets in the **Adaptive Person Presets** bucket\n- \"Mood & Tone\" → apply the single preset from the **Global Mood \u002F Tone** bucket\n- \"Toon & Style\" → apply the single preset from the **Global Toon \u002F Look** bucket\n- \"Blur Background\" → apply the preset from the **Background Blur** bucket (skip Step 6 for that image)\n- \"Whiten Teeth\" → apply the Whiten Teeth preset from the Adaptive Person Presets bucket (skip if no face detected; see body detection in Step 5)\n- \"None\" → skip Step 5 entirely\n**Manual tweaks** (all combined into one `image_apply_adjustments` call in Step 4b — use diagnostic ranges, not hardcoded defaults):\n- \"Recover highlights\" → `highlights: -40 to -70` (use -40 for mildly blown; -70 for heavily overexposed highlights)\n- \"Lift shadows\" → `darks: +30 to +50` (positive lifts shadow detail; use +30 for slight lift; +50 for very crushed shadows; prefer `vibrance` to compensate if skin goes dull)\n- \"More contrast\" → `contrast: +15 to +30` (use +15 for slight pop; +30 only if image is very flat)\n- \"More vibrant\" → `vibrance: +15 to +30` (prefer `vibrance` over `saturation` for portraits — vibrance protects skin tones)\n- \"Desaturate\" → `saturation: -20 to -40` (use -20 for muted; -40 for near-monochrome look)\n- \"Blur background — depth-aware bokeh (standard)\" → `image_apply_lens_blur` → `blurRadius: 8` (depth-aware, realistic bokeh; skip Step 6 if adaptive blur preset also applied)\n- \"Heavy background blur — stylized gaussian blur\" → `image_apply_gaussian_blur` → `blurRadius: 12, blurTarget: \"background\"` (use only when user explicitly requests heavy\u002Fstylized blur; do not combine with Blur Background adaptive preset)\n- \"None\" → skip Step 4b entirely\n**Crop:**\n- \"Auto\" → landscape → `\"4:3\"`, portrait → `\"3:4\"`, focus: `\"face\"`\n- \"1:1 square\" → `output: \"1:1\"`, focus: `\"face\"`\n- \"4:5 portrait\" → `output: \"4:5\"`, focus: `\"face\"`\n- \"16:9 wide\" → `output: \"16:9\"`, focus: `\"face\"`\nAll crop modes use `focus: \"face\"`. If no face is detected, fall back to `focus: \"subject\"`.\n\nAfter receiving button selections, confirm the settings back to the user **and show the Preset Plan**:\n```\n✅ Got it — here's your retouching plan:\n- Style: [selected mood\u002Fstyle from Step 2a]\n- Auto-straighten + auto-tone + auto-light\n- Adaptive enhancements: [list selected categories]\n  - Person presets: [preset names from bucket 1, or \"none\"]\n  - Mood preset: [preset name, or \"none\"]\n  - Toon preset: [preset name, or \"none\"]\n  - Blur BG preset: [preset name, or \"none\"]\n- Manual tweaks: [list if any, or \"none\"]\n- Crop: [ratio or \"auto 4:3\u002F3:4\"]\n- Blur: [adaptive \u002F heavy \u002F none]\n\nI'll preview the first image so you can confirm before I apply this to all [N] photos.\n```\n\n---\n\n## Step 2b: Large Batch Warning (N > 5)\n\nInclude this in the confirmation when N > 5:\n\n```\n⏱ Estimated time for [N] images:\n  6–10 → ~3–5 min\n  11–20 → ~5–10 min\n  20+ → 10+ min\n\nFeel free to step away — I'll post a ✅ completion summary with your\ndownload links when done. (No Slack\u002Femail notifications available from here.)\n```\n\n---\n\n## Step 2c: Sample Preview (Before\u002FAfter on Image 1)\n\nBefore running the full batch, process the **first image only** through the complete pipeline (Steps 3–7) using the confirmed settings. This gives the user a real preview of exactly what will be applied to every image.\n\nTo keep the preview fast, **first downscale image 1** to a long-edge of 1200px before running it through the pipeline. After confirmation, the final batch (Step 3) processes **all** images at full resolution — including image 1, which must not be reused from the 1200px preview output.\n\n```\nTool: image_crop_and_resize\nParams:\n  imageURI: \"\u003CsourceURIs[0]>\"\n  options:\n    output: { width: 1200, height: 1200 }   # caps both dimensions at 1200px; fit:contain preserves aspect ratio, so the long edge (width on landscape, height on portrait) is capped at 1200px\n    fit: \"contain\"\n  outputFileType: \"jpeg\"\n```\n\nStore the result as `preview_source_url`. Use that downscaled URL — not `sourceURIs[0]` — as the input to Steps 3–7 for the preview pass only.\n\n1. Run the full pipeline on `preview_source_url` only (straighten → tone → tweaks → adaptive → blur → crop).\n2. Call `asset_preview_file` with the original full-res source as \"Before\" and the processed downscaled output as \"After\" — `asset_preview_file` handles its own thumbnailing so the size difference is invisible to the user:\n```javascript\nasset_preview_file({\n  assets: [\n    { name: \"Before\", presignedAssetUrl: sourceURIs[0] },\n    { name: \"After\",  presignedAssetUrl: processed_preview_url }\n  ]\n})\n```\n\n> **No-widget fallback** *(only if `asset_preview_file` is unavailable on this surface, e.g. Codex)* — present the two labeled URLs directly in the message:\n> ```\n> Before: \u003CsourceURIs[0]>\n> After:  \u003Cprocessed_preview_url>\n> ```\n> UI clients that render image URLs inline will show both automatically. In Codex or other non-UI agents, download both to the workspace (`curl -L -o before.jpg \"\u003CsourceURIs[0]>\"`, `curl -L -o after.jpg \"\u003Cprocessed_preview_url>\"`) and reference those local paths instead.\n\n3. Post this message:\n```\n👆 Here's a before\u002Fafter preview using your first photo and the settings you selected.\n\nPlease confirm this looks right before I apply it to all [N] images.\n```\n\n4. Call `AskUserQuestion` with a single question:\n```\nQuestion (single_select):\n  question: \"Does the preview look good?\"\n  options:\n    - \"✅ Yes — apply to all [N] images\"\n    - \"🎛️ No — adjust settings first\"\n    - \"❌ Cancel\"\n```\n\n**Processing is fully paused here.** Do not start the full batch until the user explicitly selects \"Yes\". This gate is mandatory and runs every time regardless of how clearly preferences were stated.\n\n**If \"Yes\":** proceed to Step 3 for **all** images (`sourceURIs[0…N-1]`) at full resolution. Do not reuse the 1200px preview result — it was for confirmation only and must not appear in the final deliverables.\n\n**If \"No — adjust settings\":** return to Step 2a to re-collect mood\u002Fstyle if needed, then Step 2 (`AskUserQuestion`) to re-collect other preferences. Once new settings are confirmed, **always repeat the preview** — reprocess image 1 with the new settings, show the new before\u002Fafter, and require explicit confirmation again before proceeding. Never skip the preview gate after an adjustment.\n\n**If \"Cancel\":** stop and let the user know they can restart any time.\n\n---\n\n## Step 3: Auto-Straighten (per image)\n\nLoop one image at a time (no batch support):\n\n```\nTool: image_auto_straighten\nParams:\n  imageURIs: [\"\u003Csource_uri_N>\"]\n  options:\n    uprightMode: \"auto\"\n    constrainCrop: true\n```\n\n**Output:** `results[0].outputUrl` → collect as `straightened_urls[]`\n\nOn failure: use original URI, note \"straighten skipped\" for that image.\n\n---\n\n## Step 4: Auto-Tone (per image)\n\n```\nTool: image_apply_auto_tone\nParams:\n  imageURIs: [\"\u003Cstraightened_url_N>\"]\n  options:\n    type: \"cameraRawFilter\"\n```\n\n**Output:** `results[0].outputUrl` → collect as `toned_urls[]`\n\n---\n\n## Step 4b: Optional Tone Adjustments (batch)\n\nIf the user requested tonal tweaks, combine **all selected tweaks into a single `image_apply_adjustments` call** — no need to chain multiple calls:\n\n```\nTool: image_apply_adjustments\nParams:\n  imageURIs: [all toned_urls]\n  options:\n    # Include only the params for tweaks the user selected.\n    # Pick a SINGLE numeric value from the diagnostic ranges in Step 2 — do not pass the range string itself.\n    # Example values shown; actual values must be chosen based on image severity:\n    exposure: 0.4           # \"Adjust exposure\" — e.g. +0.3 to +0.7 (lift) or -0.3 to -0.5 (reduce)\n    highlights: -55         # \"Recover highlights\" — range: -40 to -70 (severity-matched)\n    darks: 40               # \"Lift shadows\" — range: +30 to +50 (positive lifts dark areas)\n    brightness: 10          # if requested — range: +5 to +20\n    contrast: 20            # \"More contrast\" — range: +15 to +30 (lower end unless very flat)\n    vibrance: 20            # \"More vibrant\" — range: +15 to +30 (prefer over saturation for portraits)\n    saturation: -30         # \"Desaturate\" — range: -20 to -40 (lower end unless heavy muting desired)\n  outputFileType: \"jpeg\"\n```\n\nOmit any parameter the user did not select. One call handles all requested tweaks simultaneously.\n---\n\n## Step 5: Adaptive Enhancements (per image, opt-in only)\n\nOnly run this step if the user selected one or more adaptive enhancements. The presets to apply come from your **Preset Plan** built in Step 0b — not hardcoded names.\n\n### 5a: Subject & Body Detection\n\nBefore applying person or teeth presets, call `image_select_subject` to understand what's in the frame. This drives two decisions: which adaptive person presets to apply, and whether Whiten Teeth is appropriate.\n\n```\nTool: image_select_subject\nParams:\n  imageURI: \"\u003Ctweaked_url_N>\"   # Step 4b output if tweaks ran; otherwise toned_url_N\n  options:\n    bodyParts: [\"Face\", \"Torso\", \"Clothing\", \"Skin\", \"Hair\"]\n```\n\nUse the detection results as follows:\n- **Face detected** → include any teeth\u002Fsmile preset if user selected Whiten Teeth\n- **Torso \u002F Skin \u002F Hair detected** → include body-targeted adaptive person presets (e.g. skin smoothing, body pop)\n- **Clothing detected** → include clothing\u002Foutfit-targeted adaptive presets if present in bucket 1\n- **No subject detected** → skip all Adaptive Person Presets for this image; still apply Mood and Toon presets\n\n### 5b: Apply Preset Plan (in order)\n\nApply the applicable presets from your Preset Plan in this sequence, chaining each output into the next. **Only run buckets the user selected in Step 2** — use the mapping table there to determine which buckets are active for this run. Skip any bucket the user did not select, and skip any preset within an active bucket whose detection condition was not met (see 5a).\n\n**Order (run only the buckets that were selected):**\n1. **Adaptive Person Presets** (bucket 1) — only if \"Enhance Subject\", \"Whiten Teeth\", or \"All\" was selected. Within the bucket: skip body\u002Fclothes presets if only a face was detected and no body was found; skip Whiten Teeth if no face detected.\n2. **Global Mood \u002F Tone Preset** (bucket 2) — only if \"Mood & Tone\" or \"All\" was selected; apply once\n3. **Global Toon \u002F Look Preset** (bucket 3) — only if \"Toon & Style\" or \"All\" was selected; apply once\n4. **Background Blur Preset** (bucket 4) — only if \"Blur Background\" or \"All\" was selected; apply once; if applied, **skip Step 6** for this image\n\n```\nTool: image_apply_preset\nParams:\n  imageURI: \"\u003Cprevious_output_url>\"   # for first preset: tweaked_url_N (Step 4b output) or toned_url_N if no tweaks ran; for subsequent presets: output of prior preset\n  options:\n    presetName: \"\u003Cexact preset name from Preset Plan>\"\n```\n\n**Output:** `results[0].outputUrl` → chain as input to next preset or Step 6.\n\n**On 403 (entitlement):** Skip the preset. Note in delivery summary: \"[Preset name] was skipped — not included in your Adobe plan.\" Continue with remaining presets.\n**On other failure:** Use previous step's output; note \"[preset name] skipped\" in summary.\n\n---\n\n## Step 6: Background Blur (per image)\n\n**Skip this step entirely** if the Background Blur Preset (bucket 4) was applied in Step 5 — the adaptive preset already handled it.\n\n**No blur selected:** skip this step entirely.\n\n**Standard background blur** (user selected \"Blur background\" and adaptive blur preset was not applied):\n\nPrefer `image_apply_lens_blur` — it produces depth-aware, realistic bokeh by automatically detecting the subject and keeping it sharp:\n```\nTool: image_apply_lens_blur\nParams:\n  imageURI: \"\u003Curl_N>\"\n  options:\n    blurRadius: 8    # 6–10 for subtle separation; higher for stronger bokeh\n```\n\nOn failure: fall back to `image_apply_gaussian_blur` below, note \"lens blur unavailable — using gaussian\".\n\n**Heavy\u002Fstylized blur** (user explicitly requested \"Heavy background blur\"):\n```\nTool: image_apply_gaussian_blur\nParams:\n  imageURIs: [\"\u003Curl_N>\"]\n  options:\n    blurRadius: 12\n    blurTarget: \"background\"\n```\n\nOn failure: use previous step's output, note \"blur skipped\" for that image.\n\n**Output:** `results[0].outputUrl`\n\n---\n\n## Step 7: Crop (per image)\n\n**Default behavior:**\n- Landscape image → crop to `\"4:3\"`, focus: `\"face\"`\n- Portrait image → crop to `\"3:4\"`, focus: `\"face\"`\n- User-specified ratio (1:1, 4:5, 16:9, etc.) → use that, focus: `\"face\"`\n- If no face is detected by the crop tool, fall back to `focus: \"subject\"`\n```\nTool: image_crop_and_resize\nParams:\n  imageURI: \"\u003Cblur_url_N>\"\n  options:\n    output: \"4:3\"          # or \"3:4\" \u002F user choice\n    fit: \"reframe\"\n    focus: \"face\"          # falls back to \"subject\" if no face detected\n  outputFileType: \"jpeg\"\n```\n\n**These are the final full-resolution deliverables.** Collect as `final_urls[]`.\n\n---\n\n## Step 8: Final Preview + Download Links + Firefly Board\n\nPass the final output URLs directly to `asset_preview_file` — do NOT run them through `image_crop_and_resize` first, as that introduces white bars or unwanted cropping. `asset_preview_file` handles its own thumbnailing correctly.\n\nCall `asset_preview_file` for every run, regardless of batch size:\n\n```javascript\nasset_preview_file({\n  assets: [\n    { name: \"portrait_1.jpg\", presignedAssetUrl: final_url_1 },\n    { name: \"portrait_2.jpg\", presignedAssetUrl: final_url_2 },\n    \u002F\u002F ... one entry per image\n  ]\n})\n```\n\n> **No-widget fallback** *(only if `asset_preview_file` is unavailable on this surface, e.g. Codex)* — list the final output URLs directly in the completion message, one entry per image:\n> ```\n> portrait_1.jpg → \u003Cfinal_url_1>\n> portrait_2.jpg → \u003Cfinal_url_2>\n> \u002F\u002F ... one entry per image\n> ```\n> UI clients that render image URLs inline will display them automatically. In Codex or other non-UI agents, download each to the workspace (`curl -L -o portrait_1.jpg \"\u003Cfinal_url_1>\"`, etc.) and reference those local paths instead.\n\n### Create Firefly Board\n\nCall the firefly board tool with the final output urls as follows:\n\n```javascript\ncreate_firefly_board({\n  import_adobe_storage: [\n    final_output_url_1,\n    final_output_url_2,\n    \u002F\u002F ...\n  ]\n})\n```\n\n**Board link handling:**\n- Extract the returned URL and store as `board_url`.\n- If `board_url` is present and non-empty, include it in the completion message.\n- If the call fails or returns no URL: note \"Firefly Board unavailable\" in the summary (retrying does not help).\nThen post the completion message. The preview grid is included in every completion message. The board link is included whenever `board_url` was returned.\n\n**If N ≤ 3** — list individual links:\n```\n✅ All done! [N] portraits retouched and ready.\n\n📥 Download your full-resolution portraits:\n• Portrait 1 → \u003Cfinal_url_1>\n• Portrait 2 → \u003Cfinal_url_2>\n\n🎨 View in Firefly Board → \u003Cboard_url>   ← always include if board_url is set\n\nPipeline applied: Auto-straighten → Auto-tone (Camera Raw) → [tweaks if any]\n→ [adaptive enhancements if any] → [blur if any] → Crop [ratio]\n```\n\n**If N > 3** — list all links:\n```\n✅ All done! [N] portraits retouched and ready.\n\n📥 Your retouched portraits:\n• Portrait 1 → \u003Cfinal_url_1>\n• Portrait 2 → \u003Cfinal_url_2>\n• ...\n\n🎨 View in Firefly Board → \u003Cboard_url>   ← always include if board_url is set\n\nPipeline applied: Auto-straighten → Auto-tone (Camera Raw) → [tweaks if any]\n→ [adaptive enhancements if any] → [blur if any] → Crop [ratio]\n```\n\n---\n\n## Verbosity Rule\n\nBuilt for large batches — report only: per-stage start, individual failures (logged once), and the final summary.\n- When a pipeline stage begins for the whole batch (e.g. \"Straightening [N] images...\")\n- If an individual image fails (log once, continue)\n- Final completion summary with grid + download links\n---\n\n## Output Extraction Reference\n\nAll pipeline tools return:\n```json\n{ \"results\": [{ \"success\": true, \"outputUrl\": \"https:\u002F\u002F...\" }] }\n```\n\nOutput is read from `results[N].outputUrl`. On `success: false` see Error Handling.\n\n---\n\n## Error Handling\n\n| Situation                                                 | Action                                                                                                                                                                                                           |\n| --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `image_list_presets` returns empty or 403                 | Skip Step 5 entirely (non-blocking — all other steps continue). Note in summary: \"Adaptive enhancements unavailable — no presets found on this plan.\"                                                            |\n| `image_apply_preset` returns 403 (entitlement)            | Skip that preset. Note in delivery summary: \"[Preset name] was skipped — not included in your Adobe plan.\" Continue with remaining presets.                                                                     |\n| Any tool returns 401 (not authenticated)                  | Ask the user to re-authenticate via Adobe OAuth and retry                                                                                                                                                        |\n| `asset_add_file` shows no files                           | Wait; remind user to select files in the picker                                                                                                                                                                  |\n| `image_auto_straighten` fails                             | Pass original URI to Step 4; note \"straighten skipped\"                                                                                                                                                           |\n| `image_apply_auto_tone` fails                             | Pass straightened URI forward; note in summary                                                                                                                                                                   |\n| Any tone adjustment fails                                 | Log and continue with previous step's output                                                                                                                                                                     |\n| `image_select_subject` fails                              | Skip all body-gated presets (Whiten Teeth, body-targeted adaptive); apply Mood and Toon presets normally                                                                                                        |\n| `image_apply_preset` fails (non-403)                      | Use previous step's output; note \"[preset name] skipped\" in summary                                                                                                                                             |\n| No portrait-appropriate preset found for a bucket         | Leave that bucket empty; do not force an ill-fitting preset                                                                                                                                                     |\n| `image_apply_lens_blur` fails                             | Fall back to `image_apply_gaussian_blur` with `blurRadius: 8, blurTarget: \"background\"`; note \"lens blur unavailable\" in summary                                                                                |\n| `image_apply_gaussian_blur` fails                         | Use previous step's output; note \"blur skipped\"                                                                                                                                                                  |\n| `image_crop_and_resize` fails                             | Use blur output as final; note in summary                                                                                                                                                                        |\n| `asset_preview_file` fails or is unavailable              | Present final output URLs as plain text links in the summary (see Step 8 no-widget fallback).                                                                                                                    |\n| All steps fail on one image                               | Return original URI; flag clearly in summary                                                                                                                                                                     |\n| Dead end                                                  | Report the failure clearly and offer to retry.                                                                                                                                                                   |\n\n---\n\n## Hard Constraints\n\n- Every image in the batch is processed; failures are flagged rather than silently skipped.\n- Mood\u002Fstyle is always collected (Step 2a) before the plan is presented — it influences Preset Plan bucket selection.\n- The before\u002Fafter preview gate (Step 2c) is **mandatory** — the full batch never starts without the user explicitly confirming \"Yes\". After any settings adjustment, the preview always repeats with the new settings before the batch runs.\n- **Prefer `vibrance` over `saturation`** for portrait boosts — vibrance intelligently protects skin tones from oversaturation.\n- **Prefer `image_apply_lens_blur` over `image_apply_gaussian_blur`** for background separation — lens blur is depth-aware and produces more realistic bokeh without masking. Use gaussian only for heavy\u002Fstylized blur explicitly requested by the user.\n- **Tweak values are diagnostic, not hardcoded** — choose values from the reference ranges based on image content; `contrast: +15` for mildly flat images, `+30` only for very flat; `highlights: -40` for mild blow, `-70` for severe.\n- **Group\u002Fcondition awareness** — if the batch contains images from clearly different shooting conditions (e.g. mixed indoor\u002Foutdoor, or very different exposures), note this in the confirmation message and apply the same user-selected settings to all. For a future enhancement, per-group pipelines could be run separately.\n- `image_apply_auto_tone` is called with `type: \"cameraRawFilter\"`.\n- Adaptive enhancements are **off by default** — only run them if the user explicitly selects them.\n- Preset selection is always dynamic: call `image_list_presets` at runtime; never hardcode preset names.\n- All tonal\u002Fcolour adjustments use `image_apply_adjustments` — the individual tools (`image_adjust_highlights`, `image_adjust_dark_portions`, `image_adjust_vibrance_and_saturation`, etc.) are deprecated and must not be used.\n- Background blur is handled by the Background Blur preset from the Preset Plan (or `image_apply_lens_blur` for standard blur \u002F `image_apply_gaussian_blur` for heavy blur); the adaptive preset and Step 6 are mutually exclusive per image.\n- Whiten Teeth and body-targeted presets only run when the relevant body part is detected via `image_select_subject`.\n- The pipeline is non-generative by default. Generative tools (`image_fill_area`, `image_generative_expand`) run ONLY where the surface permits generative AI (the tool is available, e.g. Codex) — never on a surface without it (e.g. Claude), and never on people even where permitted. See the Generative AI Policy above.\n- Never pass a raw local filesystem path to any `image_*` tool. Local files must reach Creative Cloud first — selected via the `asset_add_file` picker, or (no-widget fallback) staged via `asset_initialize_file_upload` → PUT → `asset_finalize_file_upload`; only the resulting presigned CC URI is valid.\n- Push notifications (Slack\u002Femail\u002Ftext) are not available from here; completion is communicated through an in-chat summary.\n",{"data":34,"body":43},{"name":4,"description":6,"license":25,"compatibility":35,"allowed-tools":36,"metadata":37},"Runs on both widget-capable surfaces (e.g. Claude Cowork, which supports the asset_add_file picker and asset_preview_file preview widgets) and non-UI agents (e.g. Codex, where those widgets are unavailable). The default flow uses the widgets; each widget step has a text-only fallback. Local files are staged to Creative Cloud first; raw local paths are never passed to image tools.","adobe_mandatory_init image_list_presets asset_add_file read_widget_context asset_initialize_file_upload asset_finalize_file_upload asset_preview_file image_auto_straighten image_apply_auto_tone image_apply_adjustments image_select_subject image_apply_preset image_apply_lens_blur image_apply_gaussian_blur image_crop_and_resize image_fill_area create_firefly_board",{"version":38,"visibility":39,"surface":40},"3.1.0","public",[41,42],"claude","codex",{"type":44,"children":45},"root",[46,54,60,115,119,126,150,175,199,204,207,213,628,631,637,650,745,778,781,787,798,808,820,827,944,1046,1145,1210,1218,1243,1254,1257,1263,1274,1307,1316,1348,1382,1395,1537,1540,1546,1551,1561,1571,1580,1589,1599,1605,1610,1926,1931,1934,1940,1952,1969,1979,1988,2000,2009,2017,2023,2031,2341,2352,2361,2364,2370,2375,2384,2387,2393,2405,2424,2433,2454,2488,2674,2726,2734,2743,2757,2766,2776,2800,2824,2834,2837,2843,2848,2857,2880,2885,2888,2894,2903,2923,2926,2932,2951,2960,2966,2972,2983,2989,3001,3010,3015,3058,3064,3076,3084,3133,3142,3157,3188,3191,3197,3207,3217,3227,3239,3248,3260,3269,3278,3283,3296,3299,3305,3313,3368,3377,3394,3397,3403,3429,3440,3603,3648,3654,3659,3748,3756,3795,3805,3814,3824,3833,3836,3842,3847,3872,3875,3881,3886,3984,4005,4008,4014,4319,4322,4328,4607],{"type":47,"tag":48,"props":49,"children":50},"element","h1",{"id":4},[51],{"type":52,"value":53},"text","Adobe Retouch Portraits",{"type":47,"tag":55,"props":56,"children":57},"p",{},[58],{"type":52,"value":59},"A walk-away bulk retouching pipeline for photographers. The user selects their\nimages, optionally adds tweaks, and the agent runs the full batch using Adobe\nfor creativity tools.",{"type":47,"tag":61,"props":62,"children":63},"blockquote",{},[64],{"type":47,"tag":55,"props":65,"children":66},{},[67,73,75,82,84,90,92,97,99,105,107,113],{"type":47,"tag":68,"props":69,"children":70},"strong",{},[71],{"type":52,"value":72},"Surface note:",{"type":52,"value":74}," The default flow uses Adobe's MCP App widgets — the ",{"type":47,"tag":76,"props":77,"children":79},"code",{"className":78},[],[80],{"type":52,"value":81},"asset_add_file",{"type":52,"value":83}," picker (Step 1) and the ",{"type":47,"tag":76,"props":85,"children":87},{"className":86},[],[88],{"type":52,"value":89},"asset_preview_file",{"type":52,"value":91}," preview (Steps 2c and 8). Follow it as written. Only if a widget tool is ",{"type":47,"tag":68,"props":93,"children":94},{},[95],{"type":52,"value":96},"not available on this surface",{"type":52,"value":98}," (e.g. Codex) use the ",{"type":47,"tag":100,"props":101,"children":102},"em",{},[103],{"type":52,"value":104},"No-widget fallback",{"type":52,"value":106}," attached to that step. Present ",{"type":47,"tag":76,"props":108,"children":110},{"className":109},[],[111],{"type":52,"value":112},"AskUserQuestion",{"type":52,"value":114}," prompts as plain-text labeled options wherever no question widget exists.",{"type":47,"tag":116,"props":117,"children":118},"hr",{},[],{"type":47,"tag":120,"props":121,"children":123},"h2",{"id":122},"generative-ai-policy",[124],{"type":52,"value":125},"Generative AI Policy",{"type":47,"tag":55,"props":127,"children":128},{},[129,134,136,141,143,148],{"type":47,"tag":68,"props":130,"children":131},{},[132],{"type":52,"value":133},"This retouching pipeline is fully non-generative by default.",{"type":52,"value":135}," The core workflow — auto-straighten, auto-tone, adjustments, presets, blur, and crop — uses no generative AI, and that non-generative pipeline is the ",{"type":47,"tag":100,"props":137,"children":138},{},[139],{"type":52,"value":140},"only",{"type":52,"value":142}," behavior on surfaces that do not permit generative AI (",{"type":47,"tag":68,"props":144,"children":145},{},[146],{"type":52,"value":147},"including Claude",{"type":52,"value":149},").",{"type":47,"tag":55,"props":151,"children":152},{},[153,158,160,166,168,173],{"type":47,"tag":68,"props":154,"children":155},{},[156],{"type":52,"value":157},"Generative editing runs only where the surface permits it.",{"type":52,"value":159}," A surface permits generative AI only when it exposes a generative tool such as ",{"type":47,"tag":76,"props":161,"children":163},{"className":162},[],[164],{"type":52,"value":165},"image_fill_area",{"type":52,"value":167}," (e.g. Codex). Where no such tool is available (e.g. Claude), perform ",{"type":47,"tag":68,"props":169,"children":170},{},[171],{"type":52,"value":172},"no",{"type":52,"value":174}," generative edits of any kind — do not call, attempt, offer, or mention them; run the non-generative pipeline only.",{"type":47,"tag":55,"props":176,"children":177},{},[178,183,185,190,192,197],{"type":47,"tag":68,"props":179,"children":180},{},[181],{"type":52,"value":182},"Where generative AI is permitted, it is limited to backgrounds and kept minimal.",{"type":52,"value":184}," Only then may ",{"type":47,"tag":76,"props":186,"children":188},{"className":187},[],[189],{"type":52,"value":165},{"type":52,"value":191}," correct dust spots, sensor artifacts, or scratches on non-human areas (walls, floors, sky, props), and only when the fix is invisible at normal viewing size — remove a dust spot, not repaint a wall. ",{"type":47,"tag":68,"props":193,"children":194},{},[195],{"type":52,"value":196},"Never",{"type":52,"value":198}," apply generative tools to faces, skin, hair, bodies, or clothing on any surface. Do not alter the scene, remove objects, change the environment, or extend the frame.",{"type":47,"tag":55,"props":200,"children":201},{},[202],{"type":52,"value":203},"If the user asks you to generatively modify a person (e.g. \"change her hair color\", \"make him look younger\"), clarify that this skill does not perform generative edits on people — and, on a surface with no generative capability at all, that generative editing isn't available here — then suggest a dedicated generative workflow instead.",{"type":47,"tag":116,"props":205,"children":206},{},[],{"type":47,"tag":120,"props":208,"children":210},{"id":209},"tool-reference-adobe-for-creativity-connector",[211],{"type":52,"value":212},"Tool Reference (Adobe for creativity connector)",{"type":47,"tag":214,"props":215,"children":216},"table",{},[217,241],{"type":47,"tag":218,"props":219,"children":220},"thead",{},[221],{"type":47,"tag":222,"props":223,"children":224},"tr",{},[225,231,236],{"type":47,"tag":226,"props":227,"children":228},"th",{},[229],{"type":52,"value":230},"Step",{"type":47,"tag":226,"props":232,"children":233},{},[234],{"type":52,"value":235},"Tool",{"type":47,"tag":226,"props":237,"children":238},{},[239],{"type":52,"value":240},"Notes",{"type":47,"tag":242,"props":243,"children":244},"tbody",{},[245,280,321,343,365,388,410,432,454,476,498,526,547,581,606],{"type":47,"tag":222,"props":246,"children":247},{},[248,254,270],{"type":47,"tag":249,"props":250,"children":251},"td",{},[252],{"type":52,"value":253},"Ingest",{"type":47,"tag":249,"props":255,"children":256},{},[257,262,264],{"type":47,"tag":76,"props":258,"children":260},{"className":259},[],[261],{"type":52,"value":81},{"type":52,"value":263}," + ",{"type":47,"tag":76,"props":265,"children":267},{"className":266},[],[268],{"type":52,"value":269},"read_widget_context",{"type":47,"tag":249,"props":271,"children":272},{},[273,275],{"type":52,"value":274},"Interactive file picker; resolve URIs via ",{"type":47,"tag":76,"props":276,"children":278},{"className":277},[],[279],{"type":52,"value":269},{"type":47,"tag":222,"props":281,"children":282},{},[283,293,309],{"type":47,"tag":249,"props":284,"children":285},{},[286,288],{"type":52,"value":287},"Ingest ",{"type":47,"tag":100,"props":289,"children":290},{},[291],{"type":52,"value":292},"(no-widget fallback)",{"type":47,"tag":249,"props":294,"children":295},{},[296,302,303],{"type":47,"tag":76,"props":297,"children":299},{"className":298},[],[300],{"type":52,"value":301},"asset_initialize_file_upload",{"type":52,"value":263},{"type":47,"tag":76,"props":304,"children":306},{"className":305},[],[307],{"type":52,"value":308},"asset_finalize_file_upload",{"type":47,"tag":249,"props":310,"children":311},{},[312,314,319],{"type":52,"value":313},"Only when ",{"type":47,"tag":76,"props":315,"children":317},{"className":316},[],[318],{"type":52,"value":81},{"type":52,"value":320}," is unavailable — stage a local file to CC",{"type":47,"tag":222,"props":322,"children":323},{},[324,329,338],{"type":47,"tag":249,"props":325,"children":326},{},[327],{"type":52,"value":328},"Discover presets",{"type":47,"tag":249,"props":330,"children":331},{},[332],{"type":47,"tag":76,"props":333,"children":335},{"className":334},[],[336],{"type":52,"value":337},"image_list_presets",{"type":47,"tag":249,"props":339,"children":340},{},[341],{"type":52,"value":342},"Once at startup; builds the smart preset plan",{"type":47,"tag":222,"props":344,"children":345},{},[346,351,360],{"type":47,"tag":249,"props":347,"children":348},{},[349],{"type":52,"value":350},"Straighten",{"type":47,"tag":249,"props":352,"children":353},{},[354],{"type":47,"tag":76,"props":355,"children":357},{"className":356},[],[358],{"type":52,"value":359},"image_auto_straighten",{"type":47,"tag":249,"props":361,"children":362},{},[363],{"type":52,"value":364},"Per image",{"type":47,"tag":222,"props":366,"children":367},{},[368,373,384],{"type":47,"tag":249,"props":369,"children":370},{},[371],{"type":52,"value":372},"Auto-Tone",{"type":47,"tag":249,"props":374,"children":375},{},[376,382],{"type":47,"tag":76,"props":377,"children":379},{"className":378},[],[380],{"type":52,"value":381},"image_apply_auto_tone",{"type":52,"value":383}," (cameraRawFilter)",{"type":47,"tag":249,"props":385,"children":386},{},[387],{"type":52,"value":364},{"type":47,"tag":222,"props":389,"children":390},{},[391,396,405],{"type":47,"tag":249,"props":392,"children":393},{},[394],{"type":52,"value":395},"Tone adjustments",{"type":47,"tag":249,"props":397,"children":398},{},[399],{"type":47,"tag":76,"props":400,"children":402},{"className":401},[],[403],{"type":52,"value":404},"image_apply_adjustments",{"type":47,"tag":249,"props":406,"children":407},{},[408],{"type":52,"value":409},"Batch — all tweaks in one call",{"type":47,"tag":222,"props":411,"children":412},{},[413,418,427],{"type":47,"tag":249,"props":414,"children":415},{},[416],{"type":52,"value":417},"Subject\u002Fbody detect",{"type":47,"tag":249,"props":419,"children":420},{},[421],{"type":47,"tag":76,"props":422,"children":424},{"className":423},[],[425],{"type":52,"value":426},"image_select_subject",{"type":47,"tag":249,"props":428,"children":429},{},[430],{"type":52,"value":431},"Face + body parts + clothes detection",{"type":47,"tag":222,"props":433,"children":434},{},[435,440,449],{"type":47,"tag":249,"props":436,"children":437},{},[438],{"type":52,"value":439},"Adaptive Enhancements",{"type":47,"tag":249,"props":441,"children":442},{},[443],{"type":47,"tag":76,"props":444,"children":446},{"className":445},[],[447],{"type":52,"value":448},"image_apply_preset",{"type":47,"tag":249,"props":450,"children":451},{},[452],{"type":52,"value":453},"Per image, opt-in (see Step 5)",{"type":47,"tag":222,"props":455,"children":456},{},[457,462,471],{"type":47,"tag":249,"props":458,"children":459},{},[460],{"type":52,"value":461},"Background blur",{"type":47,"tag":249,"props":463,"children":464},{},[465],{"type":47,"tag":76,"props":466,"children":468},{"className":467},[],[469],{"type":52,"value":470},"image_apply_lens_blur",{"type":47,"tag":249,"props":472,"children":473},{},[474],{"type":52,"value":475},"Per image, preferred — depth-aware bokeh",{"type":47,"tag":222,"props":477,"children":478},{},[479,484,493],{"type":47,"tag":249,"props":480,"children":481},{},[482],{"type":52,"value":483},"Heavy\u002Fstylized blur",{"type":47,"tag":249,"props":485,"children":486},{},[487],{"type":47,"tag":76,"props":488,"children":490},{"className":489},[],[491],{"type":52,"value":492},"image_apply_gaussian_blur",{"type":47,"tag":249,"props":494,"children":495},{},[496],{"type":52,"value":497},"Per image, only if user explicitly requests heavy",{"type":47,"tag":222,"props":499,"children":500},{},[501,506,516],{"type":47,"tag":249,"props":502,"children":503},{},[504],{"type":52,"value":505},"Background cleanup",{"type":47,"tag":249,"props":507,"children":508},{},[509,514],{"type":47,"tag":76,"props":510,"children":512},{"className":511},[],[513],{"type":52,"value":165},{"type":52,"value":515}," (optional; generative)",{"type":47,"tag":249,"props":517,"children":518},{},[519,521],{"type":52,"value":520},"Only where the surface permits generative AI (tool available, e.g. Codex) — backgrounds only, never people; ",{"type":47,"tag":68,"props":522,"children":523},{},[524],{"type":52,"value":525},"not used on Claude",{"type":47,"tag":222,"props":527,"children":528},{},[529,534,543],{"type":47,"tag":249,"props":530,"children":531},{},[532],{"type":52,"value":533},"Crop",{"type":47,"tag":249,"props":535,"children":536},{},[537],{"type":47,"tag":76,"props":538,"children":540},{"className":539},[],[541],{"type":52,"value":542},"image_crop_and_resize",{"type":47,"tag":249,"props":544,"children":545},{},[546],{"type":52,"value":364},{"type":47,"tag":222,"props":548,"children":549},{},[550,555,563],{"type":47,"tag":249,"props":551,"children":552},{},[553],{"type":52,"value":554},"Sample preview",{"type":47,"tag":249,"props":556,"children":557},{},[558],{"type":47,"tag":76,"props":559,"children":561},{"className":560},[],[562],{"type":52,"value":89},{"type":47,"tag":249,"props":564,"children":565},{},[566,568,574,576],{"type":52,"value":567},"Before\u002Fafter on image",{"type":47,"tag":569,"props":570,"children":571},"span",{},[572],{"type":52,"value":573},"0",{"type":52,"value":575}," only ",{"type":47,"tag":100,"props":577,"children":578},{},[579],{"type":52,"value":580},"(no-widget fallback: present the URLs directly)",{"type":47,"tag":222,"props":582,"children":583},{},[584,589,597],{"type":47,"tag":249,"props":585,"children":586},{},[587],{"type":52,"value":588},"Final preview",{"type":47,"tag":249,"props":590,"children":591},{},[592],{"type":47,"tag":76,"props":593,"children":595},{"className":594},[],[596],{"type":52,"value":89},{"type":47,"tag":249,"props":598,"children":599},{},[600,602],{"type":52,"value":601},"All final URLs directly, no resize step ",{"type":47,"tag":100,"props":603,"children":604},{},[605],{"type":52,"value":580},{"type":47,"tag":222,"props":607,"children":608},{},[609,614,623],{"type":47,"tag":249,"props":610,"children":611},{},[612],{"type":52,"value":613},"Firefly Board",{"type":47,"tag":249,"props":615,"children":616},{},[617],{"type":47,"tag":76,"props":618,"children":620},{"className":619},[],[621],{"type":52,"value":622},"create_firefly_board",{"type":47,"tag":249,"props":624,"children":625},{},[626],{"type":52,"value":627},"Source presigned URLs from ingestion",{"type":47,"tag":116,"props":629,"children":630},{},[],{"type":47,"tag":120,"props":632,"children":634},{"id":633},"step-0-prereq-initialize-adobe-tools",[635],{"type":52,"value":636},"Step 0 - prereq: Initialize Adobe Tools",{"type":47,"tag":55,"props":638,"children":639},{},[640,642,648],{"type":52,"value":641},"Call ",{"type":47,"tag":76,"props":643,"children":645},{"className":644},[],[646],{"type":52,"value":647},"adobe_mandatory_init",{"type":52,"value":649}," first. This returns file handling rules and tool routing guidance required for the rest of the workflow.",{"type":47,"tag":651,"props":652,"children":657},"pre",{"className":653,"code":654,"language":655,"meta":656,"style":656},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"skill_name\": \"adobe-retouch-portraits\", \"skill_version\": \"3.1.0\" }\n","json","",[658],{"type":47,"tag":76,"props":659,"children":660},{"__ignoreMap":656},[661],{"type":47,"tag":569,"props":662,"children":665},{"class":663,"line":664},"line",1,[666,672,677,683,688,693,697,702,706,711,715,720,724,728,732,736,740],{"type":47,"tag":569,"props":667,"children":669},{"style":668},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[670],{"type":52,"value":671},"{",{"type":47,"tag":569,"props":673,"children":674},{"style":668},[675],{"type":52,"value":676}," \"",{"type":47,"tag":569,"props":678,"children":680},{"style":679},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[681],{"type":52,"value":682},"skill_name",{"type":47,"tag":569,"props":684,"children":685},{"style":668},[686],{"type":52,"value":687},"\"",{"type":47,"tag":569,"props":689,"children":690},{"style":668},[691],{"type":52,"value":692},":",{"type":47,"tag":569,"props":694,"children":695},{"style":668},[696],{"type":52,"value":676},{"type":47,"tag":569,"props":698,"children":700},{"style":699},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[701],{"type":52,"value":4},{"type":47,"tag":569,"props":703,"children":704},{"style":668},[705],{"type":52,"value":687},{"type":47,"tag":569,"props":707,"children":708},{"style":668},[709],{"type":52,"value":710},",",{"type":47,"tag":569,"props":712,"children":713},{"style":668},[714],{"type":52,"value":676},{"type":47,"tag":569,"props":716,"children":717},{"style":679},[718],{"type":52,"value":719},"skill_version",{"type":47,"tag":569,"props":721,"children":722},{"style":668},[723],{"type":52,"value":687},{"type":47,"tag":569,"props":725,"children":726},{"style":668},[727],{"type":52,"value":692},{"type":47,"tag":569,"props":729,"children":730},{"style":668},[731],{"type":52,"value":676},{"type":47,"tag":569,"props":733,"children":734},{"style":699},[735],{"type":52,"value":38},{"type":47,"tag":569,"props":737,"children":738},{"style":668},[739],{"type":52,"value":687},{"type":47,"tag":569,"props":741,"children":742},{"style":668},[743],{"type":52,"value":744}," }\n",{"type":47,"tag":55,"props":746,"children":747},{},[748,750,755,757,762,764,768,770,776],{"type":52,"value":749},"This also tells you which widgets this surface supports and whether egress is enabled. If ",{"type":47,"tag":76,"props":751,"children":753},{"className":752},[],[754],{"type":52,"value":81},{"type":52,"value":756}," and ",{"type":47,"tag":76,"props":758,"children":760},{"className":759},[],[761],{"type":52,"value":89},{"type":52,"value":763}," are available, follow the default flow (Steps 1, 2c, and 8 as written). If one is not available (e.g. Codex), use that step's ",{"type":47,"tag":100,"props":765,"children":766},{},[767],{"type":52,"value":104},{"type":52,"value":769},". If a tool result carries an ",{"type":47,"tag":76,"props":771,"children":773},{"className":772},[],[774],{"type":52,"value":775},"importantNote",{"type":52,"value":777},", or the connector injects \"Asset Storage & Display\" guidance for the current turn, follow it — it overrides the presentation defaults here.",{"type":47,"tag":116,"props":779,"children":780},{},[],{"type":47,"tag":120,"props":782,"children":784},{"id":783},"step-0b-discover-available-presets",[785],{"type":52,"value":786},"Step 0b: Discover Available Presets",{"type":47,"tag":55,"props":788,"children":789},{},[790,791,796],{"type":52,"value":641},{"type":47,"tag":76,"props":792,"children":794},{"className":793},[],[795],{"type":52,"value":337},{"type":52,"value":797}," immediately after init — before ingestion or user questions. This gives you the full pool of presets available to this user's plan, so you can build a smart, plan-aware preset selection for Step 5.",{"type":47,"tag":651,"props":799,"children":803},{"className":800,"code":802,"language":52},[801],"language-text","Tool: image_list_presets\nParams: {}\n",[804],{"type":47,"tag":76,"props":805,"children":806},{"__ignoreMap":656},[807],{"type":52,"value":802},{"type":47,"tag":55,"props":809,"children":810},{},[811,813,818],{"type":52,"value":812},"From the returned list, build a ",{"type":47,"tag":68,"props":814,"children":815},{},[816],{"type":52,"value":817},"Preset Plan",{"type":52,"value":819}," by categorizing presets into four buckets. Use the naming signals below to classify each preset — these are heuristics, not hardcoded names, so apply judgment:",{"type":47,"tag":821,"props":822,"children":824},"h3",{"id":823},"preset-plan-buckets",[825],{"type":52,"value":826},"Preset Plan Buckets",{"type":47,"tag":55,"props":828,"children":829},{},[830,835,837,843,845,851,852,858,859,865,866,872,873,879,880,886,887,893,894,900,901,907,908,914,915,921,922,928,929,935,936,942],{"type":47,"tag":68,"props":831,"children":832},{},[833],{"type":52,"value":834},"1. Adaptive Person Presets",{"type":52,"value":836}," — target the subject's body, skin, clothing, or teeth\nNaming signals: ",{"type":47,"tag":76,"props":838,"children":840},{"className":839},[],[841],{"type":52,"value":842},"Adaptive",{"type":52,"value":844},", ",{"type":47,"tag":76,"props":846,"children":848},{"className":847},[],[849],{"type":52,"value":850},"Subject",{"type":52,"value":844},{"type":47,"tag":76,"props":853,"children":855},{"className":854},[],[856],{"type":52,"value":857},"Portrait",{"type":52,"value":844},{"type":47,"tag":76,"props":860,"children":862},{"className":861},[],[863],{"type":52,"value":864},"Person",{"type":52,"value":844},{"type":47,"tag":76,"props":867,"children":869},{"className":868},[],[870],{"type":52,"value":871},"Skin",{"type":52,"value":844},{"type":47,"tag":76,"props":874,"children":876},{"className":875},[],[877],{"type":52,"value":878},"Body",{"type":52,"value":844},{"type":47,"tag":76,"props":881,"children":883},{"className":882},[],[884],{"type":52,"value":885},"Clothes",{"type":52,"value":844},{"type":47,"tag":76,"props":888,"children":890},{"className":889},[],[891],{"type":52,"value":892},"Outfit",{"type":52,"value":844},{"type":47,"tag":76,"props":895,"children":897},{"className":896},[],[898],{"type":52,"value":899},"Pop",{"type":52,"value":844},{"type":47,"tag":76,"props":902,"children":904},{"className":903},[],[905],{"type":52,"value":906},"Warm Pop",{"type":52,"value":844},{"type":47,"tag":76,"props":909,"children":911},{"className":910},[],[912],{"type":52,"value":913},"Enhance",{"type":52,"value":844},{"type":47,"tag":76,"props":916,"children":918},{"className":917},[],[919],{"type":52,"value":920},"Teeth",{"type":52,"value":844},{"type":47,"tag":76,"props":923,"children":925},{"className":924},[],[926],{"type":52,"value":927},"Whiten",{"type":52,"value":844},{"type":47,"tag":76,"props":930,"children":932},{"className":931},[],[933],{"type":52,"value":934},"Smile",{"type":52,"value":844},{"type":47,"tag":76,"props":937,"children":939},{"className":938},[],[940],{"type":52,"value":941},"Brighten",{"type":52,"value":943},"\nGoal: pick 1–3 presets that best boost the human subject. Prefer presets that target skin\u002Fbody or offer subject-level contrast\u002Fwarmth lift. Avoid presets that affect only sky or background. Any preset with teeth\u002Fsmile\u002Fwhiten signals should be included here so it is available when Whiten Teeth is selected in Step 2.",{"type":47,"tag":55,"props":945,"children":946},{},[947,952,954,960,961,967,968,974,975,981,982,988,989,995,996,1002,1003,1009,1010,1016,1017,1023,1024,1030,1031,1037,1039,1044],{"type":47,"tag":68,"props":948,"children":949},{},[950],{"type":52,"value":951},"2. Global Mood \u002F Tone Preset",{"type":52,"value":953}," — overall tonal character of the image\nNaming signals: ",{"type":47,"tag":76,"props":955,"children":957},{"className":956},[],[958],{"type":52,"value":959},"Mood",{"type":52,"value":844},{"type":47,"tag":76,"props":962,"children":964},{"className":963},[],[965],{"type":52,"value":966},"Tone",{"type":52,"value":844},{"type":47,"tag":76,"props":969,"children":971},{"className":970},[],[972],{"type":52,"value":973},"Warm",{"type":52,"value":844},{"type":47,"tag":76,"props":976,"children":978},{"className":977},[],[979],{"type":52,"value":980},"Cool",{"type":52,"value":844},{"type":47,"tag":76,"props":983,"children":985},{"className":984},[],[986],{"type":52,"value":987},"Golden",{"type":52,"value":844},{"type":47,"tag":76,"props":990,"children":992},{"className":991},[],[993],{"type":52,"value":994},"Cinematic",{"type":52,"value":844},{"type":47,"tag":76,"props":997,"children":999},{"className":998},[],[1000],{"type":52,"value":1001},"Film",{"type":52,"value":844},{"type":47,"tag":76,"props":1004,"children":1006},{"className":1005},[],[1007],{"type":52,"value":1008},"Natural",{"type":52,"value":844},{"type":47,"tag":76,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":52,"value":1015},"Airy",{"type":52,"value":844},{"type":47,"tag":76,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":52,"value":1022},"Fade",{"type":52,"value":844},{"type":47,"tag":76,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":52,"value":1029},"Matte",{"type":52,"value":844},{"type":47,"tag":76,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":52,"value":1036},"Classic",{"type":52,"value":1038},"\nGoal: pick exactly ",{"type":47,"tag":68,"props":1040,"children":1041},{},[1042],{"type":52,"value":1043},"1",{"type":52,"value":1045}," preset. Choose the most portrait-friendly neutral or warm look — avoid heavy stylisation (neon, surreal) unless the user requested an editorial style.",{"type":47,"tag":55,"props":1047,"children":1048},{},[1049,1054,1056,1062,1063,1069,1070,1076,1077,1083,1084,1090,1091,1097,1098,1104,1105,1111,1112,1118,1119,1125,1126,1132,1133,1138,1139,1143],{"type":47,"tag":68,"props":1050,"children":1051},{},[1052],{"type":52,"value":1053},"3. Global Toon \u002F Look Preset",{"type":52,"value":1055}," — stylistic look treatment\nNaming signals: ",{"type":47,"tag":76,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":52,"value":1061},"Toon",{"type":52,"value":844},{"type":47,"tag":76,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":52,"value":1068},"Style",{"type":52,"value":844},{"type":47,"tag":76,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":52,"value":1075},"Look",{"type":52,"value":844},{"type":47,"tag":76,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":52,"value":1082},"Preset",{"type":52,"value":844},{"type":47,"tag":76,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":52,"value":1089},"Vintage",{"type":52,"value":844},{"type":47,"tag":76,"props":1092,"children":1094},{"className":1093},[],[1095],{"type":52,"value":1096},"Retro",{"type":52,"value":844},{"type":47,"tag":76,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":52,"value":1103},"B&W",{"type":52,"value":844},{"type":47,"tag":76,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":52,"value":1110},"Mono",{"type":52,"value":844},{"type":47,"tag":76,"props":1113,"children":1115},{"className":1114},[],[1116],{"type":52,"value":1117},"Haze",{"type":52,"value":844},{"type":47,"tag":76,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":52,"value":1124},"Glow",{"type":52,"value":844},{"type":47,"tag":76,"props":1127,"children":1129},{"className":1128},[],[1130],{"type":52,"value":1131},"Edit",{"type":52,"value":844},{"type":47,"tag":76,"props":1134,"children":1136},{"className":1135},[],[1137],{"type":52,"value":13},{"type":52,"value":1038},{"type":47,"tag":68,"props":1140,"children":1141},{},[1142],{"type":52,"value":1043},{"type":52,"value":1144}," preset. Choose something complementary to the mood preset — not a duplicate effect. If the mood preset is already cinematic\u002Fwarm, choose a lighter stylistic touch.",{"type":47,"tag":55,"props":1146,"children":1147},{},[1148,1153,1155,1161,1162,1168,1169,1175,1176,1182,1183,1189,1190,1196,1197,1201,1203,1208],{"type":47,"tag":68,"props":1149,"children":1150},{},[1151],{"type":52,"value":1152},"4. Background Blur Preset",{"type":52,"value":1154}," — softens background to flatter the subject\nNaming signals: ",{"type":47,"tag":76,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":52,"value":1160},"Blur Background",{"type":52,"value":844},{"type":47,"tag":76,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":52,"value":1167},"BG Blur",{"type":52,"value":844},{"type":47,"tag":76,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":52,"value":1174},"Bokeh",{"type":52,"value":844},{"type":47,"tag":76,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":52,"value":1181},"Depth",{"type":52,"value":844},{"type":47,"tag":76,"props":1184,"children":1186},{"className":1185},[],[1187],{"type":52,"value":1188},"Focus",{"type":52,"value":844},{"type":47,"tag":76,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":52,"value":1195},"Defocus",{"type":52,"value":1038},{"type":47,"tag":68,"props":1198,"children":1199},{},[1200],{"type":52,"value":1043},{"type":52,"value":1202}," blur-background preset. This replaces ",{"type":47,"tag":76,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":52,"value":492},{"type":52,"value":1209}," when the user opts into it.",{"type":47,"tag":55,"props":1211,"children":1212},{},[1213],{"type":47,"tag":68,"props":1214,"children":1215},{},[1216],{"type":52,"value":1217},"Fallback strategy:",{"type":47,"tag":1219,"props":1220,"children":1221},"ul",{},[1222,1228,1238],{"type":47,"tag":1223,"props":1224,"children":1225},"li",{},[1226],{"type":52,"value":1227},"If no preset matches a bucket, leave that bucket empty rather than forcing a poor fit.",{"type":47,"tag":1223,"props":1229,"children":1230},{},[1231,1233],{"type":52,"value":1232},"If the plan returns no presets at all (403 or empty list), skip Step 5 entirely and note it in the summary: \"Adaptive enhancements not available — no presets found on this plan.\" ",{"type":47,"tag":68,"props":1234,"children":1235},{},[1236],{"type":52,"value":1237},"This is a non-blocking error — all other pipeline steps (tone adjustments, preview gate, full batch) continue exactly as normal. Only Step 5 is skipped.",{"type":47,"tag":1223,"props":1239,"children":1240},{},[1241],{"type":52,"value":1242},"Buckets 2 and 3 are global mood\u002Fstyle layers — skip them if you cannot find a clearly portrait-appropriate match. It's better to skip than to apply an ill-fitting preset.",{"type":47,"tag":55,"props":1244,"children":1245},{},[1246,1248,1252],{"type":52,"value":1247},"Store the chosen presets as your ",{"type":47,"tag":68,"props":1249,"children":1250},{},[1251],{"type":52,"value":817},{"type":52,"value":1253}," before Step 2. The user's mood\u002Fstyle selection (collected in Step 2a) may refine which preset is chosen within each bucket — see Step 2a for guidance. Show the final plan to the user in the confirmation message (Step 2).",{"type":47,"tag":116,"props":1255,"children":1256},{},[],{"type":47,"tag":120,"props":1258,"children":1260},{"id":1259},"step-1-image-ingestion",[1261],{"type":52,"value":1262},"Step 1: Image Ingestion",{"type":47,"tag":55,"props":1264,"children":1265},{},[1266,1267,1272],{"type":52,"value":641},{"type":47,"tag":76,"props":1268,"children":1270},{"className":1269},[],[1271],{"type":52,"value":81},{"type":52,"value":1273}," with no parameters. This renders an interactive UI where\nthe user can:",{"type":47,"tag":1219,"props":1275,"children":1276},{},[1277,1287,1297],{"type":47,"tag":1223,"props":1278,"children":1279},{},[1280,1285],{"type":47,"tag":68,"props":1281,"children":1282},{},[1283],{"type":52,"value":1284},"Browse CC storage",{"type":52,"value":1286}," and select a folder or individual files",{"type":47,"tag":1223,"props":1288,"children":1289},{},[1290,1295],{"type":47,"tag":68,"props":1291,"children":1292},{},[1293],{"type":52,"value":1294},"Upload from device",{"type":52,"value":1296}," (local files)",{"type":47,"tag":1223,"props":1298,"children":1299},{},[1300,1305],{"type":47,"tag":68,"props":1301,"children":1302},{},[1303],{"type":52,"value":1304},"In Cowork",{"type":52,"value":1306},": select a local folder path directly",{"type":47,"tag":651,"props":1308,"children":1311},{"className":1309,"code":1310,"language":52},[801],"Tool: asset_add_file\nParams: {}\n",[1312],{"type":47,"tag":76,"props":1313,"children":1314},{"__ignoreMap":656},[1315],{"type":52,"value":1310},{"type":47,"tag":55,"props":1317,"children":1318},{},[1319,1324,1326,1331,1333,1339,1341,1346],{"type":47,"tag":68,"props":1320,"children":1321},{},[1322],{"type":52,"value":1323},"Important:",{"type":52,"value":1325}," ",{"type":47,"tag":76,"props":1327,"children":1329},{"className":1328},[],[1330],{"type":52,"value":81},{"type":52,"value":1332}," returns ",{"type":47,"tag":76,"props":1334,"children":1336},{"className":1335},[],[1337],{"type":52,"value":1338},"imageURIs: []",{"type":52,"value":1340}," — this is expected and\nNOT an error. The actual URIs arrive in the ",{"type":47,"tag":68,"props":1342,"children":1343},{},[1344],{"type":52,"value":1345},"next user message",{"type":52,"value":1347}," after the\nuser selects files. Wait for that follow-up before continuing.",{"type":47,"tag":55,"props":1349,"children":1350},{},[1351,1353,1358,1360,1365,1367,1373,1375,1380],{"type":52,"value":1352},"After receiving the URIs, call ",{"type":47,"tag":76,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":52,"value":269},{"type":52,"value":1359}," with ",{"type":47,"tag":76,"props":1361,"children":1363},{"className":1362},[],[1364],{"type":52,"value":81},{"type":52,"value":1366}," to resolve them to correct presigned S3 URLs. Use those resolved URLs for all subsequent tool calls — ",{"type":47,"tag":76,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":52,"value":1372},"dcx-stage.adobe.io",{"type":52,"value":1374}," URIs are network-blocked and must be resolved via ",{"type":47,"tag":76,"props":1376,"children":1378},{"className":1377},[],[1379],{"type":52,"value":269},{"type":52,"value":1381}," first.",{"type":47,"tag":55,"props":1383,"children":1384},{},[1385,1387,1393],{"type":52,"value":1386},"Collect the resulting presigned URLs as ",{"type":47,"tag":76,"props":1388,"children":1390},{"className":1389},[],[1391],{"type":52,"value":1392},"sourceURIs[]",{"type":52,"value":1394}," and continue to Step 2a.",{"type":47,"tag":61,"props":1396,"children":1397},{},[1398,1428,1511],{"type":47,"tag":55,"props":1399,"children":1400},{},[1401,1405,1406,1418,1420,1426],{"type":47,"tag":68,"props":1402,"children":1403},{},[1404],{"type":52,"value":104},{"type":52,"value":1325},{"type":47,"tag":100,"props":1407,"children":1408},{},[1409,1411,1416],{"type":52,"value":1410},"(only if ",{"type":47,"tag":76,"props":1412,"children":1414},{"className":1413},[],[1415],{"type":52,"value":81},{"type":52,"value":1417}," is unavailable on this surface, e.g. Codex)",{"type":52,"value":1419}," — don't ask the user to pick; get the source URIs from where the files are. ",{"type":47,"tag":76,"props":1421,"children":1423},{"className":1422},[],[1424],{"type":52,"value":1425},"image_*",{"type":52,"value":1427}," tools only accept Creative Cloud storage URIs — never raw local paths.",{"type":47,"tag":214,"props":1429,"children":1430},{},[1431,1447],{"type":47,"tag":218,"props":1432,"children":1433},{},[1434],{"type":47,"tag":222,"props":1435,"children":1436},{},[1437,1442],{"type":47,"tag":226,"props":1438,"children":1439},{},[1440],{"type":52,"value":1441},"Source",{"type":47,"tag":226,"props":1443,"children":1444},{},[1445],{"type":52,"value":1446},"Action",{"type":47,"tag":242,"props":1448,"children":1449},{},[1450,1498],{"type":47,"tag":222,"props":1451,"children":1452},{},[1453,1466],{"type":47,"tag":249,"props":1454,"children":1455},{},[1456,1458,1464],{"type":52,"value":1457},"File(s) at a local path (e.g. ",{"type":47,"tag":76,"props":1459,"children":1461},{"className":1460},[],[1462],{"type":52,"value":1463},"\u002Fmnt\u002Fuser-data\u002Fuploads\u002F…",{"type":52,"value":1465},")",{"type":47,"tag":249,"props":1467,"children":1468},{},[1469,1480,1482,1488,1490,1496],{"type":47,"tag":68,"props":1470,"children":1471},{},[1472,1474,1479],{"type":52,"value":1473},"Check egress status from ",{"type":47,"tag":76,"props":1475,"children":1477},{"className":1476},[],[1478],{"type":52,"value":647},{"type":52,"value":1381},{"type":52,"value":1481}," If egress is enabled: stage each file programmatically — get file size and MIME type, call ",{"type":47,"tag":76,"props":1483,"children":1485},{"className":1484},[],[1486],{"type":52,"value":1487},"asset_initialize_file_upload({ path: \"\u003Cfilename>\", media_type: \"\u003Cmime>\" })",{"type":52,"value":1489},", PUT the bytes to the returned upload URL, then ",{"type":47,"tag":76,"props":1491,"children":1493},{"className":1492},[],[1494],{"type":52,"value":1495},"asset_finalize_file_upload({ filename: \"\u003Cfilename>\", transfer_document: \u003Cfrom initialize response> })",{"type":52,"value":1497},"; use each returned presigned CC URL for downstream calls. If egress is disabled or programmatic upload fails, this fallback cannot proceed on this surface — surface the limitation to the user.",{"type":47,"tag":222,"props":1499,"children":1500},{},[1501,1506],{"type":47,"tag":249,"props":1502,"children":1503},{},[1504],{"type":52,"value":1505},"File(s) already in Creative Cloud",{"type":47,"tag":249,"props":1507,"children":1508},{},[1509],{"type":52,"value":1510},"Reference them directly by their CC presigned URL.",{"type":47,"tag":55,"props":1512,"children":1513},{},[1514,1516,1521,1523,1528,1530,1535],{"type":52,"value":1515},"The programmatic path uses neither ",{"type":47,"tag":76,"props":1517,"children":1519},{"className":1518},[],[1520],{"type":52,"value":81},{"type":52,"value":1522}," nor ",{"type":47,"tag":76,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":52,"value":269},{"type":52,"value":1529},". Collect the resulting presigned CC URLs as ",{"type":47,"tag":76,"props":1531,"children":1533},{"className":1532},[],[1534],{"type":52,"value":1392},{"type":52,"value":1536},".",{"type":47,"tag":116,"props":1538,"children":1539},{},[],{"type":47,"tag":120,"props":1541,"children":1543},{"id":1542},"step-2a-mood-style-selection",[1544],{"type":52,"value":1545},"Step 2a: Mood & Style Selection",{"type":47,"tag":55,"props":1547,"children":1548},{},[1549],{"type":52,"value":1550},"Before presenting the pipeline plan, ask the user what mood and style they want for their portraits. This drives which presets are prioritised within the Preset Plan buckets.",{"type":47,"tag":55,"props":1552,"children":1553},{},[1554,1559],{"type":47,"tag":68,"props":1555,"children":1556},{},[1557],{"type":52,"value":1558},"If the user's message already states a clear mood\u002Fstyle",{"type":52,"value":1560}," (e.g. \"warm and glowing\", \"dark and moody\", \"clean headshots\", \"editorial\"), infer it directly — skip this question and map it using the table below.",{"type":47,"tag":55,"props":1562,"children":1563},{},[1564,1569],{"type":47,"tag":68,"props":1565,"children":1566},{},[1567],{"type":52,"value":1568},"If no mood\u002Fstyle is specified",{"type":52,"value":1570},", post this message and ask:",{"type":47,"tag":651,"props":1572,"children":1575},{"className":1573,"code":1574,"language":52},[801],"📸 Got [N] photo(s)! Before I build your retouching plan — what kind of look are you going for?\n",[1576],{"type":47,"tag":76,"props":1577,"children":1578},{"__ignoreMap":656},[1579],{"type":52,"value":1574},{"type":47,"tag":651,"props":1581,"children":1584},{"className":1582,"code":1583,"language":52},[801],"Question (single_select):\n  question: \"🎨 What mood or style do you want for these portraits?\"\n  options:\n    - \"Natural & Clean — true-to-life, polished, minimal\"\n    - \"Warm & Glowing — golden, soft, flattering\"\n    - \"Moody & Dramatic — dark, contrasty, editorial\"\n    - \"Bright & Airy — light, fresh, lifestyle\"\n    - \"Cinematic — film-inspired, desaturated, storytelling\"\n    - \"Bold & Vibrant — punchy, vivid, social-ready\"\n",[1585],{"type":47,"tag":76,"props":1586,"children":1587},{"__ignoreMap":656},[1588],{"type":52,"value":1583},{"type":47,"tag":55,"props":1590,"children":1591},{},[1592,1597],{"type":47,"tag":68,"props":1593,"children":1594},{},[1595],{"type":52,"value":1596},"Hold",{"type":52,"value":1598}," — do not proceed to Step 2 until the user replies. (This hold applies only when the question was asked. If mood\u002Fstyle was already inferred from the user's message, skip this hold and proceed directly to Step 2.)",{"type":47,"tag":821,"props":1600,"children":1602},{"id":1601},"mood-preset-plan-guidance",[1603],{"type":52,"value":1604},"Mood → Preset Plan guidance",{"type":47,"tag":55,"props":1606,"children":1607},{},[1608],{"type":52,"value":1609},"Use the selected mood to refine your Preset Plan (built in Step 0b). Within each bucket, prefer presets whose names align with the chosen mood:",{"type":47,"tag":214,"props":1611,"children":1612},{},[1613,1633],{"type":47,"tag":218,"props":1614,"children":1615},{},[1616],{"type":47,"tag":222,"props":1617,"children":1618},{},[1619,1623,1628],{"type":47,"tag":226,"props":1620,"children":1621},{},[1622],{"type":52,"value":959},{"type":47,"tag":226,"props":1624,"children":1625},{},[1626],{"type":52,"value":1627},"Favour in Mood\u002FTone bucket",{"type":47,"tag":226,"props":1629,"children":1630},{},[1631],{"type":52,"value":1632},"Favour in Toon\u002FLook bucket",{"type":47,"tag":242,"props":1634,"children":1635},{},[1636,1677,1724,1788,1830,1884],{"type":47,"tag":222,"props":1637,"children":1638},{},[1639,1644,1672],{"type":47,"tag":249,"props":1640,"children":1641},{},[1642],{"type":52,"value":1643},"Natural & Clean",{"type":47,"tag":249,"props":1645,"children":1646},{},[1647,1652,1653,1659,1660,1665,1666],{"type":47,"tag":76,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":52,"value":1008},{"type":52,"value":844},{"type":47,"tag":76,"props":1654,"children":1656},{"className":1655},[],[1657],{"type":52,"value":1658},"Clean",{"type":52,"value":844},{"type":47,"tag":76,"props":1661,"children":1663},{"className":1662},[],[1664],{"type":52,"value":1036},{"type":52,"value":844},{"type":47,"tag":76,"props":1667,"children":1669},{"className":1668},[],[1670],{"type":52,"value":1671},"Neutral",{"type":47,"tag":249,"props":1673,"children":1674},{},[1675],{"type":52,"value":1676},"light\u002Fsubtle look",{"type":47,"tag":222,"props":1678,"children":1679},{},[1680,1685,1719],{"type":47,"tag":249,"props":1681,"children":1682},{},[1683],{"type":52,"value":1684},"Warm & Glowing",{"type":47,"tag":249,"props":1686,"children":1687},{},[1688,1693,1694,1699,1700,1705,1706,1712,1713],{"type":47,"tag":76,"props":1689,"children":1691},{"className":1690},[],[1692],{"type":52,"value":973},{"type":52,"value":844},{"type":47,"tag":76,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":52,"value":987},{"type":52,"value":844},{"type":47,"tag":76,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":52,"value":1124},{"type":52,"value":844},{"type":47,"tag":76,"props":1707,"children":1709},{"className":1708},[],[1710],{"type":52,"value":1711},"Sunset",{"type":52,"value":844},{"type":47,"tag":76,"props":1714,"children":1716},{"className":1715},[],[1717],{"type":52,"value":1718},"Amber",{"type":47,"tag":249,"props":1720,"children":1721},{},[1722],{"type":52,"value":1723},"warm complementary",{"type":47,"tag":222,"props":1725,"children":1726},{},[1727,1732,1768],{"type":47,"tag":249,"props":1728,"children":1729},{},[1730],{"type":52,"value":1731},"Moody & Dramatic",{"type":47,"tag":249,"props":1733,"children":1734},{},[1735,1741,1742,1748,1749,1754,1755,1761,1762],{"type":47,"tag":76,"props":1736,"children":1738},{"className":1737},[],[1739],{"type":52,"value":1740},"Moody",{"type":52,"value":844},{"type":47,"tag":76,"props":1743,"children":1745},{"className":1744},[],[1746],{"type":52,"value":1747},"Dark",{"type":52,"value":844},{"type":47,"tag":76,"props":1750,"children":1752},{"className":1751},[],[1753],{"type":52,"value":994},{"type":52,"value":844},{"type":47,"tag":76,"props":1756,"children":1758},{"className":1757},[],[1759],{"type":52,"value":1760},"Shadow",{"type":52,"value":844},{"type":47,"tag":76,"props":1763,"children":1765},{"className":1764},[],[1766],{"type":52,"value":1767},"Drama",{"type":47,"tag":249,"props":1769,"children":1770},{},[1771,1776,1777,1782,1783],{"type":47,"tag":76,"props":1772,"children":1774},{"className":1773},[],[1775],{"type":52,"value":1029},{"type":52,"value":844},{"type":47,"tag":76,"props":1778,"children":1780},{"className":1779},[],[1781],{"type":52,"value":1022},{"type":52,"value":844},{"type":47,"tag":76,"props":1784,"children":1786},{"className":1785},[],[1787],{"type":52,"value":1089},{"type":47,"tag":222,"props":1789,"children":1790},{},[1791,1796,1825],{"type":47,"tag":249,"props":1792,"children":1793},{},[1794],{"type":52,"value":1795},"Bright & Airy",{"type":47,"tag":249,"props":1797,"children":1798},{},[1799,1804,1805,1811,1812,1818,1819],{"type":47,"tag":76,"props":1800,"children":1802},{"className":1801},[],[1803],{"type":52,"value":1015},{"type":52,"value":844},{"type":47,"tag":76,"props":1806,"children":1808},{"className":1807},[],[1809],{"type":52,"value":1810},"Bright",{"type":52,"value":844},{"type":47,"tag":76,"props":1813,"children":1815},{"className":1814},[],[1816],{"type":52,"value":1817},"Light",{"type":52,"value":844},{"type":47,"tag":76,"props":1820,"children":1822},{"className":1821},[],[1823],{"type":52,"value":1824},"Fresh",{"type":47,"tag":249,"props":1826,"children":1827},{},[1828],{"type":52,"value":1829},"soft, bright look",{"type":47,"tag":222,"props":1831,"children":1832},{},[1833,1837,1863],{"type":47,"tag":249,"props":1834,"children":1835},{},[1836],{"type":52,"value":994},{"type":47,"tag":249,"props":1838,"children":1839},{},[1840,1845,1846,1851,1852,1857,1858],{"type":47,"tag":76,"props":1841,"children":1843},{"className":1842},[],[1844],{"type":52,"value":994},{"type":52,"value":844},{"type":47,"tag":76,"props":1847,"children":1849},{"className":1848},[],[1850],{"type":52,"value":1001},{"type":52,"value":844},{"type":47,"tag":76,"props":1853,"children":1855},{"className":1854},[],[1856],{"type":52,"value":1022},{"type":52,"value":844},{"type":47,"tag":76,"props":1859,"children":1861},{"className":1860},[],[1862],{"type":52,"value":1036},{"type":47,"tag":249,"props":1864,"children":1865},{},[1866,1871,1872,1878,1879],{"type":47,"tag":76,"props":1867,"children":1869},{"className":1868},[],[1870],{"type":52,"value":1029},{"type":52,"value":844},{"type":47,"tag":76,"props":1873,"children":1875},{"className":1874},[],[1876],{"type":52,"value":1877},"Grain",{"type":52,"value":844},{"type":47,"tag":76,"props":1880,"children":1882},{"className":1881},[],[1883],{"type":52,"value":1096},{"type":47,"tag":222,"props":1885,"children":1886},{},[1887,1892,1921],{"type":47,"tag":249,"props":1888,"children":1889},{},[1890],{"type":52,"value":1891},"Bold & Vibrant",{"type":47,"tag":249,"props":1893,"children":1894},{},[1895,1901,1902,1907,1908,1914,1915],{"type":47,"tag":76,"props":1896,"children":1898},{"className":1897},[],[1899],{"type":52,"value":1900},"Vibrant",{"type":52,"value":844},{"type":47,"tag":76,"props":1903,"children":1905},{"className":1904},[],[1906],{"type":52,"value":899},{"type":52,"value":844},{"type":47,"tag":76,"props":1909,"children":1911},{"className":1910},[],[1912],{"type":52,"value":1913},"Bold",{"type":52,"value":844},{"type":47,"tag":76,"props":1916,"children":1918},{"className":1917},[],[1919],{"type":52,"value":1920},"Vivid",{"type":47,"tag":249,"props":1922,"children":1923},{},[1924],{"type":52,"value":1925},"punchy look",{"type":47,"tag":55,"props":1927,"children":1928},{},[1929],{"type":52,"value":1930},"If the Preset Plan has multiple candidates in a bucket, pick the one that best matches the chosen mood. If only one preset exists in a bucket, use it regardless of mood.",{"type":47,"tag":116,"props":1932,"children":1933},{},[],{"type":47,"tag":120,"props":1935,"children":1937},{"id":1936},"step-2-announce-pipeline-offer-options",[1938],{"type":52,"value":1939},"Step 2: Announce Pipeline + Offer Options",{"type":47,"tag":55,"props":1941,"children":1942},{},[1943,1945,1950],{"type":52,"value":1944},"Once the mood\u002Fstyle is confirmed, check whether the user's message ",{"type":47,"tag":68,"props":1946,"children":1947},{},[1948],{"type":52,"value":1949},"already fully specifies",{"type":52,"value":1951}," their enhancement, tweak, and crop preferences.",{"type":47,"tag":55,"props":1953,"children":1954},{},[1955,1960,1962,1967],{"type":47,"tag":68,"props":1956,"children":1957},{},[1958],{"type":52,"value":1959},"If preferences are fully stated upfront",{"type":52,"value":1961}," (e.g. \"retouch with subject pop, no tweaks, crop 1:1\"), skip ",{"type":47,"tag":76,"props":1963,"children":1965},{"className":1964},[],[1966],{"type":52,"value":112},{"type":52,"value":1968}," entirely and go straight to the confirmation message, then proceed directly to Step 2c (sample preview). The preview gate is mandatory — it runs even when all preferences are stated upfront. Do NOT start the full batch without it. Map their stated preferences using the button→parameter table below.",{"type":47,"tag":55,"props":1970,"children":1971},{},[1972,1977],{"type":47,"tag":68,"props":1973,"children":1974},{},[1975],{"type":52,"value":1976},"If preferences are not fully stated",{"type":52,"value":1978}," (e.g. \"please retouch them\" with no further detail), post this message first:",{"type":47,"tag":651,"props":1980,"children":1983},{"className":1981,"code":1982,"language":52},[801],"📸 Got [N] photo(s)! The default pipeline will auto-straighten and auto-tone every image.\n\nLet me know if you'd like any extras 👇\n",[1984],{"type":47,"tag":76,"props":1985,"children":1986},{"__ignoreMap":656},[1987],{"type":52,"value":1982},{"type":47,"tag":55,"props":1989,"children":1990},{},[1991,1993,1998],{"type":52,"value":1992},"Then call ",{"type":47,"tag":76,"props":1994,"children":1996},{"className":1995},[],[1997],{"type":52,"value":112},{"type":52,"value":1999}," with these three questions:",{"type":47,"tag":651,"props":2001,"children":2004},{"className":2002,"code":2003,"language":52},[801],"Question 1 (multi_select):\n  question: \"✨ Adaptive AI enhancements (select any — or none to skip)\"\n  options:\n    - \"All\"\n    - \"Enhance Subject — adaptive preset boosts on the person, skin & clothes\"\n    - \"Mood & Tone — apply a portrait-flattering global tone look\"\n    - \"Toon & Style — apply a stylistic look treatment\"\n    - \"Blur Background — soft bg blur preset, respects edges\"\n    - \"Whiten Teeth — brightens teeth (smiles only)\"\n    - \"None\"\n\nQuestion 2 (multi_select):\n  question: \"🎛️ Manual tweaks (select any — or none to skip)\"\n  options:\n    - \"Recover highlights\"\n    - \"Lift shadows\"\n    - \"More contrast\"\n    - \"More vibrant\"\n    - \"Desaturate (muted tones)\"\n    - \"Blur background — depth-aware bokeh (standard)\"\n    - \"Heavy background blur — stylized gaussian blur\"\n    - \"None\"\n\nQuestion 3 (single_select):\n  question: \"✂️ Crop ratio\"\n  options:\n    - \"Auto (landscape→4:3, portrait→3:4)\"\n    - \"1:1 square\"\n    - \"4:5 portrait\"\n    - \"16:9 wide\"\n",[2005],{"type":47,"tag":76,"props":2006,"children":2007},{"__ignoreMap":656},[2008],{"type":52,"value":2003},{"type":47,"tag":55,"props":2010,"children":2011},{},[2012],{"type":47,"tag":68,"props":2013,"children":2014},{},[2015],{"type":52,"value":2016},"Hold processing until the user replies with their selections.",{"type":47,"tag":821,"props":2018,"children":2020},{"id":2019},"mapping-button-selections-to-parameters",[2021],{"type":52,"value":2022},"Mapping button selections to parameters",{"type":47,"tag":55,"props":2024,"children":2025},{},[2026],{"type":47,"tag":68,"props":2027,"children":2028},{},[2029],{"type":52,"value":2030},"Adaptive enhancements (mapped to Preset Plan built in Step 0b):",{"type":47,"tag":1219,"props":2032,"children":2033},{},[2034,2039,2051,2062,2073,2085,2090,2109,2122,2143,2156,2184,2197,2217,2236,2246,2273,2290,2307],{"type":47,"tag":1223,"props":2035,"children":2036},{},[2037],{"type":52,"value":2038},"\"All\" → run all four buckets (Adaptive Person + Mood + Toon + Blur BG), plus Whiten Teeth if face detected",{"type":47,"tag":1223,"props":2040,"children":2041},{},[2042,2044,2049],{"type":52,"value":2043},"\"Enhance Subject\" → apply all presets in the ",{"type":47,"tag":68,"props":2045,"children":2046},{},[2047],{"type":52,"value":2048},"Adaptive Person Presets",{"type":52,"value":2050}," bucket",{"type":47,"tag":1223,"props":2052,"children":2053},{},[2054,2056,2061],{"type":52,"value":2055},"\"Mood & Tone\" → apply the single preset from the ",{"type":47,"tag":68,"props":2057,"children":2058},{},[2059],{"type":52,"value":2060},"Global Mood \u002F Tone",{"type":52,"value":2050},{"type":47,"tag":1223,"props":2063,"children":2064},{},[2065,2067,2072],{"type":52,"value":2066},"\"Toon & Style\" → apply the single preset from the ",{"type":47,"tag":68,"props":2068,"children":2069},{},[2070],{"type":52,"value":2071},"Global Toon \u002F Look",{"type":52,"value":2050},{"type":47,"tag":1223,"props":2074,"children":2075},{},[2076,2078,2083],{"type":52,"value":2077},"\"Blur Background\" → apply the preset from the ",{"type":47,"tag":68,"props":2079,"children":2080},{},[2081],{"type":52,"value":2082},"Background Blur",{"type":52,"value":2084}," bucket (skip Step 6 for that image)",{"type":47,"tag":1223,"props":2086,"children":2087},{},[2088],{"type":52,"value":2089},"\"Whiten Teeth\" → apply the Whiten Teeth preset from the Adaptive Person Presets bucket (skip if no face detected; see body detection in Step 5)",{"type":47,"tag":1223,"props":2091,"children":2092},{},[2093,2095,2100,2102,2107],{"type":52,"value":2094},"\"None\" → skip Step 5 entirely\n",{"type":47,"tag":68,"props":2096,"children":2097},{},[2098],{"type":52,"value":2099},"Manual tweaks",{"type":52,"value":2101}," (all combined into one ",{"type":47,"tag":76,"props":2103,"children":2105},{"className":2104},[],[2106],{"type":52,"value":404},{"type":52,"value":2108}," call in Step 4b — use diagnostic ranges, not hardcoded defaults):",{"type":47,"tag":1223,"props":2110,"children":2111},{},[2112,2114,2120],{"type":52,"value":2113},"\"Recover highlights\" → ",{"type":47,"tag":76,"props":2115,"children":2117},{"className":2116},[],[2118],{"type":52,"value":2119},"highlights: -40 to -70",{"type":52,"value":2121}," (use -40 for mildly blown; -70 for heavily overexposed highlights)",{"type":47,"tag":1223,"props":2123,"children":2124},{},[2125,2127,2133,2135,2141],{"type":52,"value":2126},"\"Lift shadows\" → ",{"type":47,"tag":76,"props":2128,"children":2130},{"className":2129},[],[2131],{"type":52,"value":2132},"darks: +30 to +50",{"type":52,"value":2134}," (positive lifts shadow detail; use +30 for slight lift; +50 for very crushed shadows; prefer ",{"type":47,"tag":76,"props":2136,"children":2138},{"className":2137},[],[2139],{"type":52,"value":2140},"vibrance",{"type":52,"value":2142}," to compensate if skin goes dull)",{"type":47,"tag":1223,"props":2144,"children":2145},{},[2146,2148,2154],{"type":52,"value":2147},"\"More contrast\" → ",{"type":47,"tag":76,"props":2149,"children":2151},{"className":2150},[],[2152],{"type":52,"value":2153},"contrast: +15 to +30",{"type":52,"value":2155}," (use +15 for slight pop; +30 only if image is very flat)",{"type":47,"tag":1223,"props":2157,"children":2158},{},[2159,2161,2167,2169,2174,2176,2182],{"type":52,"value":2160},"\"More vibrant\" → ",{"type":47,"tag":76,"props":2162,"children":2164},{"className":2163},[],[2165],{"type":52,"value":2166},"vibrance: +15 to +30",{"type":52,"value":2168}," (prefer ",{"type":47,"tag":76,"props":2170,"children":2172},{"className":2171},[],[2173],{"type":52,"value":2140},{"type":52,"value":2175}," over ",{"type":47,"tag":76,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":52,"value":2181},"saturation",{"type":52,"value":2183}," for portraits — vibrance protects skin tones)",{"type":47,"tag":1223,"props":2185,"children":2186},{},[2187,2189,2195],{"type":52,"value":2188},"\"Desaturate\" → ",{"type":47,"tag":76,"props":2190,"children":2192},{"className":2191},[],[2193],{"type":52,"value":2194},"saturation: -20 to -40",{"type":52,"value":2196}," (use -20 for muted; -40 for near-monochrome look)",{"type":47,"tag":1223,"props":2198,"children":2199},{},[2200,2202,2207,2209,2215],{"type":52,"value":2201},"\"Blur background — depth-aware bokeh (standard)\" → ",{"type":47,"tag":76,"props":2203,"children":2205},{"className":2204},[],[2206],{"type":52,"value":470},{"type":52,"value":2208}," → ",{"type":47,"tag":76,"props":2210,"children":2212},{"className":2211},[],[2213],{"type":52,"value":2214},"blurRadius: 8",{"type":52,"value":2216}," (depth-aware, realistic bokeh; skip Step 6 if adaptive blur preset also applied)",{"type":47,"tag":1223,"props":2218,"children":2219},{},[2220,2222,2227,2228,2234],{"type":52,"value":2221},"\"Heavy background blur — stylized gaussian blur\" → ",{"type":47,"tag":76,"props":2223,"children":2225},{"className":2224},[],[2226],{"type":52,"value":492},{"type":52,"value":2208},{"type":47,"tag":76,"props":2229,"children":2231},{"className":2230},[],[2232],{"type":52,"value":2233},"blurRadius: 12, blurTarget: \"background\"",{"type":52,"value":2235}," (use only when user explicitly requests heavy\u002Fstylized blur; do not combine with Blur Background adaptive preset)",{"type":47,"tag":1223,"props":2237,"children":2238},{},[2239,2241],{"type":52,"value":2240},"\"None\" → skip Step 4b entirely\n",{"type":47,"tag":68,"props":2242,"children":2243},{},[2244],{"type":52,"value":2245},"Crop:",{"type":47,"tag":1223,"props":2247,"children":2248},{},[2249,2251,2257,2259,2265,2267],{"type":52,"value":2250},"\"Auto\" → landscape → ",{"type":47,"tag":76,"props":2252,"children":2254},{"className":2253},[],[2255],{"type":52,"value":2256},"\"4:3\"",{"type":52,"value":2258},", portrait → ",{"type":47,"tag":76,"props":2260,"children":2262},{"className":2261},[],[2263],{"type":52,"value":2264},"\"3:4\"",{"type":52,"value":2266},", focus: ",{"type":47,"tag":76,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":52,"value":2272},"\"face\"",{"type":47,"tag":1223,"props":2274,"children":2275},{},[2276,2278,2284,2285],{"type":52,"value":2277},"\"1:1 square\" → ",{"type":47,"tag":76,"props":2279,"children":2281},{"className":2280},[],[2282],{"type":52,"value":2283},"output: \"1:1\"",{"type":52,"value":2266},{"type":47,"tag":76,"props":2286,"children":2288},{"className":2287},[],[2289],{"type":52,"value":2272},{"type":47,"tag":1223,"props":2291,"children":2292},{},[2293,2295,2301,2302],{"type":52,"value":2294},"\"4:5 portrait\" → ",{"type":47,"tag":76,"props":2296,"children":2298},{"className":2297},[],[2299],{"type":52,"value":2300},"output: \"4:5\"",{"type":52,"value":2266},{"type":47,"tag":76,"props":2303,"children":2305},{"className":2304},[],[2306],{"type":52,"value":2272},{"type":47,"tag":1223,"props":2308,"children":2309},{},[2310,2312,2318,2319,2324,2326,2332,2334,2340],{"type":52,"value":2311},"\"16:9 wide\" → ",{"type":47,"tag":76,"props":2313,"children":2315},{"className":2314},[],[2316],{"type":52,"value":2317},"output: \"16:9\"",{"type":52,"value":2266},{"type":47,"tag":76,"props":2320,"children":2322},{"className":2321},[],[2323],{"type":52,"value":2272},{"type":52,"value":2325},"\nAll crop modes use ",{"type":47,"tag":76,"props":2327,"children":2329},{"className":2328},[],[2330],{"type":52,"value":2331},"focus: \"face\"",{"type":52,"value":2333},". If no face is detected, fall back to ",{"type":47,"tag":76,"props":2335,"children":2337},{"className":2336},[],[2338],{"type":52,"value":2339},"focus: \"subject\"",{"type":52,"value":1536},{"type":47,"tag":55,"props":2342,"children":2343},{},[2344,2346,2351],{"type":52,"value":2345},"After receiving button selections, confirm the settings back to the user ",{"type":47,"tag":68,"props":2347,"children":2348},{},[2349],{"type":52,"value":2350},"and show the Preset Plan",{"type":52,"value":692},{"type":47,"tag":651,"props":2353,"children":2356},{"className":2354,"code":2355,"language":52},[801],"✅ Got it — here's your retouching plan:\n- Style: [selected mood\u002Fstyle from Step 2a]\n- Auto-straighten + auto-tone + auto-light\n- Adaptive enhancements: [list selected categories]\n  - Person presets: [preset names from bucket 1, or \"none\"]\n  - Mood preset: [preset name, or \"none\"]\n  - Toon preset: [preset name, or \"none\"]\n  - Blur BG preset: [preset name, or \"none\"]\n- Manual tweaks: [list if any, or \"none\"]\n- Crop: [ratio or \"auto 4:3\u002F3:4\"]\n- Blur: [adaptive \u002F heavy \u002F none]\n\nI'll preview the first image so you can confirm before I apply this to all [N] photos.\n",[2357],{"type":47,"tag":76,"props":2358,"children":2359},{"__ignoreMap":656},[2360],{"type":52,"value":2355},{"type":47,"tag":116,"props":2362,"children":2363},{},[],{"type":47,"tag":120,"props":2365,"children":2367},{"id":2366},"step-2b-large-batch-warning-n-5",[2368],{"type":52,"value":2369},"Step 2b: Large Batch Warning (N > 5)",{"type":47,"tag":55,"props":2371,"children":2372},{},[2373],{"type":52,"value":2374},"Include this in the confirmation when N > 5:",{"type":47,"tag":651,"props":2376,"children":2379},{"className":2377,"code":2378,"language":52},[801],"⏱ Estimated time for [N] images:\n  6–10 → ~3–5 min\n  11–20 → ~5–10 min\n  20+ → 10+ min\n\nFeel free to step away — I'll post a ✅ completion summary with your\ndownload links when done. (No Slack\u002Femail notifications available from here.)\n",[2380],{"type":47,"tag":76,"props":2381,"children":2382},{"__ignoreMap":656},[2383],{"type":52,"value":2378},{"type":47,"tag":116,"props":2385,"children":2386},{},[],{"type":47,"tag":120,"props":2388,"children":2390},{"id":2389},"step-2c-sample-preview-beforeafter-on-image-1",[2391],{"type":52,"value":2392},"Step 2c: Sample Preview (Before\u002FAfter on Image 1)",{"type":47,"tag":55,"props":2394,"children":2395},{},[2396,2398,2403],{"type":52,"value":2397},"Before running the full batch, process the ",{"type":47,"tag":68,"props":2399,"children":2400},{},[2401],{"type":52,"value":2402},"first image only",{"type":52,"value":2404}," through the complete pipeline (Steps 3–7) using the confirmed settings. This gives the user a real preview of exactly what will be applied to every image.",{"type":47,"tag":55,"props":2406,"children":2407},{},[2408,2410,2415,2417,2422],{"type":52,"value":2409},"To keep the preview fast, ",{"type":47,"tag":68,"props":2411,"children":2412},{},[2413],{"type":52,"value":2414},"first downscale image 1",{"type":52,"value":2416}," to a long-edge of 1200px before running it through the pipeline. After confirmation, the final batch (Step 3) processes ",{"type":47,"tag":68,"props":2418,"children":2419},{},[2420],{"type":52,"value":2421},"all",{"type":52,"value":2423}," images at full resolution — including image 1, which must not be reused from the 1200px preview output.",{"type":47,"tag":651,"props":2425,"children":2428},{"className":2426,"code":2427,"language":52},[801],"Tool: image_crop_and_resize\nParams:\n  imageURI: \"\u003CsourceURIs[0]>\"\n  options:\n    output: { width: 1200, height: 1200 }   # caps both dimensions at 1200px; fit:contain preserves aspect ratio, so the long edge (width on landscape, height on portrait) is capped at 1200px\n    fit: \"contain\"\n  outputFileType: \"jpeg\"\n",[2429],{"type":47,"tag":76,"props":2430,"children":2431},{"__ignoreMap":656},[2432],{"type":52,"value":2427},{"type":47,"tag":55,"props":2434,"children":2435},{},[2436,2438,2444,2446,2452],{"type":52,"value":2437},"Store the result as ",{"type":47,"tag":76,"props":2439,"children":2441},{"className":2440},[],[2442],{"type":52,"value":2443},"preview_source_url",{"type":52,"value":2445},". Use that downscaled URL — not ",{"type":47,"tag":76,"props":2447,"children":2449},{"className":2448},[],[2450],{"type":52,"value":2451},"sourceURIs[0]",{"type":52,"value":2453}," — as the input to Steps 3–7 for the preview pass only.",{"type":47,"tag":2455,"props":2456,"children":2457},"ol",{},[2458,2470],{"type":47,"tag":1223,"props":2459,"children":2460},{},[2461,2463,2468],{"type":52,"value":2462},"Run the full pipeline on ",{"type":47,"tag":76,"props":2464,"children":2466},{"className":2465},[],[2467],{"type":52,"value":2443},{"type":52,"value":2469}," only (straighten → tone → tweaks → adaptive → blur → crop).",{"type":47,"tag":1223,"props":2471,"children":2472},{},[2473,2474,2479,2481,2486],{"type":52,"value":641},{"type":47,"tag":76,"props":2475,"children":2477},{"className":2476},[],[2478],{"type":52,"value":89},{"type":52,"value":2480}," with the original full-res source as \"Before\" and the processed downscaled output as \"After\" — ",{"type":47,"tag":76,"props":2482,"children":2484},{"className":2483},[],[2485],{"type":52,"value":89},{"type":52,"value":2487}," handles its own thumbnailing so the size difference is invisible to the user:",{"type":47,"tag":651,"props":2489,"children":2493},{"className":2490,"code":2491,"language":2492,"meta":656,"style":656},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","asset_preview_file({\n  assets: [\n    { name: \"Before\", presignedAssetUrl: sourceURIs[0] },\n    { name: \"After\",  presignedAssetUrl: processed_preview_url }\n  ]\n})\n","javascript",[2494],{"type":47,"tag":76,"props":2495,"children":2496},{"__ignoreMap":656},[2497,2516,2535,2599,2651,2660],{"type":47,"tag":569,"props":2498,"children":2499},{"class":663,"line":664},[2500,2505,2511],{"type":47,"tag":569,"props":2501,"children":2503},{"style":2502},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[2504],{"type":52,"value":89},{"type":47,"tag":569,"props":2506,"children":2508},{"style":2507},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[2509],{"type":52,"value":2510},"(",{"type":47,"tag":569,"props":2512,"children":2513},{"style":668},[2514],{"type":52,"value":2515},"{\n",{"type":47,"tag":569,"props":2517,"children":2519},{"class":663,"line":2518},2,[2520,2526,2530],{"type":47,"tag":569,"props":2521,"children":2523},{"style":2522},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[2524],{"type":52,"value":2525},"  assets",{"type":47,"tag":569,"props":2527,"children":2528},{"style":668},[2529],{"type":52,"value":692},{"type":47,"tag":569,"props":2531,"children":2532},{"style":2507},[2533],{"type":52,"value":2534}," [\n",{"type":47,"tag":569,"props":2536,"children":2538},{"class":663,"line":2537},3,[2539,2544,2549,2553,2557,2562,2566,2570,2575,2579,2584,2589,2594],{"type":47,"tag":569,"props":2540,"children":2541},{"style":668},[2542],{"type":52,"value":2543},"    {",{"type":47,"tag":569,"props":2545,"children":2546},{"style":2522},[2547],{"type":52,"value":2548}," name",{"type":47,"tag":569,"props":2550,"children":2551},{"style":668},[2552],{"type":52,"value":692},{"type":47,"tag":569,"props":2554,"children":2555},{"style":668},[2556],{"type":52,"value":676},{"type":47,"tag":569,"props":2558,"children":2559},{"style":699},[2560],{"type":52,"value":2561},"Before",{"type":47,"tag":569,"props":2563,"children":2564},{"style":668},[2565],{"type":52,"value":687},{"type":47,"tag":569,"props":2567,"children":2568},{"style":668},[2569],{"type":52,"value":710},{"type":47,"tag":569,"props":2571,"children":2572},{"style":2522},[2573],{"type":52,"value":2574}," presignedAssetUrl",{"type":47,"tag":569,"props":2576,"children":2577},{"style":668},[2578],{"type":52,"value":692},{"type":47,"tag":569,"props":2580,"children":2581},{"style":2507},[2582],{"type":52,"value":2583}," sourceURIs[",{"type":47,"tag":569,"props":2585,"children":2587},{"style":2586},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2588],{"type":52,"value":573},{"type":47,"tag":569,"props":2590,"children":2591},{"style":2507},[2592],{"type":52,"value":2593},"] ",{"type":47,"tag":569,"props":2595,"children":2596},{"style":668},[2597],{"type":52,"value":2598},"},\n",{"type":47,"tag":569,"props":2600,"children":2602},{"class":663,"line":2601},4,[2603,2607,2611,2615,2619,2624,2628,2632,2637,2641,2646],{"type":47,"tag":569,"props":2604,"children":2605},{"style":668},[2606],{"type":52,"value":2543},{"type":47,"tag":569,"props":2608,"children":2609},{"style":2522},[2610],{"type":52,"value":2548},{"type":47,"tag":569,"props":2612,"children":2613},{"style":668},[2614],{"type":52,"value":692},{"type":47,"tag":569,"props":2616,"children":2617},{"style":668},[2618],{"type":52,"value":676},{"type":47,"tag":569,"props":2620,"children":2621},{"style":699},[2622],{"type":52,"value":2623},"After",{"type":47,"tag":569,"props":2625,"children":2626},{"style":668},[2627],{"type":52,"value":687},{"type":47,"tag":569,"props":2629,"children":2630},{"style":668},[2631],{"type":52,"value":710},{"type":47,"tag":569,"props":2633,"children":2634},{"style":2522},[2635],{"type":52,"value":2636},"  presignedAssetUrl",{"type":47,"tag":569,"props":2638,"children":2639},{"style":668},[2640],{"type":52,"value":692},{"type":47,"tag":569,"props":2642,"children":2643},{"style":2507},[2644],{"type":52,"value":2645}," processed_preview_url ",{"type":47,"tag":569,"props":2647,"children":2648},{"style":668},[2649],{"type":52,"value":2650},"}\n",{"type":47,"tag":569,"props":2652,"children":2654},{"class":663,"line":2653},5,[2655],{"type":47,"tag":569,"props":2656,"children":2657},{"style":2507},[2658],{"type":52,"value":2659},"  ]\n",{"type":47,"tag":569,"props":2661,"children":2663},{"class":663,"line":2662},6,[2664,2669],{"type":47,"tag":569,"props":2665,"children":2666},{"style":668},[2667],{"type":52,"value":2668},"}",{"type":47,"tag":569,"props":2670,"children":2671},{"style":2507},[2672],{"type":52,"value":2673},")\n",{"type":47,"tag":61,"props":2675,"children":2676},{},[2677,2697,2706],{"type":47,"tag":55,"props":2678,"children":2679},{},[2680,2684,2685,2695],{"type":47,"tag":68,"props":2681,"children":2682},{},[2683],{"type":52,"value":104},{"type":52,"value":1325},{"type":47,"tag":100,"props":2686,"children":2687},{},[2688,2689,2694],{"type":52,"value":1410},{"type":47,"tag":76,"props":2690,"children":2692},{"className":2691},[],[2693],{"type":52,"value":89},{"type":52,"value":1417},{"type":52,"value":2696}," — present the two labeled URLs directly in the message:",{"type":47,"tag":651,"props":2698,"children":2701},{"className":2699,"code":2700,"language":52},[801],"Before: \u003CsourceURIs[0]>\nAfter:  \u003Cprocessed_preview_url>\n",[2702],{"type":47,"tag":76,"props":2703,"children":2704},{"__ignoreMap":656},[2705],{"type":52,"value":2700},{"type":47,"tag":55,"props":2707,"children":2708},{},[2709,2711,2717,2718,2724],{"type":52,"value":2710},"UI clients that render image URLs inline will show both automatically. In Codex or other non-UI agents, download both to the workspace (",{"type":47,"tag":76,"props":2712,"children":2714},{"className":2713},[],[2715],{"type":52,"value":2716},"curl -L -o before.jpg \"\u003CsourceURIs[0]>\"",{"type":52,"value":844},{"type":47,"tag":76,"props":2719,"children":2721},{"className":2720},[],[2722],{"type":52,"value":2723},"curl -L -o after.jpg \"\u003Cprocessed_preview_url>\"",{"type":52,"value":2725},") and reference those local paths instead.",{"type":47,"tag":2455,"props":2727,"children":2728},{"start":2537},[2729],{"type":47,"tag":1223,"props":2730,"children":2731},{},[2732],{"type":52,"value":2733},"Post this message:",{"type":47,"tag":651,"props":2735,"children":2738},{"className":2736,"code":2737,"language":52},[801],"👆 Here's a before\u002Fafter preview using your first photo and the settings you selected.\n\nPlease confirm this looks right before I apply it to all [N] images.\n",[2739],{"type":47,"tag":76,"props":2740,"children":2741},{"__ignoreMap":656},[2742],{"type":52,"value":2737},{"type":47,"tag":2455,"props":2744,"children":2745},{"start":2601},[2746],{"type":47,"tag":1223,"props":2747,"children":2748},{},[2749,2750,2755],{"type":52,"value":641},{"type":47,"tag":76,"props":2751,"children":2753},{"className":2752},[],[2754],{"type":52,"value":112},{"type":52,"value":2756}," with a single question:",{"type":47,"tag":651,"props":2758,"children":2761},{"className":2759,"code":2760,"language":52},[801],"Question (single_select):\n  question: \"Does the preview look good?\"\n  options:\n    - \"✅ Yes — apply to all [N] images\"\n    - \"🎛️ No — adjust settings first\"\n    - \"❌ Cancel\"\n",[2762],{"type":47,"tag":76,"props":2763,"children":2764},{"__ignoreMap":656},[2765],{"type":52,"value":2760},{"type":47,"tag":55,"props":2767,"children":2768},{},[2769,2774],{"type":47,"tag":68,"props":2770,"children":2771},{},[2772],{"type":52,"value":2773},"Processing is fully paused here.",{"type":52,"value":2775}," Do not start the full batch until the user explicitly selects \"Yes\". This gate is mandatory and runs every time regardless of how clearly preferences were stated.",{"type":47,"tag":55,"props":2777,"children":2778},{},[2779,2784,2786,2790,2792,2798],{"type":47,"tag":68,"props":2780,"children":2781},{},[2782],{"type":52,"value":2783},"If \"Yes\":",{"type":52,"value":2785}," proceed to Step 3 for ",{"type":47,"tag":68,"props":2787,"children":2788},{},[2789],{"type":52,"value":2421},{"type":52,"value":2791}," images (",{"type":47,"tag":76,"props":2793,"children":2795},{"className":2794},[],[2796],{"type":52,"value":2797},"sourceURIs[0…N-1]",{"type":52,"value":2799},") at full resolution. Do not reuse the 1200px preview result — it was for confirmation only and must not appear in the final deliverables.",{"type":47,"tag":55,"props":2801,"children":2802},{},[2803,2808,2810,2815,2817,2822],{"type":47,"tag":68,"props":2804,"children":2805},{},[2806],{"type":52,"value":2807},"If \"No — adjust settings\":",{"type":52,"value":2809}," return to Step 2a to re-collect mood\u002Fstyle if needed, then Step 2 (",{"type":47,"tag":76,"props":2811,"children":2813},{"className":2812},[],[2814],{"type":52,"value":112},{"type":52,"value":2816},") to re-collect other preferences. Once new settings are confirmed, ",{"type":47,"tag":68,"props":2818,"children":2819},{},[2820],{"type":52,"value":2821},"always repeat the preview",{"type":52,"value":2823}," — reprocess image 1 with the new settings, show the new before\u002Fafter, and require explicit confirmation again before proceeding. Never skip the preview gate after an adjustment.",{"type":47,"tag":55,"props":2825,"children":2826},{},[2827,2832],{"type":47,"tag":68,"props":2828,"children":2829},{},[2830],{"type":52,"value":2831},"If \"Cancel\":",{"type":52,"value":2833}," stop and let the user know they can restart any time.",{"type":47,"tag":116,"props":2835,"children":2836},{},[],{"type":47,"tag":120,"props":2838,"children":2840},{"id":2839},"step-3-auto-straighten-per-image",[2841],{"type":52,"value":2842},"Step 3: Auto-Straighten (per image)",{"type":47,"tag":55,"props":2844,"children":2845},{},[2846],{"type":52,"value":2847},"Loop one image at a time (no batch support):",{"type":47,"tag":651,"props":2849,"children":2852},{"className":2850,"code":2851,"language":52},[801],"Tool: image_auto_straighten\nParams:\n  imageURIs: [\"\u003Csource_uri_N>\"]\n  options:\n    uprightMode: \"auto\"\n    constrainCrop: true\n",[2853],{"type":47,"tag":76,"props":2854,"children":2855},{"__ignoreMap":656},[2856],{"type":52,"value":2851},{"type":47,"tag":55,"props":2858,"children":2859},{},[2860,2865,2866,2872,2874],{"type":47,"tag":68,"props":2861,"children":2862},{},[2863],{"type":52,"value":2864},"Output:",{"type":52,"value":1325},{"type":47,"tag":76,"props":2867,"children":2869},{"className":2868},[],[2870],{"type":52,"value":2871},"results[0].outputUrl",{"type":52,"value":2873}," → collect as ",{"type":47,"tag":76,"props":2875,"children":2877},{"className":2876},[],[2878],{"type":52,"value":2879},"straightened_urls[]",{"type":47,"tag":55,"props":2881,"children":2882},{},[2883],{"type":52,"value":2884},"On failure: use original URI, note \"straighten skipped\" for that image.",{"type":47,"tag":116,"props":2886,"children":2887},{},[],{"type":47,"tag":120,"props":2889,"children":2891},{"id":2890},"step-4-auto-tone-per-image",[2892],{"type":52,"value":2893},"Step 4: Auto-Tone (per image)",{"type":47,"tag":651,"props":2895,"children":2898},{"className":2896,"code":2897,"language":52},[801],"Tool: image_apply_auto_tone\nParams:\n  imageURIs: [\"\u003Cstraightened_url_N>\"]\n  options:\n    type: \"cameraRawFilter\"\n",[2899],{"type":47,"tag":76,"props":2900,"children":2901},{"__ignoreMap":656},[2902],{"type":52,"value":2897},{"type":47,"tag":55,"props":2904,"children":2905},{},[2906,2910,2911,2916,2917],{"type":47,"tag":68,"props":2907,"children":2908},{},[2909],{"type":52,"value":2864},{"type":52,"value":1325},{"type":47,"tag":76,"props":2912,"children":2914},{"className":2913},[],[2915],{"type":52,"value":2871},{"type":52,"value":2873},{"type":47,"tag":76,"props":2918,"children":2920},{"className":2919},[],[2921],{"type":52,"value":2922},"toned_urls[]",{"type":47,"tag":116,"props":2924,"children":2925},{},[],{"type":47,"tag":120,"props":2927,"children":2929},{"id":2928},"step-4b-optional-tone-adjustments-batch",[2930],{"type":52,"value":2931},"Step 4b: Optional Tone Adjustments (batch)",{"type":47,"tag":55,"props":2933,"children":2934},{},[2935,2937,2949],{"type":52,"value":2936},"If the user requested tonal tweaks, combine ",{"type":47,"tag":68,"props":2938,"children":2939},{},[2940,2942,2947],{"type":52,"value":2941},"all selected tweaks into a single ",{"type":47,"tag":76,"props":2943,"children":2945},{"className":2944},[],[2946],{"type":52,"value":404},{"type":52,"value":2948}," call",{"type":52,"value":2950}," — no need to chain multiple calls:",{"type":47,"tag":651,"props":2952,"children":2955},{"className":2953,"code":2954,"language":52},[801],"Tool: image_apply_adjustments\nParams:\n  imageURIs: [all toned_urls]\n  options:\n    # Include only the params for tweaks the user selected.\n    # Pick a SINGLE numeric value from the diagnostic ranges in Step 2 — do not pass the range string itself.\n    # Example values shown; actual values must be chosen based on image severity:\n    exposure: 0.4           # \"Adjust exposure\" — e.g. +0.3 to +0.7 (lift) or -0.3 to -0.5 (reduce)\n    highlights: -55         # \"Recover highlights\" — range: -40 to -70 (severity-matched)\n    darks: 40               # \"Lift shadows\" — range: +30 to +50 (positive lifts dark areas)\n    brightness: 10          # if requested — range: +5 to +20\n    contrast: 20            # \"More contrast\" — range: +15 to +30 (lower end unless very flat)\n    vibrance: 20            # \"More vibrant\" — range: +15 to +30 (prefer over saturation for portraits)\n    saturation: -30         # \"Desaturate\" — range: -20 to -40 (lower end unless heavy muting desired)\n  outputFileType: \"jpeg\"\n",[2956],{"type":47,"tag":76,"props":2957,"children":2958},{"__ignoreMap":656},[2959],{"type":52,"value":2954},{"type":47,"tag":120,"props":2961,"children":2963},{"id":2962},"omit-any-parameter-the-user-did-not-select-one-call-handles-all-requested-tweaks-simultaneously",[2964],{"type":52,"value":2965},"Omit any parameter the user did not select. One call handles all requested tweaks simultaneously.",{"type":47,"tag":120,"props":2967,"children":2969},{"id":2968},"step-5-adaptive-enhancements-per-image-opt-in-only",[2970],{"type":52,"value":2971},"Step 5: Adaptive Enhancements (per image, opt-in only)",{"type":47,"tag":55,"props":2973,"children":2974},{},[2975,2977,2981],{"type":52,"value":2976},"Only run this step if the user selected one or more adaptive enhancements. The presets to apply come from your ",{"type":47,"tag":68,"props":2978,"children":2979},{},[2980],{"type":52,"value":817},{"type":52,"value":2982}," built in Step 0b — not hardcoded names.",{"type":47,"tag":821,"props":2984,"children":2986},{"id":2985},"_5a-subject-body-detection",[2987],{"type":52,"value":2988},"5a: Subject & Body Detection",{"type":47,"tag":55,"props":2990,"children":2991},{},[2992,2994,2999],{"type":52,"value":2993},"Before applying person or teeth presets, call ",{"type":47,"tag":76,"props":2995,"children":2997},{"className":2996},[],[2998],{"type":52,"value":426},{"type":52,"value":3000}," to understand what's in the frame. This drives two decisions: which adaptive person presets to apply, and whether Whiten Teeth is appropriate.",{"type":47,"tag":651,"props":3002,"children":3005},{"className":3003,"code":3004,"language":52},[801],"Tool: image_select_subject\nParams:\n  imageURI: \"\u003Ctweaked_url_N>\"   # Step 4b output if tweaks ran; otherwise toned_url_N\n  options:\n    bodyParts: [\"Face\", \"Torso\", \"Clothing\", \"Skin\", \"Hair\"]\n",[3006],{"type":47,"tag":76,"props":3007,"children":3008},{"__ignoreMap":656},[3009],{"type":52,"value":3004},{"type":47,"tag":55,"props":3011,"children":3012},{},[3013],{"type":52,"value":3014},"Use the detection results as follows:",{"type":47,"tag":1219,"props":3016,"children":3017},{},[3018,3028,3038,3048],{"type":47,"tag":1223,"props":3019,"children":3020},{},[3021,3026],{"type":47,"tag":68,"props":3022,"children":3023},{},[3024],{"type":52,"value":3025},"Face detected",{"type":52,"value":3027}," → include any teeth\u002Fsmile preset if user selected Whiten Teeth",{"type":47,"tag":1223,"props":3029,"children":3030},{},[3031,3036],{"type":47,"tag":68,"props":3032,"children":3033},{},[3034],{"type":52,"value":3035},"Torso \u002F Skin \u002F Hair detected",{"type":52,"value":3037}," → include body-targeted adaptive person presets (e.g. skin smoothing, body pop)",{"type":47,"tag":1223,"props":3039,"children":3040},{},[3041,3046],{"type":47,"tag":68,"props":3042,"children":3043},{},[3044],{"type":52,"value":3045},"Clothing detected",{"type":52,"value":3047}," → include clothing\u002Foutfit-targeted adaptive presets if present in bucket 1",{"type":47,"tag":1223,"props":3049,"children":3050},{},[3051,3056],{"type":47,"tag":68,"props":3052,"children":3053},{},[3054],{"type":52,"value":3055},"No subject detected",{"type":52,"value":3057}," → skip all Adaptive Person Presets for this image; still apply Mood and Toon presets",{"type":47,"tag":821,"props":3059,"children":3061},{"id":3060},"_5b-apply-preset-plan-in-order",[3062],{"type":52,"value":3063},"5b: Apply Preset Plan (in order)",{"type":47,"tag":55,"props":3065,"children":3066},{},[3067,3069,3074],{"type":52,"value":3068},"Apply the applicable presets from your Preset Plan in this sequence, chaining each output into the next. ",{"type":47,"tag":68,"props":3070,"children":3071},{},[3072],{"type":52,"value":3073},"Only run buckets the user selected in Step 2",{"type":52,"value":3075}," — use the mapping table there to determine which buckets are active for this run. Skip any bucket the user did not select, and skip any preset within an active bucket whose detection condition was not met (see 5a).",{"type":47,"tag":55,"props":3077,"children":3078},{},[3079],{"type":47,"tag":68,"props":3080,"children":3081},{},[3082],{"type":52,"value":3083},"Order (run only the buckets that were selected):",{"type":47,"tag":2455,"props":3085,"children":3086},{},[3087,3096,3106,3116],{"type":47,"tag":1223,"props":3088,"children":3089},{},[3090,3094],{"type":47,"tag":68,"props":3091,"children":3092},{},[3093],{"type":52,"value":2048},{"type":52,"value":3095}," (bucket 1) — only if \"Enhance Subject\", \"Whiten Teeth\", or \"All\" was selected. Within the bucket: skip body\u002Fclothes presets if only a face was detected and no body was found; skip Whiten Teeth if no face detected.",{"type":47,"tag":1223,"props":3097,"children":3098},{},[3099,3104],{"type":47,"tag":68,"props":3100,"children":3101},{},[3102],{"type":52,"value":3103},"Global Mood \u002F Tone Preset",{"type":52,"value":3105}," (bucket 2) — only if \"Mood & Tone\" or \"All\" was selected; apply once",{"type":47,"tag":1223,"props":3107,"children":3108},{},[3109,3114],{"type":47,"tag":68,"props":3110,"children":3111},{},[3112],{"type":52,"value":3113},"Global Toon \u002F Look Preset",{"type":52,"value":3115}," (bucket 3) — only if \"Toon & Style\" or \"All\" was selected; apply once",{"type":47,"tag":1223,"props":3117,"children":3118},{},[3119,3124,3126,3131],{"type":47,"tag":68,"props":3120,"children":3121},{},[3122],{"type":52,"value":3123},"Background Blur Preset",{"type":52,"value":3125}," (bucket 4) — only if \"Blur Background\" or \"All\" was selected; apply once; if applied, ",{"type":47,"tag":68,"props":3127,"children":3128},{},[3129],{"type":52,"value":3130},"skip Step 6",{"type":52,"value":3132}," for this image",{"type":47,"tag":651,"props":3134,"children":3137},{"className":3135,"code":3136,"language":52},[801],"Tool: image_apply_preset\nParams:\n  imageURI: \"\u003Cprevious_output_url>\"   # for first preset: tweaked_url_N (Step 4b output) or toned_url_N if no tweaks ran; for subsequent presets: output of prior preset\n  options:\n    presetName: \"\u003Cexact preset name from Preset Plan>\"\n",[3138],{"type":47,"tag":76,"props":3139,"children":3140},{"__ignoreMap":656},[3141],{"type":52,"value":3136},{"type":47,"tag":55,"props":3143,"children":3144},{},[3145,3149,3150,3155],{"type":47,"tag":68,"props":3146,"children":3147},{},[3148],{"type":52,"value":2864},{"type":52,"value":1325},{"type":47,"tag":76,"props":3151,"children":3153},{"className":3152},[],[3154],{"type":52,"value":2871},{"type":52,"value":3156}," → chain as input to next preset or Step 6.",{"type":47,"tag":55,"props":3158,"children":3159},{},[3160,3165,3167,3172,3174,3179,3181,3186],{"type":47,"tag":68,"props":3161,"children":3162},{},[3163],{"type":52,"value":3164},"On 403 (entitlement):",{"type":52,"value":3166}," Skip the preset. Note in delivery summary: \"",{"type":47,"tag":569,"props":3168,"children":3169},{},[3170],{"type":52,"value":3171},"Preset name",{"type":52,"value":3173}," was skipped — not included in your Adobe plan.\" Continue with remaining presets.\n",{"type":47,"tag":68,"props":3175,"children":3176},{},[3177],{"type":52,"value":3178},"On other failure:",{"type":52,"value":3180}," Use previous step's output; note \"",{"type":47,"tag":569,"props":3182,"children":3183},{},[3184],{"type":52,"value":3185},"preset name",{"type":52,"value":3187}," skipped\" in summary.",{"type":47,"tag":116,"props":3189,"children":3190},{},[],{"type":47,"tag":120,"props":3192,"children":3194},{"id":3193},"step-6-background-blur-per-image",[3195],{"type":52,"value":3196},"Step 6: Background Blur (per image)",{"type":47,"tag":55,"props":3198,"children":3199},{},[3200,3205],{"type":47,"tag":68,"props":3201,"children":3202},{},[3203],{"type":52,"value":3204},"Skip this step entirely",{"type":52,"value":3206}," if the Background Blur Preset (bucket 4) was applied in Step 5 — the adaptive preset already handled it.",{"type":47,"tag":55,"props":3208,"children":3209},{},[3210,3215],{"type":47,"tag":68,"props":3211,"children":3212},{},[3213],{"type":52,"value":3214},"No blur selected:",{"type":52,"value":3216}," skip this step entirely.",{"type":47,"tag":55,"props":3218,"children":3219},{},[3220,3225],{"type":47,"tag":68,"props":3221,"children":3222},{},[3223],{"type":52,"value":3224},"Standard background blur",{"type":52,"value":3226}," (user selected \"Blur background\" and adaptive blur preset was not applied):",{"type":47,"tag":55,"props":3228,"children":3229},{},[3230,3232,3237],{"type":52,"value":3231},"Prefer ",{"type":47,"tag":76,"props":3233,"children":3235},{"className":3234},[],[3236],{"type":52,"value":470},{"type":52,"value":3238}," — it produces depth-aware, realistic bokeh by automatically detecting the subject and keeping it sharp:",{"type":47,"tag":651,"props":3240,"children":3243},{"className":3241,"code":3242,"language":52},[801],"Tool: image_apply_lens_blur\nParams:\n  imageURI: \"\u003Curl_N>\"\n  options:\n    blurRadius: 8    # 6–10 for subtle separation; higher for stronger bokeh\n",[3244],{"type":47,"tag":76,"props":3245,"children":3246},{"__ignoreMap":656},[3247],{"type":52,"value":3242},{"type":47,"tag":55,"props":3249,"children":3250},{},[3251,3253,3258],{"type":52,"value":3252},"On failure: fall back to ",{"type":47,"tag":76,"props":3254,"children":3256},{"className":3255},[],[3257],{"type":52,"value":492},{"type":52,"value":3259}," below, note \"lens blur unavailable — using gaussian\".",{"type":47,"tag":55,"props":3261,"children":3262},{},[3263,3267],{"type":47,"tag":68,"props":3264,"children":3265},{},[3266],{"type":52,"value":483},{"type":52,"value":3268}," (user explicitly requested \"Heavy background blur\"):",{"type":47,"tag":651,"props":3270,"children":3273},{"className":3271,"code":3272,"language":52},[801],"Tool: image_apply_gaussian_blur\nParams:\n  imageURIs: [\"\u003Curl_N>\"]\n  options:\n    blurRadius: 12\n    blurTarget: \"background\"\n",[3274],{"type":47,"tag":76,"props":3275,"children":3276},{"__ignoreMap":656},[3277],{"type":52,"value":3272},{"type":47,"tag":55,"props":3279,"children":3280},{},[3281],{"type":52,"value":3282},"On failure: use previous step's output, note \"blur skipped\" for that image.",{"type":47,"tag":55,"props":3284,"children":3285},{},[3286,3290,3291],{"type":47,"tag":68,"props":3287,"children":3288},{},[3289],{"type":52,"value":2864},{"type":52,"value":1325},{"type":47,"tag":76,"props":3292,"children":3294},{"className":3293},[],[3295],{"type":52,"value":2871},{"type":47,"tag":116,"props":3297,"children":3298},{},[],{"type":47,"tag":120,"props":3300,"children":3302},{"id":3301},"step-7-crop-per-image",[3303],{"type":52,"value":3304},"Step 7: Crop (per image)",{"type":47,"tag":55,"props":3306,"children":3307},{},[3308],{"type":47,"tag":68,"props":3309,"children":3310},{},[3311],{"type":52,"value":3312},"Default behavior:",{"type":47,"tag":1219,"props":3314,"children":3315},{},[3316,3332,3348,3358],{"type":47,"tag":1223,"props":3317,"children":3318},{},[3319,3321,3326,3327],{"type":52,"value":3320},"Landscape image → crop to ",{"type":47,"tag":76,"props":3322,"children":3324},{"className":3323},[],[3325],{"type":52,"value":2256},{"type":52,"value":2266},{"type":47,"tag":76,"props":3328,"children":3330},{"className":3329},[],[3331],{"type":52,"value":2272},{"type":47,"tag":1223,"props":3333,"children":3334},{},[3335,3337,3342,3343],{"type":52,"value":3336},"Portrait image → crop to ",{"type":47,"tag":76,"props":3338,"children":3340},{"className":3339},[],[3341],{"type":52,"value":2264},{"type":52,"value":2266},{"type":47,"tag":76,"props":3344,"children":3346},{"className":3345},[],[3347],{"type":52,"value":2272},{"type":47,"tag":1223,"props":3349,"children":3350},{},[3351,3353],{"type":52,"value":3352},"User-specified ratio (1:1, 4:5, 16:9, etc.) → use that, focus: ",{"type":47,"tag":76,"props":3354,"children":3356},{"className":3355},[],[3357],{"type":52,"value":2272},{"type":47,"tag":1223,"props":3359,"children":3360},{},[3361,3363],{"type":52,"value":3362},"If no face is detected by the crop tool, fall back to ",{"type":47,"tag":76,"props":3364,"children":3366},{"className":3365},[],[3367],{"type":52,"value":2339},{"type":47,"tag":651,"props":3369,"children":3372},{"className":3370,"code":3371,"language":52},[801],"Tool: image_crop_and_resize\nParams:\n  imageURI: \"\u003Cblur_url_N>\"\n  options:\n    output: \"4:3\"          # or \"3:4\" \u002F user choice\n    fit: \"reframe\"\n    focus: \"face\"          # falls back to \"subject\" if no face detected\n  outputFileType: \"jpeg\"\n",[3373],{"type":47,"tag":76,"props":3374,"children":3375},{"__ignoreMap":656},[3376],{"type":52,"value":3371},{"type":47,"tag":55,"props":3378,"children":3379},{},[3380,3385,3387,3393],{"type":47,"tag":68,"props":3381,"children":3382},{},[3383],{"type":52,"value":3384},"These are the final full-resolution deliverables.",{"type":52,"value":3386}," Collect as ",{"type":47,"tag":76,"props":3388,"children":3390},{"className":3389},[],[3391],{"type":52,"value":3392},"final_urls[]",{"type":52,"value":1536},{"type":47,"tag":116,"props":3395,"children":3396},{},[],{"type":47,"tag":120,"props":3398,"children":3400},{"id":3399},"step-8-final-preview-download-links-firefly-board",[3401],{"type":52,"value":3402},"Step 8: Final Preview + Download Links + Firefly Board",{"type":47,"tag":55,"props":3404,"children":3405},{},[3406,3408,3413,3415,3420,3422,3427],{"type":52,"value":3407},"Pass the final output URLs directly to ",{"type":47,"tag":76,"props":3409,"children":3411},{"className":3410},[],[3412],{"type":52,"value":89},{"type":52,"value":3414}," — do NOT run them through ",{"type":47,"tag":76,"props":3416,"children":3418},{"className":3417},[],[3419],{"type":52,"value":542},{"type":52,"value":3421}," first, as that introduces white bars or unwanted cropping. ",{"type":47,"tag":76,"props":3423,"children":3425},{"className":3424},[],[3426],{"type":52,"value":89},{"type":52,"value":3428}," handles its own thumbnailing correctly.",{"type":47,"tag":55,"props":3430,"children":3431},{},[3432,3433,3438],{"type":52,"value":641},{"type":47,"tag":76,"props":3434,"children":3436},{"className":3435},[],[3437],{"type":52,"value":89},{"type":52,"value":3439}," for every run, regardless of batch size:",{"type":47,"tag":651,"props":3441,"children":3443},{"className":2490,"code":3442,"language":2492,"meta":656,"style":656},"asset_preview_file({\n  assets: [\n    { name: \"portrait_1.jpg\", presignedAssetUrl: final_url_1 },\n    { name: \"portrait_2.jpg\", presignedAssetUrl: final_url_2 },\n    \u002F\u002F ... one entry per image\n  ]\n})\n",[3444],{"type":47,"tag":76,"props":3445,"children":3446},{"__ignoreMap":656},[3447,3462,3477,3526,3575,3584,3591],{"type":47,"tag":569,"props":3448,"children":3449},{"class":663,"line":664},[3450,3454,3458],{"type":47,"tag":569,"props":3451,"children":3452},{"style":2502},[3453],{"type":52,"value":89},{"type":47,"tag":569,"props":3455,"children":3456},{"style":2507},[3457],{"type":52,"value":2510},{"type":47,"tag":569,"props":3459,"children":3460},{"style":668},[3461],{"type":52,"value":2515},{"type":47,"tag":569,"props":3463,"children":3464},{"class":663,"line":2518},[3465,3469,3473],{"type":47,"tag":569,"props":3466,"children":3467},{"style":2522},[3468],{"type":52,"value":2525},{"type":47,"tag":569,"props":3470,"children":3471},{"style":668},[3472],{"type":52,"value":692},{"type":47,"tag":569,"props":3474,"children":3475},{"style":2507},[3476],{"type":52,"value":2534},{"type":47,"tag":569,"props":3478,"children":3479},{"class":663,"line":2537},[3480,3484,3488,3492,3496,3501,3505,3509,3513,3517,3522],{"type":47,"tag":569,"props":3481,"children":3482},{"style":668},[3483],{"type":52,"value":2543},{"type":47,"tag":569,"props":3485,"children":3486},{"style":2522},[3487],{"type":52,"value":2548},{"type":47,"tag":569,"props":3489,"children":3490},{"style":668},[3491],{"type":52,"value":692},{"type":47,"tag":569,"props":3493,"children":3494},{"style":668},[3495],{"type":52,"value":676},{"type":47,"tag":569,"props":3497,"children":3498},{"style":699},[3499],{"type":52,"value":3500},"portrait_1.jpg",{"type":47,"tag":569,"props":3502,"children":3503},{"style":668},[3504],{"type":52,"value":687},{"type":47,"tag":569,"props":3506,"children":3507},{"style":668},[3508],{"type":52,"value":710},{"type":47,"tag":569,"props":3510,"children":3511},{"style":2522},[3512],{"type":52,"value":2574},{"type":47,"tag":569,"props":3514,"children":3515},{"style":668},[3516],{"type":52,"value":692},{"type":47,"tag":569,"props":3518,"children":3519},{"style":2507},[3520],{"type":52,"value":3521}," final_url_1 ",{"type":47,"tag":569,"props":3523,"children":3524},{"style":668},[3525],{"type":52,"value":2598},{"type":47,"tag":569,"props":3527,"children":3528},{"class":663,"line":2601},[3529,3533,3537,3541,3545,3550,3554,3558,3562,3566,3571],{"type":47,"tag":569,"props":3530,"children":3531},{"style":668},[3532],{"type":52,"value":2543},{"type":47,"tag":569,"props":3534,"children":3535},{"style":2522},[3536],{"type":52,"value":2548},{"type":47,"tag":569,"props":3538,"children":3539},{"style":668},[3540],{"type":52,"value":692},{"type":47,"tag":569,"props":3542,"children":3543},{"style":668},[3544],{"type":52,"value":676},{"type":47,"tag":569,"props":3546,"children":3547},{"style":699},[3548],{"type":52,"value":3549},"portrait_2.jpg",{"type":47,"tag":569,"props":3551,"children":3552},{"style":668},[3553],{"type":52,"value":687},{"type":47,"tag":569,"props":3555,"children":3556},{"style":668},[3557],{"type":52,"value":710},{"type":47,"tag":569,"props":3559,"children":3560},{"style":2522},[3561],{"type":52,"value":2574},{"type":47,"tag":569,"props":3563,"children":3564},{"style":668},[3565],{"type":52,"value":692},{"type":47,"tag":569,"props":3567,"children":3568},{"style":2507},[3569],{"type":52,"value":3570}," final_url_2 ",{"type":47,"tag":569,"props":3572,"children":3573},{"style":668},[3574],{"type":52,"value":2598},{"type":47,"tag":569,"props":3576,"children":3577},{"class":663,"line":2653},[3578],{"type":47,"tag":569,"props":3579,"children":3581},{"style":3580},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[3582],{"type":52,"value":3583},"    \u002F\u002F ... one entry per image\n",{"type":47,"tag":569,"props":3585,"children":3586},{"class":663,"line":2662},[3587],{"type":47,"tag":569,"props":3588,"children":3589},{"style":2507},[3590],{"type":52,"value":2659},{"type":47,"tag":569,"props":3592,"children":3594},{"class":663,"line":3593},7,[3595,3599],{"type":47,"tag":569,"props":3596,"children":3597},{"style":668},[3598],{"type":52,"value":2668},{"type":47,"tag":569,"props":3600,"children":3601},{"style":2507},[3602],{"type":52,"value":2673},{"type":47,"tag":61,"props":3604,"children":3605},{},[3606,3626,3635],{"type":47,"tag":55,"props":3607,"children":3608},{},[3609,3613,3614,3624],{"type":47,"tag":68,"props":3610,"children":3611},{},[3612],{"type":52,"value":104},{"type":52,"value":1325},{"type":47,"tag":100,"props":3615,"children":3616},{},[3617,3618,3623],{"type":52,"value":1410},{"type":47,"tag":76,"props":3619,"children":3621},{"className":3620},[],[3622],{"type":52,"value":89},{"type":52,"value":1417},{"type":52,"value":3625}," — list the final output URLs directly in the completion message, one entry per image:",{"type":47,"tag":651,"props":3627,"children":3630},{"className":3628,"code":3629,"language":52},[801],"portrait_1.jpg → \u003Cfinal_url_1>\nportrait_2.jpg → \u003Cfinal_url_2>\n\u002F\u002F ... one entry per image\n",[3631],{"type":47,"tag":76,"props":3632,"children":3633},{"__ignoreMap":656},[3634],{"type":52,"value":3629},{"type":47,"tag":55,"props":3636,"children":3637},{},[3638,3640,3646],{"type":52,"value":3639},"UI clients that render image URLs inline will display them automatically. In Codex or other non-UI agents, download each to the workspace (",{"type":47,"tag":76,"props":3641,"children":3643},{"className":3642},[],[3644],{"type":52,"value":3645},"curl -L -o portrait_1.jpg \"\u003Cfinal_url_1>\"",{"type":52,"value":3647},", etc.) and reference those local paths instead.",{"type":47,"tag":821,"props":3649,"children":3651},{"id":3650},"create-firefly-board",[3652],{"type":52,"value":3653},"Create Firefly Board",{"type":47,"tag":55,"props":3655,"children":3656},{},[3657],{"type":52,"value":3658},"Call the firefly board tool with the final output urls as follows:",{"type":47,"tag":651,"props":3660,"children":3662},{"className":2490,"code":3661,"language":2492,"meta":656,"style":656},"create_firefly_board({\n  import_adobe_storage: [\n    final_output_url_1,\n    final_output_url_2,\n    \u002F\u002F ...\n  ]\n})\n",[3663],{"type":47,"tag":76,"props":3664,"children":3665},{"__ignoreMap":656},[3666,3681,3697,3710,3722,3730,3737],{"type":47,"tag":569,"props":3667,"children":3668},{"class":663,"line":664},[3669,3673,3677],{"type":47,"tag":569,"props":3670,"children":3671},{"style":2502},[3672],{"type":52,"value":622},{"type":47,"tag":569,"props":3674,"children":3675},{"style":2507},[3676],{"type":52,"value":2510},{"type":47,"tag":569,"props":3678,"children":3679},{"style":668},[3680],{"type":52,"value":2515},{"type":47,"tag":569,"props":3682,"children":3683},{"class":663,"line":2518},[3684,3689,3693],{"type":47,"tag":569,"props":3685,"children":3686},{"style":2522},[3687],{"type":52,"value":3688},"  import_adobe_storage",{"type":47,"tag":569,"props":3690,"children":3691},{"style":668},[3692],{"type":52,"value":692},{"type":47,"tag":569,"props":3694,"children":3695},{"style":2507},[3696],{"type":52,"value":2534},{"type":47,"tag":569,"props":3698,"children":3699},{"class":663,"line":2537},[3700,3705],{"type":47,"tag":569,"props":3701,"children":3702},{"style":2507},[3703],{"type":52,"value":3704},"    final_output_url_1",{"type":47,"tag":569,"props":3706,"children":3707},{"style":668},[3708],{"type":52,"value":3709},",\n",{"type":47,"tag":569,"props":3711,"children":3712},{"class":663,"line":2601},[3713,3718],{"type":47,"tag":569,"props":3714,"children":3715},{"style":2507},[3716],{"type":52,"value":3717},"    final_output_url_2",{"type":47,"tag":569,"props":3719,"children":3720},{"style":668},[3721],{"type":52,"value":3709},{"type":47,"tag":569,"props":3723,"children":3724},{"class":663,"line":2653},[3725],{"type":47,"tag":569,"props":3726,"children":3727},{"style":3580},[3728],{"type":52,"value":3729},"    \u002F\u002F ...\n",{"type":47,"tag":569,"props":3731,"children":3732},{"class":663,"line":2662},[3733],{"type":47,"tag":569,"props":3734,"children":3735},{"style":2507},[3736],{"type":52,"value":2659},{"type":47,"tag":569,"props":3738,"children":3739},{"class":663,"line":3593},[3740,3744],{"type":47,"tag":569,"props":3741,"children":3742},{"style":668},[3743],{"type":52,"value":2668},{"type":47,"tag":569,"props":3745,"children":3746},{"style":2507},[3747],{"type":52,"value":2673},{"type":47,"tag":55,"props":3749,"children":3750},{},[3751],{"type":47,"tag":68,"props":3752,"children":3753},{},[3754],{"type":52,"value":3755},"Board link handling:",{"type":47,"tag":1219,"props":3757,"children":3758},{},[3759,3771,3783],{"type":47,"tag":1223,"props":3760,"children":3761},{},[3762,3764,3770],{"type":52,"value":3763},"Extract the returned URL and store as ",{"type":47,"tag":76,"props":3765,"children":3767},{"className":3766},[],[3768],{"type":52,"value":3769},"board_url",{"type":52,"value":1536},{"type":47,"tag":1223,"props":3772,"children":3773},{},[3774,3776,3781],{"type":52,"value":3775},"If ",{"type":47,"tag":76,"props":3777,"children":3779},{"className":3778},[],[3780],{"type":52,"value":3769},{"type":52,"value":3782}," is present and non-empty, include it in the completion message.",{"type":47,"tag":1223,"props":3784,"children":3785},{},[3786,3788,3793],{"type":52,"value":3787},"If the call fails or returns no URL: note \"Firefly Board unavailable\" in the summary (retrying does not help).\nThen post the completion message. The preview grid is included in every completion message. The board link is included whenever ",{"type":47,"tag":76,"props":3789,"children":3791},{"className":3790},[],[3792],{"type":52,"value":3769},{"type":52,"value":3794}," was returned.",{"type":47,"tag":55,"props":3796,"children":3797},{},[3798,3803],{"type":47,"tag":68,"props":3799,"children":3800},{},[3801],{"type":52,"value":3802},"If N ≤ 3",{"type":52,"value":3804}," — list individual links:",{"type":47,"tag":651,"props":3806,"children":3809},{"className":3807,"code":3808,"language":52},[801],"✅ All done! [N] portraits retouched and ready.\n\n📥 Download your full-resolution portraits:\n• Portrait 1 → \u003Cfinal_url_1>\n• Portrait 2 → \u003Cfinal_url_2>\n\n🎨 View in Firefly Board → \u003Cboard_url>   ← always include if board_url is set\n\nPipeline applied: Auto-straighten → Auto-tone (Camera Raw) → [tweaks if any]\n→ [adaptive enhancements if any] → [blur if any] → Crop [ratio]\n",[3810],{"type":47,"tag":76,"props":3811,"children":3812},{"__ignoreMap":656},[3813],{"type":52,"value":3808},{"type":47,"tag":55,"props":3815,"children":3816},{},[3817,3822],{"type":47,"tag":68,"props":3818,"children":3819},{},[3820],{"type":52,"value":3821},"If N > 3",{"type":52,"value":3823}," — list all links:",{"type":47,"tag":651,"props":3825,"children":3828},{"className":3826,"code":3827,"language":52},[801],"✅ All done! [N] portraits retouched and ready.\n\n📥 Your retouched portraits:\n• Portrait 1 → \u003Cfinal_url_1>\n• Portrait 2 → \u003Cfinal_url_2>\n• ...\n\n🎨 View in Firefly Board → \u003Cboard_url>   ← always include if board_url is set\n\nPipeline applied: Auto-straighten → Auto-tone (Camera Raw) → [tweaks if any]\n→ [adaptive enhancements if any] → [blur if any] → Crop [ratio]\n",[3829],{"type":47,"tag":76,"props":3830,"children":3831},{"__ignoreMap":656},[3832],{"type":52,"value":3827},{"type":47,"tag":116,"props":3834,"children":3835},{},[],{"type":47,"tag":120,"props":3837,"children":3839},{"id":3838},"verbosity-rule",[3840],{"type":52,"value":3841},"Verbosity Rule",{"type":47,"tag":55,"props":3843,"children":3844},{},[3845],{"type":52,"value":3846},"Built for large batches — report only: per-stage start, individual failures (logged once), and the final summary.",{"type":47,"tag":1219,"props":3848,"children":3849},{},[3850,3862,3867],{"type":47,"tag":1223,"props":3851,"children":3852},{},[3853,3855,3860],{"type":52,"value":3854},"When a pipeline stage begins for the whole batch (e.g. \"Straightening ",{"type":47,"tag":569,"props":3856,"children":3857},{},[3858],{"type":52,"value":3859},"N",{"type":52,"value":3861}," images...\")",{"type":47,"tag":1223,"props":3863,"children":3864},{},[3865],{"type":52,"value":3866},"If an individual image fails (log once, continue)",{"type":47,"tag":1223,"props":3868,"children":3869},{},[3870],{"type":52,"value":3871},"Final completion summary with grid + download links",{"type":47,"tag":116,"props":3873,"children":3874},{},[],{"type":47,"tag":120,"props":3876,"children":3878},{"id":3877},"output-extraction-reference",[3879],{"type":52,"value":3880},"Output Extraction Reference",{"type":47,"tag":55,"props":3882,"children":3883},{},[3884],{"type":52,"value":3885},"All pipeline tools return:",{"type":47,"tag":651,"props":3887,"children":3889},{"className":653,"code":3888,"language":655,"meta":656,"style":656},"{ \"results\": [{ \"success\": true, \"outputUrl\": \"https:\u002F\u002F...\" }] }\n",[3890],{"type":47,"tag":76,"props":3891,"children":3892},{"__ignoreMap":656},[3893],{"type":47,"tag":569,"props":3894,"children":3895},{"class":663,"line":664},[3896,3900,3904,3909,3913,3917,3922,3926,3932,3936,3940,3945,3949,3954,3958,3962,3966,3971,3975,3980],{"type":47,"tag":569,"props":3897,"children":3898},{"style":668},[3899],{"type":52,"value":671},{"type":47,"tag":569,"props":3901,"children":3902},{"style":668},[3903],{"type":52,"value":676},{"type":47,"tag":569,"props":3905,"children":3906},{"style":679},[3907],{"type":52,"value":3908},"results",{"type":47,"tag":569,"props":3910,"children":3911},{"style":668},[3912],{"type":52,"value":687},{"type":47,"tag":569,"props":3914,"children":3915},{"style":668},[3916],{"type":52,"value":692},{"type":47,"tag":569,"props":3918,"children":3919},{"style":668},[3920],{"type":52,"value":3921}," [{",{"type":47,"tag":569,"props":3923,"children":3924},{"style":668},[3925],{"type":52,"value":676},{"type":47,"tag":569,"props":3927,"children":3929},{"style":3928},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[3930],{"type":52,"value":3931},"success",{"type":47,"tag":569,"props":3933,"children":3934},{"style":668},[3935],{"type":52,"value":687},{"type":47,"tag":569,"props":3937,"children":3938},{"style":668},[3939],{"type":52,"value":692},{"type":47,"tag":569,"props":3941,"children":3942},{"style":668},[3943],{"type":52,"value":3944}," true,",{"type":47,"tag":569,"props":3946,"children":3947},{"style":668},[3948],{"type":52,"value":676},{"type":47,"tag":569,"props":3950,"children":3951},{"style":3928},[3952],{"type":52,"value":3953},"outputUrl",{"type":47,"tag":569,"props":3955,"children":3956},{"style":668},[3957],{"type":52,"value":687},{"type":47,"tag":569,"props":3959,"children":3960},{"style":668},[3961],{"type":52,"value":692},{"type":47,"tag":569,"props":3963,"children":3964},{"style":668},[3965],{"type":52,"value":676},{"type":47,"tag":569,"props":3967,"children":3968},{"style":699},[3969],{"type":52,"value":3970},"https:\u002F\u002F...",{"type":47,"tag":569,"props":3972,"children":3973},{"style":668},[3974],{"type":52,"value":687},{"type":47,"tag":569,"props":3976,"children":3977},{"style":668},[3978],{"type":52,"value":3979}," }]",{"type":47,"tag":569,"props":3981,"children":3982},{"style":668},[3983],{"type":52,"value":744},{"type":47,"tag":55,"props":3985,"children":3986},{},[3987,3989,3995,3997,4003],{"type":52,"value":3988},"Output is read from ",{"type":47,"tag":76,"props":3990,"children":3992},{"className":3991},[],[3993],{"type":52,"value":3994},"results[N].outputUrl",{"type":52,"value":3996},". On ",{"type":47,"tag":76,"props":3998,"children":4000},{"className":3999},[],[4001],{"type":52,"value":4002},"success: false",{"type":52,"value":4004}," see Error Handling.",{"type":47,"tag":116,"props":4006,"children":4007},{},[],{"type":47,"tag":120,"props":4009,"children":4011},{"id":4010},"error-handling",[4012],{"type":52,"value":4013},"Error Handling",{"type":47,"tag":214,"props":4015,"children":4016},{},[4017,4032],{"type":47,"tag":218,"props":4018,"children":4019},{},[4020],{"type":47,"tag":222,"props":4021,"children":4022},{},[4023,4028],{"type":47,"tag":226,"props":4024,"children":4025},{},[4026],{"type":52,"value":4027},"Situation",{"type":47,"tag":226,"props":4029,"children":4030},{},[4031],{"type":52,"value":1446},{"type":47,"tag":242,"props":4033,"children":4034},{},[4035,4053,4077,4090,4108,4126,4143,4156,4173,4197,4210,4241,4258,4275,4293,4306],{"type":47,"tag":222,"props":4036,"children":4037},{},[4038,4048],{"type":47,"tag":249,"props":4039,"children":4040},{},[4041,4046],{"type":47,"tag":76,"props":4042,"children":4044},{"className":4043},[],[4045],{"type":52,"value":337},{"type":52,"value":4047}," returns empty or 403",{"type":47,"tag":249,"props":4049,"children":4050},{},[4051],{"type":52,"value":4052},"Skip Step 5 entirely (non-blocking — all other steps continue). Note in summary: \"Adaptive enhancements unavailable — no presets found on this plan.\"",{"type":47,"tag":222,"props":4054,"children":4055},{},[4056,4066],{"type":47,"tag":249,"props":4057,"children":4058},{},[4059,4064],{"type":47,"tag":76,"props":4060,"children":4062},{"className":4061},[],[4063],{"type":52,"value":448},{"type":52,"value":4065}," returns 403 (entitlement)",{"type":47,"tag":249,"props":4067,"children":4068},{},[4069,4071,4075],{"type":52,"value":4070},"Skip that preset. Note in delivery summary: \"",{"type":47,"tag":569,"props":4072,"children":4073},{},[4074],{"type":52,"value":3171},{"type":52,"value":4076}," was skipped — not included in your Adobe plan.\" Continue with remaining presets.",{"type":47,"tag":222,"props":4078,"children":4079},{},[4080,4085],{"type":47,"tag":249,"props":4081,"children":4082},{},[4083],{"type":52,"value":4084},"Any tool returns 401 (not authenticated)",{"type":47,"tag":249,"props":4086,"children":4087},{},[4088],{"type":52,"value":4089},"Ask the user to re-authenticate via Adobe OAuth and retry",{"type":47,"tag":222,"props":4091,"children":4092},{},[4093,4103],{"type":47,"tag":249,"props":4094,"children":4095},{},[4096,4101],{"type":47,"tag":76,"props":4097,"children":4099},{"className":4098},[],[4100],{"type":52,"value":81},{"type":52,"value":4102}," shows no files",{"type":47,"tag":249,"props":4104,"children":4105},{},[4106],{"type":52,"value":4107},"Wait; remind user to select files in the picker",{"type":47,"tag":222,"props":4109,"children":4110},{},[4111,4121],{"type":47,"tag":249,"props":4112,"children":4113},{},[4114,4119],{"type":47,"tag":76,"props":4115,"children":4117},{"className":4116},[],[4118],{"type":52,"value":359},{"type":52,"value":4120}," fails",{"type":47,"tag":249,"props":4122,"children":4123},{},[4124],{"type":52,"value":4125},"Pass original URI to Step 4; note \"straighten skipped\"",{"type":47,"tag":222,"props":4127,"children":4128},{},[4129,4138],{"type":47,"tag":249,"props":4130,"children":4131},{},[4132,4137],{"type":47,"tag":76,"props":4133,"children":4135},{"className":4134},[],[4136],{"type":52,"value":381},{"type":52,"value":4120},{"type":47,"tag":249,"props":4139,"children":4140},{},[4141],{"type":52,"value":4142},"Pass straightened URI forward; note in summary",{"type":47,"tag":222,"props":4144,"children":4145},{},[4146,4151],{"type":47,"tag":249,"props":4147,"children":4148},{},[4149],{"type":52,"value":4150},"Any tone adjustment fails",{"type":47,"tag":249,"props":4152,"children":4153},{},[4154],{"type":52,"value":4155},"Log and continue with previous step's output",{"type":47,"tag":222,"props":4157,"children":4158},{},[4159,4168],{"type":47,"tag":249,"props":4160,"children":4161},{},[4162,4167],{"type":47,"tag":76,"props":4163,"children":4165},{"className":4164},[],[4166],{"type":52,"value":426},{"type":52,"value":4120},{"type":47,"tag":249,"props":4169,"children":4170},{},[4171],{"type":52,"value":4172},"Skip all body-gated presets (Whiten Teeth, body-targeted adaptive); apply Mood and Toon presets normally",{"type":47,"tag":222,"props":4174,"children":4175},{},[4176,4186],{"type":47,"tag":249,"props":4177,"children":4178},{},[4179,4184],{"type":47,"tag":76,"props":4180,"children":4182},{"className":4181},[],[4183],{"type":52,"value":448},{"type":52,"value":4185}," fails (non-403)",{"type":47,"tag":249,"props":4187,"children":4188},{},[4189,4191,4195],{"type":52,"value":4190},"Use previous step's output; note \"",{"type":47,"tag":569,"props":4192,"children":4193},{},[4194],{"type":52,"value":3185},{"type":52,"value":4196}," skipped\" in summary",{"type":47,"tag":222,"props":4198,"children":4199},{},[4200,4205],{"type":47,"tag":249,"props":4201,"children":4202},{},[4203],{"type":52,"value":4204},"No portrait-appropriate preset found for a bucket",{"type":47,"tag":249,"props":4206,"children":4207},{},[4208],{"type":52,"value":4209},"Leave that bucket empty; do not force an ill-fitting preset",{"type":47,"tag":222,"props":4211,"children":4212},{},[4213,4222],{"type":47,"tag":249,"props":4214,"children":4215},{},[4216,4221],{"type":47,"tag":76,"props":4217,"children":4219},{"className":4218},[],[4220],{"type":52,"value":470},{"type":52,"value":4120},{"type":47,"tag":249,"props":4223,"children":4224},{},[4225,4227,4232,4233,4239],{"type":52,"value":4226},"Fall back to ",{"type":47,"tag":76,"props":4228,"children":4230},{"className":4229},[],[4231],{"type":52,"value":492},{"type":52,"value":1359},{"type":47,"tag":76,"props":4234,"children":4236},{"className":4235},[],[4237],{"type":52,"value":4238},"blurRadius: 8, blurTarget: \"background\"",{"type":52,"value":4240},"; note \"lens blur unavailable\" in summary",{"type":47,"tag":222,"props":4242,"children":4243},{},[4244,4253],{"type":47,"tag":249,"props":4245,"children":4246},{},[4247,4252],{"type":47,"tag":76,"props":4248,"children":4250},{"className":4249},[],[4251],{"type":52,"value":492},{"type":52,"value":4120},{"type":47,"tag":249,"props":4254,"children":4255},{},[4256],{"type":52,"value":4257},"Use previous step's output; note \"blur skipped\"",{"type":47,"tag":222,"props":4259,"children":4260},{},[4261,4270],{"type":47,"tag":249,"props":4262,"children":4263},{},[4264,4269],{"type":47,"tag":76,"props":4265,"children":4267},{"className":4266},[],[4268],{"type":52,"value":542},{"type":52,"value":4120},{"type":47,"tag":249,"props":4271,"children":4272},{},[4273],{"type":52,"value":4274},"Use blur output as final; note in summary",{"type":47,"tag":222,"props":4276,"children":4277},{},[4278,4288],{"type":47,"tag":249,"props":4279,"children":4280},{},[4281,4286],{"type":47,"tag":76,"props":4282,"children":4284},{"className":4283},[],[4285],{"type":52,"value":89},{"type":52,"value":4287}," fails or is unavailable",{"type":47,"tag":249,"props":4289,"children":4290},{},[4291],{"type":52,"value":4292},"Present final output URLs as plain text links in the summary (see Step 8 no-widget fallback).",{"type":47,"tag":222,"props":4294,"children":4295},{},[4296,4301],{"type":47,"tag":249,"props":4297,"children":4298},{},[4299],{"type":52,"value":4300},"All steps fail on one image",{"type":47,"tag":249,"props":4302,"children":4303},{},[4304],{"type":52,"value":4305},"Return original URI; flag clearly in summary",{"type":47,"tag":222,"props":4307,"children":4308},{},[4309,4314],{"type":47,"tag":249,"props":4310,"children":4311},{},[4312],{"type":52,"value":4313},"Dead end",{"type":47,"tag":249,"props":4315,"children":4316},{},[4317],{"type":52,"value":4318},"Report the failure clearly and offer to retry.",{"type":47,"tag":116,"props":4320,"children":4321},{},[],{"type":47,"tag":120,"props":4323,"children":4325},{"id":4324},"hard-constraints",[4326],{"type":52,"value":4327},"Hard Constraints",{"type":47,"tag":1219,"props":4329,"children":4330},{},[4331,4336,4341,4353,4373,4393,4435,4445,4462,4474,4486,4520,4539,4550,4569,4602],{"type":47,"tag":1223,"props":4332,"children":4333},{},[4334],{"type":52,"value":4335},"Every image in the batch is processed; failures are flagged rather than silently skipped.",{"type":47,"tag":1223,"props":4337,"children":4338},{},[4339],{"type":52,"value":4340},"Mood\u002Fstyle is always collected (Step 2a) before the plan is presented — it influences Preset Plan bucket selection.",{"type":47,"tag":1223,"props":4342,"children":4343},{},[4344,4346,4351],{"type":52,"value":4345},"The before\u002Fafter preview gate (Step 2c) is ",{"type":47,"tag":68,"props":4347,"children":4348},{},[4349],{"type":52,"value":4350},"mandatory",{"type":52,"value":4352}," — the full batch never starts without the user explicitly confirming \"Yes\". After any settings adjustment, the preview always repeats with the new settings before the batch runs.",{"type":47,"tag":1223,"props":4354,"children":4355},{},[4356,4371],{"type":47,"tag":68,"props":4357,"children":4358},{},[4359,4360,4365,4366],{"type":52,"value":3231},{"type":47,"tag":76,"props":4361,"children":4363},{"className":4362},[],[4364],{"type":52,"value":2140},{"type":52,"value":2175},{"type":47,"tag":76,"props":4367,"children":4369},{"className":4368},[],[4370],{"type":52,"value":2181},{"type":52,"value":4372}," for portrait boosts — vibrance intelligently protects skin tones from oversaturation.",{"type":47,"tag":1223,"props":4374,"children":4375},{},[4376,4391],{"type":47,"tag":68,"props":4377,"children":4378},{},[4379,4380,4385,4386],{"type":52,"value":3231},{"type":47,"tag":76,"props":4381,"children":4383},{"className":4382},[],[4384],{"type":52,"value":470},{"type":52,"value":2175},{"type":47,"tag":76,"props":4387,"children":4389},{"className":4388},[],[4390],{"type":52,"value":492},{"type":52,"value":4392}," for background separation — lens blur is depth-aware and produces more realistic bokeh without masking. Use gaussian only for heavy\u002Fstylized blur explicitly requested by the user.",{"type":47,"tag":1223,"props":4394,"children":4395},{},[4396,4401,4403,4409,4411,4417,4419,4425,4427,4433],{"type":47,"tag":68,"props":4397,"children":4398},{},[4399],{"type":52,"value":4400},"Tweak values are diagnostic, not hardcoded",{"type":52,"value":4402}," — choose values from the reference ranges based on image content; ",{"type":47,"tag":76,"props":4404,"children":4406},{"className":4405},[],[4407],{"type":52,"value":4408},"contrast: +15",{"type":52,"value":4410}," for mildly flat images, ",{"type":47,"tag":76,"props":4412,"children":4414},{"className":4413},[],[4415],{"type":52,"value":4416},"+30",{"type":52,"value":4418}," only for very flat; ",{"type":47,"tag":76,"props":4420,"children":4422},{"className":4421},[],[4423],{"type":52,"value":4424},"highlights: -40",{"type":52,"value":4426}," for mild blow, ",{"type":47,"tag":76,"props":4428,"children":4430},{"className":4429},[],[4431],{"type":52,"value":4432},"-70",{"type":52,"value":4434}," for severe.",{"type":47,"tag":1223,"props":4436,"children":4437},{},[4438,4443],{"type":47,"tag":68,"props":4439,"children":4440},{},[4441],{"type":52,"value":4442},"Group\u002Fcondition awareness",{"type":52,"value":4444}," — if the batch contains images from clearly different shooting conditions (e.g. mixed indoor\u002Foutdoor, or very different exposures), note this in the confirmation message and apply the same user-selected settings to all. For a future enhancement, per-group pipelines could be run separately.",{"type":47,"tag":1223,"props":4446,"children":4447},{},[4448,4453,4455,4461],{"type":47,"tag":76,"props":4449,"children":4451},{"className":4450},[],[4452],{"type":52,"value":381},{"type":52,"value":4454}," is called with ",{"type":47,"tag":76,"props":4456,"children":4458},{"className":4457},[],[4459],{"type":52,"value":4460},"type: \"cameraRawFilter\"",{"type":52,"value":1536},{"type":47,"tag":1223,"props":4463,"children":4464},{},[4465,4467,4472],{"type":52,"value":4466},"Adaptive enhancements are ",{"type":47,"tag":68,"props":4468,"children":4469},{},[4470],{"type":52,"value":4471},"off by default",{"type":52,"value":4473}," — only run them if the user explicitly selects them.",{"type":47,"tag":1223,"props":4475,"children":4476},{},[4477,4479,4484],{"type":52,"value":4478},"Preset selection is always dynamic: call ",{"type":47,"tag":76,"props":4480,"children":4482},{"className":4481},[],[4483],{"type":52,"value":337},{"type":52,"value":4485}," at runtime; never hardcode preset names.",{"type":47,"tag":1223,"props":4487,"children":4488},{},[4489,4491,4496,4498,4504,4505,4511,4512,4518],{"type":52,"value":4490},"All tonal\u002Fcolour adjustments use ",{"type":47,"tag":76,"props":4492,"children":4494},{"className":4493},[],[4495],{"type":52,"value":404},{"type":52,"value":4497}," — the individual tools (",{"type":47,"tag":76,"props":4499,"children":4501},{"className":4500},[],[4502],{"type":52,"value":4503},"image_adjust_highlights",{"type":52,"value":844},{"type":47,"tag":76,"props":4506,"children":4508},{"className":4507},[],[4509],{"type":52,"value":4510},"image_adjust_dark_portions",{"type":52,"value":844},{"type":47,"tag":76,"props":4513,"children":4515},{"className":4514},[],[4516],{"type":52,"value":4517},"image_adjust_vibrance_and_saturation",{"type":52,"value":4519},", etc.) are deprecated and must not be used.",{"type":47,"tag":1223,"props":4521,"children":4522},{},[4523,4525,4530,4532,4537],{"type":52,"value":4524},"Background blur is handled by the Background Blur preset from the Preset Plan (or ",{"type":47,"tag":76,"props":4526,"children":4528},{"className":4527},[],[4529],{"type":52,"value":470},{"type":52,"value":4531}," for standard blur \u002F ",{"type":47,"tag":76,"props":4533,"children":4535},{"className":4534},[],[4536],{"type":52,"value":492},{"type":52,"value":4538}," for heavy blur); the adaptive preset and Step 6 are mutually exclusive per image.",{"type":47,"tag":1223,"props":4540,"children":4541},{},[4542,4544,4549],{"type":52,"value":4543},"Whiten Teeth and body-targeted presets only run when the relevant body part is detected via ",{"type":47,"tag":76,"props":4545,"children":4547},{"className":4546},[],[4548],{"type":52,"value":426},{"type":52,"value":1536},{"type":47,"tag":1223,"props":4551,"children":4552},{},[4553,4555,4560,4561,4567],{"type":52,"value":4554},"The pipeline is non-generative by default. Generative tools (",{"type":47,"tag":76,"props":4556,"children":4558},{"className":4557},[],[4559],{"type":52,"value":165},{"type":52,"value":844},{"type":47,"tag":76,"props":4562,"children":4564},{"className":4563},[],[4565],{"type":52,"value":4566},"image_generative_expand",{"type":52,"value":4568},") run ONLY where the surface permits generative AI (the tool is available, e.g. Codex) — never on a surface without it (e.g. Claude), and never on people even where permitted. See the Generative AI Policy above.",{"type":47,"tag":1223,"props":4570,"children":4571},{},[4572,4574,4579,4581,4586,4588,4593,4595,4600],{"type":52,"value":4573},"Never pass a raw local filesystem path to any ",{"type":47,"tag":76,"props":4575,"children":4577},{"className":4576},[],[4578],{"type":52,"value":1425},{"type":52,"value":4580}," tool. Local files must reach Creative Cloud first — selected via the ",{"type":47,"tag":76,"props":4582,"children":4584},{"className":4583},[],[4585],{"type":52,"value":81},{"type":52,"value":4587}," picker, or (no-widget fallback) staged via ",{"type":47,"tag":76,"props":4589,"children":4591},{"className":4590},[],[4592],{"type":52,"value":301},{"type":52,"value":4594}," → PUT → ",{"type":47,"tag":76,"props":4596,"children":4598},{"className":4597},[],[4599],{"type":52,"value":308},{"type":52,"value":4601},"; only the resulting presigned CC URI is valid.",{"type":47,"tag":1223,"props":4603,"children":4604},{},[4605],{"type":52,"value":4606},"Push notifications (Slack\u002Femail\u002Ftext) are not available from here; completion is communicated through an in-chat summary.",{"type":47,"tag":4608,"props":4609,"children":4610},"style",{},[4611],{"type":52,"value":4612},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":4614,"total":4816},[4615,4636,4659,4676,4691,4710,4729,4745,4761,4775,4787,4800],{"slug":4616,"name":4616,"fn":4617,"description":4618,"org":4619,"tags":4620,"stars":4633,"repoUrl":4634,"updatedAt":4635},"prior-auth-packet-builder","build healthcare prior authorization packets","Build a concise prior authorization packet from local case files and payer policy docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4621,4624,4627,4630],{"name":4622,"slug":4623,"type":15},"Documents","documents",{"name":4625,"slug":4626,"type":15},"Healthcare","healthcare",{"name":4628,"slug":4629,"type":15},"Insurance","insurance",{"name":4631,"slug":4632,"type":15},"Regulatory Compliance","regulatory-compliance",28169,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-agents-python","2026-08-02T05:48:07.395855",{"slug":4637,"name":4637,"fn":4638,"description":4639,"org":4640,"tags":4641,"stars":4656,"repoUrl":4657,"updatedAt":4658},"aspnet-core","build ASP.NET Core web applications","Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development. Use when working on Blazor Web Apps, Razor Pages, MVC, Minimal APIs, controller-based Web APIs, SignalR, gRPC, middleware, dependency injection, configuration, authentication, authorization, testing, performance, deployment, or ASP.NET Core upgrades.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4642,4645,4647,4650,4653],{"name":4643,"slug":4644,"type":15},".NET","dotnet",{"name":4646,"slug":4637,"type":15},"ASP.NET Core",{"name":4648,"slug":4649,"type":15},"Blazor","blazor",{"name":4651,"slug":4652,"type":15},"C#","csharp",{"name":4654,"slug":4655,"type":15},"Web Development","web-development",23787,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fskills","2026-04-12T05:07:02.819491",{"slug":4660,"name":4660,"fn":4661,"description":4662,"org":4663,"tags":4664,"stars":4656,"repoUrl":4657,"updatedAt":4675},"chatgpt-apps","build ChatGPT Apps SDK applications","Build, scaffold, refactor, and troubleshoot ChatGPT Apps SDK applications that combine an MCP server and widget UI. Use when Codex needs to design tools, register UI resources, wire the MCP Apps bridge or ChatGPT compatibility APIs, apply Apps SDK metadata or CSP or domain settings, or produce a docs-aligned project scaffold. Prefer a docs-first workflow by invoking the openai-docs skill or OpenAI developer docs MCP tools before generating code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4665,4668,4671,4674],{"name":4666,"slug":4667,"type":15},"Apps SDK","apps-sdk",{"name":4669,"slug":4670,"type":15},"ChatGPT","chatgpt",{"name":4672,"slug":4673,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},"2026-04-12T05:07:05.468097",{"slug":4677,"name":4677,"fn":4678,"description":4679,"org":4680,"tags":4681,"stars":4656,"repoUrl":4657,"updatedAt":4690},"cli-creator","build CLIs from API docs","Build a composable CLI for Codex from API docs, an OpenAPI spec, existing curl examples, an SDK, a web app, an admin tool, or a local script. Use when the user wants Codex to create a command-line tool that can run from any repo, expose composable read\u002Fwrite commands, return stable JSON, manage auth, and pair with a companion skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4682,4685,4688],{"name":4683,"slug":4684,"type":15},"API Development","api-development",{"name":4686,"slug":4687,"type":15},"CLI","cli",{"name":4689,"slug":42,"type":15},"Codex","2026-04-12T05:07:04.132762",{"slug":4692,"name":4692,"fn":4693,"description":4694,"org":4695,"tags":4696,"stars":4656,"repoUrl":4657,"updatedAt":4709},"cloudflare-deploy","deploy projects to Cloudflare","Deploy applications and infrastructure to Cloudflare using Workers, Pages, and related platform services. Use when the user asks to deploy, host, publish, or set up a project on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4697,4700,4703,4706],{"name":4698,"slug":4699,"type":15},"Cloudflare","cloudflare",{"name":4701,"slug":4702,"type":15},"Cloudflare Pages","cloudflare-pages",{"name":4704,"slug":4705,"type":15},"Cloudflare Workers","cloudflare-workers",{"name":4707,"slug":4708,"type":15},"Deployment","deployment","2026-04-12T05:07:14.275118",{"slug":4711,"name":4711,"fn":4712,"description":4713,"org":4714,"tags":4715,"stars":4656,"repoUrl":4657,"updatedAt":4728},"define-goal","define and set measurable project goals","Help the user define a concrete, measurable goal before starting work, especially when they ask to use the goal tool, create a goal, set an objective, clarify success criteria, or turn a fuzzy intention into a quantitative outcome. Use this skill for goal creation and goal refinement only; it does not manage durable snapshots, decision logs, or long-running execution artifacts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4716,4719,4722,4725],{"name":4717,"slug":4718,"type":15},"Productivity","productivity",{"name":4720,"slug":4721,"type":15},"Project Management","project-management",{"name":4723,"slug":4724,"type":15},"Strategy","strategy",{"name":4726,"slug":4727,"type":15},"Task Management","task-management","2026-05-23T06:17:16.870838",{"slug":4730,"name":4730,"fn":4731,"description":4732,"org":4733,"tags":4734,"stars":4656,"repoUrl":4657,"updatedAt":4744},"figma","translate Figma designs into code","Use the Figma MCP server to fetch design context, screenshots, variables, and assets from Figma, and to translate Figma nodes into production code. Trigger when a task involves Figma URLs, node IDs, design-to-code implementation, or Figma MCP setup and troubleshooting.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4735,4738,4740,4743],{"name":4736,"slug":4737,"type":15},"Design","design",{"name":4739,"slug":4730,"type":15},"Figma",{"name":4741,"slug":4742,"type":15},"Frontend","frontend",{"name":4672,"slug":4673,"type":15},"2026-04-12T05:06:47.939943",{"slug":4746,"name":4746,"fn":4747,"description":4748,"org":4749,"tags":4750,"stars":4656,"repoUrl":4657,"updatedAt":4760},"figma-code-connect-components","connect Figma designs to code components","Connects Figma design components to code components using Code Connect mapping tools. Use when user says \"code connect\", \"connect this component to code\", \"map this component\", \"link component to code\", \"create code connect mapping\", or wants to establish mappings between Figma designs and code implementations. For canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4751,4752,4755,4756,4757],{"name":4736,"slug":4737,"type":15},{"name":4753,"slug":4754,"type":15},"Design System","design-system",{"name":4739,"slug":4730,"type":15},{"name":4741,"slug":4742,"type":15},{"name":4758,"slug":4759,"type":15},"UI Components","ui-components","2026-05-10T05:59:52.971881",{"slug":4762,"name":4762,"fn":4763,"description":4764,"org":4765,"tags":4766,"stars":4656,"repoUrl":4657,"updatedAt":4774},"figma-create-design-system-rules","generate design system rules from Figma","Generates custom design system rules for the user's codebase. Use when user says \"create design system rules\", \"generate rules for my project\", \"set up design rules\", \"customize design system guidelines\", or wants to establish project-specific conventions for Figma-to-code workflows. Requires Figma MCP server connection.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4767,4768,4769,4772,4773],{"name":4736,"slug":4737,"type":15},{"name":4753,"slug":4754,"type":15},{"name":4770,"slug":4771,"type":15},"Documentation","documentation",{"name":4739,"slug":4730,"type":15},{"name":4741,"slug":4742,"type":15},"2026-05-16T06:07:47.821474",{"slug":4776,"name":4776,"fn":4777,"description":4778,"org":4779,"tags":4780,"stars":4656,"repoUrl":4657,"updatedAt":4786},"figma-implement-design","translate Figma designs into application code","Translates Figma designs into production-ready application code with 1:1 visual fidelity. Use when implementing UI code from Figma files, when user mentions \"implement design\", \"generate code\", \"implement component\", provides Figma URLs, or asks to build components matching Figma specs. For Figma canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4781,4782,4783,4784,4785],{"name":4736,"slug":4737,"type":15},{"name":4739,"slug":4730,"type":15},{"name":4741,"slug":4742,"type":15},{"name":4758,"slug":4759,"type":15},{"name":4654,"slug":4655,"type":15},"2026-05-16T06:07:40.583615",{"slug":4788,"name":4788,"fn":4789,"description":4790,"org":4791,"tags":4792,"stars":4656,"repoUrl":4657,"updatedAt":4799},"hatch-pet","create animated pets for Codex","Create, repair, validate, visually QA, and package Codex-compatible animated pets and pet spritesheets from character art, generated images, company or prospect brand cues, or visual references. Use when a user wants a lightweight-worker Codex pet workflow, a non-pixel custom pet style, a prospect or company mascot pet, or a full 8x9 animated pet atlas with transparent unused cells, QA contact sheets, and pet.json packaging. This skill composes the installed $imagegen system skill for visual generation and uses bundled scripts for deterministic spritesheet assembly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4793,4796,4797,4798],{"name":4794,"slug":4795,"type":15},"Animation","animation",{"name":4689,"slug":42,"type":15},{"name":13,"slug":14,"type":15},{"name":4736,"slug":4737,"type":15},"2026-05-02T05:31:48.48485",{"slug":4801,"name":4801,"fn":4802,"description":4803,"org":4804,"tags":4805,"stars":4656,"repoUrl":4657,"updatedAt":4815},"imagegen","generate and edit raster images","Generate or edit raster images when the task benefits from AI-created bitmap visuals such as photos, illustrations, textures, sprites, mockups, or transparent-background cutouts. Use when Codex should create a brand-new image, transform an existing image, or derive visual variants from references, and the output should be a bitmap asset rather than repo-native code or vector. Do not use when the task is better handled by editing existing SVG\u002Fvector\u002Fcode-native assets, extending an established icon or logo system, or building the visual directly in HTML\u002FCSS\u002Fcanvas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4806,4807,4808,4811,4814],{"name":13,"slug":14,"type":15},{"name":4736,"slug":4737,"type":15},{"name":4809,"slug":4810,"type":15},"Image Generation","image-generation",{"name":4812,"slug":4813,"type":15},"Images","images",{"name":9,"slug":8,"type":15},"2026-05-15T06:23:24.312127",578,{"items":4818,"total":4906},[4819,4836,4848,4860,4875,4888,4900],{"slug":4820,"name":4820,"fn":4821,"description":4822,"org":4823,"tags":4824,"stars":22,"repoUrl":23,"updatedAt":4835},"accessibility-and-inclusive-visualization","make data visualizations accessible","Make data visualizations accessible and inclusive. Use when the user needs chart or diagram accessibility guidance, text alternatives for complex visuals, color and contrast review, keyboard support, reduced-motion behavior for animation or parallax, or an accessibility QA workflow for exported figures, UML-like diagrams, and dashboards.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4825,4828,4831,4834],{"name":4826,"slug":4827,"type":15},"Accessibility","accessibility",{"name":4829,"slug":4830,"type":15},"Charts","charts",{"name":4832,"slug":4833,"type":15},"Data Visualization","data-visualization",{"name":4736,"slug":4737,"type":15},"2026-06-30T19:00:57.102",{"slug":4837,"name":4837,"fn":4838,"description":4839,"org":4840,"tags":4841,"stars":22,"repoUrl":23,"updatedAt":4847},"adobe-batch-edit-photos","apply consistent photo adjustments","Apply consistent photo adjustments across a set of images so they look like they were edited together. Use this skill whenever the user says \"make my photos look cohesive\", \"give all these the same style\", \"apply a warm and golden feel to all of these\", \"make this cinematic\", \"match the look across my photos\", \"edit all my travel photos the same way\", \"batch edit these\", \"make these consistent\", \"fix my phone photos\", or uploads a folder of photos and wants a unified, polished result. Also triggers for requests like \"apply a preset to all of these\", \"make these look professional\", or \"they were shot in mixed lighting — can you fix them all\". Outputs direct final image URLs plus an in-chat preview grid and optional Firefly Board link. Access: 🔐 Signed-In required | Gen AI: ❌\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4842,4843,4846],{"name":13,"slug":14,"type":15},{"name":4844,"slug":4845,"type":15},"Editing","editing",{"name":20,"slug":21,"type":15},"2026-08-28T15:09:11.185865",{"slug":4849,"name":4849,"fn":4850,"description":4851,"org":4852,"tags":4853,"stars":22,"repoUrl":23,"updatedAt":4859},"adobe-create-mockups","create product and scene mockups","Use when a user wants to see their logo, design, or sketch on a product or scene mockup — mugs, t-shirts, business cards, hats, phone screens, posters, billboards, or similar. Triggers on \"create mockups\", \"show my logo on products\", or any logo upload with a request to visualize it on items. Access: 🔐 Signed-In required | Gen AI: ✅ Adobe Firefly via `image_generate` used for design creation, sketch polishing, and mockup scene generation\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4854,4855,4856],{"name":13,"slug":14,"type":15},{"name":4736,"slug":4737,"type":15},{"name":4857,"slug":4858,"type":15},"Graphics","graphics","2026-08-28T15:09:07.42507",{"slug":4861,"name":4861,"fn":4862,"description":4863,"org":4864,"tags":4865,"stars":22,"repoUrl":23,"updatedAt":4874},"adobe-create-social-variations","export platform-ready social media assets","Resize, crop, or export any image or video into platform-ready social media assets using Adobe Creative Cloud tools. Use this skill when a user wants to prepare a photo, image, or video for one or more social platforms — Instagram, TikTok, LinkedIn, Facebook, YouTube, Snapchat, Pinterest, Threads, or X\u002FTwitter. Triggers on: \"prepare my image for Instagram\", \"resize for TikTok\", \"get this ready to post\", \"make versions for all platforms\", \"social media sizes\", \"crop for stories\", \"export for LinkedIn\", \"resize my video for social\", \"make social media assets\", or any request to adapt a photo or video for specific platforms. Handles subject-aware cropping, AI canvas expansion, test previews before full runs, and same-ratio video resizing.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4866,4867,4868,4871],{"name":13,"slug":14,"type":15},{"name":4857,"slug":4858,"type":15},{"name":4869,"slug":4870,"type":15},"Marketing","marketing",{"name":4872,"slug":4873,"type":15},"Social Media","social-media","2026-08-28T15:10:07.282096",{"slug":4876,"name":4876,"fn":4877,"description":4878,"org":4879,"tags":4880,"stars":22,"repoUrl":23,"updatedAt":4887},"adobe-design-from-template","create visual designs from templates","Create any visual design using Adobe Express templates — flyers, posters, social media posts (Instagram, Facebook, LinkedIn), business cards, invitations, greeting cards, resumes, cover letters, brochures, newsletters, certificates, presentations, YouTube thumbnails, email headers, logos, menus, and labels. Use this skill whenever the user wants to make, design, or build any visual — even if they just say \"make me a flyer\", \"design a poster\", \"I need something for Instagram\", \"create an event invite\", or \"make a business card\". Also handles browsing templates, editing text, replacing images, changing backgrounds, animating, and exporting designs. Access: 🔐 Signed-In required | Gen AI: ❌ by default — image replacement only where the surface permits generative AI (e.g. Codex); none on Claude\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4881,4882,4883,4884],{"name":13,"slug":14,"type":15},{"name":4736,"slug":4737,"type":15},{"name":4857,"slug":4858,"type":15},{"name":4885,"slug":4886,"type":15},"Templates","templates","2026-08-28T15:10:03.050113",{"slug":4889,"name":4889,"fn":4890,"description":4891,"org":4892,"tags":4893,"stars":22,"repoUrl":23,"updatedAt":4899},"adobe-edit-quick-cut","create video sizzle reels","Create a punchy sizzle reel from a video using Adobe Quick Cut. Use this skill whenever a user wants to cut, trim, or shorten a video into highlights — including phrases like \"make a sizzle reel\", \"make a highlight reel\", \"quick cut this\", \"cut the best parts\", \"shorten this video\", \"make a highlight clip\", \"summarize this video visually\", or any request to produce a shorter edited version of a video. Use this skill for Quick Cut requests before suggesting manual editing in Premiere. Requires the user to upload a video file.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4894,4895,4896],{"name":13,"slug":14,"type":15},{"name":4844,"slug":4845,"type":15},{"name":4897,"slug":4898,"type":15},"Video","video","2026-08-28T15:09:07.765245",{"slug":4,"name":4,"fn":5,"description":6,"org":4901,"tags":4902,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4903,4904,4905],{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},499]