From b35fa30a491b3352b6a99585f0159c2111f19a86 Mon Sep 17 00:00:00 2001 From: claude-bot Date: Fri, 15 May 2026 21:56:57 +0300 Subject: [PATCH] docs(ET-001): business request, BRD, TRZ, acceptance criteria, test plan --- docs/work-items/ET-001/00-business-request.md | 19 +++ docs/work-items/ET-001/01-brd.md | 38 ++++++ docs/work-items/ET-001/02-trz.md | 123 ++++++++++++++++++ .../ET-001/03-acceptance-criteria.md | 33 +++++ docs/work-items/ET-001/04-test-plan.yaml | 41 ++++++ 5 files changed, 254 insertions(+) create mode 100644 docs/work-items/ET-001/00-business-request.md create mode 100644 docs/work-items/ET-001/01-brd.md create mode 100644 docs/work-items/ET-001/02-trz.md create mode 100644 docs/work-items/ET-001/03-acceptance-criteria.md create mode 100644 docs/work-items/ET-001/04-test-plan.yaml diff --git a/docs/work-items/ET-001/00-business-request.md b/docs/work-items/ET-001/00-business-request.md new file mode 100644 index 0000000..d02216c --- /dev/null +++ b/docs/work-items/ET-001/00-business-request.md @@ -0,0 +1,19 @@ +--- +type: business-request +work_item_id: ET-001 +title: "Исключить шлагбаумы и тротуары из OSRM графа" +status: approved +created_at: 2026-05-15 +author: "human:slava" +--- + +# Бизнес-запрос: Исключить шлагбаумы и тротуары из роутинга + +## Проблема +1. Маршрут может пройти через шлагбаум — эндурист приезжает и путь заблокирован +2. В городе маршрут может пойти по тротуару — незаконно и опасно + +## Ожидание +- Маршрут никогда не идёт через шлагбаумы (gate, bollard, lift_gate, chain, block, cycle_barrier, motorcycle_barrier, border_control) +- Маршрут никогда не идёт по тротуарам (footway, pedestrian, steps, corridor) +- cattle_grid и ford — оставить (проезжие) diff --git a/docs/work-items/ET-001/01-brd.md b/docs/work-items/ET-001/01-brd.md new file mode 100644 index 0000000..54ba751 --- /dev/null +++ b/docs/work-items/ET-001/01-brd.md @@ -0,0 +1,38 @@ +--- +type: brd +work_item_id: ET-001 +title: "BRD: Исключить шлагбаумы и тротуары из OSRM" +version: 1 +status: approved +created_at: 2026-05-15 +authors: + - "agent:stream" +--- + +# BRD — ET-001: Исключить шлагбаумы и тротуары из OSRM + +## 1. Цель + +Сделать роутинг безопасным: маршрут не проходит через физические препятствия (шлагбаумы) и запрещённые для мотоциклов дороги (тротуары, пешеходные зоны). + +## 2. Scope + +### F-07: Исключить шлагбаумы +- Ноды с `barrier=gate|bollard|lift_gate|chain|cycle_barrier|motorcycle_barrier|border_control|block` → `mode.inaccessible` в OSRM +- `cattle_grid` и `ford` — оставить (проезжие) + +### F-08: Исключить тротуары +- Ways с `highway=footway|pedestrian|steps|corridor` → исключить из графа (return в process_way) + +## 3. Метрики успеха +- Маршрут через точку с шлагбаумом → OSRM обходит или возвращает "не найден" +- Маршрут в городе → не проходит по тротуарам +- Время пересборки графа ≤ 60 мин +- Существующие маршруты без шлагбаумов/тротуаров — не ломаются + +## 4. Риски +| Риск | Митигация | +|------|-----------| +| Пересборка графа ~40 мин (сервис недоступен) | Пересобирать ночью или в low-traffic | +| Слишком много заблокированных нод → маршруты не строятся | cattle_grid и ford оставлены; тестировать на реальных маршрутах | +| OSRM RAM при пересборке | Swap 6 GB уже настроен | diff --git a/docs/work-items/ET-001/02-trz.md b/docs/work-items/ET-001/02-trz.md new file mode 100644 index 0000000..f80717f --- /dev/null +++ b/docs/work-items/ET-001/02-trz.md @@ -0,0 +1,123 @@ +--- +type: trz +work_item_id: ET-001 +title: "ТЗ: Исключить шлагбаумы и тротуары из OSRM" +version: 1 +status: approved +created_at: 2026-05-15 +authors: + - "agent:stream" +--- + +# Техническое задание — ET-001 + +## 1. Что менять + +### Файл: OSRM профиль `enduro.lua` + +Расположение на сервере: `/home/slin/enduro-trails/osrm/enduro.lua` +В репо: `infra/osrm/enduro.lua` (скопировать текущий + внести изменения) + +#### Изменение 1: process_node — блокировка шлагбаумов + +В функции `process_node` заменить текущую обработку barriers: + +```lua +-- Блокируемые типы препятствий (полный запрет проезда) +local blocked_barriers = { + gate = true, + bollard = true, + lift_gate = true, + chain = true, + cycle_barrier = true, + motorcycle_barrier = true, + border_control = true, + block = true, +} + +function process_node(profile, node, result) + local barrier = node:get_value_by_key("barrier") + if barrier and blocked_barriers[barrier] then + result.barrier = true + result.forward_mode = mode.inaccessible + result.backward_mode = mode.inaccessible + return + end +end +``` + +#### Изменение 2: process_way — исключение тротуаров + +В начале функции `process_way`, после получения highway, добавить: + +```lua +-- Исключаемые типы дорог (тротуары, пешеходные зоны) +local excluded_highways = { + footway = true, + pedestrian = true, + steps = true, + corridor = true, +} + +-- В process_way, после local highway = way:get_value_by_key("highway"): +if excluded_highways[highway] then return end +``` + +Также удалить `footway`, `pedestrian`, `steps` из таблицы `highway_rate` (если есть). + +## 2. Пересборка графа + +После изменения lua-профиля — пересобрать граф: + +```bash +cd /home/slin/enduro-trails/osrm +docker run --rm -v $(pwd):/data ghcr.io/project-osrm/osrm-backend:latest osrm-extract -p /data/enduro.lua /data/enduro.osm.pbf +docker run --rm -v $(pwd):/data ghcr.io/project-osrm/osrm-backend:latest osrm-partition /data/enduro.osrm +docker run --rm -v $(pwd):/data ghcr.io/project-osrm/osrm-backend:latest osrm-customize /data/enduro.osrm +docker restart osrm-osrm-routed-1 +``` + +Время: ~40 мин (extract) + ~5 мин (partition + customize). + +## 3. Что добавить в репо + +1. `infra/osrm/enduro.lua` — обновлённый профиль +2. `scripts/rebuild-osrm.sh` — скрипт пересборки графа +3. `tests/integration/test_routing_barriers.py` — тесты + +## 4. Тесты + +### Unit/Integration тесты (pytest + httpx) + +```python +# tests/integration/test_routing_barriers.py + +import pytest +from httpx import AsyncClient, ASGITransport +from src.api.main import app + +OSRM_URL = "http://172.22.0.1:5559" + +@pytest.mark.asyncio +async def test_route_avoids_barrier(): + """Маршрут через точку с известным шлагбаумом должен обходить его""" + # Точка с шлагбаумом: 55.7558, 37.6173 (пример) + # Тест проверяет что маршрут не проходит через эту ноду + pass # Architect определит конкретные координаты + +@pytest.mark.asyncio +async def test_route_no_footway(): + """Маршрут в городе не должен проходить по тротуарам""" + pass # Architect определит конкретные координаты + +@pytest.mark.asyncio +async def test_route_allows_cattle_grid(): + """Маршрут через cattle_grid должен работать (не заблокирован)""" + pass +``` + +## 5. Ограничения +- НЕ менять веса существующих дорог (только добавить блокировку) +- НЕ трогать scenic/link/recon логику +- cattle_grid и ford — НЕ блокировать +- Пересборка графа — отдельный ручной шаг (не в CI) diff --git a/docs/work-items/ET-001/03-acceptance-criteria.md b/docs/work-items/ET-001/03-acceptance-criteria.md new file mode 100644 index 0000000..ed3cb1e --- /dev/null +++ b/docs/work-items/ET-001/03-acceptance-criteria.md @@ -0,0 +1,33 @@ +--- +type: acceptance-criteria +work_item_id: ET-001 +version: 1 +status: approved +--- + +# Acceptance Criteria — ET-001 + +## AC-1: Шлагбаумы заблокированы в профиле +- [ ] В `enduro.lua` функция `process_node` блокирует ноды с barrier=gate|bollard|lift_gate|chain|cycle_barrier|motorcycle_barrier|border_control|block +- [ ] Блокировка через `mode.inaccessible` (не penalty) +- [ ] `cattle_grid` и `ford` НЕ заблокированы + +## AC-2: Тротуары исключены из графа +- [ ] В `enduro.lua` функция `process_way` пропускает highway=footway|pedestrian|steps|corridor +- [ ] Эти типы удалены из `highway_rate` (если были) + +## AC-3: Скрипт пересборки +- [ ] `scripts/rebuild-osrm.sh` — рабочий скрипт для пересборки графа +- [ ] Скрипт содержит extract + partition + customize + restart + +## AC-4: Тесты +- [ ] Минимум 3 integration теста в `tests/integration/test_routing_barriers.py` +- [ ] Тесты проходят (pytest green) + +## AC-5: Lint +- [ ] `ruff check src/` — 0 ошибок +- [ ] Lua-файл синтаксически корректен + +## AC-6: Обратная совместимость +- [ ] Существующие маршруты (без шлагбаумов/тротуаров) строятся как раньше +- [ ] API `/api/route` и `/api/route` (POST) работают без изменений diff --git a/docs/work-items/ET-001/04-test-plan.yaml b/docs/work-items/ET-001/04-test-plan.yaml new file mode 100644 index 0000000..cf89bb9 --- /dev/null +++ b/docs/work-items/ET-001/04-test-plan.yaml @@ -0,0 +1,41 @@ +work_item_id: ET-001 +version: 1 +tests: + - id: TC-001 + type: integration + title: "Маршрут обходит шлагбаум" + precondition: "OSRM граф пересобран с новым профилем" + steps: + - "POST /api/route с точками, между которыми есть шлагбаум" + - "Проверить что маршрут не проходит через ноду шлагбаума" + expected: "Маршрут обходит шлагбаум или возвращает 404" + + - id: TC-002 + type: integration + title: "Маршрут не идёт по тротуару" + precondition: "OSRM граф пересобран" + steps: + - "POST /api/route с точками в городе" + - "Проверить что геометрия маршрута не содержит footway-сегментов" + expected: "Маршрут идёт только по проезжим дорогам" + + - id: TC-003 + type: integration + title: "cattle_grid не блокирует маршрут" + steps: + - "POST /api/route через точку с cattle_grid" + expected: "Маршрут проходит через cattle_grid нормально" + + - id: TC-004 + type: unit + title: "Lua профиль — синтаксис" + steps: + - "luac -p infra/osrm/enduro.lua" + expected: "Exit code 0, нет ошибок" + + - id: TC-005 + type: regression + title: "Существующий маршрут не сломан" + steps: + - "POST /api/route с точками без шлагбаумов/тротуаров" + expected: "Маршрут строится, distance > 0, geometry не пустая"