--- type: tech-risks work_item_id: ET-005 title: "Технические риски — ET-005: Переключение единиц измерения (км/мили)" version: 1 status: approved created_at: 2026-05-21 authors: - "agent:architect" --- # Технические риски — ET-005 Шкала: вероятность (Н/С/В) × влияние (Н/С/В). ## R1 — Пропуск одного из мест форматирования расстояний - **Описание:** форматирование `(m/1000).toFixed(N)+' км'` захардкожено минимум в **13 местах** `src/web/app.js`. Если хотя бы одно не переведено на `Units.formatDistance()`, после переключения на мили это расстояние останется в км — нарушение AC-2 («все расстояния»). - **Известные call-sites** (ориентир для разработки и review): `formatDist()` ≈ стр. 187–189; карточка сегмента ≈ 638; карточки маршрута ≈ 1157, 1191, 2202/2212, 2357/2370, 2605; scale-bar ≈ 1416–1440; всплывающая подсказка ≈ 1478; линейка/ruler ≈ 1837, 1875, 1885, 1931. Список ориентировочный — нумерация строк может сдвинуться; обязателен повторный grep-аудит. - **Вероятность / Влияние:** С / В. - **Митигация:** централизация в `units.js` (ADR-0001); grep-аудит по `' км'` / `/ 1000` / `toFixed` на этапе разработки; e2e TP-02 должен проверять **каждую** видимую поверхность с расстоянием, а не одну. ## R2 — Отсутствие политики для суб-километровых расстояний - **Описание:** часть мест отображает расстояния < 1 км в метрах («м» — напр. линейка, стр. 1837/1885). Имперский эквивалент в AC не определён (футы? мили с долями?). Без явной политики возможен показ «м» в режиме «mi». - **Вероятность / Влияние:** В / С. - **Митигация:** зафиксировать политику в реализации `units.js`. Рекомендация архитектуры: в режиме `mi` суб-километровые значения показывать в милях с увеличенной точностью (напр. 2 знака), **футы не вводить** — это упрощает форматтер и достаточно для эндуро-сценария. Финальное решение — за разработкой/ревью, но политика должна быть единой и явной. ## R3 — Scale-bar имеет собственную логику единиц - **Описание:** масштабная линейка карты (`szb`, стр. 1416–1440) уже содержит независимую логику `km`/`m` с «красивым» округлением. Это отдельный код-путь, который легко не заметить при рефакторинге. - **Вероятность / Влияние:** С / С. - **Митигация:** явно включить scale-bar в список перевода на `Units` и в оркестратор `onUnitChange()`; добавить scale-bar в проверки e2e TP-02. ## R4 — Несогласованный разделитель дробной части - **Описание:** в `app.js` есть расхождение — `formatDist()` (стр. 189) использует точку (`12.3 км`), карточка сегмента (стр. 638) — `.replace('.', ',')` (`12,3 км`). При централизации форматтер должен выбрать один вариант, иначе UI станет визуально неоднородным. - **Вероятность / Влияние:** В / Н. - **Митигация:** `units.js` задаёт единый разделитель для всех поверхностей. Так как у задачи нет требования на локаль, рекомендуется оставить запятую (текущий пользовательский язык интерфейса — русский), но решение должно быть единым и явным. ## R5 — Конфликт точности: AC-2 vs существующие карточки - **Описание:** AC-2 требует «округление до 1 знака», но карточки маршрутов сейчас используют `toFixed(0)` (целые км, стр. 2202, 2357). Слепое применение «1 знака» изменит вид карточек; слепое сохранение `toFixed(0)` нарушит букву AC-2. - **Вероятность / Влияние:** С / Н. - **Митигация:** `formatDistance(meters, {precision})` параметризует точность; по умолчанию — 1 знак (AC-2), карточки явно запрашивают свою точность. Трактовка: AC-2 задаёт точность пересчёта/дефолта, а не запрещает целочисленный показ в карточках. ## R6 — Экспорт GPX и параметрические значения не должны конвертироваться - **Описание:** есть риск «заодно» сконвертировать величины, которые обязаны остаться метрическими: экспорт GPX (стандарт GPX — метры) и кнопки-параметры построения маршрута (`data-km` радиусы разведки/ scenic: «20 км», «50», «100», `index.html:130–180`). Это **входные параметры**, а не отображаемые расстояния. - **Вероятность / Влияние:** Н / С. - **Митигация:** scope ET-005 — **только отображаемые** расстояния. GPX-данные и `data-km`-параметры из перевода единиц **исключены**; зафиксировать в review-чеклисте. ## R7 — Порядок подключения скриптов - **Описание:** `units.js` подключается как классический скрипт; `app.js` обращается к `window.Units` на старте. Если `units.js` подключён после `app.js`, инициализация упадёт с `Units is not defined`. - **Вероятность / Влияние:** Н / В. - **Митигация:** `