UIStringBench
A public benchmark for how well LLM judges detect translation errors in software UI strings — mistranslations, omissions and additions that no structural check can see.
v1 · run 2026-09-07 · shipi18n semantic judge — 3-pass majority vote, MQM categories · corpus committed before the judge was written
| Judge | Provider | Public split (228 pairs) | Held-out (60 pairs) | |||
|---|---|---|---|---|---|---|
| Catch | False positives | Label acc. | Catch | False positives | ||
| Claude Haiku 4.5small | Anthropic | 54/54 | 13/168 (7.7%) | 98.1% | 18/18 | 0/42 (0.0%) |
| Claude Sonnet 5frontier | Anthropic | 54/54 | 6/168 (3.6%) | 100.0% | 18/18 | 0/42 (0.0%) |
| Claude Opus 5frontier | Anthropic | 54/54 | 6/168 (3.6%) | 100.0% | 18/18 | 0/42 (0.0%) |
| GPT-5.5frontier | OpenAI | 54/54 | 6/168 (3.6%) | 100.0% | 18/18 | 0/42 (0.0%) |
| GPT-5.4 minismall | OpenAI | 54/54 | 7/168 (4.2%) | 98.1% | 18/18 | 2/42 (4.8%) |
| Gemini 3.8 Flashfrontier | 54/54 | 6/168 (3.6%) | 100.0% | 18/18 | 0/42 (0.0%) | |
| Gemini Pro (latest)frontier | 54/54 | 6/168 (3.6%) | 100.0% | 18/18 | 0/42 (0.0%) | |
| Structural checks only (no LLM) | — | 0/54 | 0/168 (0.0%) | — | 0/18 | 0/42 (0.0%) |
Catch = planted errors flagged (any category). Label acc. = correct MQM category among caught. The held-out split is private (contamination defense) and scored separately.
Everyone catches everything
Every LLM judge caught all 54 planted errors on the public split and all 18 on the held-out split. On deliberate, unambiguous errors, detection is saturated — the differentiation is entirely in false positives. (Which also means the held-out split is too easy; v1.1 will plant subtler errors.)
Frontier judges agree — even when dissenting
The five frontier judges — from three different providers — flagged the identical six "clean" pairs. Three of those six are the same stale sentence in three languages that really was wrong: the judges were right and the corpus label was wrong. Per the pre-registration policy the labels stand, and the disagreement is reported instead.
The baseline makes the case
Structural checks alone — key diffs, placeholders, plurals — catch 0 of 54 semantic errors, with zero false positives. That row is the whole argument for a semantic tier: deterministic checks are necessary and cannot see meaning.
Methodology
- Pre-registered: the 228-pair public corpus was committed to git before the judge existed; evaluation thresholds were fixed before implementation; labels are never revised after seeing results.
- Judge under test: each model runs the same harness — 3 passes, majority vote, MQM-style categories (mistranslation / omission / addition) instead of scalar scores.
- Splits: public (168 clean + 54 planted + 6 glossary, es/de/ja, drawn from real production locale files) and a private 60-pair held-out split in a disjoint domain, scored separately.
- Known limitations: three language pairs; one domain (UI strings); planted errors are deliberate and less subtle than real drift; corpus authored by the tool's maintainer with LLM assistance. Treat scores as an engineering QA signal, not a validated academic metric.
Run it yourself
The harness, corpus and item-level results are public. Point it at any judge — including a local model via an OpenAI-compatible endpoint.
git clone https://github.com/Shipi18n/shipi18n && cd shipi18n
node evals/semantic/leaderboard.mjs --models anthropic:claude-haiku-4-5 --split publicThe judge measured here ships in npx @shipi18n/cli check --semantic — advisory by default, because a noisy gate is a gate teams turn off.