Skip to main content
Glama

Render Chart

viz_render
Read-onlyIdempotent

Draw and certify a chart from inline data. Provide chartType and encodings with rows, a pattern with its own data, or an intent to recommend a tabular chart. Brand and theme apply to drawing and certification. The compact reply contains hashes, warnings and certification; output.svg adds the SVG drawing, includeA11y adds the table and narrative, and includeNormalizedSpec adds its specification. Request SVG when a displayed chart is needed. Up to 500 rows; optional outputs still share the 100,000-character reply bound. artifact_certify returns the same drawing and checks for an input in chart.

Input Schema

NameRequiredDescriptionDefault
idNoOptional stable identifier for the produced spec.
geoNoInline geojson or topojson with topoObjectName, rows, join and valueField; optional point or flow fields. tool_schema gives the full contract.
nameNoOptional human-friendly chart title.
rowsNoInline flat data rows.
brandNoToken brand for drawing and certification.A
chordNoChord input: {nodes:[{name}],links:[{source,target,value}]}; links refer to node names; each directed pair must be unique.
themeNoColour theme for drawing and certification.light
intentNoStructured request: goal, measures and dimensions, with optional chartFamily; uses rows instead of explicit chartType and encodings.
outputNoOptional outputs; default reply has hashes and certification.
sankeyNoSankey input: {nodes:[{name}],links:[{source,target,value}]}; links refer to node names. Use chartType:"sankey".
networkNoForce graph: nodes [{id,group}] and links [{source,target,value}], at most 250 nodes.
opacityNoConstant mark opacity for Cartesian charts only; omission keeps renderer defaults.
patternNoExact registered pattern identity; preserves source data and presentation. Cannot combine with chartType, data, intent or identity/presentation overrides.
chartTypeNoChart family; Cartesian types need rows and encodings, others their named input. Omit to suggest from rows.
encodingsNoCartesian bindings: each needs field; optional type, aggregate, title, format (d3-format), currency (ISO 4217).
hierarchyNoTreemap/sunburst: {type:"nested",data:{name,value,children}} or {type:"adjacency_list",data:[{id,parentId,value}]}. See full schema.
reproduceNoInclude the command and calls for reproducing this result.
descriptionNoOptional override for the synthesized accessibility description. When omitted, a non-empty description is generated from the encodings.
strictFieldsNoWarn about unresolved fields and unmatched map joins (OODS-V131/V134). Default false preserves existing behavior.
a11yEquivalenceNoCheck Vega-Lite accessible equivalents (default true). Errors stop rendering; warnings are returned. ECharts-primary scaffolds are not checked here.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed51 schema fields changed
    • removedInput schema / $defs
      Removed value: -{
      -  "colorEncodingBinding": {
      -    "description": "A color-channel encoding binding: like encodingBinding, plus an optional explicit `range` (hex colors) that overrides the baked OODS categorical palette on a nominal/ordinal color scale. `range` is only valid on the color channel.",
      -    "oneOf": [
      -      {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      {
      -        "additionalProperties": false,
      -        "properties": {
      -          "aggregate": {
      -            "enum": [
      -              "sum",
      -              "count",
      -              "average",
      -              "median",
      -              "min",
      -              "max",
      -              "distinct"
      -            ],
      -            "type": "string"
      -          },
      -          "field": {
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "range": {
      -            "description": "Explicit hex colors for a nominal/ordinal color scale. Overrides the baked OODS categorical palette so an agent can supply its own scale (e.g. a 2-color presence scale). Applied in array order to the distinct series; a shorter range recycles (Vega domain[i]->range[i] mod len). Cartesian color only.",
      -            "items": {
      -              "pattern": "^#(?:[0-9a-fA-F]{3}){1,2}$",
      -              "type": "string"
      -            },
      -            "minItems": 2,
      -            "type": "array"
      -          },
      -          "scale": {
      -            "enum": [
      -              "linear",
      -              "temporal",
      -              "log",
      -              "sqrt",
      -              "band",
      -              "point",
      -              "diverging"
      -            ],
      -            "type": "string"
      -          },
      -          "sort": {
      -            "oneOf": [
      -              {
      -                "enum": [
      -                  "none",
      -                  "ascending",
      -                  "descending"
      -                ],
      -                "type": "string"
      -              },
      -              {
      -                "additionalProperties": false,
      -                "properties": {
      -                  "field": {
      -                    "type": "string"
      -                  },
      -                  "order": {
      -                    "enum": [
      -                      "ascending",
      -                      "descending"
      -                    ],
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "field",
      -                  "order"
      -                ],
      -                "type": "object"
      -              }
      -            ],
      -            "type": [
      -              "string",
      -              "object"
      -            ]
      -          },
      -          "timeUnit": {
      -            "enum": [
      -              "year",
      -              "quarter",
      -              "month",
      -              "week",
      -              "day",
      -              "hour",
      -              "minute",
      -              "second"
      -            ],
      -            "type": "string"
      -          },
      -          "title": {
      -            "type": "string"
      -          },
      -          "type": {
      -            "description": "Force the Vega-Lite/ECharts field type, overriding the engine's data-aware inference. Overrides the inferred field type.",
      -            "enum": [
      -              "quantitative",
      -              "temporal",
      -              "ordinal",
      -              "nominal"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "field"
      -        ],
      -        "type": "object"
      -      }
      -    ],
      -    "type": [
      -      "string",
      -      "object"
      -    ]
      -  },
      -  "encodingBinding": {
      -    "description": "An encoding binding: either a bare field-name string, or an object with the field plus optional aggregate/scale/timeUnit/sort/title.",
      -    "oneOf": [
      -      {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      {
      -        "additionalProperties": false,
      -        "properties": {
      -          "aggregate": {
      -            "enum": [
      -              "sum",
      -              "count",
      -              "average",
      -              "median",
      -              "min",
      -              "max",
      -              "distinct"
      -            ],
      -            "type": "string"
      -          },
      -          "currency": {
      -            "description": "ISO 4217 code of the amounts this channel encodes, for example EUR. The labels print its en-US symbol where the format has \"$\" (EUR €, GBP £); without a format they read \"$,f\" ($12,000). One currency per chart.",
      -            "pattern": "^[A-Za-z]{3}$",
      -            "type": "string"
      -          },
      -          "field": {
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "format": {
      -            "description": "Label format of this channel's axis (x, y) or legend: a d3-format specifier such as \"$,f\" or \",.0f\" (d3-time-format for a temporal field). \"$\" prints the currency symbol: the currency's, else $. Without a precision, labels take the precision of the tick step, so neighbouring ticks never print the same text. Carried in the normalized spec, so artifact_certify replays it.",
      -            "maxLength": 64,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "scale": {
      -            "enum": [
      -              "linear",
      -              "temporal",
      -              "log",
      -              "sqrt",
      -              "band",
      -              "point",
      -              "diverging"
      -            ],
      -            "type": "string"
      -          },
      -          "sort": {
      -            "oneOf": [
      -              {
      -                "enum": [
      -                  "none",
      -                  "ascending",
      -                  "descending"
      -                ],
      -                "type": "string"
      -              },
      -              {
      -                "additionalProperties": false,
      -                "properties": {
      -                  "field": {
      -                    "type": "string"
      -                  },
      -                  "order": {
      -                    "enum": [
      -                      "ascending",
      -                      "descending"
      -                    ],
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "field",
      -                  "order"
      -                ],
      -                "type": "object"
      -              }
      -            ],
      -            "type": [
      -              "string",
      -              "object"
      -            ]
      -          },
      -          "timeUnit": {
      -            "enum": [
      -              "year",
      -              "quarter",
      -              "month",
      -              "week",
      -              "day",
      -              "hour",
      -              "minute",
      -              "second"
      -            ],
      -            "type": "string"
      -          },
      -          "title": {
      -            "type": "string"
      -          },
      -          "type": {
      -            "description": "Force the Vega-Lite/ECharts field type, overriding the engine's data-aware inference. Overrides the inferred field type.",
      -            "enum": [
      -              "quantitative",
      -              "temporal",
      -              "ordinal",
      -              "nominal"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "field"
      -        ],
      -        "type": "object"
      -      }
      -    ],
      -    "type": [
      -      "string",
      -      "object"
      -    ]
      -  },
      -  "hierarchyNode": {
      -    "additionalProperties": true,
      -    "description": "A nested-hierarchy node: a name, an optional numeric value, and optional children (recursive). Extra fields are preserved for tooltips.",
      -    "properties": {
      -      "children": {
      -        "items": {
      -          "$ref": "#/$defs/hierarchyNode",
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "name": {
      -        "type": "string"
      -      },
      -      "value": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "name"
      -    ],
      -    "type": "object"
      -  }
      -}
    • removedInput schema / description
      Removed value: -"Render a real, data-bound visualization. Supply a registered pattern identity to preserve its source data and presentation, chartType + encodings for explicit mode, or rows for suggest or structured-intent mode. Retired patterns are not offered; structurally unsupported patterns return OODS-V167; pattern conflicts with explicit data, intent, or source identity/presentation overrides return OODS-V166. Brand, theme and output controls remain available."
    • changedInput schema / properties / a11yEquivalence / description
      Previous value: -"Checks the drawn chart's accessible equivalents as it is rendered; on by default. For Vega-Lite charts, a rule marked error stops the render (status error, with one OODS-<rule id> code per rule in errors), and a rule marked warn is reported in warnings. Charts built from rows and encodings always pass. Set false only for a spec you supply that is known not to conform. ECharts-primary charts are not checked here, because their scaffold has no data yet."New value: +"Check Vega-Lite accessible equivalents (default true). Errors stop rendering; warnings are returned. ECharts-primary scaffolds are not checked here."
    • changedInput schema / properties / chartType / description
      Previous value: -"Chart type. The tabular marks (bar->MarkBar, line->MarkLine, area->MarkArea, scatter->MarkPoint, heatmap->MarkRect) bind inline rows with x/y encodings. The hierarchy/flow/network/geo charts are explicit-only and return an ECharts option as the primary spec (no Vega-Lite equivalent): 'treemap' and 'sunburst' take the 'hierarchy' data branch; 'sankey' takes the 'sankey' data branch (nodes + value-weighted links); 'force_graph' takes the 'network' data branch (nodes + links); 'choropleth', 'bubble_map', and 'flow_map' take the 'geo' data branch (inline geometry + per-type encoding — flow_map draws origin→destination arcs); 'chord' takes the 'chord' data branch (sankey-shaped nodes + value-weighted links — a ring of category arcs joined by ribbons whose width is the value). Omit chartType to enter suggest mode (the recommender chooses a tabular type from the inferred field profiles)."New value: +"Chart family; Cartesian types need rows and encodings, others their named input. Omit to suggest from rows."
    • removedInput schema / properties / chord / additionalProperties
      Removed value: -false
    • changedInput schema / properties / chord / description
      Previous value: -"Chord data for chartType 'chord' (explicit-only) — used instead of rows + x/y encodings. A native ECharts ribbon diagram: a ring of category arcs connected by weighted ribbons. Sankey-shaped — nodes plus value-weighted links; every link must carry a numeric 'value' (the ribbon width IS the flow magnitude) and reference existing node names — a link naming a node absent from 'nodes' fails loud (OODS-V147)."New value: +"Chord input: {nodes:[{name}],links:[{source,target,value}]}; links refer to node names; each directed pair must be unique."
    • removedInput schema / properties / chord / properties
      Removed value: -{
      -  "links": {
      -    "description": "Directed, value-weighted ribbons between ring arcs (matched to arcs by name). Directed: source→target and target→source are distinct ribbons (a reciprocal pair is valid data). Each (source, target) pair should be unique — a duplicate directed link double-counts the ribbon and is flagged with a warning (OODS-V148).",
      -    "items": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "source": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "target": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "value": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "source",
      -        "target",
      -        "value"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  },
      -  "nodes": {
      -    "description": "Ring arcs. Each carries a unique 'name'.",
      -    "items": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "name": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "value": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "name"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -}
    • removedInput schema / properties / chord / required
      Removed value: -[
      -  "nodes",
      -  "links"
      -]
    • changedInput schema / properties / encodings / description
      Previous value: -"Channel -> field bindings. Required, with at least x and y, when chartType is supplied (explicit mode)."New value: +"Cartesian bindings: each needs field; optional type, aggregate, title, format (d3-format), currency (ISO 4217)."
    • removedInput schema / properties / encodings / properties / color / $ref
      Removed value: -"#/$defs/colorEncodingBinding"
    • addedInput schema / properties / encodings / properties / color / description
      Added value: +"Field name or binding."
    • addedInput schema / properties / encodings / properties / color / type
      Added value: +[
      +  "string",
      +  "object"
      +]
    • removedInput schema / properties / encodings / properties / detail / $ref
      Removed value: -"#/$defs/encodingBinding"
    • addedInput schema / properties / encodings / properties / detail / description
      Added value: +"Field name or binding."
    • addedInput schema / properties / encodings / properties / detail / type
      Added value: +[
      +  "string",
      +  "object"
      +]
    • removedInput schema / properties / encodings / properties / shape / $ref
      Removed value: -"#/$defs/encodingBinding"
    • addedInput schema / properties / encodings / properties / shape / description
      Added value: +"Field name or binding."
    • addedInput schema / properties / encodings / properties / shape / type
      Added value: +[
      +  "string",
      +  "object"
      +]
    • removedInput schema / properties / encodings / properties / size / $ref
      Removed value: -"#/$defs/encodingBinding"
    • addedInput schema / properties / encodings / properties / size / description
      Added value: +"Field name or binding."
    • addedInput schema / properties / encodings / properties / size / type
      Added value: +[
      +  "string",
      +  "object"
      +]
    • removedInput schema / properties / encodings / properties / x / $ref
      Removed value: -"#/$defs/encodingBinding"
    • addedInput schema / properties / encodings / properties / x / description
      Added value: +"Field name or binding."
    • addedInput schema / properties / encodings / properties / x / type
      Added value: +[
      +  "string",
      +  "object"
      +]
    • removedInput schema / properties / encodings / properties / y / $ref
      Removed value: -"#/$defs/encodingBinding"
    • addedInput schema / properties / encodings / properties / y / description
      Added value: +"Field name or binding."
    • addedInput schema / properties / encodings / properties / y / type
      Added value: +[
      +  "string",
      +  "object"
      +]
    • removedInput schema / properties / geo / additionalProperties
      Removed value: -false
    • changedInput schema / properties / geo / description
      Previous value: -"Geo data for chartType 'choropleth', 'bubble_map', or 'flow_map' (explicit-only) — used instead of rows + x/y encodings. Carries inline geometry (a GeoJSON FeatureCollection in 'geojson', or a TopoJSON Topology in 'topojson' + 'topoObjectName'), an optional 'join' that merges tabular 'rows' into features by key, and the per-type encoding: 'valueField' colours regions for choropleth; 'longitudeField'/'latitudeField' (+ optional 'sizeField'/'colorField') place points for bubble_map; 'originLongitudeField'/'originLatitudeField'/'destinationLongitudeField'/'destinationLatitudeField' (+ optional 'strengthField'/'curvature') draw origin→destination arcs for flow_map. Geometry is supplied inline — it is never fetched over the network. Note: geo specs are not self-contained (unlike treemap/sankey): the resolved FeatureCollection rides back on echartsSpec.__registration and the client re-registers the map by name before rendering. Geometry payloads can be large (a world atlas is ~100KB) — prefer a pre-simplified TopoJSON."New value: +"Inline geojson or topojson with topoObjectName, rows, join and valueField; optional point or flow fields. tool_schema gives the full contract."
    • removedInput schema / properties / geo / properties
      Removed value: -{
      -  "colorField": {
      -    "description": "Bubble map: optional row field driving bubble colour.",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "colorScale": {
      -    "description": "Optional colour scale (defaults to a continuous linear ramp). 'ordinal' paints discrete per-category colours; 'diverging' ramps two hues about a neutral midpoint (zero).",
      -    "enum": [
      -      "linear",
      -      "quantize",
      -      "quantile",
      -      "threshold",
      -      "ordinal",
      -      "diverging"
      -    ],
      -    "type": "string"
      -  },
      -  "curvature": {
      -    "description": "Flow map: optional arc curveness (0 = straight, ~0.3 default). Bends each origin→destination line into an arc.",
      -    "maximum": 1,
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  "destinationLatitudeField": {
      -    "description": "Flow map: the row field holding the destination latitude. Required for flow_map.",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "destinationLongitudeField": {
      -    "description": "Flow map: the row field holding the destination longitude. Required for flow_map.",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "geojson": {
      -    "additionalProperties": true,
      -    "description": "Inline GeoJSON FeatureCollection (type:'FeatureCollection', features:[...]). Required for choropleth (the regions); optional base map for bubble_map.",
      -    "type": "object"
      -  },
      -  "join": {
      -    "additionalProperties": false,
      -    "description": "Choropleth join: merge each row into the feature whose 'featureProperty' equals the row's 'dataKey' value.",
      -    "properties": {
      -      "dataKey": {
      -        "description": "Key in each tabular row.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "featureProperty": {
      -        "description": "Matching property name in each feature's properties.",
      -        "minLength": 1,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "dataKey",
      -      "featureProperty"
      -    ],
      -    "type": "object"
      -  },
      -  "latitudeField": {
      -    "description": "Bubble map: the row field holding latitude. Required for bubble_map.",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "longitudeField": {
      -    "description": "Bubble map: the row field holding longitude. Required for bubble_map.",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "originLatitudeField": {
      -    "description": "Flow map: the row field holding the origin latitude. Required for flow_map.",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "originLongitudeField": {
      -    "description": "Flow map: the row field holding the origin longitude. Required for flow_map.",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "rows": {
      -    "description": "Tabular records: for choropleth, the values joined into features (paired with 'join'); for bubble_map, the points to plot.",
      -    "items": {
      -      "additionalProperties": true,
      -      "type": "object"
      -    },
      -    "maxItems": 5000,
      -    "type": "array"
      -  },
      -  "sizeField": {
      -    "description": "Bubble map: optional row field driving bubble size.",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "strengthField": {
      -    "description": "Flow map: optional numeric row field whose magnitude drives each arc's line width (via a continuous visualMap).",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "topoObjectName": {
      -    "description": "Which TopoJSON object to extract (defaults to the sole object when there is exactly one).",
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "topojson": {
      -    "additionalProperties": true,
      -    "description": "Inline TopoJSON Topology (type:'Topology'); converted to a GeoJSON FeatureCollection. Set 'topoObjectName' when the topology holds more than one object.",
      -    "type": "object"
      -  },
      -  "valueField": {
      -    "description": "Choropleth: the numeric field — in feature properties, or merged in via 'join' — whose value colours each region. Required for choropleth.",
      -    "minLength": 1,
      -    "type": "string"
      -  }
      -}
    • changedInput schema / properties / hierarchy / description
      Previous value: -"Hierarchy data for chartType 'treemap' or 'sunburst' (explicit-only) — used instead of rows + x/y encodings. A discriminated union on 'type': 'adjacency_list' (flat nodes linked by parentId; a node whose parent is missing becomes its own root) or 'nested' (a single root node with children)."New value: +"Treemap/sunburst: {type:\"nested\",data:{name,value,children}} or {type:\"adjacency_list\",data:[{id,parentId,value}]}. See full schema."
    • removedInput schema / properties / hierarchy / oneOf
      Removed value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "data": {
      -        "description": "Flat node list. Each node carries id, parentId (null for roots), and a numeric value.",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "id": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "name": {
      -              "type": "string"
      -            },
      -            "parentId": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "value": {
      -              "type": "number"
      -            }
      -          },
      -          "required": [
      -            "id",
      -            "parentId",
      -            "value"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "adjacency_list",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "data": {
      -        "$ref": "#/$defs/hierarchyNode",
      -        "type": "object"
      -      },
      -      "type": {
      -        "const": "nested",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "data"
      -    ],
      -    "type": "object"
      -  }
      -]
    • removedInput schema / properties / intent / additionalProperties
      Removed value: -false
    • changedInput schema / properties / intent / description
      Previous value: -"Structured (typed, not free-text) visualization intent — the deterministic half of the NL→viz hand-off. Supply it instead of chartType/encodings (mutually exclusive with chartType): the named measures/dimensions drive encoding, `goal` + the data drive the recommender's chartType pick, an optional `chartFamily` post-filters that pick. Requires `rows`."New value: +"Structured request: goal, measures and dimensions, with optional chartFamily; uses rows instead of explicit chartType and encodings."
    • removedInput schema / properties / intent / properties
      Removed value: -{
      -  "chartFamily": {
      -    "description": "Optional preferred chart family. Post-filters the recommender ranking (not a scorer term) to this family, flagged lowConfidence when it was not the recommender's top pick. Constrained to the 5 tabular marks — the 8 explicit-only types are not recommender-rankable.",
      -    "enum": [
      -      "bar",
      -      "line",
      -      "area",
      -      "scatter",
      -      "heatmap"
      -    ],
      -    "type": "string"
      -  },
      -  "dimensions": {
      -    "description": "Named dimension fields (the breakdowns/axes); may be empty (e.g. a two-measure scatter). Each name must exist among the data rows' fields. `type` is reserved in v0.1 (field types infer from the data).",
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "name": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "type": {
      -          "enum": [
      -            "quantitative",
      -            "temporal",
      -            "nominal",
      -            "ordinal"
      -          ],
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "name"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  "goal": {
      -    "description": "The analytical goal that steers the recommender (the live 7-value goal vocabulary).",
      -    "enum": [
      -      "comparison",
      -      "trend",
      -      "composition",
      -      "part-to-whole",
      -      "relationship",
      -      "intensity",
      -      "distribution"
      -    ],
      -    "type": "string"
      -  },
      -  "measures": {
      -    "description": "Named measure fields (the metrics to plot). Each name must exist among the data rows' fields. `type` is reserved in v0.1 (field types infer from the data).",
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "name": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "type": {
      -          "enum": [
      -            "quantitative",
      -            "temporal",
      -            "nominal",
      -            "ordinal"
      -          ],
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "name"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -}
    • removedInput schema / properties / intent / required
      Removed value: -[
      -  "goal",
      -  "measures",
      -  "dimensions"
      -]
    • removedInput schema / properties / network / additionalProperties
      Removed value: -false
    • changedInput schema / properties / network / description
      Previous value: -"Network data for chartType 'force_graph' (explicit-only) — used instead of rows + x/y encodings. Nodes (each with a unique 'id'; an optional 'group' drives category colour) and directed links (optional numeric 'value'). Every link must reference existing node ids — a link naming a node absent from 'nodes' fails loud (OODS-V147)."New value: +"Force graph: nodes [{id,group}] and links [{source,target,value}], at most 250 nodes."
    • removedInput schema / properties / network / properties
      Removed value: -{
      -  "links": {
      -    "description": "Directed edges between nodes (an empty array is allowed for an all-isolated-nodes graph). Each 'source'/'target' must match a node 'id' (a dangling ref fails loud, OODS-V147). Directed: source→target and target→source are distinct edges. Each (source, target) pair should be unique — a duplicate directed edge double-counts and is flagged with a warning (OODS-V148).",
      -    "items": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "source": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "target": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "value": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "source",
      -        "target"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  "nodes": {
      -    "description": "Graph nodes. Each carries a unique 'id'; optional 'group' (category) and 'value' (sizing).",
      -    "items": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "group": {
      -          "type": "string"
      -        },
      -        "id": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "value": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "id"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -}
    • removedInput schema / properties / network / required
      Removed value: -[
      -  "nodes",
      -  "links"
      -]
    • changedInput schema / properties / opacity / description
      Previous value: -"Optional constant mark opacity for the five Cartesian chart families. Preserved in normalized mark options and applied to both Vega-Lite and ECharts pixels. Omission preserves renderer defaults. Unsupported for hierarchy, network and geographic chart families."New value: +"Constant mark opacity for Cartesian charts only; omission keeps renderer defaults."
    • changedInput schema / properties / output / description
      Previous value: -"Optional drawing and accessibility outputs; the default reply contains hashes and certification."New value: +"Optional outputs; default reply has hashes and certification."
    • changedInput schema / properties / pattern / description
      Previous value: -"Exact versioned pattern source identity. Renderable patterns preserve source rows, identity, presentation and accessibility metadata. Retired identities are not offered (their reasons are in the viz taxonomy). Structurally unsupported scenes return OODS-V167. Static SVG shows the default selection state (OODS-V175). Cannot be combined with chartType, encodings, rows, intent, hierarchy, sankey, chord, network, geo, id, name, description or opacity (OODS-V166)."New value: +"Exact registered pattern identity; preserves source data and presentation. Cannot combine with chartType, data, intent or identity/presentation overrides."
    • changedInput schema / properties / rows / description
      Previous value: -"Inline data rows — the primary data path. Bounded: a few hundred rows is the sweet spot. Each row is a flat object mapping field name to value."New value: +"Inline flat data rows."
    • addedInput schema / properties / rows / items / description
      Added value: +"rows item."
    • removedInput schema / properties / sankey / additionalProperties
      Removed value: -false
    • changedInput schema / properties / sankey / description
      Previous value: -"Flow data for chartType 'sankey' (explicit-only) — used instead of rows + x/y encodings. Nodes plus value-weighted links; every link must carry a numeric 'value' (the link width IS the flow magnitude) and reference existing node names."New value: +"Sankey input: {nodes:[{name}],links:[{source,target,value}]}; links refer to node names. Use chartType:\"sankey\"."
    • removedInput schema / properties / sankey / properties
      Removed value: -{
      -  "links": {
      -    "description": "Directed, value-weighted flows between nodes. Each (source, target) pair should be unique — a duplicate directed flow double-counts the link width. (Uniqueness is advisory for sankey; it is not warning-enforced.)",
      -    "items": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "source": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "target": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "value": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "source",
      -        "target",
      -        "value"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  },
      -  "nodes": {
      -    "description": "Flow nodes. Each carries a unique 'name'; an optional numeric 'value' overrides the computed throughput.",
      -    "items": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "name": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "value": {
      -          "type": "number"
      -        }
      -      },
      -      "required": [
      -        "name"
      -      ],
      -      "type": "object"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -}
    • removedInput schema / properties / sankey / required
      Removed value: -[
      -  "nodes",
      -  "links"
      -]
    • changedInput schema / properties / strictFields / description
      Previous value: -"Strict field checks. When true, a data key that does not resolve is reported in warnings instead of producing a silently wrong chart: an encoding that names a field missing from every non-empty row (OODS-V131), or a choropleth region whose join key matches no map feature (OODS-V134, one per unmatched region). The default, false, keeps the current behavior, which drops unmatched map regions silently. Dashboard_render has its own strictFields, which turns OODS-V131 into an error panel through its onPanelError option."New value: +"Warn about unresolved fields and unmatched map joins (OODS-V131/V134). Default false preserves existing behavior."
    • removedInput schema / title
      Removed value: -"Viz render input"
  2. Changed44 schema fields changed
    • changedInput schema / $defs / colorEncodingBinding / oneOf
      Previous value: -[
      -  {
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "aggregate": {
      -        "enum": [
      -          "sum",
      -          "count",
      -          "average",
      -          "median",
      -          "min",
      -          "max",
      -          "distinct"
      -        ],
      -        "type": "string"
      -      },
      -      "field": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "range": {
      -        "description": "Explicit hex colors for a nominal/ordinal color scale. Overrides the baked OODS categorical palette so an agent can supply its own scale (e.g. a 2-color presence scale). Applied in array order to the distinct series; a shorter range recycles (Vega domain[i]->range[i] mod len). Cartesian color only.",
      -        "items": {
      -          "pattern": "^#(?:[0-9a-fA-F]{3}){1,2}$",
      -          "type": "string"
      -        },
      -        "minItems": 2,
      -        "type": "array"
      -      },
      -      "scale": {
      -        "enum": [
      -          "linear",
      -          "temporal",
      -          "log",
      -          "sqrt",
      -          "band",
      -          "point",
      -          "diverging"
      -        ],
      -        "type": "string"
      -      },
      -      "sort": {
      -        "oneOf": [
      -          {
      -            "enum": [
      -              "none",
      -              "ascending",
      -              "descending"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "field": {
      -                "type": "string"
      -              },
      -              "order": {
      -                "enum": [
      -                  "ascending",
      -                  "descending"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "field",
      -              "order"
      -            ],
      -            "type": "object"
      -          }
      -        ]
      -      },
      -      "timeUnit": {
      -        "enum": [
      -          "year",
      -          "quarter",
      -          "month",
      -          "week",
      -          "day",
      -          "hour",
      -          "minute",
      -          "second"
      -        ],
      -        "type": "string"
      -      },
      -      "title": {
      -        "type": "string"
      -      },
      -      "type": {
      -        "description": "Force the Vega-Lite/ECharts field type, overriding the engine's data-aware inference. Overrides the inferred field type.",
      -        "enum": [
      -          "quantitative",
      -          "temporal",
      -          "ordinal",
      -          "nominal"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "field"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "aggregate": {
      +        "enum": [
      +          "sum",
      +          "count",
      +          "average",
      +          "median",
      +          "min",
      +          "max",
      +          "distinct"
      +        ],
      +        "type": "string"
      +      },
      +      "field": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "range": {
      +        "description": "Explicit hex colors for a nominal/ordinal color scale. Overrides the baked OODS categorical palette so an agent can supply its own scale (e.g. a 2-color presence scale). Applied in array order to the distinct series; a shorter range recycles (Vega domain[i]->range[i] mod len). Cartesian color only.",
      +        "items": {
      +          "pattern": "^#(?:[0-9a-fA-F]{3}){1,2}$",
      +          "type": "string"
      +        },
      +        "minItems": 2,
      +        "type": "array"
      +      },
      +      "scale": {
      +        "enum": [
      +          "linear",
      +          "temporal",
      +          "log",
      +          "sqrt",
      +          "band",
      +          "point",
      +          "diverging"
      +        ],
      +        "type": "string"
      +      },
      +      "sort": {
      +        "oneOf": [
      +          {
      +            "enum": [
      +              "none",
      +              "ascending",
      +              "descending"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "field": {
      +                "type": "string"
      +              },
      +              "order": {
      +                "enum": [
      +                  "ascending",
      +                  "descending"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "field",
      +              "order"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "type": [
      +          "string",
      +          "object"
      +        ]
      +      },
      +      "timeUnit": {
      +        "enum": [
      +          "year",
      +          "quarter",
      +          "month",
      +          "week",
      +          "day",
      +          "hour",
      +          "minute",
      +          "second"
      +        ],
      +        "type": "string"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "Force the Vega-Lite/ECharts field type, overriding the engine's data-aware inference. Overrides the inferred field type.",
      +        "enum": [
      +          "quantitative",
      +          "temporal",
      +          "ordinal",
      +          "nominal"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "field"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / $defs / colorEncodingBinding / type
      Added value: +[
      +  "string",
      +  "object"
      +]
    • changedInput schema / $defs / encodingBinding / oneOf
      Previous value: -[
      -  {
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "aggregate": {
      -        "enum": [
      -          "sum",
      -          "count",
      -          "average",
      -          "median",
      -          "min",
      -          "max",
      -          "distinct"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "description": "ISO 4217 code of the amounts this channel encodes, for example EUR. The labels print its en-US symbol where the format has \"$\" (EUR €, GBP £); without a format they read \"$,f\" ($12,000). One currency per chart.",
      -        "pattern": "^[A-Za-z]{3}$",
      -        "type": "string"
      -      },
      -      "field": {
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "format": {
      -        "description": "Label format of this channel's axis (x, y) or legend: a d3-format specifier such as \"$,f\" or \",.0f\" (d3-time-format for a temporal field). \"$\" prints the currency symbol: the currency's, else $. Without a precision, labels take the precision of the tick step, so neighbouring ticks never print the same text. Carried in the normalized spec, so artifact.certify replays it.",
      -        "maxLength": 64,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "scale": {
      -        "enum": [
      -          "linear",
      -          "temporal",
      -          "log",
      -          "sqrt",
      -          "band",
      -          "point",
      -          "diverging"
      -        ],
      -        "type": "string"
      -      },
      -      "sort": {
      -        "oneOf": [
      -          {
      -            "enum": [
      -              "none",
      -              "ascending",
      -              "descending"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "field": {
      -                "type": "string"
      -              },
      -              "order": {
      -                "enum": [
      -                  "ascending",
      -                  "descending"
      -                ],
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "field",
      -              "order"
      -            ],
      -            "type": "object"
      -          }
      -        ]
      -      },
      -      "timeUnit": {
      -        "enum": [
      -          "year",
      -          "quarter",
      -          "month",
      -          "week",
      -          "day",
      -          "hour",
      -          "minute",
      -          "second"
      -        ],
      -        "type": "string"
      -      },
      -      "title": {
      -        "type": "string"
      -      },
      -      "type": {
      -        "description": "Force the Vega-Lite/ECharts field type, overriding the engine's data-aware inference. Overrides the inferred field type.",
      -        "enum": [
      -          "quantitative",
      -          "temporal",
      -          "ordinal",
      -          "nominal"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "field"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "aggregate": {
      +        "enum": [
      +          "sum",
      +          "count",
      +          "average",
      +          "median",
      +          "min",
      +          "max",
      +          "distinct"
      +        ],
      +        "type": "string"
      +      },
      +      "currency": {
      +        "description": "ISO 4217 code of the amounts this channel encodes, for example EUR. The labels print its en-US symbol where the format has \"$\" (EUR €, GBP £); without a format they read \"$,f\" ($12,000). One currency per chart.",
      +        "pattern": "^[A-Za-z]{3}$",
      +        "type": "string"
      +      },
      +      "field": {
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "format": {
      +        "description": "Label format of this channel's axis (x, y) or legend: a d3-format specifier such as \"$,f\" or \",.0f\" (d3-time-format for a temporal field). \"$\" prints the currency symbol: the currency's, else $. Without a precision, labels take the precision of the tick step, so neighbouring ticks never print the same text. Carried in the normalized spec, so artifact_certify replays it.",
      +        "maxLength": 64,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "scale": {
      +        "enum": [
      +          "linear",
      +          "temporal",
      +          "log",
      +          "sqrt",
      +          "band",
      +          "point",
      +          "diverging"
      +        ],
      +        "type": "string"
      +      },
      +      "sort": {
      +        "oneOf": [
      +          {
      +            "enum": [
      +              "none",
      +              "ascending",
      +              "descending"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "field": {
      +                "type": "string"
      +              },
      +              "order": {
      +                "enum": [
      +                  "ascending",
      +                  "descending"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "field",
      +              "order"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "type": [
      +          "string",
      +          "object"
      +        ]
      +      },
      +      "timeUnit": {
      +        "enum": [
      +          "year",
      +          "quarter",
      +          "month",
      +          "week",
      +          "day",
      +          "hour",
      +          "minute",
      +          "second"
      +        ],
      +        "type": "string"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "description": "Force the Vega-Lite/ECharts field type, overriding the engine's data-aware inference. Overrides the inferred field type.",
      +        "enum": [
      +          "quantitative",
      +          "temporal",
      +          "ordinal",
      +          "nominal"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "field"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / $defs / encodingBinding / type
      Added value: +[
      +  "string",
      +  "object"
      +]
    • addedInput schema / $defs / hierarchyNode / properties / children / items / type
      Added value: +"object"
    • removedInput schema / $id
      Removed value: -"https://designlab.local/schemas/viz.render.input.json"
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • changedInput schema / properties / a11yEquivalence / description
      Previous value: -"A11y equivalence CERTIFY-AT-EMISSION switch. DEFAULT ON. The cartesian (Vega-Lite) emission is checked against the accessible-equivalence engine (validateVizEquivalenceRules): error-severity rules BLOCK (status:'error' with per-rule OODS-<rule.id> codes in `errors`), warn-severity failures surface in `warnings` as OODS-<rule.id>. Default builder output is conformant-BY-CONSTRUCTION , so generated specs pass; set false to opt out for agent-supplied non-conformant specs. Scoped to the cartesian path (the ECharts-primary scaffold has empty data and would spuriously fail data-equivalence rules)."New value: +"Checks the drawn chart's accessible equivalents as it is rendered; on by default. For Vega-Lite charts, a rule marked error stops the render (status error, with one OODS-<rule id> code per rule in errors), and a rule marked warn is reported in warnings. Charts built from rows and encodings always pass. Set false only for a spec you supply that is known not to conform. ECharts-primary charts are not checked here, because their scaffold has no data yet."
    • addedInput schema / properties / brand / description
      Added value: +"Token brand for drawing and certification."
    • changedInput schema / properties / chord / description
      Previous value: -"Chord data for chartType 'chord' (explicit-only) — used INSTEAD of rows + x/y encodings. A native ECharts ribbon diagram: a ring of category arcs connected by weighted ribbons. Sankey-shaped — nodes plus value-weighted links; every link MUST carry a numeric 'value' (the ribbon width IS the flow magnitude) and reference existing node names — a link naming a node absent from 'nodes' fails loud (OODS-V147)."New value: +"Chord data for chartType 'chord' (explicit-only) — used instead of rows + x/y encodings. A native ECharts ribbon diagram: a ring of category arcs connected by weighted ribbons. Sankey-shaped — nodes plus value-weighted links; every link must carry a numeric 'value' (the ribbon width IS the flow magnitude) and reference existing node names — a link naming a node absent from 'nodes' fails loud (OODS-V147)."
    • changedInput schema / properties / geo / description
      Previous value: -"Geo data for chartType 'choropleth', 'bubble_map', or 'flow_map' (explicit-only) — used INSTEAD of rows + x/y encodings. Carries INLINE geometry (a GeoJSON FeatureCollection in 'geojson', or a TopoJSON Topology in 'topojson' + 'topoObjectName'), an optional 'join' that merges tabular 'rows' into features by key, and the per-type encoding: 'valueField' colours regions for choropleth; 'longitudeField'/'latitudeField' (+ optional 'sizeField'/'colorField') place points for bubble_map; 'originLongitudeField'/'originLatitudeField'/'destinationLongitudeField'/'destinationLatitudeField' (+ optional 'strengthField'/'curvature') draw origin→destination ARCS for flow_map. Geometry is supplied INLINE — it is never fetched over the network. NOTE: geo specs are NOT self-contained (unlike treemap/sankey): the resolved FeatureCollection rides back on echartsSpec.__registration and the client re-registers the map by name before rendering. Geometry payloads can be large (a world atlas is ~100KB) — prefer a pre-simplified TopoJSON."New value: +"Geo data for chartType 'choropleth', 'bubble_map', or 'flow_map' (explicit-only) — used instead of rows + x/y encodings. Carries inline geometry (a GeoJSON FeatureCollection in 'geojson', or a TopoJSON Topology in 'topojson' + 'topoObjectName'), an optional 'join' that merges tabular 'rows' into features by key, and the per-type encoding: 'valueField' colours regions for choropleth; 'longitudeField'/'latitudeField' (+ optional 'sizeField'/'colorField') place points for bubble_map; 'originLongitudeField'/'originLatitudeField'/'destinationLongitudeField'/'destinationLatitudeField' (+ optional 'strengthField'/'curvature') draw origin→destination arcs for flow_map. Geometry is supplied inline — it is never fetched over the network. Note: geo specs are not self-contained (unlike treemap/sankey): the resolved FeatureCollection rides back on echartsSpec.__registration and the client re-registers the map by name before rendering. Geometry payloads can be large (a world atlas is ~100KB) — prefer a pre-simplified TopoJSON."
    • changedInput schema / properties / geo / properties / destinationLatitudeField / description
      Previous value: -"Flow map: the row field holding the DESTINATION latitude. Required for flow_map."New value: +"Flow map: the row field holding the destination latitude. Required for flow_map."
    • changedInput schema / properties / geo / properties / destinationLongitudeField / description
      Previous value: -"Flow map: the row field holding the DESTINATION longitude. Required for flow_map."New value: +"Flow map: the row field holding the destination longitude. Required for flow_map."
    • changedInput schema / properties / geo / properties / originLatitudeField / description
      Previous value: -"Flow map: the row field holding the ORIGIN latitude. Required for flow_map."New value: +"Flow map: the row field holding the origin latitude. Required for flow_map."
    • changedInput schema / properties / geo / properties / originLongitudeField / description
      Previous value: -"Flow map: the row field holding the ORIGIN longitude. Required for flow_map."New value: +"Flow map: the row field holding the origin longitude. Required for flow_map."
    • changedInput schema / properties / hierarchy / description
      Previous value: -"Hierarchy data for chartType 'treemap' or 'sunburst' (explicit-only) — used INSTEAD of rows + x/y encodings. A discriminated union on 'type': 'adjacency_list' (flat nodes linked by parentId; a node whose parent is missing becomes its own root) or 'nested' (a single root node with children)."New value: +"Hierarchy data for chartType 'treemap' or 'sunburst' (explicit-only) — used instead of rows + x/y encodings. A discriminated union on 'type': 'adjacency_list' (flat nodes linked by parentId; a node whose parent is missing becomes its own root) or 'nested' (a single root node with children)."
    • changedInput schema / properties / hierarchy / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "data": {
      -        "description": "Flat node list. Each node carries id, parentId (null for roots), and a numeric value.",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "id": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "name": {
      -              "type": "string"
      -            },
      -            "parentId": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "value": {
      -              "type": "number"
      -            }
      -          },
      -          "required": [
      -            "id",
      -            "parentId",
      -            "value"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "adjacency_list"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "data": {
      -        "$ref": "#/$defs/hierarchyNode"
      -      },
      -      "type": {
      -        "const": "nested"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "data"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "data": {
      +        "description": "Flat node list. Each node carries id, parentId (null for roots), and a numeric value.",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "id": {
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "name": {
      +              "type": "string"
      +            },
      +            "parentId": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "value": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "id",
      +            "parentId",
      +            "value"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "adjacency_list",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "data": {
      +        "$ref": "#/$defs/hierarchyNode",
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "nested",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "data"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / hierarchy / type
      Added value: +"object"
    • changedInput schema / properties / intent / description
      Previous value: -"STRUCTURED (typed, NOT free-text) visualization intent — the deterministic half of the NL→viz hand-off. Supply it INSTEAD of chartType/encodings (mutually exclusive with chartType): the named measures/dimensions drive ENCODING, `goal` + the data drive the recommender's chartType pick, an optional `chartFamily` post-filters that pick. Requires `rows`."New value: +"Structured (typed, not free-text) visualization intent — the deterministic half of the NL→viz hand-off. Supply it instead of chartType/encodings (mutually exclusive with chartType): the named measures/dimensions drive encoding, `goal` + the data drive the recommender's chartType pick, an optional `chartFamily` post-filters that pick. Requires `rows`."
    • changedInput schema / properties / intent / properties / chartFamily / description
      Previous value: -"Optional preferred chart family. Post-filters the recommender ranking (NOT a scorer term) to this family, flagged lowConfidence when it was not the recommender's top pick. Constrained to the 5 TABULAR marks — the 8 explicit-only types are not recommender-rankable."New value: +"Optional preferred chart family. Post-filters the recommender ranking (not a scorer term) to this family, flagged lowConfidence when it was not the recommender's top pick. Constrained to the 5 tabular marks — the 8 explicit-only types are not recommender-rankable."
    • changedInput schema / properties / intent / properties / dimensions / description
      Previous value: -"Named dimension fields (the breakdowns/axes); may be empty (e.g. a two-measure scatter). Each name MUST exist among the data rows' fields. `type` is RESERVED in v0.1 (field types infer from the data)."New value: +"Named dimension fields (the breakdowns/axes); may be empty (e.g. a two-measure scatter). Each name must exist among the data rows' fields. `type` is reserved in v0.1 (field types infer from the data)."
    • changedInput schema / properties / intent / properties / measures / description
      Previous value: -"Named measure fields (the metrics to plot). Each name MUST exist among the data rows' fields. `type` is RESERVED in v0.1 (field types infer from the data)."New value: +"Named measure fields (the metrics to plot). Each name must exist among the data rows' fields. `type` is reserved in v0.1 (field types infer from the data)."
    • changedInput schema / properties / network / description
      Previous value: -"Network data for chartType 'force_graph' (explicit-only) — used INSTEAD of rows + x/y encodings. Nodes (each with a unique 'id'; an optional 'group' drives category colour) and directed links (optional numeric 'value'). Every link MUST reference existing node ids — a link naming a node absent from 'nodes' fails loud (OODS-V147)."New value: +"Network data for chartType 'force_graph' (explicit-only) — used instead of rows + x/y encodings. Nodes (each with a unique 'id'; an optional 'group' drives category colour) and directed links (optional numeric 'value'). Every link must reference existing node ids — a link naming a node absent from 'nodes' fails loud (OODS-V147)."
    • changedInput schema / properties / network / properties / links / description
      Previous value: -"Directed edges between nodes (an empty array is allowed for an all-isolated-nodes graph). Each 'source'/'target' MUST match a node 'id' (a dangling ref fails loud, OODS-V147). Directed: source→target and target→source are distinct edges. Each (source, target) pair should be unique — a duplicate directed edge double-counts and is flagged with a warning (OODS-V148)."New value: +"Directed edges between nodes (an empty array is allowed for an all-isolated-nodes graph). Each 'source'/'target' must match a node 'id' (a dangling ref fails loud, OODS-V147). Directed: source→target and target→source are distinct edges. Each (source, target) pair should be unique — a duplicate directed edge double-counts and is flagged with a warning (OODS-V148)."
    • addedInput schema / properties / output / description
      Added value: +"Optional drawing and accessibility outputs; the default reply contains hashes and certification."
    • addedInput schema / properties / output / properties / height / description
      Added value: +"Drawing height in pixels."
    • removedInput schema / properties / output / properties / includeA11y / const
      Removed value: -true
    • addedInput schema / properties / output / properties / includeA11y / default
      Added value: +false
    • addedInput schema / properties / output / properties / includeA11y / description
      Added value: +"Include the accessible data table and narrative."
    • addedInput schema / properties / output / properties / includeA11y / type
      Added value: +"boolean"
    • removedInput schema / properties / output / properties / includeNormalizedSpec / const
      Removed value: -true
    • addedInput schema / properties / output / properties / includeNormalizedSpec / default
      Added value: +false
    • addedInput schema / properties / output / properties / includeNormalizedSpec / description
      Added value: +"Include the normalized chart specification."
    • addedInput schema / properties / output / properties / includeNormalizedSpec / type
      Added value: +"boolean"
    • removedInput schema / properties / output / properties / svg / const
      Removed value: -true
    • addedInput schema / properties / output / properties / svg / default
      Added value: +false
    • addedInput schema / properties / output / properties / svg / description
      Added value: +"Include the SVG drawing, for displaying the chart."
    • addedInput schema / properties / output / properties / svg / type
      Added value: +"boolean"
    • addedInput schema / properties / output / properties / width / description
      Added value: +"Drawing width in pixels."
    • changedInput schema / properties / pattern / enum
      Previous value: -[
      -  "pattern:viz:bubble-distribution",
      -  "pattern:viz:correlation-matrix",
      -  "pattern:viz:correlation-scatter",
      -  "pattern:viz:detail-overview-bar",
      -  "pattern:viz:diverging-bar",
      -  "pattern:viz:drilldown-stacked-bar",
      -  "pattern:viz:facet-small-multiples-line",
      -  "pattern:viz:facet-target-band",
      -  "pattern:viz:focus-context-line",
      -  "pattern:viz:grouped-bar",
      -  "pattern:viz:histogram",
      -  "pattern:viz:layered-line-area",
      -  "pattern:viz:multi-series-line",
      -  "pattern:viz:running-total-area",
      -  "pattern:viz:simple-bar",
      -  "pattern:viz:sparkline-grid",
      -  "pattern:viz:stacked-100-bar",
      -  "pattern:viz:stacked-area-projection",
      -  "pattern:viz:stacked-bar",
      -  "pattern:viz:target-band-line",
      -  "pattern:viz:time-grid-heatmap",
      -  "pattern:viz:waterfall"
      -]New value: +[
      +  "pattern:viz:bubble-distribution",
      +  "pattern:viz:correlation-matrix",
      +  "pattern:viz:correlation-scatter",
      +  "pattern:viz:detail-overview-bar",
      +  "pattern:viz:diverging-bar",
      +  "pattern:viz:drilldown-stacked-bar",
      +  "pattern:viz:facet-small-multiples-line",
      +  "pattern:viz:facet-target-band",
      +  "pattern:viz:focus-context-line",
      +  "pattern:viz:grouped-bar",
      +  "pattern:viz:histogram",
      +  "pattern:viz:layered-line-area",
      +  "pattern:viz:multi-series-line",
      +  "pattern:viz:running-total-area",
      +  "pattern:viz:simple-bar",
      +  "pattern:viz:stacked-100-bar",
      +  "pattern:viz:stacked-area-projection",
      +  "pattern:viz:stacked-bar",
      +  "pattern:viz:target-band-line",
      +  "pattern:viz:time-grid-heatmap",
      +  "pattern:viz:waterfall"
      +]
    • addedInput schema / properties / reproduce
      Added value: +{
      +  "default": false,
      +  "description": "Include the command and calls for reproducing this result.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / sankey / description
      Previous value: -"Flow data for chartType 'sankey' (explicit-only) — used INSTEAD of rows + x/y encodings. Nodes plus value-weighted links; every link MUST carry a numeric 'value' (the link width IS the flow magnitude) and reference existing node names."New value: +"Flow data for chartType 'sankey' (explicit-only) — used instead of rows + x/y encodings. Nodes plus value-weighted links; every link must carry a numeric 'value' (the link width IS the flow magnitude) and reference existing node names."
    • changedInput schema / properties / strictFields / description
      Previous value: -"Field/key-presence STRICT switch. When true, a referenced data key that does not resolve is surfaced in `warnings` instead of a silent confident-wrong result: (m05) an explicit tabular chart whose encoding references a field ABSENT from every (non-empty) row → OODS-V131; (m06) a choropleth corridor whose join key has NO matching map feature → OODS-V134 (per unmatched corridor). DEFAULT false keeps today's behavior byte-identical (the geo silent-drop preserved). The dashboard.render strict check (its own `strictFields`) escalates V131 to an error panel via `onPanelError`."New value: +"Strict field checks. When true, a data key that does not resolve is reported in warnings instead of producing a silently wrong chart: an encoding that names a field missing from every non-empty row (OODS-V131), or a choropleth region whose join key matches no map feature (OODS-V134, one per unmatched region). The default, false, keeps the current behavior, which drops unmatched map regions silently. Dashboard_render has its own strictFields, which turns OODS-V131 into an error panel through its onPanelError option."
    • addedInput schema / properties / theme / description
      Added value: +"Colour theme for drawing and certification."
  3. Changed12 schema fields changed
    • removedInput schema / $defs / nonPatternInput
      Removed value: -{
      -  "allOf": [
      -    {
      -      "if": {
      -        "properties": {
      -          "chartType": {
      -            "enum": [
      -              "bar",
      -              "line",
      -              "area",
      -              "scatter",
      -              "heatmap"
      -            ]
      -          }
      -        },
      -        "required": [
      -          "chartType"
      -        ]
      -      },
      -      "then": {
      -        "properties": {
      -          "encodings": {
      -            "required": [
      -              "x",
      -              "y"
      -            ]
      -          }
      -        },
      -        "required": [
      -          "encodings"
      -        ]
      -      }
      -    },
      -    {
      -      "if": {
      -        "properties": {
      -          "chartType": {
      -            "enum": [
      -              "treemap",
      -              "sunburst"
      -            ]
      -          }
      -        },
      -        "required": [
      -          "chartType"
      -        ]
      -      },
      -      "then": {
      -        "required": [
      -          "hierarchy"
      -        ]
      -      }
      -    },
      -    {
      -      "if": {
      -        "properties": {
      -          "chartType": {
      -            "const": "sankey"
      -          }
      -        },
      -        "required": [
      -          "chartType"
      -        ]
      -      },
      -      "then": {
      -        "required": [
      -          "sankey"
      -        ]
      -      }
      -    },
      -    {
      -      "if": {
      -        "properties": {
      -          "chartType": {
      -            "const": "force_graph"
      -          }
      -        },
      -        "required": [
      -          "chartType"
      -        ]
      -      },
      -      "then": {
      -        "required": [
      -          "network"
      -        ]
      -      }
      -    },
      -    {
      -      "if": {
      -        "properties": {
      -          "chartType": {
      -            "const": "choropleth"
      -          }
      -        },
      -        "required": [
      -          "chartType"
      -        ]
      -      },
      -      "then": {
      -        "properties": {
      -          "geo": {
      -            "anyOf": [
      -              {
      -                "required": [
      -                  "geojson"
      -                ]
      -              },
      -              {
      -                "required": [
      -                  "topojson"
      -                ]
      -              }
      -            ],
      -            "required": [
      -              "valueField"
      -            ]
      -          }
      -        },
      -        "required": [
      -          "geo"
      -        ]
      -      }
      -    },
      -    {
      -      "if": {
      -        "properties": {
      -          "chartType": {
      -            "const": "bubble_map"
      -          }
      -        },
      -        "required": [
      -          "chartType"
      -        ]
      -      },
      -      "then": {
      -        "properties": {
      -          "geo": {
      -            "required": [
      -              "longitudeField",
      -              "latitudeField",
      -              "rows"
      -            ]
      -          }
      -        },
      -        "required": [
      -          "geo"
      -        ]
      -      }
      -    },
      -    {
      -      "if": {
      -        "properties": {
      -          "chartType": {
      -            "const": "flow_map"
      -          }
      -        },
      -        "required": [
      -          "chartType"
      -        ]
      -      },
      -      "then": {
      -        "properties": {
      -          "geo": {
      -            "anyOf": [
      -              {
      -                "required": [
      -                  "geojson"
      -                ]
      -              },
      -              {
      -                "required": [
      -                  "topojson"
      -                ]
      -              }
      -            ],
      -            "required": [
      -              "originLongitudeField",
      -              "originLatitudeField",
      -              "destinationLongitudeField",
      -              "destinationLatitudeField",
      -              "rows"
      -            ]
      -          }
      -        },
      -        "required": [
      -          "geo"
      -        ]
      -      }
      -    },
      -    {
      -      "if": {
      -        "properties": {
      -          "chartType": {
      -            "const": "chord"
      -          }
      -        },
      -        "required": [
      -          "chartType"
      -        ]
      -      },
      -      "then": {
      -        "required": [
      -          "chord"
      -        ]
      -      }
      -    }
      -  ],
      -  "oneOf": [
      -    {
      -      "required": [
      -        "rows"
      -      ]
      -    },
      -    {
      -      "required": [
      -        "datasetRef"
      -      ]
      -    },
      -    {
      -      "required": [
      -        "hierarchy"
      -      ]
      -    },
      -    {
      -      "required": [
      -        "sankey"
      -      ]
      -    },
      -    {
      -      "required": [
      -        "chord"
      -      ]
      -    },
      -    {
      -      "required": [
      -        "network"
      -      ]
      -    },
      -    {
      -      "required": [
      -        "geo"
      -      ]
      -    }
      -  ]
      -}
    • removedInput schema / allOf
      Removed value: -[
      -  {
      -    "if": {
      -      "not": {
      -        "required": [
      -          "pattern"
      -        ]
      -      }
      -    },
      -    "then": {
      -      "$ref": "#/$defs/nonPatternInput"
      -    }
      -  }
      -]
    • changedInput schema / description
      Previous value: -"Render a real, data-bound visualization. Supply a registered pattern identity to preserve its source data and presentation, chartType + encodings for explicit mode, or rows/datasetRef for suggest or structured-intent mode. Retired patterns are not offered; structurally unsupported patterns return OODS-V167; pattern conflicts with explicit data, intent, or source identity/presentation overrides return OODS-V166. Brand, theme and output controls remain available."New value: +"Render a real, data-bound visualization. Supply a registered pattern identity to preserve its source data and presentation, chartType + encodings for explicit mode, or rows for suggest or structured-intent mode. Retired patterns are not offered; structurally unsupported patterns return OODS-V167; pattern conflicts with explicit data, intent, or source identity/presentation overrides return OODS-V166. Brand, theme and output controls remain available."
    • changedInput schema / properties / chartType / description
      Previous value: -"Chart type. The tabular marks (bar->MarkBar, line->MarkLine, area->MarkArea, scatter->MarkPoint, heatmap->MarkRect) bind inline rows/datasetRef with x/y encodings. The hierarchy/flow/network/geo charts are explicit-only and return an ECharts option as the primary spec (no Vega-Lite equivalent): 'treemap' and 'sunburst' take the 'hierarchy' data branch; 'sankey' takes the 'sankey' data branch (nodes + value-weighted links); 'force_graph' takes the 'network' data branch (nodes + links); 'choropleth', 'bubble_map', and 'flow_map' take the 'geo' data branch (inline geometry + per-type encoding — flow_map draws origin→destination arcs); 'chord' takes the 'chord' data branch (sankey-shaped nodes + value-weighted links — a ring of category arcs joined by ribbons whose width is the value). Omit chartType to enter suggest mode (the recommender chooses a tabular type from the inferred field profiles)."New value: +"Chart type. The tabular marks (bar->MarkBar, line->MarkLine, area->MarkArea, scatter->MarkPoint, heatmap->MarkRect) bind inline rows with x/y encodings. The hierarchy/flow/network/geo charts are explicit-only and return an ECharts option as the primary spec (no Vega-Lite equivalent): 'treemap' and 'sunburst' take the 'hierarchy' data branch; 'sankey' takes the 'sankey' data branch (nodes + value-weighted links); 'force_graph' takes the 'network' data branch (nodes + links); 'choropleth', 'bubble_map', and 'flow_map' take the 'geo' data branch (inline geometry + per-type encoding — flow_map draws origin→destination arcs); 'chord' takes the 'chord' data branch (sankey-shaped nodes + value-weighted links — a ring of category arcs joined by ribbons whose width is the value). Omit chartType to enter suggest mode (the recommender chooses a tabular type from the inferred field profiles)."
    • changedInput schema / properties / chord / description
      Previous value: -"Chord data for chartType 'chord' (explicit-only) — used INSTEAD of rows/datasetRef + x/y encodings. A native ECharts ribbon diagram: a ring of category arcs connected by weighted ribbons. Sankey-shaped — nodes plus value-weighted links; every link MUST carry a numeric 'value' (the ribbon width IS the flow magnitude) and reference existing node names — a link naming a node absent from 'nodes' fails loud (OODS-V147)."New value: +"Chord data for chartType 'chord' (explicit-only) — used INSTEAD of rows + x/y encodings. A native ECharts ribbon diagram: a ring of category arcs connected by weighted ribbons. Sankey-shaped — nodes plus value-weighted links; every link MUST carry a numeric 'value' (the ribbon width IS the flow magnitude) and reference existing node names — a link naming a node absent from 'nodes' fails loud (OODS-V147)."
    • changedInput schema / properties / geo / description
      Previous value: -"Geo data for chartType 'choropleth', 'bubble_map', or 'flow_map' (explicit-only) — used INSTEAD of rows/datasetRef + x/y encodings. Carries INLINE geometry (a GeoJSON FeatureCollection in 'geojson', or a TopoJSON Topology in 'topojson' + 'topoObjectName'), an optional 'join' that merges tabular 'rows' into features by key, and the per-type encoding: 'valueField' colours regions for choropleth; 'longitudeField'/'latitudeField' (+ optional 'sizeField'/'colorField') place points for bubble_map; 'originLongitudeField'/'originLatitudeField'/'destinationLongitudeField'/'destinationLatitudeField' (+ optional 'strengthField'/'curvature') draw origin→destination ARCS for flow_map. Geometry is supplied INLINE — it is never fetched over the network. NOTE: geo specs are NOT self-contained (unlike treemap/sankey): the resolved FeatureCollection rides back on echartsSpec.__registration and the client re-registers the map by name before rendering. Geometry payloads can be large (a world atlas is ~100KB) — prefer a pre-simplified TopoJSON."New value: +"Geo data for chartType 'choropleth', 'bubble_map', or 'flow_map' (explicit-only) — used INSTEAD of rows + x/y encodings. Carries INLINE geometry (a GeoJSON FeatureCollection in 'geojson', or a TopoJSON Topology in 'topojson' + 'topoObjectName'), an optional 'join' that merges tabular 'rows' into features by key, and the per-type encoding: 'valueField' colours regions for choropleth; 'longitudeField'/'latitudeField' (+ optional 'sizeField'/'colorField') place points for bubble_map; 'originLongitudeField'/'originLatitudeField'/'destinationLongitudeField'/'destinationLatitudeField' (+ optional 'strengthField'/'curvature') draw origin→destination ARCS for flow_map. Geometry is supplied INLINE — it is never fetched over the network. NOTE: geo specs are NOT self-contained (unlike treemap/sankey): the resolved FeatureCollection rides back on echartsSpec.__registration and the client re-registers the map by name before rendering. Geometry payloads can be large (a world atlas is ~100KB) — prefer a pre-simplified TopoJSON."
    • changedInput schema / properties / hierarchy / description
      Previous value: -"Hierarchy data for chartType 'treemap' or 'sunburst' (explicit-only) — used INSTEAD of rows/datasetRef + x/y encodings. A discriminated union on 'type': 'adjacency_list' (flat nodes linked by parentId; a node whose parent is missing becomes its own root) or 'nested' (a single root node with children)."New value: +"Hierarchy data for chartType 'treemap' or 'sunburst' (explicit-only) — used INSTEAD of rows + x/y encodings. A discriminated union on 'type': 'adjacency_list' (flat nodes linked by parentId; a node whose parent is missing becomes its own root) or 'nested' (a single root node with children)."
    • changedInput schema / properties / intent / description
      Previous value: -"STRUCTURED (typed, NOT free-text) visualization intent — the deterministic half of the NL→viz hand-off. Supply it INSTEAD of chartType/encodings (mutually exclusive with chartType): the named measures/dimensions drive ENCODING, `goal` + the data drive the recommender's chartType pick, an optional `chartFamily` post-filters that pick, and an optional governed `measureRef` lights the governed-measure narrative overlay (only when output.includeA11y=true). Requires `rows` (or a `datasetRef`)."New value: +"STRUCTURED (typed, NOT free-text) visualization intent — the deterministic half of the NL→viz hand-off. Supply it INSTEAD of chartType/encodings (mutually exclusive with chartType): the named measures/dimensions drive ENCODING, `goal` + the data drive the recommender's chartType pick, an optional `chartFamily` post-filters that pick. Requires `rows`."
    • changedInput schema / properties / network / description
      Previous value: -"Network data for chartType 'force_graph' (explicit-only) — used INSTEAD of rows/datasetRef + x/y encodings. Nodes (each with a unique 'id'; an optional 'group' drives category colour) and directed links (optional numeric 'value'). Every link MUST reference existing node ids — a link naming a node absent from 'nodes' fails loud (OODS-V147)."New value: +"Network data for chartType 'force_graph' (explicit-only) — used INSTEAD of rows + x/y encodings. Nodes (each with a unique 'id'; an optional 'group' drives category colour) and directed links (optional numeric 'value'). Every link MUST reference existing node ids — a link naming a node absent from 'nodes' fails loud (OODS-V147)."
    • changedInput schema / properties / pattern / description
      Previous value: -"Exact versioned pattern source identity. Renderable patterns preserve source rows, identity, presentation and accessibility metadata. Retired identities are not offered (their reasons are in the viz taxonomy). Structurally unsupported scenes return OODS-V167. Static SVG shows the default selection state (OODS-V175). Cannot be combined with chartType, encodings, rows, datasetRef, intent, hierarchy, sankey, chord, network, geo, id, name, description or opacity (OODS-V166)."New value: +"Exact versioned pattern source identity. Renderable patterns preserve source rows, identity, presentation and accessibility metadata. Retired identities are not offered (their reasons are in the viz taxonomy). Structurally unsupported scenes return OODS-V167. Static SVG shows the default selection state (OODS-V175). Cannot be combined with chartType, encodings, rows, intent, hierarchy, sankey, chord, network, geo, id, name, description or opacity (OODS-V166)."
    • changedInput schema / properties / rows / maxItems
      Previous value: -5000New value: +500
    • changedInput schema / properties / sankey / description
      Previous value: -"Flow data for chartType 'sankey' (explicit-only) — used INSTEAD of rows/datasetRef + x/y encodings. Nodes plus value-weighted links; every link MUST carry a numeric 'value' (the link width IS the flow magnitude) and reference existing node names."New value: +"Flow data for chartType 'sankey' (explicit-only) — used INSTEAD of rows + x/y encodings. Nodes plus value-weighted links; every link MUST carry a numeric 'value' (the link width IS the flow magnitude) and reference existing node names."
  4. First observed

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a safe, idempotent, non-destructive, non-open-world read. The description goes beyond them by disclosing the reply shape (hashes, warnings, certification), that optional outputs add SVG/table/narrative/spec, and two hard limits (500 rows, 100,000-character reply bound), which is material context an agent cannot infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the core action and mode selection, then moves to output options and limits, with essentially no filler. It is dense — several clauses are packed per sentence — but each sentence carries usable information rather than restating the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 20-parameter tool with nested objects and no output schema, the description supplies the missing reply contract, output toggles, size limits, and the artifact_certify relationship. Remaining specialty inputs (geo, chord, hierarchy, network) are deferred to the schema without description-level detail, so it is good but not exhaustive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the structured fields already carry per-parameter meaning and the baseline is 3. The description adds cross-parameter semantics the schema does not state directly, e.g. the mutual exclusivity of input modes and the fact that brand/theme scope both drawing and certification — a real increment over the field-level text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb pair and resource ('Draw and certify a chart from inline data'), then enumerates the three valid input shapes (chartType+encodings with rows, a registered pattern, or an intent). It even distinguishes itself from artifact_certify by noting that tool returns the same drawing but checks an input in chart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states how to use each input mode and when to ask for SVG ('Request SVG when a displayed chart is needed'), which is genuine routing guidance. It stops short of explicit when-not conditions or a full comparison against siblings like design_preview, so it lands at clear-context rather than exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.