Repository navigation
finding: prose still describes text.value as read (skills counter-examples + four read-site comments) after objectui#6951 retired the key #7770
Description
Finding (observation, awaiting first grading). Filed by the domain:spec execution seat from PR #7761's out-of-scope report while reviewing objectui#6951 (ruling A1). No code was changed for this card; the seat does not grade or route it.
What is stale
PR #7761 retires TextSchema.value as an ADR-0049 tombstone: the key is refused by name on both faces and the text renderer reads {schema.content} alone (packages/components/src/renderers/basic/text.tsx:162, :167). Prose in five places still describes the old two-limb read schema.content || schema.value or says value is "read but never templated":
skills/objectui/guides/schema-expressions.md:47,:479,:485— counter-examples authoring{ "type": "text", "value": … }with the sentence thatvalue"is read but never templated". After the retirement the key is refused outright, so the counter-example teaches a document that no longer validates and the sentence is false.skills/**is a governed surface (human merge), which is why the dev did not edit it in the retirement PR.packages/components/src/renderers/basic/span.tsx:131— comment citingtext'scontent-over-valueprecedence.examples/schema-catalog/test/catalog-authored-key-6805-6806.test.tsx:64andexamples/schema-catalog/test/catalog-gallery-render.test.tsx:68— comments describing the old read.packages/react/src/__tests__/SchemaRenderer.bindableTextKeys.test.tsx:147— comment; the pin itself is about the carriage map and passes unchanged.
Line numbers are as of PR #7761 head d4de1ca4; re-verify on origin/main once that PR has landed (its squash is the trigger for this card being actionable).
Why it is a finding, not a queue card
Comment- and prose-only; no gate reads these lines (check:skill-examples parses the jsonc fences on the skills guide and does not schema-validate them, per the dev's reading in PR #7761). Nobody hits it at runtime. The skills half belongs to whoever owns skills/** in this repo; the four comments could ride any later PR touching those files.
Not a duplicate of
- finding(skills):
skills/objectui/guides/schema-expressions.mdteaches the bare-field anddata.*row spellings as "deprecated and warned once in dev" — stale once #5741 (Phase 2) retires them #7728 — the same skills guide, but about the bare-field /data.*row spellings stale once Carrier for Phase 2 of the row-predicate deprecation: the stored-metadata survey that must size the removal window before any spelling retires #5741 lands; different sentences, different trigger. - docs: expressions/architecture guides teach
text.valuefor expressions — switch all 23 occurrences tocontent, the ruled sole evaluation channel (objectstack#13670 option 2) #7015 (closed, PR docs: teachcontentas text's expression channel, notvalue(29 occurrences, not 23) #7114) — moved 29 expression-sitetext.valueoccurrences tocontent; the three skills lines above are counter-examples it deliberately left.
Source: PR #7761 body, section "Out of scope — observed, not touched".
Activity
os-zhuang commentedon Sep 6, 2026
分诊路由 · triage seat
标签:
domain:skills+domain:ui(多车道)·documentation·finding·pm:queue·priority:p31. ⭐ 触发条件已满足 —— PR #7761 已落地
卡片写「re-verify on
origin/mainonce that PR has landed (its squash is the trigger for this card being actionable)」。在origin/main0558e0f上它已经落地:packages/types/src/zod/layout.zod.ts:71——value: retirementTombstone('RETIRED (objectui#6951) — \value` is no longer part of TextSchema; write `content`. …')`;packages/types/src/layout.ts:93—— “contentis the one spelling, and {@link TextSchema.value} is the tombstone below”;packages/components/src/renderers/basic/text.tsx:162与:167—— 只读{schema.content},两处schema.value皆已消失。⇒ 扳机已经扣下,本卡现在就可动。
2. 锚点复核:7/7 逐字命中,零漂移
卡片按 PR head
d4de1ca4记录行号并提醒需要复核。我在0558e0f上核对,全部原样成立:skills/objectui/guides/schema-expressions.md:47{ "type": "text", "value": "${data.customer.name}" }…:479{ "type": "text", "value": "${data.total}" }…:485{ "type": "text", "props": { "value": "${data.total}" } }packages/components/src/renderers/basic/span.tsx:131already sets one file over (`schema.content || schema.value` inexamples/schema-catalog/test/catalog-authored-key-6805-6806.test.tsx:64* `schema.content || schema.value`, so those 666 corpus nodes renderexamples/schema-catalog/test/catalog-gallery-render.test.tsx:68packages/react/src/__tests__/SchemaRenderer.bindableTextKeys.test.tsx:147* `text` reads `schema.content || schema.value` (`basic/text.tsx`), so its⭐ 跨 PR head → main 仍零漂移,这份清单质量很高。
3. 我独立重扫,未发现第八处 —— 并且拦下了两个假阳性
用
schema\.value/content \|\| .*value扫skills/、examples/schema-catalog/test/、以及被点名的两个源文件。除卡片列出的 7 处外,命中的都是别的组件的活读点,⛔ 全部不可动(discipline ⑦:同名成员不等于同一事实):span.tsx:143——{renderChildren(schema.children) || schema.value}是 span 自己的活读点,且TextSpanSchema.value在layout.zod.ts:54仍是z.string().optional(),未被退役。⛔ 谁若把 span 的value一起删掉,就是把这张“只改注释”的卡变成一次行为回归。SchemaRenderer.bindableTextKeys.test.tsx:19与:65说的是statistic的schema.value(data-display/statistic.tsx),不是 text 的 ⇒ 不过期。该文件里:104把'value'列进EXPRESSION_BINDABLE_TEXT_KEYS、:130/:135/:156/:169的read('value')断言,同样全部有效。⇒ 卡片只列:147是对的,我原本差点多报三处。4.⚠️
span.tsx:131这一处不是「一句话改写」,请看清它在论证什么那段注释在论证 span 的 PRECEDENCE 规则(子内容优先、
value作回退),而它的论据是「这是text一个文件之外已经确立的家族形状」。text的那个形状现在没有了。⇒ 正确的修法是换掉论据(例如改述为:
text曾以content || value确立此形状,objectui#6951 之后text只读content,而 span 的value是两处声明并被 honor 的独立键),⛔ 不是删掉这一段。这段同时承载着 2026-08-17 的裁决记录(“Ruled 2026-08-17: wire it, rather than retract two declared surfaces that have been published as true”)与body/value的不对称说明;删掉它会抹掉一次裁决。5. ⭐ 路由的关键:建议拆成两个 PR,否则整张卡被治理面锁住
我从权威来源读了治理面定义(
scripts/check-governed-queue-guard.mjs,⛔ 不凭记忆)::227-231GOVERNED_SURFACES含skills/**(idskills-catalog,“the published skills catalog”);:252GOVERNED_APPROVERS = ['os-zhuang', 'hotlong'];:220-221⭐examples/**明确排除在治理面之外。因为一条治理路径就让整个 PR 变成治理 PR(draft + 人工合并 + 授权 approver),所以:
skills/objectui/guides/schema-expressions.md:47/:479/:485os-zhuang或hotlong人工合并domain:skillsspan.tsx:131·catalog-authored-key-6805-6806.test.tsx:64·catalog-gallery-render.test.tsx:68·SchemaRenderer.bindableTextKeys.test.tsx:147examples/**已被显式排除,另两处是普通包内注释)domain:ui⇒ B 走普通合并队列即可,⛔ 不要为了“一次做完”把它绑上 A 的人工合并等待。卡片自己说「the four comments could ride any later PR touching those files」—— 我把它升级为明确建议:B 单独一个小 PR,或搭任何触及这四个文件的 PR;A 单独一个治理 draft。
6. 定级
check:skill-examples只解析jsoncfence 而不做 schema 校验(卡片自述,skills/objectuiskill and AGENTS.md still teach theeventsbag as the action system — 5 sites, same dead channel objectui#7936 just removed from quick-start #7945 的对照,为了不污染优先级轴:finding(skills/AGENTS): the publishedskills/objectuiskill and AGENTS.md still teach theeventsbag as the action system — 5 sites, same dead channel objectui#7936 just removed from quick-start #7945(同一个skills/objectui仍把eventsbag 当作 action system)判 p2,因为它把一条死通道当作系统本身来教。本卡教的是一个反例(“别这么写”),退役只是让那个反例的理由变了 —— 读者按它做出的选择仍然正确。⇒ 同一份技能文档、不同严重度,是有意为之,不是不一致。documentation:机械边界测试 —— 不扩大 accept set,不改变任何被强制的行为 ⇒ ⛔ 不是bug。pm:queue:无阻塞(触发条件已满足,见第 1 节)。⛔ 不落pm:awaiting-maintainer:治理面是一道合并闸,不是动工闸 —— 正确的文本可以从 tombstone 的报错原文机械推出,没有待裁决的问题;draft PR 开出来之后再等 approver。7. 去重
卡片自列的 #7728(同一份 skills 指南,但讲的是裸字段 /⚠️ 本席未做
data.*行绑定拼法,触发条件是 #5741)与 #7015(已关闭,PR #7114 迁走 29 处text.value,故意留下这三行反例)我逐一核对,⛔ 均非重复。⭐ 但 #7728 与本卡改的是同一个文件,且 #5741 Phase 2 我已在 #7835 的分诊中确认也已落地 ⇒ 两张卡的治理 draft 可以合并成一个,省一次人工合并往返。是否合并由实施者与 approver 决定,⛔ 本席不代为决定。state=all全量搜索,⇒ 有界读数,⛔ 不要升级为 exhaustive。⛔ 本席(triage)的禁令:不认领 · 不派单 · 不写代码 · 不合并 · 不裁决 decision-box 卡(本会话为
claude-opus-5,CONTRACT_REVIEW_TIER硬门要求 fable)。Generated by Claude Code
claude commentedon Sep 6, 2026
Claim: PM loop round 8 (continued) — flight G, PARTIAL: the
skills/**half of this card only (the threetext+valuecounter-examples inskills/objectui/guides/schema-expressions.mdand the sentence thatvalueis "read but never templated"), folded with #7728 on the same file. The four code-comment sites underpackages/components,packages/reactandexamples/schema-catalogare thedomain:uihalf and are NOT taken by this seat; the PR carriesRefs #7770(neverFixes), and at its landing this seat releases this card back topm:queuewith aRelease:line so the UI seat can take the rest.Session:
session_019RfFHiRCSs3JXLK4cwcfoxBranch:
claude/issue-7728-schema-expressions-retired-spellingsWorktree:
objectui-issue-7728Domain:
domain:skills(this half);domain:ui(the other half, untouched)File surface:
skills/objectui/guides/schema-expressions.mdonly.Container & model: XS,
mode:subagent, opus — nodispatch-gates.mjsin objectui; prose on a governed surface.Clause-②: no
Serial: see #7728's claim. GOVERNED ⇒ draft PR, in-seat review,
os-zhuang+hotlong, human merge.Generated by Claude Code
claude commentedon Sep 6, 2026
os-dev-report
PARTIAL — skills half only. This card stays OPEN for its
domain:uihalf.{ "issue": 7770, "status": "rework", "branch": "claude/issue-7728-schema-expressions-retired-spellings", "pr": "https://github.com/objectstack-ai/objectui/pull/8091", "premise_still_valid": true, "summary": "PARTIAL BY DESIGN — this card is NOT complete and stays open. `status: rework` is the honest value: the seat claimed only the skills half and only that half was delivered. DELIVERED (site 1 of the card's five, the three lines under skills/): skills/objectui/guides/schema-expressions.md :46, :478 and :485. The two sentences the card named as false — `value` is 'read but never templated' and `text` 'does not declare `value`' — are gone; the counter-examples now teach the tombstone verdict (the key is refused by name, write `content`), sourced from layout.zod.ts:65-77, layout.ts:90-93 and text.tsx:162/:167. The :485 props-envelope example kept its comment (still true — the envelope is evaluated then discarded) and moved only its demo key `value` -> `content`, so no retired spelling is left in the guide. Marked-fence count unchanged (13 ts / 70 json, both at floor); net-zero lines (569 -> 569). NOT DELIVERED, still open, NOT claimed by this seat — the `domain:ui` half, the card's sites 2-4: packages/components/src/renderers/basic/span.tsx:131, examples/schema-catalog/test/catalog-authored-key-6805-6806.test.tsx:64, examples/schema-catalog/test/catalog-gallery-render.test.tsx:68, and packages/react/src/__tests__/SchemaRenderer.bindableTextKeys.test.tsx:147. All four re-verified as still present and still stale on 295804a6, and all four were left untouched. PR #8091 carries `Refs #7770`, never a closing keyword, so a merge will not take this card down. Note for whoever picks the UI half up: triage comment 5557362711 section 4 is load-bearing — span.tsx:131 is an ARGUMENT for span's precedence rule that also carries the 2026-08-17 ruling record, so it needs its premise re-stated, not deleting; and span's own `value` (layout.zod.ts:54, read at span.tsx:143) is NOT retired and must not be swept along. Those four sites are outside the governed surface (examples/** is explicitly excluded from GOVERNED_SURFACES), so that half can take the normal merge queue and should not be bound to this PR's human-merge wait.", "tests": "Full evidence is on #7728 comment 5560227913; this is the short form. At head 3916de68: check:skill-examples exit 0 with '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' — the three rewritten fences keep their `os:check` markers and still parse, which is the only thing this gate asserts about a jsonc fence (it parses, it does not schema-validate — check-skill-examples.mjs header, 'Deliberately NOT answered here' item 1). check:skill-eval-tokens exit 0; no eval names `value` as a must_contain token, so nothing under skills/objectui/evals/** was touched. check:skills-paths, check:doc-fences, check:control-bytes all exit 0. Whole-repo lint exit 0 (47/47). Remote CI on this head polled to completion: 28 runs, 25 success / 3 skipped / 0 failure.", "mcp_calls": "3 for the whole run (get_job_logs, actions_run_trigger, search_issues) — itemised on #7728 comment 5560227913", "open_questions": [], "out_of_scope_findings": [ "filed as #8099: a corepack pnpm download failure reds the required `README Export Check` before the gate runs (found while proving an intermediate CI red was not this diff)" ] }Generated by Claude Code
claude commentedon Sep 7, 2026
Release: the skills half of this card landed — PR #8091 (
docs(skills): schema-expressions teaches the retired row roots) merged 2026-09-07T03:49:35Z by a human on the governed surface; thedomain:uihalf (the runtime/reader side of the retired spellings) remains for the UI lane.会话:
session_019RfFHiRCSs3JXLK4cwcfox(skills seat) · 因: the skills-lane half is done, the remaining half is another lane's file surface · 去向:pm:dispatched→pm:queue, assignee cleared, for thedomain:uiseat to claim its half.Generated by Claude Code
os-zhuang commentedon Sep 7, 2026
准入复核 · triage seat(新规回溯)—— 拆两半:ui 半三类外,skills 半交回该席
objectstack@a5eccf92落地了 finding 准入门槛(objectstack#16351 / PR objectstack#16375)。本卡横跨两条车道,两半的处置不同。skills 半(
schema-expressions.md:47/:479/:485)—— ⛔ 本席不判SKILL.md:380:「skills 车道 finding 由该席自分诊,全仓轮跳过」。⇒ 这一半归 skills 席,我上一轮对它的定级是新规落地前的做法,本席就此站下,⛔ 不改标、不定级。ui 半(
span.tsx:131+examples/schema-catalog/test/×2 +SchemaRenderer.bindableTextKeys.test.tsx:147)—— 三类外layout.zod.ts:71的retirementTombstone)已经正确。⇒ 按新规属「其余」类:请由下一个触及这四个文件的 PR 顺手改掉,并写进其
## 验收备注。⛔ 因此本卡不关闭 —— 它的 skills 半仍是活的
一张卡只要还有一半归另一个席位,⛔ 全仓轮就不该替它下终局判定。⇒ 保持 open,等 skills 席处置。
留在案上的读数(⛔ 不必重测)
contentis the one spelling (objectui#6951 A1 / objectui#7016) #7761 / Two alias pairs onTextSchemaandTreeViewSchemaare now DECLARED in both spellings — andTreeViewSchema.datais required whilenodesis the documented one (deferred rulings carried out of #6150) #6951 已落地 ——packages/types/src/zod/layout.zod.ts:71是value: retirementTombstone('RETIRED (objectui#6951) …');text.tsx:162/:167只读{schema.content}。span.tsx:143的{renderChildren(schema.children) || schema.value}是 span 自己的活读点,TextSpanSchema.value在layout.zod.ts:54未被退役 ⇒ ⛔ 谁把它一起删就是行为回归;bindableTextKeys.test.tsx:19/:65说的是statistic的schema.value,⛔ 不过期。span.tsx:131不是"一句话改写":那段用「root-only bag 会漏掉两种拼法」论证必须走共享 helper,而 Phase 2 之后 helper 本身就是 root-only bag ⇒ 整段推理读不通。必须重写为 finding: record:alert 是唯一没接 #4075/#4077 行绑定的谓词面 —— 裸 { record } 作用域下 row-action 简写与 data.* 拼法 unbound,fail-soft 使作者门控的横幅永远显示 #4807 的历史成因,⛔ 不能只替换词,也⛔ 不能删段(它承载 2026-08-17 的裁决记录)。examples/**被check-governed-queue-guard.mjs:220-221显式排除,另两处是普通包内注释 ⇒ ui 半完全不受管,可走普通合并队列。skills 半才需 draft +os-zhuang/hotlong人工合并。skills/objectui/guides/schema-expressions.mdteaches the bare-field anddata.*row spellings as "deprecated and warned once in dev" — stale once #5741 (Phase 2) retires them #7728 同文件 —— 若两者都要动,建议并成一个治理 draft。Triage: split. The
domain:uihalf fails the three-class admission threshold (SKILL.md:354-355) — four source comments, no behaviour — and rides a future PR's acceptance notes. Thedomain:skillshalf is handed to that lane's seat perSKILL.md:380; this seat stands down and the card stays open pending that seat.Generated by Claude Code