观察类发现,在修 #5265(保存回执一律自称 "customization overlay")时于同一文件的 delete 侧看到。**纯文案**,不影响持久化或枚举行为,所以单独记录、不搭车。 ## 事实 `packages/metadata-protocol/src/protocol.ts`(内容定位,行号会漂)的 `deleteMetaItem` 有四句回执,全部无条件把这次删除叙述成"移除一层 overlay、回到 artifact 默认值": ``` 10213: `No customization overlay found for ${request.type}/${request.name} — already at artifact default.` 10286: `Customization overlay deleted — ${request.type}/${request.name} reset to artifact default. [seq=${result.seq}]` 10343: `No customization overlay found for ${request.type}/${request.name} — already at artifact default.` 10363: `Customization overlay deleted — ${request.type}/${request.name} reset to artifact default.` ``` 但对一个 **runtime-only**(无 artifact 背书)的项 —— 例如一次全新创建的 `object` / `flow` / `hook` —— 删除后并不存在什么 "artifact default" 可以回退:那一行就是这个项的全部,删掉之后它**不复存在**。回执却告诉调用方"已重置为 artifact 默认值",这与 #5265 在 save 侧修掉的是同一类问题(回执可以说真话但没说),只是换到了 reset 路径。 ## 事实是现成的,不需要新查询 同一个方法里已经算过这条事实 —— delete 的 repo 路径就用它决定 `intent`: ```ts intent: this.isArtifactBacked(singularTypeForRepo, request.name) ? 'override-artifact' : ... ``` 所以分句的成本和 #5265 一样:改 message 模板 + 对应断言,零新增读路径。 ## 与 #5079 的关系(不是它的子问题) #5079(deleted overlay 仍在 /meta listing)碰的是同一条 DELETE 的用户可见面,但它的完成判据是"list / get / dispatch 三者立即一致",与这句措辞无关 —— 修完 #5079 这四句仍然会对 runtime-only 项说假话,修完这个也不会让 #5079 少做一件事。故按独立 issue 记录,不作为 #5079 的 sub-issue。两者若被同一个人接走,可以一并处理。 ## 未做判断 严重性留给 triage:今天没有用户因此丢数据(删除本身是对的,#5079 那条 listing 不一致才是行为问题),但 "reset to artifact default" 是一句会被 Studio toast 原样展示的话,一个刚删掉自己新建对象的管理员会据此以为还有个默认值在。 参考:#5265(save 侧同族,已修)/ PR #5926 / #5079。
Activity
claude commentedon Aug 6, 2026
发现分诊轮(#4949 纪律):晋级
pm:queue,摘finding。域维持domain:engine-core(落packages/metadata-protocol,按域表归 engine-core 家族)。9e3709a)—— 四句回执逐字实读全部命中,行号未漂:packages/metadata-protocol/src/protocol.ts:10213/:10286/:10343/:10363(前两句在 repo 路径、后两句在另一支;两句already at artifact default.+ 两句reset to artifact default.)。isArtifactBacked分句)已 MERGED,main 上:7973–:7974已是分句后的形状。⇒ 同一个文件里现在save 侧说真话、delete 侧仍一律自称回退到 artifact default,不对称是现状而非预测,且修法的参照实现就在同文件。isArtifactBacked(...)已被算出来决定intent,分句零新增读路径;② 这句话有用户可见出口 —— 会被 Studio toast 原样展示,一个刚删掉自己新建对象(runtime-only,无 artifact 背书)的管理员据此以为「还有个默认值在」,而真相是该项已不复存在;③ 成本封顶:message 模板 + 对应断言,与 PR fix(metadata-protocol): 保存回执按 isArtifactBacked 分句,不再一律自称 customization overlay (#5265) #5926 同形。protocol.ts,入队即可派。本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
baozhoutao commentedon Aug 7, 2026
认领(执行席 PM,engine-core 车道,第 12 轮)
session_019Q7oc7ASjh8yxyS3Yz78Weclaude/issue-5927-delete-receipt-truth../objectstack-issue-5927packages/metadata-protocol/src/protocol.ts仅 deleteMetaItem 四句回执模板(保存成功的回执一律自称 "customization overlay",包括注册表声明 supportsOverlay:false 的类型(object / flow / action / seed / hook) #5265/PR fix(metadata-protocol): 保存回执按 isArtifactBacked 分句,不再一律自称 customization overlay (#5265) #5926 save 侧同族先例照抄)+ 测试 + changeset;⛔ 不触 loadMetaFromDb(loadMetaFromDb object branch readsrecord.packageIdfrom a snake_case row — always undefined, every object overlay registers under the 'sys_metadata' sentinel at boot #4636 刚落)、saveMetaItem 门区(api注册表条目声明 allowRuntimeCreate: true,但运行时创建的端点匹配器永远看不见 —— 声明的能力运行时不兑现(真实 boot 实测) #5488-PR2 待发)Generated by Claude Code
baozhoutao commentedon Aug 7, 2026
ACCEPT(执行席 PM 验收,第 12 轮)
PR #6336 验收通过,已翻 ready + auto-merge(CI 21 项全绿)。记档:① 四句回执按
isArtifactBacked分句说真话,#5926 先例口径;实现形态是方法级 hoist 而非直接复用(两处既有计算分别块作用域受限/inline 于实参,均不可达回执点)—— 净 registry 调用数减一,issue 的零新增读路径判断成立;② 反向验证 6 红/9 绿逐条命中,绿半边(artifact-backed 逐字节不变 + 草稿两句 + envelope pin)是「分句而非一刀切」的判据本体;③ toast 前提据实证伪:objectui 全部路径丢弃该 message,唯一活体读者是 REST 信封直连客户端;④ 给 #5079 接手人的交底:其 repro transcript 里逐字记录的 DELETE 回执(rg_clean 为 runtime-only)合入后将读作Deleted action 'rg_clean' — it no longer exists.—— 不改其任何判据,派发 #5079 时须一并告知(本条即记录点)。Generated by Claude Code