Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Model Output Notes

Two rounds of runs are recorded here. The April round covered terms only; the August round completed the grid across all three entry types and is where the formatting validators and the action-* prompts first had output to score.

Regenerate every table below with:

uv run python scripts/analyze_runs.py               # all entry types
uv run python scripts/analyze_runs.py -t paragraphs # one entry type

Models

ModelAPI IDInput $/MTokOutput $/MTok
Claude Sonnet 4.6claude-sonnet-4-6$3.00$15.00
Claude Haiku 4.5claude-haiku-4-5-20251001$1.00$5.00

August 2026 round — full grid

Generated: 2026-08-19

Both models were run against all four prompt templates and all three entry types: 2 models × 4 prompts × 3 types = 24 runs, 3,288 translations, $10.58 combined. Batch translation used 10 concurrent workers via ThreadPoolExecutor.

Every entry type now has model output from two models × four prompts. The remaining gap in the definition of done is a second provider — the OpenAI baseline is still blocked on OPENAI_API_KEY.

Cost

RunTypeEntriesInput tokOutput tokCostMean latency
Haiku 4.5 / defaultterms31413,9733,101$0.0295854ms
Haiku 4.5 / academicterms31432,4173,986$0.0523929ms
Haiku 4.5 / action-basicterms31476,45968,295$0.41792,474ms
Haiku 4.5 / action-newterms3141,646,4593,018$1.6615884ms
Sonnet 4.6 / defaultterms31413,9733,017$0.08721,329ms
Sonnet 4.6 / academicterms31432,4173,027$0.14271,383ms
Sonnet 4.6 / action-basicterms31476,4597,686$0.34471,552ms
Sonnet 4.6 / action-newterms3141,646,4593,861$4.99731,485ms
Haiku 4.5 / defaultsentences806,5704,506$0.02911,129ms
Haiku 4.5 / academicsentences8011,2984,555$0.03411,183ms
Haiku 4.5 / action-basicsentences8022,4904,560$0.04531,120ms
Haiku 4.5 / action-newsentences80422,4904,549$0.44521,176ms
Sonnet 4.6 / defaultsentences806,5704,577$0.08842,143ms
Sonnet 4.6 / academicsentences8011,2984,659$0.10382,054ms
Sonnet 4.6 / action-basicsentences8022,4904,722$0.13832,104ms
Sonnet 4.6 / action-newsentences80422,4904,533$1.33552,195ms
Haiku 4.5 / defaultparagraphs172,6622,584$0.01561,714ms
Haiku 4.5 / academicparagraphs173,6692,588$0.01661,698ms
Haiku 4.5 / action-basicparagraphs176,0452,593$0.01901,783ms
Haiku 4.5 / action-newparagraphs1791,0452,628$0.10421,764ms
Sonnet 4.6 / defaultparagraphs172,6622,655$0.04783,252ms
Sonnet 4.6 / academicparagraphs173,6692,651$0.05083,651ms
Sonnet 4.6 / action-basicparagraphs176,0452,652$0.05793,343ms
Sonnet 4.6 / action-newparagraphs1791,0452,623$0.31253,341ms

The glossary is re-sent on every call. action-new carries the whole glossary in its {glossary} block — about 5,240 input tokens per request. On terms that is 1.65M input tokens for 314 short translations, making the run 57× the cost of default for the same work (4.9973vs4.9973 vs 0.0872 on Sonnet). Prompt caching the glossary block would remove almost all of that, and is worth doing before any larger action-new sweep. It matters for action-translation too, which sends the same glossary on every section.

Formatting fidelity

Pass rate for the three boolean checks, mean score for the two 0-1 checks. The six April term runs predate the formatting field on run records and were scored retroactively by analyze_runs.py; the numbers are directly comparable.

RunTypeNDirective balanceFence consistencyCode integrityFull-width punctDirective spacing
Haiku 4.5 / defaultterms314100.0%100.0%100.0%0.9941.000
Haiku 4.5 / academicterms314100.0%100.0%100.0%1.0001.000
Haiku 4.5 / action-basicterms31497.8%100.0%99.0%0.9991.000
Haiku 4.5 / action-newterms314100.0%100.0%100.0%1.0001.000
Sonnet 4.6 / defaultterms314100.0%100.0%100.0%1.0001.000
Sonnet 4.6 / academicterms314100.0%100.0%100.0%1.0001.000
Sonnet 4.6 / action-basicterms31499.4%100.0%99.4%1.0001.000
Sonnet 4.6 / action-newterms314100.0%100.0%100.0%1.0001.000
Haiku 4.5 / defaultsentences80100.0%100.0%100.0%0.9880.950
Haiku 4.5 / academicsentences80100.0%100.0%100.0%0.9880.950
Haiku 4.5 / action-basicsentences80100.0%100.0%100.0%1.0000.950
Haiku 4.5 / action-newsentences80100.0%100.0%100.0%0.9880.950
Sonnet 4.6 / defaultsentences80100.0%100.0%100.0%0.9880.925
Sonnet 4.6 / academicsentences80100.0%100.0%100.0%0.9880.925
Sonnet 4.6 / action-basicsentences80100.0%100.0%100.0%1.0000.938
Sonnet 4.6 / action-newsentences80100.0%100.0%100.0%0.9880.938
Haiku 4.5 / defaultparagraphs17100.0%100.0%100.0%0.9520.824
Haiku 4.5 / academicparagraphs17100.0%100.0%100.0%0.9670.882
Haiku 4.5 / action-basicparagraphs17100.0%100.0%100.0%0.9461.000
Haiku 4.5 / action-newparagraphs17100.0%100.0%100.0%0.9671.000
Sonnet 4.6 / defaultparagraphs17100.0%100.0%100.0%0.9760.941
Sonnet 4.6 / academicparagraphs17100.0%100.0%100.0%0.9170.941
Sonnet 4.6 / action-basicparagraphs17100.0%100.0%100.0%0.9761.000
Sonnet 4.6 / action-newparagraphs17100.0%100.0%100.0%1.0001.000

Nothing breaks MyST structure on paragraphs. Directive balance, fence consistency and code-block integrity pass 100% for every model × prompt on all 17 paragraphs. The fence-mixing and directive-breakage failures that action-translation warns about did not occur once. That is a real result, but a bounded one: 17 paragraphs, none longer than 846 characters, and only six carry code or directives. It says these prompts are safe at paragraph scale, not that they are safe at section or document scale — which is where action-translation actually operates and where the failures were observed. Growing the paragraph set toward the 30-entry target, weighted toward directive-heavy and mixed-fencing content, is what would make this conclusive.

The action-* prompts do fix directive spacing. This is the one place a prompt effect shows clearly. On paragraphs the zh-cn rule “put a space between a CJK character and an inline {doc}/{eq} role” goes from 0.824 (Haiku / default) and 0.941 (Sonnet / default) to a clean 1.000 under both action-basic and action-new. The explicit MyST rules block earns its place.

The only boolean failures are on terms, and only under action-basic — 7 of 314 for Haiku, 2 of 314 for Sonnet. They are a symptom of the verbosity problem below, not of genuine MyST handling: the model wraps a two-word term in a fenced code block that the source never had.

Verbosity — action-basic is unsafe on short fragments

Counting records whose translation is more than one non-empty line:

RunTypeMulti-lineShare
Haiku 4.5 / action-basicterms134/31442.7%
Haiku 4.5 / academicterms4/3141.3%
Haiku 4.5 / defaultterms2/3140.6%
Haiku 4.5 / action-newterms0/3140.0%
Sonnet 4.6 / action-basicterms3/3141.0%
Sonnet 4.6 / action-newterms1/3140.3%

Under action-basic, Haiku stops translating and starts writing documentation for 43% of terms. term-003 “Taylor series” came back as a full lecture page — # 泰勒级数 heading, a definition section, the Taylor series formula in $$, and a Maclaurin series section. term-015 “Adaptive expectations” produced the same shape. term-222 “Newton’s method” came back as an English paragraph followed by its Chinese translation.

The cause is framing. action-basic opens with “You are translating technical documentation” and then lists MyST structure rules. Given a bare two-word input with no glossary to anchor it, the smaller model reads the task as produce a documentation page about this. The output-token column shows it plainly: 68,295 output tokens for Haiku / action-basic / terms against 3,018 for the same model under action-new.

action-new is identical except that it injects the glossary — and it removes the failure completely (0/314), which reads at first as the glossary block being what keeps the model in translation mode. The next section tests that reading and narrows it.

What actually fixes it

The reading above — that the glossary block is what holds the model in translation mode — was tested directly rather than left as an inference. Four prompts were run over the same 30 short terms (one or two words, where the recorded failure rate is highest), on Haiku 4.5 at temperature 0:

PromptPrompt tokensPagesCost
action-basic as shipped24115/30 (50.0%)$0.0508
action-basic + three lines of scoping2840/30 (0.0%)$0.0099
action-basic + a 20-term glossary5120/30 (0.0%)$0.0168
action-new (full 357-term glossary)5,2410/30 (0.0%)$0.0293

The three added lines were:

