Skip to content

retire(studio): drop the canonical page:header icon field, restate the alias's on its renderer read (#3829) - #4794

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-3829-route-c-followthrough
Aug 16, 2026
Merged

retire(studio): drop the canonical page:header icon field, restate the alias's on its renderer read (#3829)#4794
yinlianghui merged 2 commits into
mainfrom
claude/issue-3829-route-c-followthrough

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes #3829

落地本卡 2026-08-16 的「PM 裁定 · 测量回贴」:route (c) 的 objectui follow-through,
alias 半边按代裁的 A 案。维护者 2026-08-09 已裁 route (c),上游 objectstack#6946 /
PR objectstack#7115 已执行,并随本仓现锁的 @objectstack/spec@17.0.0-rc.6 生效 ——
PageHeaderProps.iconPageCardProps.actions 均已是 ADR-0087 D2 墓碑(成员被替换为
z.never(),带具名迁移文案)。

为什么 objectui 这半边比原裁定预想的大

退役 prescription 写的是「零生产者」。这对 page:card.actions 成立 —— 它是干净完整的
退役;对 page:header.icon 不成立:metadata-admin 设计器的 BLOCK_CONFIG 仍在为
canonical page:header 发布 icon 编辑框。退役前作者填进去的值被静默丢弃,退役后平台
按名拒绝整个节点 —— 留着生产面比退役前更糟,因为它在教作者(尤其是 AI 作者)写出
解析失败的元数据。

原裁定描述的完成机制也需要修正:D2 退役是把成员替换z.never(),不是删除,两键
因此仍留在 Object.keys(shape) 里 —— pin bump 并不会让那两条 exemption 变 stale
(gate 源码自己写明了这一点)。所以正确的 sequencing 是重写而不是删除,删除权归
objectui#3809。

四件事

1. 两条 exemption 重写(apps/console/src/__tests__/registry-inputs-spec-parity.test.ts)

从「wire it or declare it」菜单改写为 retired-upstream 类,模板逐字取自同文件的
record:details.layout 条目:引用 objectstack#6946 / PR objectstack#7115、写明墓碑留在
Object.keys(shape)、删除权交 objectui#3809。顺带修陈旧行号(822-1570 改为 973-1677、
666-695 改为 703-745,均按当前 containers.tsx 自核)与块头的 rc.5 注。
两条 exemption 不删 —— 删了 gate 会反向变红。

2. 移除设计器 canonical page:header 的 icon 字段

