85 of 222 mystnb figure captions (38%) on QuantEcon/lecture-python.zh-cn are byte-identical to the English source — untranslated, and reader-visible on pages whose prose is fully Chinese. Example live text: "Relaxation algorithm paths, undamped and damped".
Found by sweeping the site after the _toc.yml caption repair in QuantEcon/lecture-python.zh-cn#245. The ToC captions turned out to be the visible half of a larger localisation hole.
What is affected
Verified by comparing every caption: value against the same file's caption in QuantEcon/lecture-python.myst — byte-identical means untranslated, which avoids the false positives a script-detection test produces.
| Lecture |
Untranslated captions |
phillips_drifts_volatilities |
26 |
merging_of_opinions |
8 |
phillips_two_stories |
7 |
olg_adaptive_money, pricing_information |
5 each |
exchange_rate_learning, genetic_classifier, lq_robust_smoothing, theil_2, var_subsets |
4 each |
bounded_rationality, market_diffusion |
3 each |
prospects_bounded_rationality |
2 |
lq_robust_bewley, misspecified_recovery, phillips_escaping_nash, phillips_learning, phillips_self_confirming, sargent_surico |
1 each |
Which path introduced them
Tracing the commit that first introduced each English caption:
| Introduced by |
Lectures |
Captions |
sync (organic [translation-sync] PRs) |
15 |
68 |
bulk seed (init, the 2026-07-22 37-lecture seed) |
4 |
17 |
So it is predominantly the sync path — consistent with #178's thesis — but not exclusively. init left 17 as well, in merging_of_opinions, lq_robust_smoothing, theil_2 and misspecified_recovery. Any fix scoped to sync alone would leave those.
The current release is affected. Delivery tool-versions across the 19 lectures are 0.20.0, 0.24.0 and 0.25.0 — pricing_information and market_diffusion were both delivered by v0.25.0 on 2026-08-07 and both carry English captions.
This is a gap, not an absence
The engine clearly can translate captions: 137 captions on the same edition are correctly in Chinese, arriving via init, resync and hand translation. And QuantEcon/lecture-intro.zh-cn is completely clean — 115 captions, zero byte-identical to its source. So the capability exists and something about the sync path (and part of init) skips it.
Blast radius is one edition, for a structural reason
Swept all six editions:
| Edition |
Captions |
Untranslated |
| lecture-python.zh-cn |
222 |
85 |
| lecture-intro.zh-cn |
115 |
0 |
| lecture-python-programming.zh-cn / .fa / .fr / .ml |
0 |
— |
The whole lecture-python-programming series has no mystnb captions in the English source at all, so those four editions are unaffected by construction rather than by correctness. If captions are ever added upstream there, they inherit this bug.
One false-positive class worth recording for anyone writing a checker: lecture-intro.zh-cn's inequality.md and long_run_growth.md carry 19 captions written as "洛伦..." — double-quoted \u escapes that YAML decodes correctly and that render as Chinese on the published page. A naive "does this line contain CJK codepoints" test flags them; comparing against the source does not.
Suggested fix
Same family as #178 (sync applies no localisation rules) but a different surface — YAML caption: metadata inside {figure} / code-cell directives, not plot labels or font config inside code. #178's evidence and likely fix do not reach this.
Worth deciding alongside #254, which proposes a deterministic target-script assertion for _toc.yml captions: one check could cover both surfaces, since the predicate is the same — a target-language file should not contain a caption byte-identical to its source. Deciding that before #254 is built narrowly would avoid writing the same check twice.
Repair of the existing 85 is a separate, hand-fixable pass on the edition; it is prose-only, so it publishes without a cache run.
85 of 222 mystnb figure captions (38%) on QuantEcon/lecture-python.zh-cn are byte-identical to the English source — untranslated, and reader-visible on pages whose prose is fully Chinese. Example live text: "Relaxation algorithm paths, undamped and damped".
Found by sweeping the site after the
_toc.ymlcaption repair in QuantEcon/lecture-python.zh-cn#245. The ToC captions turned out to be the visible half of a larger localisation hole.What is affected
Verified by comparing every
caption:value against the same file's caption in QuantEcon/lecture-python.myst — byte-identical means untranslated, which avoids the false positives a script-detection test produces.phillips_drifts_volatilitiesmerging_of_opinionsphillips_two_storiesolg_adaptive_money,pricing_informationexchange_rate_learning,genetic_classifier,lq_robust_smoothing,theil_2,var_subsetsbounded_rationality,market_diffusionprospects_bounded_rationalitylq_robust_bewley,misspecified_recovery,phillips_escaping_nash,phillips_learning,phillips_self_confirming,sargent_suricoWhich path introduced them
Tracing the commit that first introduced each English caption:
sync(organic[translation-sync]PRs)init, the 2026-07-22 37-lecture seed)So it is predominantly the sync path — consistent with #178's thesis — but not exclusively.
initleft 17 as well, inmerging_of_opinions,lq_robust_smoothing,theil_2andmisspecified_recovery. Any fix scoped to sync alone would leave those.The current release is affected. Delivery tool-versions across the 19 lectures are 0.20.0, 0.24.0 and 0.25.0 —
pricing_informationandmarket_diffusionwere both delivered by v0.25.0 on 2026-08-07 and both carry English captions.This is a gap, not an absence
The engine clearly can translate captions: 137 captions on the same edition are correctly in Chinese, arriving via
init,resyncand hand translation. And QuantEcon/lecture-intro.zh-cn is completely clean — 115 captions, zero byte-identical to its source. So the capability exists and something about the sync path (and part ofinit) skips it.Blast radius is one edition, for a structural reason
Swept all six editions:
The whole
lecture-python-programmingseries has no mystnb captions in the English source at all, so those four editions are unaffected by construction rather than by correctness. If captions are ever added upstream there, they inherit this bug.One false-positive class worth recording for anyone writing a checker: lecture-intro.zh-cn's
inequality.mdandlong_run_growth.mdcarry 19 captions written as"洛伦..."— double-quoted\uescapes that YAML decodes correctly and that render as Chinese on the published page. A naive "does this line contain CJK codepoints" test flags them; comparing against the source does not.Suggested fix
Same family as #178 (sync applies no localisation rules) but a different surface — YAML
caption:metadata inside{figure}/ code-cell directives, not plot labels or font config inside code. #178's evidence and likely fix do not reach this.Worth deciding alongside #254, which proposes a deterministic target-script assertion for
_toc.ymlcaptions: one check could cover both surfaces, since the predicate is the same — a target-language file should not contain a caption byte-identical to its source. Deciding that before #254 is built narrowly would avoid writing the same check twice.Repair of the existing 85 is a separate, hand-fixable pass on the edition; it is prose-only, so it publishes without a cache run.