Skip to content

fix(sdui): PageComponentSchema.dataSource 逐 block 接线,record_picker 不再丢 view (objectstack#6953) - #3969

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-6953-datasource-block-wiring
Aug 9, 2026
Merged

fix(sdui): PageComponentSchema.dataSource 逐 block 接线,record_picker 不再丢 view (objectstack#6953)#3969
yinlianghui merged 2 commits into
mainfrom
claude/issue-6953-datasource-block-wiring

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes objectstack-ai/objectstack#6953

这个 PR 修什么

objectstack#5576 把 spec 的 per-element 数据绑定(PageComponentSchema.dataSource = { object, view?, filter?, sort?, limit? })接到了 list-view,但同一条声明在其余每一个 page component 上依旧无人消费。本 PR 逐 block 接线,复用 #5576 落地的公共件,并沿用它定下的合成语义。

两个缺口都是静默的:

  1. element:record_picker 读了五个键里的四个,单独丢掉 view 于是 dataSource: { object: 'account', view: 'hot' }(spec 自己的例子)构造出的是全量 account 选择器,而不是 saved view 选出的行。它不抛错、不渲染错误面板 —— 只是候选列表比作者写的更宽,用户因此能选到页面声明为范围外的记录。这是 AI 生成的 metadata 里最藏得住的一类错误。
  2. object-grid / object-form / object-kanban / object-calendar / object-chart / object-metric / record:related_list 整条绑定都不读。 每一块都把 fetch 挂在自己的 objectName 上,而没有任何地方把 dataSource.object 映射过去 —— 于是按 spec 写、不额外写 objectName 的页面渲染出空 grid / 无字段的表单 / 无卡片的看板 / 空月历 / 空图表 / 静态数字的指标卡,不发请求、也没有任何诊断。spec-valid 的 metadata 渲染出空,就是 objectstack#4413 的形状。

接线清单(block → 文件 → 映射了哪些键)

block 文件 object view 贡献 filter sort limit
element:record_picker packages/components/src/renderers/basic/record-picker.tsx 全部
object-grid(+ view:grid) packages/plugin-grid/src/index.tsx 全部 pagination.pageSize
record:related_list packages/plugin-detail/src/renderers/record-related-list.tsx columns/sort/limit ⛔ 无读点 limit
object-calendar(+ view:calendar) packages/plugin-calendar/src/index.tsx filter/sort ⛔ 不分页
object-kanban(+ view:kanban) packages/plugin-kanban/src/index.tsx filter ⛔ 无排序 ⛔ 固定 $top: 100
object-chart(+ view:chart) packages/plugin-charts/src/ObjectChart.tsx filter ⛔ 由聚合定序 ⛔ 无页
object-metric packages/plugin-dashboard/src/index.tsx filter ⛔ 单值 ⛔ 单值
object-form(+ view:form) packages/plugin-form/src/index.tsx 仅校验名字 ⛔ 无集合查询

⛔ 的含义是「该 block 没有这个键的读点,所以故意不映射」,不是遗漏。 把合成值写到 block 不读的键上,等于把本单要消除的缺陷(声明了却被丢弃)往下挪一层、看起来像接好了 —— 所以 kanban 的 columns(那是泳道,不是字段列表)永远不会被 view 的字段列表覆盖,没有行上限的 block 就把 limit 留空。逐 block 覆盖表连同两处残留缺口,写进了 content/docs/guide/data-source.md

view 那一列写的是「命名的 saved view 在该 block 上实际贡献了什么」。解析不到的 view 名在表里每一个 block 上都渲染配置错误 —— 包括那些从 view 里什么都不取的 block,所以写错名字在任何 block 上都不会静默通过。

公共件:一张优先级表,不是八份

新增 packages/react/src/element-data-source/ElementDataSourceGate.tsx,导出 useElementDataSourceSchema / ElementDataSourceGate / ElementDataSourceErrorPanel / ElementDataSourceLoadingPanel。#5576 的公共件本体(useElementDataSourcecomposeElementDataSource 等)一行未改;新增的这一层只负责最后一跳:把合成结果写到某个 block 真读的那几个键上,并统一渲染 loading / 无法解析两种非终态。

之所以要这一层:dataSource 声明在每一个 page component 上,八个 block 需要的是同一张优先级表、只有键名不同 —— 那是一份映射描述,不是八套算法。一 block 一份副本正是「additional filter criteria」会变成两种方言的路径(一块 and 合成、下一块直接替换)。

语义完全沿用 #5576:view 提供基线 → 组件自身显式键覆盖 view → 绑定的显式键覆盖两者;filter 三方 and 合成(绑定只能收窄 view,永远不能放宽);view 解析不到报错、不回退全量;空 columns: [] 视作「未声明」。

plugin-listListViewBlock 早于本层落地,仍带一份私有副本(两者当前语义一致 —— #5576 整套 60 文件 826 例在本层下未改一行全绿)。把它收敛过来是 objectstack#7120(观察类)。

每 block 两方向钉子

新增 9 个测试文件、48 例。每一块都同时钉住「带 dataSource(含 view)时按 view 选行 / 正确映射」与「不带时行为与现状完全一致」。公共层另有 19 例,单独钉两条所有 block 都依赖、而任何单块测试都看不见的性质:优先级表本身,以及未映射的键一定不被写入(kanban 的泳道、object-form 只写对象名)。

反向验证(先预判方向,再跑)

两次变异,都不提交:

  1. record_picker 恢复 pre-fix 的读法(直接读 schema.dataSource,丢 view)。预判:合成相关的两例翻红,其余四例保持绿。实测 2 failed | 4 passed —— 红的正是 view 的 filter/sort/cap 与三方 and 合成;绿的是「绑定显式键覆盖」(绑定键本来就赢,与 view 无关)、「无法解析的 view 报错」(那条走的是 hook 那一肢,变异没碰它)、无 view 基线、以及 properties.object 简写。
  2. 公共层去掉 object 映射那一行。预判:八个 block 的「查询到达数据层」全部翻红,而无绑定基线与错误面板保持绿。实测 18 failed | 28 passed,跨全部 8 个测试文件,分布与预判一致。

顺手记录、未在本 PR 修的发现

  • objectstack#7118 — record:related_list.filter 声明了却无人读(RelatedList 的列表查询只按父关系过滤)。因此本 PR 故意不映射 它的 filter,并钉了一条诚实的反向断言:确认没有任何 filter 到达 RelatedList。连带后果(saved view 的 filter 被丢、列表比它引用的 view 更宽)在代码注释与文档里明写。
  • objectstack#7119 — object-gridinputs 声明 filters(复数),渲染器只读 filter(单数)。
  • objectstack#7120 — ListViewBlock 的私有优先级表副本(观察类,finding)。
  • objectstack#7121 — 剩余 object-bound public block(gantt / timeline / map / pivot / master-detail-form / embeddable-form / line_items)仍未消费该绑定。

顺带的两处

  1. ElementDataSourceGateListViewBlock 的「BINDING 不能被当成 adapter」防御(#5576)提到公共层,一次覆盖所有 block:host(或旧的缓存 bundle)把绑定从 adapter 参数递进来时,一个真实存在的 view 会被报成解析不到。已钉住。
  2. 一处测试修复:packages/plugin-kanban/src/registration.test.tsx 原本整模块替换 @object-ui/react 且只列两个导出,于是渲染器多用一个导出就会以「mock 上没有定义 ElementDataSourceGate 导出」失败,而不是报告它本该测的注册行为。改成 importOriginal() 的部分 mock —— 与 plugin-calendar/src/registration.test.tsx 已有的同款转换、同一理由(objectui#3219)。

验证输出

# 新增钉子 + #5576 原有 list-view 钉子 + kanban 注册测试(11 文件)
pnpm exec vitest run packages/react/src/element-data-source/ ... packages/plugin-list/src/__tests__/ListView.elementDataSource.test.tsx
  Test Files  11 passed (11)
       Tests  67 passed (67)

# 受影响包全量回归(分批)
packages/plugin-list + packages/react + console public-contract/binding-reach   60 files / 826 passed
packages/plugin-grid + plugin-kanban + plugin-calendar                          70 files / 586 passed
packages/plugin-kanban/registration + plugin-charts + plugin-dashboard          51 files / 422 passed
packages/plugin-detail + plugin-form                                            98 files / 839 passed
packages/components + plugin-view                                              115 files / 977 passed
apps/console + packages/app-shell                                              336 files / 3126 passed, 1 skipped

# 仓根类型检查
pnpm exec turbo run type-check --concurrency=2
  Tasks:    78 successful, 78 total

node scripts/check-control-bytes.mjs
  OK (scanned 3860 tracked text file(s); skipped 85 binary)

Generated by Claude Code

claude added 2 commits August 9, 2026 17:52
…丢 view (objectstack#6953)

objectstack#5576 把 spec 的 per-element 数据绑定接到了 `list-view`,同一条声明在
其余每一个 page component 上依旧无人消费。两个缺口都是静默的:

- `element:record_picker` 读了五个键里的四个,单独丢掉 `view`。于是
  `dataSource: { object: 'account', view: 'hot' }`(spec 自己的例子)构造出全量
  account 选择器,而不是 saved view 选出的行 —— 不抛错、不报面板,只是候选列表
  比作者写的更宽,用户因此能选到页面声明为范围外的记录。
- `object-grid` / `object-form` / `object-kanban` / `object-calendar` /
  `object-chart` / `object-metric` / `record:related_list` 整条绑定都不读:每块
  都把 fetch 挂在自己的 `objectName` 上,没有任何地方把 `dataSource.object` 映射
  过去。按 spec 写、不额外写 `objectName` 的页面渲染出空 —— 不发请求、无诊断。
  spec-valid 的 metadata 渲染出空,即 objectstack#4413 的形状。

新增 `packages/react/src/element-data-source/ElementDataSourceGate.tsx`
(`useElementDataSourceSchema` / `ElementDataSourceGate` / 两个状态面板)。#5576
的公共件本体一行未改;新增这一层只负责最后一跳 —— 把合成结果写到某个 block 真读
的那几个键上,并统一渲染 loading / 无法解析两种非终态。之所以要这一层:`dataSource`
声明在每一个 page component 上,八个 block 需要的是同一张优先级表、只有键名不同,
那是一份映射描述而不是八套算法;一 block 一份副本正是「additional filter criteria」
变成两种方言的路径。语义完全沿用 #5576(view 作基线、组件显式键覆盖 view、绑定显式
键覆盖两者、`filter` 三方 `and` 合成、view 解析不到报错不回退全量、空 `columns: []`
视作未声明)。

映射只写该 block 真读的键:把合成值写到 block 不读的键上,等于把本单要消除的缺陷
往下挪一层、看起来像接好了。所以 kanban 的 `columns`(泳道,不是字段列表)不会被
view 的字段列表覆盖,没有行上限的 block 就把 `limit` 留空。逐 block 覆盖表连同两处
残留缺口写进 `content/docs/guide/data-source.md`。

钉子:9 个新文件 46 例,每块两方向(带 `dataSource`(含 `view`)/ 不带);公共层另
18 例,钉住优先级表本身与「未映射的键一定不被写入」——两条所有 block 都依赖、而任何
单块测试都看不见的性质。

反向验证(先预判方向再跑,变异不提交):

- record_picker 恢复 pre-fix 读法(直读 `schema.dataSource`,丢 `view`):预判合成
  相关两例翻红、其余四例绿。实测 2 failed / 4 passed —— 红的是 view 的
  filter/sort/cap 与三方 `and` 合成;绿的是「绑定显式键覆盖」(绑定键本来就赢)、
  「无法解析的 view 报错」(走 hook 那一肢,变异没碰)、无 view 基线、`properties.object`
  简写。
- 公共层去掉 object 映射那一行:预判八个 block 的「查询到达数据层」全部翻红,无绑定
  基线与错误面板保持绿。实测 18 failed / 28 passed,跨全部 8 个文件,分布与预判一致。

顺带记录、未在此修:objectstack#7118(`record:related_list.filter` 声明了却无人读,
因此本次故意不映射它的 `filter`,并钉了一条确认「没有任何 filter 到达 RelatedList」
的诚实断言)、objectstack#7119(`object-grid` 的 inputs 是 `filters` 复数、渲染器读
单数 `filter`)、objectstack#7120(`ListViewBlock` 的私有优先级表副本,观察类)、
objectstack#7121(剩余 object-bound public block 仍未消费该绑定)。

`plugin-kanban/src/registration.test.tsx` 顺带从整模块 mock 改成 `importOriginal()`
部分 mock —— 与 `plugin-calendar/src/registration.test.tsx` 同款转换、同一理由
(objectui#3219)。

Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt

Co-authored-by: Claude <noreply@anthropic.com>
…tack#6953)

绑定与运行时 adapter 同名 —— `SchemaRenderer` 现在已不再 spread `schema.dataSource`
为 prop,但 host(或旧的缓存 bundle)把 BINDING 从 adapter 参数递进来时,取 saved
view 会走到「这个 data source 无法列出保存的视图」,于是一个真实存在的 view 被报成
解析不到。`ListViewBlock` 本来就带这条防御(#5576),现在提到公共层,一次覆盖所有
block。

钉子:把 `{ object, view }` 当 adapter 传入时,状态是 missing 且错误正文点明「无法
列出视图」这一事实,而不是宣称 view 不存在 —— 即没有走 binding-as-adapter 那条路。

Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt

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

vercel Bot commented Aug 9, 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 9, 2026 6:22pm

Request Review

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

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

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.66KB 3.13KB
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) 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) 483.08KB 106.48KB
core (index.js) 3.00KB 1.14KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 139.61KB 35.99KB
fields (index.js) 227.45KB 56.31KB
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.65KB 1.06KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 9.48KB 3.27KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 4.52KB 1.96KB
layout (index.js) 38.53KB 10.71KB
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) 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) 45.23KB 12.45KB
plugin-charts (index.js) 61.49KB 17.48KB
plugin-chatbot (index.js) 180.33KB 42.79KB
plugin-dashboard (index.js) 118.39KB 30.67KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 237.03KB 59.17KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 112.29KB 27.16KB
plugin-gantt (index.js) 162.55KB 39.57KB
plugin-grid (index.js) 187.90KB 49.79KB
plugin-kanban (index.js) 48.53KB 13.38KB
plugin-list (index.js) 109.73KB 26.55KB
plugin-map (index.js) 16.81KB 5.24KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 25.76KB 7.33KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 84.03KB 20.55KB
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) 20.15KB 6.72KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.23KB 0.66KB
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.71KB 1.34KB
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 验收(session_01GTRjn8xBqp75dk7kFupVRt):通过,转 ready 并挂 auto-merge。objectstack#6953 落地。

