Repository navigation
docs(skills): schema-expressions.md states { condition, style } as the only authorable conditional-formatting rule on every list carrier (objectui#11534) - #11595
Conversation
…s the only authorable conditional-formatting rule on every list carrier (objectui#11534)
The "CEL predicates over a row record" bullet said the native
`{ field, operator, value }` form and the `{ expression: "${…}" }` template
form "still work and are rewritten to CEL transparently". Since objectui#11522
(kanban) and objectui#11533 (grid, list view) every list carrier's schema door
refuses both forms by name with the `{ condition, style }` respelling, so the
bullet over-promised to authors.
The bullet now says authoring takes `{ condition, style }` only, names the
native and `{ expression }` forms as retired and refused at the schema door,
and keeps two renderer-side facts that still hold: a STORED legacy rule still
renders through the shared evaluator (a compatibility read, not an authoring
form), and a `condition` string in legacy-only syntax still routes to the old
engine with a one-time deprecation warning.
One bullet changed, nothing else in the guide. No changeset: `skills/**` is
outside the released packages' guarded source.
Claude-Session: https://claude.ai/code/session_01CB6W87z22K2yjUCDyVrJRk
Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Read-only shape otherwise: the diff against the merge base bdc9049, card objectui#11534 with every comment, the schema tombstones and the evaluator on objectui ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
维护者速读(终稿)— PR #11595(objectui#11534)· skills seat 1 · 2026-10-04T04:38Z改了什么: 对外发布的 objectui 技能包里 为什么改: objectui#11522 与 #11533 已把这条原生规则从 kanban、grid、list view 三个作者面退役( 风险与代价(含回滚): 纯技能文本,不碰 席位意见: 建议批准。一条 bullet、一次人工审阅,措辞与裁决第一分支逐项对应;PR 正文无 你要做的(一个动作): 在 objectui PR #11595 上给一次 APPROVED review;批准后由席位清标、ready、挂 auto-merge 入队。 |
Fixes #11534
Clause-②: no
One bullet of
skills/objectui/guides/schema-expressions.md— the one under "CEL predicates over a row record" that opened with "Legacy shapes are translated, with a one-time warning." — is restated per the card's ruling (triage comment 5965309847, first branch; unlock comment 5966553335). Nothing else in the guide moves; no other file is touched. Governed surface (skills/**, theskills-catalogitem ofGOVERNED_SURFACES): this PR stays a DRAFT until an authorized APPROVED review is on it; the claiming seat lands it. The dev that drafted this does not flip it ready, enqueue it, or approve it.What the bullet says now
{ condition, style }only, on every list carrier (grid, list view, kanban).{ field, operator, value }form and the{ expression: "${…}" }template form are retired, refused at the schema door by name with the respelling.conditionstring in legacy-only syntax still routes to the old engine with a one-time deprecation warning — a renderer-side fact that still holds and lives nowhere else, so it is kept.The old bullet's operator list and the
?.marker went with the retired forms; the three facts above are the whole bullet.Reading one — premise verification on objectui
origin/mainbdc9049Cited by content (symbol names, test names, quoted message fragments), never by line address.
① Every list carrier's schema door refuses the native rule and the
{ expression }rule. Probed withsafeParseonObjectKanbanSchema,ObjectGridSchemaandListViewSchema(onetsxrun against thepackages/typessource; the spec-shape{ condition, style }rule was the positive control and parsed on all three):{ field, operator, value, backgroundColor }{ expression, backgroundColor }object-kanbanfield/operator/value/backgroundColor: "belongs to the native kanban rule dialect … whichobject-kanban'sconditionalFormattingno longer accepts: RETIRED (objectui#11522), with no alias window. A rule is{ condition, style }" (kanbanRuleKeyRetired)expression. Did you meanexpression→condition?" (the spec element's own strictness, inherited byKanbanConditionalFormattingRuleSchema)object-gridconditionalFormattingonobject-gridandlist-viewno longer accepts: RETIRED (objectui#11533), with no alias window" (gridRuleKeyRetired)expression: "expressionis the template predicate of the native rule dialect … RETIRED (objectui#11533)"list-viewgridRuleKeyRetiredrefusal (the member isConditionalFormattingRuleSchema, one declaration shared by the two mirrors)expressionrefusalPinned by the repository's own tests, run on this tree:
kanban-conditional-formatting.test.ts("refuses the native{ field, operator, value, backgroundColor }rule BY NAME, at each retired key"; "inherits the spec rule's strictness: an undeclared key is refused with the spec's own message") andgrid-list-view-conditional-formatting-11533.test.ts("refusesexpressionBY NAME, with theconditionrespelling"; "the grid's, the list view's and the named view's members all carry the one rule").② Stored legacy rules still render through the shared evaluator.
resolveConditionalFormattingin@object-ui/core(listConditional.ts) normalises a rule throughruleToPredicate:conditionfirst, then a non-blankexpressionstring, thenfieldOperatorValueToCelfor the native comparison — every arm kept, and the schema comment on both rules says so verbatim ("Stored stock is not authoring … keeps every arm as a compatibility read"). The legacy-dialect string route isisLegacyDialectSource+warnLegacyDialect(warn-once per source). Pinned bylistConditional.test.ts: "native shape { field, operator, value } — translated to CEL", "native operators: not_equals / greater_than / less_than / contains / in", and under "legacy-dialect routing": "routes a${…}template string to the legacy engine and warns once".Test run (under the shared verification lock): the three files above —
Test Files 3 passed (3)·Tests 105 passed (105)·VERDICT command-exit 0.The blocker is landed: objectui#11533 reached state completed when PR #11540 merged to main; objectui#11522 (PR #11532) is on main. No re-ruling away from retirement was found, so the ruling's first branch is what the bullet states.
Reading two — the
skills/**line readingsorigin/mainbdc9049)fa1c5e7)guides/schema-expressions.mdSKILL.mdunderskills/(1 file).mdunderskills/(16 files)The dispatch's target was net zero against the old bullet's 7 lines; the restatement lands at +1 because it keeps the two compatibility facts the ruling asks for AND the still-true legacy-dialect-string fact, at 80 columns. No token gate exists for this catalog (objectui carries
check:skill-eval-tokens, a must_contain oracle, not a line ceiling; green below). If the seat wants net zero, the last clause ("aconditionin legacy-only syntax … write CEL.") is the one to drop, and the seat should say so rather than this PR guessing.Local gates (every exit code captured before any pipe)
Green, exit 0, each verdict quoted from the gate's own last line:
pnpm check:skills-paths— ".claude/skills/ — 60/61 resolve across 4 file(s)" (theskills/root line above it also resolved)pnpm check:skill-eval-tokens— "Every must_contain token is taught by its own skill bundle." · its--self-test: "29 cases pass"node scripts/check-doc-links.mjs— "Links are valid across 17 scan roots."pnpm check:doc-fences— "every TypeScript block in 227 document(s) is fenced ts/tsx/typescript"pnpm check:doc-example-ids— "415 real reference(s) all resolve in the catalog registry."pnpm check:doc-types— "Every documented component type is registered." ·pnpm check:prompt-keys— "OK"node scripts/check-doc-expression-carriage.mjs— exit 0 (census ran)node scripts/check-changeset-presence.mjs— "No source or published contract of a released package changed in this range, so no changeset is owed." ⇒ no changeset file addedpnpm check:changeset-claims— exit 0 ·pnpm check:control-bytes— "OK (scanned 10213 tracked text file(s))"node scripts/check-new-cross-file-line-citations.mjs— "0 new citation(s)"node scripts/check-shell-escape-residue.mjs— "OK (5/5 root(s) resolved … skills: 16 file(s), 211 fence(s)"pnpm check:pre-install-import-graph— "OK"pnpm check:governed-queue-guard(self-test) — "188 cases pass" ·node scripts/check-governed-queue-guard.mjs --test skills/objectui/guides/schema-expressions.md— "⛔ GOVERNED — 1 of 1 path(s) … skills/** x1 — the published skills catalog" (exit 3, the expected answer for this PR)NOT MEASURED locally, declared narrowings (CI runs each with its scoped build):
pnpm check:skill-examplescompiler leg — needs the 12-package closure its--build-filternames; the shared verification lock was never acquired in two 540-second waits (holder: theissue-21465gate run,os-verify-lock.sh --status). The gate judges MARKED fences only, andcheck-skill-examples.mjs --listnames 0 candidate fences inschema-expressions.md; this diff edits prose inside one bullet and no fence anywhere, so the verdict is invariant to it. Its--self-testscanner leg ran; the compiler leg answered "PRECONDITION NOT MET (exit 2)" on the unbuilt tree, which is not a measurement.pnpm check:doc-snippetsandpnpm check:doc-examples— their population isDOCS_ROOT = 'content/docs',ROOT_PAGES = ['README.md']and the package READMEs;skills/**is deliberately outside it (check-doc-component-types.mjsheader: "notskills/**, notdocs/**"), so this diff cannot move them.pnpm lint— narrowed, three pieces atfa1c5e7: ① the population, read fromeslint.config.js's ownfiles:globs, is**/*.{ts,tsx}plus a few named.tsfiles; ②eslint --format jsonon the touched file returns one result entry witherrorCount: 0and the single message "File ignored because no matching configuration was supplied" — 0 files linted; ③ invariance: the config declares noprojectService/parserOptions.project(0 matches), so no type-aware rule exists whose verdict on an untouched file a Markdown edit could move.ci.yml/lint.ymlheavy steps skip on a Markdown-only diff by their own in-job switch; this PR is exactly that case.维护者速读(草稿)
改了什么。 只改
skills/objectui/guides/schema-expressions.md里「CEL predicates over a row record」一节的一条 bullet:原来说原生{ field, operator, value }规则和{ expression }模板规则「仍然可用、会被透明改写成 CEL」,现在说:三个列表承载面(grid、list view、kanban)都只接受{ condition, style }作为可编写的条件格式规则,两种旧形式已退役、schema 门按名拒收并给出改写;已存储的旧规则仍经共享求值器渲染(兼容读,不是编写形式);带旧语法的condition字符串仍走旧引擎并一次性告警。净 +1 行(7 → 8)。为什么改。 objectui#11522(kanban,PR #11532)与 objectui#11533(grid / list view,PR #11540)落地后,指南这条与代码矛盾:照它写规则的作者或 AI 会被校验器拒收。分诊裁决定为「一次受管编辑,等 #11533 落地后写最终事实」,#11533 已落地,本 PR 按第一分支写。
风险与代价(含回滚)。 纯文档、单文件、不发版(changeset 门禁判「无需声明」)。风险只有措辞与代码不一致,已用 safeParse 探针和仓内 105 个 pin 测试按内容核对。回滚 = revert 这一个 commit。
席位意见。 (留空,由席位定稿)
你要做的。 在本 PR 上留一条 APPROVED review(受管面
skills/**,队列守卫要求os-zhuang/hotlong的批准记录),之后由席位翻 ready 并入队。Acceptance notes
object-kanbanthe{ expression }key is refused through the spec element's inherited strictness ("Unrecognized key(s) … Did you meanexpression→condition?"), whileobject-grid/list-viewcarry a namedexpressiontombstone (gridRuleKeyRetired). Both refusals are loud and both name the respelling, so the guide's "refused at the schema door by name with the respelling" holds on all three; the asymmetry is wording, not behaviour, and is below the filing bar.equals…in) or the?.legacy marker; the operator-to-CEL table now lives only in the refusal messages (gridRuleKeyRetired/kanbanRuleKeyRetired), which is where an author meets it.pnpm installthrough the shared verification lock; the contract lists install among the runs that do not take it. The contract was followed (install ran unlocked, 6.6 s); builds and the test run took the lock.issue-ui-11534blocks nobody (a parked place, by the lock's own status text); it expires with this session.session_01CB6W87z22K2yjUCDyVrJRk; no model identifier appears in this PR, its commit or the guide.Generated by Claude Code