Skip to content

docs(i18n,plugin-dashboard): state the single-locale write rule instead of deferring to a closed card - #5643

Merged
os-sales merged 1 commit into
mainfrom
claude/issue-5591-stale-4163-pointers
Aug 21, 2026
Merged

docs(i18n,plugin-dashboard): state the single-locale write rule instead of deferring to a closed card#5643
os-sales merged 1 commit into
mainfrom
claude/issue-5591-stale-4163-pointers

Conversation

@os-sales

Copy link
Copy Markdown
Collaborator

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/main

Both cited sites were verified at the line numbers the card gives, on
f1c27f037 (merge-base):

SiteCard saysFound
packages/i18n/src/pickLocalized.ts:132:132, verbatim
packages/plugin-dashboard/src/WidgetConfigPanel.tsx:518:518, verbatim
packages/components/src/renderers/basic/record-picker.tsxswept by #5590grep -c '4163' = 0, confirmed

The class sweep found a third site the card did not name

Grepping 4163 alone under-reports — the #5590 precedent. Sweeping for the
claim (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 for
future 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 (setLocalized reaches only the entry for
the 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's writeWidgetTitle and in DashboardWidgetInspector.

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.ts criterion, measured per package

This is a prose-only change, so the question is whether the comment reaches a
published .d.ts. Measured at the real dist/ path for each package, not
generalised — and the two packages genuinely differ. Compared by SHA-256,
not byte count, with packages/i18n/tsconfig.tsbuildinfo deleted before the
rebuild because that build is composite and would otherwise skip emit.

@object-ui/i18n — the published artifacts DO move. The docblock sits on
the exportedsetLocalized, so tsc carries it into both emitted files:

dist/pickLocalized.d.ts 1e2170ad… -> 124a1c07…
dist/pickLocalized.js 06eb88bd… -> 568cb703…

@object-ui/plugin-dashboard — the published .d.ts does NOT move. Its two
comments are a // banner between declarations and a test docblock, neither
attached to an exported declaration; the vite/vite-plugin-dts build strips
them (grep -rc '4163' dist/ = 0 matches, and multi-locale likewise):

dist/WidgetConfigPanel.d.ts 93252e8cdf5a6faa… -> 93252e8cdf5a6faa… (identical)
dist/WidgetConfigPanel.d.ts.map b24aea04… -> 91fea81d… (line offsets only)

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/i18n as patch and does not
name plugin-dashboard.

Two incidental corrections to the dispatch's framing, both measured rather than
assumed: plugin-dashboard is not ESM-only — it publishes
dist/index.umd.cjs under exports['.'].require (there is indeed no
index.cjs, which is presumably what the note meant); and its tsbuildinfo
does not live inside dist/i18n's sits at packages/i18n/tsconfig.tsbuildinfo,
and plugin-dashboard has none at all, since it builds with vite.

The gate decides, and its verdict line:

✅ 3 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/stale-4163-pointers-5591.md.

Verification — all at 049806cab, the final commit

CheckVerdict
vitest 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: Done
check-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 vitest is refused,
objectui#3378), and the dependency closure was built first so the type-check
verdict is a real one. Both pin suites are in the matched set — vitest list
enumerates 124 files including setLocalized.test.ts, pickLocalized.test.ts
and WidgetConfigPanel.inlineLocaleMap.test.tsx — so the run is not a
zero-match silent pass; likewise both type-check scripts are echoed in the
build log.

Declared narrowing: repo-wide pnpm lint (turbo, 47 projects) was not run
locally — CI runs the farm exactly once regardless. In its place, eslint --no-inline-config --format json was run on the three changed files: 3 files
linted, 0 errors, 27 warnings
, every warning a pre-existing
no-explicit-any / react-refresh/only-export-components on lines this diff
does not touch. The narrowing excludes nothing, because eslint.config.js
configures no type-aware linting (no projectService, no
parserOptions.project) — lint verdicts are per-file and syntactic, so a
comment-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

…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.
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3785.8 KB3867.2 KB
Main entry chunk (gzip)151.7 KB350 KB
Entry fileindex-B__lABZE.js
StatusPASS

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

PackageSizeGzipped
app-shell (index.js)10.04KB3.72KB
app-shell (runtime-config.js)8.91KB2.99KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)29.34KB7.05KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)6.35KB2.43KB
auth (index.js)2.77KB1.22KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.02KB0.89KB
auth (useIsWorkspaceAdmin.js)3.04KB1.45KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)507.00KB113.72KB
core (index.js)4.51KB1.80KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)159.80KB44.33KB
fields (index.js)238.85KB60.13KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)23.13KB7.63KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.35KB3.31KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.42KB1.42KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.81KB0.83KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.65KB18.32KB
plugin-chatbot (index.js)181.41KB43.22KB
plugin-dashboard (index.js)128.33KB32.93KB
plugin-designer (index.js)212.30KB42.80KB
plugin-detail (index.js)242.16KB60.90KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)125.07KB30.43KB
plugin-gantt (index.js)164.10KB39.87KB
plugin-grid (index.js)200.79KB54.26KB
plugin-kanban (index.js)52.93KB14.60KB
plugin-list (index.js)111.70KB27.17KB
plugin-map (index.js)20.06KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.50KB20.68KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)43.66KB14.77KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.33KB0.69KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (index.js)4.77KB2.16KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)10.76KB3.17KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)6.92KB2.40KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)3.08KB1.53KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-sales
os-sales marked this pull request as ready for review August 21, 2026 23:32
@os-sales
os-sales added this pull request to the merge queueAug 21, 2026
Merged via the queue into main with commit b2437a7Aug 21, 2026
23 checks passed
@os-sales
os-sales deleted the claude/issue-5591-stale-4163-pointers branch August 21, 2026 23:33
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] Two more comments still name #4163 as the live tracker for the multi-locale label editor; #4163 closed 2026-08-15

2 participants

@os-sales@claude