Skip to main content
Glama

Server Details

OODS Foundry is an object-oriented design system that extends the one you already have.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 25 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
kneelinghorse/OODS-Foundry
GitHub Stars
2
Server Listing
OODS Foundry

TDQS

A3.9/5.0

Scored across 9 tools

Disambiguation4/5

Most tools target clearly distinct resources and actions, and descriptions cross-reference each other to clarify boundaries. However, artifact_certify and viz_render both draw and certify charts and explicitly return the same output, creating a genuine risk of selection confusion.

Naming Consistency4/5

All names use lower snake_case and follow a readable domain-object or object-action pattern. Minor deviation exists between action-style names like catalog_list and noun-style names like object_registry, but the convention is still predictable.

Tool Count5/5

Nine tools is well-scoped for a design-system registry, preview, data-fetch, and chart-certification server. Each tool appears to serve a distinct resource or operation without relying on excessive tool surface.

Completeness4/5

The surface covers reading components, objects, registry snapshots, screens, datasets, tool schemas, health status, and chart rendering/certification. It is largely complete for a read-and-certify service, though mutation or broader lifecycle operations are absent if those are expected.

Available Tools

9 tools
artifact_certifyCertify ChartA
Read-onlyIdempotent
Inspect

Draw and certify a chart from the input in chart, using matching data, brand and theme. Returns the same result as viz_render: hashes, warnings and the certification verdict, including accessibility equivalence, determinism, contrast and accuracy. Optional chart.output fields add SVG, the accessible table and narrative, or the normalized specification. A verdict can be conformant false; each pillar explains its result.

NameRequiredDescriptionDefault
chartYes
reproduceNoInclude the command and calls for reproducing this result.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds real value beyond that: it enumerates the returned artifacts (hashes, warnings, verdict, per-pillar explanations), warns that a verdict can be conformant false, and notes the optional output toggles. It does not mention cost, rate limits, or failure modes.

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?

Four sentences, front-loaded with the core action, then returns, then optional outputs, then the verdict caveat. No filler sentences, though the clause listing pillars is dense and could be trimmed without loss.

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

Completeness5/5

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

With no output schema, the description carries the return-value burden and does so: it names the returned fields (hashes, warnings, verdict, pillars) and the optional SVG/table/spec outputs. For a read-only tool with a large nested input schema, this is complete enough to call correctly.

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

Parameters3/5

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

Schema coverage is only 50% and the two top-level parameters are chart and reproduce. The description adds meaning for chart.output (SVG, accessible table/narrative, normalized spec), but says nothing about the reproduce parameter, which the schema covers. Baseline 3 is appropriate since the nested schema does most of the documenting.

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

Purpose4/5

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

States a specific verb+resource pair ('Draw and certify a chart') and names the certification pillars (accessibility equivalence, determinism, contrast, accuracy), which is more than a restatement of the title. It references viz_render as producing the 'same result', but does not clearly differentiate when certification is wanted over plain rendering, leaving sibling separation partly implicit.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not guidance. The description says it 'Returns the same result as viz_render', which raises the question of why an agent would pick one over the other, yet never resolves it. Usage is only inferable from the word 'certify'.

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

catalog_listList ComponentsA
Read-onlyIdempotent
Inspect

Read components a page at a time. category, trait, context and status filter the list; status describes the HTML renderer. detail is brief by default, or full when filtering; summary includes tags, contexts, regions and traits. Brief and summary allow up to 200 entries; full clamps pageSize to 10 and reports the adjustment. totalCount, hasMore and nextPage describe pagination. object_registry reads objects instead.

NameRequiredDescriptionDefault
pageNo1-based page index for pagination.
traitNoFilter components by trait (e.g., 'Editable', 'Searchable')
detailNoDefaults to brief unfiltered, full with filters. Both defaults are paged (filtered: 10 entries). summary adds tags, contexts, regions and traits; full includes evidence. Explicit detail without paging preserves the unbounded legacy request.
statusNoFilter by legacy static-HTML status only: 'stable' = mapped HTML renderer; 'planned' = HTML fallback. Consult productReality.surfaces for React/Vue, generated-consumer and maturity evidence.
contextNoFilter components by context (e.g., 'detail', 'list')
categoryNoFilter components by category (e.g., 'core', 'lifecycle', 'visual')
pageSizeNoComponents per page. Filtered calls without detail default to 10; nextPage gives the next call.
reproduceNoInclude the command and calls for reproducing this result.
includeInternalNoAlso list OODS Foundry's internal (non-business) objects in registry.objects, after the business objects. Without it they are left out and registry.hiddenInternal counts them.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover the read-only/idempotent safety profile, yet the description adds real operational context beyond them: pageSize clamping to 10 for full detail with a reported adjustment, the 200-entry ceiling for brief/summary, and the warning that explicit detail without paging 'preserves the unbounded legacy request.' That last caveat is exactly the kind of consequence an agent needs before calling.

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?

Roughly six short sentences, each carrying distinct information, with the core read/pagination behavior front-loaded. The comma-heavy, note-like compression makes a couple of clauses need a second read, but nothing is padding.

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 9-parameter list tool with no output schema, the description covers the essentials an agent must know: filter semantics, detail-mode defaults and limits, and return fields (totalCount, hasMore, nextPage plus what summary adds). Gaps are minor — includeInternal's registry effect and reproduce are left to the schema.

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 description coverage is 100%, so the baseline is 3. The description still adds value by explaining cross-parameter interactions the schema states only locally: what status actually filters (legacy static-HTML renderer, not React/Vue), how detail and filtering select defaults, and which modes clamp pageSize. It omits reproduce and includeInternal, but the schema carries those adequately.

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?

Names a specific verb and resource ('Read components a page at a time') and immediately distinguishes the tool from the sibling object_registry ('object_registry reads objects instead'). An agent can tell what this returns and how it differs from neighbors without opening any schema.

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?

Explains the conditions that change behavior — filtering selects full detail by default, unfiltered stays brief — and routes object queries to object_registry. It stops short of stating when this tool should not be used (e.g., single-component lookup), but the context and alternative are clear.

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

design_previewLook Up Recorded ScreenB
Read-onlyIdempotent
Inspect

Look up a recorded screen by object, context and framework. Returns its running screen URL, content hash, brand and theme. No new screen is generated. object_registry reads the definition behind the screen. Set reproduce true when the command and calls used to generate it are requested.

NameRequiredDescriptionDefault
objectYesAn object with recorded screens at this version.
contextNoThe context the screen was composed for.detail
frameworkNoThe framework of the generated app.react
reproduceNoInclude the command and calls for reproducing this result.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety and idempotency profile is covered. The description adds that no new screen is generated and that object_registry reads the underlying definition, which is useful context, but it does not elaborate on caching, rate limits, or output format beyond naming returned fields.

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?

The description is three sentences, front-loaded with the core action and return values, then a scoping clarification and a sibling reference. It is efficient and each sentence contributes, though it could be slightly tighter.

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

Completeness3/5

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

With 100% schema coverage and annotations covering safety, the description is adequate for a read-only lookup. It names the returned fields and clarifies that no generation occurs, but lacks details on pagination, error cases, or output structure, which is acceptable given no output schema but leaves some gaps.

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

Parameters3/5

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

Schema coverage is 100% and three parameters have enums, so the schema fully documents parameter meanings and allowed values. The description only adds a conditional note about the 'reproduce' flag, which is already described in the schema; no additional syntax or format details are provided, so baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource ('Look up a recorded screen') and clarifies scope with 'No new screen is generated', distinguishing it from any generation tool. It also names a relevant sibling (object_registry) and contrasts its role, which aids differentiation.

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

Usage Guidelines3/5

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

The description implies usage by describing return values and a conditional flag ('Set reproduce true when the command and calls used to generate it are requested'), but it does not explicitly state when to use this tool versus alternatives like object_registry or other siblings. Guidance is implied rather than directive.

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

health_checkCheck HealthA
Read-onlyIdempotent
Inspect

Read the running service status, pinned version, registry counts, built brands, themes, token scopes and retained proof summaries. Uptime and latency are current process measurements; host paths are omitted. includeChangelog adds the DSL changelog, and sinceVersion keeps entries after that version. catalog_list and object_registry read the definitions behind the counts.

NameRequiredDescriptionDefault
reproduceNoInclude the command and calls for reproducing this result.
sinceVersionNoWhen provided with includeChangelog, only return changelog entries since this version.
includeChangelogNoWhen true, include DSL version changelog in the response.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description still adds real behavioral context: uptime and latency are current-process measurements (not historical), and host paths are deliberately omitted. Auth/rate-limit behavior is not mentioned, keeping it out of the top band.

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

Conciseness5/5

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

Three sentences, all load-bearing: the first enumerates the payload, the second states measurement caveats, the third covers flags and sibling routing. No filler or restatement of the title.

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?

With no output schema, the description carries the burden of describing the return, and it does so by enumerating the payload contents plus caveats on uptime/latency and omitted host paths. It does not describe the shape or nesting of the response, which is the only remaining gap for a tool with no output schema.

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 baseline is 3; the description earns above that by explaining the interaction semantics ('includeChangelog adds the DSL changelog, and sinceVersion keeps entries after that version') and clarifying that sinceVersion is only meaningful alongside includeChangelog. The 'reproduce' parameter is left undocumented in the description, but the schema handles it.

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?

States a specific verb ('read') and a concrete resource set (service status, pinned version, registry counts, brands, themes, token scopes, proof summaries), so an agent knows exactly what comes back. It also distinguishes itself from siblings by noting that catalog_list and object_registry read the definitions behind the counts, making the boundary with those tools explicit.

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?

The closing sentence tells the agent when to route elsewhere: if it needs the definitions rather than counts, use catalog_list or object_registry. It also conditions includeChangelog/sinceVersion usage. It stops short of an explicit 'use this tool when...' statement or stating whether this should be called at the start of a session.

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

