T1c — the FR fragment board: the house number is a licence, not a hint
Deliverable (2026-07-16 review, 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. 1c): replace the n=63 Paris anecdote with a BANBAN (Base Adresse Nationale). France's authoritative open national address register — the highest-quality training source for French addresses, with full component structure.-sampled board carrying confidence intervals per phenomenon class, and make it the grading set for the T2 shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row..
Built, and its first read reframes the arc. With a 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. the shipped 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.' scores 92.5%; without one, 21.5% on the same 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 gap is not a difficulty gradientgradientThe direction and rate at which the loss would change if each parameter were nudged. Training follows the gradient downhill to reduce error. Huge gradients are tamed by gradient clipping.. 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.' has learned that a 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. licenses a streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. reading at all — remove it and a designatordesignatorThe closed-vocabulary leading word of a secondary-address phrase — 'Apt', 'Suite', 'Floor', 'PO Box', 'Level' — paired with an identifier to form a complete subpremise.-led phrase 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 a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy., designatordesignatorThe closed-vocabulary leading word of a secondary-address phrase — 'Apt', 'Suite', 'Floor', 'PO Box', 'Level' — paired with an identifier to form a complete subpremise. included.
| Board | mailwoman eval fragment-board (eval-harness/fragment-board.ts) |
| Fixture | fixtures/ban-fragments-fr.jsonl — 2,800 rows, 7 classes, 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) |
| Builder | scratchpad/build-ban-fragment-board.py (seeded, deterministic) |
| 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.' | v264 (v6.3.0, shipped), production config |
1. The board
| class | n | rate | 95% Wilson |
|---|---|---|---|
| streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-housenumber | 400 | 0.925 | [0.895, 0.947] |
| alnum-housenumber | 400 | 0.925 | [0.895, 0.947] |
| bare-streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. | 400 | 0.215 | [0.178, 0.258] |
| streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-particle | 400 | 0.273 | [0.231, 0.318] |
| admin-streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-homonym | 400 | 0.087 | [0.064, 0.119] |
| date-name | 400 | 0.055 | [0.037, 0.082] |
| bare-localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. (emits no streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.) | 400 | 0.980 | [0.961, 0.990] |
| OVERALL | 2800 | 0.494 | [0.476, 0.513] |
Nothing here needs squinting at: the numbered classes and the bare classes are separated by ~70pp with intervals nowhere near touching. Contrast the Paris board's 3/15 cell, whose interval is [0.07, 0.45] — this is the difference between a measurement and an anecdote with a decimal point.
2. What the model actually says
The rates undersell it. The 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.:
"Rue Montmartre" -> locality="Rue Montmartre"
"Allee Poque" -> locality="Allee Poque"
"Allee Bienville" -> locality="Allee Bienville"
"Allee Capitaine Moret" -> locality="Allee Capitaine" region="Moret"
The designatordesignatorThe closed-vocabulary leading word of a secondary-address phrase — 'Apt', 'Suite', 'Floor', 'PO Box', 'Level' — paired with an identifier to form a complete subpremise. is swallowed into the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.. Rue is the most deterministic streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. signal in
French — it can only mean streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. — and without a 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. it is absorbed into a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 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
arc's §2 framing ("the prior on bare toponymstoponymA proper name for a geographic place. is wrong") is confirmed and is understated: 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.' is
not mislabelling an ambiguous toponymtoponymA proper name for a geographic place., it is mislabelling Rue.
And the date-name class, which is the tell:
"Allee du 11 Novembre" -> street="Allee du" house_number="11" street="Novembre"
"Allee du 11 Septembre 1944" -> street="Allee du Septembre" (11 and 1944 deleted)
"Allee du 8 Mai" -> locality="Allee" street="du" house_number="8 Mai"
"Allee de l'An 2000" -> "l"
Here 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.' does emit streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. — because a digit is present. It then steals the digit as a house number and fragments 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. around the hole. 5.5% correct, the worst class on the board.
3. One mechanism explains every cell
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. is not a hint. It is the licence. 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.' has learned "digits ⇒ this is a streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. address"; 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. reading is conditioned on that licence, not on the designatordesignatorThe closed-vocabulary leading word of a secondary-address phrase — 'Apt', 'Suite', 'Floor', 'PO Box', 'Level' — paired with an identifier to form a complete subpremise..
| class | licence? | consequence | rate |
|---|---|---|---|
| streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-housenumber | yes, clean | 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. correctly | 0.925 |
| alnum-housenumber | yes, clean | 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. correctly | 0.925 |
| bare-streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. | none | designatordesignatorThe closed-vocabulary leading word of a secondary-address phrase — 'Apt', 'Suite', 'Floor', 'PO Box', 'Level' — paired with an identifier to form a complete subpremise.-led phrase → localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. | 0.215 |
| streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-particle | none | same | 0.273 |
| admin-streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-homonym | none | same, and the toponymtoponymA proper name for a geographic place. is a place → stronger | 0.087 |
| date-name | yes, but spurious | licence granted, digits stolen, streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. split | 0.055 |
| bare-localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. | none | → localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. — correct | 0.980 |
The negative class passes for the wrong reason. bare-locality scores 0.980 not because 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.'
recognises a commune, but because it calls everything without a 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. a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy., and on
bare localities that is accidentally right. That is a standing prediction for T2: teaching bare
streetsstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. may regress bare-locality, because the class currently free-rides on the same broken
default. This is precisely why the negative class is a guard and not a trophy.
It also unifies the digit findings that looked like two bugs. T1a: 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. decode pulls a digit 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. ("korunní" → "korunní 8"). T1c: the BIO decode pushes digits out of 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.
("Allee du 11 Novembre" → "Allee du Novembre"). One confusion — 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.' cannot tell a digit that
belongs to a streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. name from a digit that is a 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. — surfacing from both sides.
4. Pre-registered targets for T2
The board is the grading set. Registered as baselines; the shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. is graded against these exact cells.
Must move (the thesis): bare-street 0.215 · street-particle 0.273 · admin-street-homonym
0.087 · date-name 0.055.
Must not regress (the guards):
street-housenumber0.925 andalnum-housenumber0.925 — the contextful guard. A shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. that fixes fragments by degrading normal addresses has moved the failure, not fixed it.bare-locality0.980 — the one to watch, per §3. If it falls while the bare classes rise, the shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. traded one default for another rather than teaching the distinction.- The global parity floor (
eval parity) must hold. Board 2 moving is not a verdict alone.
Split discipline: the board reserves its 2,400 streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. surfaces in ban-fragments-fr.surfaces.txt.
The T2 shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. MUST exclude every one — source-disjoint by normalized surface, never by record row.
Row-disjoint leaks the surface across the boundary and measures memorizationoverfittingWhen a model memorizes quirks of its training set instead of learning general patterns, so it scores well in training but poorly on new data. Guarded against with held-out evals and regularization. of Rue de Rivoli while
claiming generalizationgeneralizationA trained model's performance on data unlike its training set — new regions, new input distributions. The property honest eval is designed to measure. to unseen streetsstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels..
5. Known limitation
BANBAN (Base Adresse Nationale). France's authoritative open national address register — the highest-quality training source for French addresses, with full component structure.'s sharded DBs retain only locality_norm / locality_base, so the negative class is
accent-stripped (Amelie-les-Bains-Palalda). French title-casing is reconstructed; the accents cannot
be. This makes bare-locality mildly out-of-distribution and may inflate its absolute difficulty — it
does not affect the comparison the board exists for, since every 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.' sees the identical input. Source
commune surfaces from a register that keeps them if the absolute number ever matters.
Note the two negative-class rates are not comparable across fixtures: the shipped 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.' hallucinates
on 2% of these clean BANBAN (Base Adresse Nationale). France's authoritative open national address register — the highest-quality training source for French addresses, with full component structure. communes but 22% of parity's 54 streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-free rows, which include venuesvenueA named, non-address place — a business, building, park, or stadium. Mailwoman's free-text point-of-interest component, added as a Tier 2 fine label., BOOM,
and New York, NY. Different populations, both real.
Reproduce: mailwoman eval fragment-board --weights-cache <dir> (add --klass bare-street for a
fast loop). Rebuild the fixture with python3 scratchpad/build-ban-fragment-board.py — seeded, so it
reproduces byte-identically.