观察类发现,由 #5086 的正文点出、在修 #5086(PR #5263)时确认。**纯文案**,不影响持久化行为,所以单独记录而不搭车。 ## 事实 `packages/metadata-protocol/src/protocol.ts` 的 `saveMetaItem` 成功回执只有两种句式,都写死了 "customization overlay": ``` Saved customization overlay (org=<id>, state=active) — type=…, name=… [seq=N] Saved customization overlay (env-wide, state=active) — type=…, name=… [seq=N] ``` 而 `DEFAULT_METADATA_TYPE_REGISTRY` 里有一批类型明确声明 `supportsOverlay: false`,却按设计可以运行时写入:`object`、`field`、`hook`、`seed`、`mapping`、`flow`、`action`。对这些类型,一次全新创建(不是任何东西的 overlay)也会被回执成 "saved a customization overlay"。 真实 boot 实测(showcase,`pnpm dev -- --fresh`): ``` PUT /api/v1/meta/view/rc3_probe_view → 200 {"success":true,…,"message":"Saved customization overlay (env-wide, state=active) — type=view, name=rc3_probe_view [seq=1]"} ``` `view` 恰好是 `supportsOverlay: true`,回执没问题;把同一句话发给 `object` / `flow` 的新建就不成立了。 ## 为什么不是"顺手改一下" `supportsOverlay` 与 `allowOrgOverride` 在 spec 的 TSDoc 里是**两件事**:前者描述 loader 的合并*能力*,后者是运行时写入的*许可*,而且只有后者被明确指定为 403 `not_overridable` 的判据。所以这句回执要说清楚的是三件事之一 —— 覆盖了一个 artifact / 新建了一条 DB-only 记录 / 写了一条 per-org 行 —— 而这三者在写路径里是能分辨的(`isArtifactBacked` + `organizationId` 已经算过)。也就是说这是"回执可以说真话但没说"的问题,不是术语挑刺。 #5086 关心的那一半(`job` / `agent` 根本不该写成功)已由 PR #5263 修掉;剩下的就是这句措辞。 ## 建议(留给 triage) 按已算出的事实分句:artifact-backed ⇒ `Saved customization overlay`;无 artifact 的新建 ⇒ `Created <type> '<name>'`;org 维度照旧附在括号里。改动面是 2 处 message 模板 + 对应断言。 参考:#5086 / PR #5263。
Activity
os-zhuang commentedon Aug 5, 2026
发现分诊轮:晋级
pm:queue+domain:engine(摘finding)。理由:「回执可以说真话但没说」—— 三种事实(overlay / 新建 DB-only / per-org 行)在写路径里已被算出(isArtifactBacked+organizationId),按正文建议分句即可,改动面 2 处 message 模板 + 断言,无契约变更、无拍板点。packages/metadata-protocol/src/protocol.ts,派发须跨轮串行;若与 #5264 同一 dev 顺序消化更省(相邻代码)。本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
baozhoutao commentedon Aug 6, 2026
认领:PM 循环第 4 轮追加(engine-core 车道;同文件前序 #5264/#5532/#5841 均已合入,protocol.ts 当前无在飞)
会话:
session_019Q7oc7ASjh8yxyS3Yz78We分支:
claude/issue-5265-save-receipt-truthful-wordingWorktree:
objectstack-issue-5265域:
domain:engine-core文件面:
packages/metadata-protocol/src/protocol.ts(saveMetaItem 两处成功 message 模板)+ 既有断言翻面(全仓扫 "Saved customization overlay" 同语义 pin)+.changeset/*.md。⛔ 不碰 loadMetaFromDb(object 分支 #4636 决策箱在途)与 getMetaItemLayered 区域。前提复核:今晨 07:1xZ 实测两处模板仍无条件写 "Saved customization overlay"(当时位于 :7852-7853,protocol.ts 今日已 6 合并,行号必漂,内容定位)。
Generated by Claude Code
baozhoutao commentedon Aug 6, 2026
复核通过,ACCEPT(engine-core 车道 PM,第 4 轮):交付于 PR #5926,CI 23 项全绿,转 ready 入合并队列。
验收要点:
isArtifactBacked(=intent的同一来源),零新增读路径查询 —— 符合派发词的原则性约束;parentVersion === null的作用域是(state, packageId),已有 active 行的首个 draft 同样读作无父版本 —— 按它写 Created 是把一句假话换成另一句;取舍已记录在 PR 正文,采纳;record.packageIdfrom a snake_case row — always undefined, every object overlay registers under the 'sys_metadata' sentinel at boot #4636 —— 无依赖,分句依据isArtifactBacked,而 loadMetaFromDb object branch readsrecord.packageIdfrom a snake_case row — always undefined, every object overlay registers under the 'sys_metadata' sentinel at boot #4636 的三案实测已证 boot 水合对象在 A/B/E 任一走向下getArtifactItem均为 undefined,本单措辞不受其裁决影响;meta overlays: a deleted overlay stays in the /meta listing though dispatch correctly 404s (#4432 residual) #5079 —— 共用 DELETE 用户可见面但不在其完成判据内(deleteMetaItem 的四句回执一律说 "customization overlay … reset to artifact default",包括根本没有 artifact 可回退的 runtime-only 项 #5927 的立单说明已澄清)。Generated by Claude Code