feat(translate): eval series as the gate before a model change - #2282
Merged
Merged
Conversation
martyanovandrey
requested review from
a team and
diplodoc-bot
as code owners
September 17, 2026 07:24
martyanovandrey
requested review from
goldserg and
kadymov
and removed request for
a team
September 17, 2026 07:25
Contributor
Author
|
already shiped here #2279 |
Adds a --repeats test for eval cli main() and behaviour tests for the series report/render branches: no-judge series, failing thresholds, pages defective across multiple runs, and null-similarity runs.
|
Yurok868
approved these changes
Sep 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Re-opens the work of #2279, which was merged into the branch of #2277 instead of master: that branch was deleted when #2277 landed as a squash, so these commits never reached master. Same content, rebased onto master, nothing added.
The eval harness can tell whether a translation configuration is broken, but it could not be used as the gate it was written for. One run is not a measurement - the same configuration produced a different result in each of 8 runs, because the batches a run composes depend on timing - and the harness failed runs for reasons that have nothing to do with the translation.
What changes
--repeats <n>runs the same configuration n times, each run in its own<workdir>/run-<i>, and applies the thresholds to the totals over the series. Totals, not per-run verdicts: a rule like "every run passes" is stricter than a single run, so a series would flake more than the run it was meant to stabilize. The default stays 1 and a single run is byte-identical to today, including the JSON report shape.Unscored judge pairs stop failing a run. A pair the judge fails to score is its own hiccup: in the measured series one run failed on 1 unscored pair of 409 while the translation was clean. They now fail a run only above 5% of the pairs sent, which is a malfunction rather than a hiccup.
The ritual is documented.
docs/translate-eval.mdgains the command, the pass rule, and - more importantly - the three metrics that are deliberately not gates.The gate
Over the three runs: markup violations 0, glossary violations 0, untranslated lines at most 1, judge average at least 70.
A live series of the current configuration (Eliza
deepseek-v4-flash, ru->en corpus):That is the criterion doing its job: one heading the model occasionally echoes fits the budget, while any regression this corpus has produced returned whole pages in the source language (33 lines on one page).
What is deliberately not a gate
glm-5-2scored 0.936 average with zero defects wheredeepseek-v4-flashscored 0.98 with zero defects. It compares a model against its own history; it must never accept or reject a candidate.makeJudgeCollector). In the earlier series it reported 100/100 for runs that shipped a whole page in russian.Scope
No CI automation, no cron, no baseline file, and nothing that gates a release: a real-model run cannot live in this repository's CI, which has no access to an internal gateway. The mock-mode e2e stays the guard of the harness itself, and
npm run translate:eval -- --repeats 2runs offline without credentials.Design notes, including the measurements behind every number above:
docs/specs/2026-09-16-translate-eval-series-design.md.