Skip to content

test(core): pin the page list-view residual, and report the usage census objectui#8429's grade is blocked on - #8684

Merged
os-justin merged 1 commit into
mainfrom
claude/issue-8429-page-view-usage-census
Sep 9, 2026
Merged

test(core): pin the page list-view residual, and report the usage census objectui#8429's grade is blocked on#8684
os-justin merged 1 commit into
mainfrom
claude/issue-8429-page-view-usage-census

Conversation

@os-justin

@os-justin os-justin commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

Part of #8429. ⛔ Deliberately not Fixes — that card is the registration of a residual with two open dispositions, and it must stay open until one of them is ruled. This PR takes neither.

What this is

objectui#8429 was dispatched for a measurement, not a fix. Two things ship here:

  1. a usage census of type: 'page' list views (the input triage's re-grading trigger needs, in both directions) — reported below;
  2. a disposition-free pin of the residual as it stands.

⛔ No page renderer was grown. ⛔ ViewType was not narrowed. Both are rulings, and the second would break the derivation PR #8372 just established.


⭐ Deliverable 1 — the census

The question

Triage wrote the trigger and then wrote that its input did not exist: page 视图的实际使用面 = 未测量。本卡没有测,本席也没有测。⛔ 按纪律不写成零。」

A zero returned because the query was wrong reads identically to a zero returned because the feature is unused, and the two send the card in opposite directions. So every sweep below is reported with its population, its lit control, and a dark control.

Repo half — MEASURED, result 0

Population: every tracked file at 7cdd2b9226,958 files (git ls-files | wc -l); 6,873 read as text by the classifier. Not scoped to packages/*/src (a form that matches nothing and excludes apps/, examples/, content/docs/).

Six declaration shapes swept for each candidate value, over the whole tree — TS/JS single- and double-quoted literals, JSON quoted-key, YAML, JSX attribute, and a bare quoted token — across all six view-type keys (type, viewType, specType, defaultViewType, defaultView, activeView):

git grep -nIE "(^|[^A-Za-z0-9_\"'])\"?(type|viewType|specType|defaultViewType|defaultView|activeView)\"?[[:space:]]*[:=][[:space:]]*[\"']<VALUE>[\"']" -- .
value files lines
grid 159 501
kanban 65 116
calendar 30 51
timeline 41 96
gantt 29 54
chart 43 77
tree 19 31
gallery 10 14
map 15 26
page 97 162
nonsense_control_xyz (dark control) 0 0

The 162 raw page lines are not view declarations. Classified mechanically (a 25-line lookback window for a list-view context, then read individually), all 162 fall into five classes, none of them an authored ListView:

  • the SDUI page component nodePageNodeSchema / OuiPageSchema, { type: 'page', kind: 'html' | 'react', body/regions }; this is examples/schema-catalog/src/schemas/components-layout-page/*.json, examples/hello-world/schema.json, and most docs fences;
  • navigation items{ type: 'page', pageName } on NavigationItem / ComponentNavItem;
  • the metadata-admin resource kindregisterMetadataResource({ type: 'page' }), <MetadataResourceEditPage type="page">, PagePreview, PageBlockInspector;
  • route / recent-item / studio-surface descriptors{ type: 'page', name };
  • prose — docblocks, CHANGELOGs and one changeset describing this very defect.

Narrowing to the keys that can only mean a view type:

git grep -nIE "(^|[^A-Za-z0-9_])(viewType|specType|defaultViewType|defaultView|activeView)[[:space:]]*[:=][[:space:]]*[\"']page[\"']" -- .

returns 5 lines, all of them this repo talking about the bug: two in normalize-list-view.test.ts (the existing regression test), three in docblocks (normalize-list-view.ts, views.zod.ts). viewType: 'page' is 2 lines, both prose; viewType: 'grid' is 214.

Second, independent probe. @objectstack/spec@17.3.0's checkListViewPageMount requires pageName on a type: 'page' view, so pageName is a different spelling of the same question. All 108 pageName lines in the repo sit on navigation items and page routing; objectui's own ListView face does not declare the key at all.

Array form (availableViews / viewTypes / views: [...] carrying 'page'): 0 hits; the same shape finds 3 for kanban/calendar, so it is lit.

Per-subtree lit control — every subtree containing view declarations is shown non-empty:

subtree tracked files with a KNOWN view kind files with page
packages 4362 247 74
examples 499 37 6
content 203 17 10
apps 265 5 3
skills 27 4 1
scripts 234 5 1

Repo half: 0 authored type: 'page' ListViews, on a sweep proven to find the nine kinds that are authored and proven to return 0 for a value that exists nowhere.

Corroborating: CreateViewDialog excludes page by construction (its picker is a total Record<ListViewVisualization, …>), so no in-repo surface can author one.

Published-package half — NOT MEASURED

The installed tree was reached: 78,690 files across 1,623 packages under node_modules/.pnpm. The same sweep returns 82 files for page, of which 56 are @objectstack/spec + @objectstack/lint — and every one of those is the contract declaring and enforcing page (the zod source, the dist bundles, json-schema/ui/ListView.json, the liveness ledger), never a usage. The rest are next, fumadocs, lightningcss — unrelated senses of the word.

⚠️ But the zero is uninformative, and is reported as NOT MEASURED rather than folded into the repo number. The lit control fails on this population: "listViews" appears in 24 installed files and "viewType" in 6, and every one of them is schema machinery (zod bundles, JSON Schemas, liveness ledgers). No installed package ships an authored ListView document of any kind — so "0 page views" there is a census over an empty set, which passes for free.

What the census means for the grade — triage's own trigger, applied

  • p1 leg (any real app or installed package declaring one) — not met; nothing found, on a lit sweep.
  • p3 leg (zero across the repo and the published packages, confirmed by a lit control) — half met. The repo half is zero-and-lit. The published half cannot be answered from this container, because the population contains no authored views at all.

⇒ On the trigger as written, p2 stands. Moving to p3 needs a population this container does not have (a real tenant/app metadata corpus). ⛔ And per triage, never close either way: the contract still accepts page and the next author can still write one.

⭐ Something the census turned up that outranks it

@objectstack/spec@17.3.0's liveness ledger (liveness/view.json) carries a maintainer ruling of 2026-08-29 on exactly the disposition this card leaves open, verbatim:

The enum also carries page, which routes nowhere in ListView by design — it delegates to the existing page renderer via the sibling pageName key (maintainer ruling 2026-08-29); the mount itself is objectui's half.

the RENDER half is objectui's and is delegation rather than new code — the ruling of 2026-08-29 is explicit that a page view hands off to the existing page renderer (「渲染委托既有页面渲染器」) … Necessary-not-sufficient in the ADR-0054 sense until the objectui mount lands: the refusals above are measured here, the pixels are not.

Upstream also enforces the shape already: checkListViewPageMount refuses a page view with no pageName, refuses pageName on any other kind, and refuses a non-empty columns beside it.

⛔ Nothing was acted on. It is reported because it bears directly on the ruling this card is waiting for: it suggests the answer is neither of the two dispositions triage forbade, but a third — a delegating mount — and it says upstream already considers objectui the owner of that half.


⭐ Deliverable 2 — the pin

packages/core/src/utils/__tests__/normalize-list-view.pageResidual-8429.test.ts (9 tests). It states the contradiction mechanically instead of in prose, and changes no behaviour.

The sharpest input available: a document @objectstack/spec's own ListViewSchema accepts —

{ name: 'account_page', type: 'page', pageName: 'crm_welcome', columns: [] }

— normalises to viewType: 'grid', with the pageName mount target still sitting in the metadata, unread.

⚠️ It asserts the normalised output, never that the constant contains the key — a pin on the declaration would reproduce the defect it records.

It reddens on either disposition, which is the point:

  • grow a page renderer ⇒ page becomes drawable ⇒ the residual set empties and the output stops being grid;
  • narrow ViewType ⇒ the published faces stop accepting page.

Guards against passing for the wrong reason:

  • every set is asserted at its exact size before use (spec vocabulary 10, objectui 12, drawable 9, undrawable 3) — a census over an empty set passes;
  • the spec's validator is exercised against three refusal controls, so the success: true is a reading and not a rubber stamp;
  • the 'grid' reading carries a discrimination control (kanbankanban, ganttgantt), so a normalizer that answered grid for everything — strictly worse than the bug — would fail;
  • the census is also stated as a property, not just a table: every spec-declared kind resolves to itself, except exactly one.

console.warn from #8372 is silenced, not asserted, and ⛔ not treated as a mitigation: it is a signal to the developer; the author still gets a grid. Its own behaviour stays pinned where it was.


⭐ Deliverable 3 — the sibling card: it exists, and the premise is stale

Triage asked for a card on the defaultViewType 7-arm family missing chart / tree, noting 「那张卡目前似乎还不存在」.

Not filed — one exists and it is already ruled. objectui#5321, "ObjectViewSchema.defaultViewType omits tree and chart, so two generateViewSchema branches are unreachable from authored metadata (host-prop only)"closed as completed on 2026-08-21.

Maintainer ruling of 2026-08-20 on that card (recorded verbatim in ObjectView.tsx): 「其他接受你的建议。」 — option B, tree and chart are recorded as host-composition-only surfaces, deliberately not added to the authored unions.

All three surfaces triage named are covered by it: packages/types/src/objectql.ts:1804, the zod twin at zod/objectql.zod.ts:348 (whose docblock says the seven arms are "the declaration's SEVEN-value union on purpose"), and plugin-view's registration (OBJECT_VIEW_HOST_COMPOSITION_VIEW_TYPES, pinned by objectViewHostSurface.test.tsx, which goes red the day either union grows a tree or chart member).

⇒ The observation is factually right and its reading as a gap is wrong. Filing a new card would re-litigate a standing ruling, and acting on it would redden a pin by design.


Verification

Ablation — four legs, each mutating a READ SITE (never the pin), from a committed tree, trap on EXIT/INT/TERM with absolute paths. Per-test classification from vitest's JSON reporter; all five death strings counted 0 on every leg. Baseline 9/9 pass.

leg read site mutated on-disk proof result
A — simulate grow a page renderer (page: true into LIST_VIEW_KINDS) core/src/utils/normalize-list-view.ts hash 9ec9c9d6…5e310ffd…; marker 0→1; lines 529→530 (Δ+1 as declared) 5 / 9 fail — residual set empties (expected [] to deeply equal [ 'page' ]), output flips (expected 'page' to be 'grid')
B — simulate narrow ViewType (drop page from the enum) types/src/zod/views.zod.ts hash 5c8a30dd…1334e8e5…; marker 0→1; lines 254→254 (Δ0) 4 / 9 fail — vocabulary 11≠12, undrawable 2≠3, face rejects page
Cempty the population (z.enum(['grid'])) types/src/zod/views.zod.ts hash 5c8a30dd…58a0d14b…; marker 0→1; lines 254→254 (Δ0) 4 / 9 failexpected 1 to be 12, expected 1 to be 9. The census does not pass over an emptied set.
Dnarrow ViewType at the type level types/src/views.ts, rebuilt so it reached dist/views.d.ts (verified: line 50 carries the Exclude) hash 7e6de89b…7b331e90…; lines 976→976 (Δ0) tsc -p packages/core/tsconfig.test.json exit 2, error on the pin itself: pageResidual-8429.test.ts(146,13): error TS2322: Type '"page"' is not assignable to type 'ViewType'

Every leg restored by state: git hash-object back to the HEAD blob, marker count back to 0, line total back, git diff HEAD empty. Leg D's rebuild was repeated after restore and dist/views.d.ts:50 verified back to the derived form; type-check back to exit 0.

⚠️ Recorded because it is the honest reading: on leg D's first run through pnpm --filter @object-ui/core type-check, the failure came from normalize-list-view.ts(197,3) — the existing derived-record totality catches the narrowing before the pin's own annotation is reached (tsc --noEmit && tsc -p tsconfig.test.json short-circuits). The pin's compile-time leg was then isolated on the test program alone, which is where the table's leg D reading comes from.

Gates and suites (exit codes captured before any pipe):

command result
pnpm exec vitest run packages/core/src/utils/__tests__/normalize-list-view.pageResidual-8429.test.ts Test Files 1 passed (1) · Tests 9 passed (9)
pnpm exec vitest run packages/core/ Test Files 133 passed (133) · Tests 2797 passed (2797)
pnpm --filter '@object-ui/core^...' build (dependency closure, run first) exit 0 — dist completeness: 126 emitted files verified
pnpm --filter @object-ui/core type-check exit 0
node scripts/check-changeset-presence.mjs ✅ 1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)… EMPTY frontmatter — declared as releasing nothing
node scripts/check-governed-queue-guard.mjs --test <both paths> ✅ NOT GOVERNED — 2 path(s) checked against 5 governed surface(s)
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' over both changed files no match

The pin is confirmed inside the type-check program, not merely adjacent to it: tsc -p packages/core/tsconfig.test.json --listFiles names it among 697 files.

⚠️ skip-changeset is a phantom label in this repo; the real exemption is the empty-frontmatter changeset, which is what .changeset/8429-page-view-residual-pin.md is.

Dedup

Declared, and lit. GitHub's search/issues endpoint is blocked for this session (sessions are bound to their configured repositories), so the channel was switched to one targeted MCP search_issues. It is self-controlling: it returned #8429 itself and #8127 at the top, so this is not one of the false zeros this repo has measured. Across 15 results, no other card records this residual#8127 is the declaration half and is closed.

Authored by an agent seat; session https://claude.ai/code/session_01YBWFb5YgMU5dw8p2VKj16S.


Generated by Claude Code

`page` is simultaneously a list-view type `@objectstack/spec`'s own
`ListViewSchema` accepts, a member of both published `@object-ui/types`
faces, and absent from the set `ListView` draws -- so a spec-valid
`type: 'page'` view normalises to `viewType: 'grid'` with its `pageName`
mount target left unread in the metadata.

PR #8372 closed the DECLARATION half of objectui#8127 by deriving
`ViewType` from the spec. This states the renderer half that derivation
made visible rather than removed, mechanically instead of in prose.

Disposition-free by construction: it asserts today's behaviour, so it
reddens if a page renderer is grown (the residual set empties and the
normalised output stops being `grid`) and equally if `ViewType` is
narrowed back (the published faces stop accepting `page`). Neither
open ruling can land silently now.

Every set is asserted at its exact size before use -- a census over an
empty set passes -- and the `grid` reading carries a discrimination
control so a normalizer that answered `grid` for everything would fail.

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

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3477.5 KB 3512.7 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-COlt_8eT.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) 15.67KB 5.75KB
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) 499.42KB 114.32KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.12KB 3.28KB
data-objectstack (index.js) 198.39KB 55.29KB
fields (index.js) 243.70KB 61.52KB
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) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
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.84KB 10.94KB
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) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.53KB 46.34KB
plugin-dashboard (index.js) 131.43KB 34.44KB
plugin-designer (index.js) 215.51KB 44.29KB
plugin-detail (index.js) 251.25KB 65.00KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.18KB 56.62KB
plugin-kanban (index.js) 55.44KB 15.73KB
plugin-list (index.js) 112.73KB 27.69KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.54KB 20.84KB
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) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
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.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
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.27KB 5.47KB
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-justin
os-justin marked this pull request as ready for review September 8, 2026 22:19
@os-justin
os-justin enabled auto-merge September 8, 2026 22:19
@os-justin
os-justin added this pull request to the merge queue Sep 8, 2026
Merged via the queue into main with commit 7e54fbc Sep 9, 2026
35 checks passed
@os-justin
os-justin deleted the claude/issue-8429-page-view-usage-census branch September 9, 2026 00:41
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.

2 participants