Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

gauge / solid-gauge / bullet / kpi all render as a plain number — one missing dial/target renderer, deliberately shared by four spec chart types #4295

Closed as not planned

Description

@yinlianghui

Measurement requested by the #4229 ruling (item 4): the QA run of objectstack#7515 recorded, as an untested caveat, that kpi / gauge / solid-gauge / bullet all render value-only, pixel-identical to metric — no dial, no arc, no bullet target band — and asked whether that is the same "no entry in the family map" shape #4229 fixed for combo, or four distinct gaps.

Neither. It is ONE shape, it is deliberate, and it is not #4229's shape. Filed as an observation so the answer is on the record; no fix is proposed here.

What was measured

All four names (plus metric) are routed to the single-value path by three coordinated places, with no per-type differentiation anywhere — nothing branches on gauge vs bullet vs kpi:

Layer Symbol Effect
packages/plugin-dashboard/src/DatasetWidget.tsx:313 METRIC_TYPES isMetric — the widget renders as a metric card, the chart path is never reached
packages/plugin-dashboard/src/widgetDispatch.ts:62 METRIC_LIKE_TYPES classifyWidgetType returns { family: 'metric' }
packages/plugin-charts/src/normalizeChartSchema.ts:102 SINGLE_VALUE_CHART_TYPES excluded from RENDERABLE; AdvancedChartImpl.tsx:610 draws a number

So the four types share a single code path by construction, not by four independent oversights.

Why it is not #4229's shape

#4229 was a missing map entry: combo fell through CHART_TYPE_MAP[widgetType] ?? 'bar' and drew the wrong picture while the renderer was able to draw the right one. Here the routing is present and intentional, and the renderer genuinely cannot draw the right picture yet:

  • @objectstack/spec's own ChartTypeSchema groups them under Performance (single value ...) and calls gauge / solid-gauge / bullet "honest single-value variants pending a real dial/target renderer".
  • objectui#2942 moved them onto this path on purpose: they previously fell into the cartesian component map's || BarChart and rendered a bar shell whose series marks all returned null — grid, axes, tooltip and legend with no data marks, indistinguishable from an empty dataset. A number is the honest answer; an empty bar chart was not.

The actual gap

One missing capability — no dial / arc / bullet-target renderer exists — shared by four spec type names. Whoever builds it needs, in one piece of work: a radial gauge (gauge, solid-gauge), a bullet chart with its comparative target band (bullet), and a decision on whether kpi stays a metric synonym or gains its own treatment. bullet additionally has no authored target to draw yet: no target/threshold binding reaches this path today.

Until then the current behaviour is correct-by-design, and the spec comment is the contract. Recording it as a finding rather than a defect: nothing a user hits today is wrong, it is unbuilt, and the severity call belongs to triage.

Source

Measured in the #4229 worktree at origin/main ee66e2ebf, while DatasetWidget.tsx was open. Original caveat: objectstack-ai/objectstack#7515, checklist item chart-type-matrix.


Generated by Claude Code

Activity

  1. claude commented on Aug 11, 2026

    @claude
    Contributor

    Findings triage (grade): hold — finding stays. This is the measurement card the #4229 ruling asked for, and its value is the recorded answer: one deliberate, three-layer-coordinated shape (re-verified on origin/main @ 9461dd3: METRIC_TYPES at packages/plugin-dashboard/src/DatasetWidget.tsx:313 carries all four names, SINGLE_VALUE_CHART_TYPES at packages/plugin-charts/src/normalizeChartSchema.ts:102), not four instances of #4229's missing-map-entry defect. Whether gauge/bullet/kpi should render true dials is an appetite question with no measured user pull today; the card correctly proposes no fix. Held on the record so the next "gauge renders as a number" report resolves here instead of re-measuring.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. added theissue type on Aug 17, 2026
  3. os-steve commented on Aug 17, 2026

    @os-steve
    Collaborator

    Concentrated finding round (unified triage seat, 2026-08-17): closed not planned. The card's own conclusion is that the measurement request is answered: the four types share ONE deliberate single-value path (spec calls them "honest single-value variants pending a real dial/target renderer"), and the number is the honest render — the pre-#2942 bar-shell was the defect. What remains is building a dial/arc/bullet-target renderer, which is a feature investment with no measured pull on record; per startup scope discipline that earns appetite before a queue slot, not a standing card. The answer this card exists to record is preserved here in the closed record.

    Reopen trigger: a user/app actually needs gauge/bullet/kpi visuals (measured pull), or the maintainer allocates appetite for the renderer — reopen and route as a Feature, one piece of work covering all four types (radial gauge, bullet band, and the kpi disposition), per this card's "actual gap" section. Maintainer veto of this closure: reopen is free.


    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

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions