T1b — the gazetteer feedback loop: real ingredients, no measured effect
Question (pre-registered, 2026-07-16 review 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. 1b): famous streetsstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. sit in 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. as places, so the
gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. channel injects the localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. vote on Rue Montmartre, 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.' takes it, 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.
reinforces it — a learned feedback loop, the PeliasPeliasAn open-source geocoder, Mailwoman's spiritual predecessor. trap in soft form. Is it live?
Verdict: the ingredients are real; the effect is nil. The hypothesis is FALSIFIED as a cause of the target class. 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 localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. reading is its own.
| Probe | scratchpad/t1b-gazetteer-feedback.mjs |
| 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.' | v264 (v6.3.0, shipped), ship config |
| 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. | fst-global-priority.bin — 2,084,640 statesregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality., 4,144,846 places |
| Fixture | mailwoman/eval-harness/fixtures/paris-streets.jsonl (n=63) |
1. The ingredients are unambiguously present
Walking the shipped 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. over the 63 fixtures returns 43 distinct surfaces, 37 of which would fire an
emission biasadditive biasA logit adjustment added before softmax from a prior or external knowledge source, typically soft-capped so it influences but never overrides the model's prediction. The mechanism behind shallow fusion. (PLACETYPE_TO_BIO covers 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./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./postalcode; impBias = importance * biasScale * maxBias).
| surface | placetypeplacetypeThe Who's On First hierarchical classification of places: planet → continent → country → region → county → locality → neighbourhood. The resolver uses placetype to rank candidates — an exact locality match outranks a county-level match. : importance | note |
|---|---|---|
rue | localadmin 0.145, neighbourhood 0.149 | the designatordesignatorThe closed-vocabulary leading word of a secondary-address phrase — 'Apt', 'Suite', 'Floor', 'PO Box', 'Level' — paired with an identifier to form a complete subpremise. is a place |
boulevard | neighbourhood 0.167 | so is this one |
place | neighbourhood 0.169 | and this one |
la | localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 0.850 | a particle, inside 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. |
du | regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. 0.650 | likewise |
de | county 0.192 | likewise |
londres | regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. 0.937, localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 0.936 | exonym, near-max importance |
paris | regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. 0.789 | |
temple | localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 0.468 | |
saintgermain | localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 0.386 | |
rome | localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 0.378 | the Rue de Rome archetype |
hugo | localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. 0.295 | Avenue Victor Hugo |
12, 2, 14, 21, … | localadmin 0.05–0.15 | bare house numbershouse numberThe numeric or alphanumeric identifier of a building on a street. Mailwoman's house_number component; its position relative to the street name flips between locales. |
Three findings worth naming:
- StreetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels. furniture is in the gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture..
rue,boulevard,placeall carry live importance. The operator flagged this from 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. months ago; this is the confirmation. - The French particles are the strongest hits on the board.
laat 0.850 localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy. andduat 0.650 regionregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. sit inside exactly the phrases the arc targets —Rue de la Paix,Rue du 11-Novembre-1918. If any surface were going to drag 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. reading toward localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy., it is these. - Bare house numbershouse numberThe numeric or alphanumeric identifier of a building on a street. Mailwoman's house_number component; its position relative to the street name flips between locales. match places.
12→ localadmin 0.065,2→ 0.148. The gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. will happily bias a house numberhouse numberThe numeric or alphanumeric identifier of a building on a street. Mailwoman's house_number component; its position relative to the street name flips between locales. toward an admin tag.
Only 3 surfaces were inert at importance 0 (avenue, budapest, paix) — so the
meaning-of-zero inertia is not what
is protecting us here. The prior is live and it fires.
2. The effect is nil
| class | prior OFF | prior ON | |
|---|---|---|---|
| bare-fragment/elision | 3/6 | 3/6 | |
| bare-fragment/esoteric | 7/10 | 7/10 | |
| bare-fragment/famous | 3/15 | 2/15 | −1 |
| bare-fragment/homonym | 4/12 | 4/12 | |
| contextful/homonym | 6/6 | 6/6 | |
| contextful/multi-class | 9/10 | 10/10 | +1 |
| date-name | 1/4 | 1/4 | |
| TOTAL | 33/63 | 33/63 | +0 |
Exactly two fixtures changed, in opposite directions:
BROKE [bare-fragment/famous] "Boulevard Haussmann"
off="Boulevard Haussmann" on="Haussmann"
FIXED [contextful/multi-class] "12 Rue du Chat-qui-Pêche, Paris"
off="Rue du Chat-qui-Pêche, Paris" on="Rue du Chat-qui-Pêche"
The one break is on-thesis (the boulevard neighbourhood entry eats the prefix); the one fix is the
prior doing its actual job (Paris is a localitylocalityThe city / town / settlement component of an address: a populated place sitting between region and neighbourhood in the hierarchy., so stop calling it streetstreetThe named linear feature along which house numbers are ordered. Decomposes into a name plus street affixes; one of the Tier 2 fine labels.). 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. zero on n=63 is
consistent with noise in both directions, not with a systematic drag.
3. What this closes and what it opens
Closes: the feedback loop is not the cause of the bare-fragment failures. Every Paris and parity
number in the arc was measured with this prior OFF (see below), and turning it ON does not rescue the
class. Rue Montmartre → locality is 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 own prior, learned from 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. where 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 are rare and bare localities are not.
This is a positive result for the plan, not a null one. It removes the last inferenceinferenceRunning the trained model on new input to get predictions, as opposed to training, which produces the model. In Mailwoman that means a small transformer encoder reads an address string and classifies every token — house number, street, locality, region, postcode, and the rest. A Who's On First gazetteer can feed soft location hints into the pass, but the model makes the final call on every label. Where a generative model writes text token by token, Mailwoman's output is a retrieval-augmented token classification: one label per input piece.-time explanation standing between the evidence and the 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.-distribution hypothesis. T2 (the BANBAN (Base Adresse Nationale). France's authoritative open national address register — the highest-quality training source for French addresses, with full component structure. 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. shardshardA partial output file of the corpus build, written in Parquet format. The training pipeline streams shards row by row.) was already ranked highest-EV by all three reviewers; it is now the only live explanation with a lever attached.
Opens — the harness does not run production's configuration. Found while setting this up:
core/pipeline/runtime-pipeline.ts:426— production's joint branch callsparseWithLogits(normalized, { queryShape, fst: stages.fst }). Production runs 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. prior and the queryShape prior.oracle-k.ts,parity-corpus.ts, and the arc's scratchpad probes callparse(input, { postcodeRepair, enforceWordConsistency })— neither prior.parity-corpus.tscan wire 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.-morphology prior, but only behind--street-morphology, which defaults to false and is labeled "Probe 0".
So the standing parity floors and the whole 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. arc grade a configuration production does not run. On this fixture 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. half of that gap measures +0, which bounds the concern for Paris — but it is unmeasured for parity and every other localelocaleThe combination of language and country an address comes from. en-US and fr-FR are the locales Mailwoman ships weights for.. Tracked as its own item; the fix is a measurement, not a guess.
Note the shape of the miss: this is the #718 channel-starvation class one 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. up. PhasephaseA milestone in the implementation plan (Foundation, Corpus, Training, Integration, and forward-looking phases). Distinct from stage (runtime pipeline) and tier (model vocabulary). 1's +7.9pp
headline was corrected for channel starvation in the Python harness; the "channels fed" JS harness
that replaced it is itself missing two priors production has. A registered baseline
(baselines.json) cannot catch this — a baseline registered against the starvedstarvedA tag with too little training representation to learn — near-zero F1 — because the corpus adapter never emits examples of it (intersection tags sat at 0% until an intersection synthesizer existed). config is
self-consistent. The registry pins reproducibility, not validity.
4. Also worth a look later
applyBias collects allPieceIndices across every word group and applies the winning per-tag bias to
all of them — the bias is global to the input, not positional. That may be why 37 firing surfaces
move two fixtures. Not chased here; noted because it bears on whether 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. prior is doing anything
useful at all, which is a different question from whether it is doing harm.
Reproduce: node scratchpad/t1b-gazetteer-feedback.mjs (needs fst-global-priority.bin under
$MAILWOMAN_DATA_ROOT/wof/; the artifact is dated 2026-05-28 — the staleness #1142 flagged).