Repository navigation
[engine-double-contract] 把 assertEngineDeleteDispatch 下沉到 @objectstack/metadata-core —— 七条 metadata-protocol 基线条目唯一存在的关闭路线(#4987 只修了处方文字) #5619
Description
Activity
分诊:入队
pm:queue+domain:engine-core+pm:blocked。- 落点锚定:搬移
packages/objectql/src/engine-delete-dispatch.ts→@objectstack/metadata-core(objectql 保留 re-export)+ 7 个packages/metadata-protocol测试接线 + 基线删 7 条 —— objectql / metadata* 家族 →domain:engine-core。默认落点 metadata-core 已静态核实不成环,spec/contracts仅在维护者主动拍板时改道,不阻塞派发。 - Blocked-by: [engine-double-contract] 四条 metadata-protocol 基线条目的
closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987(在飞,domain:devx,其 PR 改同一份scripts/engine-double-contract.baseline.json的 7 条why/closes文字;先落它,本单再整批删条目,避免同文件冲突。[engine-double-contract] 四条 metadata-protocol 基线条目的closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987 关闭后解锁回队)。 - 同文件在飞提示:main 全仓红:
check:engine-double-contract挂在 #5584 刚落地的action-execution-calldata-not-found.test.ts(2 个 double 未接assertEngineDeleteDispatch,基线无条目)——所有新 PR 的 ESLint job 都过不去 #5604(在飞,main 红止血)也在动同一基线(calldata 测试 2 条 double)。接续本单时按 SKILL 实测坑位第 8 条,先git log --oneline origin/main -- scripts/engine-double-contract.baseline.json复核在飞期间的变化再动手。 - 查重:objectql 的 UPDATE dispatch 没有共享判定函数 —— delete 有
resolveEngineDeleteDispatch,update 的同款三分支只是 engine.ts 里的一个内联 throw #5480(update 侧缺共享判定函数)相邻不同题;os-dev 派发词/定义可加一行:测试假引擎的 delete() 必须路由 assertEngineDeleteDispatch —— 同一门禁一日两红(#5173、#5192) #5197(os-dev 派发词提示)不重复;三仓无 shadow。
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
- 落点锚定:搬移
解锁 sweep(engine-core 车道 PM,会话
session_019Q7oc7ASjh8yxyS3Yz78We):Blocked-by: #4987已于 2026-08-05 21:12Z 关闭(completed),摘pm:blocked回队,列为本车道下轮队首候选。接续预记(SKILL 实测坑位第 8 条):派发前先
git log --oneline origin/main -- scripts/engine-double-contract.baseline.json复核在飞期间变化 —— 今日 #5754(#5480)已动过该基线(update 切片条目),7 条 metadata-protocol 条目的现状措辞与计数一律以 origin/main 为准,issue 正文的 24 pinned / 34 baseline 计数可能已漂移。另:搬移涉及packages/objectql的 re-export 面,与本轮在飞 #5284(同包 engine.ts)跨轮串行。
Generated by Claude Code
认领:PM 循环第 2 轮(engine-core 车道)
会话:session_019Q7oc7ASjh8yxyS3Yz78We
分支:claude/issue-5619-sink-engine-dispatch
Worktree:objectstack-issue-5619
域:domain:engine-core
文件面:packages/objectql/src/engine-delete-dispatch.ts与engine-update-dispatch.ts(改为 re-export shim)、packages/metadata-core/src/**(新落点 + index 导出)、13 个packages/metadata-protocol/src/*.test.ts假引擎接线、scripts/engine-double-contract.baseline.json(删条目)、.changeset/*.md。⛔ engine.ts 零改动(#5850 在合并队列中,避让)。作用域预裁(带前提):立单时基线世界是 7 条 delete 条目;origin/main 现状为 26 条 / 13 文件(delete 13 + update 13),且 #5754 已产出孪生自包含模块
engine-update-dispatch.ts。预裁双模块一并下沉 metadata-core、一次关闭全部 26 条;前提 = update 模块同样零 import 自包含,不成立则回退原 issue 范围(仅 delete)+ update 侧立单,⛔ 不许静默走第三条路。
Generated by Claude Code
中断记录(engine-core 车道 PM,会话
session_019Q7oc7ASjh8yxyS3Yz78We):本单 dev 于 ~08:5xZ 被会话用量上限终止(API 错误,10:00 UTC 重置),死于验证矩阵阶段(objectql 构建/测试中)。- 实施状态:worktree
objectstack-issue-5619内有未推送的完整实施(双模块下沉 + 13 文件接线,按其最后回报推断);远程无分支、无 PR —— 认领仍有效,本条即接手依据。 - 复活计划:10:02 UTC 经 SendMessage 从 transcript 复活原 agent(比 worktree 接手协议便宜,上下文完整);复活令将附加:先
git merge origin/main(⚠️ PR feat(spec,runtime,metadata-protocol,client)!: 统一能力词表 —— 封闭声明,两个 discovery 生产者全量发 (#5672) #5857(SDK 的 client.capabilities 声明为 WellKnownCapabilities,但两个 discovery 生产者填的是互不相交的键集 #5672)已合入,breaking 触及 metadata-protocol 能力词表,13 个测试文件的接线面可能受影响;另 chore(scripts,ci): 决策框架四份副本的结构同构门禁(轴数/轴序/绑定句)(#5798) #5865 动了 scripts/ 门禁),合后完整重跑全部验证矩阵 —— 中断前的任何绿都不作数。 - 若复活失败,走 worktree 接手协议(新 agent,⛔ 不新建 worktree,逐 commit/逐 hunk 审阅既有改动)。
认领、assignee、分支名均不变 —— 本条是既有认领的延续,不是新认领。
Generated by Claude Code
- 实施状态:worktree
复核通过,ACCEPT(engine-core 车道 PM,第 2 轮):交付于 PR #5871,CI 23 项全绿,转 ready 入合并队列。
验收要点:
- 预裁前提两条均实测坐实(双模块零 import 自包含;turbo --dry 三次 circular 命中 0)→ 扩展作用域成立,26 条基线条目一次关闭(38→64 pinned,165→139 ledger,改前读数在 origin/main detached worktree 现测、未抄 issue 旧计数);
- 搬移纪律干净:判定逻辑零改动、engine.ts/index.ts 零改动(与 perf(objectql): update() 单 id 前置行门按对象判定需求(#5284),并校准 #4743 事实一的三处注释 #5850 避让成功)、公共 API 实测同一函数对象;13 个假引擎双动词接线且 一条 fixture 未改、461 用例全绿(替身实际驱动形状全部合规);
- 反向验证 delete/update 各一次,方向先预测后运行,均如预测;附赠 dormancy 实测(26 条中 9 活 17 眠,真引擎会拒的形状零出现);
- 悬挂引用治理:6 条「tracked as [engine-double-contract] 把 assertEngineDeleteDispatch 下沉到 @objectstack/metadata-core —— 七条 metadata-protocol 基线条目唯一存在的关闭路线(#4987 只修了处方文字) #5619」的 closes 改写指向新单 [engine-double-contract] #5619 的下沉解锁了另外 6 条被同一个环卡住的条目(core / metadata / platform-objects)—— 现在各是一行 pin #5855(已被分诊补上 Blocked-by 机器半边,本 PR 合入即解锁)—— [engine-double-contract] 四条 metadata-protocol 基线条目的
closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987 形状的复制被主动打断; ⚠️ 附带触碰scripts/check-engine-double-contract.mjs(+56:modules 双拼写 + PINNED 提示修正)—— 属 spec-tooling 座位文件面(scripts/**),系搬移的必然配套且未放松任何判据(spec EXEMPT 原样),特此向该座位报备,如有异议可否决。- 必答项定价:engine-delete-dispatch 的共享判定与 ObjectQL.delete 在「假值标量 id」上不一致 ——
where: { id: 0 }判定答 by-id,引擎却 reject #5747/ObjectQL.update 的data.id不做标量测试 —— 载荷里的算子对象被当成主键绑定,且盖过显式options.multi: true#5748 落点搬家至 metadata-core(判定缺陷原样存活,两半一致的 pin 测试仍在 objectql);meta overlays: a deleted overlay stays in the /meta listing though dispatch correctly 404s (#4432 residual) #5079 边际变简单;loadMetaFromDb object branch readsrecord.packageIdfrom a snake_case row — always undefined, every object overlay registers under the 'sys_metadata' sentinel at boot #4636 执行者注意 —— 本 PR 后 metadata-protocol 新建假引擎必须从@objectstack/metadata-core接双谓词。
本单合入后:#5855 解锁,列下轮候选。
Generated by Claude Code
- added a commit that references this issue
on Aug 13, 2026 - added 3 commits that reference this issue
on Aug 17, 2026 - added a commit that references this issue
on Aug 25, 2026 - added a commit that references this issue
on Sep 1, 2026 - added a commit that references this issue
on Sep 9, 2026
发现于 #4987(台账处方文字修正)执行过程中。#4987 的文件面被显式限定为
scripts/engine-double-contract.baseline.json的why/closes文字,下沉本身没有落点,故按 Prime Directive #10 单开、未指派。现象
scripts/engine-double-contract.baseline.json里现有 7 条packages/metadata-protocol/**条目,全部因为同一个结构原因无法 pin:protocol-publish-drafts-endpoint-gate.test.ts(api不在 metadata 类型注册表里 —— Studio 直写路径完全不校验端点,publishPackageDrafts 也没有 E7 门 #5206)protocol-publish-drafts-org-scope.test.ts([engine-double-contract] 四条 metadata-protocol 基线条目的closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987 修文字)protocol.runtime-authoring-gate.test.ts([engine-double-contract] 四条 metadata-protocol 基线条目的closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987 修文字)protocol.save-flow-canonicalization.test.ts([engine-double-contract] 四条 metadata-protocol 基线条目的closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987 修文字)sys-metadata-repository.draft-drain.test.ts([metadata-protocol] SysMetadataRepository.publishDraft() 把 draft 清理的全部失败都当「并发发布者已抽走」,静默留下一条永远 pending 的 draft 行 #4981)sys-metadata-repository.history-counters.test.ts([metadata-protocol] SysMetadataRepository 的 nextEventSeq()/nextItemVersion() 同样把读失败当「表还没建」,静默从 1 重新发号 —— #4825 在 canonical 路径上的同形缺陷 #4867)sys-metadata-repository.recorded-by.test.ts([engine-double-contract] 四条 metadata-protocol 基线条目的closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987 修文字)@objectstack/objectql的dependencies含@objectstack/metadata-protocol(workspace:*),所以反向加 devDependency 即成环,turbo 2.10.7 直接拒绝任务图(本轮 #4987 在 worktree 上实测复现,build与test两个 task graph 都被拒,exit 1,随后回退):#4987已把这 7 条的why/closes全部改成实测的环 + 下沉路线,但下沉代码本身未做 —— 而三条早先已改好的条目(#4867 / #4981 / #5206)的closes写的是「tracked as #4987」。#4987 一旦按其真实文件面(仅台账文字)关闭,这个引用就指向一个只改了措辞的已关闭 issue。本 issue 就是接住那个引用的落点。为什么下沉是可做的(已静态核实)
判据来自同文件
packages/spec/src/contracts/data-engine.test.ts那条 EXEMPT:反向 import 不可行时,唯一出路是下沉到两边都已依赖的包。packages/objectql/src/engine-delete-dispatch.ts(168 行)没有任何 import —— 纯自包含模块,导出ENGINE_DELETE_REJECT_MESSAGE/EngineDeleteDispatch/EngineDeleteDispatchInput/scalarDeleteId/resolveEngineDeleteDispatch/assertEngineDeleteDispatch/EngineDeleteDispatchCase/ENGINE_DELETE_DISPATCH_CASES。下沉是一次搬移,不是重构。@objectstack/metadata-core是现成共同依赖:objectql -> metadata-core(workspace:*)与metadata-protocol -> metadata-core(workspace:*)都已存在;metadata-core的dependencies只有{ @objectstack/spec, zod },不含 objectql,故不引入新环。@objectstack/spec/contracts是另一候选(spec的dependencies只有{ zod }),但仅当「该谓词属于契约层」成立时才对 —— 需要拍板,不要顺手选。完成范围
engine-delete-dispatch.ts搬到@objectstack/metadata-core(或拍板后的spec/contracts),@objectstack/objectql改为 re-export 以保持现有 24 个 pinned 调用点与公共 API 不变。delete()接上该谓词(从新落点 import),跑@objectstack/metadata-protocol套件 —— 注意其中若有 fixture 断言 predicate delete 成功,真引擎是拒绝的,按 flow 的delete_record/update_record无法表达批量意图 —— 节点 schema 无键、执行器不传options.multi,谓词批量写对所有 flow 平台级不可达,而节点描述符宣称支持 #5393 之后可用multi: true表达。pnpm check:engine-double-contract计数从 24 pinned / 34 baseline 变为 31 pinned / 27 baseline。api不在 metadata 类型注册表里 —— Studio 直写路径完全不校验端点,publishPackageDrafts 也没有 E7 门 #5206 三条的closes里「tracked as [engine-double-contract] 四条 metadata-protocol 基线条目的closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987」应改指本 issue;这三条还写着「the four/five sibling metadata-protocol entries」,而现在同族共 7 条(各有 6 个 sibling)—— 硬编码计数已漂移。[engine-double-contract] 四条 metadata-protocol 基线条目的closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987 修的四条已改用免计数措辞(「every other metadata-protocol entry in this ledger」)以避免再漂。若第 3 步整批删除,这两处随之消失。影响(如实说明,请分诊定级)
不是用户今天会撞到的缺陷,而是测试替身比真契约松的现存缺口:这正是 #4434 让一整段 REST 路由死掉而套件全绿的形状,gate(#4550)就是为消除它而建。7 个文件里的 fake delete 目前可以接受真引擎会拒绝的调用。域应为
domain:engine-core(搬移生产者模块 + 改 7 个测试)。参考
closes指向一个不可能的动作:加 @objectstack/objectql devDependency 会让 turbo 直接判环 #4987(本 issue 的来源:台账处方文字修正)、[metadata-protocol] SysMetadataRepository 的 nextEventSeq()/nextItemVersion() 同样把读失败当「表还没建」,静默从 1 重新发号 —— #4825 在 canonical 路径上的同形缺陷 #4867 / PR fix(metadata-protocol): never invent event_seq/version from a failed history read (#4867) #4980、[metadata-protocol] SysMetadataRepository.publishDraft() 把 draft 清理的全部失败都当「并发发布者已抽走」,静默留下一条永远 pending 的 draft 行 #4981、api不在 metadata 类型注册表里 —— Studio 直写路径完全不校验端点,publishPackageDrafts 也没有 E7 门 #5206resolveEngineDeleteDispatch,update 的同款三分支只是 engine.ts 里的一个内联 throw #5480(objectql 的 UPDATE dispatch 无共享判定函数 —— 相邻不同题:那条是 update 侧缺函数,本条是 delete 侧函数位置错)