---
name: cehoproxy_country_detection
description: "CehoProxy: как определяется страна ноды и почему нераспознанная страна НЕ повод выбрасывать ноду из пула"
metadata: 
  node_type: memory
  type: project
  originSessionId: cf75944b-cc91-4988-aab6-28363391917a
  modified: 2026-08-07T15:44:06.184Z
---

Разбор 07.08.2026 в [[cehoproxy_overview]]. Владелец сказал «страны некорректно парсятся» — прогон 64 настоящих подписей нод через старый `CountryResolver` дал **8 верных из 64**.

**Что было сломано.**
- Таблица из 20 стран подстрокой, без границ слова и без сортировки: `("uk","GB")` превращал **Ukraine → Великобритания**, туда же уезжали `Fukuoka` и `Bukarest`; `Niger` перебивал `Nigeria`.
- Кода страны отдельным словом (`DE-01`, `[NL] node2`, `US | Dallas`) распознавания не было вовсе.
- **Главное:** `IsMeta` возвращал `true`, если страна не распозналась, а `LoadAllNodesAsync` фильтрует `!IsMeta` — то есть **нода с непонятной подписью молча выбрасывалась из пула**. Подписка, где провайдер не ставит флаги, теряла ВСЕ ноды и выглядела как «пустая». Именно это, а не сеть, стоит проверять первым, когда «подписка ничего не отдаёт».

**Как сделано.** Порядок: флаг-эмодзи → название → код отдельным словом. Русские названия — таблицей в коде (ICU их не отдаёт: `RegionInfo.DisplayName` возвращает НЕ язык интерфейса, а родное название страны — проверено, `new RegionInfo("DE").DisplayName` = «Deutschland» при любой CurrentUICulture). Английские и родные имена берутся у платформы для всех 253 регионов. Иглы сортируются **от длинной к короткой** и сверяются только **с начала слова** — без этих двух правил двухбуквенные совпадения ловятся внутри чужих слов. Код-токен: две заглавные, отделённые не-буквой, стоп-лист `TV/ID/HD/SD/PM/AM` и отказ, если перед токеном число («100 GB» — объём, а не Великобритания).

**Нераспознанная страна теперь = группа `CountryResolver.Unknown` («??»)**, ноды остаются в пуле, видны отдельной строкой в `chp countries` и в панели, и их можно выключить галочкой как любую страну. Служебной записью считается только настоящий агрегат («Автовыбор», «url-test»); «Ключ для роутера» — обычная рабочая нода, в подписке владельца это 2 ноды из 14.

**Как проверять:** `tests/.../CountryResolverTests.cs` — каждый случай оттуда ловился живьём. Быстрая ручная проверка — добавить подписку через `chp` и посмотреть разбивку по странам, её печатает сам мастер.
