Skip to content

The method, in full

How the drills measure

Every formula, every threshold, and the evidence each one was set from. Published because a tool that claims to measure something should be checkable by others, and a number that cannot be interrogated is just an opinion with a decimal point.

Generated from the engine itselfTables read from the engine

In one paragraph

What actually happens when you press Measure

Your stroke is recorded as points with timestamps, then kept in raw and resampled forms. Using the wrong version can change a measurement without causing a crash. Shapes are fitted to the version resampled to uniform arc length; speed and tremor are measured on the raw timing. Fitting the raw points would give extra weight to densely sampled, slowly drawn regions. A flat spot could then pull the fitted centre towards itself and hide the defect you want to identify.

A shape is fitted to the stroke: a circle by the Taubin method, or an ellipse by searching the rotation and solving the axes at each angle. The deviations from that fit become dimensionless numbers. The score reads them continuously; diagnostic rules read them through thresholds. Smaller errors increase the underlying score, with diminishing gains near the top. No AI model is involved.

The score

One curve, and why it is that curve

Per quantity

score = 100 / (1 + (error / e50)^1.6)

Overall

0.75 × weighted mean + 0.25 × worst single quantity

e50 is the error that scores 50, chosen separately for each quantity. The curve is smooth and monotone, so reducing an error raises its underlying score. At error = e50, its derivative with respect to the natural log of error is −25p. With p = 1.6, a 25% reduction from e50 raises that quantity’s score from 50 to about 61.3. This describes how the score curve responds to a change in error; it is not a guaranteed gain on your next attempt.

The worst-quantity term is weighted to a quarter of the total score value. This makes it harder for one very strong measurement to hide a weak one. The diagnostic rules still assess their own thresholds, so the lowest score term and the named finding need not be identical.

The maximum is 99, not 100. At very small errors, capture noise becomes significant compared with the movement being measured. A score of 100 would suggest a precision the tool does not have.

Per drill

What each drill scores

Freehand circle

Measures your line, not your drawing
QuantityMeasured valuee50Weight
Roundnesscircle.radialRmsNorm0.0638%
Evennesscircle.worstArcDepth0.05521%
Steadinesscircle.wobbleNorm0.0317%
Closurecircle.closureNorm0.149%
Commitmenttiming.tracedNorm0.459%
One Gotiming.uncommittedNorm0.56%

Each measured error is mapped through 100 / (1 + (e/e₅₀)^1.6). The combined score is 75% the weighted average and 25% the single worst term, so a good curve cannot entirely cover a circle that never closed. The highest score is 99. Tiny differences near the top can reflect capture noise as well as your line.

Straight line between two points

Measures your line, not your drawing
QuantityMeasured valuee50Weight
Aimline.lateralError0.05525%
Straightnessline.bowAbs0.04523%
Steadinessline.wobble0.01219%
Stoppingline.stopError0.087%
Startingline.startError0.085%
Commitmenttiming.uncommittedNorm0.859%
Single Passline.retraceNorm0.26%
One Motionline.redrawCount1.66%

Placement is measured against the two target dots. Curvature and steadiness are measured from the stroke itself, so a straight line in the wrong place still loses points for placement. Errors are scaled by the distance between the target dots. That makes the units comparable across canvas sizes, though different devices can still affect your results.

Ellipse inside a plane

Measures your line, not your drawing
QuantityMeasured valuee50Weight
Degreeellipse.degreeErrorAbs1119%
Alignmentellipse.axisErrorAbs915%
Shapeellipse.unevenNorm0.0312%
Steadinessellipse.wobbleNorm0.02810%
Fillellipse.fillError0.210%
Placementellipse.centreOffsetNorm0.358%
Closureellipse.closureScoreNorm0.166%
Laps Drawnellipse.lapsShortTurns0.58%
Tempoellipse.lapTempoError0.35%
One Gotiming.uncommittedNorm0.57%

To score this, we need to first decide how squashed your ellipse is, then we map your line through the inverse of that transformation so it becomes a circle, and we score it using the roundness machinery as if it were a circle. So “one end is pinched” can actually be scored for.

Divide by eye

Measures your judgement, not your drawing
QuantityMeasured valuee50Weight
Accuracyproportion.rmsError0.07565%
Worst Markproportion.maxErrorAbs0.1135%

Errors are measured as a fraction of each bar’s length. A two-pixel miss means more on a short bar than on a long one. Placing a tick asks for less line control than drawing a whole circle, but screen size and input precision can still affect it. Paper practice gives you another way to check your estimates.

Draw the other half

Measures your half against the given one
QuantityMeasured valuee50Weight
Widthsymmetry.meanAbs0.05532%
Biassymmetry.biasAbs0.04522%
Placementsymmetry.heightShiftAbs0.0514%
Steadinesssymmetry.driftGrowth0.0613%
Closingsymmetry.endpointNorm0.059%
Inside Axissymmetry.crossDepthNorm0.110%

The score gives most weight to matching the widths and to any consistent narrow-or-wide tendency. Placement, growing drift and the joins add context. Those measures help you choose a correction without assuming you cannot see the problem yourself.

A box in perspective

Measures whether your edges agree
QuantityMeasured valuee50Weight
Convergencebox.worstRmsDeg3.632%
Parallelsbox.parallelErrorDeg48%
Agreementbox.meanRmsDeg2.811%
Depthbox.separationError0.313%
Distortionbox.crowdingError0.58%
Lineworkbox.wobbleNorm0.02210%
Cornersbox.cornerGapNorm0.066%
Drawn Throughbox.missingEdges46%
Structurebox.familyImbalanceError0.256%

In Measure it, your box is checked through relationships among its own edges, rather than copied against a reference box. Choose the perspective mode you intended and draw clear box edges. The engine accepts different proportions and views, but it cannot reliably measure every style of mark or every ambiguous construction.

A cylinder in perspective

Measures whether your ends sit on the form
QuantityMeasured valuee50Weight
Squarenesscylinder.minorAxisErrorDeg929%
Recessioncylinder.degreeShiftError0.3519%
Joinscylinder.sideJoinPxNorm0.1416%
Tapercylinder.taperError0.3512%
Lineworkcylinder.sideBowNorm0.04510%
End Shapecylinder.endShapeError0.0358%
Ends Closedcylinder.endUndrawnDeg556%

The score emphasizes alignment and recession because those are central to this exercise. End shape, closure, joins and side linework also matter to whether the cylinder reads clearly.

Every threshold, and its evidence

When a fault is named

Each rule returns a severity between 0 and 1. The severity ramps up linearly from t — where the quantity starts to matter — to full, where it is as bad as the rule needs to distinguish. The finding will only be displayed at a severity greater than 0.35, so in practice a rule begins to speak about a third of the way up its own ramp.

Severities use fixed scales rather than simply ranking the faults in one attempt. A severity of 0.8 is stronger than 0.2 on that rule’s scale. A rule below its reporting threshold need not produce a finding. Always naming the worst fault would invent a correction even when none is worth raising.

Provenance of individual values – All numbers were set using specific, measured fixtures. Sentence gives reference to specific fixture used for a given value.

Freehand circle

Lap Spreadfires from 0.035 · saturates at 0.09
two exact laps at radius gaps 0/4/8/14/20px read 0.00/0.027/0.053/0.093/0.133; clean same-radius laps read 0.00-0.01 at any jitter probed. 4px gaps stay silent-but-scored; 8px reads severity 0.36 and is named.
Flat Depthfires from 0.02 · saturates at 0.075
clean fixtures peak at 0.003 (0.003 on a phone at cssScale 2.2); a 5% wrist flattening measures 0.025 and an 11% one 0.060. 0.02 clears every clean case.
Ovalityfires from 0.045 · saturates at 0.09
clean 0.000-0.002. A 12% squash measures 0.064 and a 25% squash 0.140 — the second harmonic amplitude is (a-b)/(a+b), so 0.045 is roughly a 9% axis difference. full was 0.16, which is a circle so oval nobody needed telling; because a rule only fires at 35% of its ramp, that left a 14% oval scoring 69 with nothing named. Moved to 0.10, and landed 0.001 SHORT: a 12% oval measures 0.063 against a firing point of 0.064, so it scored 74 - under the clean floor - and the rule that knows it is an oval stayed silent by a hair. 0.09 puts the firing point at 0.061. An 8% oval measures 0.042, stays under t, and keeps its score of 84.
Wobblefires from 0.012 · saturates at 0.045
clean 0.001-0.003 on every device. 4px tremor measures 0.018, 9px measures 0.038. Ratcheting also lands here (0.010-0.017), which is why the motor group suppresses this one.
Closure Gapfires from 0.085 · saturates at 0.17
clean 0.002-0.005, phone 0.015. A 30px gap on a 150px circle measures 0.200. Threshold set above the phone case so coarse input never reads as an open circle.
Closure Overshootfires from 0.08 · saturates at 0.6
clean |0.00-0.01| rad; a deliberate 45deg overshoot measures 0.78 rad. t was 0.35 (20deg) and full was 1.2, which put the first point this rule could actually speak at 0.6475 rad = 37deg — and circle.not-closed stopped claiming the case at exactly 0.35, so 20-37deg of crossing was named by nobody: 40 of 40 readable attempts across five seeds came back clean at scores of 70-73 with the closure sub-score at 8-17, under a clean floor of 76. Now that not-closed is gated on the SIGN rather than on this magnitude, the positive side belongs entirely to this rule and its ramp starts where a crossing first becomes visible; 0.08/0.6 puts the firing point near 14deg and leaves no band. Swept over overshoots of 5/10/15/20/25/30/35/45/70deg at seeds 1,2,3,7,11.
Centre Driftfires from 0.055 · saturates at 0.14
single-pivot multi-lap fixtures 0.000; 20px drift per lap over 3 laps measures 0.281. Was 0.08/0.35, which started in the right place and then ramped so slowly that the rule could not reach the clean gate until 0.175 - and the SCORE was already at 47 by then. Swept over 4/6/9/12/15/18/24px of drift per lap: 6px measures 0.085 and scored 70 in silence, 9px measures 0.127 and scored 57 in silence, 12px measures 0.169 and scored 47 in silence. The band now reaches the gate at 0.085, which is the first point where the score crosses the engine own clean floor of 76, and 4px stays quiet at 0.057 and 81.
Radius Trendfires from 0.08 · saturates at 0.35
spiralling in or out between laps; same fixture family as centreDrift.
Micro Correctionsfires from 4 · saturates at 16
clean 0-1 across mouse 120Hz, stylus 240Hz and phone 60Hz. A 6-dip ratchet measures 6, a 12-dip ratchet 18, and 4-9px tremor 11-14.
Traced Norm Speedfires from 2.5 · saturates at 1
normSpeed is shape-lengths per second, so for a circle it is about 2*PI/duration. Committed fixtures sit at 7.3-24; a deliberately traced circle (5.2s) measures 1.22. NOTE: this threshold is inverted — lower is worse.
Cramped Radius Pxfires from 55 · saturates at 30
below roughly 55px on a 768x576 canvas the motion is finger-only regardless of device. NOTE: inverted — smaller is worse.
Hesitation Msfires from 2500 · saturates at 8000
a committed start is under ~800ms; 2.5s of hovering is a decision, not a delay.
Jerk Ratiofires from 2.6 · saturates at 5
clean 1.1-3.0 (rises with lap count); traced 3.7. Weak discriminator alone — used only as support.

