docs(ET-001): business request, BRD, TRZ, acceptance criteria, test plan
All checks were successful
CI / lint (push) Successful in 5s
CI / test (push) Successful in 5s
CI / build (push) Successful in 3s

This commit is contained in:
2026-05-15 21:56:57 +03:00
parent f1439ab652
commit b35fa30a49
5 changed files with 254 additions and 0 deletions

View File

@@ -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 — оставить (проезжие)

View File

@@ -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 уже настроен |

View File

@@ -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)

View File

@@ -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) работают без изменений

View File

@@ -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 не пустая"