Skip to content

feat(deps): track @objectstack/spec 17.0.0-rc.2 and fix every break it lands (#3235, #3208, #3287, #3264) - #3315

Merged
xuyushun441-sys merged 3 commits into
mainfrom
claude/issue-3235-spec-rc2-pin-bump
Aug 3, 2026
Merged

feat(deps): track @objectstack/spec 17.0.0-rc.2 and fix every break it lands (#3235, #3208, #3287, #3264)#3315
xuyushun441-sys merged 3 commits into
mainfrom
claude/issue-3235-spec-rc2-pin-bump

Conversation

@xuyushun441-sys

@xuyushun441-sys xuyushun441-sys commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Fixes #3235
Fixes #3208
Fixes #3287
Fixes #3264

@objectstack/spec17.0.0-rc.1 抬到 17.0.0-rc.2,并修掉这次升级打出来的全部破坏。抬 pin 与修破坏不可分离提交(只抬 pin 则 CI 必红,只改代码则改的是尚未生效的形状),所以是一个 PR。

1. 抬 pin

30 个 package.json、32 处声明从 ^17.0.0-rc.1 改为 ^17.0.0-rc.2

外加 5 处兄弟包声明@objectstack/client / formula / lint,位于 app-shell / core / data-objectstack / apps/console)—— 这几个包把 @objectstack/spec 钉的是精确版本"@objectstack/spec": "17.0.0-rc.1",不是 ^)。不一起抬的话,lockfile 会同时留下 rc.1 与 rc.2 两份 spec,而 @objectstack/lintapp-shell 的依赖)会继续拿 rc.1 的 schema 去校验 —— 那套 schema 仍然接受本 PR 正在退役的键。

判据按工单要求以 lockfile 实际解析版本为准,不是区间字串:

$ grep -o "@objectstack/spec@[0-9a-zA-Z.-]*" pnpm-lock.yaml | sort -u
@objectstack/spec@17.0.0-rc.2

$ grep -c "17.0.0-rc.1" pnpm-lock.yaml
0

2. 三张单的处置

#3235 —— HttpMethod(选项 A)

// packages/types/src/objectql.ts
export type { HttpMethodType as HttpMethod } from '@objectstack/spec/ui';

@object-ui/types 公共表面不变,形状逐字相同,ApiDataSource 等下游零改动。没有改成从 ./shared 取 —— 那是 7 值枚举(含 HEAD / OPTIONS),与本仓 5 值语义不符。这条理由写进了注释,防止后来者"顺手统一"。

#3208 —— contextSelector 两键

rc.2 的 AppContextSelectorSchema 键集实测为 id / label / icon / optionsSource / allValue / persist —— includeAllplacement 确已移除。

  • packages/types/src/__tests__/report-chart-query-spec-parity.test.ts —— 删两条断言(valueKey / labelKey / persist 三条保留,仍是活的默认值)
  • packages/app-shell/src/layout/ContextSelectors.tsx —— 手写 ContextSelectorDef 删这两个可选字段;:244 那条解释"为什么无视 includeAll"的注释改写为"这两个键已不存在"

#3287 / #3264 —— app.homePageId 退役(路径 A)

落地语义统一为「nav 首项(按 order)+ isDefault 根落地」。

resolveLandingRoute() 收敛为一行 findFirstRoute(navigation, ctx)函数名与调用点保留 —— 上游记录的未来正确形状是 navigation[].landing 布尔标记,保留函数是给那个留的接点(本轮不实现它,按 enforce-first)。随之失去唯一调用者的 findNavItemById() 一并删除(已复核全仓仅那一处调用)。

清干净的位置:AppContent.tsx(分支 + :840 注释 + docblock 重写)、types/src/app.ts 声明、types/src/zod/app.zod.ts 注释、page-app-dashboard-spec-parity.test.ts 期望键、AppPreview.tsx + AppPreview.test.tsxapps/consolepreview-samples.ts / preview-samples-spec-valid.test.ts / RootLandingRedirect.tsx / README.md。全仓 grep(含 .json)零残留;只剩 CHANGELOG 等历史记录未动。

