Skip to content

fix(i18n): ar spells the standalone participle جارٍ pack-wide, not two ways - #6675

Merged
os-sales merged 3 commits into
mainfrom
claude/issue-6610-ar-participle-consistency
Aug 28, 2026
Merged

fix(i18n): ar spells the standalone participle جارٍ pack-wide, not two ways#6675
os-sales merged 3 commits into
mainfrom
claude/issue-6610-ar-participle-consistency

Conversation

@claude

@claudeclaudeBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Fixes#6610

The ar pack wrote the standalone منقوص active participle of جرى two ways at
once: جارٍ on 92 values and جاري on 8. One word, two spellings, one code
point apart — U+064D (tanwīn kasr, the yāʾ dropped) against U+064A (the yāʾ
kept). Eight values converged; no key added or removed, no en value touched.

⛔ The 92:8 majority is NOT why the 8 moved

A distribution cannot rule orthography, and this participle's ending is
genuinely not invariant across syntactic positions. An اسم منقوص declines
three ways:

positionformwhy
indefinite, nominative or genitiveجارٍthe yāʾ drops, the rāʾ takes tanwīn kasr
indefinite, accusativeجاريًاthe yāʾ is kept, tanwīn fatḥ
definite (ال) or annexed (مضاف)الجاري / الجاريةthe yāʾ is kept

So "the 8 are correct in their own grammatical context" was a live reading and
had to be falsified rather than out-voted. Four measurements did it.

1. The pack already distinguishes the positions — correctly

Three ar values keep the yāʾ, and all three are in positions that require it:

keyvaluewhy the yāʾ is correct
console.ai.connectionStalledلا يزال العمل جاريًا…khabar of لا يزال — accusative, tanwīn fatḥ on a kept yāʾ
empty.appNotAvailableDescription…قد يكون النشر ما زال جارياً.khabar of ما زال — accusative (tanwīn written on the alef)
marketplace.installedAdditiveNote…لكن النواة الجارية تبقي التطبيق…attributive on a definite noun (النواة) — definite

A pack that were simply yāʾ-blind could not have got these right. That is the
strongest available evidence that جارٍ elsewhere is a position-sensitive
choice rather than a house tic — and it is the fact that makes reading (2)
below a measurement rather than a preference.

2. Per value: none of the 8 was in such a position

Reported per value, not as a total. All eight are the participle opening the
string
(token index 0), so nothing governs them into the accusative; none
carries ال; and in none is the participle the مضاف — the maṣdar after it is the
delayed subject (مبتدأ مؤخر) of a fronted indefinite predicate (خبر مقدم), which
is nominative and indefinite. The annexed reading would turn a status message
into a bare noun phrase with no predication, which is not what the en says.

keyar beforear afterenrender siteframeannexed?
grid.loadingجاري تحميل الشبكة…جارٍ تحميل الشبكة…Loading grid…plugin-grid/src/ObjectGrid.tsx:2535participle + indefinite maṣdar heading an iḍāfano
grid.refreshingجاري التحديث…جارٍ التحديث…Refreshing…plugin-grid/src/ObjectGrid.tsx:4295participle + definite nounno
chart.loadingجاري تحميل الرسم البياني…جارٍ تحميل الرسم البياني…Loading chart…no call site — see the dead-key note belowparticiple + indefinite maṣdarno
console.initializingجاري تهيئة التطبيق…جارٍ تهيئة التطبيق…Initializing application…app-shell/src/chrome/LoadingScreen.tsx:87 — the headingparticiple + indefinite maṣdarno
console.loadingSteps.connectingجاري الاتصال بمصدر البياناتجارٍ الاتصال بمصدر البياناتConnecting to data sourceLoadingScreen.tsx:56 — boot-step list item 1participle + definite nounno
console.loadingSteps.loadingConfigجاري تحميل الإعداداتجارٍ تحميل الإعداداتLoading configurationLoadingScreen.tsx:57 — list item 2participle + indefinite maṣdarno
console.loadingSteps.preparingWorkspaceجاري تجهيز مساحة العملجارٍ تجهيز مساحة العملPreparing workspaceLoadingScreen.tsx:58 — list item 3participle + indefinite maṣdarno
console.actions.retryingجاري إعادة المحاولة…جارٍ إعادة المحاولة…Retrying…LoadingScreen.tsx:118 — the retry buttonparticiple + indefinite maṣdarno

The card's same-screen claim is confirmed from the source: LoadingScreen.tsx
renders console.initializing as the heading over the three
console.loadingSteps.* as a list, with console.actions.retrying on the retry
button — four of the eight on one screen.

3. ⭐ The minimal pairs settle it

Both syntactic frames occurred on both sides of the split — and five of the
eight had a word-for-word twin already spelled جارٍ:

one of the 8its twin among the 92
grid.refreshingجاري التحديث…list.refreshingجارٍ التحديث… — the same two words, one code point apart
console.loadingSteps.connectingجاري الاتصال…topbar.connection.connectingجارٍ الاتصال…
grid.loading / chart.loading / console.loadingSteps.loadingConfigجاري تحميل …list.loadingجارٍ تحميل السجلات…, detail.loadingAttachmentsجارٍ تحميل المرفقات…
console.loadingSteps.preparingWorkspaceجاري تجهيز …console.ai.preparingConversationجارٍ تجهيز محادثة جديدة
console.actions.retryingجاري إعادة …approvalsInbox.resubmittingجارٍ إعادة الإرسال…

grid.refreshing against list.refreshing is an exact minimal pair: identical
apart from that one code point. Two spellings of one phrase cannot both be
contextually correct, so possibility 2 fails on this pair alone; the other four
make it a pattern rather than an accident.

4. The 92 needed nothing

Zero of the 92 follow an accusative governor (كان / ما زال / لا يزال / إن …).
That zero is a measurement rather than a silence: the same detector flagged
all three of the yāʾ-keeping values in (1)
لا يزال and ما زال on the two
accusatives, لكن on the definite — so it demonstrably fires when there is
something to find. 91 of the 92 open their string; the one exception
(console.ai.connectionOffline, انقطع الاتصال — جارٍ إعادة الاتصال…) follows
an em dash, i.e. it opens a new clause.

The 8 were the errors. Pack is now 100:0.

⭐ Should the 8 join #5972's gate? No — and the reason is structural

I read #5972 and its pin (ellipsis-glyph-3878.test.ts) before answering, and
the answer was measured rather than argued. That gate derives its population
from en:

const derived = PACKS.en.filter(([, value]) => value === LOADING_GROUP_EN).map(([key]) => key);
expect(derived.length, 'the group emptied or changed size ...').toBe(10);
expect([...derived].sort()).toEqual([...LOADING_GROUP].sort());

None of the 8 has Loading… as its en value — they are Loading grid…,
Refreshing…, Loading chart…, Initializing application…, Connecting to data source, Loading configuration, Preparing workspace, Retrying…
(measured, table above). So adding them to LOADING_GROUP would break the
derivation check that is that gate's own anti-vacuity guard — i.e. widening
#5972 requires weakening it. The orthography split is a property of one pack's
spelling, not of a group of shared en strings.

So this takes the move de-quote-pairing-3876.test.ts already made instead, and
which the #3878 file names as its own precedent: a per-key list becomes a
pack-wide invariant. New file ar-participle-orthography-6610.test.ts:

  • the pack-wide rule — no standalone جاري, no جارى (alef maqsura for the
    yāʾ), no bare جار with the tanwīn dropped, anywhere in ar. A ninth value
    fails by key name with no one editing the file, which is the half that
    lasts; the eight-value edit alone would have left the ninth to be written
    tomorrow.
  • the controls, asserted before any zero — the matcher is run over synthetic
    probes inside the test: it must catch all three retired spellings and a
    leading و, and must not fire on التجارية/التجاري (the substring trap an
    ASCII word-boundary regex walks into), on accusative جاريًا, or on definite
    الجارية. skeleton() is asserted to actually strip. Without this the empty
    offender list would prove nothing.
  • the eight converged values pinned by name, plus the grid.refreshing ===
    list.refreshing minimal pair, so the evidence for the direction is pinned as
    evidence and goes red if either side drifts back.
  • the three legitimate yāʾ occurrences pinned with their grammar — the more
    important half. It is what notices a later "normalise the ar pack" sweep
    flattening a correct distinction into a real grammatical error, which is
    strictly worse than the inconsistency this card removed.

ellipsis-glyph-3878.test.ts changes only in its ar note: its present-tense
"the other 8 are a wider normalization filed separately" is now false, so it
records what happened and why widening it was not available. No assertion in
that file is touched, weakened or added to.

Gate verdicts — every one quoted from its own printed line

