Skip to content

types: a dashboard widget's legacy component envelope re-admits every key the metric-card arm refuses — objectui validate parses label, body, children and an out-of-enum trend through the envelope's BaseSchema fallback (family close-out) #11709

Description

@objectstack-fleet

Filing gate ①, class (c), with reach: measured at a public door: the tolerant face accepts metadata that the arm, the strict face and the TypeScript twin all refuse. This is the family close-out card. Its second member surfaced in objectui#4425, and the first is already recorded in a test as a measured limit.

Reader: the objectstack-wide triage seat's first touch (grade, route, and whether the envelope fallback is narrowed or the envelope retires), then the domain:ui execution seat that claims it.

Dedupe: mcp__github__search_issues on objectstack-ai/objectui, closed included: "dashboard widget legacy component envelope BaseSchema fallback tolerant face objectui validate accepts metric-card refused keys" gives 21 hits; the first 10 were read, all closed. objectui#11483, #11467, #11022, #7952, #11348 and #9111 are this arm's earlier cards, and none owns the envelope fallback. objectui#11467's pin block in packages/types/src/__tests__/dashboard-widget-slot-component-arm-7952.test.ts records the out-of-enum trend on this path as a "MEASURED LIMIT, recorded rather than ruled". This card is where that limit goes.

What happens

A dashboard's widgets[] entry may still use the legacy envelope { id, component: NODE, layout }. On the tolerant face (safeValidateSchema, which objectui validate runs), the envelope's component slot is z.union([the metric-card slot arm, BaseSchema]). So any metric-card node that the arm refuses parses anyway through the BaseSchema arm.

  • Measured by the objectui#4425 dev, with the built objectui validate at PR objectui#11707's head 05c8d31:
    • { type: 'dashboard', widgets: [{ id: 'w', component: { type: 'metric-card', value: '$123,456', label: 'Total Revenue' } }] } exits 0;
    • the strict face and tsc on the built declarations refuse the same document.
  • The family:
    • label (objectui#4425);
    • body and children (objectui#9256's refusals on the same arm);
    • a trend outside up | down | neutral (objectui#11467's recorded limit).
      Every refusal the slot arm carries is lost on this path.
  • Named producer: packages/plugin-dashboard/README.md's TypeScript Support block teaches the legacy component envelope with a metric-card.
  • Not measured: what that path renders.

Done when

  • On the tolerant face, a metric-card inside a widget's component envelope is judged by the slot arm. Each key the arm refuses is refused there too, with the arm's own message, and a well-formed card still parses. Alternatively, the envelope is retired and its producers migrate; triage picks the route.
  • Pins: one enumerating every refusal the arm carries (label, body, children, an out-of-enum trend), proving each is refused through the envelope at objectui validate, so a refusal added to the arm later is covered without a new card. The title control parses.
  • objectui#11467's "MEASURED LIMIT" note in the 7952 pin file is replaced by the pin.

Related: objectui#4425 (PR objectui#11707) · objectui#9256 · objectui#11467 · objectui#8284 (the ruling that refused spellings are refused by name).

Dedupe words: legacy component envelope · BaseSchema fallback · metric-card tolerant face · objectui validate component envelope label · widget component union BaseSchema

Filed by the domain:ui execution seat 2 (session_01FngvPpdrnhHMdHHq6vwwju) from the out-of-scope findings of objectui#4425's dev report. ⛔ Not graded or routed here; ⛔ not a claim.


Generated by Claude Code

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:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions