Back to Methodology

Judge dataset

What the consistency judge was trained and tested on, and how "same character" was decided. Every number names the file it comes from.

What is in it

A pair is one reference picture of a character and one book page. Its label says whether the page shows that same character. The registered dataset holds 899 pairs from 42 generated books. Synthetic stories were written by the researchers for this purpose. Donated stories were written by children, and they are used for the test only.

Pairs in each split
SplitStories fromStoriesCharactersPairsSameDifferent
TrainSynthetic2444484327157
ValidationSynthetic61186824
Held-out testDonated122432928247
All4279899691208
  • No story or character is in more than one split, so the judge is tested on characters it never saw.
  • Of the train split's Different pairs, 104 are constructed: one character's reference set against another character's page. The other 795 pairs came out of the pipeline.
  • Two of those constructed pairs reuse an image pair the raters had labelled Same, so the training file holds those two image pairs with both answers. The dataset is registered and was left as it is.
  • The judge trains on synthetic stories and is tested on children's. A gap between the two shows up in the test result.
  • A separate exploratory freeze excluded 16 disputed synthetic training pairs, leaving 468. The completed three-seed training used the registered freeze and kept all 484 pairs.
  • Three donated candidate stories were excluded after pipeline failures. They were test candidates, never training stories.

Human and non-human pairs

Character kind follows the intake-declared non-human roster matched to each generated character's name. These counts cover the generated characters and all pairs, including constructed ones. They differ from a page audit, where a page can contain both human and non-human characters.

Human and non-human training and validation pairs
SplitHuman charactersNon-human charactersHuman pairsNon-human pairs
Train1925220264
Validation927511

Source: docs/capstone/research_runbook.md (opens on GitHub in a new tab), “What the registered freeze contains”

Source: docs/product/PREREGISTRATION_OBJ4.md (opens on GitHub in a new tab), §2 and §3

How a pair was labelled

  • Two group members each labelled every pipeline pair once.
  • Where their labels disagreed, the study owner settled the pair.
  • A rater saw only the two images, never the story. The judge sees the same.
  • Same when species, face, body colours and body features all match the reference.
  • Different needs a difference the rater can name from the list below. Without one, the answer is Same.
  • Clothing, art style and lighting are not identity. Each of them alone is Same.
Reasons a pair is Different
ReasonCountsDoes not countPairs
Different FaceFace shape, eye style, or facial markings belong to another individualexpression, mouth open, looking away141
Wrong Body FeatureCountable or structural parts differ: eyes, ears, tail, horns, wings, limbsa part hidden by the pose50
Character AbsentThe reference character is not on the pageother characters on the page18
Wrong Clothing/AccessoriesClothing or accessories changed, added or missinga clothing change on its own, which is Same. Tick it only when another reason already makes the pair Different12
Wrong ColorSkin, fur, hair, eye or body colour differs from the referenceclothing colour (that is Wrong Clothing)9
Wrong StyleArt style looks offan art style change on its own, which is Same. Tick it only when another reason already makes the pair Different4
Wrong SpeciesAnimal type or core silhouette differspose, angle2

A pair can carry more than one reason, so the last column adds up to more than the 208 Different pairs.

Two things to know before reading the rulebook

Its opening describes one rater labelling twice. That plan was replaced on 2026-09-23 by the two raters and owner adjudication described above. The rulebook is frozen, so its text was left as written.

Ten pairs that both raters had marked Different for clothing or style alone were reviewed with AI assistance and set to Same with the owner's approval. Nine are train pairs and one is validation. No test label changed. It is reported as a deviation.

Source: docs/specs/labelling-rulebook.md (opens on GitHub in a new tab), Steps 1 to 5

Source: docs/product/PREREGISTRATION_OBJ4.md (opens on GitHub in a new tab), §12, amendments of 2026-09-23 and 2026-09-30

Source: docs/capstone/research_runbook.md (opens on GitHub in a new tab), “What the registered freeze contains”, for the pair counts

How much the two raters agreed

Agreement is how often the two raters gave the same Same-or-Different answer. Cohen's κ corrects that for the agreement chance alone would give.

Agreement between the two raters
Pairs comparedPairsCohen's κAgreement
Held-out test (the registered number)3290.63489.7%
Held-out test, non-human characters250.00096.0%
Every labelled pair7950.65989.3%
  • The non-human κ of 0 is not "no agreement". Both raters said Same on 24 of the 25 pairs, which leaves κ nothing to measure.
  • Both raters were briefed by the owner, who also settled their disagreements. κ cannot catch a misunderstanding they shared.

Source: docs/capstone/research_runbook.md (opens on GitHub in a new tab), “Registered agreement and sensitivity analyses (2026-10-09)”

Source: docs/capstone/group-guide.md (opens on GitHub in a new tab), §5.2 and §6, for the limits

Six example pairs

These six were hand-picked to show the rules at work. They are not a random sample and say nothing about how often each case occurs. All six are synthetic pairs from the train and validation splits, shown with their final labels. Open "Frozen record" on a card to see what is stored for that pair.

No test pair is shown. The test set comes from children's donated stories, and its images are not published.

Same character
Reference
A man with brown hair in a blue polo shirt and dark blue trousers.
Book page
The same man, smiling, fixing an egg-shaped robot on a kitchen table.

The pose, the expression and the setting changed. The face, hair and build did not.

Both raters first answered Same.

Frozen record
{
  "pair_id": "033b8372e89e4c06",
  "char_id": "syn-025:c0",
  "split": "val",
  "provenance": "synthetic",
  "pair_type": "pipeline",
  "differences_observed": "Present on the page: human, brown hair, tan skin, human body with arms and legs, human face with eyes, nose, and mouth, human body, blue shirt, pants.",
  "same_character": true,
  "label": false,
  "anatomy_intact": true,
  "text_free": true,
  "failure_reasons": [],
  "ref_verdict_status": "passed"
}

Validation split · pipeline pair · pair 033b8372e89e4c06

Same character
Reference
A white tortoise with a blue shell and a cracked teacup on its back.
Book page
The same tortoise, looking sad, beside a dried-up pond.

A sad face is an expression, which does not count. Species, body colours and the teacup all match. The last card checks this same page against another tortoise's reference.

Both raters first answered Same.

Frozen record
{
  "pair_id": "14126f2a535e8682",
  "char_id": "syn-020:c0",
  "split": "train",
  "provenance": "synthetic",
  "pair_type": "pipeline",
  "differences_observed": "Present on the page: tortoise, white, blue, tortoise with a teacup shell, tortoise face, chipped teacup shell with a handle, back legs sticking out.",
  "same_character": true,
  "label": false,
  "anatomy_intact": true,
  "text_free": true,
  "failure_reasons": [],
  "ref_verdict_status": "passed"
}

Train split · pipeline pair · pair 14126f2a535e8682

Same character
Reference
A brown and white dog with long brown ears and blue eyes.
Book page
The same dog, small in the frame, barking at a man who is mopping outside a row of storage units.

Only the character in the reference is compared. The man on the page does not count, and an open mouth is an expression.

Both raters first answered Same.

Frozen record
{
  "pair_id": "4198b9cd8341bd3f",
  "char_id": "syn-022:c0",
  "split": "train",
  "provenance": "synthetic",
  "pair_type": "pipeline",
  "differences_observed": "Present on the page: dog, brown and white fur, one blue eye, one brown eye, four-legged canine, dog face with one blue eye and one brown eye, bent tail, none.",
  "same_character": true,
  "label": false,
  "anatomy_intact": true,
  "text_free": true,
  "failure_reasons": [],
  "ref_verdict_status": "passed"
}

Train split · pipeline pair · pair 4198b9cd8341bd3f

Different characterDifferent Face
Reference
A round grey creature with two small bumps on top, one ringed eye and a round snout patch.
Book page
A round grey creature with two large eyes and a small open mouth, in front of crouching soldiers and a robot.

The body is the same shape and colour, but the face is another individual's: two large eyes where the reference has one ringed eye and a snout patch.

Both raters first answered Different.

Frozen record
{
  "pair_id": "1843d7d4835a8397",
  "char_id": "syn-016:c0",
  "split": "train",
  "provenance": "synthetic",
  "pair_type": "pipeline",
  "differences_observed": "The face is that of a different individual. Expected: dust bunny, grey, round ball, smooth surface with button eye, ball-shaped, one lost button eye, none.",
  "same_character": false,
  "label": true,
  "anatomy_intact": true,
  "text_free": true,
  "failure_reasons": [
    "different_face"
  ],
  "ref_verdict_status": "failed"
}

Train split · pipeline pair · pair 1843d7d4835a8397

Different characterWrong SpeciesDifferent Face
Reference
A brown and orange bird with a long curved orange beak.
Book page
An orange creature with a cat's ears, whiskers and face and a long beak, standing by burrows in a field.