object_registryRead Object RegistryA
Read-onlyIdempotent
Inspect

Read objects from the pinned registry. action list returns names, traits and field counts; domain, trait and maturity filter them, and includeInternal adds internal objects. action show requires name and returns its composed definition; context narrows view extensions. registry_snapshot provides an overview; design_preview looks up recorded screens.

NameRequiredDescriptionDefault
nameNoObject name to look up (e.g. 'User', 'Product', 'Invoice')
traitNoFilter to objects composing a given trait (e.g. 'Priceable', 'lifecycle/Stateful')
actionYesList objects or show one composed definition.
domainNoFilter to objects in a specific domain (e.g. 'core.identity', 'saas.billing')
contextNoOptional: filter view_extensions to a single context (e.g. 'detail', 'list', 'form', 'timeline', 'card', 'inline')
maturityNoFilter by metadata maturity level
reproduceNoInclude the command and calls for reproducing this result.
includeInternalNoAlso list OODS Foundry's internal (non-business) objects, after the business objects. Without it they are left out and hiddenInternal counts them.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered. The description adds non-annotation context: what each action returns, that filters narrow the list, and that includeInternal appends internal objects. It omits auth needs and any pagination/limit behavior, so not a 5.

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?

Front-loaded with the core purpose, then action semantics, then sibling routing. Dense semicolon clauses earn their place but are slightly packed for an 8-parameter tool, keeping it just short of ideal scannability.

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?

With 8 params, no output schema, and rich annotations, the description covers action behavior, filter applicability, and alternative tools adequately. It doesn't explain the reproduce parameter or return envelope, but nothing critical to correct invocation is missing.

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 baseline is 3, but the description adds meaning the schema does not: it ties domain/trait/maturity/includeInternal specifically to the list action and context specifically to show's view_extensions. That action-to-parameter binding is genuinely useful beyond the flat property list.

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?

States a specific verb+resource ('Read objects from the pinned registry') and immediately breaks the tool into its two modes (list vs show). It also distinguishes itself from siblings registry_snapshot and design_preview by naming them and giving their differing scope, so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use per action ('action list returns names, traits and field counts'; 'action show requires name and returns its composed definition'), names which params apply to list, and names the two alternative tools plus what they cover instead. This is close to full routing guidance.

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

registry_snapshotSnapshot RegistryA
Read-onlyIdempotent
Inspect

Read the registry summary: active objects and traits, loaded names, loader issues, etag and generatedAt. detail full includes definitions; names narrows them. includeInternal adds internal objects. Replies larger than 100,000 characters are refused with their size. object_registry reads one composed object; catalog_list reads components.

NameRequiredDescriptionDefault
namesNoExact trait and object names; misses go in notFound.
detailNosummary (default), or full definitions, best with names.summary
reproduceNoInclude the command and calls for reproducing this result.
includeInternalNoAlso list OODS Foundry's internal (non-business) objects, after the business objects. Without it they are left out and registry.hiddenInternal counts them.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description earns credit for the operational context they cannot carry: a hard 100,000-character response cap that refuses oversized replies and reports the size, plus loader-issue reporting including shadowed names. It also discloses what the default summary deliberately omits (schema, parameters, view extensions, semantics, tokens, metadata) and which draft fields are never snapshot outputs.

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?

Front-loaded with the core purpose, then progressively narrower conditionals and finally sibling routing; every sentence carries information with no filler. The telegraphic fragment style ("detail full includes definitions; names narrows them") is dense but occasionally clipped enough to require a second read.

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

Completeness5/5

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

With no output schema, the description carries the full burden of describing return values, and it does: the summary field list, the loader-issue report, the etag/generatedAt pair, the size-refusal response, and the hiddenInternal count. Combined with complete parameter documentation and sibling routing, an agent has everything needed to call it correctly.

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 description coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains that detail full returns definitions and is most useful combined with names, that names narrows the result set (with misses surfacing in notFound per the schema), and that includeInternal appends internal objects after business ones.

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?

States a specific verb and resource ("Read the registry summary") and enumerates what comes back: active objects and traits, loaded names, loader issues, etag and generatedAt. It explicitly differentiates from siblings by noting that object_registry reads one composed object and catalog_list reads components, so an agent can select it without opening a schema.

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?

The closing sentence routes the agent to alternatives by describing what each sibling does (object_registry for a single composed object, catalog_list for components), which implies when not to use this tool. It also states the detail/names conditionals that select between summary and full output, though it never phrases an explicit "use X instead when..." exclusion.

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

structured_data_fetchFetch Structured DataA
Read-onlyIdempotent
Inspect

Read the tokens or manifest dataset. Full data is the default; detail summary returns section counts and the first page call. page reads lossless JSON Pointer entries; pageSize defaults to 10, at most 100, also bounded by size. meta.next continues and meta.full requests full data. includePayload false returns metadata; listVersions lists dates, version selects one, and ifNoneMatch returns matched true without unchanged payload. catalog_list reads components.

NameRequiredDescriptionDefault
pageNoDataset only: read a 1-based page of lossless JSON Pointer entries, each reply below 100,000 characters. Omit for full data.
detailNoDataset only. summary returns section counts and the call for page 1; full (default) preserves the dataset.
datasetYesRegistry dataset to return.
versionNoRequest a specific date-stamped version (e.g., '2026-02-24'). Omit for latest. Applies to dataset mode only.
pageSizeNoDataset entries per page, default 10, also bounded by serialized size. Reply meta gives next and full calls.
reproduceNoInclude the command and calls for reproducing this result.
ifNoneMatchNoReturn matched=true without payload when the ETag matches.
listVersionsNoWhen true, return available version dates instead of payload.
includePayloadNoWhen false, omit payload even if no ETag match occurs.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations cover safety (readOnly, idempotent, non-destructive, not open-world), so the bar is lower, and the description still adds real behavior: ETag/ifNoneMatch short-circuit returning matched=true without payload, page-size bounds, and continuation via meta.next. It does not clarify what a truncated page does to the rest of the dataset or whether pages are stable across calls.

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

Conciseness3/5

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

Front-loads the purpose correctly, but the body is a dense run-on chain of semicolon clauses that mixes parameter restatement, output hints, and an orphaned sibling note. Information is packed in but not organized by task, making it harder to scan than its length suggests.

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 9-parameter, no-output-schema tool, the description covers the main mode interactions (full vs summary, page vs full, version vs listVersions, payload suppression) reasonably well. The gap is that meta.next/meta.full are referenced as output fields with no output schema to define them, so their shape is left implicit.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents each parameter's meaning, bounds, and defaults; the prose largely restates pageSize, detail, and page. The only added value is linking the params into a workflow (meta.next continues, meta.full requests full data), which is modest. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ("Read the tokens or manifest dataset") and enumerates the modes it supports. It gestures at sibling differentiation with "catalog_list reads components," but that clause is a dangling fragment that doesn't clearly frame it as the alternative for component data.

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?

Gives concrete when-to-use context for modes: full is default, summary for section counts, page for paginated JSON Pointer entries, includePayload false for metadata-only, listVersions for dates. However it never states when NOT to use the tool or spells out the routing rule to catalog_list beyond the terse fragment.

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

tool_schemaRead Tool SchemaA
Read-onlyIdempotent
Inspect

Read a shipped tool schema by name and kind (input or output). Returns its JSON Schema, package-relative file, recorded file hash and source URL. tools/list describes this endpoint’s narrower accepted inputs; the full schema may describe operations outside the hosted tools.

NameRequiredDescriptionDefault
kindNoThe tool's input schema or its output schema.input
nameYesAny OODS Foundry tool at this version, local-only tools included.
reproduceNoInclude the command and calls for reproducing this result.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the bar is low. The description nonetheless adds valuable behavioral context: what the return payload contains (JSON Schema, package-relative file, hash, source URL) and the caveat that the full schema may describe operations outside the hosted tools.

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

Conciseness5/5

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

Two tight sentences: the first declares purpose and return contents, the second is a scoping caveat. No filler, front-loaded, each sentence earns its place.

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?

No output schema exists, so the description rightly explains the return fields; annotations cover safety and idempotency. A minor gap is the absence of explicit routing to a sibling alternative, but for a simple three-param read tool this is otherwise complete.

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

Parameters3/5

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

Schema coverage is 100% and both 'kind' and 'name' already carry descriptions in the schema, including the enum values. The description restates the name/kind pair but adds no syntax, defaults, or format detail beyond what the schema provides. Baseline 3 is correct.

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?

States a specific verb (Read) and resource (shipped tool schema) with the discriminant (by name and kind) front-loaded. The mention of the 'kind' input/output split cleanly separates it from any sibling that reads other artifacts.

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

Usage Guidelines3/5

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

Implies when to use via 'Read a shipped tool schema' and warns that tools/list describes this endpoint's narrower inputs, but never explicitly names an alternative tool or states when not to use this one. Usage is inferable, not spelled out.

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

