Skip to content

feat(plugin-timeline,plugin-list): retire the undeclared timeline metaFields reads (objectui#10222) - #10430

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-10222-retire-metafields-reads
Sep 25, 2026
Merged

objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-10222-retire-metafields-reads

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #10222
Clause-②: no

Ruling batch #223 item 5b, letter A (card comment 5824012155, maintainer 「其他同意」): delete every undeclared metaFields read in both packages. cardFields stays the reserved spelling; nothing is declared, and packages/types and the spec are untouched. The bypass that delivered the key (a stored view's unjudged options bag) belongs to objectui#10380 and is not touched here; this card does not wait on it.

What changed

  • plugin-timeline ObjectTimeline.tsx: the (timelineConfig as any).metaFields read and its docblock line 「Spec config: timeline.metaFields: string[]」 are deleted. The chips beside each title are always the built-in status / priority pair, limited to the fields the object declares (the default did not change).
  • plugin-list ListView.tsx: three reads deleted.
    1. the metaFields spread in the expandFields collector;
    2. the same spread in the $select collector;
    3. the !Array.isArray(tCfg.metaFields) condition on the status / priority auto-projection, which is now if (tCfg): unconditional for any configured timeline block. Each site's comment names the retired key and the ruling. The tCfg: any annotation lost its purpose and is dropped.
  • ListView.speculativeFls-7216.test.tsx PIN 4 is rewritten with the reason, not deleted. It still pins what it guards, a DENIED dateField binding kept out of $select. Its fixture carried metaFields: ['region'] as the permitted control. That key is retired, and it was never a discriminating control anyway: region is in that file's COLUMNS, so it reached $select through the column path whatever the binding did. The permitted binding is now endDateField: 'end_date', which only the timeline binding can project (the same shape PIN 3 uses for gantt). The PIN 8 comment (「when a timeline is configured with no explicit metaFields」) was re-read and updated the same way.
  • Changeset .changeset/10222-retire-timeline-metafields-reads.md: minor on @object-ui/plugin-timeline and @object-ui/plugin-list. It names the behaviour change in the ruling's words: a stored interface-page view carrying options.timeline.metaFields falls back to the default card labels. No such view has been found, and the stored rows are not censused.

Zone 2 measurements (base 378a4f6ca, then the branch)

  1. git grep -n metaFields 378a4f6ca over the whole tree found 12 hits in 4 files, all under packages/ (none in apps, content or examples). Classified:

    • ObjectTimeline.tsx: the docblock line and the two-line read. Deleted.
    • ListView.tsx: the expandFields spread, the $select spread, the auto-projection comment and its !Array.isArray(tCfg.metaFields) switch. Deleted or rewritten.
    • ListView.speculativeFls-7216.test.tsx: the PIN 4 fixture and the PIN 8 comment. Rewritten.
    • plugin-grid ObjectGrid.tsx: 3 hits, one more than the dispatch listed. All three are the same LOCAL variable (the record panel's system-field list): its declaration and two uses in the JSX. It is not this key. Left alone; that file is held by objectui#10354.

    No other hit.

  2. $select for a timeline view with no metaFields is IDENTICAL before and after: ['id', 'name', 'start_date', 'status', 'priority']. The pin IDENTICAL asserts that exact array. It is green with the reads restored (the ablation leg, which is behaviour-equivalent to base in these files) and green on the fix. The auto-projection is now unconditional for a timeline block rather than dropped.

  3. PIN 4: see above. The retired key was removed from its fixture, and the new projection pin carries the proof that it is ignored.

  4. A block WITH metaFields: ['region'] renders the SAME chips as one without (['Open', 'High']). region is not projected by ListView.

Pins

  • (b) render, plugin-timeline/src/ObjectTimeline.metaFieldsRetired-10222.test.tsx, against the real TimelineRenderer (not mocked):

    • CONTROL: with no key, the chips are ['Open', 'High'];
    • RENDER: with metaFields: ['region'], the chips are identical and contain no EMEA.
  • (c) projection, plugin-list/src/__tests__/ListView.timelineMetaFieldsRetired-10222.test.tsx. region is deliberately not a column here.

    • IDENTICAL: see Zone 2 item 2.
    • PROJECTION: metaFields: ['region'] adds nothing, and status / priority are still projected.
    • The same for the options.timeline spelling, both beside a timeline block and on its own. On its own was the shape that fetched no status / priority at all at base.
    • EXPAND: a lookup named only in metaFields is neither expanded nor selected, with a control proving the same lookup IS expanded as a column.
  • (a) source, in the same plugin-list file: a TypeScript-AST scan of every non-test .ts / .tsx under packages/plugin-list/src AND packages/plugin-timeline/src. It counts identifiers and string literals; comments are trivia, so prose naming the key is not a read. It asserts zero metaFields uses. Controls:

    • POPULATION: the scan covers ListView.tsx / ObjectTimeline.tsx;
    • FIRING: the same scanner finds cardFields / colorField beside them;
    • an in-memory probe with each shape the retired reads took, plus a comment the scan must skip.

    The plugin-timeline half lives in the plugin-list file because plugin-timeline's tsconfig.test.json names no node types, and TypeScript 6 includes none by default. A first draft that read disk from the plugin-timeline test failed that package's type-check with TS2591. Changing that tsconfig was outside the claimed file surface.

Ablation (restore all four reads; on-disk proof)

The tool is node ../objectstack/scripts/ablation-replace.mjs, run in --hold mode for four anchored mutations: 1 in ObjectTimeline.tsx and 3 in ListView.tsx. Every anchor hit exactly once and every blob moved. The script arms a trap restore on EXIT, INT and TERM, and it ran inside the verify lock. Final run on HEAD 8659b926e:

  • on disk, grep -c 'Array.isArray.*metaFields' went from TL=0 LV=0 to TL=1 LV=3;
  • vitest over the three files: Tests 7 failed | 22 passed (29), exit 1. The 7 reds are all expected:
    • (b) RENDER: expected [ 'EMEA' ] to deeply equal [ 'Open', 'High' ];
    • (c) the 3 PROJECTION tests (region in $select) and EXPAND (account in $expand);
    • (a) SOURCE for plugin-list (5 hits) and for plugin-timeline (2 hits).
  • Green under ablation, as designed: IDENTICAL, CONTROL, the EXPAND control, POPULATION, the FIRING controls, and all 14 tests of ListView.speculativeFls-7216 (the rewritten PIN 4 does not lean on the key).
  • Restore: ablation-replace --restore put both files back with blob == HEAD blob (6b21ccaf9625, 37d5565ca83d), and git diff HEAD plus git status --short were empty. Re-checked by hand afterwards with git hash-object against git rev-parse HEAD:path: equal.

Gates (HEAD 8659b926e unless stated)

  • Dependency closure: turbo run build --filter='@object-ui/plugin-list^...' --filter='@object-ui/plugin-timeline^...' --concurrency=2 ⇒ Tasks: 12 successful, 12 total (all served from the shared worktree cache: FULL TURBO).

  • type-check: pnpm --filter @object-ui/plugin-timeline --filter @object-ui/plugin-list run type-check (both tsc --noEmit and tsc -p tsconfig.test.json) ⇒ Done / Done at 4c7fc8bf8. After that, only the new plugin-list test changed; the plugin-list type-check re-ran green on those exact bytes. --listFiles confirms both test programs compile the new test files.

  • pnpm exec vitest run packages/plugin-timeline/ packages/plugin-list/ from the repo root ⇒ Test Files 117 passed (117) / Tests 1389 passed (1389).

  • Tests that read the touched sources as TEXT: a git grep over test files for file-reading calls, plus the touched file names, found 68 files outside these two packages (census, ratchet and docblock-quote suites among them). Run from the root at 4c7fc8bf8 ⇒ Test Files 68 passed (68) / Tests 2633 passed (2633). ObjectTimeline.tsx and ListView.tsx are byte-identical between 4c7fc8bf8 and HEAD.

  • pnpm check:control-bytes ⇒ OK. pnpm check:new-line-citations ⇒ 0 new citation(s). node scripts/check-changeset-presence.mjs ⇒ 5 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s).

  • pnpm check:changeset-claims: the self-contradiction and born-false readings are clean. It flags 7 pending changesets that name ListView.tsx: 7070, 7499, 7773, 7780, 8990, list-user-actions-collision-5398 and listview-comment-pair-4559. Each flagged paragraph was read. They cover the gantt branch, kanban groupField / groupBy, userActions and two comment corrections, and none describes the timeline collectors or the auto-projection this diff edits. None went false.

  • eslint over the 5 touched files, by rule, base ⇒ head. All messages are warnings; there are 0 errors on both sides.

    • ListView.tsx: no-explicit-any 137 ⇒ 136; every other rule unchanged (12 / 6 / 12 / 8 / 9).
    • ObjectTimeline.tsx: no-explicit-any 28 ⇒ 25, and react-hooks/exhaustive-deps 1 ⇒ 0. The chip memo read timelineConfig without listing it.
    • The 7216 test: 4 ⇒ 4.
    • Both new test files: 0.

    This is a narrowed run and still a measurement. The population is the 5 files, and eslint's own --format json returned 5 results. The config is not type-aware: --print-config shows no parserOptions, and no rule under eslint-rules/ reads other files. So this diff cannot move a verdict in an untouched file.

Acceptance notes

  • After this change ListView still merges options.timeline into the timeline node verbatim, so a stored metaFields still ARRIVES at ObjectTimeline. Nothing reads it now. That door belongs to objectui#10380.
  • ListViewTimelineConfig (packages/types) carries a [key: string]: any index signature and a deprecated dateField alias, and ObjectTimeline still reads timelineConfig?.dateField as a fallback. That is an objectui-declared legacy alias, not an undeclared read. packages/types is outside this card, and this is noted, not filed (carrier: none).
  • Docs: the key appears in no README and nowhere under content/; the base whole-tree grep had no hits outside packages/. So there is nothing to update there.
  • Reversible by reverting this PR: it deletes four reads, and the changeset records the one behaviour change.

Generated by Claude Code

…taFields` reads (objectui#10222)

Ruling batch #223 item 5b, letter A. The spec's TimelineConfigSchema is a
strict object that declares no `metaFields` member, yet ObjectTimeline read
it to pick the chip fields and ListView read it three times (the expand
collector, the select collector, and the switch that skipped the
status / priority auto-projection). All four reads are deleted.

- ObjectTimeline: chips are always the built-in status / priority pair,
  limited to the fields the object declares.
- ListView: status / priority are projected for every timeline view, so a
  view without the key fetches exactly what it did before.
- ListView.speculativeFls-7216 PIN 4 rewritten with the reason (its
  permitted binding is now `endDateField`; the old `region` control rode
  the column path).
- New pins: render (chips identical with and without the key), projection
  (the key adds nothing to $select / $expand), and a source scan with
  firing controls in both packages.
- Changeset: minor on both packages, naming the behaviour change for a
  stored interface-page view carrying `options.timeline.metaFields`.

Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
…in the retirement comments (objectui#10222)

So a reader who greps for the key lands on the explanation. Comments
only; the source pins read code tokens, not comments.

Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
…n beside the plugin-list one (objectui#10222)

plugin-timeline's tsconfig.test.json names no `node` types (TypeScript 6
includes none by default), so a `node:fs` import in that package's test
does not type-check. The two-package source scan now lives in the
plugin-list file, whose test config names them; the plugin-timeline file
keeps the render pin only.

Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
… explicit `any`

Casts at the props instead; the file lints with zero eslint messages.

Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
@github-actions

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 7 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/7070-no-invented-gantt-date-fields.md

  • names plugin-list/src/ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    • app-shell/src/views/ObjectView.tsx — the console object page. The inline branch becomes ganttViewOptions, the sibling of calendarViewOptions and timelineViewOptions: the declared block spread whole, title floored at 'name', no date field invented. - plugin-list/src/ListView.tsx — the render branch AND the capability gate. - plugin-view/src/ObjectView.tsx — generateViewSchema, the authored object-view element route, which bypasses ListView entirely.

.changeset/7499-gantt-non-axis-floors-omitted.md

  • names plugin-list/src/ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    • plugin-list/src/ListView.tsx — the object-gantt render branch. - plugin-view/src/ObjectView.tsx — generateViewSchema, the authored object-view element route, which bypasses ListView entirely.

.changeset/7773-kanban-adapter-groupfield-write.md

  • names ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    Who is NOT affected — the boundary is node-local. Every VIEW-LEVEL groupField read is untouched and still live: it is a legacy alias of the spec's groupByField on the kanban view config, mapped by normalize-list-view.ts, and both adapters still resolve lanes through it (ObjectView.tsx's kanbanCfg.groupField ||, ListView.tsx's groupByField || groupField). Authoring options.kanban.groupField on a list-view or object-view keeps working exactly as documented in packages/plugin-list/README.md. groupField is dead only on the generated object-kanban NODE.

.changeset/7780-object-kanban-record-source.md

.changeset/8990-object-kanban-groupby-optional.md

  • names packages/plugin-list/src/ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    • packages/plugin-list/src/ListView.tsx generates the node as groupBy: laneField. objectDef loads asynchronously, so laneField is undefined on every load until it lands, and stays undefined whenever the object offers no stageField hint and none of status / stage / state / phase. The renderer serves that node; both published faces refused it. - content/docs/utilities/data-objectstack.mdx documents an object-kanban node that is exactly { type, dataSource }, with no groupBy. ⚠️ This one is weaker and is cited for what it is: that fragment is still refused after this change, at RECORD_SOURCE_REQUIRED, because dataSource is not a rung of the record-source ladder. It shows a lane-less board is a documented authoring; it is not a document this change admits.

.changeset/list-user-actions-collision-5398.md

  • names ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    The harvest now reads the object block only. Both userActions read sites in ListView.tsx carry a comment naming the collision, and __tests__/ListView.userActionsCollision.test.tsx pins each clause of it: the two shapes, a producer that manufactures the view one, the harvest's blindness to it, and the projection that must keep the object's operand with a toolbar block — or an empty block — present on the view.

.changeset/listview-comment-pair-4559.md

  • names ListView.tsx → packages/plugin-list/src/ListView.tsx — edited by this change

    Two comment corrections in ListView.tsx (objectui#4559, objectui#4966). No runtime behaviour changes and the emitted bundle is byte-identical; the published .d.ts does change, which is why this is a patch rather than an empty frontmatter.

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 born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), 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 3335767b4 (merge-base with origin/main): 5 file(s) changed outside .changeset/, read against 1371 pending declaration(s) that publish a body (1946 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3043.7 KB 3104.5 KB
Main entry chunk (gzip) 148.4 KB 350 KB
Entry file index-C-NAxRWS.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.68KB 6.20KB
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) 27.95KB 10.04KB
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.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
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) 542.46KB 129.64KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 224.12KB 62.26KB
fields (index.js) 255.56KB 64.73KB
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.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.28KB 11.09KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
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) 16.01KB 3.93KB
plugin-calendar (index.js) 51.44KB 14.62KB
plugin-charts (index.js) 72.54KB 20.26KB
plugin-chatbot (index.js) 198.27KB 47.18KB
plugin-dashboard (index.js) 133.45KB 35.33KB
plugin-designer (index.js) 216.12KB 44.37KB
plugin-detail (index.js) 260.94KB 67.93KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 146.34KB 37.47KB
plugin-gantt (index.js) 168.47KB 41.53KB
plugin-grid (index.js) 215.43KB 58.90KB
plugin-kanban (index.js) 49.30KB 15.39KB
plugin-list (index.js) 114.17KB 28.21KB
plugin-map (index.js) 22.05KB 7.14KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.64KB 8.94KB
plugin-tree (index.js) 10.74KB 3.76KB
plugin-view (index.js) 85.86KB 21.38KB
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) 114.58KB 37.60KB
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 (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.78KB 2.56KB
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) 18.27KB 6.20KB
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) 5.00KB 2.39KB
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) 17.15KB 6.32KB
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

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 25, 2026 01:04
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 25, 2026
Merged via the queue into main with commit 57a2bc2 Sep 25, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-10222-retire-metafields-reads branch September 25, 2026 01:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

1 participant