The source draws features in different colours that the target has one setting for — not a
z-order contest like color.conflict, but a schema the target is coarser than. Shortbread's POI
layer is coarser than OpenMapTiles' by design, so for an OMT style this is systematic rather than
incidental, and observed names each feature the source told apart.
Several layers drew a probe in different colours; the topmost was taken. observed groups the
layers by the colour they drew, which is the list a consumer offers as a choice.
How the winner was picked, as a rule rather than a sentence.
A colour was observed and estimated, but not by enough to override the palette's own value.
How far the estimate sat from the palette, and how far it had to sit to be taken.
0..1 — how strongly the readings constrained this key.
Colours nothing in the style spoke for, which kept the chosen palette's values.
A topic's labels were set in more than one font; the most used was taken.
Fonts the glyph server does not publish; the nearest face it has was used.
Icons were sized inconsistently relative to the target's; one multiplier had to serve.
The style's sprite is not carried over; the target's own icons are used.
An option passed to guessOptions was not one it has.
The style URL could not be fetched.
The argument was not a MapLibre style document.
Anything else that stopped the read.
A topic's labels disagreed on a style property; the median, or most voted, was taken.
Labels were read in more than one language; the first place label's was taken.
chosen is absent when that first label reads a plain name — local names, which sets no
text.language at all — or when the language it reads is one the tiles do not carry. It is
optional precisely so that case cannot be mistaken for a language: the field used to name the
first language observed, which was not always the one applied.
A label language the VersaTiles tiles do not carry; local names are used.
Layers of the input that no probe read. Not necessarily lost — see the code's note.
A projection the options cannot express.
No source of a known schema, and no imagery either.
No vector source could be read, but something else could — the vector half is missing.
More than one vector source: all of them were read as one map.
A vector source carries tiles of no schema this package knows; its layers were not read.
A source's TileJSON could not be downloaded; its schema was read from the style instead.
Two palettes fit almost equally well; the cheaper one was taken.
Every diagnostic a migration can report, with the payload it carries.
The payload is typed per code rather than left an open record, because for the codes that matter most the payload is the diagnostic:
color.conflictis worth reporting only if a consumer can read the colours out of it and offer them as a choice, and an untyped field would force a cast at exactly that point. Typing it later would be a breaking change, so the map exists from the start even while it is short.Adding a code is not breaking for a consumer that switches on the ones it knows and prints
messagefor the rest.There is no
vote.tieof its own, and that rests on an invariant worth stating: every payload whose value was chosen by a vote exposes its tally, as acountor as an array whose length is the count. A tie is then two equal counts, which a consumer can see without a second code saying so. A vote-based payload added without a tally would break this quietly, andvote.tiewould have to come back.icon.conflictcarries no count and needs none — ratios reduce to a mean, not a vote.