v0.9.2 both-order retrain — the anchor and the word order fight over German
Date: 2026-06-06 · Run: v0.9.2-de-bothorder (A100, 20k, from-scratch, single variable vs the v0.9.1
anchor-on pilot) · Question: the German "collapse" was largely an evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error.-order artifact — 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.' trained
native German order, our OA evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error. renders US/international order. Does 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. the German shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. in both
orders close the international-order gap?
The honest answer: partly, and not where it counts yet — and the 2×2 says something more interesting than a single number would have.
The 2×2 (DE locality-match, 3,000 real OpenAddresses points, through the resolver)
The one variable vs the pilot is the German shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row.'s rendering (native-only → ~60/40 native/international,
--intl-fraction 0.4). Everything else is held: anchor on, self-conditioningself-conditioningAn auxiliary model head that predicts the input's locale (language/country) and then FiLM-modulates the encoder so parsing adapts to the detected locale. Structural facts like word order still need explicit training on both orders. on, seed 42.
| DE localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. | anchor OFF | anchor ON | pilot anchor OFF | pilot anchor ON | |
|---|---|---|---|---|---|
| native | 48.2% | 82.1% | 48.4% | 83.8% | |
| international (US-order) | 48.4% | 44.5% | 35.9% | 45.5% |
Two real movements, and they pull in opposite directions:
- Both-order 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. improved 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 intrinsic international 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.. Anchor-off, international order went 35.9% → 48.4% (+12.5pp). 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.' learned something about the US/feed layout it had never seen — without the anchor, it now reads both orders at ~48%, where before it could only read the native one.
- But with the anchor fed — the production config — international is unchanged (45.5% → 44.5%), because the anchor now hurts on international order. Anchor-off international (48.4%) beats anchor-on (44.5%). The anchor still helps native enormously (+34pp), so it's the anchor that creates the whole native/international asymmetry: without it 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 order-agnostic at ~48%; with it, native rockets to 82% and international slips to 44%.
The harm concentrates exactly where you'd predict — Berlin, the colliding 10xxx 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.. Berlin
international goes 40.5% (anchor off) → 34.4% (anchor on): the ambiguous {DE, US} posterior, injected 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., drags the already-read citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. toward the US reading. In native order the 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. sits
before the citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. and primes it correctly; in international order it trails, and the anchor fires too late, on
the wrong side of the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy..
The residual gap has a clear, cheap cause
Why is international still ~48% when native is 82%? 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.' mangles a tail it was never trained on. Our evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error.
renders real US-order German with the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. in the tail — 27 Straußstraße, Berlin, Berlin 12623, 1 Talstraße, Mülsen, Sachsen 08132 — but the international synth dropped the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. (…, Berlin, 12623).
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. the evalevalRunning the model against a held-out golden dataset and computing per-component F1, exact-match, calibration, and resolved-coordinate error.'s rows through v0.9.2 shows exactly that wound:
27 Straußstraße, Berlin, Berlin 12623 → street="straße, Berlin" (locality DROPPED into street)
1 Talstraße, Mülsen, Sachsen 08132 → locality="Mü" + "sen, Sachsen" (split + region absorbed)
14 Goetheallee, Dresden, Sachsen 01309 → locality="Dresden" + locality="Sachsen" (region mis-tagged)
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.' never saw a German City, Region Postcode tail, so it doesn't know how to segmentsegmentA punctuation-bounded chunk of the normalized input — the comma-separated parts of 'Portland, OR' — used to give downstream stages structural context. one — the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.
gets swallowed into the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. or the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. collapses. That is the v0.9.3 fix: render the international
order with the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. in the tail, matching real US/feed renderings.
No collapse, no regression
- Per-tag val F1 (anchor-aware, both-order val): localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 0.820, 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. 1.00, streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. 0.950,
house_number 0.998, regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. 0.703, macro 0.781. LocalitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. is intact — none of the v0.8.0/PR3 collapse
signature. 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. was clean (no NaNNaN (not a number). A floating-point result for an undefined operation (log of a negative, 0/0). Appearing in the training loss usually halts the run; recovering from it follows the NaN protocol.),
cross_pollution0.00% throughout,locale_acc0.965. - Functional check — all 6 demo presets 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. identically to the v0.6.0 default (the both-order German change does not touch US).
- No-regression — US 97.5% (pilot 96.1%), FR 84.9% (pilot 85.1%). Both held; the both-order German shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. didn't cost the incumbents a thing.
Verdict — not shipped; a research result that earns its next experiment
This is the multi-localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. research line, not the production default (v0.6.0 stays the shipped 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.'), so there's no promotion at stake — the gate's job was to tell us whether both-order 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. works. It does, intrinsically (+12.5pp anchor-off), but the production-anchor config is flat because the anchor and the word order now fight. v0.9.2 is not shipped. What it bought us is two precise, cheap next steps:
- Render the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. in the international tail (the synth currently drops it) — the direct fix for the
City, Region Postcodecollapse the diagnostic caught. - Make the anchor word-order-aware, or down-weightparameterA 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. it when the 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. trails the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. — it helps when the 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. leads (native) and hurts when it trails (international).
v0.9.3 follow-up: we rendered the region tail. The corpus wasn't the ceiling.
We took the first fix — render the City, Region Postcode tail the synth had been dropping — and retrained
(v0.9.3, single variable, DeepSeek-signed). The 2×2 came back almost identical to v0.9.2:
| v0.9.3 DE localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. | anchor OFF | anchor ON |
|---|---|---|
| native | 48.3 | 83.6 |
| international | 47.1 | 44.7 |
US 97.2 / FR 84.9 held; no collapse. The regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail did exactly what it was designed to — international
regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.-match went 0% → ~40% (Berlin 45.6, Sachsen 30.9), and Berlin's international localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. nudged
34.4 → 38.7 — but localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. stayed flat. 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.' now segmentssegmentA punctuation-bounded chunk of the normalized input — the comma-separated parts of 'Portland, OR' — used to give downstream stages structural context. the tail correctly; it just doesn't move
the number we care about, because the number we care about was never capped by the tail. The anchor-on
international gap is 83.6 − 44.7 = 38.9pp, four times the 10pp the pre-registered gate allowed.
So 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 — both-order rendering, then 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 exhausted for the anchor-on
international gap. Three independent lines now point at the same place: anchor-off is order-agnostic at ~48%,
forcing the posterior to DE=1.0 changed nothing, and rendering the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail changed nothing. The ceiling
is the anchor's structure — an additive vector injected at the 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. 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., which lands on the wrong side
of the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. when the 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. trails it.
Next is architectural, and it's the operator's call. The designed fix (v0.9.4) is dual-injection: inject the same anchor at the 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. 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 the first 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., an order-independent global signal the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. can attend back to. It's a 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.-code change, not 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.' surgery — 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 adds the anchor 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., so it's a matter of placing one at position 0. But three iterations in without a promotion, the honest question DeepSeek raised is whether a trained-in always-on anchor is the right design at all: it's a +35pp native win and a −4pp international lossloss functionA number measuring how wrong the model's predictions are on a batch of examples. Training minimizes it. Mailwoman's loss combines per-token negative log-likelihood with the CRF sequence loss., and an order-conditioned anchor is the alternative.
v0.9.4 dual-injection: the anchor's asymmetry doesn't yield to architecture either
We took the fork. DeepSeek's signed-off fix — pool the anchor and inject it also at position 0, an order-independent 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 where the 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. sits (it explicitly preferred this over fragile position-gating). It's a clean change: no new parametersparameterA 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., the c=0 identity holds, de-risked locally (8/8 anchor tests, 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. export equivalent to the baseline). And it did nothing to the international gap:
| DE localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. | anchor OFF | anchor ON |
|---|---|---|
| native | 48.3 | 83.5 |
| international | 47.3 | 43.7 |
US 96.4 / FR 84.9 held; native beats PeliasPeliasAn open-source geocoder, Mailwoman's spiritual predecessor.. The anchor still hurts international (off 47.3 > on 43.7) — the position-0 cue changed nothing. Three retrains now tell one story:
| retrain | native-on | international-on |
|---|---|---|
| v0.9.2 both-order 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. | 82.1 | 44.5 |
| v0.9.3 regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail | 83.6 | 44.7 |
| v0.9.4 dual-injection | 83.5 | 43.7 |
The anchor-on international number is immovable at ~44%. We threw 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. order 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., the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail, and an architectural change at it; none of them moved it. The anchor's native-help (+35pp) / international-hurt (−4pp) asymmetry is fundamental — not a 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. gap, not the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. tail, not where the anchor sits in the sequence. And it's a real geographic miss, not a metric mirage: PIP-containment is 96.3% on native German, 57% on international.
So 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. and the architecture are both exhausted, and the honest conclusion is the one DeepSeek raised at the very start: a trained-in, always-on anchor may simply be the wrong shape for order robustness. The next move is a strategic choice, not another tuning pass — an order-conditioned anchor, or accepting the asymmetry (native German is excellent and that's what production would ship), or a different international approach entirely. It's also cross-cutting: the same anchor would carry the same asymmetry into every localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for., so it gates the multi-localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. retrain program. v0.6.0 stays the production default throughout.
The decision: accept the asymmetry, and the anchor learns its direction per locale
With the operator away and the data in, we put the fork to DeepSeek, which held delegated authority for the
shift, across a third consult turn. Its call was (b): accept the asymmetry, and burn no more GPU. Three
independent retrains had failed to move the anchor-on international number; the native gain (+35pp) is large,
robust, and generalizes (US 96.4, FR 84.9 hold), while the international penalty (−4pp) is small and stable.
Anchor-off international already lands near 48% localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.-match, competitive with the non-neural baselines, so
a 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.' can serve international-order German through the c=0 identity path and lose nothing the anchor was
giving it. This is the research line; v0.6.0 ships unchanged regardless.
The turn earned its keep on the why, and it reframes the whole multi-localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. question. The anchor's directionality is learned from each localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for.'s dominant 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. order, not baked into the architecture. US addresses always train with the 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. trailing the citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy., so the US anchor learns to look left for the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. — which is exactly why it never hurt US. German's native order puts the 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. before the citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy., so the German anchor learns to look right; feeding it both orders asked a single additive vector to point two ways at once, and it settled on an average that serves the dominant native order and misfires on the trailing one. So the asymmetry is localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for.-specific learning showing through, and the multi-localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. plan is constrained rather than dead: give each localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. its own anchor direction. The highest-value next threadthreadA parallel workstream within a release. Threads compose; they are not sequential milestones like phases. is 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.-conditioned anchor vector — the DE anchor specializes on 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.-before-citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy., the US anchor on 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.-after-citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy., no shared vector forced to compromise. That is a future iteration with its own gate, not a one-run patch, so it waits.
One cheap operational lever falls out of (b) in the meantime, no GPU and no retrain: route an input to the
c=0 (anchor-off) path when a lightweight order check — the 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.'s position relative to the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. in
the raw string — says the layout is international, and keep the anchor on when the 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. leads. The
research-line 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.' would then read native German at 83.5% and international German at ~48%, taking the better
of the two columns on each address. Filed against #327 alongside 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.-conditioned-anchor threadthreadA parallel workstream within a release. Threads compose; they are not sequential milestones like phases..
Artifacts: 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. v0.4.2-de-bothorder + v0.4.3-de-regiontail; configs v0.9.2-de-bothorder.yaml +
v0.9.3-de-regiontail.yaml + v0.9.4-de-dualanchor.yaml; the 2×2 harness scripts/eval/de-order-eval.sh;
follow-up issue #327. Sibling: the order-artifact correction in 2026-06-06-anchor-pilot.md.