Skip to content

callData 的 delete 成功体两条路径不同形状:protocol 回 {success:true}(合规范),ObjectQL 兜底回 {deleted:true}(spec 未声明的键) #5581

Description

@baozhoutao

观察类(finding):与 #5138 同样的可达性 —— 装了 MetadataPlugin(@objectstack/metadata-protocol,注册 protocol 槽)的部署走 protocol 优先路径,碰不到兜底。记录在案交分诊定级,不自行判轻重。

实现 #5138(PR 见下)时在同一函数里撞见,不在该单范围内(#5138 收敛的是「记录不存在」的答案,这一条是「删除成功」的答案),故另立。

事实

packages/runtime/src/action-execution.tscallData('delete', …) 两条路径回的成功体不是同一个形状:

路径 返回 与 spec
protocol(deleteData,packages/metadata-protocol/src/protocol.ts) { object, id, success: true } 合规范
ObjectQL 兜底(action-execution.ts,delete 分支末行) { object, id, deleted: true } success 缺失,deleted 未声明

规范只有一个:

packages/spec/src/api/protocol.zod.ts:472
export const DeleteDataResponseSchema = lazySchema(() => z.object({
  object: z.string().describe('Object name'),
  id: z.string().describe('Deleted record ID'),
  success: z.boolean().describe('Whether deletion succeeded'),
}));

实测(#5138 的复现 harness,同一行数据,唯一差别是注不注册 protocol 槽,main @ c11369013):

PROTOCOL del (hit): {"object":"task","id":"r1","success":true}
FALLBACK del (hit): {"object":"task","id":"r1","deleted":true}

还有一处文档面与规范相反

packages/runtime/src/domains/data.ts:102 的路由注释写的是:

// Spec: returns DeleteDataResponse = { object, id, deleted }

DeleteDataResponseSchema 声明的是 success,不是 deleted。所以这条注释把兜底的形状当成了规范 —— 下一个读它的人(或 agent)会照着 deleted 写消费端。同文件 87/94 行的 get/update 注释与各自的 schema 是对上的,只有 delete 这条对不上。

为什么值得记

不在 #5138 处置的原因

#5138 的验收面是「记录不存在时三分支给同一个 404 RECORD_NOT_FOUND」,其 PR 已按此收敛并显式保持 deleted: true 原样(有测试钉住成功路径未变)。本条要决定的是「删除成功的规范键是 success 还是 deleted」,是一次独立取舍,且会动到 spec 或所有 deleted 的读取方,不适合搭车。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions