Skip to content

fix(i18n): de auth.device.* moves to the passive register - #6685

Merged
os-sales merged 1 commit into
mainfrom
claude/issue-6611-de-auth-device-passive-register
Aug 28, 2026
Merged

fix(i18n): de auth.device.* moves to the passive register#6685
os-sales merged 1 commit into
mainfrom
claude/issue-6611-de-auth-device-passive-register

Conversation

@os-sales

Copy link
Copy Markdown
Collaborator

Fixes#6611

Ruling implemented: option 2, the passive register

Per triage's 2026-08-27 ruling: packages/i18n/src/locales/de.ts's auth.device.*
in-flight states move to the passive, and the LOADING_GROUP_FORKS exemption row
for auth.device.loading is deleted since it no longer applies.

keyfromto
auth.device.approvingGenehmige…Wird genehmigt…
auth.device.denyingAblehne…Wird abgelehnt…
auth.device.loadingLade…Wird geladen…

Graded a Bug, not a taste call: ablehnen is a separable-prefix verb, so the
first-person singular is ich lehne abAblehne… was not a grammatical German
form, and the pack shipped it on DeviceAuthPage.tsx to users today.

Premise re-derived before touching anything

Triage's basis for option 2: "the de pack's dominant in-flight register is the
passive, at roughly 37 values whose en is a bare gerund rendering as Wird …."

Re-counted against the tree with a Unicode-aware (\p{L}, u flag), position-aware
query — en value matching ^\p{L}+ing…$ (a bare single-word gerund + U+2026), de
value matching ^Wird\s.+…$ (passive auxiliary as the first word) — with a positive
control on common.loading (en "Loading…" / de "Wird geladen…", both match) so a
low or zero count would be distinguishable from a broken query:

  • 40 of 61en-bare-gerund keys render de as Wird … (≈66%), vs. 21 that
    don't — all three auth.device.* keys correctly fell in the 21 pre-fix, confirming
    the query's internal consistency.
  • 40 is close to triage's "roughly 37" (same order of magnitude, exact figure depends
    on the precise regex shape — e.g. topbar.connection.connecting/reconnecting
    render Verbindung wird hergestellt…, a passive construction but not
    first-word Wird, so my position-aware definition doesn't count them either way).
  • Dominance holds clearly in both counts. Proceeding on option 2 as ruled.

The LOADING_GROUP_FORKS row deleted, and why