核验记录(head b26dc2550,基 65bb513dc,实物核验 + CI 亲读):

  1. 共享 last-hop 层是「不逐块重写」的正确实现:派发词禁止的是各 block 重复实现,dev 反向抽象出 useElementDataSourceSchema/ElementDataSourceGate(@object-ui/react 新增),#5576 公共件本体零改动、合成语义逐字沿用 —— 比字面遵守更优的服从。映射原则「只写目标 block 真读的键」防止缺陷下移一层(kanban swimlane columns、无行帽 block 的 limit 刻意不映射),残缺口写进 docs/guide/data-source.md —— 诚实的覆盖表。
  2. 八 block 接线 + 边界零违规(实物核验):24 文件不含 SchemaRenderer.tsx / ChartContainerImpl.tsx(与在飞 「空谓词」在三处有三种范围:disabled: { dialect: 'cel', source: '' } 仍被判成已声明的门 → 永久置灰(#3842 修完后的残留,需先裁) #3850+SchemaRenderer 的 disabled 门用第三种拼法 !== undefined:disabled: '' / disabled: null 在通用渲染路径上永久置灰 #3862、#7026 的互斥边界严格遵守);record_picker 补 view 走公共件。
  3. 反向验证两次预判命中:①record_picker 回退旧读法 → 2 failed | 4 passed,红绿分布逐条相符且对「为何这四条绿」给出正确归因;②共享层撤 object 映射 → 18 failed | 28 passed 横跨全部 8 个测试文件。
  4. 回归面覆盖巨大且全绿:新钉 67 + 分批全仓回归(plugin-list/react/console 826、grid/kanban/calendar 586、charts/dashboard 422、detail/form 839、components/view 977、console/app-shell 3126)—— kanban mock 的 importOriginal 修正按 plugin-calendar 的 registration.test.tsx 在 main 上就是红的:@object-ui/react 的 vi.mock 缺 subscribeDataChanges #3219 先例处置正确。
  5. 门与规程:type-check 78/78;控制字节门 + 自扫;1 changeset 覆盖 9 包(presence/no-major 门绿);提交文案控制词 0;⛔ releases/ 未触碰。
  6. CI 亲读终态:20/20 全 completed、0 失败(Test shard×4 至 18:28:22Z、Type Check 18:28:04Z)。

四条 out-of-scope(os#7118/7119/7120/7121)由 PM 分诊(另评于各单)。


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 9, 2026 18:49
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 9, 2026
Merged via the queue into main with commit 5bfaabd Aug 9, 2026
21 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-6953-datasource-block-wiring branch August 9, 2026 18:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants