You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Malayalam is the hardest target language to date, for a structural reason: the policy is inverted relative to every language we ship. For zh-cn/fa/fr the failure mode is under-translation and the tool's job is to translate everything; for ml (#70, #71) the failure mode is over-translation — the tool must keep all technical terms in English and generate Malayalam only as grammatical connective tissue, attaching case-suffixes and auxiliaries directly to English roots (economy-യിലെ, process ചെയ്ത്). None of our existing evaluation habits, review-judge expectations, or intuitions transfer directly, so ml gets a dedicated test project with detailed assessment rounds with Adisankar (native-speaker reviewer, #70) before we seed a real repo.
Tracking issue for that test project. Prerequisite: #71 (ml config, glossary seed, review-judge policy injection) merges first. — #71 merged 2026-07-24 and #70 closed 2026-07-26: Malayalam has shipped in v0.24.0, the policy is recorded as .dev/decisions/D-2026-06-01-malayalam-keep-english-policy.md, and test-translation-sync.ml is a first-class harness language at 26/26 green (#206, #209). So this issue is no longer gated on anything in the engine — it is gated on native-speaker review capacity, which is #207 and now #228.
Assets in hand
Strategy doc (Malayalam Translation Strategy: Technical Term Handling, Adisankar) — the policy plus 16 worked examples across economics, finance, statistics, and programming.
Reference translation — Adisankar's hand-crafted Malayalam getting_started.md (source: lecture-python-programming). This is our ground truth for style: keep-English density, morphology attachment, heading treatment. Note it contains a few typos ("eentire", "substanial") and some fully-English sentences, so divergences from it are questions for Adisankar, not automatic errors.
The ml advantage: the policy is deterministically checkable
Because the policy is "keep these exact English strings", much of the assessment can be scripted rather than judged by an LLM — and our experience so far is that deterministic checks beat the LLM judge (#157 lineage). Planned metrics, implemented in experiments/ml-benchmark/scripts/ and candidates for graduating into diff-checks.ts as ml-specific gates later:
Metric
Check
Target
Pinned-term retention
each of the 47 glossary keep-English terms appears in English, never in Malayalam script
100%
Beyond-glossary retention
list of ~30 terms the reference keeps English (notebook, cell, kernel, terminal, browser, dashboard, …) stays English
100%
Transliteration detection
no Malayalam-script phonetic renderings of English technical terms
0 instances
Heading fidelity
every heading identical to the English source
100%
Consistency
every repeated term handled the same way (same script, same root) on all occurrences
100%
Morphology pattern
hyphenated suffix attachment (X-യിലെ, X-ന്റെ) present and well-formed
qualitative
Script ratio
Latin vs Malayalam codepoints per paragraph, compared against the reference's band
within band
The script-ratio band is the interesting one: too much Malayalam signals over-translation, too much Latin signals the tool lazily leaving prose untranslated — a single metric that catches both failure directions.
Re-scoped 2026-07-28. Phase 1 was designed as a two-arm model benchmark that would also produce a report. Both halves were wrong. The benchmark half is n=1 per arm on one file, which #227 puts at ~13% power — the Opus-vs-Sonnet contrast it was meant to settle remains unresolved at p = 0.192 after 26 invocations, so model selection moves to bench/ (#227). The report half is the part that matters, and it is re-scoped from "a report" to one packet that converts what we already have into the smallest set of questions only a native speaker can answer — because Adisankar's availability, not our tooling, is what paces Phases 2–4.
Full plan in #228, which also folds in #207's seed review so he is not asked the same four open #71 questions twice. The old run-book #194 is closed, with a section-by-section disposition recorded there.
Stage 1 — divergence inventory: translate getting_started.md once (claude-opus-5, --localize none), score it, fix what the FAIL gates catch, reduce to ~30 ranked adjudications (term treatment → morphology → script-ratio outliers)
Stage 2 — content-mix catalog: ~10 passages from the two harness seed documents, covering the content situations the reference contains none of (display-math prose, admonitions, captions, code-cell prose, nested ####)
Stage 3 — English-knowns checklist: glossary-review skill over ~5 domain-dense lectures, seed + probe, ranked by whether the two renderings split on keeping a term English
Get the packet to Adisankar — sent 2026-07-29, as an email attachment rather than GitHub issues. Task-list checkboxes are only editable by users with write access and he is not a collaborator, so the issue-and-checkbox design would have asked him to tick boxes he cannot tick — the failure mode already live on fr#3, 26 boxes never ticked since 2026-07-15. Delivered as experiments/ml-benchmark/malayalam-review-questions.md, 23 answer boxes, with scripts/parse_responses.py to extract the reply
Phase 2 — Adisankar deep assessment (calibration batch)
Phase 1 is complete and closed (#228, delivered by #231 and #233). His reply arrived 2026-08-03 — 23/23 answered (#236) — and everything it decided has shipped: register rules + glossary v0.2.0 (#237, regeneration-verified), the batch translated and delivered, and the review relocated to the real edition lecture-python-programming.ml (PRs 1–5) so his fixes merge into the site (see 2026-08-03 comments). Phase 2 now waits on his PR review comments; the follow-up round (F1–F3, the A5–A7 source sentences) returned 2026-08-06 with all three resolved — A5 a live rule gap queued for v0.3, A6/A7 accepted-as-is (#252).
Structured flagging protocol: Adisankar flags each over-translation / awkward rendering as a PR review comment; each flag must resolve to exactly one of (a) glossary entry, (b) language-config rule change, (c) accepted-as-is with rationale — in flight 2026-08-03: instructions emailed (no-deadline framing), he holds triage on the target repo; flags land on lecture-python-programming.ml PRs 1–5
Run review mode (post-feat: add Malayalam (ml) language support — keep-English-dominant policy #71 judge with policy injection) on all Phase 1–2 outputs and score the judge against Adisankar's flags: does it produce false "untranslated content" findings on compliant text, and does it catch seeded over-translations?
Adversarial check: hand-inject 5–10 deliberate violations (a translated technical term, a transliterated term, a Malayalam heading) and confirm the judge flags every one as a terminology finding
Decide which deterministic metrics graduate into diff-checks.ts as ml gates
Glossary v0.2 and rules finalized; docs pass (docs/user/language-config.md, docs/user/glossary.md, glossary/README.md)
Go/no-go on completinglecture-python-programming.ml — the repo exists with a 5-lecture partial seed since 2026-08-03 (see comments); go = remaining 16 lectures + _static assets, source-repo sync workflow + secrets, .translate/state bootstrap (check --write-state after the five PRs merge), a release containing the register rules with the v0 alias advanced, and deploy
Success criteria for go
All deterministic metrics at target on the calibration batch, zero unresolved Adisankar flags, the review judge produces no false positives on compliant output and catches all seeded violations, and per-file cost is measured and acceptable (fr ran ~$0.21/file real cost; ml should be the same order).
Risks
The reference is a single lecture from one (programming-flavored) series; economics-heavy prose may behave differently — that's what the Phase 2 diversity requirement is for.
A second ml corpus now exists and is not the reference. The two harness seed documents (base-minimal-ml.md, base-lecture-ml.md) are frozen claude-sonnet-5 output at v0.24.0 covering MyST directives, display math and nested #### — constructs the reference contains none of. They are richer, and they are unreviewed machine drafts. Do not pool findings across the two corpora as evidence about one model's behaviour: different documents, different model, no replicates.
Why Malayalam needs its own test project
Malayalam is the hardest target language to date, for a structural reason: the policy is inverted relative to every language we ship. For
zh-cn/fa/frthe failure mode is under-translation and the tool's job is to translate everything; forml(#70, #71) the failure mode is over-translation — the tool must keep all technical terms in English and generate Malayalam only as grammatical connective tissue, attaching case-suffixes and auxiliaries directly to English roots (economy-യിലെ,process ചെയ്ത്). None of our existing evaluation habits, review-judge expectations, or intuitions transfer directly, so ml gets a dedicated test project with detailed assessment rounds with Adisankar (native-speaker reviewer, #70) before we seed a real repo.Tracking issue for that test project.
Prerequisite: #71 (ml config, glossary seed, review-judge policy injection) merges first.— #71 merged 2026-07-24 and #70 closed 2026-07-26: Malayalam has shipped in v0.24.0, the policy is recorded as.dev/decisions/D-2026-06-01-malayalam-keep-english-policy.md, andtest-translation-sync.mlis a first-class harness language at 26/26 green (#206, #209). So this issue is no longer gated on anything in the engine — it is gated on native-speaker review capacity, which is #207 and now #228.Assets in hand
getting_started.md(source:lecture-python-programming). This is our ground truth for style: keep-English density, morphology attachment, heading treatment. Note it contains a few typos ("eentire", "substanial") and some fully-English sentences, so divergences from it are questions for Adisankar, not automatic errors.mllanguage config (7 rules), 52-term glossary seed (47 keep-English + 5 everyday), review-mode policy injection so the judge knows keep-English is deliberate.The ml advantage: the policy is deterministically checkable
Because the policy is "keep these exact English strings", much of the assessment can be scripted rather than judged by an LLM — and our experience so far is that deterministic checks beat the LLM judge (#157 lineage). Planned metrics, implemented in
experiments/ml-benchmark/scripts/and candidates for graduating intodiff-checks.tsas ml-specific gates later:X-യിലെ,X-ന്റെ) present and well-formedThe script-ratio band is the interesting one: too much Malayalam signals over-translation, too much Latin signals the tool lazily leaving prose untranslated — a single metric that catches both failure directions.
Phases
Phase 0 — prerequisites
relationshipoptionality) were NOT yet confirmed by Adisankar; they carry forward into Phase 1's report and Phase 2's flagging protocol.PLAN.md— merged 2026-07-24 (dev(ml): scaffold the ml benchmark experiment — plan, deterministic metrics, reference slot #191, 1b2e2ea) (reference fetched byte-exact from adisankarmt/quantecon-malayalam@c30578f and verified: 6706 Malayalam codepoints, ZWJ/ZWNJ intact; metrics script validated against it — the reference passes every gate, band mean 0.485 / p10 0.132 / p90 0.707 — corrected 2026-07-28 from 0.127, which was a transcription error unique to this issue;experiments/ml-benchmark/PLAN.mdand Phase 1 run-book (Mon 2026-07-28): ml benchmark — Sonnet 5 vs Opus 4.8 vs native reference #194 both record 0.132, and PLAN.md is authoritative as the record committed alongside the calibration)test-translation-sync.ml— done 2026-07-24 viatranslate setup(repo + scaffolding + labels bootstrapped). Source-repo ml sync workflow in ci: add Malayalam (ml) sync workflow mirroring the fa harness test-translation-sync#671. Org-level secret access granted to the new repo 2026-07-24 (confirmed by @mmcky)Phase 1 — re-scoped to the reviewer packet: #228
Re-scoped 2026-07-28. Phase 1 was designed as a two-arm model benchmark that would also produce a report. Both halves were wrong. The benchmark half is n=1 per arm on one file, which #227 puts at ~13% power — the Opus-vs-Sonnet contrast it was meant to settle remains unresolved at p = 0.192 after 26 invocations, so model selection moves to
bench/(#227). The report half is the part that matters, and it is re-scoped from "a report" to one packet that converts what we already have into the smallest set of questions only a native speaker can answer — because Adisankar's availability, not our tooling, is what paces Phases 2–4.Full plan in #228, which also folds in #207's seed review so he is not asked the same four open #71 questions twice. The old run-book #194 is closed, with a section-by-section disposition recorded there.
getting_started.mdonce (claude-opus-5,--localize none), score it, fix what the FAIL gates catch, reduce to ~30 ranked adjudications (term treatment → morphology → script-ratio outliers)####)glossary-reviewskill over ~5 domain-dense lectures, seed + probe, ranked by whether the two renderings split on keeping a term EnglishREPORT.md(for us) andPACKET.md(numbered questions only) intoexperiments/ml-benchmark/— dev(ml): the Adisankar review packet — Stages 1-3 of #228 #231, 2026-07-28experiments/ml-benchmark/malayalam-review-questions.md, 23 answer boxes, withscripts/parse_responses.pyto extract the replyPhase 2 — Adisankar deep assessment (calibration batch)
Phase 1 is complete and closed (#228, delivered by #231 and #233). His reply arrived 2026-08-03 — 23/23 answered (#236) — and everything it decided has shipped: register rules + glossary v0.2.0 (#237, regeneration-verified), the batch translated and delivered, and the review relocated to the real edition
lecture-python-programming.ml(PRs 1–5) so his fixes merge into the site (see 2026-08-03 comments). Phase 2 now waits on his PR review comments; the follow-up round (F1–F3, the A5–A7 source sentences) returned 2026-08-06 with all three resolved — A5 a live rule gap queued for v0.3, A6/A7 accepted-as-is (#252).lecture-python-programming: one prose-heavy, one economics-heavy, one math-heavy, one code-heavy. Phase 1 re-scoped: build the Adisankar packet (divergence inventory, content-mix catalog, English-knowns checklist) #228 section D asks Adisankar to nominate these in the Phase 1 packet, which saves a round trip — our diversity requirement is the constraint, his preference picks inside it — nominated 2026-08-03 (packet D1): python_by_example, numpy, pandas, matplotlib, functions; accepted as-is (dev(ml): Adisankar's packet reply, dispositions, and the follow-up round #236)test-translation-sync.mlPRs so review happens in the real workflow. There is no "Phase-1-winning model" any more (see Phase 1): use the current default unless bench/: a replicate-based reliability instrument for the document write paths (models × settings × paths) #227 has concluded by then, and record which model produced the batch so the flags stay attributablePhase 3 — review-mode calibration
diff-checks.tsas ml gatesPhase 4 — decisions and go/no-go
Model default for ml (Opus 4.8 vs Sonnet 5) from Phase 1–2 quality + cost data— moved to bench/: a replicate-based reliability instrument for the document write paths (models × settings × paths) #227 (2026-07-28). This box assumed Phase 1's two arms would supply the data; they cannot. A per-language default needs replicate-based rates frombench/, not a one-file comparison. Nothing in Phases 1–3 may be read as evidence for ittreatmentfield (feat: add Malayalam (ml) as a target language — research, glossary strategy & model recommendation #70): only if calibration showedml == enpinning is insufficient — also the last of feat: add Malayalam (ml) language support — keep-English-dominant policy #71's four open questions:relationshipparenthetical optionality (rule 7) was NOT in the packet (A12/A13/A10 resolved the other three); observe it in his PR review rounddocs/user/language-config.md,docs/user/glossary.md,glossary/README.md)lecture-python-programming.ml— the repo exists with a 5-lecture partial seed since 2026-08-03 (see comments); go = remaining 16 lectures +_staticassets, source-repo sync workflow + secrets,.translate/statebootstrap (check --write-stateafter the five PRs merge), a release containing the register rules with the v0 alias advanced, and deploySuccess criteria for go
All deterministic metrics at target on the calibration batch, zero unresolved Adisankar flags, the review judge produces no false positives on compliant output and catches all seeded violations, and per-file cost is measured and acceptable (fr ran ~$0.21/file real cost; ml should be the same order).
Risks
base-minimal-ml.md,base-lecture-ml.md) are frozenclaude-sonnet-5output at v0.24.0 covering MyST directives, display math and nested####— constructs the reference contains none of. They are richer, and they are unreviewed machine drafts. Do not pool findings across the two corpora as evidence about one model's behaviour: different documents, different model, no replicates.Refs #70 (closed), #71. Phase 1 → #228 · model selection → #227 · seed review → #207 · superseded run-book → #194.