The input may be a single term or a fragment rather than a whole document. Translate exactly what is given and nothing else — no headings, no definition, no explanation, no added sections.

So the glossary is not what fixes this. Forty-three tokens of scoping fix it just as completely as five thousand tokens of glossary, and a twenty-term glossary works too. What all three have in common is that they show the model the expected output is short. The full glossary happens to demonstrate that 357 times over; it is doing the job incidentally, not by being a glossary.

Repeating the comparison on a held-out set of 30 short terms reproduces it: action-basic 17/30 (56.7%), the scoped variant 0/30.

Two things follow that the recorded run did not make obvious.

The broken prompt is the expensive one. action-basic costs about five times the scoped variant on the same terms (0.0508against0.0508 against 0.0099), because each failure emits a 450–1,832 token page instead of a nine-token translation. Failure rate and spend move together here, so this is not a quality-versus-cost trade.

Failure rate falls as the input gets longer, which is what a framing fault predicts: 51% on one-word terms, 46% on two, 38% on three, 22% on four. Nothing else in the data separates the failures — 45% of basic terms fail against 50% of advanced, so difficulty is not the variable.

The scoped variant was also run over all 17 paragraphs, the case the MyST rules exist for, to check the instruction does not suppress legitimate structure. All three pass/fail checks stay at 100%, and directive spacing at 1.000. Full-width punctuation moves 0.946 → 0.908, which on 17 records is one or two paragraphs and would want a repeat before being read as a real effect.

Recommendation. Scope the prompt rather than adding the glossary. It is cheaper, it is a smaller change, and it fixes the actual fault. Doing so means prompts/action-basic.txt no longer matches the action-basic records already committed here, so either the terms grid is re-run or the change ships under a new template name.

For action-translation: the operative rule is that a documentation-framed prompt must tell the model when its input is a fragment. Sending the glossary on every section does achieve this, but it is an expensive way to buy it, and the prompt-caching support added for this benchmark is a better answer to the cost than the framing. Sonnet is largely immune (1.0%), so this remains a small-model failure mode.

Agreement

First-line agreement is a good metric for terms and a poor one for connected prose — two correct paragraph translations rarely share a first line. On paragraphs the figures run 0-35% and should not be read as a quality signal. Sonnet-vs-Haiku first-line agreement on paragraphs is 0% in every pairing.

The terms agreement figures from April are unchanged and remain the useful ones; see the April section below. Full pairwise tables for all three types come from analyze_runs.py.

Caveats


April 2026 round — terms only

Generated: 2026-04-06

Each model was run with two prompt templates against all 314 seed terms.

RunEntriesTokensCostAvg Latency
Sonnet 4.6 / default31416,990$0.0871,329ms
Sonnet 4.6 / academic31435,444$0.1431,383ms
Haiku 4.5 / default31417,074$0.030854ms
Haiku 4.5 / academic31436,403$0.052929ms

Total: 1,256 translations, ~$0.31 combined cost.

Agreement

Pairwise first-line agreement rates:

PairAgreement
Sonnet default vs Sonnet academic275/314 (87%)
Haiku default vs Haiku academic272/314 (86%)
Sonnet default vs Haiku default244/314 (77%)
Sonnet default vs Haiku academic236/314 (75%)
Sonnet academic vs Haiku default236/314 (75%)
Sonnet academic vs Haiku academic240/314 (76%)

All four runs agree on 214/314 terms (68%). Disagreements (100/314) span terminology choices, transliteration style, and acronym handling.

Quality Observations

Sonnet 4.6 — Very clean output. Near-zero verbosity (0-1 multi-line responses). Translations are concise and use standard academic Chinese terminology (e.g. 续值 for “continuation value”, 阿罗证券 for “Arrow securities”).

Haiku 4.5 — Generally good but with notable issues:

Prompt effect — The academic prompt doubles token usage (~17k → ~36k) due to its longer template. Translation quality is similar for well-defined terms but diverges on ambiguous/short terms like “Exercise” and “Lecture”.

Notable Disagreements

TermSonnet 4.6Haiku 4.5Note
Continuation value续值继续价值 / 延续价值Sonnet uses standard DP terminology
Arrow securities阿罗证券箭头证券Haiku hallucinates literal translation
Discount factor折现因子折扣因子Both acceptable; 折现 more standard in finance
Naive expectations朴素预期幼稚预期Both used in literature
Financial repression金融抑制金融压制抑制 is the standard term
Numeraire计价单位计价货币计价单位 is broader and more accurate

OpenAI

No OpenAI runs have been generated in either round — OPENAI_API_KEY is still unavailable. The provider is configured for gpt-5.4 and gpt-5.4-mini.