Straight line

Redrawfires from 0.4 · saturates at 1.6
a reinforcing pass and a false-start stub each count exactly 1 (the count is the intake fact, not a fit); a single stroke has no metric at all, so every one-stroke fixture in the suite is a structural zero. Reinforce and false-start probes both grade 90 with the rule named; two genuinely different lines still refuse.
Kinkinessfires from 1.4 · saturates at 1.9
kinks of 10deg at t=0.5, 10deg at t=0.66 and 16deg at t=0.35 measure 1.6, 2.1 and 3.4. Bows with the same peak deviation (13, 22 and 43px) measure 1.0, 0.7 and 0.4. A 6deg kink measures 1.0 and is left to line.bow, because at that angle the claim would not be supportable. Swept across 210 ordinary lines — clean, bowed, trembling, hooked, on a phone and with 4px of jitter — the worst reading is 1.20, so the threshold clears every one of them with room to spare.
Retracefires from 0.06 · saturates at 0.35
every synthesised line — clean, bowed, trembling, ratcheting, on a phone — measures 0.000, because a stroke that only goes forwards cannot fall back. A stroke drawn to the far dot and 40% of the way back measures 0.398.
Bowfires from 0.018 · saturates at 0.075
clean fixtures under 0.004; a 20px bow on a 488px line measures 0.041 and 40px measures 0.082. 0.02 is roughly a 10px deviation — the point where it stops looking like a straight line.
Endpoint Errorfires from 0.023 · saturates at 0.12
clean 0.005-0.02 (a clean stroke still starts a few px off the dot); a 25px miss measures 0.05, 60px measures 0.12. t was 0.04, and severity has to clear the 0.35 clean gate before a rule speaks, so the first aiming finding arrived at 0.068 = 33px — leaving a band where a 30px miss scored 74 with nothing named, at five seeds out of five, under the engine's own clean floor of 76. 0.023 puts the firing point at 28px, which is where the score crosses 76. It is above the top of the clean range, so a clean stroke sits at severity 0 and a slightly-off one at 0.02 is still well under the gate. Swept over tilt and drift of 0-40px at seeds 1,4,5,9,13: no silent band, no clean line named.
Overshootfires from 0.035 · saturates at 0.15
clean ~0; running 40px past the far dot measures 0.082.
Wobblefires from 0.005 · saturates at 0.022
clean 0.001-0.003 across devices; 4px tremor measures 0.008 and 10px measures 0.020. This is the residual AFTER the intended bow is removed, so a smooth curve does not read as shake.
Ratchetfires from 3 · saturates at 12
clean 0-1 reversals; a deliberately ratcheted line produces 6-15.
Haltfires from 250 · saturates at 1200
a clean line measures 0. A single deliberate rest of 250ms scores 96 and stays quiet, 400ms scores 93 and stays quiet, 800ms scores 90 and is named. Before the commitment term was given a time form, all three scored 99 and none was named — the only thing that ever spoke was line.traced, at a stop of 1.5s, which is the wrong sentence for a line drawn quickly and stopped once.
Stopsfires from 1 · saturates at 6
every clean fixture measures 0 at 0-4px of jitter and 60/120/240Hz. A line drawn in four pushes with real halts measures 3, in six pushes 5, in eight pushes 7.
Traced Norm Speedfires from 0.6 · saturates at 0.2
a line is one shape-length, so normSpeed is about 1/duration. Committed fixtures sit at 1.5-4; a 3-second line measures 0.33. NOTE: inverted — lower is worse.

