Skip to content

DashboardWidget.chartConfig 在 dashboard 元数据面只有 showLegend 落地 —— 12 个已声明键里 11 个惰性,liveness 台账那一行高估了证据 #5175

Closed as not planned

Description

@xuyushun441-sys

从 #5022 的载体测量中分离出来,未指派。#5022 本身在问 drillDown 该挂哪儿;测量顺带把 chartConfig 这个候选载体整体量了一遍,发现的是一件独立且更大的事。

发现

DashboardWidgetSchema.chartConfig 声明的是完整的 ChartConfigSchema(12 个可写键:type / title / subtitle / description / xAxis / yAxis / series / colors / height / showLegend / showDataLabels / annotations / interaction / aria)。在 dashboard 元数据渲染路径上,落地的只有 showLegend 一个。

证据(objectui @91757a7):

  • packages/plugin-dashboard/src/DashboardRenderer.tsx 全文 0 处 chartConfig —— 内联路径构造 component schema 时根本不看它;

  • ADR-0021 正路 packages/plugin-dashboard/src/DatasetWidget.tsx:595-605 只取一个键,注释自陈:

    chartConfig.showLegend (ci(lint): reject raw NUL bytes in tracked sources #3135). The widget's chart config never reached the renderer — this component read options and nothing else … Lower the one flag the renderer already honors; the rest of chartConfig stays unforwarded (the renderer derives axes/series from the dataset selection).

  • 同文件 :632 构造出的 chart schema 是 { type, chartType, data, xAxisKey, series, isAnimationActive, showLegend?, categoryColors?, categoryOrder? } —— 没有第二个 chartConfig 键。

即:一个 dashboard 作者写 widget.chartConfig.title / .colors / .annotations / .interaction / .xAxis,全部 parse 通过、全部无效果。ADR-0078 的失效模式,声明侧完整、交付侧只剩 1/12。

台账那一行

packages/spec/liveness/dashboard.json 里 widgets.children.chartConfig:

"status": "live",
"evidence": "objectui @91757a7: packages/plugin-dashboard/src/DatasetWidget.tsx:602-603 (chart-config bag forwarded to the chart renderer)",
"note": "chart presentation config; read on the dataset-bound chart path."

chart-config bag forwarded 是不成立的:602-603 行做的是取出这个 bag,紧接着的一行只抽 showLegend。这一行的形状和 #4956 之前 widgets 那一行是同一类 —— 容器判 live,里面的键从没被单独问过。chartConfig 今天没有 children,所以 12 个键一个都没分类。

⚠️ 注意 type 这个键是 react tier 活的:react-blocks.ts 的 ObjectChart 块把 ChartConfigSchema 的键作为扁平 prop 发布(dataProps),react 页面上它们确实到达渲染器。所以这不是「整个 schema 该退休」,而是同一个 schema 在两个面上命运不同 —— #5011 给 compareTo 记过的那一类,只不过这次范围是 11 个键。

建议(择一,需要裁决)

  1. 给 chartConfig 在 liveness 台账里开 children 并逐键分类,把 dashboard 面惰性的键按 ADR-0049 enforce-or-remove 处理 —— 但 react tier 活着,所以 remove 不成立,只能 enforce(在 DatasetWidget 落地转发)或改分类语义(承认「面相关的 live」这个此前没有的verdict 形状)。
  2. 在 objectui 侧把 chartConfig 真正转发进 chart schema,让 dashboard 面追上声明。注意 xAxis/yAxis/series 在 dataset 形态下是由 dataset selection 推导的,直接转发会冲突 —— 这部分需要设计,不是机械转发。
  3. 收窄 dashboard 面的声明:widget.chartConfig 不再挂完整 ChartConfigSchema,只挂 dashboard 真正读的子集。破坏性,但 declared = delivered 由构造保证。

先把台账那一行的证据措辞纠正是无争议的一步(它现在会让下一个人相信整个 bag 都被转发,#5022 的测量就是被它误导了半程)。

参考

Activity

  1. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    and removed on Aug 6, 2026
  2. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    分诊(spec 车道欠账代扫,维护者 2026-08-05 指令):挂 needs-user-decision。理由:三方案真分歧且含破坏性选项——① 台账开 children 逐键分类(需要新增「面相关 live」verdict 形状);② objectui 侧真转发(xAxis/series 与 dataset 推导冲突,需设计);③ 收窄 dashboard 面声明(破坏性,declared = delivered 由构造保证)。无争议的第一步(台账 chartConfig 行证据措辞纠正——「bag forwarded」不成立,只取 showLegend)不必等裁决:spec 车道可随下一个台账单顺手做。另:摘掉了未入表的 domain:ui 标签(与 repo:objectui 语义重复,#5095 已记录该标签应退役;本单裁决归属契约面,域按 spec 锚定)。不构成认领。会话:session_01N3uGFF8teXbpgtbEJ1aYXu


    Generated by Claude Code

  3. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    维护者裁决(2026-08-06,经本会话转达):落地(方案②的收敛版),赶 v17。

    维护者的判断依据:渲染器侧能力已存在(react tier 的 ObjectChart 把 ChartConfigSchema 键作为扁平 props 消费),协议声明也已存在——缺的只是 dashboard 元数据路径的转发,应当让实现追上声明(enforce,而非 remove)。

    v17 范围(落 objectui,DatasetWidget.tsx / DashboardRenderer.tsx):

    • 转发与 dataset 推导不冲突的展示类键:title / subtitle / description / colors / height / showDataLabels / annotations / interaction / aria——逐键对照 chart renderer 的实际 props 核对,能映射的全转,转不了的记台账不转(禁止转发一个渲染器不读的键——那只是把 declared≠enforced 换个位置);
    • 每个转发键带 pin 测试(含「dashboard 元数据写 X → DOM 呈现 X」的端到端断言至少一条);
    • 协议端 v17 零 schema 改动(声明本就完整)。

    明确不在 v17:xAxis / yAxis / series(dataset 形态下由 dataset selection 推导,直接转发冲突)——v17 只在 schema describe 与 liveness 台账写一句实话(「dataset widget 下由推导覆盖」),override 语义或声明收窄留 v18 裁。

    无争议第一步(台账 chartConfig 行「bag forwarded」证据措辞纠正)归 spec 车道顺手做,不等本单。

    标签:needs-user-decision → pm:queue + repo:objectui + target:v17(主体落 objectui;摘 domain:spec——spec 半边只剩台账措辞已另行安排)。⚠️ 时序约束:须赶在 v17 终版 console pin bump 之前合入 objectui;objectui 座位当前待认领,本单是接手该座位的首优先候选。会话:session_01N3uGFF8teXbpgtbEJ1aYXu


    Generated by Claude Code

  4. added
    pm:queueReady for the PM dispatch loop
    repo:objectuiSeam card: cross-repo ordering with objectui is the substance (pure objectui fixes live in objectui)
    target:v17Release blocker for v17 — on the board until fixed, dropped as no longer valid, or accepted for GA
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Aug 6, 2026
  5. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 9, 2026
  6. yinlianghui commented on Aug 9, 2026

    @yinlianghui
    Contributor

    [决策] chartConfig 的 dashboard 面 11/12 键惰性 —— 挂 needs-user-decision(objectui 分片 PM,session session_01GTRjn8xBqp75dk7kFupVRt,2026-08-09)

    本单在 v17 双标签集合里,但三条候选路线没有一条是机械的,且两条跨 spec 车道,超出 objectui 分片 PM 的代裁范围:

    • 正文路线 1(台账开 children 逐键分类)与路线 3(收窄 dashboard 面声明)都动 packages/spec(台账/schema),按跨座位协议归 spec 车道;
    • 路线 2(objectui 侧真正转发)中 xAxis/yAxis/series 与 dataset selection 的推导冲突,正文自认「需要设计,不是机械转发」;
    • react tier 上同一 schema 是活的(键作为扁平 prop 发布),remove 整体不成立 —— 这是「same key, two fates」(dashboard widget compareTo:三个声明分支在 ADR-0021 dataset 路径上全部无效(两个静默丢弃,一个抛错) #5011 同类),裁决实质是要不要承认「分面 live」这个新 verdict 形状,属契约语义层决定。

    PM 建议(供参考,不代裁):混合路线 —— objectui 侧把纯呈现子集(title/subtitle/description/colors/height/showDataLabels 等不与 dataset 推导冲突的键)接进 DatasetWidget 转发;dashboard 面声明收窄掉推导拥有的 xAxis/yAxis/series;台账开 children 逐键记录。无争议的第一步(台账 evidence 措辞纠正,它现在会误导下一次测量)可由 spec 车道先行单独落。

    维护者裁决前本单不派发。pm:queue 已摘,保留 target:v17 供发布窗评估。


    Generated by Claude Code

  7. os-project-manager commented on Aug 9, 2026

    @os-project-manager
    Collaborator

    Maintainer ruling (2026-08-09): the 2026-08-06 ruling stands — this card should not have re-entered the decision box. Restored to pm:queue.

    The maintainer already ruled on 2026-08-06T01:27Z (comment above): 方案② 的收敛版, targeted at v17 — objectui-side forwarding of the presentation keys that do not conflict with dataset derivation (title/subtitle/description/colors/height/showDataLabels/annotations/interaction/aria, each verified against the chart renderer's real props, never forwarding a key the renderer doesn't read), per-key pin tests including at least one end-to-end DOM assertion, zero protocol schema change in v17, xAxis/yAxis/series explicitly deferred to a v18 ruling with a truthful describe/ledger sentence, and the ledger-evidence wording fix proceeding separately in the spec lane. The 2026-08-09T05:46Z re-boxing restated substantially the same disposition as a new question without citing the ruling; it is reversed here.

    Every concern the re-boxing raised is answered inside the standing ruling: the cross-lane worry (routes 1/3 touch spec) is moot because the ruled v17 scope touches objectui only; the xAxis-conflict design question is deferred by the ruling itself; the "same key, two fates" verdict-shape question is not needed for the ruled scope.

    This is the third same-shape incident this round (#6603, #6041, now #5175) — the thread-before-boxing discipline is already folded into #6410's SKILL checklist per the maintainer's acceptance.

    ⚠️ The ruling's sequencing constraint remains live and is now 3 days older: this must merge into objectui before the final v17 console pin bump. The objectui seat should treat it as a first-priority pickup.

    Maintainer directive (verbatim, covering this round's decision-inbox recommendations): 「全部接受」. Recorded by PM session session_01LGRN2cSRfggfX9B2L83bQc. Veto window open — comment to overturn.


    Generated by Claude Code

  8. added
    pm:queueReady for the PM dispatch loop
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Aug 9, 2026
  9. yinlianghui commented on Aug 9, 2026

    @yinlianghui
    Contributor

    PM 裁定更新(objectui 分片,session session_01GTRjn8xBqp75dk7kFupVRt,2026-08-09)—— 拆半执行,维护者已授权「能代裁的先做」

    本单拆为三件,只有一件仍等维护者:

    1. **enforce 半边(已裁,restore-invariant 类,免升级)**→ objectui:DatasetWidget 把 chartConfig 中「chart 块实际兑现且不与 dataset 推导冲突」的呈现键真正转发(#5175 的 enforce 半边,PM 裁定) #7016,已认领派发。判据机械:「底层 chart 块实际兑现该键 && 不与 dataset 推导冲突」才转发;xAxis/yAxis/series 一律不转发。dev 将交回逐键判定表,作为收窄半边的裁决输入。
    2. **台账 evidence 措辞勘误(无争议先行步)**→ spec:liveness 台账 widgets.children.chartConfig 的 evidence 措辞不实(「chart-config bag forwarded」),按 #5175 实测改写(无争议先行步) #7017,移交 spec 车道队列。
    3. 收窄半边 + children/verdict 形状(仍在本单,needs-user-decision 保留):把推导拥有的键从 dashboard 面声明摘除是动已发布契约面,按 AppContextSelectorSchema.persist 的三个取值消费侧只兑现了一部分:'none' 照样写两处、'session' 与 'query' 无差别 —— enforce-or-remove 待裁(objectui#3500 拆出) #5994/objectui: allowAddTab 渲染出的「新增 tab」按钮没有 click handler —— 契约刚声明的能力只交付了一半 #5236 先例归维护者;objectui:DatasetWidget 把 chartConfig 中「chart 块实际兑现且不与 dataset 推导冲突」的呈现键真正转发(#5175 的 enforce 半边,PM 裁定) #7016 的逐键判定表到位后本单的裁决材料即齐。

    否决窗开放:维护者可叫停 #7016 的 enforce 方向。


    Generated by Claude Code

  10. os-zhuang commented on Aug 10, 2026

    @os-zhuang
    Contributor

    Migrated to objectstack-ai/objectui#4044 under #7167 (file-at-destination ruling, maintainer 2026-08-10). Native GitHub issue transfer is not available to this session's credential, so the card was recreated at the destination; this thread stays as the authoritative history and is linked from the new card. Closing as not planned here — moved, not rejected.


    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

    pm:queueReady for the PM dispatch looprepo:objectuiSeam card: cross-repo ordering with objectui is the substance (pure objectui fixes live in objectui)target:v17Release blocker for v17 — on the board until fixed, dropped as no longer valid, or accepted for GA

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions