Uh oh!
There was an error while loading. Please reload this page.
docs(i18n,plugin-dashboard): state the single-locale write rule instead of deferring to a closed card - #5643
Merged
Conversation
…ad 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.
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
os-sales
marked this pull request as ready for review
August 21, 2026 23:32
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.
Fixes#5591
Three comments deferred the multi-locale-authoring product question to
objectui#4163. That card is closed (completed, 2026-08-15) with the product
question still unanswered, so each deferral pointed at nothing — while reading
as though the question had been settled somewhere a reader could go and check.
Premise re-derived by code on
origin/mainBoth cited sites were verified at the line numbers the card gives, on
f1c27f037(merge-base):packages/i18n/src/pickLocalized.tspackages/plugin-dashboard/src/WidgetConfigPanel.tsxpackages/components/src/renderers/basic/record-picker.tsxgrep -c '4163'= 0, confirmedThe class sweep found a third site the card did not name
Grepping
4163alone under-reports — the #5590 precedent. Sweeping for theclaim (
multi-locale,authoring UI,territory,deferred,tracked in,pending,part 2, …) as well as the number turned up:packages/plugin-dashboard/src/__tests__/WidgetConfigPanel.inlineLocaleMap.test.tsx:43— "A full multi-locale editor is objectui#4163's territory and is deliberately
NOT asserted here." This is the pin test for the same panel's same
deliberate non-behaviour, carrying the identical forward-looking claim.
It is included deliberately, and named here rather than fixed quietly. Leaving
it would have shipped a PR whose source comment states the rule in force while
its own pin test one file away still defers to a closed card — the exact drift
that regenerates this class. It is the same defect class, a mechanical prose
fix whose correct form is already pinned by the landed precedents, in a file no
other in-flight claim holds (checked against the three sibling worktrees), and
in the same gate family with no new verification surface.
Within the two cited files themselves, the sweep found no further same-class
site: the other issue references there (
#3907,objectstack#6765,#4748,objectstack#5010,objectstack#7129,#5301,objectstack#5055,#4032)are all historical attribution, and
WidgetConfigPanel.tsx:487's "reserved forfuture UX" is a different claim that names no card.
Remedy — #5428's, not a re-pointing
⛔ No successor card is referenced, because re-pointing is how this class
regenerates: the next card closes too and the pointer dangles again. Each site
now states the rule actually in force (
setLocalizedreaches only the entry forthe locale the author is in), keeps the open product question open in place,
and records why there is deliberately no tracker reference — so the next reader
cannot restore one. This matches the wording form already landed in
plugin-designer'swriteWidgetTitleand inDashboardWidgetInspector.Historical attribution is untouched, per the card's own discrimination and
the #4319 precedent: 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 — they convert a live pointer into a record of why no pointer is
there.
Changeset — the
dist/*.d.tscriterion, measured per packageThis is a prose-only change, so the question is whether the comment reaches a
published
.d.ts. Measured at the realdist/path for each package, notgeneralised — and the two packages genuinely differ. Compared by SHA-256,
not byte count, with
packages/i18n/tsconfig.tsbuildinfodeleted before therebuild because that build is
compositeand would otherwise skip emit.@object-ui/i18n— the published artifacts DO move. The docblock sits onthe exported
setLocalized, sotsccarries it into both emitted files:@object-ui/plugin-dashboard— the published.d.tsdoes NOT move. Its twocomments are a
//banner between declarations and a test docblock, neitherattached to an exported declaration; the vite/
vite-plugin-dtsbuild stripsthem (
grep -rc '4163' dist/= 0 matches, andmulti-localelikewise):The only artifact that moved there is the declaration source map, whose
mappings shift because lines were added above the declarations — no declaration
text changed. So the changeset names
@object-ui/i18naspatchand does notname
plugin-dashboard.Two incidental corrections to the dispatch's framing, both measured rather than
assumed:
plugin-dashboardis not ESM-only — it publishesdist/index.umd.cjsunderexports['.'].require(there is indeed noindex.cjs, which is presumably what the note meant); and itstsbuildinfodoes not live inside
dist/—i18n's sits atpackages/i18n/tsconfig.tsbuildinfo,and
plugin-dashboardhas none at all, since it builds with vite.The gate decides, and its verdict line:
Verification — all at
049806cab, the final commitvitest run packages/i18n packages/plugin-dashboard(repo root,--maxWorkers=2)Test Files 124 passed (124)·Tests 1548 passed (1548)type-check(both packages)packages/i18n type-check: Done·packages/plugin-dashboard type-check: Donecheck-changeset-presence✅ … declares 1 changeset(s)check-changeset-no-major✅ No changeset declares a `major` bump.check-changeset-fixed✅ All workspace packages are in the changeset fixed group.check-control-bytes✅ check-control-bytes: OK (scanned 4691 tracked text file(s); skipped 85 binary).check-published-dist-tooling✅ No published package's build output carries tooling material.check-package-self-import✅ No package names itself inside its own src/.check-phantom-dependencies✅ Every in-scope import is declared by the package that publishes it.check-i18n-call-site-keysEvery in-scope call-site key resolves against the en pack (2918 keys)…check-i18n-en-driftNo en value changed in this range.Tests were run from the repo root (package-cwd
vitestis refused,objectui#3378), and the dependency closure was built first so the
type-checkverdict is a real one. Both pin suites are in the matched set —
vitest listenumerates 124 files including
setLocalized.test.ts,pickLocalized.test.tsand
WidgetConfigPanel.inlineLocaleMap.test.tsx— so the run is not azero-match silent pass; likewise both
type-checkscripts are echoed in thebuild log.
Declared narrowing: repo-wide
pnpm lint(turbo, 47 projects) was not runlocally — CI runs the farm exactly once regardless. In its place,
eslint --no-inline-config --format jsonwas run on the three changed files: 3 fileslinted, 0 errors, 27 warnings, every warning a pre-existing
no-explicit-any/react-refresh/only-export-componentson lines this diffdoes not touch. The narrowing excludes nothing, because
eslint.config.jsconfigures no type-aware linting (no
projectService, noparserOptions.project) — lint verdicts are per-file and syntactic, so acomment-only diff cannot move any untouched file's result.
Known-broken gauges, noted not fixed:
check-eager-closure-budget(exits 2)and
check-doc-snippet-types(exits 1) are broken independently of this change;a comment-only diff cannot affect either, and neither was run.
Generated by Claude Code
Generated by Claude Code