You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Triage: needs-user-decision, type Bug. The card itself says "needs a direction ruling, do not extrapolate from #4788", and triage agrees: the candidate fixes disagree on whether the answer is a semantic re-mapping (disabled → readonly, changing a deliberately-distinguished classification), a new public contract key (a display-only declaration on ComponentMeta), or per-widget pass-through — and adding a contract key is the manual floor.
⚠️Decide together with #4871 — same design axis, two hosts. #4871 (metadata-admin's SchemaForm + bare WIDGETS record) needs a per-widget labelling/display declaration for exactly the same reason this card's option 2 does. One ruling on "how does a host learn what a widget will render" should settle both; ruling them separately risks two divergent declaration shapes for one question.
Measured business pull: seven field types render with no accessible name and dead help text in every editable object form, measured against a 27-widget green control group.
AI-agent error-resistance: a declared labelling/display key is closed-enumeration and testable; the status quo (host infers from readonly) is the inference-that-silently-misses shape that produced this card. Note option 2's own trap, named by the card: an omitted declaration silently degrades — worth pairing with a registry-level gate.
Startup scope discipline: likely composite (3 for grid/slider/signature, 1-or-2 for the display-only four); the smallest honest fix is not uniform, which is itself why this needs a ruling.
Maintainer ruling (2026-08-17, recorded by PM session session_01NYgmGheCzM6NrHZN436Cxf). The maintainer accepted the decision-inbox report's recommendations in full, verbatim: 「同意」. Ruled together with #4871 — one declaration shape settles both hosts:
The declaration: the already-ruled ComponentMeta.labelling vocabulary (#3961) extends to a three-value closed enum — 'control' | 'group' | 'display' — as the single repo-wide answer to "how does a host learn what a widget will render". ⛔ No host-local variants. The declaration slice expands a public contract key ⇒ claude-fable-5 for that slice.
This card's landing:
grid / slider / signature → option 3: expand DOM pass-through onto their real labelable controls (host id lands, for resolves naturally).
⛔ Option 1 rejected — the disabled/readonly distinction is deliberate and stays; ObjectForm.tsx:687's mapping is not rewritten to buy a11y.
Companion gate required: a registry-level check that every registered widget carries a declaration — an omitted declaration fails loudly instead of silently degrading (the trap the card itself named).
Label flipped needs-user-decision → pm:queue in the same stroke. Sibling ruling on #4871.
Activity
os-zhuang commentedon Aug 17, 2026
Triage:
needs-user-decision, type Bug. The card itself says "needs a direction ruling, do not extrapolate from #4788", and triage agrees: the candidate fixes disagree on whether the answer is a semantic re-mapping (disabled→readonly, changing a deliberately-distinguished classification), a new public contract key (a display-only declaration onComponentMeta), or per-widget pass-through — and adding a contract key is the manual floor.SchemaForm+ bareWIDGETSrecord) needs a per-widgetlabelling/display declaration for exactly the same reason this card's option 2 does. One ruling on "how does a host learn what a widget will render" should settle both; ruling them separately risks two divergent declaration shapes for one question.Decision facets:
labellingshape from [fields] 复合/分组 field widget 丢弃或错投 host 下发的控件 id:address / geolocation 的表单 labelfor悬空,checkboxes / radio / rating / file 的for落在不可 label 的 div 上 #3961 and is the only option that also covers [app-shell] metadata-admin 的 SchemaForm 无条件给每个 widget 发Label htmlFor={id},但 17 个注册 widget 里只有 5 个消费 id —— 分组类控件面的for悬空且组无可访问名 #4871's conditional-group case; option 1 quietly erases the repo's deliberatedisabled/readonlydistinction; option 3 fixes only the three widgets with real labelable controls.labelling/display key is closed-enumeration and testable; the status quo (host infers fromreadonly) is the inference-that-silently-misses shape that produced this card. Note option 2's own trap, named by the card: an omitted declaration silently degrades — worth pairing with a registry-level gate.grid/slider/signature, 1-or-2 for the display-only four); the smallest honest fix is not uniform, which is itself why this needs a ruling.Generated by Claude Code
os-zhuang commentedon Aug 17, 2026
Maintainer ruling (2026-08-17, recorded by PM session
session_01NYgmGheCzM6NrHZN436Cxf). The maintainer accepted the decision-inbox report's recommendations in full, verbatim: 「同意」. Ruled together with #4871 — one declaration shape settles both hosts:The declaration: the already-ruled
ComponentMeta.labellingvocabulary (#3961) extends to a three-value closed enum —'control' | 'group' | 'display'— as the single repo-wide answer to "how does a host learn what a widget will render". ⛔ No host-local variants. The declaration slice expands a public contract key ⇒claude-fable-5for that slice.This card's landing:
grid/slider/signature→ option 3: expand DOM pass-through onto their real labelable controls (hostidlands,forresolves naturally).formula/summary/auto_number/vector(display-only four) → declare'display'and take the [fields] 非 group-labelled widget 的只读替换显示丢掉 host 下发的整份 plumbing —— label 的for悬空、description 零消费者(email / url / phone 实测) #4788-ruled host wrapper (id +aria-labelledby+aria-describedby+role="group").disabled/readonlydistinction is deliberate and stays;ObjectForm.tsx:687's mapping is not rewritten to buy a11y.Label flipped
needs-user-decision→pm:queuein the same stroke. Sibling ruling on #4871.Generated by Claude Code
yinlianghui commentedon Aug 17, 2026
【来自 #3318 残留批的实测 —— 不认领本单,只报两条:七分之二已在别处交付,以及本单「方案 3」对其中两个不成立】
实施 #3318 的账本残留时同一套 probe 重跑了本单的七行,读数与本单一致(
for=DANGLING/hostIdEl=NONE/consumers=0全中)。PR #4933(draft)作为 #3318 的交付,顺带关掉了这七行里的slider与signature两行:剩余五行未动:
formula/summary/auto_number/vector/grid。本单继续持有它们,D 组那条方向裁决(方案 1 vs 2)没有被本次交付预判掉。slider/signature单独用是不够的本单正文写:
前半对、括号里那半不对,而这正是实施时踩到的一步。这两个 widget 确实有真控件,但控件本身不是 labelable 元素:
slider的控件是 Radix 的span[role=slider]thumb;signature的绘制面是 canvas。label for只能寻址 HTML 的 labelable 元素(button / input / meter / output / progress / select / textarea)。所以只做方案 3,for会从「悬空」升级成「指向一个不可 label 的元素」——getElementById找得到、无障碍树里依然没有名字。probe 里for=RESOLVES会变绿而名字仍然缺失,是个会骗人的读数(本单的RESOLVES-LABELABLE那个写法是对的,值得保留成唯一口径)。⇒ 这两个的正解是方案 3 +
labelling: 'group'声明(#3961 的 IDREF 路子),且是file的形态而非复合体的形态: 一个不可 label 的控件,不是一组子输入。PR #4933 即按此做——slider的名字与描述直接落在 thumb 上(它的slider角色本身就能承载名字,不加多余的 group 包裹层);signature无可聚焦控件,落在role="group"容器上。对
grid的推断请重新量: 它在同一 probe 里focusable=1 [button],控件是个 button(labelable),所以方案 3 对它可能真的够——但这一条本次没有实测,别按上面两行外推。与 #3318 的边界
#3318 只有
aria-invalid一根轴,本单是id/for/describedby三根。两单在slider/signature上同因同治,所以 PR #4933 一次都关了;剩下五行的aria-invalid侧已在 #3318 的账本里按语义分流定案(四个只读展示型 +grid各有归属),不代本单裁 id/describedby 侧的方向。Generated by Claude Code
yinlianghui commentedon Aug 17, 2026
认领(objectui 分片 PM 座席,批次 21)。Session
session_01GTRjn8xBqp75dk7kFupVRt,分支claude/issue-4857-labelling-display,os-dev 子代理实施。实施依据 = 05:03Z 维护者裁定 + 06:36Z 实测更正,范围收敛后:①
ComponentMeta.labelling扩为'control' | 'group' | 'display'三值闭枚举(公开契约键扩展 —— 按裁定指定,本切片由 claude-fable-5 执行;与用户「默认 opus」的一般指令相比这是维护者对具体切片的显式指定,从其具体);②display 四(formula/summary/auto_number/vector)声明'display'并接 #4788 已裁的 host 容器;③grid先重测(06:36Z 更正明言别按 slider/signature 外推 —— 它的控件是 labelable button,方案 3 可能够,量了再改);④配套注册表级「registered ⇒ declared」门(裁定点名的漏声明静默退化陷阱);⑤⛔ 方案 1(disabled→readonly重映射)维持否决,ObjectForm.tsx:687一字不动;⑥slider/signature 已由 PR #4933 交付,不重做。文件面:
packages/core(ComponentMeta)、packages/components(form renderer host 分支)、packages/fields(五 widget + 注册表)—— 与在飞 #4989(plugin-form redirect 面)/#4917(renderers/basic/span)/#4874(custom/filter-builder)不相交。姊妹单 #4871 持有,Blocked-by 本单(其 meta 层复用本单落地的声明类型)。Generated by Claude Code
feat(core,components,fields): labelling grows 'display'; display four…
fix(app-shell): SchemaForm 的六条非注册表渲染路径按解析出的面发命名通道 (objectstack-ai#5039)…
fix(app-shell): metadata-admin 嵌套字段 id 按路径作用域 + grid/table 单元格由列头命名 (o…