AppPreview 从"读 homePageId 并解析到某个 nav 项"改为派生落地项(首个可达导航项),与 shell 的 resolveLandingRoute 同构 —— 作者在预览里看到的落地页,就是运行时真正会去的那个。

docblock 按 #3264 口径重写:去掉 Salesforce "Default Landing" 与 CRM Sales Dashboard 的承诺,理由用更正后的那一版(形状问题:ID 交叉引用无引用完整性,悬空时静默回退首项),不是旧的"没人读"。

page-app-dashboard-spec-parity.test.ts:139#3264 提醒「以该测试自身语义为准,别盲改」处理:homePageId 在 rc.2 里仍是 shape 的一个键retiredKey() 墓碑),所以那条断言不会自动失败 —— 但继续把它列在"已声明的可写键"里会读成"仍可作者"。改为移出该列表,另起一条独立断言钉住墓碑会拒绝而不是 strip

2 行 JSDoc

packages/types/src/field-types.tsmobile_fullscreen 消费者补上 RichTextField(objectui#3301 / PR #3302)。

#3173 —— 本轮除名

已复核:rc.2 的 DashboardWidgetSchema.responsive 仍是 ResponsiveConfigSchema.optional(),与 rc.1 逐字相同。本仓写明原因的 any 未改动

3. 清单外的破坏(本轮最有价值的产出)

派单清单只覆盖"导出名从某入口消失"(5 处)。实测 typecheck + 全量测试 + build 另外打出 8 类,其中 3 类是静默通过变成响亮失败的既有缺陷:

# 位置 性质
1 NavigationAreaSchemavisible / order / requiredPermissions area 级三键退役。有真实消费者AppSchemaRenderer.AreaSwitcher 一直按它过滤区域 → objectui#3311
2 uiNotification / NotificationConfig 整包消失且无任何后继@object-ui/coreNotificationProtocol 是唯一消费者 → 删除(见下)
3 MetadataSaveOptions ./kernel./system(名字与含义不变,仅入口移动)
4 SchemaDiffEntryKind 新增 default_mismatch 枚举扩张;ValidationPanel 的穷尽 Record 按设计编译失败,补标签即可 —— 机制按预期工作
5 EmailTemplateSchema 移除 metadata-admin 的 email_template 校验器一直指错 schema → 改指 EmailTemplateDefinitionSchema(objectstack#4616 / #4807)
6 view 校验器指着 container 而非 ViewItem 容器收严后暴露:该类型的客户端校验从来是空过 → objectui#3312
7 近 20 个 registered metadata type 开始拒绝未知键 console 的 4 个样例草稿其实是错的(见下)
8 ActionSchema 新增 package-lock 信封 7 键 SPEC_ACTION_KEYS 清单重新派生

另有 managedBy: 'system' 这个 protocol 17 已退役的值散落在 6 个测试文件里。rc.2 的 resolveCrudAffordances 对它走"未知桶 → 默认可写"分支,于是一批"保持锁定"的断言不再锁定任何东西。改用 engine-owned(真正锁定的桶)后断言恢复承重。

静默通过 → 响亮失败的三处

console 样例草稿apps/console/src/preview-samples.ts)—— 这些是作者(以及生成元数据的模型)直接复制的"可用示例",此前靠非 strict 被 strip 才"通过":

  • view.list.object —— 容器根已声明 object,重复一层是错的
  • job.concurrency(无此键)、job.timeoutMstimeout(单位本就是毫秒)
  • email_template.from / .to —— 模板不是一次发送,没有 to;发件人覆盖是 fromOverride,且是 { name, address } 对象而非裸地址串
  • datasource.capabilities(objectstack#4583 移除:十一个 flag 全是声明了没人读,readOnly: true 并没有让任何东西只读)、datasource.healthCheck(非 datasource 键)

preview-samples-spec-valid.test.ts 的 LIMIT 段落原文写着 views / jobs / emailTemplates 不是 strict —— 这句话现在是假的,一并更正。

email_templateview 校验器见上表 5、6。两者都是「客户端校验器指向了不是该 metadata kind 实际解析到的那个 schema」,正是 objectstack#4616 特意提醒的那一类。

4. 需要复核的取舍(两处)—— PM 已裁决,均采 A

这两处不在任何一张单的原裁决范围内,实施侧按 AGENTS.md #0.1(契约优先、不在消费侧加宽容)做了选择,PM 复核后确认采 A,落地不变

  1. area 级 gating 跟随退役(objectui#3311)。AreaSwitcher 不再按 visible / requiredPermissions 过滤区域。能力没有丢失,只是下移到 item 级(NavigationRenderer 用的就是原来那两个 evalVis / checkPerm)。行为差异:某区域内 item 全被 gate 掉时,以前整块区域从切换器消失,现在渲染成"可见但空"。选它的理由是 spec 的 area 对象是 .strict(),v17 之后任何合法 app 都写不出这三个键,该过滤分支对平台接受的元数据已不可达。
  2. 删除 @object-ui/coreNotificationProtocol(objectui#3310)。它桥接的 spec 词汇整包消失且无后继;仓内零调用,真正在跑的是 @object-ui/react NotificationContext 里自己声明的同名 resolveNotificationConfig(两个同名函数并存本身就是隐患,core 那个还按名字遮住 react 那个)。反向做法是在本仓重新声明一套 spec 刚删掉的词汇,那会造出第二方言。⚠️ 这是 @object-ui/core 公共表面的删除

第三处(view 两形状,objectui#3312):PM 裁定接受本 PR 的分派修复,「哪个是唯一 authorable 形状」转上游,不在本仓解。

5. 上游前提错误(已另开单回传)

本轮又撞到两处与 homePageId 同型的"退役理由与事实不符":

  • objectui#3310 —— spec#4610 称 uiNotification / NotificationConfig 在三仓 "zero importers"、"objectui's toaster never adopted it"。实际本仓两处在用。漏扫原因是两跳叠加:本仓用 export … from 再导出(不是 import … from),且真正的消费者是从 @object-ui/types 而非从 spec 导入。这与派单时对 HttpMethod 报假阴性、以及 #4667 对 homePageId 断言 "no shell ever read it" 是同一个方法论坑,已经是第三次。 建议跨仓 liveness 审计改用解析后的符号图,而不是 import 语句文本。
  • objectui#3311 —— area 级退役称 "an area carries no gate of its own",而 AppSchemaRenderer.AreaSwitcher 一直在 gate。

两单都写明:事实前提错了,但退役结论仍然站得住,本仓不主张撤销,只请上游更正文案(与 #4709 对 homePageId 做的更正同类)。

6. 验证

命令 结果
pnpm type-check(turbo,45 包) ✅ 78/78
pnpm build ✅ 43/43
pnpm lint ✅ 45/45,0 error
pnpm exec vitest run(仓根全量) ✅ 871 文件 / 10074 用例,0 失败(1 文件 / 25 用例 skipped)
changeset:check(no-major + fixed 组)

测试一律用仓根 pnpm exec vitest run <paths>;未使用 pnpm --filter <pkg> test -- --run <paths>(objectui#3288:路径过滤会被静默忽略)。所有 build/test 都包在共享的 flock /tmp/os-heavy-verify.lock 里跑。

破坏验证(故意改坏 → 确认变红 → 还原 → 确认变绿),做在本 PR 改过行为的断言上:

改坏的东西 结果
findFirstLanding 改为逆序(落地页派生,resolveLandingRoute 的镜像) 精确命中 2 条落地断言变红,其余 15 条仍绿
NavigationAreaSchema 重新加回 visible 退役钉子 + "adds no local key of its own" 变红
homePageId 墓碑从派生里摘掉(改回 strip 语义) "REJECTS the retired homePageId" 变红
NavigationRendererevaluateVisibility / checkPermission 改成恒真 item 级 gating 4 条变红

> 第 4 项的第一次破坏验证发现我自己新写的两条断言是空过的 —— 被 gate 的 item 放在了非激活区域,无论 gating 有没有生效都不会渲染。已改为放进首个(默认激活)区域,重跑破坏验证确认这两条现在真正承重。这正是这道工序的价值。

7. 变更集

.changeset/spec-17-rc2-pin-bump.md,按 fixed 组规约标 minor不是 major),破坏性语义写在正文:HttpMethod 改名跟随(形状不变)、落地页语义变更(显式钉了 homePageId 的 app 将改落在 nav 首项,指向 os migrate meta --from 16)、area 三键、NotificationProtocol 删除、email_template 校验器修正。

另修正 .changeset/previews-read-only-spec-declared-keys.md(objectui#3275 的 changeset,已在 main 上)中的一句话:它原本承诺"homePageId 渲染成 nav item 的 id",而本 PR 恰恰删掉了该行为 —— 两条 changeset 会编进同一次 release notes,一条说 preview 会渲染 homePageId、一条说该键已退役,客户读到的是自相矛盾的发版说明。既然使其失效的正是本 PR,修正它就是本 PR 的责任。只改那一句,bump 级别与其余部分一字未动。

⛔ 未触碰 content/docs/releases/


Generated by Claude Code

claude added 2 commits August 3, 2026 16:53
…t lands

Bumps the workspace pin from ^17.0.0-rc.1 to ^17.0.0-rc.2 (32 declarations
across 30 package.json), plus the five sibling @objectstack/* declarations
(client / formula / lint). Those siblings pin @objectstack/spec EXACTLY, so
leaving them behind kept a second rc.1 copy of the spec in the tree and had
@objectstack/lint — an app-shell dependency — validating against schemas that
still accept the keys this change retires. pnpm-lock.yaml now resolves a single
spec version and carries zero rc.1 references.

Bumping the pin and fixing the fallout cannot be split: the pin alone reddens
CI, the code alone targets a shape that is not in effect yet.

Adjudicated retirements:

- app.homePageId (#3287, #3264): resolveLandingRoute() collapses to
  findFirstRoute(navigation, ctx) and findNavItemById() goes with it, having
  lost its only caller. The function name and call site stay as the seam for a
  future navigation[].landing flag, which is the encoding upstream recorded as
  correct — not implemented here, it goes enforce-first. AppPreview now DERIVES
  the landing entry the same way the shell does, so the preview shows the entry
  the runtime will actually open.
- AppContextSelector.includeAll / placement (#3208): removed from the hand
  written ContextSelectorDef and from the parity assertions. Neither ever did
  anything here — context selectors are mandatory-scope, so no "All" row was
  rendered, and placement: 'topbar' put nothing in the topbar.
- HttpMethod (#3235): aliased to the spec's HttpMethodType from ./ui. Shape is
  verbatim identical and the public surface is unchanged. Deliberately NOT
  ./shared, which is the 7-value enum.

Breaks the dispatch list did not cover, found by typecheck + build + tests:

- NavigationArea.visible / order / requiredPermissions retired at area level.
  AppSchemaRenderer's area switcher DID gate on them; the gating moves down to
  NavigationRenderer, where the spec put it. Premise mismatch: objectui#3311.
- ui's Notification / NotificationConfig deleted with no successor, taking
  @object-ui/core's NotificationProtocol with them. It had zero callers here;
  the live implementation is @object-ui/react's NotificationContext. Premise
  mismatch: objectui#3310.
- MetadataSaveOptions moved ./kernel -> ./system.
- SchemaDiffEntryKind gained default_mismatch; the exhaustive Record failed the
  build exactly as designed, and now carries a label.
- ActionSchema gained the package-lock envelope; SPEC_ACTION_KEYS re-derived.

Vacuous passes that rc.2 turned into real failures:

- The email_template and view client validators pointed at schemas the metadata
  kinds do not resolve to, and the lenient container silently stripped every key
  it was handed — so neither type was ever really validated. email_template now
  uses EmailTemplateDefinitionSchema; view dispatches on its own discriminant so
  each shape is checked against its own schema (objectui#3312).
- Four console preview samples were off-spec and being stripped rather than
  refused: view.list.object, job.concurrency / job.timeoutMs,
  email_template.from / .to, datasource.capabilities / .healthCheck. These are
  the drafts an author — or a model generating metadata — copies.
- Test fixtures pinning managedBy: 'system', a value protocol 17 retired, had
  stopped asserting anything: it now resolves to the default-writable fallback.
  Switched to engine-owned.

Also updates the mobile_fullscreen JSDoc to list RichTextField alongside
TextAreaField (objectui#3301).

#3173 stays out: rc.2's DashboardWidgetSchema.responsive is byte-identical to
rc.1, so the documented `any` is untouched.
…D gate on the area keys

The docblocks claimed no objectui renderer ever read area-level `visible` /
`requiredPermissions`. That is false, and it repeats the exact mistake this
round is documenting upstream: `AppSchemaRenderer`'s area switcher filtered
areas by both. Following the retirement is still correct — the spec's area
object is `.strict()`, so a v17-valid app cannot carry the keys and the filter
was unreachable — but the reason has to be the true one. See objectui#3311.
@vercel

vercel Bot commented Aug 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 3, 2026 5:13pm

Request Review

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-5VHnDYSh.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.47KB 3.09KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
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) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.25KB 0.53KB
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) 476.66KB 104.69KB
core (index.js) 2.25KB 0.80KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 136.23KB 34.75KB
fields (index.js) 224.62KB 55.04KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.46KB 0.96KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 26.14KB 6.07KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 37.80KB 10.52KB
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.74KB
mobile (index.js) 1.50KB 0.62KB
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.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.05KB 1.53KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.98KB 12.37KB
plugin-charts (index.js) 60.54KB 17.13KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 112.01KB 28.86KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 230.56KB 56.80KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 111.54KB 26.97KB
plugin-gantt (index.js) 162.25KB 39.55KB
plugin-grid (index.js) 185.08KB 49.04KB
plugin-kanban (index.js) 47.89KB 13.18KB
plugin-list (index.js) 104.94KB 25.32KB
plugin-map (index.js) 16.81KB 5.24KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.55KB 10.59KB
plugin-timeline (index.js) 25.76KB 7.33KB
plugin-tree (index.js) 8.34KB 2.82KB
plugin-view (index.js) 83.67KB 20.43KB
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.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.46KB 1.21KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
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 (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
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

objectui#3275's changeset says AppPreview renders `homePageId` as a nav item
id. This branch retires the key and makes the preview DERIVE the landing entry
instead, so the two changesets would compile into one release note that
contradicts itself — one half telling readers the preview shows `homePageId`,
the other telling them it no longer exists.

Rewrites that one sentence to the post-retirement fact and nothing else; the
bump level and the rest of the file are untouched.
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-5VHnDYSh.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.47KB 3.09KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
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) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.25KB 0.53KB
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) 476.66KB 104.69KB
core (index.js) 2.25KB 0.80KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 136.23KB 34.75KB
fields (index.js) 224.62KB 55.04KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.46KB 0.96KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 26.14KB 6.07KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 37.80KB 10.52KB
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.74KB
mobile (index.js) 1.50KB 0.62KB
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.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.05KB 1.53KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.98KB 12.37KB
plugin-charts (index.js) 60.54KB 17.13KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 112.01KB 28.86KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 230.56KB 56.80KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 111.54KB 26.97KB
plugin-gantt (index.js) 162.25KB 39.55KB
plugin-grid (index.js) 185.08KB 49.04KB
plugin-kanban (index.js) 47.89KB 13.18KB
plugin-list (index.js) 104.94KB 25.32KB
plugin-map (index.js) 16.81KB 5.24KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.55KB 10.59KB
plugin-timeline (index.js) 25.76KB 7.33KB
plugin-tree (index.js) 8.34KB 2.82KB
plugin-view (index.js) 83.67KB 20.43KB
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.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.46KB 1.21KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
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 (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment