Skip to content

test(console,layout): parity 门按 ADR-0087 墓碑收窄接受集,识别做成共享 judge (#3809) - #4967

Merged
yinlianghui merged 7 commits into
mainfrom
claude/issue-3809-tombstone-aware-parity
Aug 17, 2026
Merged

test(console,layout): parity 门按 ADR-0087 墓碑收窄接受集,识别做成共享 judge (#3809)#4967
yinlianghui merged 7 commits into
mainfrom
claude/issue-3809-tombstone-aware-parity

Conversation

@yinlianghui

@yinlianghui yinlianghui commented Aug 17, 2026

Copy link
Copy Markdown
Collaborator

Fixes #3809

retiredKey() 退役一个键不是删条目 —— 它把成员换成 z.never().optional()(故意的:删掉的键会被非 strict 解析静默剥掉,而 never 成员在编写处就让 tsc 失败、在解析时抛出升级处方)。所以退役键仍然留在 .shape 里,任何从 Object.keys(shape) 推导「spec 接受的键」的门,回答的都不是它名字宣称的那个问题。

一处收窄,两个方向

apps/console/src/__tests__/registry-inputs-spec-parity.test.ts 的两个方向读同一个集合,于是在墓碑上朝相反方向失效:

正方向(#3797) 反方向(#3808)
判据 declared − accepted accepted − declared
墓碑落在 「spec 接受」一侧 「spec 声明」一侧
失效 假绿:发布了按名被拒的键,门不报 假红:要求本仓去发布按名被拒的键

specTopLevelKeys 现在减掉墓碑 —— 这一处同时修掉两向,正是卡里点名的落点。

premise 已过期:不是休眠,是活的

卡写于 @objectstack/spec@17.0.0-rc.5(ComponentPropsMap 零墓碑,所以卡断定「今天不成立」)。实测:

所以反方向的假红从 rc.6 起就是活的,由八条显式豁免逐键吸收(每条都写明「只有 #3809 能解」)。正方向的假绿今天没有实例:没有任何 block 声明这八个键中的任何一个 —— 它是可达但未被触发的,所以用变异证明(见下)。

八条豁免一并收割

不是手挑:收窄之后原有的两道检查各自点名了全部八条 —— every unpublished-key exemption names a key the spec really declares 判为 dangling,carries no stale unpublished-key exemption 判为 stale。删除是唯一的绿法。

此后自清:上游之后退役的键一进 shape 就离开接受集,顺带带走覆盖它的豁免,不再需要后续 issue。已经排在后面的就是上面那两个 targetVariable —— 下一次 pin 升级会点名它们,处置是删条目(#3834 那个「要不要发布 intent-only 键」的问题届时由上游给出否定答案)。

page:tabs.type 的解法与它自己条目的预测不同,值得一读:那条把它读作「spec 的活键,但扁平 SDUI 载体表达不了」,并把收敛推给上游;上游收敛了 —— 直接退役了 type 拼法,保留本仓已发布的 tabStyle。载体冲突不是被容忍,而是没了。

判据收进共享 judge

同一判断此前在四处手写,而且副本已经漂移:两处只有结构通道,一处压根没有(就是本卡的假绿)。现在落在 packages/test-support/src/spec-tombstones.ts(私有、永不发布,正是该包 README 写明的存在理由):

  • 两条识别通道 OR:结构(unwrap 过 .optional() 后是 never)与描述(retiredKey() 盖的 [REMOVED] 前缀)。实测八个墓碑两条都成立,所以 OR 不是为覆盖率,而是为了任一条被改坏时不会静默变宽;要不要求两条一致是消费者的 pin,识别本身从不要求;
  • 校准只做一次,而且把结构判据钉在契约自身行为上:每个被判为墓碑的键喂给 safeParse,必须在该键路径上报出 issue(按路径读而非看 success,因为这些 schema 有自己的必填成员);活键作对照必须干净。校准是派生的,不钉键名,所以 pin 一动不需要改名单;
  • packages/layout 的 page-header 门按它自己注释的要求(「when parity 门只比键名,retiredKey() 墓碑会被判成「spec 接受」—— 今天 pin 版零墓碑所以休眠,spec pin 一升就是门里的假绿(page:card.body 是现成标本) #3809 lands, this local helper is what it replaces」)换用共享判据。

isDormantOnThisPin 反而保留读原始 listed 键,并写明为什么:dormancy 问的是「这个 release 认不认识这个键」,墓碑答,所以覆盖退役键的豁免必须保持活着并被判 stale —— 用收窄集会给退役键的豁免一个永久藏身处,那是同一个盲点下沉一层。

premise 断言(两向共钉)

以上全部成立的前提只有一条:退役保留成员。加了 the tombstone premise still holds — a retired key stays IN the shape:某个 covered block 仍然 listed 一个墓碑键;逐 block 断言 listed 严格多于 accepted;活键 page:card.title 作反向对照。上游哪天改成真删键,这条红,处置是删掉过滤器而不是继续过滤零个 —— 死码被判死,而不是静默失效。

the eight tombstoned keys are recognised, not exempted — and not published either 是收割留下的钉子:八个键各若干事实(仍 listed / 仍判为墓碑 / 反方向不再索要 / 无豁免 / 也没被发布),外加一条派生的完备性(covered block 上任何墓碑键都不得带豁免)。没有它,「重新写一条豁免」和「收窄失效」两种回退都不会在别处红。

反向验证(先预判,后跑)

三个变异在两个 pin 上各跑一遍(rc.6 上 merge 前、GA 上 merge 后),结果逐字相同。变异均在 commit 之后进行、git checkout 还原(⛔ 未用 stash),还原后重跑全绿。

① 把 body input 重新声明回 page:card(#4027 的历史状态)
预判:正方向红。实测:

× page:card declares no top-level input the spec does not accept
  AssertionError: expected [ body ] to deeply equal []
× the eight tombstoned keys are recognised, not exempted — and not published either
  AssertionError: page:card publishes body, a key the contract rejects by name

①b 保留该声明,同时把收窄退回原始 listed
预判:正方向转绿(假绿现场)。实测:该断言从失败列表消失 = 绿;同时 premise 断言红、反方向在五个 block 上红(GA 上 7 failed / 57 passed)。这是本卡假绿的活体标本。

② 把一个真墓碑(record:details.layout)从识别里排除 —— pin 版有墓碑,所以走「实测路径」,不需要注入 fixture
预判:反方向红索要它。实测:

× record:details publishes every top-level key its spec props schema declares
  AssertionError: expected [ layout ] to deeply equal []
× the eight tombstoned keys are recognised, not exempted — and not published either
  AssertionError: record:details.layout is listed but no longer reads as a tombstone — did upstream un-retire it?

③ 识别谓词恒 false
预判:premise 断言红。实测:

× the tombstone premise still holds — a retired key stays IN the shape
  AssertionError: no covered block lists a tombstoned key: … the tombstone narrowing in
  `specTopLevelKeys` is dead code and must be removed, not kept: expected 0 to be greater than 0

连带 15 红:layout 的探针 pin、judge 校准的两条单通道 fixture、反方向五个 block。

①的措辞值得记一笔:派发单把①写成「伪造墓碑键进接受集 → 正方向钉红」,但把墓碑当成接受只会让接受集变大,正方向只可能更绿。让正方向红的是「有 block 声明了墓碑键」,所以①按后者做;而「识别失效」这一支(=③)的真实方向是反方向与 premise 断言红,不是正方向。两个方向都如实记在这里,而不是把结果套进模板。

一次 CI 红及其原因(已修)

首轮 CI 全线在 15 秒内失败于 ERR_PNPM_LOCKFILE_MISSING_DEPENDENCY。不是本改动的问题,而是基线过期:本分支起于 GA pin 之前,pull_request 事件跑的是与新 main 的 merge 结果,而 pnpm-lock.yaml 的自动合并落在了一个 broken 状态(pnpm 的报错自己就点名了这个可能)。处置:merge origin/main(两次,期间又落了一个 dev-deps bump)+ 完整重解析,本地 pnpm install --frozen-lockfile 复现通过;packages/test-support 的 spec devDependency 同时对齐仓库的 ^17.0.0

明确不在本卡

顺带一个给 triage 的信号(不改动、不立卡):GA pin 已经落地,而 UNPUBLISHED_EXEMPTIONS 里那五条 GA-pending 条目的散文仍写着「the pinned 17.0.0-rc.6 does not declare it」,而 GA 已经声明了它们 —— 那正是 #4668 的范围(它自己写明「Declared by objectui#4668 on the GA pin」),现在已解阻。本 PR 未动它们:那五条在 GA 上仍是有效豁免(spec 声明、inputs 未发布),两道检查都绿。

验证(GA pin 上)

pnpm exec vitest run apps/console/src/__tests__/ packages/layout/src/__tests__/ packages/test-support/src/__tests__/
  Test Files  31 passed (31)      Tests  384 passed (384)

pnpm --workspace-concurrency=2 --filter @object-ui/test-support --filter @object-ui/layout --filter @object-ui/console
  --filter @object-ui/fields --filter @object-ui/app-shell type-check   → 5/5 Done
  (后两个是 test-support 的另外两个消费者 —— 新模块经 index 进入它们的程序)
pnpm install --frozen-lockfile              → OK
node scripts/check-control-bytes.mjs        → OK (4438 files);另做 0x00-0x1f 自扫,touched 文件干净
check-spec-symbol-derivation / check-changeset-fixed / check-changeset-no-major / check-phantom-dependencies → OK
eslint(仅本次改动文件)→ 0 problems

changeset 按 ban-package-self-import.md 的先例写成空 frontmatter(test/tooling-only,不发版)。


🤖 Generated with Claude Code

https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt

`retiredKey()` 退役一个键不是删条目 —— 它把成员换成 `z.never().optional()`,
所以退役键仍留在 `.shape` 里。任何从 `Object.keys(shape)` 推导「spec 接受的键」
的门,回答的都不是它名字宣称的那个问题。

`registry-inputs-spec-parity.test.ts` 的两个方向读同一个集合,于是在墓碑上朝
相反方向失效:正方向(不得声明 spec 拒绝的键)把墓碑算作「接受」→ 假绿;
反方向(spec 声明的键必须可发现)把它算作「声明」→ 假红,要求本仓去发布一个
契约按名拒绝的键。一处收窄 `specTopLevelKeys` 同时修掉两向。

卡里说「今天休眠」已经过期:它写于 rc.5(`ComponentPropsMap` 零墓碑),而
rc.6 pin(#4167)带来八个 —— page:header.icon、page:card.actions、
page:card.body、page:tabs.type、record:details.layout,加 element:record_picker
的 displayField / searchFields / multiple。反方向的红从那次 pin 起就是活的,由
八条显式豁免逐键吸收,每条都写明只有本卡能解。八条一并删除:不是手挑,而是收窄
后原有的 dangling + stale 两道检查各自点名了全部八条。此后自清 —— 上游之后退役
的键一进 shape 就离开接受集,顺带带走覆盖它的豁免,不再需要后续 issue。

判据收进 `@object-ui/test-support`(私有、不发布):同一判断此前在四处手写,副本
已经漂移(两处只有结构通道,一处压根没有 —— 就是本卡的假绿)。共享 judge 把结构
通道与 `[REMOVED]` 描述通道 OR 起来,任一条被改坏都不会静默变宽;校准只做一次,
且是把结构判据钉在契约自身 `safeParse` 的实际拒绝上。`packages/layout` 的
page-header 门按它自己注释的要求换用共享判据。

两处消费者都断言了推导的前提(退役保留成员),所以上游哪天改成真删键,这些过滤器
会被判成死码而不是静默过滤零个。plugin-detail 与 app-shell 还各有一份本地副本,
今天都是对的,#4947 跟踪转换。

Fixes #3809

Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added documentation Improvements or additions to documentation dependencies apps tests labels Aug 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor

ℹ️ Console Performance Budget — not measured

This run did not produce a console bundle to measure, so there is no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing was measured — the numbers a real violation would carry are simply absent.

Step Outcome
Build packages skipped
Check console performance budget skipped

See the workflow run for details.

No package size report: it is only generated from a complete package build, so a partial one is never shown.

claude added 4 commits August 17, 2026 08:28
合并 origin/main 带进了 @objectstack/spec 17.0.0 GA pin(#4636 / PR #4639),
本分支的基线还在 rc.6 上,于是 CI 的 merge 结果里 pnpm-lock.yaml 半更新、
frozen install 报 ERR_PNPM_LOCKFILE_MISSING_DEPENDENCY。合并后完整重解析,
`pnpm install --frozen-lockfile` 本地复现通过。

test-support 的 spec devDependency 对齐仓库的 ^17.0.0。

GA 上重测墓碑集:仍是同样八个(`ComponentPropsMap` 条目从 31 增到 37,墓碑数不变),
两条识别通道在 GA 上依然同时成立,所以收割钉子的八个键名与 premise 断言都无需改动 ——
只把散文里的「实测于 rc.6」更正为两个 pin 都测过。`targetVariable` 那两个在 GA 上
仍是活键(上游 main 已退役),下一次 pin 升级仍会按自清机制点名它们。

Co-authored-by: Claude <noreply@anthropic.com>
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-Z86HvZHI.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) 40.21KB 10.79KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
auth (index.js) 2.71KB 1.22KB
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.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) 498.79KB 111.24KB
core (index.js) 4.06KB 1.61KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 157.40KB 43.42KB
fields (index.js) 233.27KB 58.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.28KB 1.75KB
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) 39.16KB 10.97KB
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) 4.42KB 1.42KB
permissions (evaluator.js) 5.12KB 1.74KB
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.62KB 12.83KB
plugin-charts (index.js) 64.75KB 18.37KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 127.85KB 32.73KB
plugin-designer (index.js) 212.39KB 42.83KB
plugin-detail (index.js) 239.90KB 60.01KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 120.42KB 29.03KB
plugin-gantt (index.js) 164.10KB 39.87KB
plugin-grid (index.js) 197.58KB 53.00KB
plugin-kanban (index.js) 52.72KB 14.54KB
plugin-list (index.js) 111.23KB 26.97KB
plugin-map (index.js) 17.91KB 5.72KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.97KB 11.33KB
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.66KB 3.50KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 27.53KB 9.41KB
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.55KB 2.07KB
sdui-parser (parse.js) 10.76KB 3.17KB
sdui-parser (provenance.js) 3.66KB 1.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

1 similar comment
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 24.7 KB 350 KB
Entry file index-Z86HvZHI.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) 40.21KB 10.79KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
auth (index.js) 2.71KB 1.22KB
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.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) 498.79KB 111.24KB
core (index.js) 4.06KB 1.61KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 157.40KB 43.42KB
fields (index.js) 233.27KB 58.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.28KB 1.75KB
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) 39.16KB 10.97KB
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) 4.42KB 1.42KB
permissions (evaluator.js) 5.12KB 1.74KB
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.62KB 12.83KB
plugin-charts (index.js) 64.75KB 18.37KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 127.85KB 32.73KB
plugin-designer (index.js) 212.39KB 42.83KB
plugin-detail (index.js) 239.90KB 60.01KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 120.42KB 29.03KB
plugin-gantt (index.js) 164.10KB 39.87KB
plugin-grid (index.js) 197.58KB 53.00KB
plugin-kanban (index.js) 52.72KB 14.54KB
plugin-list (index.js) 111.23KB 26.97KB
plugin-map (index.js) 17.91KB 5.72KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.97KB 11.33KB
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.66KB 3.50KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 27.53KB 9.41KB
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.55KB 2.07KB
sdui-parser (parse.js) 10.76KB 3.17KB
sdui-parser (provenance.js) 3.66KB 1.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

两件事,都是给自己的门补上和它给别人补的同一种保障:

1. 批量函数原来在 `.filter()` 谓词里逐键重解析 shape —— 对 `lazySchema()` 条目
   等于每个键重跑一次 thunk。正是 AGENTS.md §测试纪律 记下的那条(`keysOf(x)`
   写在谓词里,7.51s → 25ms)。改成一次解析、一趟 partition。
2. 判据(两条通道的 OR)原来在单键谓词与批量 partition 里各写了一遍。变异测试
   立刻暴露了代价:把单键谓词改成恒 false,批量那份仍在收窄,于是消费门的
   premise 断言照绿 —— 半个 judge 被静默关掉而没人红。现在两处都走同一个
   `isTombstone`,再跑同一变异:premise 断言与反方向五个 block 一起红(15 红),
   与重构前的方向一致。

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

Copy link
Copy Markdown
Collaborator Author

【CI 说明:红着的 3 个 test shard 不是本 PR 的】

Test (shard 1/4 · 2/4 · 3/4) 红在 packages/cli/src/__tests__/app-generator.test.ts:

AssertionError: routed manifest's lucide-react must match its in-repo range:
  expected '^1.29.0' to be '^1.31.0'
  ❯ packages/cli/src/__tests__/app-generator.test.ts:574
  ❯ packages/cli/src/__tests__/app-generator.test.ts:1139

纯净 origin/main(@ 590dd6356,单独 worktree 实测)上同样红:packages/cli/src/utils/app-generator.ts:187 的字面量是 'lucide-react': '^1.29.0',而仓内 23 处 package.json 已被 dependabot dev-deps bump(#4948)全部推到 ^1.31.0。本 PR 一行都没碰 lucide-reactpackages/cli、任何 package.json 的第三方区间。

已由 #4968 跟踪(bug,已派发),同类前情 #4098 / #3827 / #3755。本 PR 不带这个修复(范围纪律),等 #4968 落地后本分支 rebase/merge 一次即可全绿。

本 PR 自己覆盖的三个套件在这次 CI 里都在通过的 shard 内,且本地在 GA pin 上全绿(31 files / 384 tests)。同一轮 CI 里 Type Check(全仓)、Lint、Build & E2E、Bundle Analysis、Control Byte Scan、三条 changeset 门 全绿。


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 24.7 KB 350 KB
Entry file index-Z86HvZHI.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) 40.21KB 10.79KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
auth (index.js) 2.71KB 1.22KB
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.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) 498.79KB 111.24KB
core (index.js) 4.06KB 1.61KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 157.40KB 43.42KB
fields (index.js) 233.27KB 58.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.28KB 1.75KB
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) 39.16KB 10.97KB
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) 4.42KB 1.42KB
permissions (evaluator.js) 5.12KB 1.74KB
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.62KB 12.83KB
plugin-charts (index.js) 64.75KB 18.37KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 127.85KB 32.73KB
plugin-designer (index.js) 212.39KB 42.83KB
plugin-detail (index.js) 239.90KB 60.01KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 120.42KB 29.03KB
plugin-gantt (index.js) 164.10KB 39.87KB
plugin-grid (index.js) 197.58KB 53.00KB
plugin-kanban (index.js) 52.72KB 14.54KB
plugin-list (index.js) 111.23KB 26.97KB
plugin-map (index.js) 17.91KB 5.72KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.97KB 11.33KB
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.66KB 3.50KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 27.53KB 9.41KB
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.55KB 2.07KB
sdui-parser (parse.js) 10.76KB 3.17KB
sdui-parser (provenance.js) 3.66KB 1.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

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 24.7 KB 350 KB
Entry file index-Z86HvZHI.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) 40.21KB 10.79KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
auth (index.js) 2.71KB 1.22KB
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.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) 498.79KB 111.24KB
core (index.js) 4.06KB 1.61KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 157.40KB 43.42KB
fields (index.js) 233.27KB 58.22KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.28KB 1.75KB
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) 39.16KB 10.97KB
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) 4.42KB 1.42KB
permissions (evaluator.js) 5.12KB 1.74KB
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.62KB 12.83KB
plugin-charts (index.js) 64.75KB 18.37KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 127.85KB 32.73KB
plugin-designer (index.js) 212.39KB 42.83KB
plugin-detail (index.js) 239.90KB 60.01KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 120.42KB 29.03KB
plugin-gantt (index.js) 164.10KB 39.87KB
plugin-grid (index.js) 197.58KB 53.00KB
plugin-kanban (index.js) 52.72KB 14.54KB
plugin-list (index.js) 111.23KB 26.97KB
plugin-map (index.js) 17.91KB 5.72KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.97KB 11.33KB
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.66KB 3.50KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 27.53KB 9.41KB
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.55KB 2.07KB
sdui-parser (parse.js) 10.76KB 3.17KB
sdui-parser (provenance.js) 3.66KB 1.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(#3809,批次 19)

实物核验(按真实 merge-base 对账):11 files,+936/−183 —— specTopLevelKeys 一处收窄同修两向(#3797 假绿 / #3808 假红);判据收进 packages/test-support/src/spec-tombstones.ts 共享 judge(结构+描述双通道 OR、safeParse 按键路径派生校准,不钉键名);八条豁免由既有两道检查点名后全量收割,自清机制成立;isDormantOnThisPin 刻意保留读原始 listed 键并写明理由 —— 这条边界判断是对的,用收窄集会给退役键豁免一个永久藏身处。模型标识 grep = 0;releases/ 零触碰;changeset 空 frontmatter 按 test-only 先例。

CI 亲读:20/20 check runs completed,零失败(两项 path-filter skipped 计绿)。首轮 ERR_PNPM_LOCKFILE_MISSING_DEPENDENCY 红已核:基线过期 + lockfile 自动合并落在 broken 状态,merge origin/main 后本地 --frozen-lockfile 复现通过,归因成立、与本改动无关。

premise 复核:卡按 rc.5 断「今天不成立」,dev 实测 rc.6/GA 各八墓碑、三个变异在两个 pin 上双跑逐字相同 —— 前提验证先行的正确用法;变异①按真实红方向改写派发单措辞并如实记录(把墓碑当接受只会更绿,让正方向红的是「有 block 声明墓碑键」),不套模板。

#4947(plugin-detail/app-shell 两份本地墓碑判据待转换)finding 入池已确认;GA-pending 五条豁免散文过期的信号归 #4668 范围,本 PR 未动它们,边界正确。undraft + auto-merge(squash)。


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 17, 2026 12:37
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 17, 2026
Merged via the queue into main with commit 1b1fbe2 Aug 17, 2026
21 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-3809-tombstone-aware-parity branch August 17, 2026 12:37
yinlianghui added a commit that referenced this pull request Aug 17, 2026
Resolve the one header-narrative conflict in registry-inputs-spec-parity.test.ts:
keep this branch's rewritten types bullet (expressiveness closed by #3832, the
comparison half tracked as #4971) and drop this branch's pre-#3809 tombstone
bullet — main already records that limit as closed (#3809 landed via #4967),
so the LIMIT list stays at exactly the two items its preamble announces.

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

apps dependencies documentation Improvements or additions to documentation tests

Projects

None yet

2 participants