Skip to content

[engine-double-contract] 四条 metadata-protocol 基线条目的 closes 指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987

Description

@xuyushun441-sys

发现于 #4867(PR #4980)在 scripts/engine-double-contract.baseline.json 里新增条目时。仅记录,未在该 PR 中修改 —— 改别人的基线条目正文不属于那个 PR 的文件面,按 Prime Directive #10 单开,未指派。

现象

scripts/engine-double-contract.baseline.json(#4550 / PR #4948)里四条 metadata-protocol 条目写着同一句 why / closes:

"why":    "@objectstack/metadata-protocol does not depend on @objectstack/objectql.
           Pinning needs a devDependency + lockfile change, which is a separate reviewable act."
"closes": "add @objectstack/objectql to devDependencies, then open the fake's delete with
           assertEngineDeleteDispatch(opts)"

涉及:

  • packages/metadata-protocol/src/protocol-publish-drafts-org-scope.test.ts
  • packages/metadata-protocol/src/protocol.runtime-authoring-gate.test.ts
  • packages/metadata-protocol/src/protocol.save-flow-canonicalization.test.ts
  • packages/metadata-protocol/src/sys-metadata-repository.recorded-by.test.ts

closes 描述的动作做不到:@objectstack/objectqldependencies 里已经有 @objectstack/metadata-protocol,反向加 devDependency 就是一个环。实测(加上边、跑 turbo、再回退):

$ pnpm turbo run test --filter=@objectstack/metadata-protocol --dry
 WARNING  Circular package dependency detected: @objectstack/objectql, @objectstack/metadata-protocol
  x Cyclic dependency detected:
  |     @objectstack/metadata-protocol#build, @objectstack/objectql#build

turbo 2.10.7 直接拒绝任务图 —— 不是警告,是 turbo run 失败。所以这四条不是「一次单独的 review 就能关掉」的债,而是这条路径根本关不掉

为什么值得单开

这正是本仓库反复付费的 declared ≠ actual 形状,只不过长在账本上而不是代码上:一条 shrink-only 账本的 closes 就是给下一个作者的处方。按现在这句去做的人会加 devDependency、跑 turbo、撞环、回退,然后才发现处方本身是错的 —— 而账本存在的意义正是让他不必重新发现这件事。

同一个文件里已经有一条把这个方向写对的条目(packages/spec/src/contracts/data-engine.test.ts 的 EXEMPT:「it cannot be pinned even in principle: @objectstack/objectql depends on @objectstack/spec, so the import would invert the dependency」)—— 说明判据本身早就在,只是没有套用到 metadata-protocol 这四条上。

建议

  1. 把这四条的 why 改成实测的环(而不是「a separate reviewable act」),closes 改成唯一存在的路线:assertEngineDeleteDispatch 下沉到两边都已依赖的包 —— @objectstack/metadata-core 是现成的共同依赖(objectql 与 metadata-protocol 都依赖它);@objectstack/spec/contracts 是另一个候选,但注意 spec 的那条 EXEMPT 说明 objectql→spec 方向同样不能反向 import,所以下沉到 spec 只有在「谓词本身属于契约层」成立时才对。
  2. 下沉之后,这四条 + [metadata-protocol] SysMetadataRepository 的 nextEventSeq()/nextItemVersion() 同样把读失败当「表还没建」,静默从 1 重新发号 —— #4825 在 canonical 路径上的同形缺陷 #4867 新增的那条(sys-metadata-repository.history-counters.test.ts)可以一起关掉,plugin-approvals 等「本来就依赖 objectql」的条目不受影响。

PR #4980 已按现状新增了一条,其 closes 写的是下沉路线并注明四条同族条目同理 —— 但没有改动它们的正文。

参考

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions