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.