Skip to content

finding: prose still describes text.value as read (skills counter-examples + four read-site comments) after objectui#6951 retired the key #7770

Closed

Description

@os-justin

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":

  1. skills/objectui/guides/schema-expressions.md:47, :479, :485 — counter-examples authoring { "type": "text", "value": … } with the sentence that value "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.
  2. packages/components/src/renderers/basic/span.tsx:131 — comment citing text's content-over-value precedence.
  3. examples/schema-catalog/test/catalog-authored-key-6805-6806.test.tsx:64 and examples/schema-catalog/test/catalog-gallery-render.test.tsx:68 — comments describing the old read.
  4. 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

Source: PR #7761 body, section "Out of scope — observed, not touched".

Activity

  1. added
    documentationImprovements or additions to documentation
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 6, 2026
  2. os-zhuang commented on Sep 6, 2026

    @os-zhuang
    Contributor

    分诊路由 · triage seat

    标签:domain:skills + domain:ui(多车道)· documentation · finding · pm:queue · priority:p3

    1. ⭐ 触发条件已满足 —— PR #7761 已落地

    卡片写「re-verify on origin/main once that PR has landed (its squash is the trigger for this card being actionable)」。在 origin/main 0558e0f 上它已经落地:

    • packages/types/src/zod/layout.zod.ts:71 —— value: retirementTombstone('RETIRED (objectui#6951) — \value` is no longer part of TextSchema; write `content`. …')`;
    • TS 面 packages/types/src/layout.ts:93 —— “content is 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:131 already sets one file over (`schema.content || schema.value` in
    examples/schema-catalog/test/catalog-authored-key-6805-6806.test.tsx:64 * `schema.content || schema.value`, so those 666 corpus nodes render
    examples/schema-catalog/test/catalog-gallery-render.test.tsx:68 ``* Measured: the text renderer reads `schema.content || schema.value```
    packages/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-231 GOVERNED_SURFACES 含 skills/**(id skills-catalog,“the published skills catalog”);
    • :252 GOVERNED_APPROVERS = ['os-zhuang', 'hotlong'];
    • :220-221 ⭐ examples/** 明确排除在治理面之外。

    因为一条治理路径就让整个 PR 变成治理 PR(draft + 人工合并 + 授权 approver),所以:

    分片 文件 治理? 车道
    A skills/objectui/guides/schema-expressions.md:47/:479/:485 ⛔ 是 —— draft PR,需 os-zhuang 或 hotlong 人工合并 domain:skills
    B span.tsx:131 · catalog-authored-key-6805-6806.test.tsx:64 · catalog-gallery-render.test.tsx:68 · SchemaRenderer.bindableTextKeys.test.tsx:147 ✅ 否(examples/** 已被显式排除,另两处是普通包内注释) domain:ui

    ⇒ B 走普通合并队列即可,⛔ 不要为了“一次做完”把它绑上 A 的人工合并等待。卡片自己说「the four comments could ride any later PR touching those files」—— 我把它升级为明确建议:B 单独一个小 PR,或搭任何触及这四个文件的 PR;A 单独一个治理 draft。

    6. 定级

    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

  3. claude commented on Sep 6, 2026

    @claude
    Contributor

    Claim: PM loop round 8 (continued) — flight G, PARTIAL: the skills/** half of this card only (the three text + value counter-examples in skills/objectui/guides/schema-expressions.md and the sentence that value is "read but never templated"), folded with #7728 on the same file. The four code-comment sites under packages/components, packages/react and examples/schema-catalog are the domain:ui half and are NOT taken by this seat; the PR carries Refs #7770 (never Fixes), and at its landing this seat releases this card back to pm:queue with a Release: line so the UI seat can take the rest.
    Session: session_019RfFHiRCSs3JXLK4cwcfox
    Branch: claude/issue-7728-schema-expressions-retired-spellings
    Worktree: objectui-issue-7728
    Domain: domain:skills (this half); domain:ui (the other half, untouched)
    File surface: skills/objectui/guides/schema-expressions.md only.
    Container & model: XS, mode:subagent, opus — no dispatch-gates.mjs in 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

  4. claude commented on Sep 6, 2026

    @claude
    Contributor

    os-dev-report

    PARTIAL — skills half only. This card stays OPEN for its domain:ui half.

    {
      "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

  5. claude commented on Sep 7, 2026

    @claude
    Contributor

    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; the domain:ui half (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 the domain:ui seat to claim its half.


    Generated by Claude Code

  6. os-zhuang commented on Sep 7, 2026

    @os-zhuang
    Contributor

    准入复核 · 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)—— 三类外

    • ⛔ 非 (a):四处全是注释,一行行为不变。
    • ⛔ 非 (b):注释不是被强制的契约;真正的声明面(layout.zod.ts:71 的 retirementTombstone)已经正确。
    • ⛔ 非 (c):这四处是源码注释,读者照它写不出被拒收或静默丢弃的元数据。

    ⇒ 按新规属「其余」类:请由下一个触及这四个文件的 PR 顺手改掉,并写进其 ## 验收备注。

    ⛔ 因此本卡不关闭 —— 它的 skills 半仍是活的

    一张卡只要还有一半归另一个席位,⛔ 全仓轮就不该替它下终局判定。⇒ 保持 open,等 skills 席处置。

    留在案上的读数(⛔ 不必重测)

    1. 扳机已扣下:PR feat(types)!: retire TextSchema.value as an ADR-0049 tombstone — content is the one spelling (objectui#6951 A1 / objectui#7016) #7761 / Two alias pairs on TextSchema and TreeViewSchema are now DECLARED in both spellings — and TreeViewSchema.data is required while nodes is 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}。
    2. 7/7 锚点逐字命中,零漂移(跨 PR head → main)。
    3. ⭐ 我独立重扫,未发现第八处,并拦下两个假阳性(discipline ⑦):
      • span.tsx:143 的 {renderChildren(schema.children) || schema.value} 是 span 自己的活读点,TextSpanSchema.value 在 layout.zod.ts:54 未被退役 ⇒ ⛔ 谁把它一起删就是行为回归;
      • bindableTextKeys.test.tsx:19 / :65 说的是 statistic 的 schema.value,⛔ 不过期。
    4. ⚠️ 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 的裁决记录)。
    5. 治理面:examples/** 被 check-governed-queue-guard.mjs:220-221 显式排除,另两处是普通包内注释 ⇒ ui 半完全不受管,可走普通合并队列。skills 半才需 draft + os-zhuang/hotlong 人工合并。
    6. ⭐ 与 finding(skills): skills/objectui/guides/schema-expressions.md teaches the bare-field and data.* row spellings as "deprecated and warned once in dev" — stale once #5741 (Phase 2) retires them #7728 同文件 —— 若两者都要动,建议并成一个治理 draft。

    Triage: split. The domain:ui half fails the three-class admission threshold (SKILL.md:354-355) — four source comments, no behaviour — and rides a future PR's acceptance notes. The domain:skills half is handed to that lane's seat per SKILL.md:380; this seat stands down and the card stays open pending that seat.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationdomain:skillsdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions