666,000 addresses and not one country
A month ago I wrote up the night I taught the geocoder Canada and it put Toronto in Ohio — 843,000 perfect postcodes that never got a vote, because the layer I'd built wasn't the layer that shipped. This is the sequel, and it rhymes. Last night I taught the parser three new countries. Two of them worked. The third one tripped a guard I trusted, and when I pulled the thread, the addresses turned out to be teaching the model something I never wrote into them.
The easy part
The parser reads a raw string — 2835 Woodhaven Rd, Shirley, V9Z1G6 — and labels every piece: house number, street, city, postcode. It's a neural sequence model, and the way you teach it a new country is the way you teach a child a new kind of sentence: show it a few hundred thousand real ones. We had a fresh source for that — Overture's open addresses theme, millions of rows per country, permissively licensed, no key required. Canada came back with sixteen million addresses. Mexico, thirty million. Brazil, ninety.
Canada and Mexico went in clean. Mexico is the real win: the model's grasp of Mexican cities went from mediocre to good — it now reads Calle Zeverino León 749, 28809 Manzanillo and puts Manzanillo where it belongs instead of guessing. Canada it already half-knew, because Canadian addresses look American; adding it cost nothing and confirmed nothing, which is its own kind of fine. Two countries, one training run, the whole battery green. I lined up Brazil to make it three.
The guard that said no
Every model change runs a gate before it's allowed anywhere near production. Most of it is the obvious stuff — did the new thing work — but the load-bearing half is the opposite question: did anything I wasn't looking at get worse. We hold a frozen set of graded addresses and we demand that no category of them regress by more than two points. It's a boring gate. It is also the entire reason we can move fast without shipping quiet damage.
Brazil built clean. Brazil trained clean. And then the gate came back with one red line. Country recall — the model's ability to pull the country out of an address that names one — had dropped more than five points. Everything else held: cities, streets, postcodes, house numbers, all flat. Just country, and just enough to fail.
The tell was in the comparison. The run with only Canada and Mexico had nicked country by about a point and a half — under the bar, easy to wave off as noise. Adding Brazil didn't introduce a new problem. It made the existing one bigger. Two data points make a line, and the line pointed somewhere specific: the more of these addresses I added, the less the model believed in countries.
What the addresses forgot to say
So I went and looked at the addresses themselves — not the model, the training rows. And there it was, sitting in plain sight, obvious the way these things always are once you stop assuming: not one of the 666,000 new Canadian, Mexican, and Brazilian rows contained a country.
They're not wrong to. An Overture address is street, city, postcode — the country is implied by the file it came from, the way a letter mailed within a country doesn't write the country on the envelope. Every row is honest. But a model doesn't learn from any single row; it learns from the pile. And the pile I'd just handed it was two-thirds of a million addresses, every one of them fluently, consistently silent about which country it was in. Train on that, weighted as heavily as I'd weighted it, and the lesson the model extracts is not "here are three new countries." The lesson is: addresses don't say their country. So when the graded set hands it 1600 Pennsylvania Ave NW, Washington, DC, USA — an address that plainly does — the model has been gently taught to look past the USA and drop it on the floor.
I'd checked that the new rows carried the tags I wanted: street, city, postcode, all present, all correct. I never checked the tag that wasn't there. The absence was the payload.
The fix is old, and we already own it
The repair turns out to be a thing we built a year ago for exactly this and then didn't carry forward. Our older locale recipe — the one behind the European countries — doesn't only render addresses in their native shape. For a slice of them it renders an international form, the kind you'd write on a parcel crossing a border: 12 Rue de Rivoli, Paris, France. Country included, on purpose. That slice is why adding France never taught the model to forget France. The new Overture pipeline, in its youth and efficiency, skipped it — it took the addresses exactly as given, silences and all.
So Brazil isn't a wall; it's a reminder to put the border back on some of the parcels. Render a fraction of the new rows with the country spelled out, and the pile stops teaching absence. Canada and Mexico ship as they are — that run passed. Brazil waits for the next build, which is a smaller thing than it sounded like at 4 a.m.
The lesson, in a sentence
June's version of this was grade the coordinate the user sees, not the layer you happened to build. This one is its sibling: your training data teaches its silences, too. Every field you consistently leave out is a field you are quietly teaching the model to leave out. Coverage isn't only what you put in the corpus. It's the shape of what you left absent, repeated a million times until the model mistakes it for a rule.
The cheap, boring, two-point gate caught it before a single user did. That's twice now, same discipline, different disguise. I'll take boring.