Ellipse in a plane

Lap Degree Spanfires from 1.5 · saturates at 6.5
clean 0.0-0.2 degrees. A second lap 6% rounder than the first spans 2.0, 10% spans 3.3, 20% spans 6.9 and 35% spans 12.4 — measured on paths that are analytically smooth, so the span is lap disagreement and nothing else.
Lap Tempofires from 0.72 · saturates at 0.35
clean 0.99-1.00, and a UNIFORMLY slow attempt also measures 1.00 — so this cannot double-count with ellipse.traced, which owns overall slowness. Second laps drawn at 0.8, 0.6 and 0.45 of the first read 0.80, 0.60 and 0.45, and every one of those scored 99 with nothing named. NOTE: inverted — lower is worse.
Degreefires from 5 · saturates at 14
degrees of asin(minor/major). Clean fixtures land within 2 of the target; a deliberately round ellipse (degree 45 in a 30-degree plane) measures 15. Was 6/26, which needed a 13-degree error before it would fire — an ellipse visibly too narrow for its box scored 70 and was told nothing was wrong.
Axisfires from 5 · saturates at 24
clean under 2 degrees; a 20-degree deliberate tilt measures close to 20.
Corner4fires from 0.01 · saturates at 0.045
superellipse fixtures through the same extremes: m=1.85 (barely visible) reads 0.013, m=1.7 reads 0.028, m=1.5 reads 0.051; squarish m=2.5 reads 0.032 with the opposite sign. Clean ellipses at 0.35-2px jitter read 0.0003-0.0032 and fail the phase lock as well. The metric is absent unless phase-locked AND 1.4x above the residual tremor, so t=0.01 has a 3x margin over the strongest clean reading.
Lopsidedfires from 0.012 · saturates at 0.055
sum of harmonics 3-5 of the radial error in the ellipse own unit-circle space. Orders 0-2 are absorbed by the fit itself (radius, centre, ovality) so they carry no information. Clean fixtures under 0.004; lopsided 0.18 measures ~0.018 and 0.30 measures ~0.032.
Wobblefires from 0.012 · saturates at 0.05
residual after harmonics 1-5 are removed, so a shape that is merely not-quite-an-ellipse does not read as shake. Clean under 0.003; an 8px tremor fixture measures ~0.030.
Fillfires from 0.12 · saturates at 0.45
fraction by which the fitted axes miss the plane. Clean under 0.04.
Off Targetfires from 0.14 · saturates at 0.75
a correctly shaped ellipse translated 80/160/240px off a box of mean radius 142 measures 0.56/1.13/1.88 and used to score 99 with two strengths attached. t at 0.14 is about 20px of drift on this box, which is inside the width of a confident stroke and should not be called a mistake; full at 0.75 is most of a radius, by which point the ellipse is alongside the box rather than on it.
Closurefires from 0.1 · saturates at 0.28
same family as the circle closure gap. Was only checked on a single-lap attempt, which meant a two-lap ellipse that stopped with its ends apart was named by nobody; the lap requirement now lives in ellipse.short-laps and this measures the gap wherever it happens. The floor is untouched and stays twice the noisiest clean reading — 24 exact two-lap ellipses peak at 0.0062, and 0.0498 at 3px of jitter. `full` came down from 0.34 because it left a hole above the floor: a 30px gap measures 0.181 and reached severity 0.34, missing the clean gate by 0.01 while the attempt scored 75 with nothing said about it.
Closure Overshootfires from 0.08 · saturates at 0.6
clean 0.00 rad. Sweeps of 2.05/2.15/2.30/2.60 laps against a two-lap target measure 0.31/0.94/1.88/3.77 rad, all of which scored 53-60 and were named by nobody before this existed. Shares the circle anchors: 0.08 fires near 14deg, which is where a crossing first becomes visible on a drawn-through shape.
Laps Drawnfires from 0 · saturates at 1
a full lap short of the two asked measures 1.0 and half a lap 0.5, by construction. e50 sits at half a lap: the second lap is technique rather than shape, so the ellipse you did draw is still measured honestly for degree, alignment and fill. Before this existed nothing deducted for it at all — one lap scored 99 with ellipse.short-laps named beside it, and the score ran BACKWARDS, 1.0 lap scoring 76 against 68 for 1.25.
Laps Shortfires from 2.2 · saturates at 5.5
a stroke 36deg short of two laps measures 0.63 and is a closure gap, not a missing lap; one that stopped after a single lap measures 6.28 and is a missing lap outright. t at 2.2 (126deg) and full at 5.5 (315deg) puts the boundary between them where the shape stops looking like a closed ellipse. Swept at sweeps of 1.0/1.5/1.9/2.0/2.05/2.15/2.3/2.6 laps.
Centre Driftfires from 0.08 · saturates at 0.35
shares the circle drill anchors — it is the same measurement in unit-circle space.
Micro Correctionsfires from 4 · saturates at 16
shares the circle drill anchors; the motor signature does not change with the shape.
Traced Norm Speedfires from 2.2 · saturates at 0.9
shape-lengths per second. An ellipse perimeter is shorter than its bounding circle, so the band sits slightly below the circle. NOTE: inverted - lower is worse.