previews/block-config.ts 的字段,加上此时已成孤儿的两条 i18n 键(en / zh 同一次改动,
两张表键集保持一致)。先例逐字:commit 38ab505(PR #4169)对 global_nav 的同类清理
(「the palette option and its now-orphaned i18n key」)。防回潮钉在
previews/__tests__/block-config.test.ts:正面非空半 + 「不提供 icon」负钉 + spec 侧
墓碑断言(含探针自身的非空性)+ 两条 i18n 键在两个 locale 都已无译文。

3. docs 修正(content/docs/layout/page-header.mdx)

第 40 行仍把 icon 教成 PageHeaderProps 的成员。改按 rc.6 现实重写,并把组件自有
prop
已退役的 spec 键如实区分 —— 这页文档写的是 @object-ui/layout
PageHeader 组件,它的 icon 是 renderer 自有能力;canonical 节点上同名键已被按名拒绝。
未碰 content/docs/releases/

4. alias 半边(A 案)

packages/layoutpage-header / layout:page-headericon input 保留:那是
另一个渲染器,它真读真画(PageHeader.tsx:123 读、:231-233 画),文档发布它,本仓唯一
的活 demo(layout-page-header/pageheader-with-actions)写 "icon": "users"。撤掉等于
删除一项工作能力并弄坏 demo —— B 案已拒。

变的是依据:注释从 spec parity 改述为 renderer-read 事实;
page-header-authorable-keys.test.tsx 的 specKeys 派生跳过墓碑(unwrap optional 后
inner 为 never 即墓碑,判据与 objectui#3809 一致,实现为局部 helper 并注释指向 #3809
收敛),让 icon 不再因为 Object.keys(shape) 仍列着它而假绿。豁免写成具名、引单、
自清的 RENDERER_OWN_DECLARED,并附一条纪律断言:条目必须对应一个 spec 曾经声明、
现已退役
的键(spec 从未有过的键就是方言,showBack 就在同文件被钉为「不声明」)。
未碰 alias renderer 的读点。

顺带:PageBlockInspector.i18n.test.tsx#3979 placeholder 测试对从 page:header
改指 record:alert —— 同样的症状(译过的标签下一条 prose 提示),但钉在渲染器真读的键上。
同一处几行之上的 objectui#4649 就是同样的动作与同样的理由。

反向验证(先预判后跑,两次都未提交,跑完 git checkout HEAD -- 还原,工作树 0 dirty)

预判写在跑之前。两个实验的结果与预判逐条一致

实验 A —— 把删掉的 BLOCK_CONFIG icon 字段装回去(两条 i18n 键保持删除,隔离两半)

预判红 7 条,实测红 7 条,无一条计划外:

× still offers the canonical header fields the renderer does implement
    expected [ 'title', 'subtitle', 'icon', …(1) ] to deeply equal [ 'title', 'subtitle', 'breadcrumb' ]
× does NOT offer the retired `icon` field
    expected [ 'title', 'subtitle', 'icon', …(1) ] to not include 'icon'
× collects every label site — the walk itself is not empty      expected 8 to be 7
× collects all 17 placeholders — 7 keyed, 10 literal            expected 18 to be 17
× every key resolves in en-US                                   expected [ …(2) ] to deeply equal []
× every key resolves in zh-CN                                   expected [ …(2) ] to deeply equal []
× zh-CN is actually translated, not a copy of en-US             expected [ …(2) ] to deeply equal []
 Tests  7 failed | 31 passed (38)

预判绿且实测绿的两条也是有意义的:spec 侧墓碑断言与「两个 locale 都已无译文」都
设计器字段影响 —— 这正说明字段与 i18n 键必须同进同出,而不是任一可选。后三条红是派生的
双 locale walk 抓到的,它才是这个纪律的机械保证。

实验 B —— 只撤回 specKeys 的墓碑窄化(断言全部保留原样)

这一条的方向不是「全红」,预判时就写明了,实测确认:

× the tombstone probe really reads the spec — not `undefined` for everything
    expected 9 to be less than 9
× declares `icon` with type `string` on both keys — on the renderer read, not spec parity
    expected true to be false
 Tests  2 failed | 14 passed (16)

红的恰好是本次新增的两条断言。原有的方言守卫
(declares nothing @objectstack/spec accepts, beyond the declared renderer-own keys)
仍然绿,而且这是重点而非缺陷:撤回窄化只是把 icon 从「被 carve-out 放行」换回
「被 specKeys.has 放行」,守卫两个世界都分辨不出来 —— 那份分辨不出来,正是 #3829 在被
测量之前一直隐形的原因。若这里报「方言守卫转红」,那就是照模板编的。

测试

pnpm exec vitest run packages/app-shell/src/views/metadata-admin packages/layout \
  apps/console/src/__tests__/registry-inputs-spec-parity.test.ts --maxWorkers=2
  Test Files  179 passed (179)
       Tests  1874 passed | 1 skipped (1875)

# 消费半径复跑(alias demo 的 manifest 门、console 全部 parity 门、app-shell 全量)
pnpm exec vitest run examples/schema-catalog apps/console packages/app-shell --maxWorkers=2
  Test Files  465 passed (465)
       Tests  5998 passed | 1 skipped (5999)

pnpm type-check --concurrency=2
  Tasks:    81 successful, 81 total

check:control-bytes OK(4307 个文件)· check:i18n-keys OK · check:i18n-en-drift 0 changed ·
check:doc-links OK · changeset presence / fixed / no-major 均 OK · eslint 改动文件 0 error

Base:c25222758598aec3d17c5aa22f1640659f1ecacc(显式 sha,非 FETCH_HEAD)。


Generated by Claude Code

…e alias's on its renderer read (#3829)

objectui#3829 was filed as a three-way fork over `page:header.icon` and
`page:card.actions` (wire them / declare them with a KNOWN GAP / retire them
upstream). The maintainer ruled route (c) on 2026-08-09 and objectstack#6946 /
PR objectstack#7115 executed it: both keys are ADR-0087 D2 tombstones in
@objectstack/spec 17.0.0, live on the rc.6 this repo pins. This is the objectui
follow-through, and the measurement behind it found the retirement's "zero
producers" premise held for one key and not the other.

- previews/block-config.ts + both locale tables: the canonical `page:header`
  icon box and its two now-orphaned i18n keys. This was the one live producer.
  Before the retirement an authored value was silently dropped; after it the
  platform rejects the node BY NAME, so a designer field left standing is
  strictly worse than the gap it papered over. Negative pin (plus the positive
  non-vacuity half and the spec-side tombstone assertion) in
  previews/__tests__/block-config.test.ts. Precedent followed verbatim:
  38ab505 / PR #4169's global_nav cleanup, "the palette option and its
  now-orphaned i18n key".
- page:card.actions had no producer at all — it is a clean retirement, and only
  the exemption prose changes for it.
- registry-inputs-spec-parity.test.ts: both exemptions rewritten from the
  "wire it or declare it" MENU to the retired-upstream class, templated on the
  `record:details.layout` entry. They are NOT deleted: D2 retirement replaces
  the member with `z.never()` rather than removing it, so `Object.keys(shape)`
  still reports both keys and the reverse direction still demands cover. They
  resolve via objectui#3809's tombstone recognition, which the entries now say.
  Stale line numbers repaired (822-1570 -> 973-1677, 666-695 -> 703-745) and the
  block header re-based on rc.6.
- layout's `page-header` / `layout:page-header` alias KEEPS its `icon` input
  (route A). That is a different renderer which really reads and draws it
  (PageHeader.tsx:123, :231-233), the docs page publishes it and the repo's only
  live demo writes it — withdrawing it would delete a working capability. What
  changes is the LICENCE: the comment now rests on the renderer read instead of
  spec parity, and page-header-authorable-keys.test.tsx skips tombstones when it
  derives the spec key set, so `icon` stops passing the dialect guard for the
  wrong reason. The carve-out is a named, issue-backed, self-clearing list.
  The renderer read points themselves are untouched.
- content/docs/layout/page-header.mdx: line 40 still taught `icon` as a member of
  `PageHeaderProps`. Rewritten to rc.6 reality, and the component prop is now
  distinguished from the retired spec key rather than conflated with it.
- PageBlockInspector.i18n.test.tsx: the #3979 placeholder pair re-pointed from
  `page:header` to `record:alert`, which reproduces the symptom (prose hint under
  a translated label) on a key the renderer really reads. Same move and same
  reason as objectui#4649's re-point a few tests above.

Part of #3829

Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 24.7 KB 350 KB
Entry file index-a0lQpDuS.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 9.56KB 3.59KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 8.92KB 3.41KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 25.13KB 5.40KB
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) 38.46KB 10.17KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
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) 5.02KB 0.88KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 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.65KB 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) 495.04KB 110.00KB
core (index.js) 3.79KB 1.52KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 157.05KB 43.28KB
fields (index.js) 231.21KB 57.42KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 3.35KB 1.38KB
i18n (pickLocalized.js) 3.69KB 1.73KB
i18n (provider.js) 23.12KB 7.62KB
i18n (useDisplayLocale.js) 2.84KB 1.45KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
layout (index.js) 38.96KB 10.85KB
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.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.35KB 3.31KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.89KB 1.22KB
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.81KB 0.83KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.86KB 12.91KB
plugin-charts (index.js) 64.44KB 18.28KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 128.14KB 32.58KB
plugin-designer (index.js) 212.39KB 42.83KB
plugin-detail (index.js) 239.81KB 59.97KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 115.32KB 27.73KB
plugin-gantt (index.js) 164.30KB 40.02KB
plugin-grid (index.js) 192.27KB 51.31KB
plugin-kanban (index.js) 52.72KB 14.54KB
plugin-list (index.js) 111.23KB 26.97KB
plugin-map (index.js) 18.16KB 5.81KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.38KB 11.09KB
plugin-timeline (index.js) 26.68KB 7.66KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 83.81KB 20.49KB
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) 27.64KB 9.44KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.28KB 0.68KB
react (schema-input.js) 1.45KB 0.83KB
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 (dashboard-filter-alias.js) 6.23KB 2.74KB
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) 3.05KB 1.52KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
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

