How jagged is a model?

In short

Some models are great at doing hard things but poor at doing things that most models find easy, they are the most jagged.

The gap between a model's best and worst task measures how hard the tasks are, which is not jaggedness. I was wondering what metric we could use for jaggedness, here is one that shows how uneven the model is between tasks.

First, the share of models that fail an evaluation is difficulty. Now if you sort every check from the one most models pass to the one most fail, and a smooth model passes a block on the left and fails the rest. The jaggedness metric J counts how often a model breaks that order from easy to hard tasks.

what a break is
smooth0 breaks in 9 pairs, J = 0jaggedbreak1 break in 9 pairs, J = 0.11easiest checkhardest
Dark is passed. A break is a pair where the model failed the easier check and passed the harder one. The jagged model passed one and failed the other in nine pairs, and one of them is a break.

Take every pair of checks where i is easier than j, with p the share of its runs that passed each:

J =Σ (1 − pi) pjΣ [ (1 − pi) pj + pi (1 − pj) ]

The top is failing the easier check and passing the harder one. The bottom is every pair where it passed one check and failed the other, either way round. So 0 is a perfect staircase the model passes easy tasks and fails difficult ones and 0.5 is a model which fails disregarding how difficult the task is.

every check, easiest first
modelVenn: seven regions, three namesFour tables, three drinks: says it cannot be doneBean cosy: a real chartAeroPress: one assembly axisEspresso Rag: left hand crossesEspresso Rag: right hand keeps goingHopper: model.xml writtenHopper: fifty two-part beansHopper: gravity downVerdict, flipped: finds the flipVerdict, flipped: invents nothingPortafilter: two assembly axesBean cosy: stitches wider than tallFrench press: labels matchFrench press: one assembly axisStirring spoon: handle stays on the bowlV60: parts fitHopper: beans start inside a hollow hopperKnitting repair: repairedVenn repair: repairedVenn: every drink in its regionEspresso Rag: stems apartPortafilter: stack orderAeroPress: stack orderVerdict, good press: invents nothingPortafilter: parts fitStirring spoon: the spoon does the stirringGrinder: parts fitV60: stack orderBean cosy: bean knits trueHopper: held, then flowsCafé table: spoon reads as a spoonPortafilter: all five partsCafé table: croissant reads as a croissantFrench press: filter fits the glassStirring spoon: reads as inside the cupAeroPress: all five partsFive circles: names a fix that worksPump noise: music keptFrench press: all seven partsPruned shrub: flat side from the rulesGrinder: all eight partsSpoon repair: in the drinkVenn: no label on an edgePruned shrub: sensible sizeEspresso Rag: crossing markedAeroPress: parts fitPruned shrub: reads as a shrubGrinder: stack orderPump noise: hum downPump noise: rush downFrench press: stack orderpassedJ, 90% rangep
Pareto 26.9
100%-
GPT-6.1 Sol
88%0.41 0.36 to 0.490.56
Claude Sonnet 5.5
80%0.45 0.31 to 0.580.64
Opus 5.5
80%0.39 0.30 to 0.480.35
DeepSeek 4.1 Flash
74%0.52 0.41 to 0.640.85
Pareto 26.10 Preview
70%0.46 0.35 to 0.580.62
Kimi K3.1 Pro
68%0.15 0.11 to 0.19<0.01
GPT-6 Luna
61%0.38 0.28 to 0.480.12
GLM 5.3 FlashX
60%0.35 0.29 to 0.420.10
Claude Haiku 5.5
55%0.30 0.24 to 0.360.01
Command A+
24%0.39 0.26 to 0.500.59
Perceptron Mk1.5
9%-
all models
98
96
95
93
92
92
92
92
92
90
90
86
86
85
84
83
83
83
78
78
76
75
74
70
70
69
67
67
67
67
67
63
62
58
58
56
53
53
53
53
52
50
44
42
42
42
40
39
33
33
33
31
average pass rate, %

Darker is passed more often. Checks run from the one most models pass to the one most fail, which the bottom row shows as each check's pass rate averaged over every model. Blank is a task the model has not run, and passed is the model's own average over its checks. J is how often, when the model passed one check and failed another, the one it failed was the easier: 0 is a perfect staircase and 0.5 ignores difficulty. The range is the middle 90% of J when its runs are redrawn. p is how often shuffling which checks it passed lands J as far from 0.5, so a small p means the order is not luck. Two checks equally hard count for neither side. A dash is a model that passed or failed only one check, where J cannot tell. Hover a J for the pair that breaks the order most. It counts every run so far, so it changes after the date of the post it sits in.

The p column says whether a J could be luck: shuffle which checks a model passed and see how often J lands as far from 0.5. So far only GLM 5.3 FlashX is clearly off 0.5, and it is smooth, so the board cannot yet call any model jagged.

Some models are great at doing hard things but poor at doing things that most models find easy.

SVG: exploded French press, by gpt-6-luna
GPT-6 Luna. The stack order is right, which most models get wrong, but the filter is too narrow for the glass.$0.01SVGPNGpress.svg
Blender: café table from primitives, by deepseek-v4.1-flash
DeepSeek 4.1 Flash. The croissant passes, which a third of models fail, and the spoon fails, which no other model did.$0.02MP4GLBscene.py

Perceptron Mk1.5 gets a dash: it passes only the easiest check, and one pass only says where that check sits on the ladder. So J needs a model to pass and fail at least two checks each, which is where the metric stops working for very weak models.

SVG: exploded French press, by perceptron-mk1.5
Perceptron Mk1.5, French press, run 1. All five checks fail.$0.06SVGPNGpress.svg

The script is scripts/staircase.py in the evidence repo.

By email

Older, 2 Oct

Four tasks got too easy including the new Penrose cafe floor task!

Newer, 5 Oct

Can models follow a musical instruction?