Skip to main content

2026-07-17 — Locality name-index (the FR comma-drop xfail): a decode-time atlas prior is falsified; the split belongs to the k-best arbiter

The tracked defect (gauntlet KNOWN_INV_XFAIL, comma-drop|181 Rue du Chevaleret, Paris): a comma-free address whose localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. is the terminal tokentokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words. with no anchor after it — 181 Rue du Chevaleret Paris — absorbs the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 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. (street="du Chevaleret Paris", no localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.), loses the rooftoprooftopGeocoding precision at the building or parcel level — coordinates within a few metres — the highest tier of the geocode cascade. Sourced from address-point and situs data., resolves to null. Every anchored form 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. fine: the comma form, the …, 75013 Paris postcodepostcodeThe country-specific postal code (US ZIP, French code postal, etc.). Mailwoman handles postcode parsing entirely by rule classifier — a regex problem, not an ML one. form, and the US twin (…Washington DC, fixed on merit by the v381 punct-drop augmentation). The disambiguating knowledge is which names are places — the atlas.

The pre-registered question (road-to-v7 P1): can a decode-time emission prioremission priorA log-probability bias injected into the model's emission logits from an external signal — gazetteer frequency, an FST, a Wikipedia-importance score — combined with the learned weights at decode time., atlas-verified and scoped like the doubleton bias (neural/query-shape-prior.ts), make the split without a retrain or the k-best arbiter? Measured answer: no. The prior is structurally incapable of the disambiguation, for a reason the emissions make arithmetic. This is the design-doc exit the task pre-registered.

Runner: scratchpad/locality-index-probe.run.ts (the shipped neural-weights-en-us 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.' — v381 int8, md5 2025ac6e — the same 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.' the gauntlet grades every base with, FR included; traceParse raw logitslogitA raw, unnormalized per-label score the model outputs before softmax. Priors and biases are added in logit space, then softmax turns logits into probabilities. at the terminal piece). Baseline: mailwoman eval gauntlet --layer metamorphicPASS with 6 tracked xfails, the Chevaleret comma-drop among them (address_point→admin, coord → null).

What the emissions say

A decode-time prior can only add a constant to B-locality at the terminal piece. It flips the piece from I-street to B-locality when the bias exceeds 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.''s own emission gap (max(I-street, B-street) − B-locality). So the prior works iff a single bias threshold separates the class that should flip (terminal tokentokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words. IS the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.) from the class that must not (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. legitimately ends in a place-word). It does not:

classexampleterminal gap
flip (terminal = localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.)…Victor Hugo Bordeaux2.18
flip…Gambetta Toulouse2.69
flip (the target)181 Rue du Chevaleret **Paris**3.29
flip…de la Gare Rennes4.30
flip8 Boulevard Voltaire Marseille5.03
keep (place-word is 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.)22 Rue de **Rome**3.66
keep3 Rue de Metz4.35
keep8 Rue de **Lyon**4.84
keep (identical tokentokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words. to the target)15 Rue de **Paris**5.31
keep9 Rue de Rennes5.71

Flip-class gaps 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. [2.18, 5.03]; keep-class gaps 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. [3.66, 6.13]. They overlap on [3.66, 5.03]. A bias set to flip all ten targets (5.04) wrongly flips 3/10 real Rue de <City> streetsstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.; a bias set at the flip-class median (~3.2) already breaks Rue de Rome. There is no threshold that flips …Paix **Lyon** (3.15, localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.) without also flipping Rue de **Rome** (3.66, streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.) or Rue de **Lyon** (4.84, streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.). This is the same constant-vs-context-mass defeat that beat the word-consistency heal on digit ownership: an additive prior cannot outvote a distribution it is added to uniformly.

Why the atlas can't rescue it — three structural walls

  1. Membership is identical across the boundary. The target …Chevaleret **Paris** and the false-positive 15 Rue de **Paris** carry the same terminal tokentokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words. with the same atlas hit. Any atlas-membership gate — a shipped lexicon or a runtime candidate probe — fires identically on both. The only separator is grammatical attachment (does the place-word stand alone after a complete streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels., or complete a Rue de … name?), which membership cannot see and 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.' already encodes weakly in exactly the overlapping gaps above. An atlas-gated flat bias throws that signal away and replaces it with a constant.

  2. The gate reads piecesECE (Expected Calibration Error). A metric that measures how well a model's confidence scores align with its actual accuracy. Lower is better. Mailwoman's held-out ECE drops from 0.067 (raw) to 0.0035 (calibrated)., not surfaces. The en-us SentencePieceSentencePieceA language-independent subword tokenizer that splits text into pieces using a unigram language model. Mailwoman uses a SentencePiece tokenizer with a 48,000-token vocabulary and byte-fallback, trained on address data rather than general text. tokenizertokenizerThe component that converts a raw address string into a sequence of numeric token IDs the model can process. Mailwoman's tokenizer is a SentencePiece unigram model trained specifically on postal addresses. fragments the FR citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. names this defect targets: Marseille→"e", Nantes→"es", Grenoble→"ble", Strasbourg→"bourg", Turin→"in". The terminal piece the prior would key on is a subword, not the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. surface, so a piece-level lexicon lookup never fires on half the target class (count at the unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. 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.' reads). A char/word-level lookup re-imports the phrase-grouper's boundary problem.

  3. A shippable-small index can't be complete, and completeness wouldn't help. The anchor lexicon is 11 KB; the WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations. localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. set is millions of surfaces. A population-thresholded subset is both coveragecoverageThe fraction of a population or region for which a data source has real, non-placeholder entries — e.g. 47% rooftop coverage on Texas addresses. Distinct from accuracy on the rows that are present.-limited (misses the long tail the defect also hits) and — per wall 1 — useless where it does hit, because Paris is in it for both the target and the false-positive. There is no small index, and no complete index, that separates the two.

Two practical failures compound these: the terminal-single-tokentokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words. scope misses multi-word localities (Mountain View — terminal "View" is not a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.), and the fix is necessary-not-sufficient anyway (15 Rue de Paris **Lyon** 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. street="de Paris Lyon" — 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.' sweeps the real trailing localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 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. too, so flipping one terminal piece leaves a broken streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. tail).

The honest fix — the resolver-as-arbiter, with its evidence interface

The split is decidable, just not from tokentokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words. identity. It is decidable from whole-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. atlas consistency, which is the registry-backed doctrine's positive-evidence streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels./localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. existence, and which only the k-best arbiter (#727 stagestageOne of the dataflow stages in the runtime pipeline (normalize, locale gate, kind classify, phrase group, token classify, sequence correct, reconcile, resolve). Distinct from tier (model vocabulary) and phase (plan milestone).-2) can consume. The arbiter generates the two competing 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. and scores each against the atlas:

  • Parse Ahouse="181" street="du Chevaleret" locality="Paris". Evidence: does a national register (BANBAN (Base Adresse Nationale). France's authoritative open national address register — the highest-quality training source for French addresses, with full component structure., Tier A) contain a thoroughfare Rue du Chevaleret within the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. Paris? Yes → A is atlas-consistent.
  • Parse Bhouse="181" street="du Chevaleret Paris". Evidence: does any register contain a thoroughfare literally named du Chevaleret Paris? No → B is atlas-inconsistent.
  • For the false-positive 15 Rue de Paris: 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. B (street="de Paris") is atlas-consistent — Rue de Paris is a real thoroughfare in many communes — so the arbiter keeps it. Same terminal tokentokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words., opposite verdict, because the evidence is joint, not lexical.

This is the interface B1 (#727 stagestageOne of the dataflow stages in the runtime pipeline (normalize, locale gate, kind classify, phrase group, token classify, sequence correct, reconcile, resolve). Distinct from tier (model vocabulary) and phase (plan milestone).-2) should consume — a per-candidate-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. evidence vector, not a per-tokentokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words. clue:

StreetLocalityEvidence {
street_in_locality: PositiveHit | null // BAN/BAG: thoroughfare exists within the proposed locality
street_as_named: PositiveHit | null // BAN/BAG: the full proposed street surface exists as a thoroughfare name
locality_exists: PositiveHit | null // WOF/atlas: the proposed locality surface is a settlement (NOT street-existence)
// PositiveHit = { tier: "A"|"B"|"C", population_rank?: number, provenance: string }
}

The arbiter prefers the candidate maximizing street_in_locality + locality_exists while penalizing a street_as_named-only reading — positive evidence only, no global veto (the digit-ownership scar). TiertierInternal versioning of which label classes the model emits. Tier 1 is the coarse components (country, region, locality, postcode); Tier 2 adds venue, street, house_number; Tier 3 (future) would add attention, po_box, and POI venue subtyping. Historically called 'Stage 1/2/3' before the runtime-pipeline naming made that ambiguous. discipline holds: WOFWOF (Who's On First). An open-source gazetteer of places maintained by Mapzen/whosonfirst. Mailwoman builds a custom SQLite database from WOF GeoJSON repos, extended with postcode data, importance scores, and coincident-role relations. supplies locality_exists but never streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. existence; BANBAN (Base Adresse Nationale). France's authoritative open national address register — the highest-quality training source for French addresses, with full component structure./BAG (Tier A) is the proving ground for the two streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. signals. This is the same shape the cascade-viability probe landed on (2026-07-17): the atlas judges 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., not tokenstokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words..

Verdict

Do not build the decode-time localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. prior; it cannot separate …Chevaleret Paris from Rue de Paris, which carry the identical terminal tokentokenOne word or subword in the tokenized input. For the neural classifier, tokens come from SentencePiece (subword units); for the rule classifiers, tokens are whitespace- and punctuation-separated words. and identical atlas membership, and whose emission gaps overlap. Leave the comma-drop|181 Rue du Chevaleret, Paris xfail tracked (visible, non-blockingblockingThe first stage of entity resolution: generate candidate record pairs using cheap, high-recall keys (geo cell, canonical address, phone) instead of comparing every record to every other (O(n²)). The matcher only scores pairs that survive blocking.) and route the fix to the k-best arbiter (#727 stagestageOne of the dataflow stages in the runtime pipeline (normalize, locale gate, kind classify, phrase group, token classify, sequence correct, reconcile, resolve). Distinct from tier (model vocabulary) and phase (plan milestone).-2) via the StreetLocalityEvidence interface above. The probe cost one evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error. sweep and closes P1 with receipts.

Note: the P1 brief cited "issue #30" for the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. name-index; GitHub #30 is in fact the NADNAD (National Address Database). A US Department of Transportation dataset of structured address points, added to the training corpus as a major source of real US addresses. adapter. The concrete tracker for this defect is the #1101 comma-free-invariant xfail in mailwoman/eval-harness/gauntlet/metamorphic.ts.