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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions