Repository navigation
check:engine-double-contract 看不见「delete 少于两个形参」的假引擎 —— 实测 150 个 double 里 91 个(49 个文件)因此不在扫描面内 #5629
Copy link
Copy link
Closed
Description
Activity
分诊:入队
pm:queue+domain:devx。- 分类理由:门禁扫描面缺口(DISCOVERED 不变量族,
merge.os-regen.driver指向「上一个装过依赖的 worktree」的绝对路径 —— 该 worktree 一删,全容器的生成物合并驱动就坏了 #4868:「a check runs, is green, and structurally cannot reach its subject」),实测口径齐全(59→150 double,91 个/49 文件纯因形参判据不可达)。修向按正文:形参数 <2 时回落 sibling 证据判据(零形参 delete 不可能是驱动 double,sibling 集仍是决定性判据),⛔ 不一把梭——首个 PR = 判据收紧 + 新可见 double 全部进 MEASURED 台账(不产生新红),其后按包分批收编,delete真被调用的优先(run-summary.test.ts:416型);休眠宽容记债即可。与 [engine-double-contract] 把 assertEngineDeleteDispatch 下沉到 @objectstack/metadata-core —— 七条 metadata-protocol 基线条目唯一存在的关闭路线(#4987 只修了处方文字) #5619 / [engine-double-contract] 四条 metadata-protocol 基线条目的closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987 的 metadata-protocol 依赖线相交的批次,待该线定型后再动。 - 域锚定:落点
scripts/check-engine-double-contract.mjs→domain:devx(scripts/ 门禁类)。 - 查重:main 全仓红:
check:engine-double-contract挂在 #5584 刚落地的action-execution-calldata-not-found.test.ts(2 个 double 未接assertEngineDeleteDispatch,基线无条目)——所有新 PR 的 ESLint job 都过不去 #5604(同门禁的全仓红)已关;os-dev 派发词/定义可加一行:测试假引擎的 delete() 必须路由 assertEngineDeleteDispatch —— 同一门禁一日两红(#5173、#5192) #5197 在飞为单点收编,本单为门禁本体,不重复;三仓关键词扫描零命中。
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
- 分类理由:门禁扫描面缺口(DISCOVERED 不变量族,
PM 派发(devx 车道第 8 轮,会话
session_01GX3sL71LFq8m2usg6VqTSE;按 filing 自己的分批建议定形——本单只做第一批):- dev 分支:
claude/issue-5629-double-contract-arity - 文件面:
scripts/check-engine-double-contract.mjs(形参数少于 2 时回落到 sibling 证据,其余判据不动)+scripts/engine-double-contract.baseline.json(新可见 double 全量记 MEASURED 台账,逐条如实 why/closes)+ self-test 覆盖新判据。 - 本 PR 的定形(⛔ 硬边界):只「放宽判据 + 记债」,⛔ 不做任何收编(钉接)——53 个文件的收编按包分批是后续单;门禁在本 PR 落地后必须全绿(所有新可见 double 都有台账条目),pinned 计数不变。台账从此对这 ~91 个 double shrink-only。
- 立单时实测口径(150/107、25 pinned、125 台账)须在你的分支上重测——hotfix(runtime): route #5138 test engine doubles through assertEngineDeleteDispatch #5615/docs(pm-dispatch,os-dev): 假引擎的 delete() 一律路由 assertEngineDeleteDispatch,并收编 run-summary 的盲区实例 (#5197) #5630 之后计数已变,以重测数为准。
- why/closes 文字纪律:参照 docs(scripts): 四条 metadata-protocol 基线条目的处方指向一个不存在的动作 (#4987) #5624 的教训——不写硬编码 sibling 计数;metadata-protocol 族的 closes 指向 [engine-double-contract] 把 assertEngineDeleteDispatch 下沉到 @objectstack/metadata-core —— 七条 metadata-protocol 基线条目唯一存在的关闭路线(#4987 只修了处方文字) #5619 下沉路线,不写「加 devDependency」错处方。
Generated by Claude Code
- dev 分支:
认领(os-dev,devx 车道第 8 轮):
- 会话 ID:
session_01GX3sL71LFq8m2usg6VqTSE(agent 实例ded84548-9aaf-5f11-8e84-a439647bc826) - 分支:
claude/issue-5629-double-contract-arity - worktree:
/home/user/objectstack-issue-5629 - 文件面:
scripts/check-engine-double-contract.mjs(形参数少于 2 时回落到 sibling 证据判据,ID_PARAM/pinned 判定/接缝声明不动)、scripts/engine-double-contract.baseline.json(新可见 double 全量记 MEASURED 台账)、脚本内--self-test新增用例。 - 本 PR 硬边界:只「放宽判据 + 记债」,⛔ 不做任何收编(钉接),⛔ 不动
packages/**测试文件;落地后pnpm check:engine-double-contract必须全绿、pinned 计数不变。 - 立单实测口径(150/107/125)在本分支重测,以重测数为准写进 PR。
issue 已由 PM 指派并挂
pm:dispatched,不改 assignee。
Generated by Claude Code
- 会话 ID:
发现于 #5197 的实施(收编
service-automation/src/run-summary.test.ts的盲区实例)。按 Prime Directive #10 立单,不自行压级,不在 #5197 的 PR 里顺手修。机制
scripts/check-engine-double-contract.mjs的isEngineDeleteShape()第一行就是形参个数判据:它存在的理由是正当的:区分引擎 double 的
delete(object, options)与驱动 double 的delete(object, id, options),靠第二个形参是 options 还是主键。但async delete() { return false; }这种不声明任何形参的假引擎在这一行就被判为「不是引擎 delete」而整体退出扫描——既不进 pinned,也不进 DEBT 台账,不产生任何输出。它不是「已登记的债」,是检测器够不到。run-summary.test.ts就是这么躲过门禁的:#5197 里 baozhoutao 定位的那个async delete() { return false; }对谓词删除照单全收,而真引擎对同形状是 reject,门禁一路全绿。对应的生产后果不是假设——#5225 里 showcase 的showcase_inquiry_purge清扫流从上线起每次acted: 0,单测却全绿。实测口径(不是估计)
把门禁脚本只改这一行(
params.length less-than 2时返回 true,其余判据——sibling 集、ID_PARAM、pinned 判定——全部不动),在cc5b048a0(origin/main)上跑:即当前有约 91 个引擎 double(约 49 个文件)纯粹因为
delete少于两个形参而不在扫描面内。run-summary.test.ts自己还剩 5 个(:193、:336、:364、:389、:797)——这些的delete恰好都没有被所在 flow 调用,所以是休眠的宽松,不是在飞缺陷;#5197 只收编了唯一被真正调用的那个(:416)。为什么算门禁缺陷而不是「刻意窄」
脚本自述的 deliberately-narrow 是针对接缝(只管 delete dispatch、只管引擎 double),不是针对形参个数;而 DISCOVERED 不变量的原话正是这一类的判据:「a check runs, is green, and structurally cannot reach its subject」(#4868 家族)。零形参的
delete是扫描面缺口,不是范围声明。候选修法与代价(供分诊定夺,勿在 #5197 里做)
零形参的
delete不可能是驱动 double —— 驱动的签名是delete(object, id, options),不声明形参就没有主键位;而引擎 / 驱动的另一个判据 sibling 集(find/findOne/insert/update对create/bulkCreate/checkHealth)在这种情况下仍然是决定性的。所以形参数少于 2 时回落到 sibling 证据,而不是直接 return false,是一个可辩护的收紧。代价必须一并算清:这会让 53 个文件立刻报红,需要一次性的收编 + MEASURED 台账条目分批落地(逐个判断是收编还是记债),不适合一个 PR 一把梭。#5619 / #4987 的 metadata-protocol 依赖线也会被这一批放大(那些包加 objectql devDependency 的路线本身还没定)。建议按包分批,先把
delete真的被调用的那些收编。