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