feat(spec)!: 双源清账 C13+C15 —— 退役 L1「Simple Sync」整层,integration 冲突枚举改名 ConnectorConflictResolution,ui 侧保名 (#4738) - #4760
Merged
Conversation
…`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
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckThis PR changes 2 package(s): 108 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
os-zhuang
marked this pull request as ready for review
August 3, 2026 03:05
os-zhuang
enabled auto-merge
August 3, 2026 03:05
This was referenced Aug 3, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #4738
概要(#4535 C13+C15 合并单,基线删 4 行:认领时点 12 → 8;C16 #4752 先行合入 −2 后,rebase 实跑 10 → 6)
按维护者已裁决路线(#4535 前锋判定 + 2026-08-03 批复,L1 否决位默认通过),一个 PR 三个动作:
./automation的automation/sync.zod.ts整文件(L1「Simple Sync」层:DataSyncConfig(Schema)、其嵌入的ConflictResolution(Schema)枚举及全部卫星导出,共 17 个导出名)+sync.test.ts./integration的ConflictResolution(Schema)→ConnectorConflictResolution(Schema)(D9(a),RENAMED_DEFS承接,0-key carry);DataSyncConfigintegration 侧保名不动(ConnectorSchema.syncConfig活解析路径)./ui的ConflictResolution(Schema)一字未动(objectuiuseOffline.ts+types/index.ts:1054re-export + parity ratchet 钉住);api/ConflictResolutionStrategy第四亲戚未动三仓重验(不引前锋结论,import 语句级实测)
扫描基线:objectstack 本分支(自
51c52274b,rebase 后56470061d)、cloud @5df2c69、objectui @785b8a5(与前锋扫描同 SHA;cloud-v1 容器内无检出,与前锋同为三仓结论):sync.zod.ts全部 17 个导出名:cloud 零命中;objectui 零命中(仅export type * as Automation类型命名空间,全仓零Automation.DataSyncConfig一类的命名空间解引用);objectstack 仓内唯一消费者是同文件sync.test.ts(同 PR 删除)+ 文档/生成物。无任何父 schema 嵌入(仓内 grep 全量核对;ETLSyncMode/api/ConflictResolutionStrategy为不同名,未动)。ConflictResolution(Schema):三仓外部零 importer;仓内唯一引用 =connector.zod.ts内部DataSyncConfigSchema.conflictResolution(已随改名更新)+connector.test.ts(已更新)。ConflictResolution(Schema):objectui 实活消费确认 ——packages/react/src/hooks/useOffline.ts:13(@objectstack/spec/uitype 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时判定完全一致):(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)实跑:
删行 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)。断言:./automation不再命名 17 个退役导出中的任何一个(邻居ETLPipelineSchema/StateMachineSchema健在);ConnectorConflictResolution(Schema)仅./integration导出、声明溯源integration/connector.zod.ts;ConflictResolution(Schema)全包唯一属主./ui(holders 精确等于['./ui']—— 不止「同一声明」:re-export 同声明对 dual-source 门禁是绿的,但会把离线词表谎称成连接器策略,C14 教训);DataSyncConfig(Schema)全包唯一属主./integration;api/ConflictResolutionStrategy健在且与 ui 声明不同源;target_wins✓ /destination_wins✗ /merge✗;ui 侧client_wins✓ /target_wins✗)+ConnectorSchema.syncConfig活路径解析(负例与正例仅差一个值,不能因无关原因通过)。Sabotage 三组全拦截(实跑后已还原,最终 diff 零残留):
export const DataSyncConfigSchema回到./automation)./integration裸名 re-export ui 声明(dual-source 门禁对此是绿的!)expected [ './ui', './integration' ] to deeply equal [ './ui' ]expected [] to deeply equal [ './ui' ]SYNC_ARCHITECTURE.md(手写文档)改动说明
三层叙事 → 两层 + 显式退役记录:新增「Retired: L1 Simple Sync (v17)」一节,如实记载 L1 从未有实现或 reader(三仓零 importer、真图不可达、#4650 门禁),并给出三条替代路径(
ConnectorSchema.syncConfig/ETLPipeline/ui离线协议);L2/L3 编号保留以维持旧引用可读。决策矩阵、模式、迁移指南同步改写(点到点外部同步 → L3syncConfig)。连带更新: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 无处可挂)。并行协议合规
packages/spec的automation/+integration/+shared/(docblock)+ 跨切面台账/文档/生成物;未触碰api/、system/、contracts/、data/、ai/任何 def 文件(与在飞 RestServerConfig.openApi31(OpenApi31Extensions / Callback / OpenApiWebhookEvent)declared ≠ enforced:没有任何运行时读取它 —— ADR-0049 enforce-or-remove 候选 #4579、C16 spec 双源清账 C16:TenantPlan(./cloud ≠ ./system)—— 路线 B:删 system 侧 provisioning 家族,2 条 #4739 分区互斥)。ui/offline.zod.ts零改动。.changeset/pre.json=mode: pre/tag: rc。sys_metadata_history.recorded_by存 NULL 而非哨兵字符串'system'(#4556) #4742(metadata-protocol,与本单零重叠)与 C16 spec 双源清账 C16:TenantPlan(./cloud ≠ ./system)—— 路线 B:删 system 侧 provisioning 家族,2 条 #4739 → PR feat(spec)!: 删除./system的 declared-only tenant-provisioning 家族 —— C16 双源清账,基线 12 → 10 (#4739) #4752(specsystem/+contracts/区,B 线前序单)。已执行git rebase origin/main(新基56470061d)→ 重做两处蓄意手删(manifest 8 键、authorable-surface 39 键;os-regen 钩子将生成物回退待重生,按设计)→ 全部生成器重跑(spec build / gen:schema / gen:api-surface / gen:docs)→ 重验:check:generated8/8 ✅、check:dual-source-exports6 ✅(10 → 6)、spec test 292 files / 7354 tests ✅、spec typecheck ✅、check:strictness-ledger✅。authorable-surface 的 tombstone 门禁可被手编基线绕过 —— 删掉基线行就删掉了证据(#4638 / #4643 已两次这样过绿) #4650 门禁在新锚56470061d577下判定与旧锚完全一致。验证汇总(全部实跑)
gen:schema:✅(含 authorable-surface 的 tombstone 门禁可被手编基线绕过 —— 删掉基线行就删掉了证据(#4638 / #4643 已两次这样过绿) #4650 判定 + RENAMED_DEFS 不变式 + manifest −9/+1)check:generated:✅ 8/8(api-surface/authorable-surface/docs/spec-changes/upgrade-guide/skill-docs/skill-refs/react-blocks)check:dual-source-exports:✅ 基线 6(rebase 后 10 → 6;rebase 前 12 → 8 亦实跑过)check:strictness-ledger✅ /check:exported-any✅(1885 types + 1629 schemas,零 any)/check:liveness✅ /check:empty-state✅ /check:variant-docs✅ /check:skill-examples✅(202 prose examples)/check:react-declaration-parity✅pnpm test:✅(rebase 后 292 files / 7354 tests;rebase 前 294 / 7378 —— 差值为 C16 在 main 上移除的自身测试);specpnpm typecheck:✅@objectstack/dogfoodexpression-conformance:✅ 3/3;全仓pnpm typecheck:✅ 122/122 tasks(rebase 前全量;rebase 增量为 spec 区,已单独重验)automation/sync.mdx、automation/offline.mdx、automation/connector.mdx、integration/offline.mdx四页消失顺带发现(已立单,未认领)
content/docs/references/index.mdx根索引表被生成器「保留不重生」,已烂尾(列着 #4499 已删的 trigger-registry.zod.ts、幽灵 schema 名),#4738 后再 +1 行 #4759:content/docs/references/index.mdx根索引表被生成器「保留不重生」,烂尾无 gate(列着 trigger-registry.zod.ts 的 ConnectorSchema 簇是同一业务需求的第三份声明——零运行时消费者(ADR-0049,Prime Directive #12,#4480 收尾发现) #4499 已删文件与幽灵 schema 名)。🤖 Generated with Claude Code
https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9