generate-clip-art-asset-v2

activev2026.09.19

Generate a catalog-ready clip-art asset: styled render, optional background removal (variant selectable via the backgroundRemover role), and classifier-produced catalog metadata — one audited run per asset. Successor to generate-clip-art-asset.

This page renders the template’s published registry entry — the contract itself, not a description of it. Immutable versions; sealed properties exist but are not public.

What you provide — intake contract

FieldTypeRequiredDefaultDescription
promptstringrequired—Subject prompt for the isolated object or character. Do NOT include background/transparency wording — transparency is the backgroundRemovalEnabled flag's job, and transparency prose makes raster models draw the checkerboard (issue #213); such phrases are scrubbed
styleenum
flatminimaloutlineblack-and-whitecartoonmascotstickeremojivintagewatercolorstorybookisometricclaychibipixelkawaii3ddoodleline-artpaper-artretrobotanicalgeometricstained-glass
required"flat"Clip-art style
aspectRatioenum
1:13:44:33:22:316:99:16
required"1:1"Aspect ratio
sizestringoptional""Exact WIDTHxHEIGHT for this render, e.g. '2560x1440'. Empty (the default) means aspectRatio decides. Both edges must be multiples of 16, neither over 3840, the ratio between 1:3 and 3:1, and the total pixels between 655,360 and 8,294,400. Above 2560x1440 the provider calls results experimental — allowed, more variable.
qualityenum
lowmediumhighxhighmax
optional"low"Render quality tier
transparencyModeenum
removalnative
optional"removal"Which mechanism produces transparency: removal (the render wears a matte and the keyed/ML ladder cuts it) or native (the model draws the alpha itself)
backgroundRemovalEnabledbooleanoptionaltrueDeliver the asset with a transparent background
elementTypeenum
""subjectposepropbordercornerpatternscene
optional""Pack element type; full-bleed types ('pattern', 'scene') skip background removal — compositions have no single subject to isolate
alphaAuditModeenum
enforcereportoff
optional"enforce"Cutout QA after background removal: 'enforce' (default) fails bad cutouts (holes/halos/spill) so they retry through the removal ladder, 'report' records metrics only, 'off' skips the audit
removalEscalationEnabledbooleanoptionaltrueOn an enforced cutout-audit failure, retry the same render through stronger background-removal models (Heavy/Matting at 2K, then BRIA) before re-rendering; off fails straight to re-render
matteColorstringoptional""Chroma-key backing color for the keyed render (single-primary hex, e.g. #00FF00); empty lets the engine choose
categoriesstringrequired—Comma-separated category slugs the classifier must choose from (empty fails the run in preflight)
textPolicyenumoptional""Per-item text contract: none = text forbidden; exact = must match expectedText; freeform = text allowed, judged on legibility/spelling only. Empty derives from textBearing (true=exact, false=freeform). Use 'none' deliberately, for assets that must carry no characters at all.
textBearingbooleanoptionalfalseTrue when the asset must carry legible text (the OCR gate then checks it)
expectedTextstringoptional""The EXACT text the asset must carry; leave empty unless textPolicy is 'exact'

How it runs — step topology

1
Render imageimageimageGenerator
promptTemplate
2
Remove backgroundtoolbackgroundRemover
3
Refine edgestool
4
Audit cutouttool
5
Classify assetllmclassifier
systempromptTemplatemaxTokens
6
Text gatellmtextGategate

Hard gate: the run fails unless pass — OCR text gate rejected the render

systempromptTemplatemaxTokens

Model roles: imageGenerator backgroundRemover classifier textGate bindings budgetPolicy

What you get — artifact

clip-artvisual

Version lineage

2026.09.19rev 90current2026-09-27
sha256:6a4a37b8f…
2026.09.19rev 882026-09-20
sha256:0c90dec78…
2026.09.10.1rev 862026-09-12
sha256:a636a634e…
2026.09.10rev 852026-09-12
sha256:42282222c…
2026.09.10.1rev 822026-09-11
sha256:a636a634e…
2026.09.10rev 802026-09-09
sha256:42282222c…
2026.09.08rev 782026-09-08
sha256:659f417a8…
2026.07.31.2rev 762026-09-06
sha256:d2dace3b7…
2026.07.31.2rev 532026-08-06
sha256:42578c51d…
2026.07.31.2rev 522026-08-06
sha256:2fabc4ab7…
2026.07.31.2rev 392026-07-31
sha256:c1aa8f499…
2026.07.31rev 372026-07-31
sha256:431138b0c…
2026.07.30rev 362026-07-30
sha256:51adc2497…
2026.07.29.4rev 332026-07-30
sha256:db7f46d50…
2026.07.29.3rev 322026-07-29
sha256:364b5ea7c…
2026.07.29.2rev 282026-07-29
sha256:75b65a465…
2026.07.29.1rev 272026-07-29
sha256:b767729f3…
2026.07.24rev 262026-07-26
sha256:ae4da68c6…
2026.07.18rev 212026-07-20
sha256:6e4730873…
2026.07.18rev 202026-07-20
sha256:31f173a2a…
2026.07.18rev 152026-07-18
sha256:d5812e65b…
2026.07.18rev 142026-07-18
sha256:dd3ed99e6…
2026.07.04rev 12026-07-04
sha256:be5e2113e…

Full contract (as served)

GET /v1/catalog/workflows/generate-clip-art-asset-v2
{
  "_comment": "SYNCED SNAPSHOT — do not hand-edit. Regenerate with: node scripts/sync-workflow-catalog.mjs (pulls api.esy.com GET /v1/catalog/workflows/{id}).",
  "generatedAt": "2026-10-15T19:08:22.554926Z",
  "id": "generate-clip-art-asset-v2",
  "name": "Generate Clip Art (v2)",
  "description": "Generate a catalog-ready clip-art asset: styled render, optional background removal (variant selectable via the backgroundRemover role), and classifier-produced catalog metadata — one audited run per asset. Successor to generate-clip-art-asset.",
  "shortDescription": "Catalog-ready clip-art asset with classification.",
  "artifactClass": "visual",
  "outputType": "visual",
  "status": "active",
  "supersededById": null,
  "version": "2026.09.19",
  "stages": [
    {
      "name": "Render",
      "description": "Compose the styled prompt and call the image model.",
      "stepCount": 1
    },
    {
      "name": "Post-process",
      "description": "Remove the background when transparency is requested, refine the cutout edge, then audit the result.",
      "stepCount": 3
    },
    {
      "name": "Classify",
      "description": "Produce catalog metadata (title/slug/description/category/tags).",
      "stepCount": 1
    }
  ],
  "intakeSchema": {
    "fields": [
      {
        "name": "prompt",
        "type": "string",
        "required": true,
        "description": "Subject prompt for the isolated object or character. Do NOT include background/transparency wording — transparency is the backgroundRemovalEnabled flag's job, and transparency prose makes raster models draw the checkerboard (issue #213); such phrases are scrubbed"
      },
      {
        "name": "style",
        "type": "enum",
        "required": true,
        "description": "Clip-art style",
        "default": "flat",
        "options": [
          "flat",
          "minimal",
          "outline",
          "black-and-white",
          "cartoon",
          "mascot",
          "sticker",
          "emoji",
          "vintage",
          "watercolor",
          "storybook",
          "isometric",
          "clay",
          "chibi",
          "pixel",
          "kawaii",
          "3d",
          "doodle",
          "line-art",
          "paper-art",
          "retro",
          "botanical",
          "geometric",
          "stained-glass"
        ]
      },
      {
        "name": "aspectRatio",
        "type": "enum",
        "required": true,
        "description": "Aspect ratio",
        "default": "1:1",
        "options": [
          "1:1",
          "3:4",
          "4:3",
          "3:2",
          "2:3",
          "16:9",
          "9:16"
        ]
      },
      {
        "name": "size",
        "type": "string",
        "required": false,
        "default": "",
        "description": "Exact WIDTHxHEIGHT for this render, e.g. '2560x1440'. Empty (the default) means aspectRatio decides. Both edges must be multiples of 16, neither over 3840, the ratio between 1:3 and 3:1, and the total pixels between 655,360 and 8,294,400. Above 2560x1440 the provider calls results experimental — allowed, more variable."
      },
      {
        "name": "quality",
        "type": "enum",
        "required": false,
        "description": "Render quality tier",
        "default": "low",
        "options": [
          "low",
          "medium",
          "high",
          "xhigh",
          "max"
        ]
      },
      {
        "name": "transparencyMode",
        "type": "enum",
        "required": false,
        "description": "Which mechanism produces transparency: removal (the render wears a matte and the keyed/ML ladder cuts it) or native (the model draws the alpha itself)",
        "default": "removal",
        "options": [
          "removal",
          "native"
        ]
      },
      {
        "name": "backgroundRemovalEnabled",
        "type": "boolean",
        "required": false,
        "description": "Deliver the asset with a transparent background",
        "default": true
      },
      {
        "name": "elementType",
        "type": "enum",
        "required": false,
        "default": "",
        "description": "Pack element type; full-bleed types ('pattern', 'scene') skip background removal — compositions have no single subject to isolate",
        "options": [
          "",
          "subject",
          "pose",
          "prop",
          "border",
          "corner",
          "pattern",
          "scene"
        ]
      },
      {
        "name": "alphaAuditMode",
        "type": "enum",
        "required": false,
        "default": "enforce",
        "description": "Cutout QA after background removal: 'enforce' (default) fails bad cutouts (holes/halos/spill) so they retry through the removal ladder, 'report' records metrics only, 'off' skips the audit",
        "options": [
          "enforce",
          "report",
          "off"
        ]
      },
      {
        "name": "removalEscalationEnabled",
        "type": "boolean",
        "required": false,
        "default": true,
        "description": "On an enforced cutout-audit failure, retry the same render through stronger background-removal models (Heavy/Matting at 2K, then BRIA) before re-rendering; off fails straight to re-render"
      },
      {
        "name": "matteColor",
        "type": "string",
        "required": false,
        "default": "",
        "description": "Chroma-key backing color for the keyed render (single-primary hex, e.g. #00FF00); empty lets the engine choose"
      },
      {
        "name": "categories",
        "type": "string",
        "required": true,
        "description": "Comma-separated category slugs the classifier must choose from (empty fails the run in preflight)"
      },
      {
        "name": "textPolicy",
        "type": "enum",
        "required": false,
        "default": "",
        "options": [
          "",
          "none",
          "exact",
          "freeform"
        ],
        "description": "Per-item text contract: none = text forbidden; exact = must match expectedText; freeform = text allowed, judged on legibility/spelling only. Empty derives from textBearing (true=exact, false=freeform). Use 'none' deliberately, for assets that must carry no characters at all."
      },
      {
        "name": "textBearing",
        "type": "boolean",
        "required": false,
        "default": false,
        "description": "True when the asset must carry legible text (the OCR gate then checks it)"
      },
      {
        "name": "expectedText",
        "type": "string",
        "required": false,
        "default": "",
        "description": "The EXACT text the asset must carry; leave empty unless textPolicy is 'exact'"
      }
    ]
  },
  "runtimeSteps": [
    {
      "id": "step-1",
      "name": "Render image",
      "kind": "image",
      "role": "imageGenerator",
      "promptTemplate": "redacted"
    },
    {
      "id": "step-2",
      "name": "Remove background",
      "kind": "tool",
      "role": "backgroundRemover",
      "inputPath": "step-1.url"
    },
    {
      "id": "step-2a",
      "name": "Refine edges",
      "kind": "tool",
      "inputPath": "step-2.url"
    },
    {
      "id": "step-2b",
      "name": "Audit cutout",
      "kind": "tool",
      "inputPath": "step-2a.url"
    },
    {
      "id": "step-3",
      "name": "Classify asset",
      "kind": "llm",
      "capability": "text",
      "role": "classifier",
      "jsonSchema": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "Catalog-ready title, <= 60 chars"
          },
          "slug": {
            "type": "string",
            "description": "kebab-case URL slug"
          },
          "description": {
            "type": "string",
            "description": "1-2 sentence SEO-friendly description"
          },
          "category": {
            "type": "string",
            "description": "Exactly one of the provided category slugs"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "3-8 search tags"
          }
        },
        "required": [
          "title",
          "slug",
          "description",
          "category"
        ],
        "additionalProperties": false
      },
      "system": "redacted",
      "promptTemplate": "redacted",
      "maxTokens": "redacted"
    },
    {
      "id": "step-4",
      "name": "Text gate",
      "kind": "llm",
      "capability": "text",
      "role": "textGate",
      "requireTrue": "pass",
      "failMessage": "OCR text gate rejected the render",
      "jsonSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "foundText": {
            "type": "string",
            "description": "All legible text read from the image; empty if none"
          },
          "pass": {
            "type": "boolean"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "foundText",
          "pass",
          "reason"
        ]
      },
      "system": "redacted",
      "promptTemplate": "redacted",
      "maxTokens": "redacted"
    }
  ],
  "gates": [
    {
      "id": "gate-render",
      "name": "Provider execution",
      "type": "quality",
      "inputs": [
        "intake"
      ],
      "outputs": [
        "raw-image"
      ],
      "unlocks": [
        "step-2"
      ]
    },
    {
      "id": "gate-bg",
      "name": "Background removal",
      "type": "quality",
      "inputs": [
        "raw-image"
      ],
      "outputs": [
        "processed-image"
      ],
      "unlocks": [
        "step-3"
      ]
    },
    {
      "id": "gate-alpha",
      "name": "Cutout alpha audit",
      "type": "quality",
      "inputs": [
        "processed-image"
      ],
      "outputs": [
        "audited-image"
      ]
    },
    {
      "id": "gate-text",
      "name": "Text gate",
      "type": "quality",
      "inputs": [
        "processed-image"
      ],
      "outputs": [
        "verified-image"
      ]
    }
  ],
  "artifactSchema": {
    "artifactClass": "visual",
    "artifactType": "clip-art",
    "files": [
      "image/webp"
    ],
    "metadata": {
      "style": "string",
      "aspectRatio": "enum [1:1, 3:4, 4:3]",
      "quality": "enum [low, medium, high]",
      "backgroundRemoved": "boolean",
      "classification": "object"
    }
  },
  "providers": {
    "imageGenerator": "redacted",
    "backgroundRemover": "redacted",
    "classifier": "redacted",
    "textGate": "redacted"
  },
  "budgetPolicy": "redacted",
  "versions": [
    {
      "version": "2026.07.04",
      "revision": 1,
      "contentHash": "sha256:be5e2113e3739c90b9ebbb8adefe3a3d6a69a2ffa8f7d599d35fd0c0ee489105",
      "createdAt": "2026-07-04T21:49:03.075001Z"
    },
    {
      "version": "2026.07.18",
      "revision": 14,
      "contentHash": "sha256:dd3ed99e6e2dd182361c7edfc22c930b370b85adf3452d1962111e40b85ce9c1",
      "createdAt": "2026-07-18T19:19:05.110094Z"
    },
    {
      "version": "2026.07.18",
      "revision": 15,
      "contentHash": "sha256:d5812e65b973ff63201e8520097d1aeed414f803d6aa8060e034d78ab6ed742b",
      "createdAt": "2026-07-18T19:45:10.346245Z"
    },
    {
      "version": "2026.07.18",
      "revision": 20,
      "contentHash": "sha256:31f173a2a1db243a3a8a694a4b566b1c4aaf38e571e6c7a668dd73ccfa3bf3d9",
      "createdAt": "2026-07-20T20:32:04.210893Z"
    },
    {
      "version": "2026.07.18",
      "revision": 21,
      "contentHash": "sha256:6e47308733ec5e9f1b5c9695eba52c51e1e8cb24f3c7b60840e3fdadc8ec8df4",
      "createdAt": "2026-07-20T21:59:24.931304Z"
    },
    {
      "version": "2026.07.24",
      "revision": 26,
      "contentHash": "sha256:ae4da68c6f1ef72f5259c587811d534c431605b1f580876feb6656263937cdc5",
      "createdAt": "2026-07-26T00:51:03.156140Z"
    },
    {
      "version": "2026.07.29.1",
      "revision": 27,
      "contentHash": "sha256:b767729f3f3b7179074af29d3fd8df9fbed5dff6a253fbf9ace5eb867cbb7d84",
      "createdAt": "2026-07-29T14:44:36.347900Z"
    },
    {
      "version": "2026.07.29.2",
      "revision": 28,
      "contentHash": "sha256:75b65a46508b72d81bb04822042f5ba63ea9be5f28d6f42c646ab651d3e098f5",
      "createdAt": "2026-07-29T18:03:01.887403Z"
    },
    {
      "version": "2026.07.29.3",
      "revision": 32,
      "contentHash": "sha256:364b5ea7cb17f63f33206be0001d34da7b9d23ab21139776b981f39ba226656c",
      "createdAt": "2026-07-29T23:31:43.076942Z"
    },
    {
      "version": "2026.07.29.4",
      "revision": 33,
      "contentHash": "sha256:db7f46d50616ec7bc506b8a8467caa9153161365362e9b14d568171f8897fdb8",
      "createdAt": "2026-07-30T00:05:51.254245Z"
    },
    {
      "version": "2026.07.30",
      "revision": 36,
      "contentHash": "sha256:51adc24978e77e51da174af284bc55718ae4744fa71e571e82662424f9d56b9f",
      "createdAt": "2026-07-30T21:21:43.002491Z"
    },
    {
      "version": "2026.07.31",
      "revision": 37,
      "contentHash": "sha256:431138b0ce9479c08d4f7ffbaa040651c854fc580b93ccaad514066656507a99",
      "createdAt": "2026-07-31T17:44:49.683929Z"
    },
    {
      "version": "2026.07.31.2",
      "revision": 39,
      "contentHash": "sha256:c1aa8f49908b8a3a906c0b550c84681f3a6d8ebee1641eba3f11d88c8a90dc61",
      "createdAt": "2026-07-31T23:05:48.582477Z"
    },
    {
      "version": "2026.07.31.2",
      "revision": 52,
      "contentHash": "sha256:2fabc4ab754af1a88a09ab0808d54c616d91e6dffbf0305a8de2bb5a8cfd7695",
      "createdAt": "2026-08-06T22:08:47.312726Z"
    },
    {
      "version": "2026.07.31.2",
      "revision": 53,
      "contentHash": "sha256:42578c51d5e1df3aab3c681d810b6d8817b41ba0112f7849e3b841e2d4c36553",
      "createdAt": "2026-08-06T22:47:27.001404Z"
    },
    {
      "version": "2026.07.31.2",
      "revision": 76,
      "contentHash": "sha256:d2dace3b70de91a8ea68993b10a58ff37f372bb16ef9ee0d14830e2d0289a4aa",
      "createdAt": "2026-09-06T00:04:40.475967Z"
    },
    {
      "version": "2026.09.08",
      "revision": 78,
      "contentHash": "sha256:659f417a8a1ed54e330d5dacd8685d795a0887857a2d4281441d87b315f3069b",
      "createdAt": "2026-09-08T07:26:39.194933Z"
    },
    {
      "version": "2026.09.10",
      "revision": 80,
      "contentHash": "sha256:42282222cd574104655e77de883d5267b9e1d3d711d15505c3804c1966aad3d2",
      "createdAt": "2026-09-09T22:42:06.634795Z"
    },
    {
      "version": "2026.09.10.1",
      "revision": 82,
      "contentHash": "sha256:a636a634ea952b0af201085e6518133a46dce3446a3f2132c22219f0ece61271",
      "createdAt": "2026-09-11T00:18:59.291244Z"
    },
    {
      "version": "2026.09.10",
      "revision": 85,
      "contentHash": "sha256:42282222cd574104655e77de883d5267b9e1d3d711d15505c3804c1966aad3d2",
      "createdAt": "2026-09-12T23:37:42.823409Z"
    },
    {
      "version": "2026.09.10.1",
      "revision": 86,
      "contentHash": "sha256:a636a634ea952b0af201085e6518133a46dce3446a3f2132c22219f0ece61271",
      "createdAt": "2026-09-12T23:42:40.662729Z"
    },
    {
      "version": "2026.09.19",
      "revision": 88,
      "contentHash": "sha256:0c90dec78fa4a97efec090d0355cc625b8dc555b377d384a5a80d6b95e795e37",
      "createdAt": "2026-09-20T02:38:59.221591Z"
    },
    {
      "version": "2026.09.19",
      "revision": 90,
      "contentHash": "sha256:6a4a37b8f3a9dcc078b3dd56e0d9a0e410ec6ce3227d56d77df43973d187bff7",
      "createdAt": "2026-09-27T19:00:48.448079Z"
    }
  ],
  "updatedAt": "2026-10-11T21:08:59.994061Z"
}

Snapshot generated 2026-10-15 from the live registry.

That’s Mason