Filed by the director seat on the maintainer's ruling for objectui#8894 (decision batch #119 item 4, 2026-09-12: 「同意」 to D — judge the protocol wrong: a metric-family widget takes exactly one measure). ⛔ packages/spec is the domain:spec seat's; the director seat writes no repo file.
Governing text
- Maintainer standing ruling (2026-09-10): 「协议不正确的应该先修改协议。」
- objectui#8894 / objectui#7293 defect 1 — measured:
DashboardWidgetSchema.values is z.array(z.string()).min(1) with no upper bound, so an author may declare three measures on a metric tile; the query runs all three and the tile renders values[0] only. PR objectui#8887 (merged) added the sub-caption; the seat's second half (merged, Part of #8894) makes the tile SAY that the extra measures are not rendered. What remained was whether to invent display semantics for values[1..] or to narrow the protocol.
The defect in the protocol
For the metric family (metric / kpi / gauge / solid-gauge / bullet, and any dimensionless widget the renderer treats as a tile) the declared accept set admits a shape with no rendering semantics. A metric tile answers one number; that is what the family means on every mainstream dashboard product (a single-value card is one measure; several numbers are a different visual). A protocol that admits three measures on a one-number tile is the declared≠delivered shape, kept alive by a runtime warning.
What to do
DashboardWidgetSchema: for the metric family, values is exactly one measure — a superRefine on the widget's type, or a per-type schema arm, whichever the spec seat judges keeps the union diagnostics legible (see view-union-diagnostics.test.ts). The refusal names the widget and says one measure per tile, "make N tiles for N measures".
major changeset with an ADR-0087 semantic migration entry: a stored metric widget carrying N measures → keep values[0] on this tile and emit a structured TODO naming the dropped measures (splitting into N tiles is a layout decision the migration cannot take).
- Liveness / conformance: objectui's contract twins gain the refusal pin; the runtime warning objectui landed becomes the door refusal once the spec ships (objectui#8894 is
pm:blocked on this card).
Clause-②: no (narrowing).
⛔ Confidence gaps carried
How many stored dashboards declare more than one measure on a metric tile is unmeasured (the seat's P1 premise "multi-measure is rare" was never surveyed); objectstack-ai/duly#109's wish for several numbers on one tile is unmeasured and, under this ruling, is a request for a different visual, not for this one.
Refs
objectui#8894 (5619308792) · objectui#7293 · objectui#8887 · packages/spec/src/ui/dashboard.zod.ts (locate values by symbol)
Filed by the director seat, session_01QsCVSivtpwT6ZXs5Rtvqxe, 2026-09-12T02:5xZ, with Claude Code.
Generated by Claude Code
Filed by the director seat on the maintainer's ruling for objectui#8894 (decision batch #119 item 4, 2026-09-12: 「同意」 to D — judge the protocol wrong: a metric-family widget takes exactly one measure). ⛔
packages/specis thedomain:specseat's; the director seat writes no repo file.Governing text
DashboardWidgetSchema.valuesisz.array(z.string()).min(1)with no upper bound, so an author may declare three measures on a metric tile; the query runs all three and the tile rendersvalues[0]only. PR objectui#8887 (merged) added the sub-caption; the seat's second half (merged,Part of #8894) makes the tile SAY that the extra measures are not rendered. What remained was whether to invent display semantics forvalues[1..]or to narrow the protocol.The defect in the protocol
For the metric family (
metric/kpi/gauge/solid-gauge/bullet, and any dimensionless widget the renderer treats as a tile) the declared accept set admits a shape with no rendering semantics. A metric tile answers one number; that is what the family means on every mainstream dashboard product (a single-value card is one measure; several numbers are a different visual). A protocol that admits three measures on a one-number tile is the declared≠delivered shape, kept alive by a runtime warning.What to do
DashboardWidgetSchema: for the metric family,valuesis exactly one measure — a superRefine on the widget's type, or a per-type schema arm, whichever the spec seat judges keeps the union diagnostics legible (seeview-union-diagnostics.test.ts). The refusal names the widget and says one measure per tile, "make N tiles for N measures".majorchangeset with an ADR-0087 semantic migration entry: a stored metric widget carrying N measures → keepvalues[0]on this tile and emit a structured TODO naming the dropped measures (splitting into N tiles is a layout decision the migration cannot take).pm:blockedon this card).Clause-②: no(narrowing).⛔ Confidence gaps carried
How many stored dashboards declare more than one measure on a metric tile is unmeasured (the seat's P1 premise "multi-measure is rare" was never surveyed);
objectstack-ai/duly#109's wish for several numbers on one tile is unmeasured and, under this ruling, is a request for a different visual, not for this one.Refs
objectui#8894 (5619308792) · objectui#7293 · objectui#8887 ·
packages/spec/src/ui/dashboard.zod.ts(locatevaluesby symbol)Filed by the director seat,
session_01QsCVSivtpwT6ZXs5Rtvqxe, 2026-09-12T02:5xZ, with Claude Code.Generated by Claude Code