Skip to content

删除 saveMetaItem legacy 写入分支后的三处残留:一个无生产者的 ledger 错误码 + 两处已过期的跨包注释 #5783

Description

@os-zhuang

观察类发现,来自 #5264 / PR #5782 的实施过程。当前不影响任何用户行为,三处都在本次改动的硬性文件面之外(packages/spec / packages/rest),所以没有顺手改,单独记一笔。

1. OVERLAY_PERSISTENCE_FAILED 失去了唯一的生产端

PR #5782 删掉 saveMetaItem 的 legacy raw-engine 分支后,OVERLAY_PERSISTENCE_FAILED 在整个仓库里没有任何生产端会再抛出它(原唯一发射点是被删分支的 catch,packages/metadata-protocol/src/protocol.ts 原 7952 行)。但它仍登记在 packages/spec/src/api/error-code-ledger.zod.ts@objectstack/metadata-protocol 名下。

ledger 的自检(error-code-ledger.test.ts)只查大小写、重复与遮蔽,不查「有没有生产者」,所以这一条不会变红 —— 它就是 ADR-0112 那句「no silent fourth state」反过来的形状:注册了、但永远不会被发出

两处 packages/rest 的测试仍在自行构造这个 error 来断言 5xx 行为,因此它们今天钉的是一个没有生产者的码(#4984 家族的 phantom check):

  • packages/rest/src/rest-5xx-message-sanitization.test.ts:278
  • packages/rest/src/rest-unknown-object-heuristic.test.ts:413

两条断言本身仍然有价值(它们验证的是 resolveErrorResponse 对「声明了 status 的 5xx」的处理),换一个仍有生产者的码即可,不必删。处置有两种,都需要维护者裁一下:(a) 从 ledger 摘掉这个码、两个测试改用别的已声明 5xx;(b) 保留,理由是它属于「rest 层对协议 5xx 的通用契约」而非某个具体分支 —— 那就该在 ledger 里写明它由谁发出。

2. packages/spec/src/kernel/metadata-plugin.zod.tsagent 注释已过期

约 793 行,在解释「agent 为什么没有 governed write path」时写道:

saveMetaItem would route it down the legacy raw-engine branch, and nothing calls it.

结论(agent 无变更日志、以 git 为记录)完全成立且未受影响,但机制描述已经不对了:今天 saveMetaItem 会以 403 直接拒绝 code-only 类型(#5086),那条 legacy 分支也已被 #5264 删除。这段注释正是 AGENTS.md「Route & surface ownership」第 1 条点名的输入 —— grep 找得到、按它推理会得出错误的运行时模型。

3. packages/rest/src/rest-5xx-message-sanitization.test.ts 的注释在 #5263 当天就已过期

165-172 行说明为什么 saveMetaItem 的 5xx 生产者是「按形状覆盖」而非实测:

reaching its legacy raw-engine branch requires a metadata type that is neither overlay-allowed nor runtime-creatable AND an artifact-backed item of that type, and a runtime-created one is refused earlier with 403 NOT_CREATABLE.

前半句在 PR #5263 落地当天就不再成立:artifact-backed 的 code-only 类型同样在更早位置被拒(NOT_OVERRIDABLE, 403)—— 这一点 PR #5782 的不可达性复核已用 protocol.code-only-types.test.ts 的既有用例证实。有意思的是这段注释当时是对的,它只是没跟上同一周的门禁收紧,可以当作「注释里写死可达性论证」这种做法本身的样本。

建议

三条同源(都是同一次收紧留下的尾巴),但落在两个包、性质也不同:1 是词表漂移(要裁),2 和 3 是纯注释。可以合成一个小 PR 收掉,前提是 1 先有结论。

参考:#5264 / PR #5782,#5086 / PR #5263

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions