Skip to content

docs(skills): schema-expressions.md states { condition, style } as the only authorable conditional-formatting rule on every list carrier (objectui#11534) - #11595

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-11534-schema-expressions-legacy-rule-retired
Oct 4, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-11534-schema-expressions-legacy-rule-retired

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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/**, the skills-catalog item of GOVERNED_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

  • Authoring takes { condition, style } only, on every list carrier (grid, list view, kanban).
  • The native { field, operator, value } form and the { expression: "${…}" } template form are retired, refused at the schema door by name with the respelling.
  • A STORED legacy rule still renders through the shared evaluator — a compatibility read, not an authoring form.
  • A condition string 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/main bdc9049

Cited 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 with safeParse on ObjectKanbanSchema, ObjectGridSchema and ListViewSchema (one tsx run against the packages/types source; the spec-shape { condition, style } rule was the positive control and parsed on all three):

carrier native { field, operator, value, backgroundColor } { expression, backgroundColor } control
object-kanban refused at field / operator / value / backgroundColor: "belongs to the native kanban rule dialect … which object-kanban's conditionalFormatting no longer accepts: RETIRED (objectui#11522), with no alias window. A rule is { condition, style }" (kanbanRuleKeyRetired) refused: "Unrecognized key(s) on this conditional formatting rule: expression. Did you mean expression → condition?" (the spec element's own strictness, inherited by KanbanConditionalFormattingRuleSchema) success
object-grid refused at each key: "belongs to the native rule dialect … which conditionalFormatting on object-grid and list-view no longer accepts: RETIRED (objectui#11533), with no alias window" (gridRuleKeyRetired) refused at expression: "expression is the template predicate of the native rule dialect … RETIRED (objectui#11533)" success
list-view same gridRuleKeyRetired refusal (the member is ConditionalFormattingRuleSchema, one declaration shared by the two mirrors) same named expression refusal success

Pinned 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") and grid-list-view-conditional-formatting-11533.test.ts ("refuses expression BY NAME, with the condition respelling"; "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. resolveConditionalFormatting in @object-ui/core (listConditional.ts) normalises a rule through ruleToPredicate: condition first, then a non-blank expression string, then fieldOperatorValueToCel for 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 is isLegacyDialectSource + warnLegacyDialect (warn-once per source). Pinned by listConditional.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 readings

reading before (origin/main bdc9049) after (fa1c5e7)
the bullet 7 lines 8 lines (+1)
guides/schema-expressions.md 639 640
whole package, every SKILL.md under skills/ (1 file) 142 142
whole package, every .md under skills/ (16 files) 4811 4812
hits of "still work and are rewritten to CEL" in the guide 1 0

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 ("a condition in 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)" (the skills/ 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 added
  • pnpm 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-examples compiler leg — needs the 12-package closure its --build-filter names; the shared verification lock was never acquired in two 540-second waits (holder: the issue-21465 gate run, os-verify-lock.sh --status). The gate judges MARKED fences only, and check-skill-examples.mjs --list names 0 candidate fences in schema-expressions.md; this diff edits prose inside one bullet and no fence anywhere, so the verdict is invariant to it. Its --self-test scanner leg ran; the compiler leg answered "PRECONDITION NOT MET (exit 2)" on the unbuilt tree, which is not a measurement.
  • pnpm check:doc-snippets and pnpm check:doc-examples — their population is DOCS_ROOT = 'content/docs', ROOT_PAGES = ['README.md'] and the package READMEs; skills/** is deliberately outside it (check-doc-component-types.mjs header: "not skills/**, not docs/**"), so this diff cannot move them.
  • pnpm lint — narrowed, three pieces at fa1c5e7: ① the population, read from eslint.config.js's own files: globs, is **/*.{ts,tsx} plus a few named .ts files; ② eslint --format json on the touched file returns one result entry with errorCount: 0 and the single message "File ignored because no matching configuration was supplied" — 0 files linted; ③ invariance: the config declares no projectService / parserOptions.project (0 matches), so no type-aware rule exists whose verdict on an untouched file a Markdown edit could move.
  • The ci.yml / lint.yml heavy 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

  • Observation, not filed: on object-kanban the { expression } key is refused through the spec element's inherited strictness ("Unrecognized key(s) … Did you mean expression → condition?"), while object-grid / list-view carry a named expression tombstone (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.
  • Observation, not filed: the guide's bullet no longer lists the native operators (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.
  • Dispatch-prompt conflict noted per the dev contract: the prompt routed pnpm install through 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.
  • The dev's kept lock slot issue-ui-11534 blocks nobody (a parked place, by the lock's own status text); it expires with this session.
  • Written by the objectui dev seat for session session_01CB6W87z22K2yjUCDyVrJRk; no model identifier appears in this PR, its commit or the guide.

Generated by Claude Code

