Open specification · v1.3
Every rule below changed a measured score. Each one is stated with the failure that produced it, because a rule without its failure case is just an opinion about prompting.
Apply these by hand if you like — no tool required. The most valuable rule on this page costs nothing: an identity marker you cannot answer with yes or no is not an identity marker.
A JSON schema for characters is easy and almost worthless. The difficulty is not where the fields go; it is that most of what people naturally write about a character has no effect on a generative model.
"Elegant bearing", "an air of mystery", "futuristic" — these produce different images every time because they have no verifiable content. Meanwhile "a 2 cm pale scar above the outer end of the left eyebrow" survives lighting changes, scene changes and platform changes, because there is nothing to interpret.
So the specification is a set of rules about what to write. The file format is the trivial part.
| Layer | Holds | Fails as |
|---|---|---|
| Silhouette | Build, age range, ethnicity, hair length and shape | Gender and ethnicity drift between images |
| Structure | Face or body geometry that never changes | A similar-looking but different person |
| Surface | Fixed garment, materials, palette | The scene replaces the clothing |
| Markers | Two to four things nobody else has | Nothing to verify identity against |
Silhouette is the one most often skipped and the one that causes the worst failures. In a run where it was left blank, one of five reference images came back as a different ethnicity — the model had nothing to hold on to.
Rules 1–6
Models follow enumerated constraints far more reliably than continuous description. Same content, different structure, different outcome.
✗ RIN, 25-year-old East Asian woman, asymmetric bob, hair #1C1A1F, 2cm scar above outer left eyebrow, amber irises, crimson high-collar jacket. Keep her identity consistent with the references. ✓ MANDATORY IDENTITY MARKERS, all must be visible and unchanged: 1. SCAR: a 2cm thin pale scar above the outer end of her LEFT eyebrow… 2. EYES: amber irises (#A8763E), distinctly lighter than typical… 3. HAIR: asymmetric bob, left side reaching the jawline…
Describing a feature is not the same as requiring it. The scar above disappeared entirely in a stage-lighting scene until the instruction said it must not.
1. SCAR: … This must be clearly visible in every image, never omitted, never covered by hair.
The most common failure of all. Ask for "performing on stage" and the model dresses the character for a stage, discarding the garment that identifies them. A generic "don't change the clothes" does not work — the negative list has to name the substitutes it expects.
4. GARMENT: a crimson (#C8102E) jacket with a STANDING HIGH COLLAR. This exact garment must be worn in every scene regardless of the setting. Do not substitute a stage outfit, sportswear, a hoodie, or any other clothing.
Recency weighting is real. Put the scene at the top and the identity constraints at the bottom, and close with an explicit statement of priority.
SCENE: {scene}
CHARACTER LOCK — the person in this image must be {name}, exactly as
shown in the attached reference images.
{numbered markers}
FORBIDDEN: {negative list}
The scene may change. {name} must not.
#1C1A1F holds. "Almost black with a blue cast" resolves to pure black
or to navy, differently each time.
Good: a 2 cm scar above the outer left eyebrow; nine tentacles of
unequal length; a brass ring at the tip of each tentacle.
Not markers: a cold demeanour; elegant posture; futuristic.
This is the single test that decides whether a specification will work. If two people could disagree about whether the image contains it, it is not a marker.
Rule 7
The only rule so far that moved a score from failing to passing on its own.
| Anchor version | Face score (threshold 0.363) |
|---|---|
| v1 — appearance only | 0.334 ✗ |
| v2 — structure + specific negative list | 0.394 ✓ |
Only the text changed; input image, model, duration, aspect ratio, resolution and scene text were all held fixed.
The failure. v1 said "matte black high-collar technical jacket with a single asymmetric cyan seam". The model kept the colour and decoration — black, high collar, cyan seam — and lost the structure: the open-front jacket became a pullover, the zip vanished, the stiff standing collar became a soft rolled neck.
1. A matte black technical JACKET that OPENS DOWN THE FRONT with a full-length front zip. This is an open-front jacket, NEVER a pullover, NEVER a sweater, NEVER a hoodie, NEVER a turtleneck. 2. The collar is a STIFF STANDING collar that holds its shape, NEVER a soft rolled neck, NEVER a crew neck.
Two points. Describe how it is constructed — opens at the front, has a zip, holds its shape — rather than how it looks; models hold colour easily and structure poorly. And name the structural substitutes explicitly, because the thing to defend against is not only "replaced by the scene" but "replaced by something the same colour with a different construction".
One more line draws the boundary between what may vary and what may not:
Stage lighting may change the colour of the light, but must not change the garment's cut, structure or fastening.
Rule 8
| Anchor version | Mean | Frames passing | Worst frame |
|---|---|---|---|
| v1 baseline | 0.334 ✗ | 2/8 | 0.212 |
| v2 + garment structure | 0.394 ✓ | 7/8 | 0.295 |
| v3 + pose constraint | 0.424 ✓ | 7/8 | 0.346 |
The worst frame rising from 0.212 to 0.346 matters more than the mean. It means the whole clip became usable, rather than a few good frames pulling an average up.
Diagnosing it correctly took two wrong guesses first. The low frames looked like decay over time, then like insufficient light. Frame-by-frame comparison killed both: brightness had no correlation with score — the worst frame was the brightest — and the garment and markers were intact in every frame. The actual cause was head pose. When the character tilted back to look at the ceiling, the score fell from 0.487 to 0.295. The reference set is all level, forward-facing; a steeply upturned face is simply far away in embedding space.
POSE — he nods and sways with the beat and may glance down at the controller, but his head stays roughly level and mostly toward the camera. He never tips his head far back, never looks up at the ceiling, and his face is never turned more than 45 degrees away from the lens.
Three points. Describe the permitted movement first, then the prohibitions — a list of prohibitions alone produces a stiff performance. Use a verifiable quantity (45 degrees) rather than an adjective. And diagnose frame by frame: acting on either of the first two guesses would have cost money and fixed nothing.
Generalisation check. The same anchor was run in a scene with the opposite lighting conditions — bright daylight and hard shadows instead of a dark room with coloured sweeps. Mean 0.414 versus 0.424, worst frame 0.352 versus 0.346. A gap of 0.010: the rules are not accommodating one particular scene.
But the pose wording must be scene-independent. The first version said "may glance down at the controller", which tied it to one setting. A rule that mentions objects only present in one scene has to be rewritten for the next one, and is therefore not a rule.
Rules 9–10
Images generated with an earlier image as reference cannot be pooled with text-only generations when computing the consistency ceiling. The ceiling is supposed to measure how clearly the specification defines the character; once images are conditioned on each other it measures how well image-conditioning works, which is a different question. Mixed together, every rule change looks effective because the images are doing the work.
If you do chain images, use a star topology — condition everything on one chosen anchor image, never a chain, which accumulates drift.
Generating several candidates under different anchor variants and picking one produces a paired comparison under identical conditions — far stronger than assigning variants at random across separate runs. Two conditions make it valid: allocate variants evenly and then shuffle within the batch, so variant and position are not bound together; and record the position, because people prefer the first option and that bias has to be measurable rather than assumed absent.
Keep the rejected candidates. They were paid for, and negative examples are exactly what rule development lacks.
Reference set
The reference set is produced from the written specification, not collected first and described afterwards. That ordering matters: a set collected first will contain a hundred incidental facts that nobody wrote down, and those are exactly the ones that drift.
Five views for a human figure — front, three-quarter, full profile, back of head, extreme close-up. For non-human subjects the axis changes to angle, structural detail, posture and lighting; the pipeline does not.
Full-body views are kept as a separate set, not mixed in. Mixing framings inflates the spread of the reference set, which raises the ceiling and makes every normalised score look better than it is.
Boundaries