…n literal (#3829)

CI red on `scripts/__tests__/doc-version-claims.test.ts`, self-inflicted by the
previous commit: the new PageHeader paragraph wrote "retired in `@objectstack/spec`
17.0.0", and a first-party package name followed by a dotted version IS a version
claim on a scanned surface (`content/docs` is a SCAN_ROOT). Nothing in this repo
can check that literal, so the ratchet demands it be deleted or registered.

Deleted, which is the ratchet's own stated preference and the right one here: the
sentence already cites objectstack#6946 and ADR-0087 D2, so the version number
carried no fact those two do not — while being exactly the kind of literal
objectui#3645 froze at `^3.3.0` for thirteen majors. The actionable form of "which
release" is already in the same paragraph as `os migrate meta --from 16`, which is
a migration command rather than a claim about a dependency's current version.

The same literal appears in this PR's test comments, block-config.ts and the
changeset and does NOT trip the gate — those are not scanned surfaces. Only the
mdx is, so only the mdx changes here.

Verified against the gate's own matcher rather than by eye: FIRST_PARTY + SEP +
VERSION, where SEP cannot cross an opening parenthesis, so "`@objectstack/spec`
(objectstack#6946" is not a claim. Re-ran the file through a probe built from the
test's exact regex fragments (1 hit before, 0 after) and then the test itself.

Part of #3829

Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 24.7 KB 350 KB
Entry file index-sE8J74z0.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 9.56KB 3.59KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 8.92KB 3.41KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 25.13KB 5.40KB
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) 38.46KB 10.17KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
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) 5.02KB 0.88KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 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.65KB 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) 495.04KB 110.00KB
core (index.js) 3.79KB 1.52KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 157.05KB 43.28KB
fields (index.js) 231.54KB 57.52KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 3.35KB 1.38KB
i18n (pickLocalized.js) 3.69KB 1.73KB
i18n (provider.js) 23.12KB 7.62KB
i18n (useDisplayLocale.js) 2.84KB 1.45KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
layout (index.js) 38.96KB 10.85KB
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.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.35KB 3.31KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.89KB 1.22KB
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.81KB 0.83KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.86KB 12.91KB
plugin-charts (index.js) 64.44KB 18.28KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 128.14KB 32.58KB
plugin-designer (index.js) 212.39KB 42.83KB
plugin-detail (index.js) 239.81KB 59.97KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 115.32KB 27.73KB
plugin-gantt (index.js) 164.30KB 40.02KB
plugin-grid (index.js) 192.27KB 51.31KB
plugin-kanban (index.js) 52.72KB 14.54KB
plugin-list (index.js) 111.23KB 26.97KB
plugin-map (index.js) 18.16KB 5.81KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.38KB 11.09KB
plugin-timeline (index.js) 26.68KB 7.66KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 83.81KB 20.49KB
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) 27.64KB 9.44KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.28KB 0.68KB
react (schema-input.js) 1.45KB 0.83KB
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 (dashboard-filter-alias.js) 6.23KB 2.74KB
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) 3.05KB 1.52KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
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