The colours and the beak carried over, but the page drew a cat's head on the body. That is another animal and another face.

Both raters first answered Different.

Frozen record
{
  "pair_id": "b865a5466cccc89f",
  "char_id": "syn-009:c0",
  "split": "train",
  "provenance": "synthetic",
  "pair_type": "pipeline",
  "differences_observed": "The character is not the species the reference shows. The face is that of a different individual. Expected: bird, brown, orange, small round bird body with long beak, bird face with large eyes and curved beak, round body, long curved beak, none.",
  "same_character": false,
  "label": true,
  "anatomy_intact": true,
  "text_free": true,
  "failure_reasons": [
    "wrong_species",
    "different_face"
  ],
  "ref_verdict_status": "failed"
}

Train split · pipeline pair · pair b865a5466cccc89f

Different characterDifferent Face
Reference
A green tortoise with a brown shell, smiling.
Book page
A white tortoise with a blue shell and a cracked teacup on its back, looking sad, beside a dried-up pond.

A constructed pair: a script set this tortoise's reference against the page of the other tortoise in the same story. The species matches and the individual does not. Every constructed pair carries this one reason and this one sentence, written by the script and not by a rater.

Not shown to the raters. A script set the label.

Frozen record
{
  "pair_id": "848c636f47f8e342",
  "char_id": "syn-020:c1",
  "split": "train",
  "provenance": "synthetic",
  "pair_type": "constructed",
  "differences_observed": "The face and build are those of a different individual; this is not the reference character.",
  "same_character": false,
  "label": true,
  "anatomy_intact": true,
  "text_free": true,
  "failure_reasons": [
    "different_face"
  ],
  "ref_verdict_status": "failed"
}

Train split · constructed pair · pair 848c636f47f8e342

What a record holds

Each pair is one row in the dataset's manifest. The cards above show that row as it is stored, without the two image file paths. The table says what each field is and who filled it in.

What each field of a record means
FieldMeaning
pair_idThe pair's id, made by the build script. It carries no meaning.
char_idThe story and the character the reference belongs to. Splits are made on it. It never reaches the training text.
splittrain, val or test. Bookkeeping, not training text.
provenancesynthetic for a story the researchers wrote, donated for a child's story.
pair_typepipeline for a page the pipeline drew for this character, which the two raters labelled. constructed for a pair a script made from two characters.
differences_observedA sentence a script builds from the ticked reasons and the character's stored attributes. No rater wrote it.
same_characterThe final answer. true means Same.
labelThe opposite of same_character. true means Different, the class the judge is scored on.
anatomy_intactfalse when a rater ticked Broken Anatomy. A constructed pair takes the default, true.
text_freefalse when a rater ticked Text Visible. A constructed pair takes the default, true.
failure_reasonsThe reasons ticked, from the fixed list of seven above.
ref_verdict_statusWhether the automatic check of the reference picture passed when the book was made. Bookkeeping, not training text.

Source: backend/finetune/manifest.py (opens on GitHub in a new tab), the comments on ManifestRecord

One training record, whole

The model is trained on a prompt and the answer it should give. Every training record uses the same prompt. This is the record for the constructed tortoise pair above.

Prompt

<image><image>The FIRST image is a canonical character reference. The SECOND image is one page of a picture book in which that character should appear drawn to match the reference.

First describe every difference you observe between the character on the page and the reference. Then say whether it is the same character; list which of the reference's attributes are actually present on the page; whether the page is drawn in the same art style as the reference; whether the character's anatomy is intact; whether the character is drawn exactly once; and whether the picture is free of any text. Finally list the failure reasons that apply, choosing only from the fixed set.

Answer the model is trained to give

{
  "differences_observed": "The face and build are those of a different individual; this is not the reference character.",
  "same_character": false,
  "attributes_present": [],
  "style_match": false,
  "anatomy_intact": true,
  "subjects_unique": true,
  "text_free": true,
  "failure_reasons": [
    "different_face"
  ]
}

Three of the answer's fields were never labelled: attributes_present, style_match and subjects_unique. They hold the same fixed value in every training record (an empty list, false and true), so they say nothing about this pair.

Source: backend/finetune/build_dataset.py (opens on GitHub in a new tab), constructed_records and render_rationale

Source: docs/capstone/research_runbook.md (opens on GitHub in a new tab), “What the registered freeze contains”, for the two contradictory pairs