All on the final commit 161494d4 with a clean tree. Heavy work ran through
scripts/pm/os-verify-lock.sh, whose verdict certifies the whole && chain;
exit codes were captured by redirect-then-capture, never after a pipe.

Union run: VERDICT command-exit 0 · held the lock 62s (1m02s) · waited 268s (4m28s)

gateits own verdict lineexit
vitest run packages/i18n/Test Files 58 passed (58) / Tests 927 passed (927)0
@object-ui/i18n type-checktsc --noEmit && tsc -p tsconfig.test.json, no output0
check:control-bytesOK (scanned 5519 tracked text file(s); skipped 85 binary)0
check:i18n-keysEvery in-scope call-site key resolves against the en pack (2831 keys) …0
check:i18n-driftNo en value changed in this range.0
check-changeset-presence3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)0
check-changeset-no-majorNo changeset declares a major bump.0
check-changeset-fixedAll workspace packages are in the changeset fixed group.0
check-changeset-overwriteNo pre-existing changeset was modified or deleted.0
check-lint-coveragelint coverage: 46/46 packages linted, 0 with outstanding errors (0 total).0
check-vi-mock-specifiersOK (3890 tracked source file(s), 2187 test-named; …)0
check-shell-escape-residueOK (4/4 root(s) resolved … 0 occurrence(s) outside a fence)0

check:i18n-dead-keys ran but self-declares This is a REPORT, not a gate, so
it is not counted as a gate result.

check:control-bytes is quoted above and a hand scan backs it, since this
diff is a file full of non-ASCII:
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' over all four changed files
returned exit 1 (no match).

Not measured, and said so rather than skipped: the two typecheck invocations
exclude nothing relevant — tsc -p tsconfig.test.json --listFiles lists
locales/ar.ts, ar-participle-orthography-6610.test.tsand
ellipsis-glyph-3878.test.ts in the program (lines 111/115/419 of 642), so the
green really does cover the new file.

Lint is a declared narrowing, with all three pieces of evidence:
eslint . inside packages/i18n, the only package touched; population read
from eslint's own selection via --format json = 84 files, 0 errors, 34
pre-existing warnings
, with all three edited/new source files present at 0/0;
invariance for untouched files = eslint.config.js configures no type-aware
linting
(no parserOptions.project, no projectService — grepped, zero
rows), so a change confined to packages/i18n cannot move the verdict on any
file it does not itself contain. The repo-wide farm is CI's run.

Ablation — 3 legs, each predicted before it ran, from the committed tree

Run under the lock from a committed tree, with
trap restore EXIT INT TERM using absolute paths resolved from
git rev-parse --show-toplevel. Each mutation was proven on disk by counting
the injected text and the removed text at the anchor (not by a bare
git diff --stat — the fix itself is an equal-length substitution, so the file's
byte count never moved and a size check would have proven nothing). Each restore
was proven by an empty git diff HEAD, and the tree was verified clean at the end.

No rebuild was needed and none could have masked a result: the pin imports
../locales/index — a relative source import, not the package exports
field — and packages/i18n has no vitest.config.* of its own, so nothing
resolves through dist/. Leg A proves this empirically: it mutates only
ar.ts, nothing is built, and the test goes red.

  • Leg A — revert console.loadingSteps.connecting to the yāʾ spelling.
    Predicted red naming the key; observed RED, the offender assertion firing
    with 1 value(s) still use a retired spelling and the message that tells the
    author what to write, plus the converged-census pin naming
    ar console.loadingSteps.connecting moved.
  • Leg B — "normalise" console.ai.connectionStalled (جاريًا, where the yāʾ
    is required) to جارٍ. Predicted red on the yāʾ-is-correct pin only, with
    the pack-wide rule staying green
    , because جارٍ is not an offending form and
    the sweep structurally cannot see this defect. Observed exactly that:
    1 failed | 3 passed, ar console.ai.connectionStalled lost "جاريًا" — khabar of لا يزال …. That asymmetry is the whole reason the protective pin exists,
    and it is now demonstrated rather than asserted.
  • Leg C — break the matcher itself (skeleton() made a no-op). Predicted red
    in the controls block first; observed RED there
    (expected 'جارٍ' to be 'جار') before the pack-wide rule. A matcher that stops
    matching fails its own controls instead of reporting a clean pack.