viz_renderRender ChartA
Read-onlyIdempotent
Inspect

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.

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.

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updates
    • Changedartifact_certify51 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 / properties / chart / 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 / chart / 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 / chart / 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 / chart / properties / chord / additionalProperties
        Removed value: -false
      • changedInput schema / properties / chart / 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 / chart / 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 / chart / properties / chord / required
        Removed value: -[
        -  "nodes",
        -  "links"
        -]
      • changedInput schema / properties / chart / 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 / chart / properties / encodings / properties / color / $ref
        Removed value: -"#/$defs/colorEncodingBinding"
      • addedInput schema / properties / chart / properties / encodings / properties / color / description
        Added value: +"Field name or binding."
      • addedInput schema / properties / chart / properties / encodings / properties / color / type
        Added value: +[
        +  "string",
        +  "object"
        +]
      • removedInput schema / properties / chart / properties / encodings / properties / detail / $ref
        Removed value: -"#/$defs/encodingBinding"
      • addedInput schema / properties / chart / properties / encodings / properties / detail / description
        Added value: +"Field name or binding."
      • addedInput schema / properties / chart / properties / encodings / properties / detail / type
        Added value: +[
        +  "string",
        +  "object"
        +]
      • removedInput schema / properties / chart / properties / encodings / properties / shape / $ref
        Removed value: -"#/$defs/encodingBinding"
      • addedInput schema / properties / chart / properties / encodings / properties / shape / description
        Added value: +"Field name or binding."
      • addedInput schema / properties / chart / properties / encodings / properties / shape / type
        Added value: +[
        +  "string",
        +  "object"
        +]
      • removedInput schema / properties / chart / properties / encodings / properties / size / $ref
        Removed value: -"#/$defs/encodingBinding"
      • addedInput schema / properties / chart / properties / encodings / properties / size / description
        Added value: +"Field name or binding."
      • addedInput schema / properties / chart / properties / encodings / properties / size / type
        Added value: +[
        +  "string",
        +  "object"
        +]
      • removedInput schema / properties / chart / properties / encodings / properties / x / $ref
        Removed value: -"#/$defs/encodingBinding"
      • addedInput schema / properties / chart / properties / encodings / properties / x / description
        Added value: +"Field name or binding."
      • addedInput schema / properties / chart / properties / encodings / properties / x / type
        Added value: +[
        +  "string",
        +  "object"
        +]
      • removedInput schema / properties / chart / properties / encodings / properties / y / $ref
        Removed value: -"#/$defs/encodingBinding"
      • addedInput schema / properties / chart / properties / encodings / properties / y / description
        Added value: +"Field name or binding."
      • addedInput schema / properties / chart / properties / encodings / properties / y / type
        Added value: +[
        +  "string",
        +  "object"
        +]
      • removedInput schema / properties / chart / properties / geo / additionalProperties
        Removed value: -false
      • changedInput schema / properties / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / properties / intent / additionalProperties
        Removed value: -false
      • changedInput schema / properties / chart / 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 / chart / 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 / chart / properties / intent / required
        Removed value: -[
        -  "goal",
        -  "measures",
        -  "dimensions"
        -]
      • removedInput schema / properties / chart / properties / network / additionalProperties
        Removed value: -false
      • changedInput schema / properties / chart / 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 / chart / 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 / chart / properties / network / required
        Removed value: -[
        -  "nodes",
        -  "links"
        -]
      • changedInput schema / properties / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / properties / rows / items / description
        Added value: +"rows item."
      • removedInput schema / properties / chart / properties / sankey / additionalProperties
        Removed value: -false
      • changedInput schema / properties / chart / 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 / chart / 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 / chart / properties / sankey / required
        Removed value: -[
        -  "nodes",
        -  "links"
        -]
      • changedInput schema / properties / chart / 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 / properties / chart / title
        Removed value: -"Viz render input"
    • Changedcatalog_list2 fields changed
      • changedInput schema / properties / detail / description
        Previous value: -"Response detail level. Defaults to brief for unfiltered calls (each component's name, categories and one readiness label) and to full when filters are provided. summary adds tags, contexts, regions, traits and status; the evidence behind the readiness label is only in full."New value: +"Defaults to brief unfiltered, full with filters. Both defaults are paged (filtered: 10 entries). summary adds tags, contexts, regions and traits; full includes evidence. Explicit detail without paging preserves the unbounded legacy request."
      • changedInput schema / properties / pageSize / description
        Previous value: -"Number of components per page."New value: +"Components per page. Filtered calls without detail default to 10; nextPage gives the next call."
    • Changedstructured_data_fetch3 fields changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Dataset only. summary returns section counts and the call for page 1; full (default) preserves the dataset.",
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / page
        Added value: +{
        +  "description": "Dataset only: read a 1-based page of lossless JSON Pointer entries, each reply below 100,000 characters. Omit for full data.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / pageSize
        Added value: +{
        +  "description": "Dataset entries per page, default 10, also bounded by serialized size. Reply meta gives next and full calls.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Changedviz_render51 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. 1 tool update
    • Changedtool_schema1 field changed
      • changedInput schema / properties / name / enum
        Previous value: -[
        -  "tokens_build",
        -  "structured_data_fetch",
        -  "brand_apply",
        -  "brand_create",
        -  "catalog_list",
        -  "code_generate",
        -  "design_compose",
        -  "design_preview",
        -  "pipeline_run",
        -  "health_check",
        -  "registry_snapshot",
        -  "viz_render",
        -  "dashboard_render",
        -  "artifact_certify",
        -  "fidelity_preview",
        -  "component_map",
        -  "schema_store",
        -  "object_registry",
        -  "schema_render",
        -  "object_import",
        -  "a11y_scan"
        -]New value: +[
        +  "tokens_build",
        +  "structured_data_fetch",
        +  "brand_apply",
        +  "brand_create",
        +  "brand_read",
        +  "catalog_list",
        +  "code_generate",
        +  "design_compose",
        +  "design_preview",
        +  "design_versions",
        +  "pipeline_run",
        +  "health_check",
        +  "registry_snapshot",
        +  "viz_render",
        +  "dashboard_render",
        +  "artifact_certify",
        +  "fidelity_preview",
        +  "component_map",
        +  "component_map_read",
        +  "schema_store",
        +  "schema_read",
        +  "object_registry",
        +  "object_register",
        +  "schema_render",
        +  "object_import",
        +  "object_import_read",
        +  "a11y_scan"
        +]
  3. 9 tool updates
    • Changedartifact_certify44 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 / properties / chart / $id
        Removed value: -"https://designlab.local/schemas/viz.render.input.json"
      • removedInput schema / properties / chart / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / chart / 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 / chart / properties / brand / description
        Added value: +"Token brand for drawing and certification."
      • changedInput schema / properties / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / properties / hierarchy / type
        Added value: +"object"
      • changedInput schema / properties / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / properties / output / description
        Added value: +"Optional drawing and accessibility outputs; the default reply contains hashes and certification."
      • addedInput schema / properties / chart / properties / output / properties / height / description
        Added value: +"Drawing height in pixels."
      • removedInput schema / properties / chart / properties / output / properties / includeA11y / const
        Removed value: -true
      • addedInput schema / properties / chart / properties / output / properties / includeA11y / default
        Added value: +false
      • addedInput schema / properties / chart / properties / output / properties / includeA11y / description
        Added value: +"Include the accessible data table and narrative."
      • addedInput schema / properties / chart / properties / output / properties / includeA11y / type
        Added value: +"boolean"
      • removedInput schema / properties / chart / properties / output / properties / includeNormalizedSpec / const
        Removed value: -true
      • addedInput schema / properties / chart / properties / output / properties / includeNormalizedSpec / default
        Added value: +false
      • addedInput schema / properties / chart / properties / output / properties / includeNormalizedSpec / description
        Added value: +"Include the normalized chart specification."
      • addedInput schema / properties / chart / properties / output / properties / includeNormalizedSpec / type
        Added value: +"boolean"
      • removedInput schema / properties / chart / properties / output / properties / svg / const
        Removed value: -true
      • addedInput schema / properties / chart / properties / output / properties / svg / default
        Added value: +false
      • addedInput schema / properties / chart / properties / output / properties / svg / description
        Added value: +"Include the SVG drawing, for displaying the chart."
      • addedInput schema / properties / chart / properties / output / properties / svg / type
        Added value: +"boolean"
      • addedInput schema / properties / chart / properties / output / properties / width / description
        Added value: +"Drawing width in pixels."
      • changedInput schema / properties / chart / 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"
        +]
      • changedInput schema / properties / chart / 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 / chart / 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 / chart / properties / theme / description
        Added value: +"Colour theme for drawing and certification."
      • addedInput schema / properties / reproduce
        Added value: +{
        +  "default": false,
        +  "description": "Include the command and calls for reproducing this result.",
        +  "type": "boolean"
        +}
    • Changedcatalog_list2 fields changed
      • removedInput schema / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / reproduce
        Added value: +{
        +  "default": false,
        +  "description": "Include the command and calls for reproducing this result.",
        +  "type": "boolean"
        +}
    • Changeddesign_preview1 field changed
      • addedInput schema / properties / reproduce
        Added value: +{
        +  "default": false,
        +  "description": "Include the command and calls for reproducing this result.",
        +  "type": "boolean"
        +}
    • Changedhealth_check2 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / reproduce
        Added value: +{
        +  "default": false,
        +  "description": "Include the command and calls for reproducing this result.",
        +  "type": "boolean"
        +}
    • Changedobject_registry4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / action / type
        Added value: +"string"
      • addedInput schema / properties / reproduce
        Added value: +{
        +  "default": false,
        +  "description": "Include the command and calls for reproducing this result.",
        +  "type": "boolean"
        +}
      • changedInput schema / title
        Previous value: -"object input"New value: +"object_registry input"
    • Changedregistry_snapshot4 fields changed
      • removedInput schema / $id
        Removed value: -"https://designlab.local/schemas/registry.snapshot.input.json"
      • removedInput schema / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / reproduce
        Added value: +{
        +  "default": false,
        +  "description": "Include the command and calls for reproducing this result.",
        +  "type": "boolean"
        +}
      • changedInput schema / title
        Previous value: -"registry.snapshot input"New value: +"registry_snapshot input"
    • Changedstructured_data_fetch6 fields changed
      • removedInput schema / $id
        Removed value: -"structuredData.fetch.input.json"
      • removedInput schema / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / dataset / enum
        Previous value: -[
        -  "components",
        -  "tokens",
        -  "manifest"
        -]New value: +[
        +  "tokens",
        +  "manifest"
        +]
      • removedInput schema / properties / includeInternal
        Removed value: -{
        -  "default": false,
        -  "description": "Live components dataset only: also list OODS Foundry's internal (non-business) objects, after the business objects. Without it they are left out and registry.hiddenInternal counts them; a dated export is served unchanged.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / reproduce
        Added value: +{
        +  "default": false,
        +  "description": "Include the command and calls for reproducing this result.",
        +  "type": "boolean"
        +}
      • changedInput schema / title
        Previous value: -"structuredData.fetch input"New value: +"structured_data_fetch input"
    • Changedtool_schema1 field changed
      • addedInput schema / properties / reproduce
        Added value: +{
        +  "default": false,
        +  "description": "Include the command and calls for reproducing this result.",
        +  "type": "boolean"
        +}
    • Changedviz_render44 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."
  4. 2 tool updates
    • Changedcatalog_list1 field changed
      • changedInput schema / properties / category / description
        Previous value: -"Filter components by category (e.g., 'core', 'data')"New value: +"Filter components by category (e.g., 'core', 'lifecycle', 'visual')"
    • Changedregistry_snapshot3 fields changed
      • changedInput schema / description
        Previous value: -"Bulk-read recorded mappings plus live shipped and registered team traits and objects. Reports definition loader issues, including shadowed names. Draft preferred_terms, disambiguation_decisions and capabilities are not snapshot outputs."New value: +"Bulk-read recorded mappings plus live shipped and registered team traits and objects. Reports definition loader issues, including shadowed names. The default summary leaves out each trait's and object's schema, parameters, view extensions, semantics, tokens and metadata; detail full returns them, optionally only for named traits and objects. Draft preferred_terms, disambiguation_decisions and capabilities are not snapshot outputs."
      • addedInput schema / properties / detail
        Added value: +{
        +  "default": "summary",
        +  "description": "summary (default), or full definitions, best with names.",
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / names
        Added value: +{
        +  "description": "Exact trait and object names; misses go in notFound.",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "minItems": 1,
        +  "type": "array",
        +  "uniqueItems": true
        +}
  5. 5 tool updates
    • Changedartifact_certify12 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 / properties / chart / allOf
        Removed value: -[
        -  {
        -    "if": {
        -      "not": {
        -        "required": [
        -          "pattern"
        -        ]
        -      }
        -    },
        -    "then": {
        -      "$ref": "#/$defs/nonPatternInput"
        -    }
        -  }
        -]
      • changedInput schema / properties / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / 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 / chart / properties / rows / maxItems
        Previous value: -5000New value: +500
      • changedInput schema / properties / chart / 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."
    • Changeddesign_preview3 fields changed
      • addedInput schema / properties / context / description
        Added value: +"The context the screen was composed for."
      • addedInput schema / properties / framework / description
        Added value: +"The framework of the generated app."
      • addedInput schema / properties / object / description
        Added value: +"An object with recorded screens at this version."
    • Changedobject_registry8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / allOf
        Removed value: -[
        -  {
        -    "if": {
        -      "properties": {
        -        "action": {
        -          "const": "list"
        -        }
        -      },
        -      "required": [
        -        "action"
        -      ]
        -    },
        -    "then": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "action": {
        -          "const": "list"
        -        },
        -        "domain": {
        -          "description": "Filter to objects in a specific domain (e.g. 'core.identity', 'saas.billing')",
        -          "type": "string"
        -        },
        -        "includeInternal": {
        -          "default": false,
        -          "description": "Also list OODS Foundry's internal (non-business) objects, after the business objects. Without it they are left out and hiddenInternal counts them.",
        -          "type": "boolean"
        -        },
        -        "maturity": {
        -          "description": "Filter by metadata maturity level",
        -          "enum": [
        -            "draft",
        -            "alpha",
        -            "beta",
        -            "stable"
        -          ],
        -          "type": "string"
        -        },
        -        "trait": {
        -          "description": "Filter to objects composing a given trait (e.g. 'Priceable', 'lifecycle/Stateful')",
        -          "type": "string"
        -        }
        -      },
        -      "type": "object"
        -    }
        -  },
        -  {
        -    "if": {
        -      "properties": {
        -        "action": {
        -          "const": "show"
        -        }
        -      },
        -      "required": [
        -        "action"
        -      ]
        -    },
        -    "then": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "action": {
        -          "const": "show"
        -        },
        -        "context": {
        -          "description": "Optional: filter view_extensions to a single context (e.g. 'detail', 'list', 'form', 'timeline', 'card', 'inline')",
        -          "type": "string"
        -        },
        -        "name": {
        -          "description": "Object name to look up (e.g. 'User', 'Product', 'Invoice')",
        -          "pattern": "^[A-Za-z][A-Za-z0-9_-]*$",
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "name"
        -      ],
        -      "type": "object"
        -    }
        -  }
        -]
      • addedInput schema / properties / context
        Added value: +{
        +  "description": "Optional: filter view_extensions to a single context (e.g. 'detail', 'list', 'form', 'timeline', 'card', 'inline')",
        +  "type": "string"
        +}
      • addedInput schema / properties / domain
        Added value: +{
        +  "description": "Filter to objects in a specific domain (e.g. 'core.identity', 'saas.billing')",
        +  "type": "string"
        +}
      • addedInput schema / properties / includeInternal
        Added value: +{
        +  "default": false,
        +  "description": "Also list OODS Foundry's internal (non-business) objects, after the business objects. Without it they are left out and hiddenInternal counts them.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / maturity
        Added value: +{
        +  "description": "Filter by metadata maturity level",
        +  "enum": [
        +    "draft",
        +    "alpha",
        +    "beta",
        +    "stable"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Object name to look up (e.g. 'User', 'Product', 'Invoice')",
        +  "pattern": "^[A-Za-z][A-Za-z0-9_-]*$",
        +  "type": "string"
        +}
      • addedInput schema / properties / trait
        Added value: +{
        +  "description": "Filter to objects composing a given trait (e.g. 'Priceable', 'lifecycle/Stateful')",
        +  "type": "string"
        +}
    • Changedtool_schema2 fields changed
      • addedInput schema / properties / kind / description
        Added value: +"The tool's input schema or its output schema."
      • addedInput schema / properties / name / description
        Added value: +"Any OODS Foundry tool at this version, local-only tools included."
    • Changedviz_render12 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."
  6. 1 tool update
    • Changedtool_schema1 field changed
      • changedInput schema / properties / name / enum
        Previous value: -[
        -  "tokens_build",
        -  "structured_data_fetch",
        -  "brand_apply",
        -  "brand_create",
        -  "catalog_list",
        -  "code_generate",
        -  "design_compose",
        -  "design_preview",
        -  "pipeline_run",
        -  "health_check",
        -  "registry_snapshot",
        -  "viz_render",
        -  "dashboard_render",
        -  "artifact_certify",
        -  "fidelity_preview",
        -  "component_map",
        -  "schema_store",
        -  "object_registry",
        -  "schema_render",
        -  "a11y_scan"
        -]New value: +[
        +  "tokens_build",
        +  "structured_data_fetch",
        +  "brand_apply",
        +  "brand_create",
        +  "catalog_list",
        +  "code_generate",
        +  "design_compose",
        +  "design_preview",
        +  "pipeline_run",
        +  "health_check",
        +  "registry_snapshot",
        +  "viz_render",
        +  "dashboard_render",
        +  "artifact_certify",
        +  "fidelity_preview",
        +  "component_map",
        +  "schema_store",
        +  "object_registry",
        +  "schema_render",
        +  "object_import",
        +  "a11y_scan"
        +]
  7. 7 tool updates
    • Removedhealth
    • Addedhealth_check
    • Removedobject
    • Addedobject_registry
    • Addedstructured_data_fetch
    • RemovedstructuredData_fetch
    • Changedtool_schema1 field changed
      • changedInput schema / properties / name / enum
        Previous value: -[
        -  "tokens_build",
        -  "structuredData_fetch",
        -  "brand_apply",
        -  "brand_intake",
        -  "catalog_list",
        -  "code_generate",
        -  "design_compose",
        -  "design_preview",
        -  "pipeline",
        -  "health",
        -  "registry_snapshot",
        -  "viz_render",
        -  "dashboard_render",
        -  "artifact_certify",
        -  "fidelity_preview",
        -  "map",
        -  "schema",
        -  "object",
        -  "repl",
        -  "a11y_scan"
        -]New value: +[
        +  "tokens_build",
        +  "structured_data_fetch",
        +  "brand_apply",
        +  "brand_create",
        +  "catalog_list",
        +  "code_generate",
        +  "design_compose",
        +  "design_preview",
        +  "pipeline_run",
        +  "health_check",
        +  "registry_snapshot",
        +  "viz_render",
        +  "dashboard_render",
        +  "artifact_certify",
        +  "fidelity_preview",
        +  "component_map",
        +  "schema_store",
        +  "object_registry",
        +  "schema_render",
        +  "a11y_scan"
        +]
  8. 9 tool updates
    • First observedartifact_certify
    • First observedcatalog_list
    • First observeddesign_preview
    • First observedhealth
    • First observedobject
    • First observedregistry_snapshot
    • First observedstructuredData_fetch
    • First observedtool_schema
    • First observedviz_render

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables high-craft web design and engineering through OKLCH color systems, fluid typography, Three.js 3D scenes, frontend security audits, multi-viewport capture, and Python-backed design verification.
    11
    12 npm
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables LLMs to work with the Optics Design System, providing access to 83 design tokens (HSL-based colors, spacing, typography), 24 components with dependencies, and tools for theme generation, accessibility checking, and code scaffolding.
    15
    4 npm
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides 1000+ handcrafted design system themes (colors, typography, components, animations) to inject into AI-generated UI, enabling tools like Claude, ChatGPT, and Cursor to produce polished, non-generic interfaces.
    2
    7 npm
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to generate complete, deterministic design systems from a single brand color — harmonious palettes, font pairings, type and spacing scales, elevation shadows, responsive grids, motion presets, dark-mode themes, and WCAG contrast audits — and export them as CSS, JSON, Tailwind, or SCSS through natural conversation.
    10
    54 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.