Copy link
Copy Markdown
Collaborator Author

【PM 验收 · ACCEPT】objectui 分片 PM(session_01GTRjn8xBqp75dk7kFupVRt),#3829 route (c) follow-through 四件套(exemption 重写 / 设计器 icon 字段退役 / docs / alias A 案)。

实物核验(首轮已过,本轮增量):返工 commit 50f690e 仅动 content/docs/layout/page-header.mdx(1+/1-,单行替换);其余 9 文件与首轮一致;分支零模型标识;releases 零触碰;canonical renderer 读点零触碰。

CI 终态(PM 亲读):head 50f690e 全部 19 项 completed、零 failure(17 success + dependabot/coverage path-filter skipped;原红的 Test shard 4/4 已 success @ 08:51:24)。

返工记录(公开记账):首轮唯一红是 doc-version-claims 棘轮 —— 本 PR 在 mdx 新增段落写入 @objectstack/spec 17.0.0 版本字面量,落在扫描面未登记。修法取棘轮自身声明的优先方案:删字面量指向真源(该句已引用 objectstack#6946 / ADR-0087 D2,版本号不承载额外事实),未登记 KNOWN_CLAIMS、未动测试文件。dev 的证据链完整:先本地逐字复现 CI 报错,实读 CLAIM_RES 正则并用 oracle 脚本验证改写零命中(SEP 字符类不含左括号,故 (objectstack#6946 不再进入 VERSION 分支),反向验证放回字面量复现同一失败后还原。os migrate meta --from 16 保留判断正确 —— 迁移命令不是依赖版本主张,且棘轮 VERSION 不匹配裸 16。

回传处置:四条 stale-pin exemption 文案的 rc.5→rc.6 余数归 #3809/pin bump 线,不另立卡;棘轮扫描面边界(测试注释/changeset 不扫)记为已知合理行为。

处置:undraft + auto-merge(SQUASH)。


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 16, 2026 08:56
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 16, 2026
Merged via the queue into main with commit 183d09b Aug 16, 2026
20 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-3829-route-c-followthrough branch August 16, 2026 08:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants