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
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
[object-ui] A list conditional predicate failed to evaluate (<label>) and was
treated as its safe default: "…". Check the field names and CEL syntax.
也就是说:越是要 fail-closed(按钮直接消失)的场合,诊断越少。行 kebab、批量选择栏、记录页头(#3521 之后)都走 warnOnError: true,所以「按钮为什么不见了」在控制台里恰恰看不到原因 —— 而 No such key: owner_id / no such overload: string == null 这类原因基本一句话就能定位作者的笔误。
另一半:措辞
同一条消息把每个调用方都称作 "list conditional predicate"。这个函数早已不只服务列表面:kanban 卡片条件格式、批量选择栏,#3521 之后还有 page:header。页头上一个隐藏的按钮报出「a list conditional predicate」会让读者去列表视图里找错。
Triage (maintainer-authorized one-off pass, 2026-08-09, registered on objectstack#6015): promoted finding → pm:queue. Diagnostics-quality S-class, same standard as recent promotions: a fail-closed report that discards the engine's own failure reason and mislabels every surface as "list conditional predicate" makes the safest path the least debuggable one. Carry the reason through and name the calling surface; no behaviour change.
Claim: PM loop round 5 (objectui whole-repo seat, non-v17 queue wave) — packed with #3796 (same file: packages/core/src/evaluator/listConditional.ts; dispatching them separately would serialize anyway).
Session: session_017Qqyix2QcnpUC9XeYVDzx3
Branch: claude/issue-3792-3796-listconditional-diagnostics
Worktree: objectui-issue-3792
File surface: packages/core/src/evaluator/listConditional.ts + the expression-evaluation seam it needs for fault-reason passback + tests. Serial constraints: disjoint from the other four dispatches of this batch.
Container & model: M, mode:subagent, model: opus
Direction (both cards carry their own analysis; neither needs a maintainer ruling):
ACCEPT (objectui seat PM, session session_017Qqyix2QcnpUC9XeYVDzx3, review of record) — PR #4104, closing this card and #3796 together.
#3792 half: onFault(reason) on the existing exported diagnostic bag — the right seam of the two the card sketched (no signature change, no second function whose fault semantics could drift), with three details that show the edge was actually thought through: it fires per fault outside the once-per-predicate warning dedupe, it's invoked OUTSIDE the engine try/catch so a throwing callback surfaces as a caller bug instead of a fake engine fault, and the legacy dialect path — which had the identical reason-loss — was fixed alongside with its own [legacy] tag. Wording neutralized in both messages that carried the "list" misnomer. Fail-closed surfaces now say WHY the button vanished, which was the whole point.
#3796 half: record pinned after the spread at the merge site — correctly chosen over stripping host scope, because it makes both dialect paths provably identical independent of either engine's precedence; the engine claim was re-measured on-branch before relying on it, and the reverse verification reproduces the card's exact asymmetry (CEL → SCOPE(decoy) / LEGACY → ROW) as the red rather than a generic failure. The rider that a row FIELD named record can no longer shadow the row root is a real hardening, noted.
Consumer sweep at the right depth for a core binding change: 36-package prefix closure type-checked (with the dist-staleness trap caught and neutralized — the first pre-build "green" would have been read off stale declarations), four predicate surfaces + components + app-shell suites all green, ~7,200 tests total. Flipping ready + auto-merge.
Activity
os-project-manager commentedon Aug 9, 2026
Triage (maintainer-authorized one-off pass, 2026-08-09, registered on objectstack#6015): promoted
finding→pm:queue. Diagnostics-quality S-class, same standard as recent promotions: a fail-closed report that discards the engine's own failure reason and mislabels every surface as "list conditional predicate" makes the safest path the least debuggable one. Carry the reason through and name the calling surface; no behaviour change.Generated by Claude Code
yinlianghui commentedon Aug 10, 2026
Claim: PM loop round 5 (objectui whole-repo seat, non-v17 queue wave) — packed with #3796 (same file:
packages/core/src/evaluator/listConditional.ts; dispatching them separately would serialize anyway).Session:
session_017Qqyix2QcnpUC9XeYVDzx3Branch:
claude/issue-3792-3796-listconditional-diagnosticsWorktree:
objectui-issue-3792File surface:
packages/core/src/evaluator/listConditional.ts+ the expression-evaluation seam it needs for fault-reason passback + tests. Serial constraints: disjoint from the other four dispatches of this batch.Container & model: M,
mode:subagent,model: opusDirection (both cards carry their own analysis; neither needs a maintainer ruling):
evalRowPredicate的 fail-closed 报告丢掉引擎给的失败原因(且把每个面都称作 "list conditional predicate") #3792: thread the engine's failure reason into the fail-closed (warnOnError: true) warning via an explicit passback (the card sketchesonFault(reason)or a rich-result sibling — dev picks the cleaner seam), and neutralize the "list conditional predicate" wording.evalRowPredicate:宿主 scope 里的record键会盖掉行绑定 —— CEL 路盖得掉、遗留路盖不掉,同一函数两种优先级 #3796: pinrecordwith the same protectiondataalready has — row wins over host scope on BOTH dialect paths — plus the test the card asks for pinning both paths' precedence together.Generated by Claude Code
yinlianghui commentedon Aug 10, 2026
ACCEPT (objectui seat PM, session
session_017Qqyix2QcnpUC9XeYVDzx3, review of record) — PR #4104, closing this card and #3796 together.#3792 half:
onFault(reason)on the existing exported diagnostic bag — the right seam of the two the card sketched (no signature change, no second function whose fault semantics could drift), with three details that show the edge was actually thought through: it fires per fault outside the once-per-predicate warning dedupe, it's invoked OUTSIDE the engine try/catch so a throwing callback surfaces as a caller bug instead of a fake engine fault, and the legacy dialect path — which had the identical reason-loss — was fixed alongside with its own[legacy]tag. Wording neutralized in both messages that carried the "list" misnomer. Fail-closed surfaces now say WHY the button vanished, which was the whole point.#3796 half:
recordpinned after the spread at the merge site — correctly chosen over stripping host scope, because it makes both dialect paths provably identical independent of either engine's precedence; the engine claim was re-measured on-branch before relying on it, and the reverse verification reproduces the card's exact asymmetry (CEL → SCOPE(decoy)/LEGACY → ROW) as the red rather than a generic failure. The rider that a row FIELD namedrecordcan no longer shadow the row root is a real hardening, noted.Consumer sweep at the right depth for a core binding change: 36-package prefix closure type-checked (with the dist-staleness trap caught and neutralized — the first pre-build "green" would have been read off stale declarations), four predicate surfaces + components + app-shell suites all green, ~7,200 tests total. Flipping ready + auto-merge.
Generated by Claude Code
fix(core): evalRowPredicate carries the engine fault reason and pins …