Files
enduro-trails/docs/work-items/ET-005/10-tech-risks.md
claude-bot bafbea2dab
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 5s
CI / build (push) Successful in 1s
architect(ET-005): ADR, infra-requirements, data-requirements, tech-risks
2026-05-21 22:18:08 +03:00

9.0 KiB
Raw Blame History

type, work_item_id, title, version, status, created_at, authors
type work_item_id title version status created_at authors
tech-risks ET-005 Технические риски — ET-005: Переключение единиц измерения (км/мили) 1 approved 2026-05-21
agent:architect

Технические риски — ET-005

Шкала: вероятность (Н/С/В) × влияние (Н/С/В).

R1 — Пропуск одного из мест форматирования расстояний

  • Описание: форматирование (m/1000).toFixed(N)+' км' захардкожено минимум в 13 местах src/web/app.js. Если хотя бы одно не переведено на Units.formatDistance(), после переключения на мили это расстояние останется в км — нарушение AC-2 («все расстояния»).
  • Известные call-sites (ориентир для разработки и review): formatDist() ≈ стр. 187189; карточка сегмента ≈ 638; карточки маршрута ≈ 1157, 1191, 2202/2212, 2357/2370, 2605; scale-bar ≈ 14161440; всплывающая подсказка ≈ 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, стр. 14161440) уже содержит независимую логику 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:130180). Это входные параметры, а не отображаемые расстояния.
  • Вероятность / Влияние: Н / С.
  • Митигация: scope ET-005 — только отображаемые расстояния. GPX-данные и data-km-параметры из перевода единиц исключены; зафиксировать в review-чеклисте.

R7 — Порядок подключения скриптов

  • Описание: units.js подключается как классический скрипт; app.js обращается к window.Units на старте. Если units.js подключён после app.js, инициализация упадёт с Units is not defined.
  • Вероятность / Влияние: Н / В.
  • Митигация: <script src="units.js"> строго перед <script src="app.js"> в index.html; контрольная точка review; smoke-проверка загрузки страницы.

R8 — Мобильное размещение переключателя

  • Описание: НФТ ТЗ и AC-4 требуют доступности кнопки на всех размерах экрана и неперекрытия других элементов. Попап #terrain-popup пополняется ещё одним рядом — на узких экранах (375px, TP-05) возможен выход за пределы/перекрытие.
  • Вероятность / Влияние: Н / С.
  • Митигация: переиспользовать готовый .seg-control (адаптивен по ширине); проверить попап на 375px; e2e TP-05.

Сводка

ID Риск Вер. Влияние Класс
R1 Пропуск call-site форматирования С В Высокий
R2 Нет политики для суб-км значений В С Высокий
R3 Scale-bar — отдельная логика единиц С С Средний
R4 Несогласованный десятичный разделитель В Н Средний
R5 Конфликт точности AC-2 vs карточки С Н Низкий
R6 GPX / параметры не конвертировать Н С Низкий
R7 Порядок подключения скриптов Н В Средний
R8 Мобильное размещение переключателя Н С Низкий

Блокирующих рисков нет. R1 и R2 требуют явного внимания на разработке и ревью. Эскалация arch:major-change или возврат в Анализ не требуются.