auth.device.loading was the sole member of objectui#5972's merged Loading… group
carved out by name, because converging it alone while approving/denying stayed
first-person would have manufactured a new same-screen inconsistency
(Genehmige… / Ablehne… / Wird geladen…). Moving the whole namespace to the passive
removes that fork rather than maintaining it:

  • LOADING_GROUP_FORKS is now [].
  • The 'pins the forked values...' test asserts toHaveLength(0) instead of (1).
  • The two trailing assertions that pinned approving/denying as the fork's
    first-person "reason" (Genehmige…/Ablehne…) are removed — the fork itself is
    gone, so pinning its old reason would just re-fail on this very PR.
  • The JSDoc block documenting the fork (## The de fork, and why it is exempted BY NAME) is updated to past tense with a resolved by objectui#6611 pointer, the
    same class of edit PR fix(i18n): ar spells the standalone participle جارٍ pack-wide, not two ways #6675 made to this file's ar note earlier today for the
    same reason (a present-tense claim about the code had gone stale).

The gate interaction holds: auth.device.loading's en value never moves, so
the #5972 block's derives the group from en and finds exactly the ten keys pinned above test — which derives LOADING_GROUP fresh from en === 'Loading…' — stays
green unchanged (verified below).

Scope

Exactly 3 values in de.ts, 1 pin row deleted (plus the consequential test-file
edits it forces: the length assertion and the two now-false trailing assertions
described above). No key added or removed. No en value moved (confirmed by
check-i18n-en-drift.mjs: 0 en values changed). No other locale touched.

Gates

All commands run from the repo root per this repo's vitest-invocation convention;
exit codes captured via EXIT=$? immediately after redirect, never after a pipe.
Verdicts quoted from each command's own printed output on the final commit
(817a615e5).

GateCommandResult
packages/i18n vitest scopepnpm exec vitest run packages/i18n/Test Files 58 passed (58) / Tests 927 passed (927), exit 0
Pin file alone (verbose)pnpm exec vitest run packages/i18n/src/__tests__/ellipsis-glyph-3878.test.tsTests 7 passed (7), exit 0 — including the #5972 group-derivation test
Type-checkpnpm --filter '@object-ui/i18n^...' build then pnpm --filter @object-ui/i18n type-checktsc --noEmit && tsc -p tsconfig.test.json, exit 0 (had to build @object-ui/core/@object-ui/types first — stale dist/*.d.ts failed with TS6305 before that)
check:control-bytesnode scripts/check-control-bytes.mjs✅ OK (scanned 5529 tracked text file(s); skipped 85 binary)
Hand control-byte scangrep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' <changed files>no matches (exit 1 = not found)
check-i18n-en-driftnode scripts/check-i18n-en-drift.mjs0 en value(s) changed ... No en value changed in this range.
check-i18n-dead-keysnode scripts/check-i18n-dead-keys.mjsreport-only, exit 0, no new findings from this diff
check-i18n-call-site-keysnode scripts/check-i18n-call-site-keys.mjsexit 0, all call sites/keys/interpolation clean
Changeset presencenode scripts/check-changeset-presence.mjs✅ 2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)
Changeset no-majornode scripts/check-changeset-no-major.mjs✅ No changeset declares a major bump

Ablation (predicted before running)

Prediction: only auth.device.loading is a member of LOADING_GROUP (approving/
denying are outside it — their en is Approving…/Denying…, not Loading…).
Reverting auth.device.loading alone to its old spelling should turn the #5972
uniformity test red, naming de and auth.device.loading specifically, since
LOADING_GROUP_FORKS is now empty and nothing exempts it.

  1. Committed the real fix first (817a615e5), so the ablation has a real restore
    point (never mutate uncommitted work — AGENTS.md).
  2. Mutated line 2029 of de.ts only (sed -i '2029s/.../loading: "Lade…",/'),
    confirmed on disk by counting the anchor text, not git diff --stat (equal-length
    substitution): "Wird geladen…" occurrences 8 → 7, loading: "Lade…"0 → 1.
  3. Ran the pin file: red, as predicted
    holds one rendering per language across the group, apart from the named forks
    failed with de: 2 renderings — "Wird geladen…" on ... | "Lade…" on auth.device.loading. 6/7 passed, 1/7 failed, exit 1.
  4. Restored: git checkout HEAD -- packages/i18n/src/locales/de.ts. Confirmed by
    git diff HEAD (empty) and git status --short (clean) — not by exit code.
    Re-counted the anchor: "Wird geladen…" back to 8, line 2029 back to
    loading: "Wird geladen…",.
  5. Re-ran the pin file on the restored tree: green, Tests 7 passed (7), exit 0.

Generated by Claude Code

Genehmige…/Ablehne…/Lade… -> Wird genehmigt…/Wird abgelehnt…/Wird geladen….
Ablehne… was not a grammatical German form (ablehnen is separable-prefix;
first person is "ich lehne ab"). Converging the whole namespace to the
passive -- the pack's measured dominant in-flight register -- resolves that
bug and removes the LOADING_GROUP_FORKS exemption for auth.device.loading
rather than maintaining it.
Fixes#6611
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3236.9 KB3266.6 KB
Main entry chunk (gzip)157.3 KB350 KB
Entry fileindex-ConRgdgS.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 (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)11.89KB4.50KB
app-shell (runtime-config.js)20.61KB7.35KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
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)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
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.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
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)509.24KB115.61KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.10KB47.96KB
fields (index.js)239.05KB60.06KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
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.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
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.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.85KB12.89KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)190.33KB45.10KB
plugin-dashboard (index.js)133.43KB34.48KB
plugin-designer (index.js)212.80KB43.15KB
plugin-detail (index.js)245.29KB62.39KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)132.01KB32.23KB
plugin-gantt (index.js)165.16KB40.33KB
plugin-grid (index.js)201.51KB54.54KB
plugin-kanban (index.js)53.11KB14.62KB
plugin-list (index.js)112.86KB27.54KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)26.44KB7.59KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)85.87KB21.12KB
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)4.47KB1.63KB
react (SchemaRenderer.js)65.97KB21.98KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)2.44KB1.21KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)20.57KB5.88KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)10.35KB3.60KB
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)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.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-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
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 (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
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

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.

The de auth.device in-flight register needs a ruling — it is #5972's reported fork, and one of its three values (Ablehne…) is ungrammatical

2 participants

@os-sales@claude