The resolver is not where the 911 comes from. It is clean on all 6,265 rows.
I re-pulled both files and split every assistant turn into the resource bullet block and the free prose around it, then checked each half separately.
The block half verifies your description exactly:
rows whose bullet block names a number that is not their locale's: 0 / 6265
block coverage: 6265 / 6265
unknown block: findahelpline + "call your local emergency services" 1704 / 1704
So the regional table and the marker resolution do what you said they do, including the UNKNOWN mapping. Nothing failed to resolve.
The leak is entirely in the prose. Every one of those rows carries the correct unknown block at the same time as the stray number. The row tells the user "call your local emergency services" in the block and "call 911" a few lines above it.
That moves the trace upstream of the publication processor. The processor only ever sees a marker, and there is no marker here.
Correction to my own number, and it goes against me. I said the invariant fails on exactly 191 rows. Re-running it on ec787edf it fails on 194. The three I missed are not in unknown. They are in Canada and Australia, and they are a different failure from the one we have been discussing.
prose names a number absent from its own block
locale=unknown 191 (185 of them 911)
locale=canada 1
locale=australia 2
All three are lunas1-mh-synth-v2, all three risk_level: high.
hfmh-2bf9faa3b820191c9028 canada
prose "please call emergency services (311 in many Canadian cities)"
block "call or text 9-8-8" / "call 9-1-1"
hfmh-60075bbb6e9eb12ed61d australia
hfmh-94c1ec3aaa9c27b76ce3 australia
prose "call a local health line (e.g., 13 13 382)"
block "call Lifeline on 13 11 14" / "call 000"
311 is the municipal non-emergency line. The row routes a high-risk user to it using the words "emergency services", while its own block two lines below correctly says 9-1-1.
13 13 382 is seven digits. Australian short numbers are 13 xx xx at six or 1300 xxx xxx at ten, so it matches neither format, and the row presents it as a health line to a user who has just described taking extra medication.
This matters for the trace because it is a class my earlier framing ruled out. I told you cross-locale errors were 0 of 4,561 and that is still true, both numbers are locally shaped. But "prose agrees with the block" is 4,558 of 4,561, not 4,561. In a known locale the generator usually reproduces the correct number from the block. Three times it invented one instead.
On the v2 explanation, I do not think the risk shift accounts for it, and the cleanest way to see that needs no modelling at all. The mix did move, hard:
locale=unknown, composition imminent ambiguous high
lunas1-mh-synth-v1 1012 rows 609 361 42
lunas1-mh-synth-v2 692 rows 298 0 394
But the 911 rate moved inside the strata, not just between them:
locale=unknown, prose names 911 v1 v2
imminent 38 / 609 6.2% 98 / 298 32.9%
ambiguous 0 / 361 0.0% none
high 6 / 42 14.3% 43 / 394 10.9%
The entire rise is imminent, 6.2% to 32.9%, a 5.3x move within a single stratum. high did not rise, it fell slightly. ambiguous is 0 in v1 and v2 has none of it. So a risk reweighting cannot produce this: there is no mix over those three rates that turns 4.3% into 20.4% without the within-imminent jump doing the work.
I will flag that this cuts against my own earlier framing too. I gave you a single standardized number last night. It leaned on assigning v2 an ambiguous rate it has no rows for, so it was a floor rather than an estimate. The per-stratum table above is the version that does not need that assumption.
The control says what actually changed. v2 makes the generator name a concrete number in prose more often everywhere, including the locales where it is correct:
known locale, prose names any number v1 1030 / 2987 34.5%
v2 835 / 1574 53.0%
In a known locale that is nearly invisible, because the prose number almost always matches the block. Under unknown there is no correct number for that pressure to land on, so it lands on 911. Same generator change, three places it can show, and the two known-locale rows above are the rare case where it reached for a number the block never gave it.
One more thing that survived every way I counted it. Of the 185 unknown rows naming 911, the number of them that name a country anywhere in the assistant turn is 28. Not 28 within 120 characters and more if you widen: 28 at ±120, 28 at ±200, 28 across the whole turn. Widening never finds another one. A looser "or the equivalent in your country" hedge picks up a few dozen more depending on where you draw it, so I would not put weight on that split, but the country-word count is stable and it is 28 of 185.
By contrast, the 6 unknown rows that name some other number (000, 999, 112, 988) say which country they mean in 4 of 6. n=6, so that is a hint and not a result, but it points the same way: 911 is the one number the generator treats as not needing a country.
If it is useful, the invariant is one predicate and it is already almost true: prose numbers must be a subset of block numbers. It passes on 6,071 rows and fails on 194, so it drops in as a regression test with a known expected count, and it catches the Canada and Australia rows for free rather than needing a second rule.
Does the v2 prompt ask for a concrete number, or did it just get more directive in general?