generate-clip-art-asset-v2

activev2026.07.31.2

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
promptstringrequiredSubject 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-whitecartoonmascotstickeremojivintagewatercolorstorybookisometricclaychibipixelkawaii3ddoodle
required"flat"Clip-art style
aspectRatioenum
1:13:44:3
required"1:1"Aspect ratio
qualityenum
lowmediumhigh
optional"low"Render quality tier
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
categoriesstringrequiredComma-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.07.31.2rev 53current2026-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-08-20T16:48:44.771196Z",
  "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.07.31.2",
  "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"
        ]
      },
      {
        "name": "aspectRatio",
        "type": "enum",
        "required": true,
        "description": "Aspect ratio",
        "default": "1:1",
        "options": [
          "1:1",
          "3:4",
          "4:3"
        ]
      },
      {
        "name": "quality",
        "type": "enum",
        "required": false,
        "description": "Render quality tier",
        "default": "low",
        "options": [
          "low",
          "medium",
          "high"
        ]
      },
      {
        "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"
    }
  ],
  "updatedAt": "2026-08-14T06:05:02.506875Z"
}

Snapshot generated 2026-08-20 from the live registry.