维护者 2026-08-04 拍板(见 #4800 / #4862 的裁定评论):批量写按行语义为契约,本单是 **rc 止血半步**。 ## 任务 1. **专门诊断**:hook 条件引用 `previous`(#4775 fail-loud 已落地)撞上 predicate 批量更新(`multi: true`,无单一前置记录)时,当前抛的是泛化求值失败(形如 `No such key: previous`),必须换成点名的错误:说明这是批量写、无单一前置记录、当前版本的限制、以及出路(改单记录写入;或等按行语义实现单落地)。错误挂既有错误族,机器可读。 2. **ADR 补遗**:把「批量写上 after 型 hook / record-change flow trigger 按行求值、按行触发」的契约决定记入相关 ADR(补遗形式,参照 #4889/PR #4972 的 ADR-0058 D5 addendum + anchors 先例),并注明 rc 期以本诊断止血、实现单另行交付。 3. 回归测试:批量写 + 引用 previous 的 hook 条件 → 收到点名诊断(非泛化错误);单记录写不受影响;不引用 previous 的批量写不受影响。 落点:`packages/objectql`(hook-wrappers / engine 批量分支)+ docs/adr。⛔ `packages/spec/**` 零改动;`protocol.ts` 零改动。 Part of #4800。 --- _Generated by [Claude Code](https://claude.ai/code)_
维护者 2026-08-04 拍板(见 #4800 / #4862 的裁定评论):批量写按行语义为契约,本单是 rc 止血半步。
任务
previous(hook 的condition求不出值时:全局 fail loud —— 抛错并中断该次操作(方案 B 已拍板;Blocked-by #4770) #4775 fail-loud 已落地)撞上 predicate 批量更新(multi: true,无单一前置记录)时,当前抛的是泛化求值失败(形如No such key: previous),必须换成点名的错误:说明这是批量写、无单一前置记录、当前版本的限制、以及出路(改单记录写入;或等按行语义实现单落地)。错误挂既有错误族,机器可读。readonlyWhenis unenforced server-side — the field lock fails open, so a paid invoice's frozen lines can be rewritten over the API #4889/PR fix(objectql,lint): 服务端补上 parent 作用域 readonlyWhen 的绑定与执行 (#4889) #4972 的 ADR-0058 D5 addendum + anchors 先例),并注明 rc 期以本诊断止血、实现单另行交付。落点:
packages/objectql(hook-wrappers / engine 批量分支)+ docs/adr。⛔packages/spec/**零改动;protocol.ts零改动。Part of #4800。
Generated by Claude Code