观察类记录(observation-class),当前用户打不到。读 #5088 时发现,如实登记,不建议单独排期。
现状
packages/metadata-protocol/src/protocol.ts 里两个 by-id 的 update 写面,对「行里没有 id」的处理不一致:
#5088 之后这条差异变得可见了一点:updateMany 里一个没有 id 的行,现在会先撞上存在性探针,拿到 RECORD_NOT_FOUND / 404,而同样一个行走 batch 的 update 分支拿到的是 VALIDATION_FAILED / 400。两者都不算"错",但对同一个 caller 错误给出两种分类,正是 #4620 对本文件立的规矩要避免的("must be ONE implementation, not three that agree today")。
为什么现在打不到
updateMany 的唯一入口(POST /api/v1/data/:object/updateMany)在 rest-server.ts 里跑 UpdateManyDataRequestSchema.safeParse,而 UpdateManyRecordSchema 的 id 是必填(#3939 特意不复用宽松的 BatchRecordSchema)。所以没有 id 的行到不了协议层 —— 只有直接调用协议方法的进程内 caller 才可能构造出来。故归为 dormant / 口径漂移,不是活缺陷。
建议(若将来收拢)
在 runUpdateManyLoop 的循环开头补同一句 if (!record.id) throw rowRequiredIdError('update'),让两个写面对畸形行给出同一个分类。改动很小,但会改变一个(目前不可达的)错误码,所以不适合搭在 #5088 的修复里顺手带 —— 那单的验收面明确是"每行自带 id"的路径。
发现于 #5088 的实现过程。
https://claude.ai/code/session_01BotUP49pqhvqGY393n2HfU
观察类记录(observation-class),当前用户打不到。读 #5088 时发现,如实登记,不建议单独排期。
现状
packages/metadata-protocol/src/protocol.ts里两个 by-id 的 update 写面,对「行里没有 id」的处理不一致:runBatchDataLoop的update分支:if (!record.id) throw rowRequiredIdError('update')→VALIDATION_FAILED/ 400。这是 fix(metadata-protocol)!: batch 逐行结果迁移到BatchOperationResultSchema形状 —— 方案 B 已拍板,硬切 + 诚实迁移说明(Blocked-by #4620) #4793 特意加的,注释写着「a caller error, so it carries VALIDATION_FAILED / 400 rather than falling through toRowApiError's unclassified-throw default」。runUpdateManyLoop:没有这道守卫,直接把record.id递给引擎。#5088 之后这条差异变得可见了一点:
updateMany里一个没有 id 的行,现在会先撞上存在性探针,拿到RECORD_NOT_FOUND/ 404,而同样一个行走batch的 update 分支拿到的是VALIDATION_FAILED/ 400。两者都不算"错",但对同一个 caller 错误给出两种分类,正是 #4620 对本文件立的规矩要避免的("must be ONE implementation, not three that agree today")。为什么现在打不到
updateMany的唯一入口(POST /api/v1/data/:object/updateMany)在rest-server.ts里跑UpdateManyDataRequestSchema.safeParse,而UpdateManyRecordSchema的id是必填(#3939 特意不复用宽松的BatchRecordSchema)。所以没有 id 的行到不了协议层 —— 只有直接调用协议方法的进程内 caller 才可能构造出来。故归为 dormant / 口径漂移,不是活缺陷。建议(若将来收拢)
在
runUpdateManyLoop的循环开头补同一句if (!record.id) throw rowRequiredIdError('update'),让两个写面对畸形行给出同一个分类。改动很小,但会改变一个(目前不可达的)错误码,所以不适合搭在 #5088 的修复里顺手带 —— 那单的验收面明确是"每行自带 id"的路径。发现于 #5088 的实现过程。
https://claude.ai/code/session_01BotUP49pqhvqGY393n2HfU