v0.9.3 region-tail — the corpus lever is exhausted
Verdict: not promoted. v0.9.3 added the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail to the international German synth (the one variable vs v0.9.2). It fixed what it was built to fix — regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tagging — and left the thing we actually needed unmoved: international-order localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.. Three retrains now agree the international ceiling is the postcode anchoranchor inferenceA technique where structured knowledge (postcode locations, gazetteer place names) is injected into the model as soft input features — not as deterministic overrides. The model still decides the final labels, but the anchor signal biases it toward correct admin tags.'s structure, not the data. The follow-up (v0.9.4 dual-injection) is 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.. Tracking: #327.
The 2×2 (DE locality-match, 3,000 real OpenAddresses German addresses, --default-country DE)
| anchor OFF | anchor ON | |
|---|---|---|
| US order | 47.1% | 44.7% |
| native DE | 48.3% | 83.6% |
No-regression: US 97.2%, FR 84.9% (both within ~1pp of v0.7.2). cross_pollution 0.00%.
vs v0.9.2 (both-order, no regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail): native 82.1 → 83.6 (+1.5, still beats PeliasPeliasAn open-source geocoder, Mailwoman's spiritual predecessor.'s 78.7), international anchor-ON 44.5 → 44.7 (flat), international anchor-OFF 48.4 → 47.1 (flat).
What moved, and what didn't
The regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail is rendered correctly. A direct look at the synth confirms it: Davoser Straße, Berlin, Berlin 14199 tokenizes to Berlin/B-locality Berlin/B-region 14199/B-postcode, regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. labeled and aligned. So the "rendering is broken" exception in the pre-registered gate doesn't apply here.
And it worked, for regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.. International regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.-match rose from 30.8% (anchor off) to 38.3% (anchor on): 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 now learning to segmentsegmentA punctuation-bounded chunk of the normalized input — the comma-separated parts of 'Portland, OR' — used to give downstream stages structural context. a City, Region Postcode tail it never saw before. But international localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.-match sat flat at 44.7% with the anchor on, against 83.6% native. The regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail taught regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.. It did not teach localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy..
PIP-containment (gold point inside the resolved polygon) confirms this is a real geographic miss, not a name-match artifact: 57% on international order against 96% native. 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 placing international-order German localities in the wrong spot, and the anchor isn't rescuing it.
Why the gate fails, and where it points
The pre-registered gate asked two things. First, that the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail lift the intrinsic international ceiling (anchor-OFF international ≥ native). It didn't — international anchor-OFF held at ~47% while native held ~48%, no movement from v0.9.2. Second, that the anchor-ON international gap close to 10pp or less. It's 38.9pp (83.6 native − 44.7 international). Both miss.
The diagnosis the gate was built to reach: the corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus. lever is spent. Anchor-OFF parsingaddress 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 already order-agnostic (~48% both orders), forcing the country posteriorcountry posteriorA country → probability map (derived from postcodes or the coarse-placer) that re-ranks resolver candidates as a soft prior, never a hard filter. to DE=1.0 on v0.9.2 left international unchanged at 44.5%, and now the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail moves regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. but not localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.. The 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. anchor fires at the trailing 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., which in international order sits on the far side of the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. from where it's needed. The harm is positional, baked into where the anchor lives, not into the data feeding it.
Decision
v0.9.3 is not promoted (the target metric, international localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy., didn't move; nothing else regressed). The next experiment is v0.9.4 dual-injection — pool the 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. anchor and also inject it at position 0, an order-independent global cue the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. can attend back to regardless of word order. One variable vs v0.9.3 (model.inject_first_token=true), same corpuscorpusThe BIO-labeled training data used to train Mailwoman's neural classifier. Assembled from real sources (OpenAddresses, National Address Database) and synthetic shards (boundary stress, order variants, negative space). Managed by @mailwoman/corpus., de-risked by test_anchor_channel.py. DeepSeek signed off the direction twice (2026-06-06 and again today). Its call cell: international anchor-ON localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. must clear 55% (a 10-point lift) to call dual-injection a win; if it still trails by more than 10pp, the always-on anchor design itself is the next thing to reconsider.