Automation can only police the numeric layer
Aliases: numeric lint · spacing color automatable · meaning not automatable · automation ceiling
What it is
What a machine can stably compare is the numeric layer: whether spacing sits on a scale, whether a color is the named swatch, whether type size is a step on the ramp. Those quantities have a ruler. Whether this button should wear the “primary action” swatch, whether this empty state is asking someone to create rather than apologizing, has no ruler. Automation saturates where values live and is silent where meaning lives.
Handing the whole checklist to lint announces that only the machine-visible layer will be checked, and pretends the others do not exist. Refusing all automation hands already-comparable numbers back to a tired eye, which starts waving things through on page three.
Why it happens
Comparison needs numbers on both sides. Spacing pixels at build time, computed contrast, type size, can be tested for equality or for sitting on a named scale. A choice — “primary here or danger here” — has roles on both sides, not numbers. The same hex can hang off two roles: if warning and error share a red, lint sees a legal color and cannot see the wrong role.
The ceiling is therefore object type, not missing engineering. Where the object is a measurable value, the machine wins; where it is a role and a consequence, the machine has no input. Encoding more meaning into names (“this is danger, not warning”) can push some choices down into the numeric layer, but the encoding is still done by people and goes stale. The ceiling can move up; it cannot be removed.
Where it stops holding
A codebase with no named scale, hexes typed per page, has no stable ruler even at the numeric layer; automation will noise or stay quiet until a comparable ramp exists. Illustration, charts, and map color often sit off the UI ramp; sweeping them with UI lint false-kills. When a theme remaps values at runtime, automation must compare post-computation values, not literals in source, or it will miss “the name is right, the computed contrast is not”.
Applying it
- Split the list into two columns: a numeric column for lint (spacing scale, named color, type ramp, minimum hit size) and a meaning column for people.
- Do not invent pseudo-numbers to make the list “fully automatic”, such as scoring “tone consistency”. That is not a measurement.
- Calibrate the ceiling with a contrast fixture: one screen that assigns primary and danger the same legal hex. Lint must stay quiet; a person must still mark the wrong role — silence proves the numeric layer has topped out, the mark proves the meaning layer is still there.
- How to check: review items closed by automation this month. If any ask “what does this button do”, automation overreached. If the numeric column is still being eyeballed, automation is absent. If the fixture makes lint fire, or a person cannot see the role error, calibration failed.
Related
- Same group: R2.03.1 Checklists must cover states and edge cases · R2.03.3 Semantic consistency requires human judgment · R2.03.4 Every checklist item must be answerable yes or no · R2.03.5 Order items by how cheap they are to find · R2.03.6 Grow the list from defect reviews, not from taste
- Adjacent: R1.18 Adoption and compliance metrics · R1.03 Component state completeness
- Search terms:
design lint·numeric layer·named color·automation ceiling