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-zhuangos-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.tsTS2305,三仓零命中
改名./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/specmajor:已发布导出名移除(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

vercelBot commented Aug 3, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 3, 2026 3:03am

Request Review

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

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xlteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

2 participants

@os-zhuang@claude