…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>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: fa1c5e796f3558739559e1dd1ef70ef6f4bc9e6b
Local-runs: probe — node scripts/check-governed-queue-guard.mjs --test skills/objectui/guides/schema-expressions.md run once in the shared objectui checkout to read this PR's governed classification (GOVERNED, skills/**, exit 3); nothing built, nothing else run.

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 origin/main, and this head's check-runs. Reviewed by the dispatch seat in seat (served tier equals the constant's value, read from get_session). Review face: skills/** on the objectui board, governed guide text (Tier H). Readings taken at 2026-10-04T04:37Z.

① Derived judgments

  • Accept set: unchanged. Prose in one published guide (skills/objectui/guides/schema-expressions.md, +8/−7, the one bullet under "CEL predicates over a row record"); no schema, export, lint rule, error code or runtime behaviour moves. Clause-②: no holds.
  • The ruling's first branch, each part read by this seat off the diff: the bullet says authoring takes { condition, style } only on every list carrier (grid, list view, kanban); it names the native { field, operator, value } form and the { expression: "${…}" } template form as retired and refused at the schema door by name with the respelling; one clause says a STORED legacy rule still renders through the shared evaluator as a compatibility read, not an authoring form. The sentence "still work and are rewritten to CEL" is gone (0 hits on the head). No other line of the guide changes.
  • The premise, re-read by this seat on objectui origin/main: packages/types/src/zod/objectql.zod.ts carries gridRuleKeyRetired (the grid and list-view native and expression tombstones, "RETIRED (objectui#11533)") and kanbanRuleKeyRetired (the kanban native tombstone, "RETIRED (objectui#11522)"), each pinned by its own test (grid-list-view-conditional-formatting-11533.test.ts, kanban-conditional-formatting.test.ts); packages/core/src/evaluator keeps isLegacyDialectSource and the legacy-dialect routing with its warn-once, pinned by listConditional.test.ts. The dev's safeParse probe and the 105 passing pin tests agree with that reading.
  • The retained last clause (a condition in legacy-only syntax still routes to the old engine with a one-time deprecation warning; write CEL): the seat keeps it — the ruling retires authoring forms, not the dialect-routing fact, and the guide's section frames these bullets as renderer-side facts that live nowhere else. The dev's open_questions[0] is answered A on the ACCEPT.

② Semver level

  • No released package publishes from this diff; scripts/check-changeset-presence.mjs answers "no changeset is owed", so no changeset file is in the PR and none is declared. No ADR-0087 disposition applies.

③ Boundary flags

  • Dev flags: open_questions[0] (net zero vs +1) is answered A, above. out_of_scope_findings[0] (the kanban { expression } refusal comes through the spec element's strictness while grid and list view carry a named tombstone — both loud, both name the respelling): below the filing bar, Acceptance notes.
  • Line reading, this seat's own: 639 → 640 (the bullet 7 → 8); objectui's catalog carries no line or token gate on guides, and no gate went red.
  • Deviations read: pnpm install outside the verify lock (the dev contract's own exemption), the parked lock slot, and the +1 line against the dispatch's net-zero goal — recorded, no action. NOT MEASURED locally and declared: check:skill-examples' compiler leg (its population is marked fences only; the guide has none in this bullet) and check:doc-snippets / check:doc-examples (population excludes skills/**); CI runs them with their own builds. mcp_calls 0; api_writes 4 over 3 dispatches as listed; report comment 5976607688 present and parses; no path:line citation in the PR body (objectui rule 11).
  • Check-runs on this head at this write: 24 success, 3 skipped, 11 in progress — the enqueue gate reads them at landing, not this record.

Implemented-by: claude/issue-11534-schema-expressions-legacy-rule-retired
Reviewed-by: session_01CB6W87z22K2yjUCDyVrJRk

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)— PR #11595(objectui#11534)· skills seat 1 · 2026-10-04T04:38Z

改了什么: 对外发布的 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 里写旧语法(${…}、===、.includes())仍会路由到旧引擎并给一次性弃用警告 —— 写 CEL。一文件 +8/−7,639 → 640 行。

为什么改: objectui#11522 与 #11533 已把这条原生规则从 kanban、grid、list view 三个作者面退役(objectql.zod.ts 里的 kanbanRuleKeyRetired / gridRuleKeyRetired 墓碑,各有 pin 测试),技能却还在教 AI 作者「仍然可用」—— 照着写会被校验器拒收。分诊裁决:等 #11533 落地后一次改成最终真相(它已于 10-03 落地),本 PR 即是那一次。

风险与代价(含回滚): 纯技能文本,不碰 packages/**,不欠 changeset(check-changeset-presence 答无);席内契约复核 PASS(本 PR 上一条评论),席位在 objectui origin/main 上逐项核过墓碑与求值器;本地 doc / skills / changeset / governed-guard 门禁全绿,CI 此刻 24 绿、3 skip、11 在跑。回滚 = revert 单个 commit fa1c5e7。dev 问过「是否删掉最后一句以保持净零行」,席位裁定保留:那句是仍成立的渲染侧事实,裁决退役的是作者化形式,不是它,本目录也无行数门禁。

席位意见: 建议批准。一条 bullet、一次人工审阅,措辞与裁决第一分支逐项对应;PR 正文无 path:line 引用(本仓规则 11)。

你要做的(一个动作): 在 objectui PR #11595 上给一次 APPROVED review;批准后由席位清标、ready、挂 auto-merge 入队。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants