2026-07-17 — v6.5.0 (v381): the comma-free rooftop fix (#1101) + digit ownership, the first Gauntlet-clean model
v6.5.0 ships v3.8.1-punct-fix-full (v381): a fine-tune off v310 (the shipped 6.4.0) with two folded
changes, both one variable at a time on top of the prior recipe — the no-fragment digit-ownership shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row.
and the augment_punct_drop_prob delimiter-free augmentation (#1101). 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. (v0.9.0-multisplice,
73,143), every lexicon, the FSTFST (finite-state transducer). A compact automaton that reads an input sequence and emits an output sequence. Mailwoman encodes gazetteer names and street affixes as FSTs for fast prefix matching and prior injection without search overhead., and the architecture are unchanged. It is the first 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.' to pass the
full Gauntlet clean: shipped 6.4.0 fails it.
What the Gauntlet caught
On the way to shipping the digit-ownership 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 pre-ship Gauntlet's metamorphic layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. flagged a
comma-drop invariant break that per-tag F1 and the parity boards never surface — it grades the
assembled coordinatecoord metricThe primary evaluation metric: distance from the resolved coordinate to the true address point. Measured at percentiles (p50, p90) and as 'within X meters.' Prevents the label-F1 trap where a model scores higher on token labels but geocodes worse., not labelscomponent tagOne of the 33 labels in Mailwoman's address schema — street, locality, region, postcode, house_number, unit, po_box, country, venue, intersection, and others. Each parsed span carries exactly one component tag.:
INV[comma-drop] "1600 Pennsylvania Ave NW, Washington DC"
→ "1600 Pennsylvania Ave NW Washington DC"
tier address_point→admin, coord 38.8977,-77.0365 → 38.9048,-77.0163
Dropping the comma moved the result ~2 km — from 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. to the DC admin centroid. 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.' absorbed
Washington 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="Pennsylvania Ave NW Washington", no localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.), so the
address-point lookup missed and the result fell back a 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.. This is pre-existing — shipped 6.4.0
fails it byte-identically; v310 and the digit-ownership 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.' 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. it the same way. Whitespace-only
(comma-free) input is 64% of the parity gold, so this is a common shape, not an edge case.
The fix
The fix was already built and tested but never enabled in the shipped recipe: augment_punct_drop_prob
(corpus-python/src/mailwoman_train/augment.py, 8 unitunitA subdivision of a building — apartment, suite, floor — that refines a street address. Mailwoman's unit component; a designator plus identifier forms a subpremise. tests) emits an extra comma-stripped copy of each
row with the entity spansspanA 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. re-targeted, so 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.' learns to segmentsegmentA punctuation-bounded chunk of the normalized input — the comma-separated parts of 'Portland, OR' — used to give downstream stages structural context. streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. from localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. without leaning
on the comma. Enabling it at 0.3 closes the case:
"1600 Pennsylvania Ave NW Washington DC" (no comma)
6.4.0: street="Pennsylvania Ave NW Washington" (locality absorbed)
6.5.0: street="Pennsylvania Ave NW" locality="Washington" (identical to the comma form)
The Gauntlet's INV[comma-drop] goes 8/10 → 9/10 held, and the White House holds on merit (graded against
the original xfail list). Regression, metamorphic, and held-out all pass: VERDICT: PASS — clear to ship.
Digit ownership
The second change is the synth-no-fragment shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row. at its all-length long-number boost — 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
that teaches 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./number boundary, so a bare Nordtømmesvegen 178 reads house_number 178 rather
than a 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.. On the Norwegian digit board, bare-street-hn moves 0.693 → 0.733 (+4pp), the bare-pc
negative guard holds at 1.000, and the contextful classes hold. The gain is a clean netneural networkA model made of layers of simple numeric units whose connection strengths (weights) are learned from data. The transformer encoder at Mailwoman's core is a neural network.-positive, not a
trade — 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.-level alternative (a number-piece vocabvocabularyThe fixed set of tokens a tokenizer can produce. Mailwoman's SentencePiece vocabulary is tens of thousands of subword pieces, with byte fallback for anything outside it. splice) cleared more on-board but failed the
golden gate on five tags, so it was not shipped.
The gates
- Golden gate (
v6.0.0-shipped-baseline, package-shaped--weights-cache, int8 candidate vs int8 shipped): PASS. Zero tags regress more than 2 pp below shipped; the only >2 pp mover isus.country_homograph_f1+2.3.fr.house_numberand 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. tags hold. - Gauntlet: PASS — the first green run. 6.4.0 fails the same metamorphic comma-drop invariant.
Known open
The French comma-free case (181 Rue du Chevaleret Paris) is not fixed and stays a tracked #1101
xfail. It is not French-specific and not a 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. gap: it is the no-anchor bare-terminal-localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.
case — a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. that is the last 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 trailing stateregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. or 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. to anchor it. A trailing stateregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.
(Washington DC) or a 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 localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. (75013 Paris) anchors the segmentation and resolves
correctly; a bare terminal toponymtoponymA proper name for a geographic place. is genuinely ambiguous against 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. continuation, and the punct-drop
augmentation does not disambiguate it. Closing it needs a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. name-index
(#30) or a targeted no-anchor augmentation,
tracked separately. It is low-frequency — nearly all real geocodinggeocodingThe process of converting an address into geographic coordinates (latitude and longitude). Mailwoman geocodes in a multi-tier cascade: exact address-point match → street interpolation → locality centroid. Each tier is progressively coarser but more widely available. traffic carries a 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. or regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality..