Skip to content

docs(skills): schema-expressions teaches the retired row roots and the text.value tombstone - #8091

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-7728-schema-expressions-retired-spellings
Sep 7, 2026
Merged

docs(skills): schema-expressions teaches the retired row roots and the text.value tombstone#8091
os-zhuang merged 1 commit into
mainfrom
claude/issue-7728-schema-expressions-retired-spellings

Conversation

@claude

@claude claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Fixes #7728
Refs #7770 — skills half ONLY. The four code-comment sites under packages/components, packages/react and examples/schema-catalog are the domain:ui half and are untouched here; that card stays open for them.

What this is

One file, skills/objectui/guides/schema-expressions.md, net-zero lines (569 before, 569 after; 9 insertions / 9 deletions). Two cards land together because they are the same file, the same rules-only register and the same governed merge gate — the triage seat suggested folding them on both cards (comment 5557462199 §5, comment 5557362711 §7) so the approver merges this file once rather than twice.

Every os:check marker is kept, so the marked fence population is unchanged.

改前 → 改后

Site Before After Authority in the tree
:277-282 (#7728) "The row binds three ways — record.status (canonical), bare status and data.status, the last two deprecated and warned once in dev" "A row predicate binds ONE root, record.*; a bare status or data.status is retired there and faults on the runtime engine (Unknown variable), under each surface's existing error policy; data stays canonical only on the metadata-editing layer" packages/core/src/evaluator/rowPredicateCanon.ts:23-28 ("Phase 2 … retired them … and the Phase-1 warning went with them"), the spelling table at :36-40, the fault-policy sentence at :42-51, and the layer scoping at :60-69 (CANONICAL_ROOT_BY_LAYER = { runtime: 'record', metadata: 'data' })
:46 (#7770) "text does not declare value — renders the literal ${data.customer.name}" "value is RETIRED from text — refused by name; write content" packages/types/src/zod/layout.zod.ts:65-77 (ADR-0049 retirement tombstone, "value is no longer part of TextSchema; write content"), packages/types/src/layout.ts:90-93
:478 (#7770) "❌ Won't evaluate — value is read but never templated" "❌ Refused by name — value is RETIRED from text; write content" same tombstone; the renderer reads {schema.content} alone at packages/components/src/renderers/basic/text.tsx:162 and :167 — the value limb is gone, so "read but never templated" is false in both halves
:485 (#7770) { "type": "text", "props": { "value": "${data.total}" } } { "type": "text", "props": { "content": "${data.total}" } } Comment unchanged and still true (the props envelope is evaluated then discarded, exactly as the card fence at :34-35 teaches). Only the demo key moved to the live one: leaving a retired spelling directly under a counter-example that has just said value is refused invites the reading "value is the key, just not in props".

The sentence #7728 asked to KEEP is kept: the authoring oracle still accepts data.* silently, and that is still why the bullet exists.

What is deliberately NOT changed

value stays in the closed evaluated set sentence at :56-58 and :564 — it is template-evaluated on statistic and is not retired there. The retirement is TextSchema.value only. Verified per-type, not per-key: expressionBindableTextKeysFor('text') has length 0 while the set itself is ['title','label','value','description'] (packages/react/src/__tests__/SchemaRenderer.bindableTextKeys.test.tsx:104, :153-157).

Gates — every exit code captured before any pipe

Run at 3916de68, the head of this PR. Prerequisite: the scoped build the gate prints, pnpm exec turbo run build $(node scripts/check-skill-examples.mjs --build-filter) --concurrency=2 — 29/29 tasks successful.

Gate Exit Its own verdict line
pnpm check:skill-examples 0 "Marked: 13 ts fence(s) (floor 13), 70 json fence(s) (floor 70)" — identical before and after; "JSON phase: 70 fence(s) parsed, 0 failed"; "Every marked skill example holds up against the built types"
pnpm check:skill-eval-tokens 0 "Every must_contain token is taught by its own skill bundle." Red under the chosen bundle-wide oracle: 0
pnpm check:skills-paths 0 "OK (88/89 stated path(s) resolve across 20 guide file(s); 1 baselined)"
pnpm check:doc-fences 0 "every TypeScript block in 227 document(s) is fenced ts/tsx/typescript…"
pnpm check:control-bytes 0 "OK (scanned 6473 tracked text file(s); skipped 85 binary)"
node scripts/check-governed-queue-guard.mjs --test skills/objectui/guides/schema-expressions.md 3 "⛔ GOVERNED — 1 of 1 path(s) are on a governed surface: skills/** x1 — the published skills catalog"
node scripts/pm/check-half-states.mjs --self-test 0 "check-half-states self-test: 1574 cases pass."
node scripts/check-changeset-presence.mjs 0 "No source or published contract of a released package changed in this range, so no changeset is owed."
pnpm exec turbo run lint --concurrency=2 (whole repo) 0 "Tasks: 47 successful, 47 total" — 0 errors; the 10 warnings are pre-existing in @object-ui/collaboration and untouched by this diff

Two readings the dispatch asked for

  1. No gate in this repo enforces a skills/** line or token budget. Searched scripts/ and .github/workflows/ for a budget of either kind: zero matches. The three skills gates are check-skill-examples (a SHRINK-ONLY floor on the marked fence population, not on lines), check-skill-eval-tokens and check-skills-paths. The net-zero constraint honoured here is the triage seat's instruction, not a mechanical one — so nothing would have gone red had it been missed, which is the reason to state it rather than assume it.
  2. scripts/check-half-states.mjs does not exist at that path; the script is at scripts/pm/check-half-states.mjs, and that is what was run.

Governed surface

skills/** is GOVERNED_SURFACES' skills-catalog entry, so this PR stays a draft for a human merge by os-zhuang or hotlong. Not flipped ready, not enqueued, no auto-merge armed, and no approval left by this seat.

维护者速读(草稿)

这份已发布技能文档在教两条已经死掉的写法。 它是我们交付给使用者(以及使用者的 AI)的官方指南,读者照着写,写出来的元数据在今天的运行时是坏的。这次只改一个文件、只改措辞,行数净零。

第一处关于行谓词的根。 文档说「裸字段和 data.* 只是不推荐,开发模式下会警告一次」。树上已经不是这样了:运行期记录面现在只认 record.* 一个根,另外两种拼法直接报错,而那条警告本身也已经随之删掉。读者读到「只是不推荐」,会合理地继续用 data.status —— 这是把一条死通道当活通道教,是本次两处里更贵的一处。

第二处关于 text 组件的 value 键。 这个键已经按 ADR-0049 退役,schema 会指名拒绝它,渲染器也只读 content 了。文档里三个反例还在说它「被读取但不做模板求值」。反例本身没错(本来就不该那么写),但它给出的理由已经过期,而且示例里那份 JSON 现在根本通不过校验。

对业务的影响,以及为什么现在做。 两张卡的触发条件都已经落地(退役的两个 PR 都已合并到 main),所以这不是提前量,是补一笔欠账。影响面是编写者体验:错误的文档会让人写出跑不起来的页面,再来提工单;而这份文档正是我们对外宣称「照着它写就对」的那一份。改完之后,读者拿到的是当前真实的判定 —— 一个根、一个拼写,写错会响亮报错而不是静默出空白。

这次没有做什么。 valuestatistic 上仍然是合法且会求值的键,没有动;#7770 还剩四处代码注释在 packages/examples/ 下,属于 UI 车道,本 PR 不碰,那张卡继续开着。因为落点是受管的已发布技能目录,本 PR 停在 draft,等维护者合并。

席位意见

(留空 — 待席位评审填写)


Generated by Claude Code

…e `text.value` tombstone

The row-predicate bullet said the bare-field and `data.*` spellings were
"deprecated and warned once in dev". On `main` both are retired: a runtime
record surface binds `record.*` alone, the other two fault on the engine
(`Unknown variable`) under each surface's existing error policy, and the
Phase-1 warning was removed with them. `data` stays canonical one layer over,
on the metadata-editing form. The sentence that the authoring oracle still
accepts `data.*` silently is kept — it is still true and is why the bullet
exists.

The three `text` + `value` counter-examples said `value` is "read but never
templated" / that `text` "does not declare `value`". `TextSchema.value` is now
an ADR-0049 retirement tombstone refused by name, and the renderer reads
`schema.content` alone, so the counter-examples now teach that verdict. The
`props`-envelope counter-example keeps its lesson on the live key.

Net-zero lines (569 before and after); every `os:check` marker kept, so the
marked population is unchanged at 13 ts / 70 json.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

ACCEPT — governed in-seat review of PR #8091, head 3916de68 (skills seat, 2026-09-06T15:3xZ).

Implemented-by: claude/issue-7728-schema-expressions-retired-spellings (os-dev subagent, opus — no dispatch-gates.mjs in this repo; prose on a governed surface, no contract move)
Reviewed-by: session_019RfFHiRCSs3JXLK4cwcfox (skills seat)

Verified in a detached compare worktree at the PR head, not from the report:

Landing regime: governed (skills/**) ⇒ the PR stays a draft; reviewers os-zhuang + hotlong requested in this same act, needs-user-decision added, the final 维护者速读 posted as the next comment; human merge. On the merge #7728 closes by Fixes, and the seat releases #7770 (assignee cleared, Release: line, back to pm:queue) for its domain:ui half.


Generated by Claude Code

@claude
claude Bot requested review from hotlong and os-zhuang September 6, 2026 15:29
@claude claude Bot added documentation Improvements or additions to documentation needs-user-decision labels Sep 6, 2026
@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

维护者速读

事情:对外发布的 objectui 技能文档 schema-expressions.md 在教两条已经死掉的写法。使用者(和使用者的 AI)照着写,写出来的元数据在今天的运行时是坏的。只改一个文件、只改措辞,行数净零(569 → 569)。

第一处,行谓词的根:文档说「裸字段和 data.* 只是不推荐,开发模式下会警告一次」。树上已不是这样:运行期记录面只认 record.* 一个根,另外两种拼法直接报错,那条警告也随之删掉了。读到「只是不推荐」的人会合理地继续写 data.status——把死通道当活通道教,是两处里更贵的一处。

第二处,textvalue:已按 ADR-0049 退役,schema 指名拒绝,渲染器只读 content。文档里三个反例还在说它「被读取但不做模板求值」。反例本身没错,理由过期了,示例 JSON 现在也通不过校验。三个反例保留(os:check 标记数不变),注释改成当前判定。

没动什么:valuestatistic 上仍是合法键,没碰;#7770 剩下四处代码注释在 packages/examples/ 下,属 UI 车道,本 PR 只带 Refs,合并后席位把该卡放回队列给 UI 席。

要请您留意的:CI 中途一次红是 corepack 下载 pnpm 失败(门禁没跑就红),同一提交重跑即绿,dev 已立 #8099 给 CI 车道。

席位意见:建议合并。受管面(skills/**),人工合并;合并后 #7728 关闭。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 7, 2026 03:26
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 7, 2026
Merged via the queue into main with commit 92b59ad Sep 7, 2026
30 of 31 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-7728-schema-expressions-retired-spellings branch September 7, 2026 03:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-user-decision

Projects

None yet

2 participants