Follow-up to #4658, which deleted five specific dead keys
(console.objectView.striped/bordered/virtualScroll,
appDesigner.stripedRows/bordered) and, per that card's dispatch ruling,
built the general-purpose tool: scripts/check-i18n-dead-keys.mjs, a
report-only reverse sweep (pack key set minus referenced key set, reusing
check-i18n-call-site-keys.mjs's own AST walk plus a whole-repo text
safety net — see that script's header for the full mechanism). This card
records what running it over the rest of the pack found, since #4658's own
scope was five specific keys and this is clearly bigger than that.
What was measured
node scripts/check-i18n-dead-keys.mjs on top of #4658's PR (2927 pack keys,
13776 referenced):
626 candidate(s) with no call site this pass can see, across 58 namespace(s):
384 CONFIRMED (no textual footprint anywhere else in the repo either),
242 NEEDS-REVIEW (literal key string appears somewhere else in the repo —
an indirect reference the AST pass cannot see, e.g. a `labelKey:
'appDesigner.layoutSidebar'` property consumed through a variable).
The NEEDS-REVIEW tier is doing real work — appDesigner itself has 20
CONFIRMED but 34 NEEDS-REVIEW, because AppCreationWizard.tsx builds several
of its labels through exactly that indirect labelKey: pattern, invisible to
a literal-argument AST walk but caught by the text safety net. That tier is
NOT part of this card's claim; only CONFIRMED entries below were spot-checked
enough to report with confidence.
The two largest, spot-verified instances
workflow.* — 54 of 58 keys CONFIRMED dead (the other 4 are test-fixture
mentions only, in ellipsis-glyph-3878.test.ts and
untranslated-identity-4376.test.ts — not consumers). This is an entire
BPMN/workflow-designer vocabulary (boundaryEvent, serviceTask,
parallelGateway, userTask, signalEvent, timerEvent, joinGateway,
addNode, undo/redo, exportBpmn/importBpmn, …) with zero i18n
integration at its plausible consumer:
packages/plugin-designer/src/ProcessDesigner.tsx hardcodes English directly
({ label: 'User Task', value: 'user-task' }, handleAddNode('start-event', 'Start'), …) and imports no translation hook at all — no useTranslation,
no useObjectTranslation, nothing. Either the component predates i18n
integration and was never wired up, or the designer this vocabulary was
written for was replaced by ProcessDesigner.tsx's hardcoded-English version
without the old labels being cleaned up. Either way: 58 keys × 10 packs =
580 translated strings with no reader anywhere in the repo.
console.objectView.* — 116 of 154 keys CONFIRMED dead, on top of the
three #4658 already removed. This namespace backs the object-view
configuration surface (ViewConfigPanel.tsx et al.), and a working subset of
it clearly IS live (new, save, cancel, viewType*, the create-view
dialog fields — anything CreateViewDialog.tsx / ObjectView.tsx /
ViewConfigPanel.tsx call t() for directly). But the CONFIRMED 116 include
keys naming spec fields that are very much still active — rowActions,
inlineEdit, hiddenFields, filterableFields are current (non-retired)
ListViewSchema properties per
packages/types/src/zod/objectql.zod.ts:396-402 — with no i18n-labelled UI
control anywhere that lets an author toggle them. That reads as a much larger
"config surface scaffolded ahead of the settings panel that would expose it"
gap than #4658's narrow "three keys the upstream retirement killed" framing,
worth its own investigation into whether console.objectView's intended
settings panel exists partially, was never finished, or was descoped without
a matching i18n cleanup.
Other namespaces worth a look (CONFIRMED / NEEDS-REVIEW, from the same run)
| Namespace | Confirmed | Needs-review |
|---|
console.objectView | 116 | 38 |
workflow | 54 | 4 |
publicForm.demo | 36 | 0 |
appDesigner | 20 | 34 |
configPanel | 16 | 0 |
renderer | 13 | 0 |
table | 10 | 2 |
report | 10 | 1 |
search | 9 | 0 |
form | 8 | 2 |
publicForm.demo (36/36 confirmed, spot-checked: zero hits anywhere for
publicForm.demo.* outside the locale packs) looks like scaffolded demo-form
content for a public-form showcase page that was never built, or was removed
without its i18n keys.
Suggested scope for whoever picks this up
Re-run node scripts/check-i18n-dead-keys.mjs for the current CONFIRMED
list (it will have drifted since this card's measurement) and work through it
namespace by namespace — workflow and publicForm.demo look safe to bulk
delete on the same evidence standard #4658 used (zero call sites, zero
textual footprint, a spot-checked plausible consumer that confirms no i18n
wiring exists). console.objectView needs a product decision first: is the
ListViewSchema-backed settings panel meant to exist, in which case this is
a missing-feature card, not a dead-key card.
Whether to red-ify check-i18n-dead-keys.mjs
Explicitly deferred by #4658's own ruling — it stays report-only
(--strict exists but nothing calls it). This card's data point: 242/626
(38.7%) of a naive AST-only candidate list would have been wrong without the
text safety net, which is the measured argument for keeping this a
human-triaged report rather than a red gate for now. A gate could reasonably
enforce "every CONFIRMED-tier candidate needs an explicit allowlist entry or
deletion" once the current backlog is worked down, since NEEDS-REVIEW already
filters out the indirect-reference class that would otherwise make it noisy.
Follow-up to #4658, which deleted five specific dead keys
(
console.objectView.striped/bordered/virtualScroll,appDesigner.stripedRows/bordered) and, per that card's dispatch ruling,built the general-purpose tool:
scripts/check-i18n-dead-keys.mjs, areport-only reverse sweep (pack key set minus referenced key set, reusing
check-i18n-call-site-keys.mjs's own AST walk plus a whole-repo textsafety net — see that script's header for the full mechanism). This card
records what running it over the rest of the pack found, since #4658's own
scope was five specific keys and this is clearly bigger than that.
What was measured
node scripts/check-i18n-dead-keys.mjson top of #4658's PR (2927 pack keys,13776 referenced):
The NEEDS-REVIEW tier is doing real work —
appDesigneritself has 20CONFIRMED but 34 NEEDS-REVIEW, because
AppCreationWizard.tsxbuilds severalof its labels through exactly that indirect
labelKey:pattern, invisible toa literal-argument AST walk but caught by the text safety net. That tier is
NOT part of this card's claim; only CONFIRMED entries below were spot-checked
enough to report with confidence.
The two largest, spot-verified instances
workflow.*— 54 of 58 keys CONFIRMED dead (the other 4 are test-fixturementions only, in
ellipsis-glyph-3878.test.tsanduntranslated-identity-4376.test.ts— not consumers). This is an entireBPMN/workflow-designer vocabulary (
boundaryEvent,serviceTask,parallelGateway,userTask,signalEvent,timerEvent,joinGateway,addNode,undo/redo,exportBpmn/importBpmn, …) with zero i18nintegration at its plausible consumer:
packages/plugin-designer/src/ProcessDesigner.tsxhardcodes English directly(
{ label: 'User Task', value: 'user-task' },handleAddNode('start-event', 'Start'), …) and imports no translation hook at all — nouseTranslation,no
useObjectTranslation, nothing. Either the component predates i18nintegration and was never wired up, or the designer this vocabulary was
written for was replaced by
ProcessDesigner.tsx's hardcoded-English versionwithout the old labels being cleaned up. Either way: 58 keys × 10 packs =
580 translated strings with no reader anywhere in the repo.
console.objectView.*— 116 of 154 keys CONFIRMED dead, on top of thethree #4658 already removed. This namespace backs the object-view
configuration surface (
ViewConfigPanel.tsxet al.), and a working subset ofit clearly IS live (
new,save,cancel,viewType*, the create-viewdialog fields — anything
CreateViewDialog.tsx/ObjectView.tsx/ViewConfigPanel.tsxcallt()for directly). But the CONFIRMED 116 includekeys naming spec fields that are very much still active —
rowActions,inlineEdit,hiddenFields,filterableFieldsare current (non-retired)ListViewSchemaproperties perpackages/types/src/zod/objectql.zod.ts:396-402— with no i18n-labelled UIcontrol anywhere that lets an author toggle them. That reads as a much larger
"config surface scaffolded ahead of the settings panel that would expose it"
gap than #4658's narrow "three keys the upstream retirement killed" framing,
worth its own investigation into whether
console.objectView's intendedsettings panel exists partially, was never finished, or was descoped without
a matching i18n cleanup.
Other namespaces worth a look (CONFIRMED / NEEDS-REVIEW, from the same run)
console.objectViewworkflowpublicForm.demoappDesignerconfigPanelrenderertablereportsearchformpublicForm.demo(36/36 confirmed, spot-checked: zero hits anywhere forpublicForm.demo.*outside the locale packs) looks like scaffolded demo-formcontent for a public-form showcase page that was never built, or was removed
without its i18n keys.
Suggested scope for whoever picks this up
Re-run
node scripts/check-i18n-dead-keys.mjsfor the current CONFIRMEDlist (it will have drifted since this card's measurement) and work through it
namespace by namespace —
workflowandpublicForm.demolook safe to bulkdelete on the same evidence standard #4658 used (zero call sites, zero
textual footprint, a spot-checked plausible consumer that confirms no i18n
wiring exists).
console.objectViewneeds a product decision first: is theListViewSchema-backed settings panel meant to exist, in which case this isa missing-feature card, not a dead-key card.
Whether to red-ify
check-i18n-dead-keys.mjsExplicitly deferred by #4658's own ruling — it stays report-only
(
--strictexists but nothing calls it). This card's data point: 242/626(38.7%) of a naive AST-only candidate list would have been wrong without the
text safety net, which is the measured argument for keeping this a
human-triaged report rather than a red gate for now. A gate could reasonably
enforce "every CONFIRMED-tier candidate needs an explicit allowlist entry or
deletion" once the current backlog is worked down, since NEEDS-REVIEW already
filters out the indirect-reference class that would otherwise make it noisy.