Advisories

Advisories never block a render. Two distinct kinds, two sources:

Spec-lint advisories (@ggsvelte/spec lintSpec)

Valid-but-questionable specs (Hadley: "we can produce many plots that don't make sense, yet are grammatically valid"). Run lintSpec(spec, { profile? }) directly, pass { lint: true } to validate(), or read the CLI's stderr advisories (source "spec-lint"). Data-dependent rules skip silently without evidence.

line-over-nominal-x (needs: data-or-profile)

A line layer connects points across a nominal (unordered) x field.

many-discrete-colors (needs: data)

A discrete color/fill field has more than 10 distinct values.

stacked-area-negative (needs: data)

A stacked area layer's y field contains negative values.

discrete-discrete-scatter (needs: data-or-profile)

A point layer maps discrete fields on BOTH x and y.

transform-domain-data (needs: data)

A transform scale (log10/sqrt) is configured over data that mixes in-domain and out-of-domain values.

Pipeline heuristic advisories (@ggsvelte/core)

Every heuristic decision the pipeline takes is disclosed as { code, path, chosen, howToOverride } on RenderModel.advisories — agents see the guess and can correct it.

scale-type-inferred

A positional scale's type was inferred from the mapped data.

zero-forced

Bars/areas forced the measure axis to include zero.

scale-baseline-transformed-origin

A bar/col/area/histogram/density measure axis under transform: log10 baselines at the transformed-space origin (semantic 1), since log10 has no semantic-zero image.

bar-x-discretized

A numeric x on a count-stat bar layer was treated as discrete categories.

bin-default-bins

The bin stat used its default bin count; set params.binwidth to control it.

smooth-method-inferred

The smooth stat chose its method (lm vs loess) from the group size.

jitter-seeded

The jitter position used its default deterministic seed.

palette-inferred

A color scale used the edition's default palette/ramp.

canvas-auto

A high-count layer auto-switched to the canvas backend (a11y/copy-SVG tradeoff disclosed).

temporal-year-inferred

A four-digit string field was inferred as calendar years; a discrete override is available.

temporal-inference-ambiguous

A date-like field remained discrete because multiple date orders matched.

temporal-inference-invalid

A date-like field remained discrete because whole-column validation failed.

band-labels-wrapped

Long categorical x labels were wrapped onto multiple lines to avoid collisions; pin with scales.x.guide.mode or coordFlip().

band-labels-rotated

Long categorical x labels were rotated to avoid collisions; pin with scales.x.guide.mode/angle, or coordFlip() for horizontal rows.