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.
packages/fields/src/widgets/__tests__/FilterConditionField.operators.test.ts 的双向 parity 测试
「every spec field operator is reachable from the builder (#2942)」因此变红:
AssertionError: FieldOperatorsSchema accepts these but no builder operator can author them:
expected [ '$icontains' ] to deeply equal []
Triage: transferred to the main backlog as objectstack-ai/objectstack#6337, and blocked. pm:blocked here; ⛔ no domain:* (sibling repos are whole-repo seats, routed by repo:* on the objectstack side).
The deliverable is a feature increment — a new builder operator plus ten locale-pack label keys, as the body itself states. Under the multi-repo coordination rule "One main backlog", feature-level issues are filed in objectstack whatever repo the code lands in, so scheduling has exactly one entry point. objectstack#6337 now carries it with pm:queue + pm:blocked + repo:objectui; the code still lands here, in this repo, in the implementing dev's own worktree. This issue stays open as the origin record — it is not a duplicate to close, and no work is lost.
⚠️ One premise correction, and it is the blocking one
The body says the server already accepts $icontains. Measured against objectstackorigin/main:
$icontains exists in packages/spec only — filter.zod.ts, filter-operator-vocabulary.test.ts, filter-text-conformance.ts, the authorable-surface baselines, the CHANGELOG.
git grep -l icontains origin/main -- packages/drivers returns nothing. No backend implements it.
So the spec vocabulary accepts the token while no driver can execute it. Landing the builder operator first would hand users a filter that every backend fails — strictly worse than the capability being absent. Hence blocked rather than queued: this returns to the queue when #5702 merges, via the unlock sweep.
This does not diminish the finding. objectui#3560's handling was right on both counts: registering $icontains in KNOWN_UNREACHABLEwith a stated reason instead of silently widening the exclusion, and adding the ratchet asserting every excluded token is still a real spec operator — an exclusion must not outlive its reason.
The product question, recorded not lost
Whether today's contains should have been case-insensitive all along — and therefore whether contains should emit $icontains with a new containsCaseSensitive for $contains — changes the behaviour of stored filter views, so it is the maintainer's call. It is carried onto #6337 with the body's own default (add a new operator, leave contains untouched) so the card is dispatchable without waiting. If the maintainer prefers the flip, that re-scopes #6337 into the decision inbox rather than stalling this one.
Declared blocker: objectstack-ai/objectstack#5702 — verified closed against the GitHub API on 2026-08-14. No other blocker is declared on this card.
⚠️This card's Blocked-by: line lives in a comment, not the body. The unlock sweep greps the body, so this card was not discoverable by the automated sweep and was found only by a manual read of every pm:blocked card. Several seats recorded that they placed the line in a comment deliberately, to avoid the MCP body round-trip re-encoding the card's punctuation as HTML entities. That trade-off is sound per card and structurally lossy in aggregate: 26 of the 40 open pm:blocked cards across the three repos carry no body-level Blocked-by:. The durable fix belongs in the sweep (grep comments too), not in asking seats to risk body rewrites.
Activity
claude commentedon Aug 7, 2026
Triage: transferred to the main backlog as objectstack-ai/objectstack#6337, and blocked.
pm:blockedhere; ⛔ nodomain:*(sibling repos are whole-repo seats, routed byrepo:*on theobjectstackside).Blocked-by: objectstack-ai/objectstack#5702
Why it moved
The deliverable is a feature increment — a new builder operator plus ten locale-pack label keys, as the body itself states. Under the multi-repo coordination rule "One main backlog", feature-level issues are filed in
objectstackwhatever repo the code lands in, so scheduling has exactly one entry point. objectstack#6337 now carries it withpm:queue+pm:blocked+repo:objectui; the code still lands here, in this repo, in the implementing dev's own worktree. This issue stays open as the origin record — it is not a duplicate to close, and no work is lost.The body says the server already accepts
$icontains. Measured againstobjectstackorigin/main:$icontainsexists inpackages/speconly —filter.zod.ts,filter-operator-vocabulary.test.ts,filter-text-conformance.ts, the authorable-surface baselines, the CHANGELOG.git grep -l icontains origin/main -- packages/driversreturns nothing. No backend implements it.pm:queue+pm:blocked+domain:drivers), itself blocked by Re-anchor the eightADR-0057 D10citations to the framework'sADR-0124 D1— D10 decides Setup-nav capability surfacing, not enforcement location, and the framework's own ADR says so #5701 (contract half: vocabulary +FILTER_LOGIC_CASES) and Remove/localize the six dangling@objectstack/spec/uitheme-schema imports inpackages/types/src/zod/theme.zod.ts— the ruled FIRST leg of unbreaking objectstack's Console Pin Gate #5710 (producer-first:plugin-auth'scontainsbranch). Thedriver-memory/driver-mongodbimplementations fall inside the [finding] RelatedList.tsx's docstring still saysrichtextrenders throughMarkdownCellRenderer— untrue since #5452 #5499 investment freeze.So the spec vocabulary accepts the token while no driver can execute it. Landing the builder operator first would hand users a filter that every backend fails — strictly worse than the capability being absent. Hence blocked rather than queued: this returns to the queue when #5702 merges, via the unlock sweep.
This does not diminish the finding. objectui#3560's handling was right on both counts: registering
$icontainsinKNOWN_UNREACHABLEwith a stated reason instead of silently widening the exclusion, and adding the ratchet asserting every excluded token is still a real spec operator — an exclusion must not outlive its reason.The product question, recorded not lost
Whether today's
containsshould have been case-insensitive all along — and therefore whethercontainsshould emit$icontainswith a newcontainsCaseSensitivefor$contains— changes the behaviour of stored filter views, so it is the maintainer's call. It is carried onto #6337 with the body's own default (add a new operator, leavecontainsuntouched) so the card is dispatchable without waiting. If the maintainer prefers the flip, that re-scopes #6337 into the decision inbox rather than stalling this one.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
claude commentedon Aug 14, 2026
Unlock sweep: blocker cleared.
pm:blocked→pm:queue.Declared blocker: objectstack-ai/objectstack#5702 — verified closed against the GitHub API on 2026-08-14. No other blocker is declared on this card.
Blocked-by:line lives in a comment, not the body. The unlock sweep greps the body, so this card was not discoverable by the automated sweep and was found only by a manual read of everypm:blockedcard. Several seats recorded that they placed the line in a comment deliberately, to avoid the MCP body round-trip re-encoding the card's punctuation as HTML entities. That trade-off is sound per card and structurally lossy in aggregate: 26 of the 40 openpm:blockedcards across the three repos carry no body-levelBlocked-by:. The durable fix belongs in the sweep (grep comments too), not in asking seats to risk body rewrites.Authorization: maintainer directive (this session) —「先做 23 张 blocked 解锁 10 张 on-hold 按各自自述处理」· PM session
01JaVVMrSxt7Tgi1uwEuDtH7Generated by Claude Code
yinlianghui commentedon Aug 16, 2026
Claim: 批次 8(座位
repo:objectui,sessionsession_01GTRjn8xBqp75dk7kFupVRt,batch:5)Branch:
claude/issue-3567-icontains-operatorFile surface:
packages/fields/src/widgets/FilterConditionField*(词表/condToMongo/kvToCondition)+ 十个 locale pack 各一 key +FilterConditionField.operators.test.ts(删 KNOWN_UNREACHABLE 排除项,parity 断言接管);⛔ 不碰packages/components/src/custom/filter-builder.tsx(#3958 同批在飞,不同组件)。按卡内默认路线执行:新增大小写不敏感 operator(命名对齐仓内惯例,如
containsIgnoreCase),contains语义不动;「现有 contains 是否该改 emit $icontains」的产品问题不在本单,如实施中发现强证据,回传报告不动代码。往返完整性(kvToCondition 读回)必须钉双向。Generated by Claude Code
yinlianghui commentedon Aug 16, 2026
【PM 关单】座位
repo:objectui(session_01GTRjn8xBqp75dk7kFupVRt):closed as completed —— 本卡四项交付物已全部落地:实施经迁移卡 #4023 → PR #4737(2026-08-15 合并,其正文明确「Part of #3567 — the card's four deliverables, implementing its recorded DEFAULT」)。本批派出的 dev 在最新 main 上零改动逐条核实:词表containsCaseInsensitive+condToMongo生成$icontains、kvToCondition读回、十个 locale pack key 齐、KNOWN_UNREACHABLE排除项已删且 parity 接管;并以三次先预判后跑的变异证明既有钉子各自承重(报告在案)。「现有 contains 是否本该大小写不敏感」的产品问题未被触碰,维护者如要重裁另立卡。流程记账(本座位失误):批次 8 认领时未读本卡评论区的分诊迁移记录,closed-PR 查重只搜了实现未追迁移链,空派一名 dev(零改动收场,无害但浪费)。「认领前读全评论 + 查重含迁移目标卡」已并入座位常设承诺执行细则。
Generated by Claude Code