fix(devx): check:engine-double-contract 看不见零/单形参的假引擎 delete —— 放宽判据 + 全量记债 - #5694
Merged
Merged
Conversation
`isEngineDeleteShape()` 的首行 `params.length < 2 → return false` 把「不声明 形参」的假引擎 delete 在任何其他判据之前就丢掉了。这些 double 既不进 PINNED 也不进台账,不产生任何输出 —— 正是本脚本 DISCOVERED 不变量针对的 #4868 形状 (检查在跑、是绿的、结构上够不到它的对象)。 形参数少于 2 时改为回落到 sibling 证据,而不是无条件放行:立单时设想的 「零形参不可能是驱动(驱动签名必有主键位)」经实测不成立 —— 假驱动同样会省掉 不用的形参,本分支上 92 个短形参 delete 里有 43 个是驱动 double(其中包括 spec/src/contracts/data-driver.test.ts 本身,以及 objectql 里自述 「driver WITH native aggregate()」的那个)。所以判据要求 object 同时满足: 声明了只有引擎才有的成员,且没有只有驱动才有的成员。两半都是承重的。 本 PR 只做「放宽判据 + 记债」,不做任何收编:49 个新可见 double(36 个文件) 全量进 MEASURED 台账,pinned 计数不变(27),门禁落地后全绿,台账对这批 double 从此 shrink-only。逐条 why 都实测过:注入 stderr 标记后 49 个 delete 全部未被所在测试调用(休眠宽松),同一次运行里 run-summary.test.ts 已 pinned 的那个 delete 标记正常打印,作为「静默是证据而非探针坏了」的对照。 Fixes #5629
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
Author
|
判据的一处刻意不声明,写在这里给后续分批的人: 形参数少于 2 的分支只看 sibling 证据,不看形参名。所以理论上 即:这不是「已验证不会误报」,是「当前无实例,故未加判据也未写断言」。真出现时它的后果是多一条台账条目(误报方向),不是漏报,所以不会让门禁变绿说谎。哪个分批第一次遇到 Generated by Claude Code |
os-zhuang
marked this pull request as ready for review
August 6, 2026 00:38
os-zhuang
enabled auto-merge
August 6, 2026 00:39
This was referenced Aug 6, 2026
Merged
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 #5629
scripts/check-engine-double-contract.mjs的isEngineDeleteShape()首行是形参个数判据(params.length少于 2 就return false)。它把不声明形参的假引擎delete()在任何其他判据之前就丢掉了:既不进 PINNED,也不进台账,不产生任何输出。这不是「已登记的债」,是检测器够不到 —— 正是本脚本 DISCOVERED 不变量自己针对的 #4868 形状(检查在跑、是绿的、结构上够不到它要检查的对象)。本 PR 是这条线的第一批:放宽判据 + 全量记债,不做任何收编。按包分批的收编是后续单。
重测口径(立单数已漂移,以下为本分支实测)
基线
414395b9a。立单时是cc5b048a0上的 59/58、25 pinned、34 台账。中间那一栏就是「门禁现在看得见了」的证据:34 个文件报
PINNED: … declares N engine double(s) whose delete() does not route through assertEngineDeleteDispatch,另外 2 个文件报计数上升(action-body-identity.test.ts1 到 2、data-engine.test.ts1 到 5)。判据为什么不是无条件放行
立单正文给的理由是「零形参不可能是驱动 —— 驱动签名
delete(object, id, options)必有主键位」。这一条经实测不成立:假驱动同样会省掉自己不用的形参。本分支上 92 个短形参delete里 43 个是驱动 double,包括packages/spec/src/contracts/data-driver.test.ts本身,以及packages/objectql/src/engine-aggregate-having.test.ts里注释自述/** A driver WITH native aggregate() */的那个。无条件return true会把门禁指向错误的契约 43 次。所以形参数少于 2 时回落到 sibling 证据,要求两个条件同时成立:
insert/insertMany/aggregate/getSchema/registry);connect/create/checkHealth/bulkCreate/ 事务与 schema 那一组)。两半都是承重的,self-test 各有用例钉住:只看正面证据会把上面那个 native-aggregate 驱动当引擎(驱动可以做聚合下推);只看反面证据会把任何
{ find, findOne, update, delete }的 store mock 报出来(它两个契约都不是)。名单按IDataDriver/IDataEngine的实际成员划:两边都有的find、findOne、update、count、execute(引擎也声明execute?)一个都不算证据。ID_PARAM、pinned 判定、接缝声明(只管 delete dispatch、只管引擎 double)一律未动;形参数 2 及以上的路径逐字未改,所以 pinned 计数不变。台账
49 个新可见 double、36 个文件全量进 MEASURED 台账:34 条新条目 + 2 条既有条目因重测而改计数。既有 32 条里 30 条逐字未动;改动的 2 条是计数被判据放宽推上去的(
1 -> 2、1 -> 5),各自在why里以RE-MEASURED (#5629)单独说明「不是回归,也不是抬棘轮:double 一直在,是扫描够不到」。每条
why的休眠判定都是实测的,不是推断的:把一句process.stderr.write标记注入每个 delete 的第一行,跑所在包的测试 —— 49 个 delete 全部没有打印(36 个文件的 suite 全绿)。对照组在同一次运行里:run-summary.test.ts里 #5197 已 pinned 的那个 delete 标记正常打印。所以「静默」是证据,而不是探针坏了。注入只用于探测,已全部还原(本 PR 不含packages/**任何改动)。closes按各包相对生产者的位置分四类,都在本分支实测过:./engine-delete-dispatch.js相对导入。turbo run build --filter=… --dry,turbo 2.10.7 接受图,无 circular 告警,随后还原。closes指向 [engine-double-contract] 把 assertEngineDeleteDispatch 下沉到 @objectstack/metadata-core —— 七条 metadata-protocol 基线条目唯一存在的关闭路线(#4987 只修了处方文字) #5619 下沉路线,不写「加 devDependency」 —— 那条路 [engine-double-contract] 四条 metadata-protocol 基线条目的closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987 已证伪。core 在本分支实测:加边后 turbo 2.10.7 直接拒图(WARNING Circular package dependency detected: … @objectstack/objectql, @objectstack/core/x Cyclic dependency detected:),随后还原。metadata / metadata-protocol 的条目明说自己靠的是哪次测量,不挪用别处的输出。按 #5624 的教训,台账文字里没有写任何硬编码 sibling 计数。
验证
pnpm check:engine-double-contract(self-test + 全量)绿;台账JSON.parse过,66 条条目字段齐全、按 file 排序。return false,恰好 2 条新用例转红(「零形参引擎 delete 在扫描面内」「单形参引擎 delete 在扫描面内」),3 条否决用例保持绿 —— 它们防的是「错误的修法」,本来就不该先红。pnpm lint+ 该 job 的全部check:*,门禁本体在内)。node scripts/check-nul-bytes.mjs绿(5600 个文件);改动文件另做 C0 自扫,零命中。delete体分别是{ deleted: 0 }/({ deleted: 1 })/{ deleted: 0 }/{ affected: 0 }/({})—— 对任何 dispatch 都返回成功形状,正是 sharing: DELETE /sharing/rules/:idOrName answers 500 for both address forms — rules cannot be deleted over REST #4434 的宽松类。非发布面(
scripts/门禁 + 台账),走skip-changeset标签路线。Generated by Claude Code