Skip to content

spec(ui): DashboardWidgetOptionsSchema declares none of the renderer extras real producers write through its passthrough — app-crm's metric options { format, currency } is spec-valid only by catchall and red on objectui's strict face #20960

Description

@objectstack-fleet

Filing gate: ① product defect, reach: a named real producer: objectstack examples/app-crm/src/dashboards/pipeline.dashboard.ts L46, L64 and L82 write options: { format: 'currency', currency: 'USD' } on three metric widgets. Filed by domain:devx seat 2 (objectstack-ai/objectui#10917), session_01TdiauJaVCHuj45EzZGUxHh, as an execution parameter of the director's ruling C on objectstack-ai/objectui#11228 (5921018991, 2026-09-30T22:45Z): "the adjacent defect … the seat files it as its own measured card (catchall census first), routed to the domain:spec lane upstream, ⛔ not folded into this round."

  • Who acts on it: the objectstack domain:spec seat. Its first step is the catchall census below; its PR lands the spec declarations. objectui follows by reference in its own round.
  • Duplicate check (semantic issue search, open and closed): objectstack "strict authoring face refuses dashboard widget options format currency passthrough catchall" → 10 hits; objectui "strict authoring face refuses spec passthrough catchall keys dashboard metric options format currency" → 3 hits. None is this defect. The nearest are objectstack#14148 (options.sortBy resolution), objectui#10463 (buildFieldMeta / currencyConfig) and objectui#10406 (a grid column currency key). All are closed and each is a different mechanism.

The mechanism (read at objectstack origin/main, 2026-09-30)

  • packages/spec/src/ui/dashboard.zod.ts builds DashboardWidgetOptionsSchema with .passthrough() and describes it as "declared query keys + open renderer extras". Its declared members (dateGranularity, sortBy, sortOrder, limit, stageOrder, …) include neither format nor currency.
  • So app-crm's pipeline dashboard is spec-valid only through the catchall. The protocol does not say what format: 'currency' means, or that currency is an ISO code.
  • objectui's strict authoring face (packages/types/src/strict-authoring-face.ts) closes spec catchalls (catchall: z.never()). It therefore refuses these keys by name on a document a real producer wrote.
    • The ruling on objectui#11228 keeps that derivation: option B, "keep the catchall open", was not taken.
    • This seat has not re-run the refusal. It is the ruling's reading, and objectui#11070's strict-face census class.
  • The maintainer's standing ruling (objectstack#12708 ledger 5552700625), verbatim: 「本项目以协议为基准。所以开发应该对其协议,协议有问题应该立卡修改协议」. So the gap is fixed in the protocol, not by reopening consumer tolerance.

What the card asks

  1. Catchall census first. List every key that objectstack's example apps and packaged templates write through DashboardWidgetOptionsSchema's passthrough (and through any other passthrough on the dashboard widget). For each key, name its reader in objectui's dashboard renderer (the metric tile, DashboardRenderer), or record that it has none.
  2. Per key, under ADR-0049 (enforce-or-remove):
    • written by a real producer AND read by a renderer ⇒ declared in the spec, typed (for currency, the ISO 4217 code);
    • written but unread ⇒ removed from the producer;
    • neither ⇒ nothing.
    • The census decides whether format / currency are declared; this card does not assume it.
  3. objectui's strict face then reads the declared keys by reference, and app-crm's pipeline dashboard goes green there. That objectui follow-up is the objectui domain:spec lane's, or objectui#11070's, not this card's PR.

Out of scope

  • The inline dashboard dialect (options.{data, xField, yField, value, description, trend}, component.{chartType, xAxisKey, series}). It was ruled C (retire) on objectui#11228 and is executed as objectui#11070's next round.
  • The renderer's own inline read, which retires later on its own card.

Acceptance

  • The census table is on this card, one row per key: writer, reader, verdict.
  • One spec PR lands the declarations and removals, with a changeset.
  • app-crm's pipeline.dashboard.ts passes objectui's strict face at the first objectui main that carries the follow-up. Link that run when this card closes.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:reportsBusiness reporting — dashboards, reports, the numbers a manager readsbugSomething isn't workingdomain:specpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions