Skip to content

test(types): measure the two LOCAL mirrored-but-undeclared keys per key, and hand the direction back (objectui#9729) - #9735

Merged
os-sales merged 1 commit into
mainfrom
claude/issue-9729-mirror-only-published-keys
Sep 17, 2026
Merged

os-sales merged 1 commit into
mainfrom
claude/issue-9729-mirror-only-published-keys

Conversation

@os-sales

Copy link
Copy Markdown
Collaborator

Fixes #9729

Clause-②: no — and the declaration is about THIS PR's diff, which is test-only and moves no published accept set. ⚠️ The REMEDY the card asks about is Clause-②: yes, per key, and is deliberately not taken here: this branch measures, proposes, and hands back for the at-tier contract review.

What this PR is

The card carries two LOCAL entries of the MirroredUndeclared ledger — a key the published zod mirror states and the published TypeScript twin does not. Either remedy moves a face @object-ui/types already ships, so the dispatch forbade picking one. What was missing for the review was the per-key evidence, so that is what landed: four readings, each with a lit control on the same instrument, plus the pins that keep them honest.

The four readings the card asked for

1. Who reads each key at runtime

⛔ A source grep cannot answer this in this tree — SchemaRenderer hands a node's leftover keys to the component as props, so a renderer can consume a key it never names. Both readings below are therefore rendered, and both landed as tests rather than being pasted here.

  • dueLike is READ. DetailSection spreads the authored field into the enriched bag (enrichDetailField opens with a spread of the view field) and hands that bag to the resolved cell renderer, where resolveDueLike reads it. Measured on a field named end_date, which deliberately does not match the due/deadline field-NAME convention that read falls back to, so the authored key is the only thing that can move the output: with the key the cell draws the overdue wording, without it the neutral relative wording. The control leg renders BY VALUE — it asserts the neutral wording is present, not merely that the overdue wording is absent, which would also be true of a document that drew nothing. Pinned by DetailSection.dueLikeReachesTheCell-9729.test.tsx.
  • operators changes NOTHING drawn. Measured with a byte ruler: the same object-grid document drawn twice and compared as markup. The ruler is pinned stable first (identical documents, identical bytes), then a LIT CONTROL on a key the renderer demonstrably does read (label, which moves the bytes and appears in them), and only then the measurement — taken twice, once on a plain grid and once with the filter surface on, since operators is a filtering word and a grid with no filter affordance would be the wrong corpus to ask. Both come back byte-identical. ⚠️ The claim is bounded by the ruler: this is what the RENDERED output does with the key. Pinned by ObjectGrid.operatorsInert-9729.test.tsx.

2. What @objectstack/spec says on the corresponding surface

Probed against the installed spec by parsing documents through it, not by grepping it — with a declared-key control and a nonsense-key control on the same schema:

  • operators on the grid: the protocol REFUSES it by name. ObjectGridPropsSchema for object-grid is a strict object, and a document carrying operators comes back RED with unrecognized_keys — and the refusal message itself proposes the rename to operations. Controls: the bare document and one carrying operations both parse GREEN. ⇒ the mirror admits a key the protocol rejects, and the protocol has already classified that spelling as a misspelling of a key both this block's authoring vocabulary and the twin declare.
  • dueLike on the detail-view field: the spec has no such surface to declare it on. RecordDetailsProps types its fields (and sections[].fields) as field NAMES — a string array. Every object-shaped field entry is refused there, carrying dueLike or not (control: a string entry parses GREEN, an object entry is RED whatever keys it carries). The whole object-shaped DetailViewField is objectui's own contract, so for this key there is no "toward the protocol" pull in either direction.

3. Who AUTHORS either key in-tree

  • dueLike is authored — in content/docs/fields/date.mdx and content/docs/fields/datetime.mdx, where the published docs tell an author to write it. ⚠️ Read the (interface, name) carefully: those examples author it on DateFieldMetadata / DateTimeFieldMetadata, the object-field metadata faces, ⛔ not on a detail-view field entry. So narrowing the mirror would falsify no in-tree document by itself — while leaving the docs teaching a key the detail-view face would then reject.
  • operators is authored NOWHERE in the doc, example, app or e2e corpora on a grid node. Lit control on the same instrument and the same corpora: operations lights up in them.

4. The ledger, and its floor

Both keys are already recorded, as the two LOCAL single-key entries the card describes: objectql.zod.ts#ObjectGridSchema names operators, views.zod.ts#DetailViewFieldSchema names dueLike. ⛔ The seeded entry and key totals are deliberately not repeated here: they live in exactly one place — the MirroredUndeclared docstring — and are re-derived from that ledger's own AST by the census at the bottom of zod-mirror-parity.test.ts ("the fourth direction is enumerated and sized at test time"). That ledger is a FLOOR that can only shrink, and the ratchet reddens on growth, on fresh drift and on a stale entry alike.

⭐ The third option the measurement produced: these are TWO decisions, not one

The card allowed for a third option if the measurement showed one, and it does — the two keys are not the same defect wearing two names:

dueLike on views.zod.ts#DetailViewFieldSchema operators on objectql.zod.ts#ObjectGridSchema
mirror judges the key and KEEPS it judges the key and keeps it
twin DetailViewField has no index signature, so TypeScript REFUSES the key (TS2353) ObjectGridSchema extends BaseSchema, whose index signature ABSORBS it as any — neither declared nor refused
runtime READ, and the read changes what is drawn inert on the rendered path, by a ruler with a lit control
@objectstack/spec no counterpart surface — the field entry is a string there REFUSES it by name, and names the rename to operations
authored in-tree yes, on the sibling metadata faces, taught by the published docs no
twin's neighbour the twin already declares operations, the key everything else spells

⇒ what the two faces DO differs in kind. For dueLike the two published faces actively CONTRADICT each other — the validator keeps the key, the compiler rejects the same document — and the runtime honours it. For operators they do not contradict; one is simply silent, nothing reads it, the protocol refuses it, and the key sits one letter away from the word the whole stack uses.

⭐ There is also a precedent in the tree for the dueLike direction, and it is worth the reviewer's attention: DateTimeFieldMetadata.dueLike was declared by objectui#8958, and its docblock gives the reason in the reviewer's own words — leaving it off "would keep the mismatch alive with the sign flipped — a key the renderer honours but the authoring type rejects."

⛔ Recommending is not deciding, and this PR decides nothing. Both remedies remain open on both keys.

⚠️ The third key the card names is NOT this defect — re-derived, not inherited

complex.zod.ts#DashboardConfigSchema's aria was re-derived on this branch rather than taken from the hand-back: it is z.never(...) with an error message beginning "RETIRED (objectui#5852)" and an .optional(), and a document carrying the key comes back RED at path aria with that remedy. A LIT CONTROL on the same schema shows an unrecognised key is NOT refused, so the rejection is BY NAME and not a strictness the whole object has; a document that omits the key stays green. ⇒ its consequence is the OPPOSITE of the other two — they admit silently, it rejects loudly — and a sweep treating the three alike would ask a maintainer to repair something already doing its job. ⛔ It is untouched here, and it is pinned as the CONTRAST so the grouping cannot come back by accident.

What landed

  • packages/types/src/__tests__/mirror-only-published-keys-9729.test.ts — the per-key consequence pins. Each key's pin is paired with an unrecognised-key control through the same schema, because a green parse proves nothing on its own: one mirror strips unknown keys, the other passes them through unexamined, so what distinguishes a MIRRORED key is that the mirror JUDGES it. The TypeScript side carries a ts-expect-error directive on the DetailViewField literal — that directive IS the assertion, and it fails in BOTH directions, since it also reddens as unused if the key ever becomes declared.
  • packages/plugin-detail/src/__tests__/DetailSection.dueLikeReachesTheCell-9729.test.tsx and packages/plugin-grid/src/__tests__/ObjectGrid.operatorsInert-9729.test.tsx — the two runtime readings, landed as tests beside the renderers that own the read paths rather than pasted into this body.
  • packages/types/src/__tests__/zod-mirror-parity.test.ts — two ledger docstrings corrected. The dueLike entry justified itself with "a git grep finds it in the mirror and nowhere in this package's TypeScript declarations", and that sentence is FALSE as written: field-types.ts declares that name on DateFieldMetadata and on DateTimeFieldMetadata, both in this package. ⭐ A NAME is not a KEY — a key is (interface, name) — and a package-wide grep for the name answers a question the ledger is not asking. The MEASUREMENT was right and stays; only its stated reason was wrong, and it is corrected rather than repeated. The operators entry gains the neighbouring-name reading.
  • .changeset/9729-mirror-only-published-keys-measured.md — empty frontmatter, the explicit "releases nothing" declaration.

Gates

Each exit code was captured to disk before any pipe.

gate verdict
pnpm --filter @object-ui/types type-check exit 0 — all three legs, including tsconfig.test.json, which is the leg that reads the directives above
pnpm --filter @object-ui/types test exit 0 — 204 files, 4769 tests
pnpm --filter @object-ui/plugin-detail --filter @object-ui/plugin-grid type-check exit 0, after building the dependency closure — the first attempt failed with TS2307 on every workspace import, which is a missing prerequisite and ⛔ not a reading
the three new test files exit 0 — 6 + 7 assertions across the three
node scripts/check-changeset-presence.mjs exit 0 — "4 source file(s) of 3 released package(s) changed … Every one of them has an EMPTY frontmatter"
pnpm check:control-bytes exit 0 — "check-control-bytes: OK"; also swept the changed files directly with a control-character grep, which found none
pnpm check:new-line-citations exit 0 — "0 new citation(s), enforcement report-only"
pnpm check:changeset-claims exit 0, report-only — 10 pending changesets name zod-mirror-parity.test.ts. Read, as the gate asks: every one of them describes EXCLUSIONS, RuntimeOnlyDeclared, KnownDrift or UnmirroredDeclared, and none mentions the fourth ledger or either key this branch touched. ⇒ nothing went false, so nothing is corrected
node scripts/check-governed-queue-guard.mjs --test (5 paths) exit 0 — "NOT GOVERNED — 5 path(s) checked against 5 governed surface(s); none matched" ⚠️ the dispatch spelled this script under scripts/pm/; it lives at scripts/check-governed-queue-guard.mjs, and the first invocation was a MODULE_NOT_FOUND, ⛔ not a red gate
targeted eslint over the changed files exit 0. ⚠️ Repo-wide pnpm lint is CI's run and is ⛔ not measured here

Reverse validation — both pins were made to fail, then restored

Run from the committed state, each leg with an on-disk anchor count before and after the edit, and each restore proven by an empty git diff HEAD plus a blob hash identical to the HEAD blob:

  1. Delete the mirrored dueLike member from views.zod.ts — anchor count 1 to 0, then the new pin goes RED: 2 of its 7 assertions fail. ⇒ the pin measures the mirror, not itself.
  2. Delete the ts-expect-error directive from the pin — anchor count 1 to 0, then tsc -p tsconfig.test.json exits 2 with TS2353: … 'dueLike' does not exist in type 'DetailViewField'. ⇒ the refusal is real and the directive is load-bearing.

Both mutations are gone; nothing from them is in this branch.

Serial constraint — re-taken against the LIVE pull requests

Re-taken at 2026-09-17T22:16Z, after the sibling appeared: objectui#9637 is now PR #9734, and its file list is two changesets, one new changeset and packages/plugin-detail/src/__tests__/recordDetailsInputs.spec-parity.test.ts — it does not touch zod-mirror-parity.test.ts, so the warning's stop condition did not trigger. PR #9732 (plugin-grid) lists ObjectGrid.tsx, hooks/useBulkExecutor.ts, one test and a changeset; the file added here is a different file. PR #9540 does list packages/types/src/objectql.ts and packages/types/src/zod/objectql.zod.ts — ⛔ neither is edited here, since no accept set moves on this branch.

⚠️ Surface delta, declared: the claim named packages/types/src/{views,objectql}.ts and their zod twins. None of those four is edited — the measurement outcome is that nothing on a published face should move without the review. Two test files outside the declared surface were added instead, in the packages that own the two runtime read paths, because the card's first question cannot be answered from packages/types, which has no renderer.


Generated by Claude Code

`dueLike` on the detail-view field pair and `operators` on the object-grid
pair are the two LOCAL entries in the `MirroredUndeclared` ledger. This
records what each key DOES — which face judges it, which merely absorbs it,
and whether anything reads it at runtime — without moving either published
accept set, so the at-tier contract review can read the measurement instead
of re-deriving it.

Also corrects the ledger entry for `dueLike`, whose stated reason was a
package-wide name grep: `field-types.ts` declares that name on two field
metadata interfaces. A name is not a key; the measurement stands, its
justification did not.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
@github-actions

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 10 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/5928-classname-style-props-rename.md

  • names zod-mirror-parity.test.tspackages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    Where the non-pair is recorded now. zod-mirror-parity.test.ts keys its existing EXCLUSIONS entry — the mechanism that accounts for every exported const with no TypeScript declaration to mirror, each with its stated reason — to ClassNameStylePropsSchema. Named for its own two keys, the const leaves no like-named declaration for a name-derived pairing to reach for.

.changeset/6150-undeclared-but-consumed-keys.md

  • names zod-mirror-parity.test.tspackages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    AMENDED, and the amendment ships in this same release. objectui#7804's TreeViewSchema slice gave the key a zod arm after all — a NAMED REFUSAL (handlerKeyRefusal(key, 'runtime-slot', label)), never a shape — because "no mirror entry" is not neutral under BaseSchema.passthrough(): it meant an authored { "type": "tree-view", "onNodeClick": { "action": "toast" } } parsed GREEN, survived the parse, and reached a call site that expects a function. ⇒ the three clauses this bullet used to carry are no longer true of the code shipping beside it. The key is now a MEMBER of TreeViewSchema.shape and an authored value is refused BY NAME at path onNodeClick; it has LEFT zod-mirror-parity.test.ts's RuntimeOnlyDeclared for that file's KnownDrift; and it is no longer "the first pair to sit there without also sitting in UnmirroredDeclared" — draining it emptied that difference, so RuntimeOnlyDeclared is now a SUBSET of UnmirroredDeclared and the union of the two equals UnmirroredDeclared itself. ⛔ objectui#6152's ruling is untouched by any of this: what the key still does not have, and never will, is a z.function() shape — no serialized document could satisfy one.

.changeset/6175-column-state-persistence.md

  • names zod-mirror-parity.test.tspackages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    Nothing is retired. Both spellings remain declared on DataTableSchema; onColumnReorder stays declared and stays unwired, exactly as the RuntimeOnlyDeclared ledger in zod-mirror-parity.test.ts records it. Which of the two survives is a declared-surface ruling that stays open and is deliberately not settled here.

.changeset/6639-objectgrid-title-mirrored.md

  • names zod-mirror-parity.test.tspackages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    The gain is the typed refusal: the mirror's .passthrough() base was already admitting any title unexamined, and it now enforces the declared string. zod-mirror-parity.test.ts's UnmirroredDeclared ledger records the key as worked off — the ledger's first shrink by repair (97 + 1 mirrored + 23 reclassified is what the seeded "121" now means).

.changeset/7344-handler-string-any-mirrors.md

.changeset/7654-floating-chatbot-trigger-icon-tombstone.md

  • names zod-mirror-parity.test.tspackages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    Every other tombstone in this package pairs ?: never with a retirementTombstone() refusal on the Zod twin. There is no twin here to carry one: FloatingChatbotConfig has no Zod mirror at all, and floatingConfig sits in the UnmirroredDeclared ledger (zod-mirror-parity.test.ts, complex.zod.ts#ChatbotSchema). BaseSchema is .passthrough(), so the whole floatingConfig object rides through unvalidated — before this change and after it. Minting a mirror to host a refusal would be the declared-but-UNMIRRORED axis (objectui#6152), a different defect: a key can be mirrored and inert, or unmirrored and live, and fixing one says nothing about the other. This change does not widen into it.

.changeset/7804-tree-view-handler-slot.md

  • names zod-mirror-parity.test.tspackages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    The pair moves from zod-mirror-parity.test.ts's RuntimeOnlyDeclared to its KnownDrift, which empties the former of the one entry the latter did not also hold — so the two unmirrored ledgers are now in a containment relation, and the cross-ledger figure that recorded their difference states the containment instead.

.changeset/8338-retire-toast-action.md

  • names zod-mirror-parity.test.tspackages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    The parity ledgers drain with it, every figure re-derived by zod-mirror-parity.test.ts's own AST and mirror instruments rather than stepped by hand: KnownDrift 42 entries / 64 keys → 41 / 63 (the entry's whole content, so the entry went too — the ledger's first loss by RETIRING a key rather than by moving either face toward the other), and WiderThanDeclared 23 / 36 / 47 arms, split 6 / 30 / 0 / 11 → 22 / 35 / 45, split 6 / 29 / 0 / 10. The pair itself stays registered, so EXPECTED_MIRROR_PAIRS does not move.

.changeset/8572-chatbot-body-retired.md

  • names zod-mirror-parity.test.tspackages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    Why this key and not another. It was the ONE place in this vocabulary where body did not mean "what goes inside this component": zod-mirror-parity.test.ts carried the pair under KnownDrift as "two different meanings of one key", and the same collision was the whole reason chatbot was the single arm of the component union whose output was not assignable to SchemaNode. Both ledger rows move with this change, and the two pins that recorded the old state are INVERTED rather than deleted (see below).

.changeset/object-view-unmirrored-keys-7779.md

  • names zod-mirror-parity.test.tspackages/types/src/__tests__/zod-mirror-parity.test.ts — edited by this change

    Who is NOT affected: every correctly typed document, and every document that never wrote these keys — absent stays valid on all nine. No renderer changed. The parity ledger (zod-mirror-parity.test.ts) records the move: UnmirroredDeclared 14 entries / 96 keys to 14 / 87, the ObjectViewSchema entry re-derived into the SPEC-DERIVED half because the mirror now references the spec in code.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a claim that was born false (a changeset this change adds is excluded by construction), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 64deb1603 (merge-base with origin/main): 4 file(s) changed outside .changeset/, read against 1131 pending declaration(s) that publish a body (1644 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3049.2 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-DnyzLIkC.js
Status PASS

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 545.93KB 130.69KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 215.98KB 59.97KB
fields (index.js) 249.27KB 62.92KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.92KB 14.22KB
plugin-charts (index.js) 71.49KB 19.99KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 253.29KB 65.88KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.71KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.64KB 57.91KB
plugin-kanban (index.js) 48.10KB 14.94KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.04KB 21.01KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 104.82KB 34.67KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.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 September 17, 2026 22:38
@os-sales
os-sales added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit b2822bc Sep 17, 2026
38 checks passed
@os-sales
os-sales deleted the claude/issue-9729-mirror-only-published-keys branch September 17, 2026 22:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants