Use it when checking the IR returned by viz_render or dashboard_render; use viz_render instead to create chart output and dashboard_render to compose panels. Returns coverage, conformant, findings and four pillar verdicts. Pass spec alone for Cartesian charts; ECharts-primary charts need the same matching data branch used for rendering. Spec-only ECharts remains uncertified. brand/theme must match rendering; high contrast reports forced-colors exemption without a numeric contrast grade. A certified chart may still be nonconformant; inspect all verdicts. This read-only check does not repair charts. Reference: TOOL-REFERENCE.md#artifact_certify; full schema: oods://schemas/artifact_certify.input.json.

Inputs

Name Type Required Description
spec object yes A OODS Foundry NormalizedVizSpec intermediate representation — the same IR viz.render emits as normalizedSpec. Validated authoritatively by the handler's assertNormalizedVizSpec.
data object no OPTIONAL operand for the 8 ECharts-primary types (treemap/sunburst/sankey/force_graph/choropleth/bubble_map/flow_map/chord): the SAME data branch viz.render takes, so certify re-emits the option the render path would… See full schema for details.
theme "light" | "dark" | "hc" no CSS token theme for chart pixels, default light. See full schema for details.
brand string no CSS brand scope, matching viz.render for the same normalized spec and data operand.

Outputs

Name Type Required Description
status "ok" | "error" yes Whether certification ran. 'error' means the input was not a valid NormalizedVizSpec IR.
coverage "certified" | "uncertified" no Certified identifies the Cartesian or declared ECharts data-operand profile, not a passing result: read conformant and the pillars. Uncertified identifies a spec-only ECharts call or an unmodeled mark. Spec-only ECharts contrast may still be reconstructed or exempt, while data-dependent a11y, determinism and accuracy remain unchecked. Absent on error.
conformant boolean | null no Boolean for a certified profile; null for uncertified calls; absent on error. The ECharts operand profile is true only when a11y-equivalence passes, determinism is stable, contrast is neither fail nor ungradeable, and accuracy passes with rulesEvaluated greater than zero and no accuracy findings. Error-severity a11y findings and evaluation faults fail that pillar; ordinary warning findings and not-applicable rules do not. Cartesian behavior is unchanged: its four pillars fold together, with contrast/accuracy fail or ungradeable preventing conformance. Accuracy unchecked cannot pass the operand profile. A measured false is retained, never converted into uncertified.
findings finding[] no One entry per failing a11y-equivalence or accuracy rule, at native severity. A11y codes use OODS-<rule.id>; accuracy codes use their registered OODS-V codes. Warnings remain visible without failing a11y, while error-severity a11y findings and any accuracy findings prevent operand conformance. An evaluator fault is reported separately in the pillar and notes, so empty findings alone never imply a pass.
a11yNotApplicable object[] no One entry per a11y-equivalence rule whose declared precondition was absent, in rule order with the precondition named. Present, possibly empty, when the ECharts operand engine returns the complete rule population; absent without data, on Cartesian calls, on tool error, or when the engine throws or returns an incomplete population. An individual rule evaluator fault retains the completed engine population and native findings, while failing the a11y pillar. Not-applicable rules never enter findings and are not counted as failures.
accuracySummary object no How the accuracy pillar was reached. Present when rules completed: on Cartesian calls and ECharts calls with data. Absent without an ECharts operand or on an evaluator fault. rulesEvaluated counts resolved rule operands; a rule whose precondition is absent is not counted and explains why in notes. The ECharts operand profile requires at least one evaluated rule and zero failing rules.
determinism object no Re-emit and render determinism proof. Cartesian results identify the canonical Vega-Lite compile with contentHash and, when rendering occurred, the first normalized SVG with renderHash. ECharts-primary results are present when the `data` operand was supplied: contentHash identifies the retained projected option, and renderHash is present whenever that projected option was rendered successfully. In both families `stable` folds two independent emissions and, when renderHash is present, two independent normalized renders. A typed first-render fault keeps contentHash, omits renderHash, and makes stable false; bubble_map without inline geometry keeps the option proof and names the no-server-map limitation. Absent on the error path and on an ECharts verdict with no operand.
pillars object no Per-pillar verdicts on successful tool responses, including nonconformant results. Data-backed ECharts calls grade a11y over the shared operand-built table/narrative, repeat option emission and available rendering for determinism, measure or exempt contrast, and run the per-type accuracy rules. Spec-only ECharts calls keep data-dependent pillars unchecked and retain legacy contrast behavior. A fault cannot silently produce a passing profile.
contrastNote string no Contrast rationale naming the exact theme/brand. Cartesian and data-backed categorical ECharts results grade rendered paints against that CSS scope canvas; geo and continuous heatmap results remain exempt. Spec-only ECharts calls reconstruct scoped baked colors and make no rendered-carrier measurement claim. For exempt results, no canvas ratio is graded.
notes string[] no Path-specific scope and missing-operand explanations, runtime-matrix limits, unmet rule preconditions and evaluator faults. The operand note describes the enforced profile; the spec-only note explains why coverage remains uncertified and conformant null. Empty offered/resolved rule sets remain explicit and cannot pass the operand profile.
errors finding[] no Present and non-empty when status is 'error' (the input was not a valid NormalizedVizSpec IR).
contrastResults object[] no The contrast row for this call's requested theme/brand. Collect rows from separate scope calls to compare themes. measured is true only for a successful render-backed categorical evaluation (pass or fail); exempt, unchecked, ungradeable and spec-only palette reconstruction do not claim a completed canvas ratio measurement.
accuracyRules "OODS-V150" | "OODS-V151" | "OODS-V152" | "OODS-V153" | "OODS-V154" | "OODS-V155" | "OODS-V156" | "OODS-V157" | "OODS-V158" | "OODS-V159" | "OODS-V168" | "OODS-V169" | "OODS-V170" | "OODS-V171" | "OODS-V172" | "OODS-V173"[] no Offered accuracy rule codes for this chart type. This closed set is distinct from accuracySummary.rulesEvaluated, which counts resolved operands; an empty array means no rule is offered.

A real call

Recorded by this site's harbor run, step certify, with the published OODS Foundry 0.10.1.

Its input:

{
  "spec": {
    "$schema": "https://oods-foundry.com/viz-spec/v1",
    "id": "viz:bar",
    "name": "Bar chart",
    "data": {
      "values": [
        {
          "warehouse": "Lakeside Distribution",
          "pallets": 640
        },
        {
          "warehouse": "North Yard",
          "pallets": 760
        },
        {
          "warehouse": "Harbor Cold Store",
          "pallets": 2400
        }
      ]
    },
    "marks": [
      {
        "trait": "MarkBar"
      }
    ],
    "encoding": {
      "x": {
        "field": "warehouse",
        "trait": "EncodingPositionX",
        "channel": "x",
        "type": "nominal",
        "title": "Warehouse"
      },
      "y": {
        "field": "pallets",
        "trait": "EncodingPositionY",
        "channel": "y",
        "type": "quantitative",
        "title": "Pallets"
      }
    },
    "a11y": {
      "description": "Bar chart of pallets by warehouse.",
      "ariaLabel": "Bar chart of Pallets by Warehouse"
    }
  },
  "brand": "Harbor",
  "theme": "light"
}

Its result:

{
  "status": "ok",
  "coverage": "certified",
  "conformant": true,
  "accuracyRules": [
    "OODS-V150",
    "OODS-V151",
    "OODS-V152",
    "OODS-V153"
  ],
  "findings": [],
  "determinism": {
    "stable": true,
    "contentHash": "746f8e9673217fc6b24f4441db7ababcc269eb84555aac1a9af9960d6e1f360a",
    "renderHash": "09283d7095065ce1f00c5cfc433ea501ed93f787c02376368a1db5c5e4996cc2"
  },
  "pillars": {
    "a11yEquivalence": "pass",
    "determinism": "pass",
    "contrast": "pass",
    "accuracy": "pass"
  },
  "accuracySummary": {
    "rulesEvaluated": 4,
    "failing": 0
  },
  "contrastNote": "certify grades the series-to-paint assignment of the rendered chart (the compiled spec rendered through @oods/viz-render), against the requested CSS scope canvas. Scope: light/Harbor.",
  "notes": [
    "no aggregation is declared anywhere in the IR, so there was no disclosure to evaluate — the aggregation-hiding pass has no subject"
  ],
  "contrastResults": [
    {
      "theme": "light",
      "brand": "Harbor",
      "verdict": "pass",
      "measured": true,
      "evidence": "render",
      "note": "certify grades the series-to-paint assignment of the rendered chart (the compiled spec rendered through @oods/viz-render), against the requested CSS scope canvas. Scope: light/Harbor."
    }
  ]
}

The whole call, 3 KB of JSON