Skip to content

[engine-double-contract] 把 assertEngineDeleteDispatch 下沉到 @objectstack/metadata-core —— 七条 metadata-protocol 基线条目唯一存在的关闭路线(#4987 只修了处方文字) #5619

Description

@os-zhuang

发现于 #4987(台账处方文字修正)执行过程中。#4987 的文件面被显式限定为 scripts/engine-double-contract.baseline.jsonwhy/closes 文字,下沉本身没有落点,故按 Prime Directive #10 单开、未指派。

现象

scripts/engine-double-contract.baseline.json 里现有 7 条 packages/metadata-protocol/** 条目,全部因为同一个结构原因无法 pin:

@objectstack/objectqldependencies@objectstack/metadata-protocol(workspace:*),所以反向加 devDependency 即成环,turbo 2.10.7 直接拒绝任务图(本轮 #4987 在 worktree 上实测复现,buildtest 两个 task graph 都被拒,exit 1,随后回退):

 WARNING  Circular package dependency detected: @objectstack/objectql, @objectstack/metadata-protocol
  x Cyclic dependency detected:
  | 	@objectstack/objectql#build, @objectstack/metadata-protocol#build

#4987 已把这 7 条的 why/closes 全部改成实测的环 + 下沉路线,但下沉代码本身未做 —— 而三条早先已改好的条目(#4867 / #4981 / #5206)的 closes 写的是「tracked as #4987」。#4987 一旦按其真实文件面(仅台账文字)关闭,这个引用就指向一个只改了措辞的已关闭 issue。本 issue 就是接住那个引用的落点。

为什么下沉是可做的(已静态核实)

判据来自同文件 packages/spec/src/contracts/data-engine.test.ts 那条 EXEMPT:反向 import 不可行时,唯一出路是下沉到两边都已依赖的包。

  • 生产者 packages/objectql/src/engine-delete-dispatch.ts(168 行)没有任何 import —— 纯自包含模块,导出 ENGINE_DELETE_REJECT_MESSAGE / EngineDeleteDispatch / EngineDeleteDispatchInput / scalarDeleteId / resolveEngineDeleteDispatch / assertEngineDeleteDispatch / EngineDeleteDispatchCase / ENGINE_DELETE_DISPATCH_CASES。下沉是一次搬移,不是重构。
  • @objectstack/metadata-core 是现成共同依赖:objectql -> metadata-core(workspace:*)与 metadata-protocol -> metadata-core(workspace:*)都已存在;metadata-coredependencies 只有 { @objectstack/spec, zod },不含 objectql,故不引入新环。
  • @objectstack/spec/contracts 是另一候选(specdependencies 只有 { zod }),但仅当「该谓词属于契约层」成立时才对 —— 需要拍板,不要顺手选。

完成范围

  1. engine-delete-dispatch.ts 搬到 @objectstack/metadata-core(或拍板后的 spec/contracts),@objectstack/objectql 改为 re-export 以保持现有 24 个 pinned 调用点与公共 API 不变。
  2. 7 个 metadata-protocol 测试文件的 fake delete() 接上该谓词(从新落点 import),跑 @objectstack/metadata-protocol 套件 —— 注意其中若有 fixture 断言 predicate delete 成功,真引擎是拒绝的,按 flow 的 delete_record / update_record 无法表达批量意图 —— 节点 schema 无键、执行器不传 options.multi,谓词批量写对所有 flow 平台级不可达,而节点描述符宣称支持 #5393 之后可用 multi: true 表达。
  3. 从基线里删掉这 7 条(gate 是 shrink-only 双向校验:文件已无 unguarded double 时条目必须整条消失),pnpm check:engine-double-contract 计数从 24 pinned / 34 baseline 变为 31 pinned / 27 baseline。
  4. 顺带(在本 issue 范围内,不必另开):[metadata-protocol] SysMetadataRepository 的 nextEventSeq()/nextItemVersion() 同样把读失败当「表还没建」,静默从 1 重新发号 —— #4825 在 canonical 路径上的同形缺陷 #4867 / [metadata-protocol] SysMetadataRepository.publishDraft() 把 draft 清理的全部失败都当「并发发布者已抽走」,静默留下一条永远 pending 的 draft 行 #4981 / api 不在 metadata 类型注册表里 —— Studio 直写路径完全不校验端点,publishPackageDrafts 也没有 E7 门 #5206 三条的 closes 里「tracked as [engine-double-contract] 四条 metadata-protocol 基线条目的 closes 指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987」应改指本 issue;这三条还写着「the four/five sibling metadata-protocol entries」,而现在同族共 7 条(各有 6 个 sibling)—— 硬编码计数已漂移。[engine-double-contract] 四条 metadata-protocol 基线条目的 closes 指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987 修的四条已改用免计数措辞(「every other metadata-protocol entry in this ledger」)以避免再漂。若第 3 步整批删除,这两处随之消失。

影响(如实说明,请分诊定级)

不是用户今天会撞到的缺陷,而是测试替身比真契约松的现存缺口:这正是 #4434 让一整段 REST 路由死掉而套件全绿的形状,gate(#4550)就是为消除它而建。7 个文件里的 fake delete 目前可以接受真引擎会拒绝的调用。域应为 domain:engine-core(搬移生产者模块 + 改 7 个测试)。

参考

Activity

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions