Skip to content

decision(dashboard): the strict face refuses the inline dashboard dialect (options.data / xField / yField, component.chartType …): retire it per ADR-0021, declare it, or reopen the derivation? (objectui#11070) #11228

Description

@objectstack-fleet

Ruled: 5921018991 · letter C · 2026-09-30T22:47Z
Blocked-by: #11070

Filing-gate category: ② a decision only the maintainer can make. Reader who acts: the maintainer rules. Then the seat holding objectui#11070 executes the ruling as that card's next round (currently domain:devx seat 2, objectui#10917, session_01TdiauJaVCHuj45EzZGUxHh, R5, which holds #11070 on the maintainer's order 「11070 6152 如果没人在处理你也接管派发」).

Dedupe: an objectui issue search (semantic) for dashboard widget options strict authoring face refuses xField yField options.data inline data ADR-0021 returned 6 hits, open and closed; none is this question. The nearest is objectui#4614 (closed), which gave DashboardGridLayout a dataset path, a different defect.

维护者速读

objectui 的严格校验(objectui validate 将要切到的那张脸)会拒掉一种「内联数据」写法的仪表盘:在 widget 里直接塞 options.data 数组,再用 xField / yField / value 指列。

One-sentence question

A dashboard written the "inline data" way (rows pasted into the widget, columns named by xField / yField) renders today, but the strict validator objectui validate is about to use refuses it by name. Is that way of writing a dashboard part of the contract or not?

Measured facts

Source: the objectui#11070 round-2 dev report 5914303469 (open question 1), at objectui 52bf348.

  • The 9 pairs: widgets[].options.{data, xField, yField, value, description, trend} and widgets[].component.{chartType, xAxisKey, series}. There are 44 occurrences, all refused by the strict face only; the tolerant face accepts them.
  • Writers: 7 documents, all objectui's own corpus. That is 6 catalog fixtures plugin-dashboard/filtered-dashboard*.json (options.data ×11, xField ×11, yField ×11, value ×4), and 1 docs fence (api/schema-reference.md's DashboardComponentSchema example: data / value / description / trend and component.chartType / xAxisKey / series, 1 each).
  • Real producers: objectstack's example dashboards write 0 of the 9. They are dataset-bound (dataset / values / dimensions, ADR-0021). objectui's dashboard editors write 0 of the 9 (a source census).
  • Readers: DashboardRenderer and DashboardGridLayout read options.data ?? widget.data, xField || 'name', yField || 'value' and value ?? first row, and spread ...options into the child. The renderer's own comment calls inline options.data renderer-internal (ADR-0021).
  • The spec's shape:
    • DashboardWidget.options is an object with 5 declared members plus catchall(unknown), and the widget requires dataset.
    • component is objectui's own legacy key. It is typed BaseSchema by the objectui#8344 / objectstack#8593 routing ("not new authoring surface"), and its closed slot set is ['metric-card'].
  • The strict derivation today closes every catchall. It therefore refuses the 6 option keys, and it ALSO refuses real-producer option keys such as app-crm's metric options { format, currency }, which sit outside this card's corpus (see "Adjacent" below).

Options × real cost

option what it does what a customer sees
A declare Declare per-family option keys on objectui's widget options, with a TS type to match. Demo keys pass. Real producers' keys (format, currency, color, …) pass only if enumerated too, and their reads are not measured, so an incomplete list refuses working dashboards.
B reopen The strict derivation keeps the spec's openness wherever the spec declares a catchall. It is one derivation rule, not an exemption list. Every spec-valid widget passes, but a typo inside options passes silently and the chart falls back to name / value, which is a wrong chart with no error. It affects every spec catchall, not just dashboards (census NOT MEASURED).
C retire (recommended) Rule the inline dialect not an authoring channel, per ADR-0021. Rewrite the 6 fixtures and the 1 fence to the dataset form, or drop those demos. The component chart in the fence is rewritten to the spec widget form (instead of D). One way to author a dashboard: dataset-bound. The validator keeps refusing the dialect loudly, with a name.
D retype the slot Type the legacy component slot as the chart node, or admit chart to the slot set. One docs fence passes, and a legacy envelope widens. That reopens the 2026-08-14 slot ruling.

Business meaning

  • A: objectui starts owning a second option vocabulary that the spec left open. It is a private dialect.
  • B: "whatever the spec lets through, we let through". Contract agreement bought with silent typos.
  • C: "dashboards bind data; they do not carry it". The same shape the platform's real apps already use.
  • D: keep a legacy door open for one example.

四棱块

os-decision-facets

  • ① 项目长远合理性:C 收窄特例 —— ADR-0021 已定仪表盘只有 dataset 一种数据形状,C 让 objectui 不再保留私有内联方言;A 扩大契约(objectui 自持一套 spec 没声明的选项词汇),D 重开已裁定的 legacy 槽。
  • ② 实际业务拉动:内联写法 44 处全部来自 objectui 自己的 demo,真实生产者 0 处(objectstack 示例应用全是 dataset 绑定)—— 零拉动,默认 remove。
  • ③ 防 AI 犯错:C 保持严格脸闭合,方言一律按名字响亮拒绝,语料只教一种写法;B 让 options 内的拼写错误静默通过、图表退回默认列,是静默错误。
  • ④ 创业阶段不扩散:C 是退役,不新增任何声明;A 每声明一个选项键都是永久义务。

Prior rulings read: ADR-0021, objectstack#8593 (the 2026-08-14 slot ruling, "not new authoring surface"), objectui#8344, objectui#5250 ruling 5534418546 → the four named; the objectui search above → 6 hits, 0 on this question; thread: objectui#11070 (5892537390, 5914303469).

Recommendation: C, extended to all 6 option keys (xField / yField only name columns of inline rows, and value / description / trend are the metric's static inline data). The schema-reference.md fence's component chart is rewritten to the spec widget form instead of taking D.

  • 只看①选 C;②③④ 是否翻转:否(② 零拉动、③ 闭合、④ 退役,三轴同向)。
  • End state, two years out: a dashboard widget names a dataset and its measures and dimensions, and never carries rows. That is the model of Superset charts (bound to a dataset) and of Metabase questions (bound to a query).
  • Fallback: B, only as its own measured question (a census of every spec catchall first), never folded into this card.
  • Confidence gaps (NOT MEASURED):
    • whether the catalog's no-backend harness can render a dataset-bound demo, or the 6 demos must be dropped;
    • whether any host composes inline options.data at runtime, which decides whether the renderer's own inline read can retire later;
    • the census of other spec catchalls the strict face closes.

Adjacent, not decided here

The strict face also refuses real-producer, spec-valid option keys (app-crm's metric options { format, currency }). That is objectui#11070's defect class, outside M3's corpus. Its contract-first home is per-type option schemas upstream in the spec, and it is exactly the question B would answer locally. If you rule C, this seat files that as its own measured card (the catchall census first) rather than widening this one.

After the ruling

  • On C, the seat holding objectui#11070 dispatches one round:
    • rewrite the 6 filtered-dashboard* fixtures to the ADR-0021 dataset form (or drop them if the harness cannot serve a dataset, and say which);
    • rewrite the api/schema-reference.md fence, both its option keys and its component chart;
    • re-run M3, where the 9 pairs must leave class (ii);
    • no change to the strict derivation, and none to the renderer's inline read in this round.
  • On A, B or D, the same seat prices the declaration or derivation change, and it takes the at-tier contract review.
  • In every case, this card closes with a pointer to the landing, and objectui#11070's dashboard remainder clears.

Activity

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

    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions