From 049806cab3b36c538ae884cff1d8a57acd7871d3 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 21 Aug 2026 22:35:12 +0000 Subject: [PATCH] docs(i18n,plugin-dashboard): state the single-locale write rule instead of deferring to a closed card Three comments deferred the multi-locale-authoring product question to objectui#4163, which as of 2026-08-15 is closed as completed with that question still unanswered. Each therefore pointed at nothing while reading as though the question had been settled somewhere a reader could go and check. Remedy is objectui#5428's, not a re-pointing at a successor card: state the rule actually in force, keep the open product question open in place, and record why there is deliberately no tracker reference so the next reader cannot restore one. Re-pointing is how this class regenerates, because the next card closes too. The same wording form already landed in plugin-designer's writeWidgetTitle and in DashboardWidgetInspector. Sites: - packages/i18n/src/pickLocalized.ts - setLocalized's docblock (the site the card named). - packages/plugin-dashboard/src/WidgetConfigPanel.tsx - the I18nLabel banner comment (the second site the card named). - packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx - the pin test for that panel's deliberate non-behaviour, which carried the identical forward-looking claim. Not named by the card; found by sweeping the class rather than grepping the number. Historical attribution is deliberately untouched, per the card's own discrimination: citing a closed card for work it actually did is correct, and a merged historical fact cannot invert the way a live pointer does. The retained "the deferral this replaced named objectui#4163" clauses are themselves historical, matching the two landed precedents. Prose only - no behaviour, signature or assertion changes. --- .changeset/stale-4163-pointers-5591.md | 41 +++++++++++++++++++ packages/i18n/src/pickLocalized.ts | 11 ++++- .../src/WidgetConfigPanel.tsx | 7 +++- ...WidgetConfigPanel.inlineLocaleMap.test.tsx | 7 +++- 4 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 .changeset/stale-4163-pointers-5591.md diff --git a/.changeset/stale-4163-pointers-5591.md b/.changeset/stale-4163-pointers-5591.md new file mode 100644 index 000000000..7b77930b5 --- /dev/null +++ b/.changeset/stale-4163-pointers-5591.md @@ -0,0 +1,41 @@ +--- +'@object-ui/i18n': patch +--- + +`setLocalized`'s published docblock states the single-locale write rule that is +actually in force, instead of deferring the multi-locale-authoring question to a +closed card (objectui#5591). + +The docblock read "is not a multi-locale authoring UI (objectui#4163)". objectui#4163 +closed as completed on 2026-08-15 with that product question still unanswered, so the +parenthetical pointed at nothing — and it read as though the question had been settled +somewhere a reader could go and check. This is the failure mode objectui#5428 +demonstrated is not harmless: there, a dangling deferral of exactly this shape let an +expired justification sit unread for a release cycle at two surfaces. + +The remedy is objectui#5428's, not a re-pointing at a successor card: state the rule in +force (`setLocalized` reaches only the entry for the locale the author is in), keep the +open product question open **in place**, and record why there is deliberately no tracker +reference — so the next reader cannot restore one. Re-pointing is how the class +regenerates, because the next card closes too. The same wording form already landed in +`plugin-designer`'s `writeWidgetTitle` and `DashboardWidgetInspector`. + +Prose only. No behaviour, no signature, no test changes — `setLocalized`'s pairing with +`pickLocalized` is unchanged and still pinned by `src/__tests__/setLocalized.test.ts`. + +Declared as a `patch` for `@object-ui/i18n` alone because the emit was measured per +package rather than assumed, and the two packages this change touches differ: + +- `@object-ui/i18n` — the docblock sits on the **exported** `setLocalized`, so it reaches + the published artifacts. Rebuilt with `tsconfig.tsbuildinfo` cleared first (the build is + `composite`, which otherwise skips emit), and compared by SHA-256 rather than byte count: + `dist/pickLocalized.d.ts` `1e2170ad…` -> `124a1c07…` and `dist/pickLocalized.js` + `06eb88bd…` -> `568cb703…`. A consumer reads this text on hover and in the API docs, so + it publishes something. +- `@object-ui/plugin-dashboard` — the two comments changed there are a `//` banner between + declarations and a test docblock, neither attached to an exported declaration. + `dist/WidgetConfigPanel.d.ts` is **byte-identical** across the rebuild + (`93252e8cdf5a6faa…` both sides). The only artifact that moved is + `dist/WidgetConfigPanel.d.ts.map`, whose mappings shift because lines were added above + the declarations; no declaration text changed. Nothing user-visible publishes from that + package, so it is not named here. diff --git a/packages/i18n/src/pickLocalized.ts b/packages/i18n/src/pickLocalized.ts index 975d3b7d2..dc02e6dc6 100644 --- a/packages/i18n/src/pickLocalized.ts +++ b/packages/i18n/src/pickLocalized.ts @@ -129,8 +129,15 @@ function localeWriteKey( * the "saved" string vanishes — which is why they live in one file. * * ⚠️ This is the minimal non-destructive write for a SINGLE-locale editor. It - * is not a multi-locale authoring UI (objectui#4163) and does not pretend to - * be: an author can only ever reach the entry for the locale they are in. + * is not a multi-locale authoring UI and does not pretend to be: an author can + * only ever reach the entry for the locale they are in. + * + * Authoring every locale from one surface remains an OPEN product question, and + * is deliberately not deferred to a tracker here: the deferral this replaced + * named objectui#4163, which closed as completed on 2026-08-15 with the question + * still unanswered. A comment pointing at a closed card reads as though the + * question were settled somewhere, which is how the previous stale premise in + * this area survived unread. */ export function setLocalized( value: unknown, diff --git a/packages/plugin-dashboard/src/WidgetConfigPanel.tsx b/packages/plugin-dashboard/src/WidgetConfigPanel.tsx index 7628b339f..e9c721cfd 100644 --- a/packages/plugin-dashboard/src/WidgetConfigPanel.tsx +++ b/packages/plugin-dashboard/src/WidgetConfigPanel.tsx @@ -514,8 +514,11 @@ export interface WidgetConfigPanelProps { // WRITE `setLocalized(stored, language, edited)` — replace ONLY the active // locale's entry and carry every other locale across untouched. // -// A full multi-locale editor (authoring every locale in the panel) is -// objectui#4163's territory, not this one. +// A full multi-locale editor — authoring every locale from this panel — is NOT +// what this panel offers; it edits the active locale only. That remains an OPEN +// product question and is deliberately not deferred to a tracker here: the +// deferral this replaced named objectui#4163, which closed as completed on +// 2026-08-15 with the question still unanswered. // --------------------------------------------------------------------------- /** diff --git a/packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx b/packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx index 9fe4cc75e..a8ce1c2c0 100644 --- a/packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx +++ b/packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx @@ -40,8 +40,11 @@ * a different guarantee (a rebuild would add an entry for the active locale * to a map that never carried one). * - * A full multi-locale editor is objectui#4163's territory and is deliberately - * NOT asserted here. + * A full multi-locale editor is deliberately NOT asserted here — this suite pins + * the single-locale write rule above and nothing wider. Authoring every locale + * from one panel remains an OPEN product question, not deferred to a tracker + * here: the deferral this replaced named objectui#4163, which closed as + * completed on 2026-08-15 with the question still unanswered. */ import * as React from 'react';