Технические риски этапа разработки. Бизнес-риски — в BRD §5.
Шкала: вероятность / влияние ∈ {низк., сред., выс.}.
R-1 — Фриз UI при атомарном парсинге файла 50 МБ
Вероятность: сред. · Влияние: низк.
DOMParser.parseFromString нельзя разбить на чанки; для предельного
файла 50 МБ он блокирует основной поток на ~1–2 с (ADR-003).
Митигация: реалистичные GPX существенно меньше; 50 МБ — потолок
валидации, а не норма; чанковая конвертация DOM→GeoJSON снимает
доминирующую часть стоимости; CSS-индикатор анимируется композитором.
Статус: принят. Остаточный риск задокументирован в ADR-003.
R-2 — Рендеринг трека 500K точек на слабом GPU/мобильном
Вероятность: сред. · Влияние: сред.
BRD §3 явно запрещает упрощение (simplify) точек. Значит штатного
рычага снижения нагрузки на рендер нет.
Митигация: MapLibre оптимизирует GeoJSON line layers; единственная
доступная мера — принятие риска бизнесом (simplify вне scope).
Если на тестировании обнаружатся фризы pan/zoom — это повод для
отдельной задачи, а не для ET-006.
Статус: принят бизнесом (ограничение BRD).
R-3 — Исчерпание памяти при накоплении больших файлов
Вероятность: низк. · Влияние: сред.
TRZ REQ-F-07 не ограничивает число одновременных треков. Несколько
файлов по 50 МБ + транзиентные DOM-пики могут исчерпать память вкладки
на устройстве с 4 ГБ RAM.
Митигация: обнулять ссылку на DOM-документ сразу после конвертации
(освобождение ~150–300 МБ); не держать исходную строку файла после
парсинга. Реалистичный сценарий накопления десятков предельных файлов
маловероятен.
Статус: принят с рекомендацией по управлению памятью разработке.
R-4 — Дублирование обработчиков событий карты после setStyle()
Вероятность: выс. · Влияние: сред.
REQ-F-13: при смене стиля GPX-слои пересоздаются в rebuildGpxOverlays().
Обработчики map.on('click', layerId, fn) / mouseenter / mouseleave
при повторной регистрации накапливаются — клик по треку начнёт
срабатывать многократно, утечка слушателей.
Митигация (для разработки): перед повторной регистрацией снимать
старые обработчики (map.off(...)с сохранёнными ссылками на функции)
либо регистрировать делегированный обработчик один раз по префиксу ID
слоя, а не по конкретному ID. Покрыть тестом I-07.
Статус: требует внимания на разработке.
R-5 — Варианты namespace в GPX-файлах
Вероятность: сред. · Влияние: низк.
При запросе элементов через getElementsByTagNameNS файл без xmlns
вернёт пусто; при запросе без namespace — наоборот, возможны коллизии.
TRZ требует работать с GPX и с namespace, и без (тест U-08).
Митигация: использовать namespace-агностичный обход — сопоставление
по localName элементов, а не по полному имени с namespace.
Статус: требует внимания на разработке.
R-6 — Невалидные координаты ломают fitBounds
Вероятность: низк. · Влияние: низк.
Точки (0,0), NaN или координаты вне диапазона раздувают bbox и портят
автоцентрирование (REQ-F-06).
Митигация: валидировать lat ∈ [-90,90], lon ∈ [-180,180],
числовой тип; отбрасывать невалидные точки до построения bbox.
Статус: требует внимания на разработке.
R-7 — Z-order GPX-слоёв относительно маршрута OSRM
Вероятность: сред. · Влияние: низк.
REQ-F-04 / REQ-F-13 / AC-10: GPX-линии должны быть ниже активного
маршрута OSRM, но выше базовых слоёв — и сохранять этот порядок после
setStyle(). Маршрут (route-line-*) и GPX рисуются в разных функциях;
порядок их вызова в rebuildMapOverlays() определяет итоговый z-order.
Митигация: добавлять GPX line layer с явным beforeId — перед
слоями маршрута, если они есть; иначе поверх базовых. Не полагаться на
порядок вызовов в rebuildMapOverlays(). Покрыть тестом I-06.
Статус: требует внимания на разработке.
R-8 — Связность gpx.js ↔ app.js через глобали
Вероятность: низк. · Влияние: низк.
gpx.js зависит от глобалей app.js (window._map, openSheet,
closeSheet, showToast); app.js вызывает rebuildGpxOverlays().
Митигация: контракт интеграции зафиксирован в ADR-002; вызов из
app.js защищён typeof; gpx.js подключается после app.js.
Статус: принят (контракт узкий и задокументирован).
R-9 — Отсутствует переиспользуемый showToast
Вероятность: низк. · Влияние: низк.
Сейчас есть только частный showRulerToast() / #ruler-toast.
ET-006 требует несколько разных сообщений об ошибках.
Митигация: обобщить toast до showToast(message) (ADR-002).
Статус: принят (мелкий шаред-утиль на этапе разработки).