Skip to content

check-engine-double-contract 的 engine/driver 二分法没有 scoped-repository 这一支:IScopedObjectRepository 的类型符合性见证一律被判成 engine double #6327

Description

@qq9340100

#5945 / PR #6311 实施时的范围外发现,按第十条军规立案,unassigned。观察类:今天没有用户会撞到,两处已由 baseline EXEMPT 兜住;记录的是这道门的判据从此少了一支。

事实

scripts/check-engine-double-contract.mjs 的归属判据是二分的:一个测试里的对象字面量,要么是 engine double,要么是 driver double。

  • 发现:字面量含 slice.verb + 至少 2 个其它 ENGINE_SIBLINGS(find / findOne / insert / update / delete / count / aggregate / getSchema / registry / insertMany);
  • 归属:参数形状答不了时看 DRIVER_ONLY_MEMBERSENGINE_ONLY_MEMBERS(insert / insertMany / aggregate / getSchema / registry)。

#5945 引入了 IScopedObjectRepository(packages/spec/src/contracts/scoped-context.ts)—— 第三种数据访问对象:它绑定在单个对象上,所以对象名根本不是参数。三者的写动词并排:

IDataEngine.update(objectName, data, options?)     // 对象名在第一位
IDataDriver .update(objectName, id, data, ...)     // 主键在第二位
IScopedObjectRepository.update(data, options?)     // 没有对象名

而它的成员集是 find / findOne / count / insert / update / updateById —— 四个 ENGINE_SIBLINGS,其中 insert 还在 ENGINE_ONLY_MEMBERS 里。于是任何一个该接口的类型符合性见证都会被发现并归到 engine 侧。这对扫描能看见的信息而言是准确的,对那个对象究竟是什么而言是错的。

后果(小,但会累积)

PR #6311 的两个见证(packages/spec/src/contracts/scoped-context.test.tspackages/spec/src/data/hook.test.ts)因此被判 PINNED-fail,只能手写 baseline 条目。而 spec 原则上无法路由 assertEngineUpdateDispatch:它在 @objectstack/objectql / @objectstack/metadata-core,两者都依赖 @objectstack/spec,import 会反转依赖 —— 与 data-engine.test.ts 已有的两条 EXEMPT 同一个理由。两条新条目已按 #5629 的方法实测过 dormancy(stderr 探针静默,同一次运行的对照标记打印),所以今天是干净的。

问题在于这不是一次性的:此后每一个 IScopedObjectRepository 的实现或见证——包括语料库将来按 #5943 类型化后可能出现的测试替身——都会撞同一堵墙,每次都要手写一条 EXEMPT。一个把正确代码判红、且只能靠 ledger 消化的门,ledger 会越长越像噪音,而 ledger 的可读性正是这道门的价值所在(它的 $comment 明确说 shrink-only、手工评审)。

可能的方向(不预设结论)

  1. 加一支 scoped-repository 归属:写动词的第一个参数不是对象名/主键、且字面量含 object-less 的 repo 特征(如 updateById)时判为 scoped repository,直接出扫描范围(像 driver double 那样),不进 ledger。
  2. 按声明类型归属:字面量带 : IScopedObjectRepository 标注时出范围 —— 更窄更保守,但只覆盖有显式标注的写法。
  3. 维持现状,把 baseline 当作正常出口,并在脚本头把这第三种写进"deliberately not covered"。

关联

未加 pm:queue,交 PM 分诊定级。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions