Skip to content

fix(metadata-protocol): 删除回执按 isArtifactBacked 分句,不再对 runtime-only 项谎称回退默认值 (#5927) - #6336

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-5927-delete-receipt-truth
Aug 7, 2026
Merged

fix(metadata-protocol): 删除回执按 isArtifactBacked 分句,不再对 runtime-only 项谎称回退默认值 (#5927)#6336
baozhoutao merged 2 commits into
mainfrom
claude/issue-5927-delete-receipt-truth

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #5927

deleteMetaItem 的四句成功回执 —— repository 路径两句 + legacy raw-engine 路径两句 —— 原本无条件把每一次删除叙述成"摘掉一层 overlay、回落到 artifact 默认值"。

但对一个 runtime-only 项(管理员在 Studio 里新建的 object / flow / hook,没有任何 code package 提供同名 artifact),底下根本没有默认值可回落:那一行就是这个项的全部,删掉之后它在任何层都不复存在。回执却把管理员指向一个从未存在过的基线。

这是 #5265 / PR #5926 在 save 侧修掉的同一类问题(回执可以说真话但没说),换到了 reset 路径 —— 参照实现就在同一个文件里。

判据:同方法内早已算出的现成事实

不是 supportsOverlay,也不是 allowOrgOverride,而是 isArtifactBacked —— 即 intent: 'override-artifact' | 'runtime-only' 的来源。本次新增的方法级绑定替换intent 原来那次 inline 调用,所以分句后 registry 读取次数不增反减:

const artifactBacked = this.isArtifactBacked(singularTypeForRepo, request.name);

之所以必须新起一个绑定而不能复用上方两层授权里的那个:后者块作用域限定在 environmentId !== undefined 内,legacy 路径够不着。两处拼写一致 —— canonicalizeMetaRequestType 已在方法开头把 request.type 折成单数(#4432),singularTypeForRepo 是一次 no-op 重折。

四句的去向

情形 FROM TO
覆盖了 artifact,删除即回落 Customization overlay deleted — type/name reset to artifact default. [seq=N] 逐字不变
runtime-only,删除即消失 同上 Deleted TYPE 'NAME' — it no longer exists. [seq=N]
覆盖了 artifact,本就没有 overlay 行 No customization overlay found for type/name — already at artifact default. 逐字不变
runtime-only,本就不存在 同上 No TYPE 'NAME' found — nothing to delete.

刻意未动的部分:草稿两句(Draft discarded — … / No pending draft for …)本来就没有声称过 overlay 或 reset,对两类项都为真,逐字保留。success / reset / seq 一字未动 —— message 没有任何消费方解析,仅作展示。legacy 路径不写 history、不发 watch 事件,两句因此本就不带 [seq=…],该差异为既有设计,分句未触碰。

反向验证(方向先于运行预测)

肢 A = 还原无条件模板。预测 6 红 / 9 绿,实测 6 红 / 9 绿。

红的正是六条 runtime-only 断言,每一条都按 issue 描述的形状失败:

× deleting a runtime-only object is not reported as a reset to a default
  → expected 'Customization overlay deleted — objec…' not to contain 'artifact default'
× a legacy-path miss on a runtime-only name does not claim an artifact default
  → expected 'No customization overlay found for jo…' to be 'No job 'rc9_nightly' found — nothin…'

绿的一半是分句的要点而非余量:四条 override-artifact 用例逐字节未变,两条草稿用例、registry 前提 pin、envelope pin 亦然。一个只是"到处不再说 overlay"的改法能过红的一半,会在绿的一半翻车。

测试与门

  • pnpm --filter @objectstack/metadata-protocol test —— 51 files / 523 tests 全绿(merge origin/main 之后复跑)
  • 包 build(DTS 即该包的 typecheck)—— 绿
  • check:engine-double-contract —— OK,79 pinned;新测试文件按 delete + update 双动词双双入 pinned(fake engine 的 delete()assertEngineDeleteDispatch,非手抄守卫)
  • check:nul-bytes —— OK,5984 个文件无裸控制字节
  • 消费半径已扫:全仓无任何断言读这四句(objectql 的 lock-enforcement / recorded-by / canonicalization / package-lifecycle 五个文件 110 tests 复跑绿)。protocol.lock-gate-fail-closed.test.ts 里那条记录值是注释不是断言,按 PR fix(metadata-protocol): 保存回执按 isArtifactBacked 分句,不再一律自称 customization overlay (#5265) #5926 的先例标注而非回填

#5079 的关系

未触其面。 #5079 是 deleted overlay 仍出现在 /meta listing —— 完成判据是 list / get / dispatch 三者立即一致,走的是枚举与注册表愈合路径;本 PR 只改 message 字符串模板,不碰 restoreArtifactRegistryView、不碰持久化、不碰任何枚举。两单正交,互不覆盖也互不阻塞。


Generated by Claude Code

claude added 2 commits August 7, 2026 13:57
…称回退默认值

deleteMetaItem 的四句成功回执(repository 路径两句 + legacy raw-engine 路径两句)
原本无条件把每一次删除叙述成"摘掉一层 overlay、回落到 artifact 默认值"。对一个
runtime-only 项 —— 管理员新建的 object / flow / hook,没有任何 code package 提供
同名 artifact —— 底下没有默认值可回落:那一行就是这个项的全部,删完它不复存在。

判据沿用 #5265 / PR #5926 在 save 侧的同一个事实:isArtifactBacked,也就是
intent: 'override-artifact' | 'runtime-only' 的来源。新增的方法级绑定替换了
intent 原来那次 inline 调用,分句后 registry 读取次数不增反减。

artifact-backed 两句逐字不变;草稿两句本就没声称过 overlay 或 reset,对两类项都
为真,同样逐字保留。success / reset / seq 一字未动。

反向验证(方向先于运行预测):还原无条件模板 → 预测 6 红 / 9 绿,实测 6 红 / 9 绿。

Fixes #5927

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Q7oc7ASjh8yxyS3Yz78We
@vercel

vercel Bot commented Aug 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 7, 2026 2:05pm

Request Review

@github-actions github-actions Bot added the size/m label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/metadata-protocol.

3 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/metadata-protocol)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/metadata-protocol)
  • content/docs/releases/v9.mdx (via @objectstack/metadata-protocol)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

deleteMetaItem 的四句回执一律说 "customization overlay … reset to artifact default",包括根本没有 artifact 可回退的 runtime-only 项

2 participants