Problem
catalogParity fails on main — the Korean catalog is desynced from en for the whole Storage screen, so Frontend Tests is red for every open PR that touches website/:
FAIL src/i18n/catalogParity.test.ts > catalog parity > ko > has no key missing relative to en
missing 29 key(s), e.g. pages.sessionStorage.background_group, pages.sessionStorage.bulk_selected,
pages.sessionStorage.cannot_delete_resumable, pages.sessionStorage.cannot_delete_running, ...
FAIL src/i18n/catalogParity.test.ts > catalog parity > ko > has no key absent from en
36 stray key(s), e.g. pages.sessionStorage.batch_detail, pages.sessionStorage.bucket_30_90d,
pages.sessionStorage.bucket_30_90d_hint, pages.sessionStorage.bucket_7_30d, ...
Reproduced on a pristine kirocrew/main i18n tree (git checkout kirocrew/main -- website/src/i18n/ in an unrelated worktree, then run that one test): 2 failed | 75 passed (77), byte-identical to what the PR merge commits show.
Root cause
The two assertions are one event, not two bugs. ko.json was translated against the bucket-based Storage screen, and the inventory-model redesign replaced that key set without re-syncing Korean:
- the 36 "stray" keys are the retired bucket vocabulary (
bucket_7_30d, bucket_30_90d_hint, batch_detail, …) that only ko still carries;
- the 29 "missing" keys are the inventory vocabulary
en gained (bulk_selected, clear_selection, cannot_delete_running, cannot_delete_resumable, background_group, …) that ko never received.
So this is the rename half of a key migration applied to en and not to ko. ko is a comparatively new locale, which is why the gap did not exist when the redesign landed and appeared as soon as Korean was added to SUPPORTED_LANGUAGES.
Impact
Two layers:
- Product — a Korean user on the Storage page gets English for all 29 new strings, including the destructive-action confirmations (
cannot_delete_running, cannot_delete_resumable). Those are exactly the strings you least want falling back to a language the user did not choose.
- CI —
catalogParity runs in Frontend Tests, so this reds an unrelated PR's Frontend Tests → Coverage Gate → PR Readiness chain. Every author now has to prove the failure is not theirs before they can call their own PR green.
Suggested fix
Owned by whoever landed the inventory Storage redesign, since the Korean copy needs to match that screen's final vocabulary: delete the 36 retired bucket keys from ko.json and add the 29 inventory keys. Nothing else in the catalog is involved.
Worth considering separately: the guard catches the desync only once a locale is supported, so a key migration can sit latent in an unsupported locale and surface later as someone else's red build. Running parity over every catalog present on disk — not just SUPPORTED_LANGUAGES — would have failed this in the redesign's own PR.
Found while driving #2225, which touches no pages.sessionStorage key. (That PR did have its own genuine ko gap — 6 findingCard keys it added — and that half is fixed on its branch.)
Problem
catalogParityfails onmain— the Korean catalog is desynced fromenfor the whole Storage screen, soFrontend Testsis red for every open PR that toucheswebsite/:Reproduced on a pristine
kirocrew/maini18n tree (git checkout kirocrew/main -- website/src/i18n/in an unrelated worktree, then run that one test): 2 failed | 75 passed (77), byte-identical to what the PR merge commits show.Root cause
The two assertions are one event, not two bugs.
ko.jsonwas translated against the bucket-based Storage screen, and the inventory-model redesign replaced that key set without re-syncing Korean:bucket_7_30d,bucket_30_90d_hint,batch_detail, …) that onlykostill carries;engained (bulk_selected,clear_selection,cannot_delete_running,cannot_delete_resumable,background_group, …) thatkonever received.So this is the rename half of a key migration applied to
enand not toko.kois a comparatively new locale, which is why the gap did not exist when the redesign landed and appeared as soon as Korean was added toSUPPORTED_LANGUAGES.Impact
Two layers:
cannot_delete_running,cannot_delete_resumable). Those are exactly the strings you least want falling back to a language the user did not choose.catalogParityruns inFrontend Tests, so this reds an unrelated PR'sFrontend Tests→Coverage Gate→PR Readinesschain. Every author now has to prove the failure is not theirs before they can call their own PR green.Suggested fix
Owned by whoever landed the inventory Storage redesign, since the Korean copy needs to match that screen's final vocabulary: delete the 36 retired bucket keys from
ko.jsonand add the 29 inventory keys. Nothing else in the catalog is involved.Worth considering separately: the guard catches the desync only once a locale is supported, so a key migration can sit latent in an unsupported locale and surface later as someone else's red build. Running parity over every catalog present on disk — not just
SUPPORTED_LANGUAGES— would have failed this in the redesign's own PR.Found while driving #2225, which touches no
pages.sessionStoragekey. (That PR did have its own genuinekogap — 6findingCardkeys it added — and that half is fixed on its branch.)