Uh oh!
There was an error while loading. Please reload this page.
chore(i18n): delete the dead workflow.* and publicForm.demo.* namespaces from the ten packs (#4742) - #4743
Merged
Conversation
…espaces (#4742) 94 keys x 10 packs = 940 translated strings with no reader anywhere in the repo. `node scripts/check-i18n-dead-keys.mjs` scored `workflow.*` 54/58 CONFIRMED (the other 4 appear only as mentions in two i18n test fixtures) and `publicForm.demo.*` 36/36 CONFIRMED with zero textual footprint outside the packs. The plausible consumer of the workflow vocabulary, `packages/plugin-designer/src/ProcessDesigner.tsx`, hardcodes English and imports no translation hook at all, while six sibling components in the same package do use one. The two fixture files that named four `workflow.*` keys are pinning those specific keys, not merely using a key, so their rows are deleted rather than re-pointed: `ellipsis-glyph-3878.test.ts` carries a census of the keys that pass converged, and `untranslated-identity-4376.test.ts` carries a key-level allowlist whose entries are facts about one key's value. Part of #4730.
The latest updates on your projects. Learn more about Vercel for GitHub. |
yinlianghui
commented
Aug 15, 2026
CollaboratorAuthor
PM review — ACCEPT (reviewer of record, session Deletion-class, so all reference faces were independently re-run on
Changeset: Generated by Claude Code |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
yinlianghui
marked this pull request as ready for review
August 15, 2026 22:40
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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.
Part of #4730
Fixes#4742
Deletes two dead i18n namespaces from all ten locale packs:
workflow.*(58 keys) andpublicForm.demo.*(36 keys). 94 keys x 10 packs = 940 translated strings with no reader anywhere in the repo. No behaviour change is possible: a key with no reader cannot be read.Verified at
c0a3ba7b8(git rev-parse --short HEADat the run that produced every number below).Re-measured first — the umbrella's counts predate today's merges
node scripts/check-i18n-dead-keys.mjs --json, run on this tree before any edit (origin/mainataf460fb6d):workflow.*publicForm.demo.*The deltas are exact and account for the whole change: −94 pack keys (58 + 36), −90 CONFIRMED, −4 NEEDS-REVIEW (the four fixture-mentioned
workflow.*keys). Both namespaces are gone from the report; nothing else moved.Evidence per namespace — the #4658 / PR #4731 standard, re-verified independently
Zero call sites (AST pass). Every key in both namespaces was a candidate, which by construction means no literal
t()/tt()argument, no plural-suffixed spelling, noreturnObjectsbranch, and no dynamic template head reaches it. Cross-checked by hand:Both return nothing — no call site, and no object-path access to the namespaces either.
Zero textual footprint outside the packs (safety net). All 58
workflow.*keys greped as fixed strings across the whole repo return exactly four hits, all in i18n test fixtures (see below), and nothing else:publicForm.demoreturns zero hits repo-wide — the packs nest it as an object literal, so even its defining lines never spell the dotted form.Plausible-consumer spot check.
packages/plugin-designer/src/ProcessDesigner.tsximports no translation hook at all:It hardcodes the same vocabulary in English instead —
{ label: 'User Task', value: 'user-task' },{ label: 'Service Task', … },{ label: 'Exclusive Gateway', … }. This is not a package-wide absence of i18n: six sibling components in the same package (AppCreationWizard,DashboardEditor,ObjectManager,BrandingEditor,NavigationDesigner,FieldDesigner) do use a translation hook.ProcessDesigner.tsxalone was never wired up.Two checks beyond the card's standard, both clean:
../objectstackhas zero references to either namespace (its oneworkflow.hit is the filenameworkflow.zod.tsin a spec test — not an i18n key).scripts/i18n-en-drift-baseline.jsonnorscripts/i18n-call-site-key-baseline.jsonnames any key in either namespace, so no waiver ledger is left pointing at a deleted key.No key in either namespace turned out to have a live reader, so nothing was excluded from the deletion.
The four
workflow.*fixture mentions: rows deleted, not re-pointedBoth fixtures pin those specific keys rather than merely needing a key, so substituting a live key would make each file state something untrue. The card's other branch (update to live keys) does not apply to either.
ellipsis-glyph-3878.test.tscarriesCONVERGED_KEYS, a census of "every key that held an ASCII ellipsis in at least one of the ten packs on the commit before the fix".workflow.fromPlaceholderandworkflow.toPlaceholderwere two of the 35. Naming a different key there would claim that pass converged a key it never touched. Their rows are deleted, the length assertion moves 35 → 33, and the census note records why the number dropped — the historical "312 pack values changed" count is untouched, because retiring a key later does not change what that pass did.untranslated-identity-4376.test.tscarriesLEGITIMATE_IDENTITIES, a key-level allowlist where each entry is a fact about one key's value ('workflow.webhook': 'Webhook — the protocol term these packs use untranslated.'). An entry cannot outlive its key or be transferred to another one. Both entries are deleted, with a comment recording that the file's ownno dead entriesguard is what would have caught a leftover.Reverse verification (fix committed first, then the two fixture files alone reverted to
origin/mainwhile the pack deletions stayed):Expected direction, observed: red, both guards firing by name. Restored with
git checkout claude/issue-4742-dead-namespace-deletion --and the two fixture paths;git diff --stat HEADis empty, so the tree is byte-identical to the commit, and the suite was re-run green from that restored state.One bounded in-place fix, named
untranslated-identity-4376.test.ts's header said "22 keys below" while the list held 23 onorigin/main— nothing asserts that number, so an addition drifted it without anyone noticing. My deletion moves the same sentence again (to 21). Rather than restate a number that will drift a third time, the count is removed from the prose: the list is its own count, and the file'sno dead entriesassertion is what keeps it honest. Same file, same defect class (allowlist bookkeeping invalidated by this deletion), mechanical, no new verification surface.Out of scope, deliberately untouched
console.objectView.*(decision pending on #4730), the not-yet-spot-verified smaller namespaces, and red-ifying the dead-keys script (--strictstays unwired). One observation for #4730 rather than this PR: the parentpublicForm.*namespace is itself largely unread — 12 CONFIRMED and 7 NEEDS-REVIEW of its 19 remaining keys, with not()call site anywhere inpackages/orapps/. It is left exactly as it was; it belongs to the umbrella's namespace-by-namespace pass, not to this carve-out.Gates run — commands, so a re-test is a re-run
All at
c0a3ba7b8, from the repo root of a worktree cut fromaf460fb6d:The last one is the sweep of every consumer of the pack objects outside
packages/i18n— the files that importbuiltInLocalesand would see the deletion.check-i18n-en-driftabstaining rather than firing is the designed division of labour: deletions areall-locales-key-parity's business, and it is green.endrops 109 lines, the nine translation packs 106 each.Generated by Claude Code