Type bench / three real surfaces

A typeface is not a specimen sheet. It is a leaderboard at 12.5px, a task slug that has to fit its column, and a status word you read without stopping. So the specimen here is SkillsBench, the capability viewer and the TaskMiner queue — real screens, real numbers, re-typeset live.

Loading faces…

SkillsBench leaderboard — numeric density

Twenty-four configurations, four numeric columns, a confidence interval inside every cell. Type fails here by not holding a column: proportional digits break the decimal alignment, and a wide comma or plus-minus pushes the whole run off the grid.

SkillsBench v1.1 · git tag v1.1 · recomputed 2026-07-16
With SkillsWithout Skills Normalized Gain (g) Claude CodeCodex Gemini CLIOpenHands 87 tasks · up to 3 trials per task
# Harness Model Without Skills With Skills Gain (g) Trials

Capability viewer — mixed setting

The hardest pairing on the stack: a tabular list on the left, running prose and a code block on the right, in one field of view. A face that is tuned for data goes cold in the paragraph; a face tuned for reading goes soft in the table. The title is a 42-character slug that has to break well.

capability · viewer eval-20260716-0942 · daytona · benchflow 0.6.4
Task Miss Configuration Run
crystallographic-wyckoff-position-analysis
natural-sciencemedium4 checksscientific-data
Instruction

You are a materials science researcher. You want to analyze the crystal structure of a few samples. You are given a few CIF files generated by SHELX through X-ray diffraction. Report the space group, the Wyckoff letters and the site multiplicity for each sample, and write the result to /root/wyckoff_analysis.json.

Verifier excerpt
def test_wyckoff(out: dict) -> None:
  ref = load_json("expected.json")
  for s in SAMPLES:
    eq(out[s]["space_group"], ref[s]["sg"])
    close(out[s]["mult"], ref[s]["mult"])
  # SHELX writes non-standard
  # settings: allow origin 1 or 2
Checks
PASSSpace group number matches for all three CIF files
PASSWyckoff letters reported in the standard setting
FAILSite multiplicity wrong for sample_02 — origin choice 2 not handled
PASSOutput written to the requested path

TaskMiner queue — state at a glance

Nobody reads a queue. They scan it for the row that is in trouble. That puts the load on weight separation and word shape, not on beauty: SOLVED, PARTIAL and UNSOLVED have to split apart at 10px, and the two-line row has to stay one object.

TaskMiner 101 tasks · 8 domains · 3 trials
All domainssoftware-engineering natural-sciencecybersecurity finance-economics sorted by resolution rate
Tasks by domain — dataset v1.1

The bench

Everything below is measured in the browser you are reading this in, on the faces that actually resolved — no numbers copied off a specimen page. Change either slot and every figure re-reads.

Column fit

A over B, one origin

The longest slug in the dataset, set in both slots at each face's own cell size and stacked on a single left edge — one shared baseline, one shared origin. Where the two faces agree the strokes sit on top of each other; where they diverge the drift accumulates left to right, and the gap between the two end rules is the cost of the swap in the Task column above. The dashed rule is that column's real width.

crystallographic-wyckoff-position-analysis crystallographic-wyckoff-position-analysis column budget A B
Slot A width
Slot B width
Difference
Column budget
measured above, live

Bold reflow

slot A

Every one of the three surfaces bolds something on hover or selection. In most families the bold cut is wider, so the row reflows and the columns twitch. A uniwidth family holds one advance width across weights and nothing moves. Regular over bold, same origin:

reconstruct-investor-reconciliation reconstruct-investor-reconciliation regular bold

Numerals

digit advance spread

Every numeral in the three surfaces goes through the data lane — the paired mono — while chips, sub-lines and prose numbers go through the text lane. Measured across 0–9 and set flush right below: watch where the decimal points land in each lane.

A
data lane
67.3 ±8.2
text lane
67.3 ±8.2
B
data lane
67.3 ±8.2
text lane
67.3 ±8.2

Both surfaces also set font-variant-numeric: tabular-nums, which rescues a proportional face if it ships the feature. The spread here is measured with the feature off, so it reports what each face does on its own.

Apparent size

x-height ÷ cap-height

Two faces at the same font-size do not look the same size. The ratio below is why — it is the single number that decides whether a 12.5px cell reads as generous or as cramped. The dashed rule is the measured x-height.

A
Hx baseline
B
Hx baseline

Confusable pairs

at 20px and at cell size

Task slugs carry version numbers, IBANs, space-group symbols and CVE ids. When 0 and O merge, a miss report becomes unreadable in the one place it has to be exact.

A
0O zero / oh 1lI one / ell / eye rn m rn / em
fix-erlang-ssh-cve · P2₁/c · IBAN DE89 3704 0044
B
0O zero / oh 1lI one / ell / eye rn m rn / em
fix-erlang-ssh-cve · P2₁/c · IBAN DE89 3704 0044

The whole field, against one column

No bars — the type is the bar. Every candidate sets the same slug at its own cell size, from a shared left edge, so each row's right edge is its measurement. The red rule is the real width of the Task column in proof 2, measured live. Cross it and the slug truncates in production. Click any row to load it into the live slot.

Ranked by measured width crystallographic-wyckoff-position-analysis — 42 characters, the longest slug in dataset v1.1
Task column budget: