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
Landing site (read, not guessed). The fix belongs in packages/objectql/src/engine.ts — the by-id arm at engine.ts:5964 (result = await driver.update(object, hookContext.input.id, hookContext.input.data, …)), the sibling of the multi arm that PR #6433 is editing ~50 lines below the same if. packages/drivers/driver-sql/src/sql-driver.ts:3254 is cited in the body as evidence that the payload reaches the SET clause, not as a landing site — route C (per-driver skip lists) is the #5240 / #4434 shape the issue itself argues against. packages/objectql ⇒ domain:engine-core. Freeze check: the 2026-08-05 investment freeze (#5499) covers driver-memory / driver-mongodb only and does not touch this card.
Not a duplicate of #6262 — verified against the PR diff.#6262 (pm:dispatched, domain:engine-core, target:v17) is scoped to the multi arm: PR #6433's strip sits inside else if (options?.multi && driver.updateMany), and its new engine-update-multi-payload-id.test.ts closes with a describe block titled "#6262 — the by-id path is untouched" that pins today's behaviour (expect(call.data).toEqual({ id: { $in: ['a','b'] }, title: 'x' })). The two cards are complementary halves, and fixing this one must flip those pins — loudly, by design.
Sequencing (same lane, therefore no pm:blocked). It stays dispatchable but must land after PR #6433: same file, same function, and the pins above. Both cards are domain:engine-core, so the lane PM sees both in its own in-flight view, which is where the ordering belongs (same-domain batch independence is the lane's own step 3).
Release board.target:v17 under criterion ① (data error on a shipped surface): on a backend that accepts the write, UPDATE task SET id = '{"$in":["a","b"]}' WHERE id = 'rec_1' destroys the row's identity irreversibly, and the twin #6262 is already boarded for the same failure on the other arm. Boarding is this seat's single-producer call, not a priority claim — the maintainer drops it at release time if the RC can ship without it.
Scope note for whoever takes it. Route A (strip only the payload id that the dispatch has already ruled is not a primary key) needs no new ruling. Route B (loudly reject a non-scalar data.id on both arms) reverses a verdict ENGINE_UPDATE_DISPATCH_CASES states today and is a partial rollback of #5748's ruling A — that is a maintainer decision, not a dev's choice; split it out as needs-user-decision rather than deciding it inside the PR. The data: { id: null } round-trip-PUT entry named in the body is explicitly untested end-to-end (whether the REST layer strips id first was not read) — treat it as an unverified shape, not an established repro.
Stale-premise check against origin/main (fetched, 26b72e0): engine.ts:5964 still hands driver.update the untouched payload; ENGINE_UPDATE_DISPATCH_CASES still lives at packages/metadata-core/src/engine-update-dispatch.ts:267 and is re-exported from packages/objectql/src/engine-update-dispatch.ts; PR #6433 is open, not merged. Duplicate search run across all three repos (data.id, updateMany SET payload, primary-key column) — hits are #6262 (twin arm) and #6437 (DroppedFieldsEvent.reason, a finding spawned by the same PR); neither is this card.
Activity
os-zhuang commentedon Aug 7, 2026
Triage —
pm:queue·domain:engine-core·target:v17Landing site (read, not guessed). The fix belongs in
packages/objectql/src/engine.ts— the by-id arm atengine.ts:5964(result = await driver.update(object, hookContext.input.id, hookContext.input.data, …)), the sibling of themultiarm that PR #6433 is editing ~50 lines below the sameif.packages/drivers/driver-sql/src/sql-driver.ts:3254is cited in the body as evidence that the payload reaches the SET clause, not as a landing site — route C (per-driver skip lists) is the #5240 / #4434 shape the issue itself argues against.packages/objectql⇒domain:engine-core. Freeze check: the 2026-08-05 investment freeze (#5499) coversdriver-memory/driver-mongodbonly and does not touch this card.Not a duplicate of #6262 — verified against the PR diff. #6262 (
pm:dispatched,domain:engine-core,target:v17) is scoped to themultiarm: PR #6433's strip sits insideelse if (options?.multi && driver.updateMany), and its newengine-update-multi-payload-id.test.tscloses with a describe block titled "#6262 — the by-id path is untouched" that pins today's behaviour (expect(call.data).toEqual({ id: { $in: ['a','b'] }, title: 'x' })). The two cards are complementary halves, and fixing this one must flip those pins — loudly, by design.Sequencing (same lane, therefore no
pm:blocked). It stays dispatchable but must land after PR #6433: same file, same function, and the pins above. Both cards aredomain:engine-core, so the lane PM sees both in its own in-flight view, which is where the ordering belongs (same-domain batch independence is the lane's own step 3).Release board.
target:v17under criterion ① (data error on a shipped surface): on a backend that accepts the write,UPDATE task SET id = '{"$in":["a","b"]}' WHERE id = 'rec_1'destroys the row's identity irreversibly, and the twin #6262 is already boarded for the same failure on the other arm. Boarding is this seat's single-producer call, not a priority claim — the maintainer drops it at release time if the RC can ship without it.Scope note for whoever takes it. Route A (strip only the payload
idthat the dispatch has already ruled is not a primary key) needs no new ruling. Route B (loudly reject a non-scalardata.idon both arms) reverses a verdictENGINE_UPDATE_DISPATCH_CASESstates today and is a partial rollback of #5748's ruling A — that is a maintainer decision, not a dev's choice; split it out asneeds-user-decisionrather than deciding it inside the PR. Thedata: { id: null }round-trip-PUT entry named in the body is explicitly untested end-to-end (whether the REST layer stripsidfirst was not read) — treat it as an unverified shape, not an established repro.Stale-premise check against
origin/main(fetched,26b72e0):engine.ts:5964still handsdriver.updatethe untouched payload;ENGINE_UPDATE_DISPATCH_CASESstill lives atpackages/metadata-core/src/engine-update-dispatch.ts:267and is re-exported frompackages/objectql/src/engine-update-dispatch.ts; PR #6433 is open, not merged. Duplicate search run across all three repos (data.id,updateManySET payload, primary-key column) — hits are #6262 (twin arm) and #6437 (DroppedFieldsEvent.reason, afindingspawned by the same PR); neither is this card.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
baozhoutao commentedon Aug 8, 2026
认领(engine-core 席 #6019,会话
session_019Q7oc7ASjh8yxyS3Yz78We,第 18 轮):claude/issue-6435-by-id-payload-id-strip;工作树:../objectstack-6435packages/objectql/src/engine.ts(仅 by-id update 臂)+engine-update-multi-payload-id.test.ts(其中 fix(objectql): multi update 的 SET 载荷剥掉非 id 的data.id(#6262) #6433 钉现状的 by-id pin 按设计翻红并改写)+ 新增用例 + changeset。⛔ 不触packages/metadata-core(ENGINE_UPDATE_DISPATCH_CASES归 metadata 席;路线 A 不改派发判定,载荷断言按 fix(objectql): multi update 的 SET 载荷剥掉非 id 的data.id(#6262) #6433 先例落 objectql 测试)。data.id(#6262) #6433(multi 臂,已 MERGED)→ fix(objectql,lint): 服务端为requiredWhen绑定 parent 作用域,并把构建期硬闸扩到同一格 (#4977) #6440 → fix(objectql): sys_file hydrate 读故障与「无文件」可分辨 (#6116) #6456 → fix(objectql): seedAutonumber 播种扫描覆盖 scope 内每一行,不再取 5000 行窗口 (#6249) #6467(00:0xZ MERGED)。当前链空,分诊要求的「must land after PR fix(objectql): multi update 的 SET 载荷剥掉非 id 的data.id(#6262) #6433」已满足。id;标量data.id现状不动)。路线 B(响亮拒收)= 对 ObjectQL.update 的data.id不做标量测试 —— 载荷里的算子对象被当成主键绑定,且盖过显式options.multi: true#5748 裁 A 的部分回退,维护者专属 —— 若实施中出现非 B 不可的证据,停、回报,拆needs-user-decision,⛔ 不得在 PR 内裁。data:{id:null}回写入口按分诊口径视为未验证形状处理。pm:queue→pm:dispatched(target:v17保留,分诊已按判据 ① 上板)。Generated by Claude Code
fix(objectql): strip a ruled-not-an-id `data.id` from the by-id updat…
feat(spec,objectql): DroppedFieldsEvent.reason names the dispatch-rul…
fix(objectql,metadata-core): refuse a by-id update whose scalar where…
fix(objectql,metadata-core): refuse a by-id update whose scalar where…
test(spec): the first data/ file group's test titles state each cited…