Repository navigation
docs(i18n): refresh the mirrors and keys the base left behind; warn on stale mirrors - #14166
Merged
Merged
Conversation
…lder source check-translation-drift.mjs compared only the top-level source_hash of .i18n-state.json. A partial refresh run (17 of 65 locales retranslated before an upstream quota 429) bumps that hash while the interrupted locales keep the old one in locales[code].source_hash — the source no longer reads as changed, the stale mirrors' target hashes still match, and the gate said PASS for 703 stale mirrors. findStaleTargets() now reports every locale record behind its source.
…e ones Section-level retranslation of the docs edited on release/v3.8.51 after the full-coverage cut (README, API_REFERENCE, ENVIRONMENT, FEATURE_FLAGS, PROVIDER_REFERENCE, REASONING_REPLAY, SOCKET_DEV_FINDINGS, admission-lanes, ...): 20 locales complete on the Codex backend before its accounts hit their quota threshold (429, reset in ~146 h); the alternative routes on the LAN instance (auto/gemini -> dva 500, kilocode 401, zai/opencode/cloudflare down, auto/claude-opus at ~30 s per chunk with socket drops) did not converge, so the remaining 689 mirrors stay stale until the quota returns. check-translation-drift.mjs now lists those stale mirrors (locale record behind the top-level source_hash) as a non-blocking warning instead of silently passing; documented in docs/guides/I18N.md.
…logs 1b2349d (Claude OAuth lower-priority lane) and 7f1b4a5 (sidebar pinned items) added 7 keys to en.json and to no other catalog, so 65 locales missed them and i18n:check-keys was red on the tip. sync-ui-keys --translate-markers over the 65 catalogs (444 leaves) on the auto/claude-opus combo of the LAN instance; zh provider term normalised; gates green.
This was referenced Sep 21, 2026
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…n stale mirrors (cheaper-inference#14166) * fix(i18n): make the docs drift gate flag mirrors translated from an older source check-translation-drift.mjs compared only the top-level source_hash of .i18n-state.json. A partial refresh run (17 of 65 locales retranslated before an upstream quota 429) bumps that hash while the interrupted locales keep the old one in locales[code].source_hash — the source no longer reads as changed, the stale mirrors' target hashes still match, and the gate said PASS for 703 stale mirrors. findStaleTargets() now reports every locale record behind its source. * docs(i18n): refresh the mirrors the base left behind and warn on stale ones Section-level retranslation of the docs edited on release/v3.8.51 after the full-coverage cut (README, API_REFERENCE, ENVIRONMENT, FEATURE_FLAGS, PROVIDER_REFERENCE, REASONING_REPLAY, SOCKET_DEV_FINDINGS, admission-lanes, ...): 20 locales complete on the Codex backend before its accounts hit their quota threshold (429, reset in ~146 h); the alternative routes on the LAN instance (auto/gemini -> dva 500, kilocode 401, zai/opencode/cloudflare down, auto/claude-opus at ~30 s per chunk with socket drops) did not converge, so the remaining 689 mirrors stay stale until the quota returns. check-translation-drift.mjs now lists those stale mirrors (locale record behind the top-level source_hash) as a non-blocking warning instead of silently passing; documented in docs/guides/I18N.md. * fix(i18n): translate the 7 dashboard keys the base added without catalogs 2fd608d (Claude OAuth lower-priority lane) and 6c13392 (sidebar pinned items) added 7 keys to en.json and to no other catalog, so 65 locales missed them and i18n:check-keys was red on the tip. sync-ui-keys --translate-markers over the 65 catalogs (444 leaves) on the auto/claude-opus combo of the LAN instance; zh provider term normalised; gates green. * docs(i18n): adopt the API_REFERENCE and MEMORY mirrors the base refreshed
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.
Summary
Steady-state maintenance after the three final i18n adjustments (#13996 gate + skills, #14078 review of 64 locales, #14106 every doc in 65 locales). Between the cut of #14106 and its merge,
release/v3.8.51kept moving: docs were edited without their mirrors and dashboard keys were added without their catalogs. This PR brings both back and fixes a blind spot the interruption exposed in the drift gate.Mirrors
Section-level retranslation of the docs the base edited on 2026-09-18 (
README.md,SECURITY.md,API_REFERENCE,ENVIRONMENT,FEATURE_FLAGS,PROVIDER_REFERENCE,REASONING_REPLAY,SOCKET_DEV_FINDINGS,EMBEDDED-SERVICES, the newadmission-lanes.md, …) — 20 locales complete (≈ 350 mirrors) before the LAN instance's Codex accounts hit their quota threshold (429 — All codex accounts reached configured quota threshold, reset in ~146 h). Every other route on that instance was tried and does not converge for 40 KB documents (auto/gemini→dva/*500, Kilocode 401, Z.ai/OpenCode/Cloudflare-playground down,auto/claude-opusat 17–40 s per 4 KB with socket drops), so 689 mirrors in 45 locales stay stale until the quota returns (~2026-09-24) — listed by the gate, see below.Dashboard keys
1b2349de(Claude OAuth lower-priority lane) and7f1b4a5e(sidebar pinned items) added 7 keys toen.jsononly;i18n:check-keyswas red on the tip for 65 locales.sync-ui-keys --translate-markersover the 65 catalogs: 444 leaves translated (theauto/claude-opuscombo handles short UI strings fine), zh provider term normalised, 0__MISSING__.Drift gate (
scripts/i18n/check-translation-drift.mjs)The gate compared only the top-level
source_hashof.i18n-state.json. A refresh run interrupted halfway bumps that hash for the locales it finished while the others keep the old one inlocales[code].source_hash: the source no longer reads as changed, the stale mirrors' own hashes still match, and the gate reported PASS for 703 stale mirrors.findStaleTargets()(exported,tests/unit/i18n-translation-drift-stale-targets.test.ts) now lists every locale record behind its source as a warning — not a failure, because the only way to produce it is a backend outage nobody can fix in-branch, and turning every PR's CI red for six days helps no one. Documented indocs/guides/I18N.md("Stale mirrors after an interrupted refresh"); the list is the work order fornpm run i18n:run -- --locale=<code> --files=<sources>.Validation
npm run i18n:checkWARN stale targets (689)npm run i18n:check-keysnpm run i18n:check-ratioi18n:check-glossaryzh-CN / zh-TW / koi18n-placeholder-parity,feature-flag-description-icu-parse-12505,dashboard-localization-contract,server-owned-tool-loop-flag,i18n-home-recent-requests-topology-legend,i18n-cli-namespaces,i18n-key-completeness,i18n-translation-drift-stale-targetsEMBEDDED-SERVICES.mdmirrors (the source table grew)No production code touched.
cd4c6f69in a detached worktree outside this branch, in files this PR does not touch (the PR diff is 357 mirrors underdocs/i18n/**, the 65 catalogs,.i18n-state.json,scripts/i18n/check-translation-drift.mjs+ its test anddocs/guides/I18N.md):Docs Gates(env/doc contract:BRIDGE_PORT,CERT_DIR,NEXT_PUBLIC_PORT,OPENWA_SERVICE_PORT,ROUTER_URLin code but not in.env.exampleon the tip);Merge integrity(check:agent-skills-syncwants to generateomni-version-manager— fails the same way on #14155, #14156, #14159, #14161, #14164);No new ESLint warnings(cliRuntime.ts,arena-elo-sync-redesign.test.ts,compressionAnalyticsWriterFlatRate.test.tsunused vars);check-api-typecheck(rerankProviderNodes.tsTS2677 and one more); the fast gates (proxySaveRefresh.test.tsxTS2698,antigravity.tsTS2677,Sidebar.tsxTS2339, 12 covering tests missing fromstryker.conf.json); and 21 unit test files failing on the tip with the same test names (telegram-keycache-bounded-13165fails to importisModelBlockedByPatternsfrom@/lib/db/apiKeyson both):agy-antigravity-shared-catalog-12724,build/dockerfile-better-sqlite3-native,case-collision-6584,chat-route-coverage,check-env-doc-sync,cli-runtime-extended,command-code-mimo-v2-5-safety,compression/caveman-v379,executor-default-base,hard-session-lease-bypass-inventory,issue-7793-env-doc-sync-repro,lib/rate-limit-maxwaitms-disable-execution,media-page-client-browser-bundle,pack-artifact-entrypoint-closures,pack-artifact-server-ws-closure,provider-assets-generic-fallback,qodercli-windows-resolve-6263,route-body-validation-t06,t28-model-catalog-updates,telegram-keycache-bounded-13165,upstream-headers-proxy-auth.