Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/fixes/0000-merge-train-i18n-gates.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- **fix(release):** the local merge-train now runs the four i18n contract gates on every combined tree before an `--admin` merge — `i18n:check-keys` (every `en.json` key in all 65 dashboard catalogs), `i18n:check-keys:cli`, `i18n:check-ratio` (real-translation ratio) and the docs drift gate (`check-translation-drift.mjs`) — so a PR that adds dashboard keys without translations or edits a documented page without its mirrors is ejected from the train instead of landing on the release tip. Three such landings reached `release/v3.8.51` in 48 h (#13670, `1b2349de`, `7f1b4a5e`) although each PR's own CI was red on the same gates, because the train validated only typecheck, size/complexity and changelog integrity.
9 changes: 9 additions & 0 deletions scripts/release/merge-train.sh
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,15 @@ STATIC_GATES=(
"node scripts/check/check-complexity.mjs"
"node scripts/check/check-cognitive-complexity.mjs"
"env CHANGELOG_BASE_REF=${CHANGELOG_BASE_REF_Q} node scripts/check/check-changelog-integrity.mjs"
# i18n contract (2026-09-22): the train is where en.json keys without catalogs and docs
# without mirrors slipped into the release tip three times in 48 h despite the PR CI —
# each combined tree must carry every en key in all 65 catalogs (UI + CLI), keep the
# real-translation ratio, and bring the mirrors of every doc it edits (section-level:
# `npm run i18n:run -- --files=<doc>`; UI keys: `npm run i18n:translate-new-keys`).
"npm run i18n:check-keys"
"npm run i18n:check-keys:cli"
"npm run i18n:check-ratio"
"node scripts/i18n/check-translation-drift.mjs"
)
# Full mode: the box-speed runner (same coverage as the two CI shards combined —
# main + dashboard + serial groups — at local concurrency instead of runner-sized).
Expand Down
Loading