⚠️One unpredicted diagnostic, reported rather than smoothed. On the first
Leg A the non-vacuity floor was toBeGreaterThanOrEqual(100) — today's exact
count — so reverting one value tripped it at 99 and the failure a reader saw was
no جارٍ found at all instead of the offender list that names the key. An
exact-today floor is a ratchet pretending to be a proof of life. Commit
8636f62a slackens it to 80 with the reasoning recorded in the file, and Leg A
was re-run: it now fails on the offender assertion, as it should.

Fences

  • Diff is 4 files: locales/ar.ts, the new pin, the ar note in
    ellipsis-glyph-3878.test.ts, and the changeset.
  • The other nine packs are untoucheden.ts is not in the diff at all,
    and check:i18n-drift independently prints No en value changed in this range. The all-locales parity gate did not force anything: no key set and
    no placeholder shape moved, so nothing here reaches the other packs.
  • ⛔ No key added or removed; every change is a value edit on an existing line.
  • ⛔ Every moved value keeps its U+2026 — [finding] en 包 32 个值用 ASCII "..." 结尾、113 个用 U+2026 "…" —— 同一屏上省略号两种字形,且九包各自跟着抄 #3878's glyph invariant is untouched
    and still green.
  • skip-changesetnot applied: a changeset is genuinely owed here
    (check-changeset-presence says so), and in this repo that label is a phantom
    that nothing reads, so applying it would only mint a false status.

Examined and deliberately NOT folded in

  • Gender agreement. Nine values put the masculine participle before a
    feminine maṣdar (إعادة, إضافة, تهيئة, الموافقة, المعالجة); strict
    agreement would want جارية. The impersonal frozen جارٍ is standard MSA UI
    register, and — load-bearing — the pack applied it uniformly on both sides
    of this split
    (7 of the 92, 2 of the 8), so it was never a distinguishing
    factor here and it is not a same-screen inconsistency. Ruling it needs an
    Arabic desk, so it is recorded in the pin's header as explicitly out of the
    file's green, not swept.
  • chart.loading has no consumer. Grepped for the dotted key, for the
    strings.x object-access form that hides console.* from key greps, and for
    dynamic t(...) template construction. It is already a standing
    [needs-review] row in check:i18n-dead-keys, whose only textual references
    are now this pin and ellipsis-glyph-3878.test.ts, and that report says every
    hit wants a sampled human check before deletion (objectui#4658). Filing a card
    would duplicate an existing tracked line, so it is noted next to its pin row
    instead, with what to delete if it is ever retired.

Generated by Claude Code

#6610)
The `ar` pack wrote the active participle of جرى two ways at once: `جارٍ` on 92
values and `جاري` on 8. One word, two spellings, one code point apart — U+064D
(tanwīn kasr, the yāʾ dropped) against U+064A (the yāʾ kept).
The 92:8 majority is not the argument. An اسم منقوص declines three ways, so
"the 8 are right in their own context" was a live reading and had to be
falsified rather than out-voted:
- the pack already distinguishes the positions correctly — `جاريًا` twice as the
accusative khabar of لا يزال / ما زال, and `الجارية` once as a definite
attributive, so `جارٍ` elsewhere is position-sensitive, not a house tic;
- none of the 8 was in such a position: all opened their string, none carried
ال, and in none was the participle the مضاف — the maṣdar after it is the
delayed subject of a fronted indefinite predicate;
- both syntactic frames occurred on BOTH sides of the split, five with a
word-for-word twin — `grid.refreshing` (`جاري التحديث…`) against
`list.refreshing` (`جارٍ التحديث…`) is an exact minimal pair;
- none of the 92 followed an accusative governor, from the same detector that
did flag all three yāʾ-keeping values.
Eight values converged; no key added or removed, no `en` value touched.
`ar-participle-orthography-6610.test.ts` makes it a pack-wide invariant instead
of an eight-key edit, and pins the three occurrences where the yāʾ is correct so
a later sweep cannot flatten a real distinction into a grammatical error.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRJge11jso9TpXRWFt1Z49
The first ablation leg reverted one value and tripped the `>= 100` floor at 99,
so the failure named "no جارٍ found at all" instead of the offender list — the
assertion that names the key and says what to write. The floor is proof of life,
not a ratchet: a collapsed pack, a broken import or a matcher that stops matching
all take it to 0 or near it, and a single-value regression now belongs to the
assertion built to report it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRJge11jso9TpXRWFt1Z49
@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-Dk08even.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.

ar writes the participle جارٍ/جاري two ways pack-wide (92:8) — 8 values outside the #5972 group are ungated

2 participants

@os-sales@claude