Arbitration layer (#478 inc 3) — the two-leg gate, and why arbitration is not promoted
2026-06-17. Per-component rule-vs-neural arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. in the assembled runPipeline (default-OFF,
behind arbitrate). The arc, in three acts: (1) the flatten+rebuild v1 passed the arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins.
labelcomponent 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.-match (v0-only 56.4→27.1%) but FAILED the coordinate gate catastrophically — localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. −26pp,
coord p50 3.3→1069 km, 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 precondition 100→48%; (2) diagnosis pinned it to 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. of
containment; (3) the containment-preserving fix-v1 (edits on the nested neural tree, no flatten)
eliminated the regression — the coordinate arm now matches neural — but the arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins. collapsed to a
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. wash (+21/−21, v0-only unchanged at 56.9%). The +122 "win" was entirely labelcomponent 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.-conformance to v0's
decomposition, the very thing that wrecked the geocode; removing the harm removed the apparent gain.
Verdict: arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. is not promoted — fix-v1 makes it SAFE but provides no 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. benefit, while adding
the full v0-parser cost to every 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 stays default-OFF. The #566 lesson, twice over: grade 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. output, and a labelcomponent 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.-match "win" toward the other parser is not a quality win.
What ran
scripts/harness-v0-neural.ts --tests mailwoman/test --admin-fst <en-us> --postcode-repair --assembled --arbitrate — the 376-assertion arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins., the bundled 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.', graded three ways: v0 (rules), raw
neural, and the assembled runPipeline. ArbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. unions the whole-text 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. with the solved
v0 rule 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. (as proposals), filters per-component by the input-shape routerinput-shape routerAn arbitration prior that reads kind-classifier, query-shape, and coarse-placer signals to set per-component defaults (rule_preferred, neural_preferred, or abstain) according to how clean or out-of-distribution the query is. prior, resolves 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.
overlaps (the coherencecoherenceThe property of a parse whose resolved places form a consistent geographic hierarchy — the resolved locality really does sit inside the resolved region. pass), and rebuilds the tree.
Result — arbitration nearly halves the v0-only gap
| graded arm | assembled/parser pass | v0-only vs ASSEMBLED (gate target → ~0) |
|---|---|---|
| v0 (rules) | 100.0% | — |
| raw neural | 43.1% | 56.9% |
| assembled, no arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. (inc 1 baseline) | 43.6% | 56.4% |
| assembled + arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. | 72.9% | 27.1% |
Against raw neural the arbitrated 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. is +122 / −10: it captures 122 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. neural alone drops (the v0 wins, kept "by construction" — the router routes clean structured input to the rule source and the registry keeps it) and loses 10 (cases where neural was right and arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. preferred the rule 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.). The run is clean across all 376 assertions, no errors.
Reading
- The thesis holds. Per-component arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. closes the arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins.'s
v0-onlycolumn the way #478 predicted — 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. keeps whichever source is right per component, so it stops scoring below v0 on the components v0 wins.v0-only vs ASSEMBLEDmoves 56.4% → 27.1% with arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. on. - It is not yet ~0. The residual 102 cases are where, after the router's mode choice + the
coherencecoherenceThe property of a parse whose resolved places form a consistent geographic hierarchy — the resolved locality really does sit inside the resolved region. pass, neither surviving source matched v0. That is the router/config tuning frontier (which
tags route to which source per shape) — deferred, and exactly what the per-tag
from-configoverlay exists to A/B without code edits. - The −10 is the watch item. Ten cases the arbitrated 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. loses vs raw neural are the precondition-style risk: a rule 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. winning a component where neural was correct. The coordinate leg below is what confirms these don't translate into 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.+house_number precondition or coordinate regression — the gate that the original #427 re-promotion skipped.
Leg 2 — the coordinate gate (FAILS)
scripts/eval/oa-resolver-eval.ts --assembled routes each row through createRuntimePipeline (same
neural classifierneural 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.' with postcodeRepair, placeCountry OFF for comparability, same 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.) — without
(assembled) and with (assembled + arb) arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding.. 300 OpenAddressesOpenAddresses (OA). A global open aggregation of address points collected from many official sources. A primary source of component-supervised training data outside proprietary registries. US rows, admin-centroid 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.:
| arm | localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.-match | regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.-match | coord p50 km | coord p90 km | 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 precondition |
|---|---|---|---|---|---|
| neural | 83.0% | 99.7% | 3.3 | 12.5 | 100.0% |
| assembled (no arb) | 83.0% | 99.7% | 3.3 | 12.5 | 100.0% |
| assembled + arb | 57.0% | 100.0% | 1069.4 | 3182.5 | 48.0% |
The assembled (no arb) arm reproduces neural to the decimal — the instrument is sound, so the
regression is fully attributable to arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. (the only delta is arbitrate: true). ArbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding.:
- drops localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.-match 83.0% → 57.0% (−26pp) — it produces 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. values that resolve to the wrong place (a namesake citylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. in another stateregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.), which is what blows the coord p50 from 3.3 km to 1069 km;
- loses 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 precondition on half the rows (100% → 48%) — the #566 failure mode directly: components that anchor 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.-level geocode are dropped in the union → arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. → coherencecoherenceThe property of a parse whose resolved places form a consistent geographic hierarchy — the resolved locality really does sit inside the resolved region. → flat-rebuild path.
This is invisible to leg 1 because the arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins. scores loose top-1 labelcomponent 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.-match (does 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. name the same components as v0), not the resolved coordinate. ArbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. makes the 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. look more v0-like (+122) while wrecking the geocode — the exact gap the #566 reconcile-retirement warned the gate must close.
Gate status — NOT PROMOTED
- Leg 1 (arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins. labelcomponent 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.-match): clears.
v0-only vs ASSEMBLED56.4 → 27.1%, +122/−10 vs raw neural. - Leg 2 (precondition + coordinate): FAILS decisively. localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. −26pp, coord p50 3.3 → 1069 km, precondition 100% → 48%.
Both legs must clear to promote; leg 2 fails, so arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. stays default-OFF. The machinery and both gate instruments are merged; no default changes. The methodology did its job — it caught a catastrophic coordinate regression that the labelcomponent 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.-match arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins. scored as a +122 win.
Diagnosis — one root cause: loss of containment
scripts/eval/probe-arbitration.ts traces the arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. stagesstageOne 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). on real US addresses. The aggregate
over 60 clean rows is decisive — both failure modes are the same root cause: the flat
proposal/tree representation has no containment.
- Precondition (streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. dropped 42%, all by overlap eviction). Neural emits
street+ a separatestreet_suffix/street_prefix(e.g.street[4,12]"Seminary"+street_suffix[13,15]"Dr"); the solved v0 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. emits the combinedstreet[4,15]"Seminary Dr". Underrule_preferredboth survive arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. (v0 has nostreet_suffix), then the coherencecoherenceThe property of a parse whose resolved places form a consistent geographic hierarchy — the resolved locality really does sit inside the resolved region. pass — which only knows intervals, not that a suffix is part of 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. — seesstreet_suffix(conf 0.94) overlappingstreet(conf 0.82) and evicts 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., leaving a dangling suffix and 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.. Measured: 25/60 rows drop streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels., 25/25 by this overlap eviction. (When v0's streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. outranks the neural suffix, it survives — the ~50/50.) - Coordinate (localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. resolves to a wrong-stateregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. namesake). The probe shows 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.
values are byte-identical to neural (0/60 changed) — yet they resolve to the wrong place. The
only difference is the tree: the nested neural argmax tree vs the flat
proposalsToTree. The 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. loses the regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality.→localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. containment constraint and resolves the same"Mill Valley"string globally to a wrong-stateregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. namesake. (DeepSeek's flagged flat-tree risk — the 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.-output no-op was never asserted, only tree shape.)
Fix plan (DeepSeek-coordinated) — edit the neural tree, don't rebuild flat
Apply arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. as edits on the nested neural argmax tree instead of flatten → arbitrate →
proposalsToTree. This preserves containment by construction, so the coherencecoherenceThe property of a parse whose resolved places form a consistent geographic hierarchy — the resolved locality really does sit inside the resolved region. pass becomes
unnecessary and the 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. keeps its structure. The v1 edit algorithm:
neural_preferred/abstainroutes → pass the neural tree unchanged.rule_preferred→ override a neural node's value only when a same-tag rule proposal overlaps it with a different value; add rule-only missing tags as nodes; never restructure (no dropping neural's sub-component decomposition, no flattening).
This makes clean-address arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. a no-op (killing both regressions), captures the high-value wins (value disagreements + tags neural missed entirely), and accepts losing the low-value pure-decomposition wins. Then re-run the coordinate gate (leg 2) before any promotion.
Fix-v1 re-gate — regression gone, but no net benefit
Fix-v1 (applyRuleArbitration — edits on the nested neural tree; only rule_preferred mutates it,
relabel same-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. tag disagreements + add rule-only non-overlapping missing tags, never restructure).
Coordinate leg (300 OA US rows) — regression ELIMINATED:
| arm | localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy.-match | coord p50 km | coord p90 km | 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 precondition |
|---|---|---|---|---|
| neural | 83.0% | 3.3 | 12.5 | 100.0% |
| flatten+rebuild v1 (prior) | 57.0% | 1069.4 | 3182.5 | 48.0% |
| fix-v1 (edit-in-place) | 83.0% | 3.3 | 12.5 | 99.7% |
Fix-v1's assembled + arb matches neural to the decimal — the catastrophe is gone, containment holds.
ArenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins. leg — collapses to a 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. wash:
| arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins. metric | flatten+rebuild v1 | fix-v1 |
|---|---|---|
| assembled pass | 72.9% | 43.1% (= raw neural) |
v0-only vs ASSEMBLED | 27.1% | 56.9% (= raw neural) |
| assembled vs raw-neural | +122 / −10 | +21 / −21 |
The +122 was almost entirely the harmful decomposition-replacement (taking v0's coarser 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. to match
its 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.) — the same edits the coordinate gate proved wreck resolution. The safe fix-v1 (no
restructure) netsneural 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. nothing on the arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins.: +21 helpful relabelscomponent 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./adds offset by 21 harmful ones, the
v0-only gap unmoved.
Final verdict — NOT PROMOTED (no net benefit)
Fix-v1 is the correct, containment-preserving arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. and removes the catastrophic regression — but it provides no 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. benefit: a no-op on the coordinate product metric, a +21/−21 wash on the arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins., while every arbitrated 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. pays the cost of a full v0 rule-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.. There is nothing here worth the latency. ArbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. ships SAFE and default-OFF; it is not promoted.
The durable findings: (1) the v0-only arenaarenaA standardized test set probing one capability: libpostal (clean canonical), perturb (noisy and degraded), postal (edge formats). Each arena answers a different question about where rule vs neural wins. column conflates "neural is wrong" with "neural is
differently right" — arbitrating toward v0 captures both, and the second kind is harmful; (2) for 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.' this strong on the addresses we serve, rule-vs-neural arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. toward v0 is not a quality
lever. The machinery + the safe fix-v1 are banked behind the flag, with the gate instruments, should a
weaker 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.', a new localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for., or a per-tag config (where the data shows arbitrationarbitrationA pipeline stage that compares rule-based (v0) and neural classifier output, resolving disagreements via a policy registry. Built and merged but not promoted — the coordinate gate showed label-F1 gains came at the cost of worse geocoding. netsneural 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 on a
specific tag) make it worth revisiting.