Skip to content

fix(sdui): PageComponentSchema.dataSource 接到剩余 7 个 object-bound block (objectstack#7121) - #3982

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-7121-datasource-remaining-blocks
Aug 9, 2026
Merged

fix(sdui): PageComponentSchema.dataSource 接到剩余 7 个 object-bound block (objectstack#7121)#3982
yinlianghui merged 2 commits into
mainfrom
claude/issue-7121-datasource-remaining-blocks

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes objectstack-ai/objectstack#7121

这个 PR 修什么

objectstack#6953(PR #3969)把 spec 的 per-element 数据绑定(PageComponentSchema.dataSource = { object, view?, filter?, sort?, limit? })接到了它正文点名的 8 个 block,同一条声明在其余 7 个 object-bound public block 上依旧无人消费:object-gantt / object-timeline / object-map / object-pivot / object-master-detail-form / embeddable-form / record:line_items

每一块都把取数挂在自己的对象键上,而没有任何地方把 dataSource.object 映射过去 —— 按 spec 写、不额外写 objectName 的页面渲染出空甘特 / 空时间轴 / 无标记的地图 / 空交叉表 / 无字段的表单,不发请求、也没有任何诊断。spec-valid 的 metadata 渲染出空,就是 objectstack#4413 的形状。

本 PR 复用 #6953 落地的共享层(useElementDataSourceSchema / ElementDataSourceGate),共享层与 #5576 的解析层一行未改;合成语义完全沿用 #5576(view 提供基线 → 组件显式键覆盖 view → 绑定显式键覆盖两者;filter 三方 and 合成,绑定只能收窄 view;view 解析不到报错、不回退全量)。

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

block 文件 object view 贡献 filter sort limit
object-gantt(+ view:gantt) packages/plugin-gantt/src/index.tsx objectName filter/sort ⛔ reload 不发 $top
object-map(+ view:map) packages/plugin-map/src/index.tsx objectName filter/sort ⛔ 无 $top
object-pivot packages/plugin-dashboard/src/index.tsx objectName filter ⛔ 由 row/columnField 定序 ⛔ 截断页算不出总计
object-timeline(+ view:timeline) packages/plugin-timeline/src/index.tsx objectName 仅校验名字 ⛔ 无读点 ⛔ 无读点 ⛔ 硬编码窗口
embeddable-form packages/plugin-form/src/index.tsx objectName 仅校验名字 ⛔ 无集合查询
object-master-detail-form packages/plugin-form/src/index.tsx objectName(对象) 仅校验名字 ⛔ 无集合查询
record:line_items packages/plugin-form/src/index.tsx childObject 仅校验名字 ⛔ 只按父 FK ⛔ 无读点 ⛔ 固定 $top: 500

⛔ 的含义是「该 block 没有这个键的读点,所以故意不映射」,不是遗漏。 把合成值写到 block 不读的键上,等于把本单要消除的缺陷(声明了却被丢弃)往下挪一层、看起来像接好了 —— 所以每一个 ⛔ 都各钉了一条诚实断言:确认那个键确实没有进到查询里。逐块读点(给行号)在各处代码注释里;逐块覆盖表连同残缺口写进了 content/docs/guide/data-source.md

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

一处需要单独说明:record:line_itemsobject 落在 childObject

这是本批唯一一个对象键不叫 objectName 的块。它列的、取的、写的集合都是 schema.childObject(LineItemsPanel.tsx:dataSource.find(schema.childObject, …)getObjectSchema(schema.childObject)、保存批次的子腿),所以 dataSource.object 映射到那里 —— 与 record:related_listobjectName 同义:两处那个键都是该面板绑定的子对象,正是 dataSource.object 的含义。relationshipField 不属于绑定、仍归作者(它必须是绑定子对象上的字段);columns 在这里是可编辑网格的 GridColumn[]({ field, type, options, computed, expr, … }),不是字段名投影 —— view 的列表在这里是形状不对,不只是「答案更宽」,因此不映射。

每块两方向钉子

7 个新测试文件 31 例。每一块都同时钉住「带 dataSource(含 view)时正确映射」与「不带时行为与现状逐字一致」,并各带一条「未映射的键一定不进查询」。

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

  1. 撤掉 object-map 的 gate(恢复 pre-fix 渲染器)。预判:4 条带绑定的钉子翻红(无 objectNamegetDataConfig() 返回 null → 压根不发 find、也不渲染错误面板),无绑定基线保持绿。实测 4 failed | 1 passed,红的正是那 4 条(全部卡在 waitFor(find 被调用) 或错误面板断言),绿的是「不带 dataSource 时行为逐字一致」。
  2. record:line_items 的映射键从 childObject 改回默认 objectName。预判:两条对象身份断言翻红(合成值落到没人读的键上 → 查询对象变 undefined),错误面板那条与无绑定基线保持绿。实测 2 failed | 2 passed,报文正是 expected undefined to be 'invoice_line' —— 「写到没有读点的键上」这一失败模式被直接观测到,也是这个映射键选择的证据。

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

  • objectstack#7137 — object-timeline / record:line_items 的取数没有 filter/sort 读点(timeline 是 find(objectName, { options: { $top: 100 } }),line_items 只按父 FK + 固定 $top: 500),所以命名的 view 解析成功却贡献为零、列表可能比它引用的 view 更宽。与 objectstack#7118 同形。本 PR 刻意不映射这些键,并各钉了一条确认查询里确实没有它们的断言 —— 缺口一旦补上,那两条钉子会翻红,提醒同步更新映射与文档。
  • objectstack#7138 — ObjectMap.getMapConfig()schema.filter.map / schema.filter.map.style地图配置(把 filter 键当配置容器;声明过的输入是 map)。注意其相互作用:绑定/view 带来的 filter 一旦合成成 and 节点,legacy 那条 stash 就找不到了 —— 已在映射旁注释写清,本 PR 不依赖该 legacy 形状。
  • objectstack#7139 — plugin-map/src/index.tsx 模块作用域遗留 console.log('Registering object-map...')(观察类)。

边界(按派发约定)

⛔ 未碰 RelatedList.tsx / record-related-list.tsx(在飞的 os#7118 + #3895 结对面);⛔ 未碰共享层本体、SchemaRendererChartContainerImpl;⛔ 未碰 content/docs/releases/

验证输出

# 7 个新钉子
pnpm exec vitest run <7 个 elementDataSource 测试文件> --maxWorkers=2
  Test Files  7 passed (7)
       Tests  31 passed (31)

# 受影响包 + 消费半径全量回归(分批)
packages/plugin-gantt + plugin-timeline + plugin-map                  46 files / 381 passed
packages/plugin-dashboard + plugin-form                               68 files / 608 passed
packages/plugin-list + react smoke + sdui-parser tier + core registry 31 files / 508 passed
apps/console 的四个注册表探针
  (public-block-binding-reach / record-block-record-reach /
   public-contract / preview-samples-registry-resolvable)              4 files /  43 passed
packages/react/src/element-data-source/ + app-shell inspector 两例      3 files /  31 passed

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

node scripts/check-control-bytes.mjs
  OK (scanned 3874 tracked text file(s); skipped 85 binary)
node scripts/check-changeset-presence.mjs   ✅ 5 released packages / 1 changeset
node scripts/check-changeset-no-major.mjs   ✅ no major
eslint(改动文件)                            0 errors(仅与同文件既有风格一致的 any/react-refresh 警告)

changeset:@object-ui/plugin-gantt / plugin-timeline / plugin-map / plugin-dashboard / plugin-formpatch —— 用户可见的行为修复,无新增公共 API(共享层未改),按仓约定不声明 major


Generated by Claude Code

… (objectstack#7121)

objectstack#6953(objectui PR #3969)把 spec 的 per-element 数据绑定接到了它点名的
8 个 block,同一条声明在其余 7 个 object-bound public block 上依旧无人消费:
object-gantt / object-timeline / object-map / object-pivot /
object-master-detail-form / embeddable-form / record:line_items。

每一块都把取数挂在自己的对象键上,而没有任何地方把 `dataSource.object` 映射过去
—— 按 spec 写、不额外写 `objectName` 的页面渲染出空甘特 / 空时间轴 / 无标记的地图 /
空交叉表 / 无字段的表单,不发请求、也没有任何诊断。spec-valid 的 metadata 渲染出空,
即 objectstack#4413 的形状。

复用 #6953 落地的共享层(`useElementDataSourceSchema` / `ElementDataSourceGate`),
一行未改;合成语义完全沿用 #5576(view 作基线、组件显式键覆盖 view、绑定显式键覆盖
两者、`filter` 三方 `and` 合成、view 解析不到报错不回退全量)。

映射只写该 block 真读的键(逐块查过读点):

- object-gantt  (plugin-gantt/src/index.tsx)      object + filter + sort
  `$filter: schema.filter` / `$orderby: convertSortToQueryParams(schema.sort)`;
  reload 不发 `$top`、字段由 `gantt` 配置点名 → limit/columns 不映射。
- object-map    (plugin-map/src/index.tsx)        object + filter + sort(同上读点)
- object-pivot  (plugin-dashboard/src/index.tsx)  object + filter
  交叉表由 rowField/columnField 自己定序、总计不能在截断页上算 → sort/limit 不映射。
- object-timeline (plugin-timeline/src/index.tsx) object only
  取数就是 `find(objectName, { options: { $top: 100 } })` —— 无 filter/orderby 读点、
  窗口硬编码 → filter/sort/limit 刻意不映射。
- embeddable-form / object-master-detail-form (plugin-form/src/index.tsx) object only
  写一条记录,没有集合查询给 filter/sort/limit 收窄;master-detail 的 object 是**父**
  对象,子集合按 `details[]` 的 FK 取、固定 `$top: 500`。
- record:line_items (plugin-form/src/index.tsx)   object → **childObject**
  它列的/取的/写的集合是 `childObject`(与 record:related_list 的 `objectName` 同义:
  都是该面板绑定的子对象);`relationshipField` 不属于绑定,仍归作者;查询只有父 FK +
  固定 `$top: 500`;`columns` 是可编辑网格的 `GridColumn[]`,不是字段名投影 —— view 的
  列表在这里是**形状不对**,不只是更宽。

把合成值写到 block 不读的键上,等于把本单要消除的缺陷往下挪一层、看起来像接好了,
所以上面每一个「不映射」都各钉了一条诚实断言(查询里确实没有那个键)。逐块覆盖表与
两处残缺口(timeline / line_items 的 view 贡献为零)补进了
`content/docs/guide/data-source.md`。

钉子:7 个新测试文件 31 例,每块两方向(带 `dataSource`(含 `view`)/ 不带),外加
「未映射的键一定不进查询」。

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

- 撤掉 object-map 的 gate(恢复 pre-fix 渲染器):预判 4 条带绑定的钉子翻红(dataConfig
  为 null → 压根不发 find、也不渲染错误面板)、无绑定基线保持绿。实测
  `4 failed | 1 passed`,红的正是那 4 条(全部卡在 `waitFor(find 被调用)` / 错误面板),
  绿的是「不带 dataSource 时行为逐字一致」。
- 把 record:line_items 的映射键从 `childObject` 改回默认 `objectName`:预判两条对象身份
  断言翻红(合成值落到没人读的键上 → 查询对象变 `undefined`)、错误面板与无绑定基线保持
  绿。实测 `2 failed | 2 passed`,报文正是 `expected undefined to be 'invoice_line'` ——
  「写到没有读点的键上」这一失败模式被直接观测到。

顺手记录、未在本 PR 修:objectstack#7137(timeline / line_items 无 filter/sort 读点,
命名的 view 贡献为零)、objectstack#7138(ObjectMap 从 `schema.filter.map` 读地图配置)、
objectstack#7139(plugin-map 模块作用域的 console.log)。

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 9:01pm

Request Review

…asource-remaining-blocks

# Conflicts:
#	content/docs/guide/data-source.md

Copy link
Copy Markdown
Collaborator Author

main 的交叠:已 merge 并复验(非 rebase、无 force-push)

开 PR 时 GitHub 报 mergeable_state: dirty —— main 在我 push 前推进了 5 个提交,其中 PR #3981(objectstack#7118,record:related_list.filter 接线)也改了 content/docs/guide/data-source.md 的同一张覆盖表。这是本仓「动共享面前扫一眼在途 PR」那条纪律的实例:两边都在给同一张表加行/改格。

已把 origin/main merge 进本分支并取并集解决(5adeeb07f):

合并后重跑(仓根 vitest,受影响包全量;merge 带进来的 plugin-detail / app-shell / fields / predicate 改动一并在内):

pnpm exec vitest run packages/plugin-gantt/ packages/plugin-timeline/ packages/plugin-map/ \
                     packages/plugin-dashboard/ packages/plugin-form/ --maxWorkers=2
  Test Files  114 passed (114)
       Tests  989 passed (989)

pnpm exec vitest run apps/console/src/__tests__/public-block-binding-reach.test.tsx \
                     apps/console/src/__tests__/record-block-record-reach.test.tsx \
                     apps/console/src/__tests__/public-contract.test.ts --maxWorkers=2
  Test Files  3 passed (3)
       Tests  40 passed (40)

pnpm exec turbo run type-check --concurrency=2
  Tasks:    78 successful, 78 total

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

正文「验证输出」一节里的数字是 merge 之前的那一轮,保留原样不改写 —— 上面这一轮是 merge 之后的复验,两轮都真跑过。PR 仍为 draft,未挂 auto-merge(按派发约定,交回 PM 复核)。


Generated by Claude Code


Generated by Claude Code

@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-_m8HdKuU.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.34KB 106.60KB
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.92KB 56.45KB
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.54KB 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.67KB 30.69KB
plugin-designer (index.js) 210.51KB 42.51KB
plugin-detail (index.js) 237.80KB 59.48KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 112.86KB 27.24KB
plugin-gantt (index.js) 162.79KB 39.67KB
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) 17.05KB 5.33KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 40.58KB 10.58KB
plugin-timeline (index.js) 25.99KB 7.42KB
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) 23.71KB 7.95KB
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#7121 落地 —— dataSource 绑定接线工程(#5576 → os#6953 → os#7121)全量收官,15 个 object-bound block 全部消费或明确豁免。

