Skip to main content

Belgium — 30 addresses, three configurations

What ran​

On 2026-08-04 we ran 30 Belgian address lines through a local install three times, changing one thing each time. We chose Belgium because on that date it had no evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error. tier. It has since entered tier 2. No Belgian rooftoprooftopGeocoding precision at the building or parcel level — coordinates within a few meters — the highest tier of the geocode cascade. Sourced from address-point and situs data. registerinput modeThe Decision-A register switch: 'fragmented' (human-typed fragments — feeds the evidence channels) vs 'formatted' (complete records — runs the trained absence identity). Explicit on CLI/API; per-endpoint defaults (batch→formatted, autocomplete→fragmented); kind-derived otherwise. ships, no nl-BE or fr-BE weightsparameterA single learned number inside a model — one weight or bias. Mailwoman's encoder has roughly 30 million of them; training is the search for good values. package exists, and the global candidate gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. is the only artifact that answers. This panel reports the results you get from that setup.

Belgium also suits a bilingual test. Five Brussels streetsstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. appear twice, once in Dutch and once in French, such as Wetstraat and Rue de la Loi or Grote Markt and Grand-Place. Each pair tests whether two surface forms of one streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. reach the same place.

The main result is that six of the 30 rows do not land in Belgium with default settings. Set one option fixes all six.

Method​

The panel is be-panel.json: thirty address lines built from public streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. names, each paired with the postcodepostcodeThe country-specific postcode (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. and commune it belongs to. Ten lines are the five bilingual Brussels pairs. Nine are in Flanders, nine are in Wallonia, and two are in the German-speaking Community. No Belgian rooftoprooftopGeocoding precision at the building or parcel level — coordinates within a few meters — the highest tier of the geocode cascade. Sourced from address-point and situs data. registerinput modeThe Decision-A register switch: 'fragmented' (human-typed fragments — feeds the evidence channels) vs 'formatted' (complete records — runs the trained absence identity). Explicit on CLI/API; per-endpoint defaults (batch→formatted, autocomplete→fragmented); kind-derived otherwise. ships, so the pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-hint → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package. parsesaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates. the house numberhouse numberThe numeric or alphanumeric identifier of a building on a street. Mailwoman's house_number component; its position relative to the street name flips between locales. but never looks it up. The panel does not depend on any particular number existing on these streetsstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels..

The run has three arms, each labeled with the question a reader is likely to ask:

ArmWeightsparameterA single learned number inside a model — one weight or bias. Mailwoman's encoder has roughly 30 million of them; training is the search for good values.ConfiguredQuestion
baseen-USno overridesWhat does an install plus a gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. give me?
fr-overlayfr-FRno overridesDoes the nearest measured localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. help?
country-pinneden-USdefaultCountry: "BE"What if I tell it the file is Belgian?

The first two arms leave the countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. unpinned, because the panel measures countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. routing. Belgian place namestoponymA proper name for a geographic place. collide with Dutch, French and Slovenian ones, and the panel is designed to catch cross-border misses.

The panel grades four measures, and none of them uses a ground-truth coordinate set. Belgium has no public rooftoprooftopGeocoding precision at the building or parcel level — coordinates within a few meters — the highest tier of the geocode cascade. Sourced from address-point and situs data. registerinput modeThe Decision-A register switch: 'fragmented' (human-typed fragments — feeds the evidence channels) vs 'formatted' (complete records — runs the trained absence identity). Explicit on CLI/API; per-endpoint defaults (batch→formatted, autocomplete→fragmented); kind-derived otherwise. to grade distances against, so this page claims no distance to a true building.

  • Resolution: whether a coordinate came back, and at which tier.
  • CountrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. routing: whether the coordinate falls inside a bounding box drawn around Belgium's extremes, and whether the result reports BE. A coordinate outside the box did not land in Belgium. A coordinate inside the box is not necessarily correct.
  • LocalitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy., split three ways, because each of the two obvious versions is misleading on its own. parsed reads the spanspanA contiguous range of characters or tokens in the input string, tagged with an address component type (street, locality, postcode, etc.). Parsed addresses are represented as collections of spans, possibly nested in a tree. the modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' labeled. That is nearly circular because the commune appears in the input string. name matched reads only the nodes the resolverresolverThe component that converts parsed address components (locality, region, postcode) into coordinates by looking them up in the gazetteer. The resolver ranks candidates by name match, population, and proximity, and returns the best-matching place with its centroid or polygon. decorated. It shows that the gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. returned an accepted spelling but not where that place is. resolved combines the name match with the bounding-box check, and it is the measure to read. Place namestoponymA proper name for a geographic place. repeat across countries, and this panel exists to catch cases where the wrong place won.
  • Bilingual agreement: for each pair, the distance between the two language forms. This measure needs no ground truthground truthThe correct answer for an example, used as the standard a prediction is graded against. Mailwoman's ground truth is the hand-labeled golden set; its quality caps achievable accuracy.. Both rows refer to one streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels., so any distance between them means the pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-hint → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package. disagrees with itself.

Numbers​

Thirty rows per arm, from be-results.json:

Measurebasefr-overlaycountry-pinned
Returned a coordinate272730
Inside the Belgium bounding box242430
Result names BE242430
LocalitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. — parsed292930
LocalitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. — name matched262630
LocalitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. — resolved, in Belgium242430
Bilingual pairs declared555
Bilingual pairs comparable445
Bilingual pairs agreeing445
Worst pair separation0 km0 km0 km
Answered at admin272730
Answered at no tier330

The three findings below are ordered by how much they change what you would do.

Every row that answered did so at admin, which is a commune centroid. No result on this panel is streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-grade, because no Belgian artifact exists that could provide streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-grade results. A perfect score here means "resolved to the right commune", and a commune is kilometers wide. Three rows in the first two arms returned no coordinate. They are counted as none rather than included in the admin row.

The last localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. row applies a check to the one above it. A name match shows that the gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. returned a place with an accepted spelling. It does not show that the place is in Belgium. On this panel, that gap is two rows in each of the first two arms: one Belgian commune name matched a place in the Netherlands, and one matched a place in France. The last of the two rows is the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. measure to read.

The French overlay leaves every measure unchanged. The fr-overlay arm is identical to base on every measure and on all thirty per-row records. The per-arm weights entry in the result file shows why. The single versions.model run stamp does not. Both arms record the same weights.model, model.onnx, but their weights.source values differ: package:@mailwoman/neural-weights-en-us against package:@mailwoman/neural-weights-fr-fr+base. The +base suffix means the loader resolved the French package through to the base package. The French package is a data-only overlay. It ships no model.onnx, only French postcodepostcodeThe country-specific postcode (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one., pair-index and FSTFST (finite-state transducer). A compact automaton that reads an input sequence and emits an output sequence. Mailwoman encodes gazetteer names and street affixes as FSTs for fast prefix matching and prior injection without search overhead. siblings, and the pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-hint → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package. consults none of them for a Belgian postcodepostcodeThe country-specific postcode (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one.. Belgium has no tier, and choosing the nearest tier does not give it one.

A countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. pin fixes every failure. country-pinned scores 30 out of 30 on all six resolution measures. That result comes from one option in the call, and the next section describes the failures it repairs.

Losses​

Six rows fail in the base arm. Five share one defect, and the sixth has a different one.

AddressWhere it landedCountrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head.
Grote Markt 1, 1000 Brusselno coordinate—
Rathausplatz 1, 4700 Eupenno coordinate—
Hauptstrasse 1, 4780 Sankt Vithno coordinate—
Oude Markt 1, 3000 Leuven51.844, 5.094 — the NetherlandsNL
Place Saint-Lambert 1, 4000 Liège47.229, 1.110 — Le Liège, FranceFR
Rue Léopold 1, 4000 Liège46.243, 14.364 — SloveniaSI

The gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. contains the right answers. A direct probe of candidate.db for the names in these rows returns:

leuven → Leuven/BE pop=102275 | Leuven/BE pop=101032 | Leuven/NL pop=0
liege → Liège/BE pop=197013 | Liège/BE pop=195278 | … | Le Liège/FR pop=238
eupen → Eupen/BE pop=19254
sankt vith → Sankt Vith/BE pop=9481

The Belgian answer is present and ranked first in each case. A 102,275-person Belgian citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. loses to a zero-population Dutch hamlet of the same name, and a 197,013-person Belgian citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. loses to a 238-person French commune. The ranker did not decide these rows.

The countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. prior decided them. The six failures were re-run with the countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. filter disabled, using the same weightsparameterA single learned number inside a model — one weight or bias. Mailwoman's encoder has roughly 30 million of them; training is the search for good values., gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. and input strings:

default placerCountryUse: "prior"
───────────────────── ────────────────────────
(none) → BE 50.850, 4.349 Grote Markt 1, 1000 Brussel
(none) → BE 50.631, 6.031 Rathausplatz 1, 4700 Eupen
(none) → BE 50.280, 6.126 Hauptstrasse 1, 4780 Sankt Vith
NL 51.844, 5.094 → BE 50.879, 4.701 Oude Markt 1, 3000 Leuven
FR 47.229, 1.110 → BE 50.645, 5.574 Place Saint-Lambert 1, 4000 Liège
SI 46.243, 14.364 → SI 46.243, 14.364 Rue Léopold 1, 4000 Liège

Five of the six recover. A confident whole-string countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. guess is promoted from a ranking bias to a filter. When the guess is wrong, the filter removes the correct candidates before ranking runs. This also explains why three of the six returned no coordinate instead of a wrong answer. The filter removed every Belgian candidate, so no candidate was left to rank.

The sixth row is a parseaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates. failure, and no configuration fixes it. Rue Léopold 1, 4000 Liège parsesaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates. as streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. Rue Léopold 1, postcodepostcodeThe country-specific postcode (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 4000 Liège, and house numberhouse numberThe numeric or alphanumeric identifier of a building on a street. Mailwoman's house_number component; its position relative to the street name flips between locales. null. The parser absorbs the number into the streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. spanspanA contiguous range of characters or tokens in the input string, tagged with an address component type (street, locality, postcode, etc.). Parsed addresses are represented as collections of spans, possibly nested in a tree. and the commune into the postcodepostcodeThe country-specific postcode (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. spanspanA contiguous range of characters or tokens in the input string, tagged with an address component type (street, locality, postcode, etc.). Parsed addresses are represented as collections of spans, possibly nested in a tree.. Slovenia's postcodepostcodeThe country-specific postcode (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 4000 is Kranj, and a query with 4000 and no readable commune routes there. Under country-pinned, this row returns the right coordinate, but its parseaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates. is still wrong: house numberhouse numberThe numeric or alphanumeric identifier of a building on a street. Mailwoman's house_number component; its position relative to the street name flips between locales. null, streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. Rue Léopold 1, postcodepostcodeThe country-specific postcode (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. 4000 Liège. The 30-out-of-30 above includes a row whose parseaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates. is broken. A high resolve rate can hide a broken parseaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates. in this way, so this page reports the parsed and resolved localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. counts as separate rows.

Two of the six were scored as localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. hits until the metric was fixed. Oude Markt 1, 3000 Leuven resolves to a hierarchy reading ["Leuven"], and Place Saint-Lambert 1, 4000 Liège resolves to ["Le Liège", "Liège"]. Both are accepted spellings, and both places are in the wrong countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head.. On a panel that tests cross-border misrouting, a name match does not count as a correct resolution. The published metric therefore combines the name match with the bounding-box check, and the page reports both rows separately.

One bilingual pair could not be measured. Grote Markt 1, 1000 Brussel returned no coordinate in the base and fr-overlay arms, so its French twin had no result to compare against. The pairs row reads 4 comparable of 5 declared rather than 4 of 4. An early version of the script dropped the unmeasurable pair from its denominator and reported that every pair agreed. Every pair that could be compared agreed to within the reporting precisionprecisionOf the spans the model labeled as a given tag, the fraction it got right. High precision means few false positives. Paired with recall to compute F1., in every arm.

Caveats​

Belgium is an unmeasured localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for., and this panel does not change that. Mailwoman has no Belgian evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error. set, trainingtrainingThe process of adjusting a model's parameters so its predictions match labeled examples, by repeatedly measuring error and nudging the weights to reduce it. Distinct from inference, when the trained model is run on new input. tier, or rooftop datasitus dataA dataset of exact address-point coordinates (rooftop-level). Mailwoman's geocoder uses a national situs layer (124.9M US points built from state address-point sources) as the highest-precision tier of the geocode cascade.. All results above come from 30 addresses run through a global gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture.. Locales and tiers lists the measured localeslocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for., and Belgium is outside that list.

Every number is a commune-grade number. All 84 answering row-runs answered at admin. Read 30 of 30 as "the right commune centroid" and not as streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. accuracy. The error is bounded by the size of the commune, and this panel does not measure it.

The bounding-box check is coarse in one direction only. A coordinate outside the box definitely missed Belgium. A coordinate inside it could still be the wrong commune, and the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. row covers that case.

We wrote the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighborhood in the hierarchy. expectations. Each row has a committed list of accepted commune spellings in be-panel.json, covering the Dutch, French and English forms a gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. may hold. The spellings are public facts that anyone can check, but we chose which ones to include.

n = 30, and the rows are civic addresses on well-known streetsstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.. That population is easier than a delivery manifest. A harder panel would likely score worse, and we have not run one.

What to do with this​

Pin the countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. when you know it. For a file you already know is Belgian, defaultCountry: "BE" took this panel from 24 correct to 30. The change is one line in the library, the CLI and the server. The countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. prior exists to help an input that arrives without context. A file that has context should state it instead of letting the prior guess.

Reproduce​

The script is be-panel.mjs, the panel is be-panel.json, and the output above is be-results.json verbatim, including a per-row record for all thirty addresses in each of the three arms.

That file's versions block records what this run used: Mailwoman 8.7.0, model.onnx from neural-weights-en-us@7.0.0, and candidate-global-1026.db. Each arm additionally records its own weights entry. That entry shows how the identical base and fr-overlay columns are traceable to one ONNXONNX (Open Neural Network Exchange). An open format for machine learning models that enables interoperability between training frameworks and inference runtimes. Mailwoman ships its trained model as an ONNX file so it can run in Node.js and the browser via onnxruntime. file behind two package names. The block has no data-release field, because no Belgian registerinput modeThe Decision-A register switch: 'fragmented' (human-typed fragments — feeds the evidence channels) vs 'formatted' (complete records — runs the trained absence identity). Explicit on CLI/API; per-endpoint defaults (batch→formatted, autocomplete→fragmented); kind-derived otherwise. ships.

npm install mailwoman @mailwoman/neural @mailwoman/neural-weights-en-us \
@mailwoman/neural-weights-fr-fr @mailwoman/resolver \
@mailwoman/resolver-wof-sqlite @mailwoman/spatial
mailwoman data pull candidate
node be-panel.mjs --data-root <DATA_ROOT> --out be-results.json

The run needs one 2.88 GB bundleevidence bundleThe pair of retrieval-augmented input channels (street-type + locality-surface) that feed lexicon membership as soft per-token evidence alongside the text. Shipped in 6.7.0; trained natively from step 0 in the from-scratch base line. and no rooftoprooftopGeocoding precision at the building or parcel level — coordinates within a few meters — the highest tier of the geocode cascade. Sourced from address-point and situs data. database. That is the condition the panel tests. The three arms took 4,273 ms together, excluding modelneural classifierThe machine learning model at the core of Mailwoman's parser — a transformer encoder (~30M parameters) trained from scratch to do BIO token classification over addresses. It learns the 'grammar' of address formats; the gazetteer supplies the 'atlas.' load.

  • France — 100 addresses from the BAN — the same implementation where a national registerinput modeThe Decision-A register switch: 'fragmented' (human-typed fragments — feeds the evidence channels) vs 'formatted' (complete records — runs the trained absence identity). Explicit on CLI/API; per-endpoint defaults (batch→formatted, autocomplete→fragmented); kind-derived otherwise. does exist.
  • How to read our numbers — why the resolve rate and the precisionprecisionOf the spans the model labeled as a given tag, the fraction it got right. High precision means few false positives. Paired with recall to compute F1. are different numbers.
  • Locales and tiers — which countries are measured.
  • Runtime flags — the countrycountryThe top-level address component (an ISO country). Closed-vocabulary, so it is best handled by a deterministic matcher feeding a proposal rather than a retrained model head. prior and its filter.