Image models have no "memory"; every image is drawn from scratch. This skill uses reference pack + lock block + drift scoring — three things that turn "looks similar" into "checkable." The other 10 asset skills all call it first.
Belongs to brand-ip-kit-skills · Draft with Flare, fix drift with Sunburst
Required inputs
brand/ip-card.md(if none, runip-character-sheet)brand/ref/ip-sheet.pngcharacter sheet first; optional: 2–3 approved final images- Images to produce this time: quantity, scene, action
Steps
- Build the reference pack(max 3 images, fewer is cleaner): character sheet (required) + one approved final image closest to this action + (if there are props) prop reference. Don't stuff in 5 images with different styles — the model will average them.
- Generate the lock block: distill 5–7 "immutable" traits from the identity card, write them into the LOCK template below, and paste itverbatimat the start of every prompt.
- Write variable and immutable items separately: variable = action, expression, clothing/props, scene, camera; immutable = LOCK. Change only 1–2 variable items at a time.
- Generate in small batches: produce 2 Flare images per scene first, pick the closest one.
- Drift scoring(each item 0/1, max 7): silhouette hook, head-to-body ratio, eye style, main color, outline, fixed accessories, pattern placement. ≥6 passes; 4–5 goes to repair; ≤3 redraw.
- Repair: use Sunburst for local edits, naming only the problem areas ("change the leaf bud back to two leaves, color #6BAA4B, don't touch anything else").
- Add to library: put passing images into
brand/ref/approved/, they can serve as a second reference later.
Lock block template (LOCK)
Use image 1 as the ONLY identity reference for "{IP name}". Keep exactly:
- silhouette & hook: {e.g. mandarin-shaped round head with a two-leaf green sprout}
- proportions: {2.5} heads tall, {chubby round body, short legs}
- face: {big glossy dark eyes with one highlight, tiny mouth, pink blush}
- colours: body {#F28C28}, belly/paws {#FFE9C7}, accent {#6BAA4B}, outline {#3B2A20}
- markings & accessories: {3 forehead stripes, cream tail tip; no clothes unless stated}
- rendering: {flat colour, soft cel shading, thick even outline}
Only the pose, expression, props and background below may change.
Scene prompt template
{LOCK}
Scene: {IP name} {action} in {place}, {time/light}. Expression: {expression}. Props: {props}.
Camera: {full body / medium / close-up}, {eye-level / low angle}. Background {detail level} so the character stays dominant.
Aspect {ratio}. {No text | Text exactly: "..."}
Consistency test grid (recommended to run once on first use)
{LOCK}
A 2x2 grid of the SAME character in four situations: (1) {s1} (2) {s2} (3) {s3} (4) {s4}.
Identical head shape, markings, colours and proportions in all panels; only pose, props and background change. Thin white gutters.
Use python scripts/slice_grid.py grid.png --rows 2 --cols 2 --out out/tiles/ to split and score separately.
QC checklist
- Drift score ≥ 6/7
- Place images from the same batch side by side; colors and brightness are consistent (none leaning pink/yellow)
- Clothing/props don't cover the memory hooks
- Outline thickness looks consistent when camera distance changes
Common failures & fixes
| Symptom | Cause | Fix |
|---|---|---|
| The more you edit, the less it looks like it | Multiple rounds of edits on the previous final image accumulate error | Always go back to the character sheet for reference each time, instead of using the previous image |
| Changing art style turns it into another character | Style words overpower identity | Put LOCK first; for style words write only "lighting/material", not "in the style of" |
| Features get swapped when multiple characters share the frame | Feature descriptions aren't bound to specific characters | Give each character its own LOCK, bind positions with "the cat (left) / the rabbit (right)" |
| Body gets thinner after putting on clothes | Clothing words bring in human body proportions | Write "outfit sized for a {2.5}-head chubby body" |
| In the same session the model edits "the most recent image" instead of the one you meant | References get mixed up in multi-image sessions | One image per session, or in the API pass only the one you need |
Rendering method · How to render
| Route | Condition | Method |
|---|---|---|
| ① Built-in tool | The agent has built-in image generation (Codex imagegen, ChatGPT, etc.) | Call it directly, using the reference images in brand/ref/ as input images |
| ② API Key | Set GPTIMAGE_API_KEY, optional GPTIMAGE_BASE_URL(any OpenAI-compatible gateway; if you don't have an official key you can use https://tryallapi.com/v1) |
python scripts/generate.py --model flare --image brand/ref/ip-sheet.png --size 1024x1024 --prompt-file p.txt --out out/x.png |
| ③ Neither | — | Output the final prompt + the list of reference images to upload, and let the user paste it into any image generation tool that supports reference images |
Model routing: defaults to GPT Image 2.5 Flare(gpt-image-2.5-flare, fast, suitable for drafts and scenes); when the image contains text labels/Chinese titles that must be correct word for word, or when doing a "change only one spot" local edit, switch to Sunburst(gpt-image-2.5-sunburst). The prompt itself is model-agnostic: it also works with Gemini / Seedream / Midjourney, etc., but for models with weak text rendering, leave the text blank and do the typography in post.