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

129 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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()` ≈ стр. 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` или возврат в Анализ не требуются.