核验记录(head 5adeeb07f,基 5bfaabde0,实物核验 + CI 亲读):

  1. 7 块全接线、无整体豁免:派发预设 embeddable-form 可能不适用被实测推翻(有 config.objectName 读点)—— 前提修正正确;line_items 的 object → childObject 映射(该块无 objectName 键,issue 候选表描述不符已指出)由反向变异直接钉住(改回默认键 → expected undefined to be 'invoice_line' —— 「写到没人读的键上」被直接观测)。
  2. 映射纪律沿 PR3969:只写真读的键,timeline 无 filter/sort 读点的部分豁免配诚实断言 + 立 os#7137;逐块读点位置进注释;文档覆盖表更新。
  3. 边界零违规(实物核验):RelatedList/共享层/SchemaRenderer/ChartContainerImpl 零触碰;与 PR3981 的文档表冲突以 merge(非 rebase/force-push)处理、取并集逐条说明、merge 前后双轮复验(989 tests + type-check 78/78 各两轮)。
  4. 反向验证两次预判命中(4 failed | 1 passed / 2 failed | 2 passed,分布逐条吻合)。
  5. 门与规程:31 新钉 + 全仓受影响面分批全绿;控制字节门 + 14 文件自扫;changeset 5 包 patch 依据成立;fable 0;⛔ releases/ 未触碰。
  6. CI 亲读终态:20/20 全 completed、0 失败(Test shard×4 至 21:07:34Z)。

concerns 采信:pivot 占位符×AST 交叉未深钉(记入 os#7137 实施参考)、gantt/map 内联数据优先级维持现状、os#7138 与 filter 映射的相互作用已注释 —— 三条边界判断合理。out-of-scope 三单(os#7137 已晋级、os#7138/7139 已分诊)处置完毕。


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 9, 2026 21:57
@yinlianghui
yinlianghui added this pull request to the merge queue Aug 9, 2026
Merged via the queue into main with commit 022002a Aug 9, 2026
21 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-7121-datasource-remaining-blocks branch August 9, 2026 21:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants