Skip to content

feat(spec)!: 双源清账 C13+C15 —— 退役 L1「Simple Sync」整层,integration 冲突枚举改名 ConnectorConflictResolution,ui 侧保名 (#4738) - #4760

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-4738-datasync-conflict-dual-source
Aug 3, 2026
Merged

feat(spec)!: 双源清账 C13+C15 —— 退役 L1「Simple Sync」整层,integration 冲突枚举改名 ConnectorConflictResolution,ui 侧保名 (#4738)#4760
os-zhuang merged 1 commit into
mainfrom
claude/issue-4738-datasync-conflict-dual-source

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Fixes #4738

概要(#4535 C13+C15 合并单,基线删 4 行:认领时点 12 → 8;C16 #4752 先行合入 −2 后,rebase 实跑 10 → 6)

按维护者已裁决路线(#4535 前锋判定 + 2026-08-03 批复,L1 否决位默认通过),一个 PR 三个动作:

动作 对象 结果
死删 ./automationautomation/sync.zod.ts 整文件(L1「Simple Sync」层:DataSyncConfig(Schema)、其嵌入的 ConflictResolution(Schema) 枚举及全部卫星导出,共 17 个导出名)+ sync.test.ts TS2305,三仓零命中
改名 ./integrationConflictResolution(Schema)ConnectorConflictResolution(Schema)(D9(a),RENAMED_DEFS 承接,0-key carry);DataSyncConfig integration 侧保名不动(ConnectorSchema.syncConfig 活解析路径) 枚举值逐字不变,零元数据迁移
保名 ./uiConflictResolution(Schema) 一字未动(objectui useOffline.ts + types/index.ts:1054 re-export + parity ratchet 钉住);api/ConflictResolutionStrategy 第四亲戚未动 objectui 零迁移

三仓重验(不引前锋结论,import 语句级实测)

扫描基线:objectstack 本分支(自 51c52274b,rebase 后 56470061d)、cloud @ 5df2c69、objectui @ 785b8a5(与前锋扫描同 SHA;cloud-v1 容器内无检出,与前锋同为三仓结论):

  • automation sync.zod.ts 全部 17 个导出名:cloud 零命中;objectui 零命中(仅 export type * as Automation 类型命名空间,全仓零 Automation.DataSyncConfig 一类的命名空间解引用);objectstack 仓内唯一消费者是同文件 sync.test.ts(同 PR 删除)+ 文档/生成物。无任何父 schema 嵌入(仓内 grep 全量核对;ETLSyncMode / api/ConflictResolutionStrategy 为不同名,未动)。
  • integration ConflictResolution(Schema):三仓外部零 importer;仓内唯一引用 = connector.zod.ts 内部 DataSyncConfigSchema.conflictResolution(已随改名更新)+ connector.test.ts(已更新)。
  • ui ConflictResolution(Schema):objectui 实活消费确认 —— packages/react/src/hooks/useOffline.ts:13(@objectstack/spec/ui type import + re-export)、packages/types/src/index.ts:1054(对外 re-export)、offline-nav-performance-spec-parity.test.ts(ratchet:ConflictResolution 必须保持 spec 导出、且与 ConflictResolutionStrategy 是不同声明)、spec-ui-schema-reexports.test.ts:73(ConflictResolutionSchema 必须从 spec/ui re-export)。本 PR 对 ui/offline.zod.ts 零改动(git diff 可验)。

门禁判定输出(#4650,以实跑为准)

39 个 authorable key 的删行全部由门禁**路径 3(整 def 消失)**自证(gen:schema 实跑输出;rebase 后 merge-base 锚定在 56470061d577 = C16 #4752 之后的 main,rebase 前锚定 51c52274b8bb 时判定完全一致):

ℹ️  4 baseline deletion(s) since 56470061d577 carry their own proof (#4650):
     - automation/DataDestinationConfig:* (6 line(s)) — def no longer emitted by this build; whole-schema
       removals are adjudicated by json-schema.manifest.json (#2978) and check:api-surface.
     - automation/DataSourceConfig:* (5 line(s)) — def no longer emitted by this build; whole-schema
       removals are adjudicated by json-schema.manifest.json (#2978) and check:api-surface.
     - automation/DataSyncConfig:* (19 line(s)) — def no longer emitted by this build; whole-schema
       removals are adjudicated by json-schema.manifest.json (#2978) and check:api-surface.
     - automation/SyncExecutionResult:* (9 line(s)) — def no longer emitted by this build; whole-schema
       removals are adjudicated by json-schema.manifest.json (#2978) and check:api-surface.

(issue 预期「路径 2 不可达或整 def 消失,以实跑为准」—— 实跑结果为后者:整文件删除使 8 个 def 全部不再发出,per-key 可达性判定不再适用,按 #4650 设计移交 manifest ratchet + check:api-surface 裁决。)

📢 manifest def 移除响亮记录(#4725 纪律区)

json-schema.manifest.json 蓄意删除(#2978 通道)8 个 def 键(issue 正文预估 2 个 —— automation/DataSyncConfig + automation/ConflictResolution;实施按 issue 实施要点「automation/sync.zod.ts + test 删除」整文件死删,同文件 6 个卫星 def 一并出账,逐个列明):

  • automation/ConflictResolution(基线内)
  • automation/DataSyncConfig(基线内)
  • automation/DataDestinationConfig(卫星,仅被 DataSyncConfig 嵌入)
  • automation/DataSourceConfig(卫星,仅被 DataSyncConfig 嵌入)
  • automation/SyncDirection(卫星枚举)
  • automation/SyncMode(卫星枚举)
  • automation/SyncExecutionStatus(卫星枚举)
  • automation/SyncExecutionResult(L1 执行结果信封,同层退役)

卫星不删则成 C3 型孤儿遗留(#4616 教训);全部三仓零消费者(上节实测)。另 integration/ConflictResolution 键经 RENAMED_DEFS 承接自动改写为 integration/ConnectorConflictResolution(manifest 净变化 −9 +1)。

RENAMED_DEFS 承接证明

scripts/lib/renamed-defs.ts 新增一行:integration/ConflictResolution → integration/ConnectorConflictResolution(0-key carry —— 枚举 def 无 authorable properties,authorable-surface 无行可承接;manifest 键由两道 ratchet 按表改写)。gen:schema 实跑通过承接表全部不变式(source 不再发出 / target 已发出 / 无合并 / 无链)。真退役(automation 侧)入表 —— 表的不变式「没有 key 离开契约」保持成立。

基线实跑(删 4 行)

rebase 到 C16 后的 main(基线 10)实跑:

✅  self-test: flags same-name different-declaration exports, and nothing else.
✅  no new dual-source exports: 4304 names across 16 entry points — 168 re-exported (single declaration), 6 accepted dual-source (baseline).

删行 4 条:ConflictResolution / ConflictResolutionSchema / DataSyncConfig / DataSyncConfigSchema(认领时点账面 12 → 8;rebase 前于 51c52274b 实跑过 12 → 8,数字一致性两个锚点都验过)。

回归 pin + sabotage(C6 PR #4745 形态)

新增 packages/spec/src/automation/sync-retirement.test.ts:TypeScript compiler-API 符号身份解析,package.json exports map 全入口枚举(未来新入口无法逃逸),防空转守卫(module symbol 必须解析、./automation 表面超 50 导出、入口数超 10)。断言:

  1. ./automation 不再命名 17 个退役导出中的任何一个(邻居 ETLPipelineSchema / StateMachineSchema 健在);
  2. ConnectorConflictResolution(Schema) ./integration 导出、声明溯源 integration/connector.zod.ts;
  3. 裸名 ConflictResolution(Schema) 全包唯一属主 ./ui(holders 精确等于 ['./ui'] —— 不止「同一声明」:re-export 同声明对 dual-source 门禁是绿的,但会把离线词表谎称成连接器策略,C14 教训);
  4. DataSyncConfig(Schema) 全包唯一属主 ./integration;
  5. 第四亲戚 api/ConflictResolutionStrategy 健在且与 ui 声明不同源;
  6. 运行时命名空间一致性 + 词表互斥实测(target_wins ✓ / destination_wins ✗ / merge ✗;ui 侧 client_wins ✓ / target_wins ✗)+ ConnectorSchema.syncConfig 活路径解析(负例与正例仅差一个值,不能因无关原因通过)。

Sabotage 三组全拦截(实跑后已还原,最终 diff 零残留):

# 错案 结果
S1 重加 automation 导出(export const DataSyncConfigSchema 回到 ./automation) ❌ 2 tests failed
S2 禁止的收敛路线:./integration 裸名 re-export ui 声明(dual-source 门禁对此是绿的!) expected [ './ui', './integration' ] to deeply equal [ './ui' ]
S3 「顺手统一」ui 侧改名(objectui#3235 断链重演) expected [] to deeply equal [ './ui' ]

SYNC_ARCHITECTURE.md(手写文档)改动说明

三层叙事 → 两层 + 显式退役记录:新增「Retired: L1 Simple Sync (v17)」一节,如实记载 L1 从未有实现或 reader(三仓零 importer、真图不可达、#4650 门禁),并给出三条替代路径(ConnectorSchema.syncConfig / ETLPipeline / ui 离线协议);L2/L3 编号保留以维持旧引用可读。决策矩阵、模式、迁移指南同步改写(点到点外部同步 → L3 syncConfig)。连带更新:PROTOCOL_MAP.md 删行(link 门禁 protocol-map.test.ts 实跑通过)、quick-reference.mdx 删行、etl.zod.ts / connector.zod.ts / shared/mapping.zod.ts 头注 L1 指路重写、expression-conformance.ledger.ts 删 stale cover(automation/sync.zod.ts:condition,留注释;checkLedger 实跑通过)、严格性台账 automation 段 86 → 74 sites(check:strictness-ledger 实跑:site counts match … section totals balance)。

changeset 论证(major,零元数据迁移)

@objectstack/spec major:已发布导出名移除(automation 17 名,TS2305)+ 已发布导出名改名(integration 2 名,TS2305)。零元数据迁移,逐侧自证不抄先例:integration 侧枚举值逐字节不变(0-key carry 由 RENAMED_DEFS + gen:schema 不变式实跑背书,authored connector 的 conflictResolution 取值域不动);automation 侧无解析站点即无作者(不在 stack 树,conversion 写不出能跑到的 —— converge-activation-event-schema 先例论证),无 tombstone(#4650 路径 3:def 整体出账归 manifest ratchet 管辖,per-key tombstone 无处可挂)。

并行协议合规

验证汇总(全部实跑)

顺带发现(已立单,未认领)

🤖 Generated with Claude Code

https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9

…`ConnectorConflictResolution`,ui 侧保名 (#4738)

`DataSyncConfig(Schema)` 曾由 `./automation` 与 `./integration` 各导出一个声明,
`ConflictResolution(Schema)` 三个入口三个声明(#4411 陷阱)。按维护者裁决
(#4535 前锋判定 + 2026-08-03 批复,L1 否决位默认通过)三动作一单:

- **automation 侧整体死删**:`automation/sync.zod.ts` + `sync.test.ts`(L1
  「Simple Sync」层,17 个导出名)。三仓(objectstack / cloud / objectui)
  import 语句级零消费者、无父 schema 嵌入,8 个 def 全部不再发出 ——
  39 个 authorable key 删行由 #4650 门禁按路径 3(整 def 消失)自证,
  归 manifest ratchet(#2978 蓄意移除,8 键逐个列于 PR)+ check:api-surface
  管辖。
- **integration 侧 D9(a) 改名**:`ConflictResolution(Schema)` →
  `ConnectorConflictResolution(Schema)`,走 `RENAMED_DEFS` 承接(0-key carry,
  枚举值逐字不变);`DataSyncConfig` integration 侧保名不动
  (`ConnectorSchema.syncConfig` 活解析路径)。
- **ui 侧保留正名一字不动**:objectui `useOffline.ts` + `types/index.ts:1054`
  re-export + parity ratchet 钉住;`api/ConflictResolutionStrategy` 第四亲戚
  未动。

- dual-source-exports.baseline.json:删 4 行(认领时点账面 12 → 8;C16 #4752
  先行合入 −2,rebase 到 5647006 后实跑 10 → 6)
- 回归 pin(sync-retirement.test.ts):compiler-API 符号身份 + exports-map
  全入口枚举 + 唯一属主断言 + 防空转守卫;S1(重加导出)/ S2(禁止的裸名
  re-export 收敛)/ S3(动 ui 侧名字)三组 sabotage 均红后还原
- SYNC_ARCHITECTURE.md:三层 → 两层 + 显式 L1 退役记录;PROTOCOL_MAP /
  quick-reference / etl.zod / connector.zod / shared/mapping.zod 头注连带更新
- expression-conformance.ledger.ts:删 stale cover(automation/sync.zod.ts:condition)
- 严格性台账:automation 86 → 74 sites(check:strictness-ledger 实跑)
- changeset:@objectstack/spec major(TS2305),零元数据迁移(integration 值域
  逐字节不变;automation 侧无解析站点即无作者,conversion 不可达)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9
@vercel

vercel Bot commented Aug 3, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 3, 2026 3:03am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling labels Aug 3, 2026
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/dogfood, @objectstack/spec.

108 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via packages/qa/dogfood, @objectstack/spec)
  • content/docs/permissions/delegated-administration.mdx (via packages/qa/dogfood)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

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

Labels

documentation Improvements or additions to documentation size/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec 双源清账 C13+C15(一单):DataSyncConfig + ConflictResolution(automation 死删 / integration 改名 / ui 保名)—— 4 条

2 participants