Skip to content

[rc 止血] 批量写上引用 previous 的 hook 条件:泛化失败换成点名批量限制的专门诊断 + ADR 补遗 #5037

Description

@claude

维护者 2026-08-04 拍板(见 #4800 / #4862 的裁定评论):批量写按行语义为契约,本单是 rc 止血半步。

任务

  1. 专门诊断:hook 条件引用 previous(hook 的 condition 求不出值时:全局 fail loud —— 抛错并中断该次操作(方案 B 已拍板;Blocked-by #4770) #4775 fail-loud 已落地)撞上 predicate 批量更新(multi: true,无单一前置记录)时,当前抛的是泛化求值失败(形如 No such key: previous),必须换成点名的错误:说明这是批量写、无单一前置记录、当前版本的限制、以及出路(改单记录写入;或等按行语义实现单落地)。错误挂既有错误族,机器可读。
  2. ADR 补遗:把「批量写上 after 型 hook / record-change flow trigger 按行求值、按行触发」的契约决定记入相关 ADR(补遗形式,参照 Parent-scoped readonlyWhen is 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 期以本诊断止血、实现单另行交付。
  3. 回归测试:批量写 + 引用 previous 的 hook 条件 → 收到点名诊断(非泛化错误);单记录写不受影响;不引用 previous 的批量写不受影响。

落点:packages/objectql(hook-wrappers / engine 批量分支)+ docs/adr。⛔ packages/spec/** 零改动;protocol.ts 零改动。

Part of #4800。


Generated by Claude Code

Activity

  1. claude commented on Aug 4, 2026

    @claude
    ContributorAuthor

    🔒 认领:PM 循环第 7 轮(维护者裁决落地批)
    会话:session_01NrmBxj8rK2uGCnh9aipjwX(账号 xuyushun441-sys)
    分支:claude/issue-5037-bulk-previous-diagnostic
    Worktree:objectstack-issue-5037
    域:domain:engine
    文件面:packages/objectql/src/hook-wrappers.ts / engine.ts 批量分支 + docs/adr/** 补遗 + anchors

    ⛔ 硬约束:spec/** 及生成物零改动;protocol.ts 零改动;releases/ 零触碰。
    全局在飞不相交已核:与 #5025(sys-metadata-repository.ts + 基线)、#4762(packages/lint)、本批其余两单文件面均不交。


    Generated by Claude Code

  2. claude commented on Aug 4, 2026

    @claude
    ContributorAuthor

    ✅ 验收通过 —— PR #5057(draft,CI 跑完入队)

    对照实际 diff 复核(7 文件,+692/-23;⛔ spec / protocol.ts / releases 零触碰,engine.ts 未动,逐一核实):

    1. 前提更正(公开归档):派发词所述「批量写 + previous → 泛化 No such key」在 origin/main 上已不成立 —— feat(objectql)!: hook 的 condition 求不出值时 fail loud —— 抛错并中断该次操作 (#4775) #4861 实现 hook 的 condition 求不出值时:全局 fail loud —— 抛错并中断该次操作(方案 B 已拍板;Blocked-by #4770) #4775 时已带 predicateBulkWrite 专门分支。本单实际做的是把既有诊断对齐 8-04 裁定,这个纠偏方向正确。
    2. 文案修正是本单最值钱的部分:删掉「rewrite the condition without previous」—— 这条旧建议会引导作者把过渡条件静默改写成状态测试(每次批量写都触发),恰是裁定要消灭的错误形状;新文案点名「当前版本限制而非契约」、引 ADR-0058 补遗与 [17.x] 批量写按行语义实现:hook 按行触发 + record-change trigger 按行绑定 previous/record(#4800/#4862 拍板 A) #5038 退役条件、给今天可用的出路。
    3. 机器可读判别位的命名克制:limitation 而非 code —— ADR-0112 的 error.code 是闭集且 rest-server 会把 .code 提升进封套,叫 code 等于副作用铸造未注册线上码。这类边界意识值得写进验收记录。
    4. 检测走 CEL AST(collectCelRootIdentifiers,wrap 期一次),不再误判 record.previous_status;comprehension 绑定变量的已知假阳性只在报错路径被读,有用例证明惰性。
    5. ADR-0058 只追加不改旧文 + anchors;17 例新测试覆盖四项验收;objectql 1810 全过。
    6. 两条留档合理:formula SKILL.md 口径收口刻意留给 [17.x] 批量写按行语义实现:hook 按行触发 + record-change trigger 按行绑定 previous/record(#4800/#4862 拍板 A) #5038(改它会带出生成物,撞硬约束);ADR-0072 快照表偏差记录不动(Proposed 状态 + 只追加原则)。

    CI 绿后转 ready 入合并队列。


    Generated by Claude Code

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

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions