2026-07-15 — The v7 parity-floor blocker: what it is
TL;DR. The v7 rules-excision arc is blocked on the neural 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.' clearing the pre-registered swap floors on the rescued parity 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. (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.90, house_number ≥0.97). The just-shipped v264 (6.3.0) sits at 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.543, hn 0.767, 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. 0.986 — the same place v257 sat one 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.-channel and 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.-headattention headOne of several parallel attention computations in a layer, each free to focus on a different kind of relationship between tokens. Their outputs are concatenated — 'multi-head attention'. Mailwoman uses 4 heads. ago. This note is the diagnosis behind that number: what the failures are, why more of the v250→v257 shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. campaign is unlikely to move it, and the strategic fork that follows.
Measurement
Package-shaped grade (eval parity --weights-cache, the #718-safe path), v264 = 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.':
| floor | v264 | v257 (8k gentle) | floor bar | verdict |
|---|---|---|---|---|
| streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. (family) | 0.543 | 0.536 | 0.90 | FAIL |
| house_number | 0.767 | 0.767 | 0.97 | FAIL |
| 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. | 0.986 | 0.986 | 0.97 | PASS |
v264 is a hair better than v257 on 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.543 vs 0.536) and identical on hn/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., so the v261 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.-boundary headattention headOne of several parallel attention computations in a layer, each free to focus on a different kind of relationship between tokens. Their outputs are concatenated — 'multi-head attention'. Mailwoman uses 4 heads. and the v263/v264 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. channel did not erode fragment 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 plateau is old: v255 peaked at 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.596 @ 2k but was unstable (the bare-localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.↔US-admin treadmill, #1102), and v257's gentle 8k traded that peak for a stable 0.536. Nothing since has moved it.
What the failures are (85-row sample, --failing 50 over the three floors)
| class | share | context-invariant? | example |
|---|---|---|---|
| empty (tag not emitted) | 40% | — | Epleskogen 39A → hn ""; 9600 Interstate 35 → hn "" |
| boundary-digit (#727) | 20% | yes | Korunní 810 → hn 10 (the 8 leaked into streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.) |
| boundary-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. (#727 + prefix-drop) | 19% | yes | Rue Saint Anne → streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. Anne; Korunní → Korunní 8 |
| accent-mangle | 15% | partly | Rua Raul Leite Magalhães → …Magalh es |
| unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. | 4% | — | U12/345 → U12/345 (gold hn 345) |
Two structural findings under this:
1. The 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. covers the diacriticsdiacriticAn accent mark that modifies a letter (é, ñ, ç). Address normalization must fold diacritics for matching without discarding the information a user typed. but over-fragments the words. Probing the SP v0.9.0
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.: á ã ó ß Å are all single covered 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). (only RO ț byte-falls-back). But diacriticdiacriticAn accent mark that modifies a letter (é, ñ, ç). Address normalization must fold diacritics for matching without discarding the information a user typed.
words shatter — Kájovská → ▁K á j ovská, Magalhães → ▁Mag al h ã es. The heavy sub-word
fragmentation, not byte-fallback, is what corrupts 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. surface when 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.' tags some 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).
and drops others. This is a 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. granularity gap for CZ/PT/PL/RO (the FR/Nordic splices didn't
reach them), not a 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. gap.
2. Context fixes the 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. class but NOT the boundary class. Re-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 failing bare forms with full address context:
| input (bare → +context) | bare result | +context result |
|---|---|---|
Epleskogen 39A → …, Oslo, Norway | localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.+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. (wrong) | streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.+hn 39A ✓ |
9600 Interstate 35 TX → …, Austin, TX | 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. 9600 (wrong) | hn 9600 ✓ |
aleja Wojska Polskiego 178 → …, Warszawa | 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. 178 (wrong) | hn 178 ✓ |
Korunní 810 → …, Praha, Czechia | Korunní 8 / 10 | Korunní 8 / 10 (still wrong) |
Genter Straße 16a → …, Munich | …16 / a | …16 / a (still wrong) |
The "empty/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." class (40%) is a bare-fragment distribution effect: with full context 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.' 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. it correctly, and the rules parser was purpose-built for the bare-autocomplete distribution. The "boundary" class (39%) is #727. It persists with full context because it is a decode-segmentation error at 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.↔house_number boundary, not a missing-context error.
Why "more shard" is unlikely to break the plateau
The v257 recipe already carries targeted 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. shardsshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. at the campaign's highest source
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. (12.0): synth-no-street-led, synth-cz-pcfirst-preposition, synth-fr-bare-street,
synth-si-bare-village, plus synth-fragment at 6.0. Heavy targeted data on the exact localeslocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for. that
still fail, and it plateaued at 0.54. The bare-fragment mis-segmentation and the #727 boundary class
both survived a seven-run campaign (v250→v257) that ended on a documented capacity/stability treadmill
(#1102). 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.90 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.-tag parity is probably not reachable at 29M on this fragment-heavy
distribution.
Contextful vs bare: the gap holds in both subsets
Splitting the 321 live fixtures by whether the gold carries admin context (localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy./regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality./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.):
| subset | n | streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. | house_number | 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. |
|---|---|---|---|---|
| contextful | 192 | 0.514 | 0.778 | 0.971 |
| bare | 129 | 0.580 | 0.754 | 1.000 |
StreetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. fails ~0.5 on both; the contextful subset is not meaningfully better. The gap is a pervasive streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-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. quality problem (boundary-absorption, FR/Romance streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.-type-prefix drop, accent, citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.-absorption) that holds whether or not the input carries admin context. It would not vanish on production traffic.
Coordinate parity — measured
The swap gates use 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.-tag byte parity (fold(actual) === fold(gold)), a proxy inherited from
plan 2. The drop-in surfaces serve a geocode, so the question that matters for the swap is whether
the neural 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. resolves to the same place as the rules 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.. Measured over the 321 live fixtures,
each resolved through the same 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. 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. with both the rules tree and the v264 tree
(scratchpad/coord-parity.mjs):
| subset | both resolved | within 1 km | within 25 km | median Δ | p90 Δ |
|---|---|---|---|---|---|
| all both-resolved | 164 | 76.8% | 78.7% | 0.0 km | 384 km |
| neural streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. tags PASS | 74 | 98.6% | ~100% | 0.0 km | 0.0 km |
| neural streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. tags FAIL | 45 | 53.3% | 60.0% | 0.0 km | 1631 km |
(135 of the 321 resolve under neither parser — 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. fragments with no admin anchor to geocode to, so they cannot move the swap either way.)
The signal is two-sided:
- When the neural streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. 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 correct, the geocode is coordinate-safe: 98.6% within 1 km of
the rules geocode, median 0 km. The 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.-tag failures that are benign boundary/assembly differences
(
Königsallee Düsseldorftagged as 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. 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.) resolve to the same place. - When the neural 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. fails, a tail diverges hard: 40% 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.-failing subset move >25 km,
often to a garbage geocode —
1210a IA 10 W IA→ American Samoa (10,053 km),California→ Maryland,Texas 76013→ Michigan, bare6000, NSW, Australia→ the AU 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. centroid. These are the bare-fragment / US-highway / bare-stateregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.-name classes.
A pure coordinate re-gate does not hold: it ships that tail. The tail lands on input classes the pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-gate → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package. can already detect, which is what the recommended path below exploits.
Caveats: this measures neural-vs-rules divergencedivergenceA training failure where loss descends through warmup, plateaus low for a while, then climbs catastrophically back to its starting magnitude — the model unlearns everything despite no obvious component failure., not accuracy against 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. (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. has no gold coords, and the rules parser is sometimes the wrong one); and 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. is deliberately fragment/edge-case-heavy, so the >25 km tail is smaller on real drop-in traffic than the 21% here.
Recommended path: neural-primary with a bounded fallback
The garbage-geocode tail concentrates on classes the runtime pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-gate → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package. already separates. Three components bound it, in priority order:
- Route on kind. The pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-gate → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package. classifies input kind at 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.5 (
@mailwoman/kind-classifier:structured_address/postcode_only/intersection/ …). Gate the swap sostructured_addressuses the neural parser (coordinate-safe per the table above) and the bare-fragment kinds keep the rules/structural fallback until 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.' clears them. - Plausibility guard on the resolution. Fall back when the neural resolution is implausible for
the input's 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. signal — 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.-centroid hit, or a cross-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. jump like
California→ Maryland. A cheap post-resolve check, no 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.' change. - Ship v7 on this hybrid gate, not the 0.90 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.-tag floor. The swap is neural-primary; the fallback shrinks as 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.' improves and is deleted when it stops firing.
Measured (scratchpad/coord-parity.mjs, extended with the kind-classifier + both guards). The
18-fixture garbage tail breaks down: the kind-router catches 11 (non-structured kinds → rules
fallback), and of the 7 that classify as structured_address, the plausibility guard catches 4
(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.-centroid hit or out-of-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. coord). Together they bound the tail from 18 to 3 of 321
live fixtures (0.9%), at a cost of zero false-positive fallbacks — none of the 81 coordinate-safe
structured fixtures trip either guard. The surviving 3 are structured, in-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., wrong-localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.
neural resolutions, and their archetype is the #727 boundary class (Korunní 810, Praha → wrong
Czech citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.). So the hybrid gate ships paired with #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, which erases that residual, not as
a permanent substitute for 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.' work.
This unblocks v7 without 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.' campaign that re-plateaus and without shipping the tail a pure coordinate re-gate would. #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 (FSemi-CRFCRF (Conditional Random Field). A statistical modeling method that predicts structured outputs by modeling dependencies between adjacent labels. Mailwoman uses a linear-chain CRF as the Viterbi decoder at inference time to enforce BIO label consistency — a B-street must be followed by I-street or O, never I-locality. 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. headattention headOne of several parallel attention computations in a layer, each free to focus on a different kind of relationship between tokens. Their outputs are concatenated — 'multi-head attention'. Mailwoman uses 4 heads.) stays 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.' lever for the ~39% boundary class and shrinks the fallback further. A 29M shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. campaign is not recommended as the lead: the plateau evidence says it re-plateaus.
Reproduction
node mailwoman/out/cli.js eval parity --weights-cache scratchpad/v264-cache [--failing 50]- context probe / 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. probe / contextful-split scripts:
scratchpad/{ctx-probe2,tok-probe,parity-split}.mjs - coordinate parity + kind-router + guards:
scratchpad/coord-parity.mjs(resolve each fixture through both parsers, compare coords, cross-tab the tail against the kind-classifier + plausibility guards) - v257 recipe:
corpus-python/src/mailwoman_train/configs/v2.5.7-fragment-v5-gentle-full.yaml
The guard measurement's tail (n=18) is small, so the 11/7 and 4/3 splits are noisy; and it grades neural-vs-rules divergencedivergenceA training failure where loss descends through warmup, plateaus low for a while, then climbs catastrophically back to its starting magnitude — the model unlearns everything despite no obvious component failure., not ground-truth accuracy. Treat the 0.9% residual as an order-of-magnitude result — the tail is bounded to low single digits, not that it is exactly three.