Divide by eye

Hv Gapfires from 0.03 · saturates at 0.1
difference between the mean vertical error and the mean horizontal one. Clean fixtures under 0.006; a fixture with a 6% upward bias on verticals alone measures 0.060. Two bars per direction, so the threshold is set high enough that one stray mark cannot manufacture it — and proportion.one-off suppresses this finding outright.
Biasfires from 0.01 · saturates at 0.045
absolute mean signed error. Clean fixtures under 0.0005 (0.0003 on a phone at cssScale 2.2); a deliberate 3% late bias measures 0.030 and 5% measures 0.050. Set so that any attempt scoring below about 88 has something named — a score of 68 beside "nothing to correct" is the engine contradicting itself on one screen.
Spreadfires from 0.01 · saturates at 0.045
standard deviation of the signed errors, on the same ramp as bias because rms^2 = bias^2 + spread^2 exactly. That identity is what makes the pair EXHAUSTIVE: whenever the overall error is large, one of the two must be, so no real error can fall through both and leave the attempt reported as clean.
Separationfires from 4 · saturates at 10
chosen from the sweep above rather than from clean fixtures. Three bars per group is the minimum that supports the claim at all: with two per group the same sweep put 17 of 60 scattered attempts above every workable threshold, which is why the drill has six bars and not four.
Deliberation Effectfires from 0.02 · saturates at 0.07
measured on a fixture that checks three bars and hurries three: the hurried half lands 3, 4, 6 and 9% out against a checked half at 0.0%. 4% is the point where a visitor can see the difference between their own marks, and it now speaks.
Length Effectfires from 0.025 · saturates at 0.09
mean absolute error on the long bars minus the short ones. Clean fixtures within 0.004. Only the positive direction fires: worse-on-short is real but two bars cannot tell it apart from noise.
Outlierfires from 0.045 · saturates at 0.13
worst mark minus the mean of the other three. Clean under 0.006; three good marks plus one 12% miss measures 0.105. This is inattention, not a way of seeing, so it suppresses every aggregate finding it would otherwise fake.
Lapsefires from 0.025 · saturates at 0.07
worst mark, gated on the other five sitting within 2.5%. Five exact marks plus one out measures 3.3/4.8/5.8/7.3/11.8% at fixture values of 3.5/5/6/7.5/12%, and the same with a real hand under them (others within 1.5%) is unchanged. Six careless marks never reach it: the gate sees 4.0-6.9% among the rest and reads zero.
Rushed Msfires from 3600 · saturates at 1200
total time for SIX judgements — 600ms each at the threshold, 200ms at saturation. Actually comparing the two halves of a bar takes about a second; under a fifth of one is a reflex, not a judgement. NOTE: inverted — faster is worse, and it only fires alongside a real error, because fast and accurate is not a fault.

Draw the other half

Crossfires from 0.003 · saturates at 0.09
a local dip carrying the wall 3px past the axis reads 0.027 (severity 0.28, named as a secondary); 8px reads 0.072 (0.79, leads); clean halves at 0-4px of jitter read exactly 0 because the metric is absent without a genuine negative-width sample.
Gain Errorfires from 0.05 · saturates at 0.15
injected gains are recovered exactly: 0.900, 0.800, 0.740 and 1.250 come back as 0.899, 0.800, 0.740 and 1.249 with a residual of 0.000. Clean fixtures measure 0.001-0.005; the worst ordinary reading the residual gate lets through is 0.039, and that case is the DRIFT fixture — itself a fault of another kind — rather than a clean drawing. The band starts speaking near 0.085, which is a 9% scale error: visible, worth 42 points of score, and exact wherever the residual is near zero.
Offset Normfires from 0.035 · saturates at 0.1
a flat −7px on every width measures 0.063 and a flat −14px measures 0.126, both with the gain at 0.999. Clean and wobbly fixtures measure 0.000-0.003.
Gain Residualfires from 0.03 · saturates at 0.12
exact 0.000, injected gains 0.000-0.001, a 16px wobble 0.088. Used only to refuse the shape findings, so a bulge or a tremor can never be read as a scale change.
Biasfires from 0.025 · saturates at 0.075
signed mean deviation over the widest half-width. A half traced exactly measures 0.00; halves drawn deliberately 4, 8 and 12 percent narrow measure -0.040, -0.079 and -0.118. t at 0.025 is about 2px on this vase, inside the width of a confident stroke; full at 0.075 is a half nobody would call symmetrical. Full was 0.11, then 0.085, and each left a band where the backstop spoke instead: at 0.11 an 8 percent wide half went unnamed, and at 0.085 a 7 percent narrow one did. 0.075 puts the firing point at 0.043, which is where the score crosses the clean floor.
Height Shiftfires from 0.03 · saturates at 0.105
the vertical slide, as a fraction of the vase height, that best fits the drawn profile onto the given one. Gated on heightExplains below, so it only speaks when sliding genuinely removes the error rather than merely reducing it. Full was 0.12, which left a 6 percent displacement one notch under the gate and handed it to the backstop, even though the slide explained ALL of its error.
Height Explainsfires from 0.45 · saturates at 0.9
the share of the average error that a pure vertical slide removes. A drawing that is simply wrong everywhere also has a best shift and it explains almost nothing; one whose widths are right and misplaced has most of its error removed by sliding.
Driftfires from 0.035 · saturates at 0.16
slope of absolute deviation against height, top to bottom. A steady half measures under 0.01; one that starts on the given half and is 10 percent out by the foot measures about 0.10.
Endpointsfires from 0.035 · saturates at 0.14
worst of the two ends, over the vase height. 0.035 is about 14px on this canvas, which is roughly a pen width and not worth mentioning below that.

Box in perspective

Family Imbalancefires from 0.25 · saturates at 0.9
boxes built by construction measure 0 at every jitter the fixtures produce, including 8 degrees of aim error and an opaque box with only nine edges. One edge rotated 18 degrees or more off its direction migrates to another family and measures 2, which is 0.5 here.
One Cornerfires from 0.025 · saturates at 0.18
a box built by construction measures 0.000, and so does one drawn 12px short at every corner — those ends still have neighbours. Pulling the three edges of the back corner apart measures 0.083 at 30px, 0.150 at 55px and 0.220 at 110px, while the MEDIAN corner gap stays under half a pixel throughout.
Corner Gapfires from 0.022 · saturates at 0.1
a box built by construction measures 0.000 - every corner has three ends on the same point. Edges pulled back 15, 30 and 45px from their corners on a 470px diagonal measure 0.045, 0.090 and 0.135, and all three scored 99 with a compliment before this existed. t at 0.022 is about 10px on that box, which is inside the width of a confident stroke.
Convergencefires from 0.9 · saturates at 3.4
RMS disagreement, in degrees, between the edges of one family and the single vanishing point that best fits them. Swept on boxes synthesised FROM exact vanishing points, so the correct answer is known before it is measured: a perfect box with ordinary capture noise measures 0.05-0.15 deg, a box drawn with 4 deg of aim error per edge measures around 2.4, and one at 9 deg falls apart entirely. Set from a sweep across eight seeds per jitter level rather than one, because a single seed put the firing point in the middle of the run-to-run spread: boxes at 3-4 deg were scoring in the mid-70s with nothing named, which is the score-versus-diagnosis contradiction the cross-drill suite exists to catch.
Parallelfires from 1.2 · saturates at 6
RMS spread, in degrees, of a family the chosen perspective mode says should stay parallel — the uprights in one- and two-point, and the level set in one-point too. Measured against the family mean rather than a fitted point, because least squares fits a vanishing point to four edges that lean together and reports near-zero disagreement, which would score the one fault that defines two-point perspective as perfect. t sits above hand tremor on a set of four edges; full is where the uprights are visibly splaying.
Separationfires from 0 · saturates at 0.4
already zeroed in the measurer at 28 deg between two families. Real three-quarter boxes run 30-45 deg; below about 24 the two horizontal sets read as one and the form flattens, so t is 0 — any remaining value is real.
Crowdingfires from 0.05 · saturates at 0.6
how far inside 1.5 box-diagonals the nearest vanishing point has come, which is roughly 40 deg of convergence across the form. Correct three-point boxes built from distant points measure 1.8-3.5 diagonals, so the zero point sits below anything a well-made box produces.
Wobblefires from 0.007 · saturates at 0.026
mean deviation of each edge from its own straight line, over its length. Swept on synthesised boxes: a clean edge measures 0.001, a just-visible bow 0.006, an obviously bowed edge 0.015 and a badly bent one 0.036 — so t sits above hand tremor and full at the worst realistic case. Shares its scale with the straight-line drill, so a wobble reported here means what it means there.
Throughfires from 0.5 · saturates at 6
how many of the twelve edges are missing. Drawing through the box is the instruction the exercise rests on, so t of 0.5 means any missing edge registers — but full is 6, so an opaque nine-edge box is a gentle note rather than the headline.

A cylinder in perspective

End Undrawnfires from 25 · saturates at 90
gaps built at 20/30/45/60/75/90 degrees measure 10-20, 25-30, 40-45, 55-60, 65-70 and 85 — near-exact, and short only by the 5-degree bin. Every correct cylinder reads exactly 5: 240 of them across twelve hands (tilt, 1-3px jitter, degree shift, half and double length, bowed and bent sides, tilted far end) at twenty seeds each. The threshold is five times that floor. It speaks from about 48 degrees, a gap of roughly an eighth of the end, and saturates at a quarter.
End Back Flatfires from 0.03 · saturates at 0.075
the inner half shallowed by 10/20/30/45/60% measures 0.008, 0.017, 0.027, 0.043 and 0.063 — and scored 99, 99, 99, 98 and 97 with nothing named at any of them. Noise on a correct cylinder: 0.0085 at 0.5px of jitter, 0.0128 at 1px, 0.0190 at 1.5px. The threshold sits 2.3x above the 1px reading.
End Pointedfires from 0.012 · saturates at 0.06
superellipse ends with extents identical to a true ellipse: exponent 2.0 measures -0.0000, 1.7 measures 0.029, 1.5 measures 0.051 and 1.3 measures 0.079, scoring 99, 97, 94 and 89 with nothing named. Noise 0.0023 at 0.5px, 0.0039 at 1px, 0.0066 at 1.5px — a signal-to-noise of 7:1 at the mildest case.
Funnelfires from 1.34 · saturates at 2.86
every correct fixture implies 1.41 to 3.00 canvas widths of viewing distance — the default cylinder 2.16, a long one 3.00, the shortest gradeable 1.41, and a strong but legitimate recession 1.97, which read 0.71 down to 0.33 here and are all clear of the threshold. A far end 59 degrees more open than the near one implies 0.29 canvas widths and reads 3.45.
Minor Axisfires from 4 · saturates at 22
degrees the worst end is rotated off square to the axis. A cylinder built by construction measures 0.0; fixtures cocked 12 and 25 degrees measure exactly 12.0 and 25.0, so the measurement has no noise in it at all and the band is entirely about what is worth saying. 4 is roughly where the tilt becomes visible on a 200px form; by 22 the cylinder reads as bent.
Degree Shiftfires from 0.12 · saturates at 0.75
shortfall in the near-to-far degree shift, as a fraction of a 12-degree ideal. A correct fixture shifts +8.7 degrees and scores 0 here; ends drawn at the same degree shift -0.0 and score 0.17, which clears t and is named.
Degree Backwardsfires from 1.5 · saturates at 9
degrees the far end is narrower than the near one - the wrong way round. A fixture built backwards measures 5.5. Starts at 1.5 because below that it is fitting noise rather than intent, and saturates at 9 where the form has clearly been drawn as a cone.
Tangent Missfires from 0.06 · saturates at 0.3
worst gap between a side and the end it should graze, over the widest end radius. Measured against the ellipse SUPPORT radius rather than a mean radius - the first version compared against the mean and reported 0.307 on a cylinder exact by construction, which now measures 0.002. Ends cocked 12 and 25 degrees measure 0.041 and 0.126, which is honest: a rotated end really does pull away from its own silhouette.
Taperfires from 0.1 · saturates at 0.8
shortfall in narrowing toward the far end. A correct fixture tapers 0.242 and scores 0; parallel sides taper 0.000 and score 0.2. Negative taper - wider at the far end - runs further up the same ramp.
Side Bowfires from 0.02 · saturates at 0.09
worst side bow over its own length. Shares the line drill anchors, where a straight stroke measures under 0.005 on every device.

The courses

What clears a stage

An optional staged course sits behind two of the drills — five stages on a box in perspective, four stages on a cylinder in perspective — and a stage is cleared by measured attempts rather than by a fixed number of drawings. The advancement targets are curriculum choices, not additional geometric measurements. They are shown here so you can see what a stage asks of you.

