From fff1a29b6018d3c734bd5fc0b5ce74ea73b11f7d Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 10 Sep 2026 11:26:29 +0000 Subject: [PATCH] ci: run pnpm lint:i18n-gate in the verify job MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI ran three of this project's four gates. `pnpm lint:i18n-gate` existed as a script, `scripts/check-lint-i18n-gate.mjs` implemented it, and every dev ran it by hand — nothing made it unskippable, which is the one thing this workflow exists to do. A missing translation key is exactly the silent class the file's header names. `fallbackLocale: 'en'` renders a key missing from `zh-CN` as its English source string: no error, no warning, nothing on screen that tells a gap from a translation. `pnpm lint` does not catch it either — `objectstack lint` exits non-zero only on rule-level ERRORS and a non-default-locale gap is a WARNING, so the fallback hides the gap on screen and the exit code hides it in CI. This is a two-locale repo by rule (DESIGN.md 11: en default, zh-CN full second bundle) and the two bundles are edited together on nearly every card that touches a user-visible string. This gate is the only check that they stayed in step, and it was the only one left to memory. One step, appended after `pnpm typecheck` in the existing `verify` job. No new job, no caching change, no action-version bump, no existing step reordered. `package.json`'s `verify` script already composes all four; the divergence was CI's alone. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01R3n3GGzobdegM4HUzah1iR --- .github/workflows/ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 18a128d..cbee3a4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,3 +65,11 @@ jobs: - run: pnpm lint - run: pnpm typecheck + + # Same silent class as `validate`, one layer up: `fallbackLocale: 'en'` + # renders a key missing from `zh-CN` as its English source string — no + # error, no warning, nothing on screen that tells a gap from a + # translation. `pnpm lint` does not catch it either; a non-default-locale + # gap is a WARNING there, and `objectstack lint` exits non-zero only on + # ERRORS. This is the step that fails the build on one. + - run: pnpm lint:i18n-gate