You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A beforeDelete hook may no longer rebind ctx.input.id to another record; the rebind answers with HookTargetRebindError / ERR_HOOK_TARGET_REBIND, exactly as update() and both per-row paths already do. Route 3 stays excluded per #5574's recorded ruling.
Rationale (three-axis): measured compatibility cost is zero — the card's own repo-wide grep found no consumer of the repoint. One rule ("a by-id target is immutable in before hooks") across both verbs beats two individually-correct rules an author must memorize. And "a hook silently redirects which row gets deleted" is a top-grade footgun for AI-written hooks even though #5272's implementation is internally correct — correctness of the mechanism does not justify the surface.
Implementation notes: the four recorded landing points in the card body (ADR-0058 Amendment II.1 scope table, hook-target-rebind-errors.ts's NOT-covered section, the engine.ts re-read block comment, and the D4 §7 pin asserting the repoint is honoured) all move together; #5272's pin is re-judged deliberately, with a changeset since this removes a shipped capability. ⚠️ The ADR-0058 amendment makes this PR maintainer-merged only per standing discipline — no auto-merge, no agent queue entry.
Maintainer directive (verbatim, covering all 25 decision-inbox cards this round): 「全部接受」. Recorded by PM session session_01LGRN2cSRfggfX9B2L83bQc. Veto window open — comment to overturn.
Race re-read: all comments re-read — the 2026-08-09 maintainer ruling (route 2) and the triage grading; no competing session ID. assignees measured EMPTY via REST immediately before assigning; pm:queue → pm:dispatched same write.
A correction for the record, mine: this seat's patrol carried "#6752 awaiting ruling" all shift — the ruling has been on this card since 2026-08-09 05:40Z. The stale entry came from a shift-start prompt snapshot that was never re-verified against the card itself (lesson ㉒ cuts both ways: the do-not-touch list expires too). Dispatching now, one day late by this seat's own bookkeeping and zero days late by anyone else's.
packages/objectql/src/engine.ts is free (last owner PR #7476 merged 8e177598d).
ACCEPT — PR #7482 verified and flipped ready. ⛔ NOT queued, ⛔ NOT auto-merged: per Prime Directive #14 this amends ADR-0058, so the merge itself is the maintainer's act.
Verified by reading the body and diff (25/26 green; the single red is ADR maintainer approval — the gate that is the maintainer's pending signature, by design):
✅ All four landing points moved together: the ADR-0058 scope table (the PR promotes the change to its own Amendment II.2), the hook-target-rebind-errors NOT-covered section, the engine.ts re-read block, and the D4 §7 pin — flipped to assert ERR_HOOK_TARGET_REBIND with path: 'by-id', ⛔ not deleted.
✅ The refusal is the update() twin verbatim: input.id !== id — same-id rewrite stays legal, pinned as a negative control. CLEARED column, update() twin and per-row D4 all untouched as controls.
✅ The compatibility grep was re-run AND corrected: the card's regex missed the (ctx.input as any).id = cast form every pin uses — six hits where the card saw one, all six are tests of this very family, so the measured consumer count is still zero, now resting on a grep that can actually see the pins. This is the second time today a card's own enumeration was falsified by the dev re-running it (lesson ⑫ working as designed).
@maintainer — this one is yours to merge by hand whenever you've reviewed the Amendment II.2 text. Everything else is green and will stay ready-but-unqueued until then; I keep patrolling until it lands on origin/main.
Activity
refactor(objectql): split the delete-side by-id repoint out of #5574'…
claude commentedon Aug 8, 2026
Findings round: graded to the decision box —
finding→needs-user-decision, routeddomain:engine-core.271cee1). Route 3 (build re-resolution for update()) is already excluded by the beforeUpdate hook 在 multi:true 批量更新上拿不到 ctx.previous —— sys_fetch_previous_update 依赖 input.id;引擎已为校验取 priorRows 却不喂 hook(17.0.0-rc.2) #5574 ruling, so the open fork is 1 (keep the documented asymmetry) vs 2 (retire a shipped, pinned capability). Behavior removal of a delivered capability is a maintainer call by definition; the executed-ruling exception does not apply because PR feat(objectql): dispatch before* hooks per matched row on a predicate bulk write (#5574, #5846) #6697 explicitly deferred this exact question.packages/objectqlbulk-write hook dispatch ⇒domain:engine-core.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
os-project-manager commentedon Aug 9, 2026
Maintainer ruling (2026-08-09): route 2 — retire
delete()'s by-id REPOINT, aligning withupdate().pm:queue.A
beforeDeletehook may no longer rebindctx.input.idto another record; the rebind answers withHookTargetRebindError/ERR_HOOK_TARGET_REBIND, exactly asupdate()and both per-row paths already do. Route 3 stays excluded per #5574's recorded ruling.Rationale (three-axis): measured compatibility cost is zero — the card's own repo-wide grep found no consumer of the repoint. One rule ("a by-id target is immutable in before hooks") across both verbs beats two individually-correct rules an author must memorize. And "a hook silently redirects which row gets deleted" is a top-grade footgun for AI-written hooks even though #5272's implementation is internally correct — correctness of the mechanism does not justify the surface.
Implementation notes: the four recorded landing points in the card body (ADR-0058 Amendment II.1 scope table,⚠️ The ADR-0058 amendment makes this PR maintainer-merged only per standing discipline — no auto-merge, no agent queue entry.
hook-target-rebind-errors.ts's NOT-covered section, theengine.tsre-read block comment, and the D4 §7 pin asserting the repoint is honoured) all move together; #5272's pin is re-judged deliberately, with a changeset since this removes a shipped capability.Maintainer directive (verbatim, covering all 25 decision-inbox cards this round): 「全部接受」. Recorded by PM session session_01LGRN2cSRfggfX9B2L83bQc. Veto window open — comment to overturn.
Generated by Claude Code
claude commentedon Aug 10, 2026
Race re-read: all comments re-read — the 2026-08-09 maintainer ruling (route 2) and the triage grading; no competing session ID.
assigneesmeasured EMPTY via REST immediately before assigning;pm:queue→pm:dispatchedsame write.A correction for the record, mine: this seat's patrol carried "#6752 awaiting ruling" all shift — the ruling has been on this card since 2026-08-09 05:40Z. The stale entry came from a shift-start prompt snapshot that was never re-verified against the card itself (lesson ㉒ cuts both ways: the do-not-touch list expires too). Dispatching now, one day late by this seat's own bookkeeping and zero days late by anyone else's.
packages/objectql/src/engine.tsis free (last owner PR #7476 merged8e177598d).Generated by Claude Code
claude commentedon Aug 10, 2026
ACCEPT — PR #7482 verified and flipped ready. ⛔ NOT queued, ⛔ NOT auto-merged: per Prime Directive #14 this amends ADR-0058, so the merge itself is the maintainer's act.
Verified by reading the body and diff (25/26 green; the single red is
ADR maintainer approval— the gate that is the maintainer's pending signature, by design):hook-target-rebind-errorsNOT-covered section, theengine.tsre-read block, and the D4 §7 pin — flipped to assertERR_HOOK_TARGET_REBINDwithpath: 'by-id', ⛔ not deleted.update()twin verbatim:input.id !== id— same-id rewrite stays legal, pinned as a negative control. CLEARED column,update()twin and per-row D4 all untouched as controls.(ctx.input as any).id =cast form every pin uses — six hits where the card saw one, all six are tests of this very family, so the measured consumer count is still zero, now resting on a grep that can actually see the pins. This is the second time today a card's own enumeration was falsified by the dev re-running it (lesson ⑫ working as designed).hookContext.previous—— 契约声明「for update/delete」,引擎只在 update 分支赋值;#5038 之后批量 delete 反而比单记录 delete 更完整 #5272's re-resolution was internally correct — and the body says so plainly, with the ruling's three axes as the reason it retires anyway. A reviewer will not mistake this for a bug fix.spec-changes.json+ upgrade guide, both--checkgates green); [PM seat] domain:spec · seat 1 — ⏳ vacant #6017 declaration filed by the seat.@maintainer — this one is yours to merge by hand whenever you've reviewed the Amendment II.2 text. Everything else is green and will stay ready-but-unqueued until then; I keep patrolling until it lands on
origin/main.Generated by Claude Code
feat(objectql)!: retire delete()'s by-id beforeDelete REPOINT, aligni…
fix(objectql): restore the objectstack-ai#4757 unscoped multi-delete …