A box in perspective

Built with youcleared by finishing the build
Build the construction one mark at a time, with each mark checked before moving on to the next.
Points on the page2 attempts at 78 or better
The horizon line and the vanishing points for you to use. The 12 edges of the box are yours to draw. None of them are drawn for you.
You place them2 attempts at 78 or better
Put the points down yourself — the horizon is given, where along the horizon the points are to be placed is yours to decide. They vanish, you draw, and then you find out where your edges really agreed.
Tipped over2 attempts at 78 or better
The view is tipped, so the box's edge directions tilt with it. Keep the edges straight and aim each set toward its vanishing point rather than relying on the page's verticals.
No points at all3 attempts at 80 or better
The sketch sheet is empty. Decide where the vanishing points will be, then keep those directions in mind as you draw.

A cylinder in perspective

Built with youcleared by finishing the build
The axis, then each end, then the sides, with every mark checked before the next.
Axis on the page2 attempts at 78 or better
Eye level and the centre line are given. Add both ends and both sides; in this below-eye-level view, the bottom ellipse should be more open than the top one.
Eye level only2 attempts at 78 or better
You place the centre line yourself. Use it to align the two ellipses, and compare how open the ends look in this view.
Nothing given3 attempts at 80 or better
An empty sheet. Choose your cylinder's angle, draw its centre line, and build both ends and sides around it.

The rules we hold ourselves to

What the engine refuses to do

  • It will not score what it cannot read

    For strokes not meeting the validity gate for a certain number (e.g. stroke length) a message is provided stating that the stroke could not be read, and no number is provided (not even 0, let alone a made up one). Without those validity gates, a three-point tick could fit a tiny circle and receive a misleadingly high score.

  • It will not claim a cause it cannot know

    A small phone screen and a larger pen surface allow different movements. The tool can show where a line deviates on either device. Stylus-specific guidance may suggest a change in arm or wrist movement, but coordinates alone cannot identify which joint caused the mark.

  • It will not invent timing it does not have

    Many devices record the time for each stroke with a single clock reading. If this occurs, the confidence value for that stroke will not be reported, and all other results that rely on time for the stroke in question will also be suppressed rather than treating the recorded duration as a real 0.0-second stroke or falsely accusing the user of tracing.

  • It separates a changed score from a change in drawing habits.

    Some advice, such as using a quicker continuous stroke, can temporarily reduce accuracy while you practise a different movement. Findings carry their expected effect so the result can explain that tradeoff. When the suggested change may cost accuracy, the feedback can emphasize confidence and explain why the score may dip.

  • It will not rank you against other people yet

    The level bands are fixed and are indicated on the page where they are described. A claim such as “Better than 62% of beginners” would require a suitable set of real user results. These score bands do not make that population comparison.

  • It will not score the guided build

    In the build, every single mark that you make in drawing is compared to the exact same mark that you were asked to draw. The degree of difference for each of these is measured. Also, the degree to which you were aiming off in drawing the mark is measured. The mark is also checked to see if it was too short, too long, curved etc. Each of these reasons for the mark failing is logged. The tolerances for these measurements in the build are tighter than the statistics presented above for several reasons. For one, you are trying to copy a line that is right in front of you. Secondly, none of the statistics from the build are ever used to generate a score for your drawing. Instead, all of the statistics are generated from your subsequent unaided drawings.

  • The scoring system will not attempt to score a dimension that it failed to measure.

    Note that the geometry of a stroke does not contain information about the shading that was created with it, thus this skill profile will not contain this axis rather than plotting it at zero which would be wrong because nobody checked this for you.

Limits

What these measurements cannot see

Whether the drawing is any good. These measurements describe particular properties of your strokes and shapes. A perfectly round circle can be part of an unsuccessful drawing, and a good drawing can contain shaky circles. For feedback on a complete subject, including proportions against a reference and shading, that is what Rate My Sketch is for.

Rendering. These fixed-weight exercise strokes do not show how you render a subject’s texture, detailed features or lighting.

Your hand, separately from your device. Many drills involve motor control as well as judgment, so the input device matters. Dividing a bar with a tick asks less of the stroke itself and puts more attention on judging proportion. Even there, input precision can affect an attempt, and transfer to paper is something to practise rather than assume.

Whether these thresholds match real beginners. They are currently set from synthetic test fixtures which have very precise geometry, and are not representative of how often real users will draw within a line. Real attempts can help recalibrate those choices. The tables here read their settings from the engine, so a change to those settings is reflected in the tables.

Try it against your own hand

Every drill is free and unlimited

All the arithmetic for the above was done on this device, no AI was involved.

Open the drills