Skip to content

feat(types)!: retire sixteen NamedListView members as ?: never tombstones (objectui#7924) - #10285

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-7924-named-list-view-retire
Sep 24, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-7924-named-list-view-retire

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #7924

Clause-②: yes (the declared surface grows by two protocol blocks, then narrows by eighteen tombstones; an isolated at-tier contract review happens before enqueue)

The Clause line above is copied verbatim from the claim. Two of its figures did not survive re-measurement, see "What moved from the dispatch" below: the surface does not grow (both blocks were already declared), and it narrows by sixteen, not eighteen.

Executes buckets ② A and ③ of the director-seat ruling on objectui#7924 (issuecomment-5690906005). This PR does not do bucket ① (having the object-view delegation read the 23 protocol-declared members off the named view), so the card stays open.

What changed

  • packages/types/src/objectql.ts, NamedListView: sixteen ?: never tombstones. Each docblock carries @deprecated RETIRED (objectui#7924) and names the key to write instead.
    • Bucket ② has eight legacy spellings. showSearch, showSort, showFilters, showHideFields, showGroup, showColor and showDensity point at userActions.search, .sort, .filter, .hideFields, .group, .rowColor and .rowHeight. showDescription points at appearance.showDescription.
    • Bucket ③ has eight members the protocol declares nowhere and no renderer acts on: addDeleteRecordsInline, addRecordViaForm, clickIntoRecordDetails, collapseAllByDefault, color, fieldTextColor, prefixField, wrapHeaders.
  • ⛔ The runtime fold in packages/core/src/utils/normalize-list-view.ts is untouched. Stored documents keep parsing and keep being folded. Only the authoring face changed.
  • ⛔ No alias mapping was added anywhere.
  • Census pin packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts:
    • The AST walker now also reports the tombstone set (a member whose type node is the never keyword) and each member's docblock.
    • A new describe block pins the tombstone set by name. It asserts that the set is exactly bucket ② plus bucket ③ minus the two retained members, and that no tombstone is a protocol key or read off a named view.
    • Each bucket-② docblock names its canonical block.key.
    • Type-level: a pin that every tombstone resolves to undefined, plus sixteen @ts-expect-error literals, one for each tombstone.
    • Protocol-shaped userActions / appearance values are accepted on a literal and also parse against the protocol's own ObjectListViewSchema slots. A legacy spelling as control does not parse.
    • The two retained reads are pinned by source text, with a firing control.
    • The bucket-③ gloss "no runtime fold, and no reader on any path" is corrected. Its membership is unchanged.
  • p1-spec-alignment.test.ts: the only TS authoring site of the retired keys in the repo. It is migrated to userActions / rowColor.
  • content/docs/plugins/plugin-view.mdx: the NamedListView row now says where the toggles live.
  • .changeset/7924-named-list-view-retire.md: minor on @object-ui/types, with the BREAKING banner and the ADR-0087 disposition line. ⛔ Not major.

What moved from the dispatch (reported, not smoothed)

  1. Step 1 is a no-op. NamedListView already declares userActions?: ListViewSchema['userActions'] and appearance?: ListViewSchema['appearance']. They are spec-derived by indexed access and landed with objectui#8980. Nothing was added.
  2. Two bucket-③ members are read, so they are NOT tombstoned. Per the dispatch, work stopped on these two:
    • allowExport has this relay line in app-shell's object page: allowExport: viewDef.allowExport ?? listSchema.allowExport,. There, viewDef is the active view resolved from objectDef.listViews, which app-shell's own ViewConfigPanel / view-config-adapter headers call a flat NamedListView. ListView then gates export on schema.allowExport !== false &&.
    • densityMode is relayed the same way (densityMode: viewDef.densityMode ?? listSchema.densityMode,). normalizeListViewSchema then folds it onto top-level rowHeight (const legacyDensity = s.densityMode;). So it is a legacy spelling with a runtime fold, the bucket-② shape. Its canonical key is top-level rowHeight, ⛔ not userActions.rowHeight, which is a boolean toolbar toggle.
    • Control for these two: app-shell relays prefixField in exactly the same way, and nothing downstream reads it. ListView has zero prefixField hits against non-zero allowExport hits on the same query. That difference is why prefixField was tombstoned.
  3. Tombstone pointers. The ruling allowed color to point at userActions.rowColor. It points at the top-level rowColor: { field } configuration instead, and warns off userActions.rowColor. The reason: color names a FIELD, and userActions.rowColor is a boolean panel toggle. App-shell's own relay comment draws the same line. addRecordViaForm points at the protocol's userActions.addRecordForm ("Add records through a form instead of inline"). Both are text only.

Figures, and the instrument for each

  • Declared members: 64, required label only. Measured by a TypeScript AST walk: the census pin, plus a language-service script over the root tsconfig. The count does not move, because a tombstone is still a declared member. That is what makes the refusal work by name.
  • Typed authoring and read sites of the eighteen: a language-service findReferences on each member's declaration, over the 4858 files in the root tsconfig. It found hits in one file only, p1-spec-alignment.test.ts, for showSearch / showSort / showFilters / color. Control: columns returned 6 references in plugin-view.
  • Untyped reads (through any): an AST name scan over packages/*/src, apps and examples (4799 files). It covered property access, element access, object-literal keys, destructuring and declarations. Absent control zzqNoSuch returned 0. This scan found the app-shell relay and the two live downstream reads.

Consumer fixes

None needed. After rebuilding the closure, tsc on plugin-view, app-shell, plugin-dashboard and plugin-grid (the four packages that type against ObjectViewSchema / NamedListView) is green with zero edits. That matches the findReferences reading. The Studio literal carrying addDeleteRecordsInline: true is a list-view schema cast as never, not a NamedListView, and is untouched. Legacy stored data read through loose types (activeView?.showSearch in app-shell) is untouched by design.

Verification, at 360a4fc9a (after merging origin/main 06b82b8c3)

  • pnpm --filter @object-ui/types type-check: all three tsc invocations echoed, including tsconfig.test.json, exit 0.
  • pnpm exec vitest run packages/types/: Test Files 214 passed (214), Tests 4941 passed (4941).
  • Consumer closure: turbo run build --concurrency=2 with the four ^... filters gave 28 successful, 28 total. The rebuilt dist/objectql.d.ts carries showSearch?: never;. Then type-check on the four consumers: all four Done, exit 0.
  • eslint --no-inline-config --format json on the three changed TS files: 3 files, 0 errors, 34 warnings. The warnings are pre-existing no-explicit-any, and origin/main's objectql.ts reads the same 34. eslint.config.js enables no type-aware linting, so this diff cannot move a verdict on any untouched file. The repo-wide pnpm lint is CI's.
  • check-changeset-presence 0, check-changeset-no-major 0, check:spec-symbols 0, check:new-line-citations 0 (0 new citations), check:control-bytes 0, and check-governed-queue-guard --test over the five paths reports NOT GOVERNED.
  • Reverse verification, run after the fix was committed. showSearch?: never; was replaced by showSearch?: boolean; through ablation-replace.mjs. Proof it landed: anchor count went 1 to 0, and blob f836ad51 became b310c292.
    • Result: tsc -p tsconfig.test.json exited 2 with exactly two errors. One is TS2344 on the every-tombstone-is-undefined pin. The other is TS2578, an unused @ts-expect-error, on the showSearch refusal literal.
    • Vitest on the census went 2 failed | 227 passed. The two failures are the tombstone-set pin and the showSearch canonical-key pin.
    • Restored with git checkout HEAD --. The blob is back to f836ad51 = HEAD, and git diff HEAD is empty.

Not run locally, declared to CI: the full pnpm test, the repo-wide pnpm lint, and vitest for the consumer packages. No runtime file changed, so their runtime tests measure nothing this PR moved.

Acceptance notes

  • The census's "unread" is scoped to the object-view renderer's reads off schema.listViews. App-shell's object page also holds a named view, as its active view, and relays many bucket-① members off it into list-view. Anyone doing bucket ① should re-measure against both hosts, not only plugin-view.
  • userActions.editInline sits beside addRecordForm in the protocol. Nothing here maps addDeleteRecordsInline to it, because the semantics differ (inline editing, as opposed to inline add and delete).

Generated by Claude Code

…stones (objectui#7924)

Bucket 2 A and bucket 3 of the director-seat ruling on objectui#7924.

- The eight legacy `show*` spellings become tombstones whose docblocks name
  the canonical `userActions.X` / `appearance.showDescription` key. Both blocks
  were already declared (objectui#8980), so that step of the ruling is a no-op.
- Eight protocol-silent, unread members retire the same way.
- `allowExport` and `densityMode` are NOT retired: each is read
  (ListView's export gate; the runtime density fold onto `rowHeight`).
- The runtime fold in normalize-list-view.ts is untouched.
- Census pin gains an AST-derived tombstone partition, per-member
  compile-time refusals and protocol-shaped accepts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01877XiBYSaRCk2CU7cMSg3S
@github-actions

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 25 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/5903-objectgantt-declared-keys.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    Both halves move together. The TS declaration (packages/types/src/objectql.ts) and its zod mirror (src/zod/objectql.zod.ts) gain the same ten keys at the same requiredness — all optional — and no KnownDrift entry is added. navigation is taken from @objectstack/spec's NavigationConfigSchema by reference rather than restated, matching ObjectGridSchema.navigation.

.changeset/6310-designer-formula-key-retired.md

  • names packages/plugin-designer/src/hooks/useDesignerTranslation.ts → packages/plugin-designer/src/hooks/useDesignerTranslation.ts — edited by this change

    objectui#6043 retired the Field Designer's formula-expression textarea, which was the key's only call site (FieldDesigner.tsx, the { name: 'formula', label: t('appDesigner.fieldDesigner.formula') } field descriptor). The value outlived it in eleven places: DESIGNER_DEFAULT_TRANSLATIONS in packages/plugin-designer/src/hooks/useDesignerTranslation.ts, and the appDesigner > fieldDesigner > formula leaf of packages/i18n/src/locales/{en,de,es,fr,pt,ru,ja,ko,zh,ar}.ts.

.changeset/6661-app-launcher-nav-menu-renderers.md

  • names en.ts → packages/i18n/src/locales/en.ts — edited by this change

    Three new strings — the launcher's and the menu's accessible names, and the menu's empty state — are declared under console.nav in en.ts and its nine sibling packs. An inline defaultValue alone is not a fix: it renders English at one call site and leaves the string untranslatable everywhere (objectui#3517).

.changeset/7322-object-kanban-group-by-limit.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Breaking for authored metadata: ObjectKanbanSchema.groupField is RETIRED (objectui#7322, ADR-0049 enforce-or-remove), and the two keys the object-kanban renderer actually reads — groupBy and limit — are now DECLARED and validated on both published faces: the TypeScript interface in objectql.ts and the Zod mirror in zod/objectql.zod.ts.

.changeset/7363-objectql-union-arms.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectGallerySchema and ObjectDataTableSchema are members of ObjectQLComponentSchema on both faces — the TS union in objectql.ts and the zod union in zod/objectql.zod.ts — so AnyComponentSchema, and with it validateSchema / safeValidateSchema / objectui validate, has an arm for object-gallery and object-data-table nodes (objectui#7363).

.changeset/7632-shared-record-source-config.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    That ladder is published contract on both faces — packages/types/src/objectql.ts and its zod mirror both ship .describe() strings naming getDataConfig's order (objectui#6939, maintainer ruling 2026-09-02), pinned by objectql-record-source-refinement-6939.test.ts — and it was hand-copied into five plugin components with no gate holding them together. A change to the ruled order had five edit sites and nothing that noticed a missed one; that is the AGENTS.md #0.1 drift class.

.changeset/7804-objectql-handler-key-arms.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The four plain objectql.ts node faces declare the nine handler keys their registered renderers read (objectui#7804, the objectql.ts slice): ObjectFormSchema.onCancel / .onError / .onOpenChange / .onStepChange / .onSuccess, ObjectGallerySchema.onCardClick / .onRowClick, ObjectGridSchema.onNavigate and ObjectViewSchema.onNavigate.

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

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    'runtime-slot' and not 'retired', measured at this key's own channel. 'retired' publishes "no renderer reads this key, so nothing could ever run it" — true of the two siblings already tombstoned on this arm (onSelectChange, onExpandChange) and flatly false here, since the read is live and INVOKED. ⚠️ No in-repo host builds a tree-view node carrying the key: the channel is wired end to end and only the supplier is absent, which is the same shape as ObjectFormSchema.onStepChange in this card's objectql.ts slice and is not evidence of a dead read. The TypeScript declaration is unchanged and still callable, so a programmatic host supplies it exactly as before.

.changeset/7963-alert-dialog-footer-keys-retired.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Nothing else moves. These spellings are overloaded across the tree and every other owner is a live key on a different declaration — FormSchema.cancelLabel, objectql.ts's confirmLabel, plugin-designer's ConfirmDialog React props, plugin-grid's def.confirmLabel, and plugin-form's ModalForm / DrawerForm, which build a local cancelLabel from schema.cancelText. None is an AlertDialogSchema; none is touched, and a pin asserts it. No fixture, catalog schema, example app or doc fence authored any of the three on an alert-dialog node, so no shipped document is stranded.

.changeset/8221-retire-legacy-string-sort.md

  • names content/docs/plugins/plugin-view.mdx → content/docs/plugins/plugin-view.mdx — edited by this change

    Docs teach the array only: content/docs/plugins/plugin-map.mdx, content/docs/plugins/plugin-view.mdx and packages/plugin-view/README.md.

.changeset/8604-record-details-columns-enum.md

  • names p1-spec-alignment.test.ts → packages/types/src/__tests__/p1-spec-alignment.test.ts — edited by this change

    ⚠️ The census behind this narrowing covers this repository only: one in-repo call site wrote the number (p1-spec-alignment.test.ts), and it is corrected in the same change. A TypeScript consumer of @object-ui/types outside this repo that wrote columns: 2 is not observable from here and gets a compile error (TS2322) naming the key — which is why the FROM/TO is spelled out above. Nothing to migrate at runtime: the renderer passes the authored value straight through, and the registry manifest (@object-ui/plugin-detail) already published this key as type: 'enum', enum: ['1','2','3','4'], so the published TypeScript face was the only layer that disagreed.

.changeset/8767-object-grid-refuses-string-sort.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    Migration. Write the array: sort: [{ field: 'name', order: 'desc' }]. Both keys are required. SortConfig.order carries no ? in @object-ui/types (packages/types/src/objectql.ts) and no .optional() in its zod mirror, and the protocol's own reusable SortItemSchema requires order as well — measured: that schema refuses [{ field: 'name' }] with invalid_value at 0.order. Do not omit it: this block's array arm interpolates whatever is present, so an omitted order lowers to $orderby: 'name undefined' today. That is pre-existing behaviour on the arm this change does not touch, and it is filed as a successor card rather than widened into here.

.changeset/8801-object-kanban-allow-collapse-retired.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    • the declarations retired here — packages/types/src/objectql.ts and its mirror packages/types/src/zod/objectql.zod.ts; - the pins that assert the retirement — object-kanban-allow-collapse-retired-8801.test.ts and bare-kanban-node-key-retired-8802.test.ts; - a comment in packages/types/src/zod/complex.zod.ts, recording that the deleted retiredZeroReadKanbanKey helper once carried this spelling on the SIBLING arm; - one row of content/docs/api/schema-reference.md; - the .changeset/ release notes that discuss it — this one, the two historical entries covering the sibling arm's own spelling, and objectui#9629's note recording the correction to this paragraph.

.changeset/8885-object-chart-drilldown-title-compareto.md

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectChart.tsx reads all three off schema, and until now neither published copy declared any of them: not the TS interface (packages/types/src/objectql.ts) and not the zod mirror (packages/types/src/zod/objectql.zod.ts). They rode BaseSchema's index signature / .passthrough() and arrived unvalidated. drillDown was the sharpest case — this component's registry inputs advertise it to the designer palette, and @objectstack/spec publishes ChartDrillDownSchema for exactly this carrier, so an author was offered a key that neither published shape mentioned.

.changeset/8913-object-kanban-columns-declared.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    What moved. ObjectKanbanSchema gains columns on both halves that move together — the TypeScript interface (objectql.ts) and its Zod mirror (zod/objectql.zod.ts). Retiring the bare kanban node type key (objectui#8802) removed the only face that judged a lane, and object-kanban had never declared the key, so it rode BaseSchema's [key: string]: any / .passthrough(): read by the renderer at three sites, named by no published face.

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

  • names packages/types/src/objectql.ts → packages/types/src/objectql.ts — edited by this change

    @objectstack/spec declares the key optional — groupBy: z.string().optional() on ObjectKanbanPropsSchema — while this package required it on the TypeScript declaration (packages/types/src/objectql.ts) and on the Zod mirror (packages/types/src/zod/objectql.zod.ts). objectui was therefore narrower than the protocol on a published key: ObjectKanbanSchema.safeParse and safeValidateSchema refused an object-kanban node the protocol accepts, and such a node could not be annotated with its own type.

.changeset/9040-retire-record-details-layout.md

  • names packages/types/src/__tests__/p1-spec-alignment.test.ts → packages/types/src/__tests__/p1-spec-alignment.test.ts — edited by this change

    • packages/types/src/__tests__/p1-spec-alignment.test.ts wrote layout: 'stacked' on this interface and read it back. Both lines are gone, with the reason stated at the site and a live-key read-back put in their place so the leg is not quietly shrunk. Its RecordHighlightsComponentProps neighbour keeps its own layout — a different key on a different face. - packages/types/src/__tests__/record-details-top-level-9040.test.ts ledgered the divergence as OPEN. Those legs become the retirement's own: a keyof absence assertion (with a declared key read through the identical form as its control), a @ts-expect-error literal, and a new source-text leg. - packages/types/src/__tests__/record-highlights-layout-9187.test.ts read this declaration as TEXT, using its three-value layout as the lit control for a two-member assertion about the sibling. That control MOVED to RecordChatterComponentProps.position — a three-value union the contract genuinely declares — as that file's own instruction required. It was never to be deleted outright, and it is not.

.changeset/9092-inline-locale-declared-face.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    • AppComponentSchema.label (app.ts) - ObjectGridSchema.label and .description (objectql.ts) - PageNodeSchema.aria.ariaLabel (layout.ts)

.changeset/9187-record-highlights-layout-two-values.md

  • names p1-spec-alignment.test.ts → packages/types/src/__tests__/p1-spec-alignment.test.ts — edited by this change

    ⚠️ The census behind this narrowing covers this repository only, and it found no in-repo authoring to migrate: every in-tree layout: 'grid' belongs to a different component (detail-view in content/docs/api/schema-reference.md and phase2-schemas.test.ts, ai-recommendations in packages/plugin-ai/README.md), and the one in-repo consumer of this interface that writes a layout (p1-spec-alignment.test.ts) writes 'horizontal'. So no document in this repository stops type-checking. A TypeScript consumer outside this repo that wrote grid is not observable from here and gets a compile error (TS2322) naming the key — which is why the FROM/TO is spelled out above.

.changeset/9309-object-gallery-filter-destination-typed.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectGallerySchema.filter is typed as the destination its own docblock names — QueryParams['$filter'] — on both faces, the TS interface in objectql.ts and the zod mirror in zod/objectql.zod.ts (objectui#9309).

.changeset/9511-record-id-is-a-string.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The three authorable keys, each on BOTH faces. ObjectFormSchema.recordId (objectql.ts + zod/objectql.zod.ts), DetailViewSchema.resourceId (views.ts + zod/views.zod.ts) and DetailSchema.resourceId (crud.ts + zod/crud.zod.ts). ⚠️ The crud pair is DetailSchema, not DetailViewSchema, and it reaches the same renderer — not by symbol but by data flow: plugin-detail registers the 'detail' node type onto DetailView. A read that follows TypeScript symbols alone finds two keys and is incomplete.

.changeset/9549-tree-filter-declared.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectTreeSchema.filter is declared on both faces, in the shape objectui#9309 settled for ObjectGallerySchema.filter: QueryParams['$filter'] by indexed access on the TS interface in objectql.ts, and the same two-arm union (array first) on the zod mirror in zod/objectql.zod.ts (objectui#9549).

.changeset/9550-object-tree-root-barrel.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    ObjectQLComponentSchema declares the node types an ObjectQL block may be. Every one of its arms was a named export of this package's root barrel except ObjectTreeSchema, which was declared in objectql.ts, applied by the union, and re-exported by the ./zod barrel (objectui#7917) — while no TypeScript consumer could name it. There is no ./objectql subpath to reach around the barrel: the package's exports map is pinned by packages/types/src/__tests__/package-exports-manifest.test.ts, and the root barrel was the only route to this type.

.changeset/9606-object-kanban-card-title.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    Both published faces of the object-kanban arm now name the key: the zod mirror ObjectKanbanSchema in zod/objectql.zod.ts and its TypeScript twin, the ObjectKanbanSchema interface in objectql.ts. Both declare it OPTIONAL, at the same requiredness the other face uses, so the two faces accept and refuse the same documents. (Located and cited by SYMBOL: line addresses in zod/objectql.zod.ts have drifted before, and this change is itself about a drifted mirror.)

.changeset/9628-kanban-column-collapsed-honoured.md

  • names objectql.ts → packages/types/src/objectql.ts — edited by this change

    The key was declared on both published faces of the object-kanban arm — the lane element of ObjectKanbanSchema (objectql.ts and its Zod mirror) and the runtime lane KanbanColumn (complex.ts and its mirror) — and read by KanbanEnhanced alone, a module no production source imports. An authored { "id": "todo", "title": "To Do", "collapsed": true } therefore parsed green on both faces and reached a board that did nothing with it: KanbanImpl's only collapse is the SWIMLANE row's, held in viewer state under objectui:kanban-collapsed:ANGLE-BRACKETS(swimlaneField) and never keyed to a lane's declared value. That is the ADR-0049 declared-but-unhonoured shape.

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.

Angle-bracketed names in the quoted prose above are rewritten as ANGLE-BRACKETS(name): GitHub deletes tag-shaped fragments from a stored body, and a quote that silently loses the identifier it is about is worse than a visible repair.

Compared the checked-out tree with 8b1f06619 (merge-base with origin/main): 17 file(s) changed outside .changeset/, read against 1295 pending declaration(s) that publish a body (1864 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3038.5 KB 3104.5 KB
Main entry chunk (gzip) 147.8 KB 350 KB
Entry file index-CoBxOI-2.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) 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) 547.83KB 131.37KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 222.47KB 61.83KB
fields (index.js) 253.41KB 64.01KB
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) 33.36KB 10.88KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.02KB 11.00KB
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) 14.81KB 3.63KB
plugin-calendar (index.js) 51.44KB 14.62KB
plugin-charts (index.js) 71.82KB 20.13KB
plugin-chatbot (index.js) 198.27KB 47.18KB
plugin-dashboard (index.js) 133.00KB 35.19KB
plugin-designer (index.js) 215.98KB 44.34KB
plugin-detail (index.js) 258.85KB 67.53KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 144.77KB 37.17KB
plugin-gantt (index.js) 167.99KB 41.37KB
plugin-grid (index.js) 215.46KB 58.88KB
plugin-kanban (index.js) 48.83KB 15.21KB
plugin-list (index.js) 113.90KB 28.11KB
plugin-map (index.js) 21.74KB 7.07KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.68KB 8.95KB
plugin-tree (index.js) 10.56KB 3.71KB
plugin-view (index.js) 85.18KB 21.05KB
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) 106.60KB 35.16KB
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.38KB 1.98KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.74KB 2.54KB
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) 15.71KB 5.30KB
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

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 360a4fc9ae7753251310013f38adbe406fe97fdc

① Derived judgments

Checked in a detached worktree at this head:

  • packages/types tsc on all three tsconfigs: exit 0.

  • vitest on the two changed test files: 268 tests passed.

  • Ablation: changing showSearch?: never back to boolean gives exactly TS2344 plus TS2578, and 2 census tests fail. After restoring, the diff is empty.

  • Faithful to ruling 5690906005. userActions and appearance were already the spec-derived slots (objectui#8980), so step ② A-1 was genuinely a no-op, and the pin proves they are spec-derived. All eight show* spellings are ?: never, each naming its canonical key. 8 of the 10 bucket-③ members are tombstoned. The runtime fold in normalize-list-view.ts is byte-identical to main, and no alias was added.

  • 16 tombstones, counted from the syntax tree, equal to the bucket-② set plus the bucket-③ set minus allowExport and densityMode.

  • None of the 16 is a protocol key on a view. Checked against UserActionsConfigSchema, AppearanceConfigSchema and the list-view shape.

  • No renderer or host reads any of them, checked across both hosts:

    • plugin-view's object-view reads 21 names, none of the 16.
    • app-shell's ObjectView.tsx relays the bucket-③ names off an any-typed activeView. The only terminal readers are ListView's allowExport !== false export gate and the densityMode fold, which are exactly the two members retained.
    • wrapHeaders and a bare color have no reader after the relay.
  • Scope note, not a defect: app-shell also reads bare showSearch / showFilters / showSort off the any-typed active view at runtime. Stored documents keep working, and the fold's canonical-wins rule keeps userActions.* authoritative. The census's "not read off a named view" is measured against plugin-view's derivation only.

  • Stored-document parsing is unaffected. listViews has no zod mirror, ?: never is type-level only, and the fold is pinned.

  • The docblock replacement keys are all correct. color points to top-level rowColor: { field } (RowColorConfigSchema), not the boolean userActions.rowColor. addRecordViaForm points to userActions.addRecordForm, which exists on the spec.

  • No consumer fixes were needed. The only typed authoring site (p1-spec-alignment.test.ts) was migrated.

② Semver level

minor on @object-ui/types is correct. Under AGENTS.md's fixed-group policy, a breaking change is declared minor with its semantics in the body. The changeset has the BREAKING banner, a before/after snippet, the retired-to-canonical table, the two retained members, and the ADR-0087 disposition line.

③ Boundary flags

  • dist/objectql.d.ts carries the 16 tombstones. That is the intended breaking change on the authoring face.
  • The change is type-only: no .js output changes, and zod and the core fold are untouched.
  • No new or removed exports, and no changes to package.json contract fields.
  • Docs: plugin-view.mdx is updated. packages/plugin-view/README.md is less informative but not stale, and not blocking.

Implemented-by: claude/issue-7924-named-list-view-retire
Reviewed-by: session_01877XiBYSaRCk2CU7cMSg3S

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

CI blocker, not this PR's: Spec Main Shape Gate. From the domain:spec @ objectui PM seat, session session_01877XiBYSaRCk2CU7cMSg3S.

  • Failing: packages/plugin-designer/src/NavigationDesigner.tsx:82, TS2741: Property 'doc' is missing. As a consequence, app-shell/src/console/AppContent.tsx:75-77 gets TS7016 because plugin-designer did not build.
  • Why it is not this PR's: objectstack ccccdcc35eac (objectstack#19789, 「doc navigation item」) widened NavigationItemType with doc, and NAV_TYPE_META is a Record over that union. This PR does not touch plugin-designer. The failure reproduces on every objectui head built against spec main, and is tracked as objectui#10287. objectui main's last green run of this gate predates that commit.
  • Fix: none exists yet (no PR on Spec Main Shape Gate red on every PR head: plugin-designer NavigationDesigner has no doc entry after objectstack#19789 added the doc navigation type #10287), so nothing can be ported. Proposed patch for whoever takes Spec Main Shape Gate red on every PR head: plugin-designer NavigationDesigner has no doc entry after objectstack#19789 added the doc navigation type #10287: add a doc row to NAV_TYPE_META, for example doc: { labelKey: 'appDesigner.navTypeDoc', color: 'bg-cyan-100 text-cyan-700', Icon: BookOpen } (import BookOpen from lucide-react), plus the navTypeDoc i18n key. The label and icon are a domain:ui choice.
  • Every other check on head 360a4fc is green (39 success, plus the 3 expected skips). The contract review record at this head is PASS.
  • Once the fix is on main: merge main if the gate still reads the old base, re-run, then ready and enqueue. There is no re-run before then, because the same upstream commit would give the same result.

Generated by Claude Code

… navigation item type

objectstack#19789 widened the spec's navigation item union with `doc`, and
`NAV_TYPE_META` is a Record keyed by that spec-derived union, so objectui
stopped compiling against @objectstack/spec built from objectstack main (the
Spec Main Shape Gate, TS2741 on NavigationDesigner).

- `doc` entry: `appDesigner.navTypeDoc`, `bg-blue-100 text-blue-700`, `BookOpen`.
- The map is typed `Record<NavigationItemType | 'doc', ...>`: the pinned spec
  17.4.0 has no `doc`, so a plain `doc:` key is an excess property there. The
  `| 'doc'` goes at the pin bump that ships `doc`.
- `appDesigner.navTypeDoc` fallback in useDesignerTranslation and all ten
  locale packs.
- Guard test: every discriminant of the installed spec's NavigationItemSchema
  renders a row with a resolved type badge (spec subset of map, not equality).
- `doc` is deliberately NOT in QUICK_ADD_TYPES: an empty doc item fails the
  spec's book-or-doc requirement; authoring it is objectui#10188.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC
(cherry picked from commit 6f970da)
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3039.2 KB 3104.5 KB
Main entry chunk (gzip) 147.8 KB 350 KB
Entry file index-DOH1fdA5.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) 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) 541.66KB 129.51KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 222.47KB 61.83KB
fields (index.js) 253.41KB 64.01KB
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) 33.36KB 10.88KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.15KB 11.05KB
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) 14.81KB 3.63KB
plugin-calendar (index.js) 51.44KB 14.62KB
plugin-charts (index.js) 71.82KB 20.13KB
plugin-chatbot (index.js) 198.27KB 47.18KB
plugin-dashboard (index.js) 133.00KB 35.19KB
plugin-designer (index.js) 216.12KB 44.37KB
plugin-detail (index.js) 258.85KB 67.53KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 144.77KB 37.17KB
plugin-gantt (index.js) 167.99KB 41.37KB
plugin-grid (index.js) 215.46KB 58.88KB
plugin-kanban (index.js) 48.83KB 15.21KB
plugin-list (index.js) 113.90KB 28.11KB
plugin-map (index.js) 21.74KB 7.07KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.55KB 11.99KB
plugin-timeline (index.js) 30.68KB 8.95KB
plugin-tree (index.js) 10.56KB 3.71KB
plugin-view (index.js) 85.18KB 21.05KB
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) 110.46KB 36.33KB
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 24, 2026 18:01
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 24, 2026
Merged via the queue into main with commit aa083cd Sep 24, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-7924-named-list-view-retire branch September 24, 2026 18:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant