From a0284e046bdf9039ac2b5501d52de1e725aacfe8 Mon Sep 17 00:00:00 2001 From: claude-bot Date: Mon, 1 Jun 2026 12:17:33 +0000 Subject: [PATCH] reviewer(ET): auto-commit from reviewer run_id=41 --- docs/work-items/ET-008/12-review.md | 189 ++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 docs/work-items/ET-008/12-review.md diff --git a/docs/work-items/ET-008/12-review.md b/docs/work-items/ET-008/12-review.md new file mode 100644 index 0000000..477ba47 --- /dev/null +++ b/docs/work-items/ET-008/12-review.md @@ -0,0 +1,189 @@ +--- +type: code-review +work_item_id: ET-008 +title: "Review: GPS-треки с публичных платформ на карте" +version: 1 +status: REQUEST_CHANGES +created_at: 2026-06-01 +authors: + - "agent:reviewer" +reviewed_branch: feature/ET-008-gps +base_branch: main +verdict: REQUEST_CHANGES +findings_summary: + P0: 1 + P1: 0 + P2: 0 + P3: 0 +--- + +# Code Review — ET-008 + +## Verdict: **REQUEST_CHANGES** + +Причина: на ветке `feature/ET-008-gps` **нет ни одной строки кода**, +реализующего ТЗ. PR содержит только artefacts стадий Analyst и Architect +(BRD, ТЗ, AC, TestPlan, UI-кейсы, 7 ADR, infra/data/risks). Development +stage не произвёл выхода — review.review невозможно провести как код-ревью, +потому что нет кода. Отдельные оси (соответствие ТЗ / соответствие ADR / +качество кода / качество тестов) — все «не выполнено», т.к. артефактов +реализации не существует. + +## Что проверено + +Согласно регламенту reviewer'а: + +1. ✅ `docs/work-items/ET-008/02-trz.md` (v2, status: draft) — прочитан. +2. ✅ `docs/work-items/ET-008/03-acceptance-criteria.md` (v2, draft) — прочитан. +3. ✅ `docs/work-items/ET-008/06-adr/` — все 7 ADR (ADR-005…011) прочитаны. +4. ✅ `CLAUDE.md` — прочитан. +5. ✅ Git diff `main...feature/ET-008-gps` — проанализирован. + +## Состояние ветки + +`git diff main...feature/ET-008-gps --name-status` (19 файлов): + +| Статус | Файл | +|--------|------| +| M | `.task.md` | +| M | `docs/architecture/README.md` | +| M | `docs/architecture/adr/README.md` | +| M | `docs/work-items/ET-008/00-business-request.md` | +| M | `docs/work-items/ET-008/01-brd.md` | +| M | `docs/work-items/ET-008/02-trz.md` | +| M | `docs/work-items/ET-008/03-acceptance-criteria.md` | +| M | `docs/work-items/ET-008/04-test-plan.yaml` | +| M | `docs/work-items/ET-008/04b-ui-test-cases.md` | +| A | `docs/work-items/ET-008/06-adr/ADR-005-storage-schema.md` | +| A | `docs/work-items/ET-008/06-adr/ADR-006-dedup-algorithm.md` | +| A | `docs/work-items/ET-008/06-adr/ADR-007-pipeline-architecture.md` | +| A | `docs/work-items/ET-008/06-adr/ADR-008-tile-vs-geojson-strategy.md` | +| A | `docs/work-items/ET-008/06-adr/ADR-009-osm-licensing.md` | +| A | `docs/work-items/ET-008/06-adr/ADR-010-enduro-russia-licensing.md` | +| A | `docs/work-items/ET-008/06-adr/ADR-011-ttrails-licensing.md` | +| A | `docs/work-items/ET-008/07-infra-requirements.md` | +| A | `docs/work-items/ET-008/08-data-requirements.md` | +| A | `docs/work-items/ET-008/10-tech-risks.md` | + +Команды для воспроизведения: +``` +git -C enduro-trails diff main...feature/ET-008-gps -- src/ tests/ migrations/ scripts/ config/ +# (empty output — нет ни одного изменения вне docs/) +``` + +Итого: **0 строк** в `src/`, `tests/`, `migrations/`, `scripts/`, `config/`, +`docker-compose.yml`. Все изменения — в `docs/` и `.task.md`. + +## Findings + +### F-01 [P0]: Отсутствует реализация ТЗ — все 20 REQ-F и все REQ-NF не выполнены + +**Severity:** P0 (blocker — «не реализовано требование ТЗ»). + +**Ссылка на правило:** регламент Reviewer'а, секция Severity: «не реализовано +требование ТЗ → P0». + +**Что ожидалось** (по ТЗ §5 «Файловая структура изменений», ст. 742–799): + +Backend (Python): +- `src/api/gps_tracks/__init__.py` +- `src/api/gps_tracks/models.py` — Pydantic + `ACTIVITY_TYPES` (REQ-F-07) +- `src/api/gps_tracks/db.py` — SQLite/Spatialite обвязка (REQ-F-09, ADR-005) +- `src/api/gps_tracks/dedup.py` — `compute_dedup_key()` (REQ-F-08, ADR-006) +- `src/api/gps_tracks/mvt.py` — MVT-генерация (REQ-F-11, ADR-008) +- `src/api/gps_tracks/endpoint.py` — FastAPI routes для REQ-F-10/11/12 +- `src/api/gps_tracks/config.py` — загрузка YAML +- `src/api/gps_tracks/sources/{base,osm,enduro_russia,ttrails}.py` — + REQ-F-04/05/06 (ADR-009/010/011) +- Регистрация роутов в `src/api/main.py` — не сделана +- Обновление `src/api/requirements.txt` (`defusedxml`, `lxml`) — не сделано + +Pipeline: +- `scripts/gps_collect.py` — CLI-entry для REQ-F-03 (ADR-007) — отсутствует + +Frontend (Web): +- `src/web/gps_tracks.js` — слой/фильтры/popup (REQ-F-13…F-18) — отсутствует +- Правки `src/web/app.js` — `restorePublicTracksState()` (REQ-F-19), + расширение `rebuildMapOverlays()`, halo по паттерну ET-007 (REQ-F-17, §7.2) — не сделаны +- Правки `src/web/index.html` — чекбокс «Публичные треки» и + `#sheet-gps-filters` (REQ-F-13, REQ-F-14, ТЗ §3) — не сделаны +- Правки `src/web/app.css` — `.terrain-link-btn`, `.gps-filter-grid`, + `.gps-stats-row` (ТЗ §3.1) — не сделаны +- Правки `src/web/style.json`, `src/web/style-dark.json` — halo для + спутника (REQ-F-17) — не сделаны + +Конфигурация: +- `config/gps_sources.yaml` (REQ-F-01) — отсутствует +- `config/gps_regions.yaml` (REQ-F-02) — отсутствует +- Директория `config/` вообще не существует в репозитории + +Миграции: +- `migrations/gps_tracks_001_init.sql` (REQ-F-09, ADR-005) — отсутствует + +Тесты (ТЗ §5, ст. 782–787): +- `tests/api/test_gps_tracks_endpoint.py` — отсутствует +- `tests/api/test_gps_tracks_mvt.py` — отсутствует +- `tests/api/test_gps_tracks_dedup.py` — отсутствует +- `tests/api/test_gps_tracks_sources_osm.py` — отсутствует +- `tests/web/gps_tracks.test.js` — отсутствует + +Инфраструктура (`07-infra-requirements.md`): +- Сервис `gps-collector` в `docker-compose.yml` с `profiles: ["batch"]` + (`docs/architecture/README.md` ст. 12, 41–46) — не добавлен +- Cron-конфигурация на mva154 Mon/Thu 03:00 UTC — не сделана + +**Покрытие AC** (`03-acceptance-criteria.md`): из всех Gherkin-сценариев +AC-01…AC-NN ни один не может быть исполнен — нет ни runtime, ни pipeline, +ни схемы БД. + +**Действие:** вернуть в стадию Development. Реализовать в порядке, +рекомендованном ADR-007 §pipeline-architecture (config + db/migration → +dedup → один source (OSM, ADR-009 accepted) → endpoints → MVT → UI), +затем добавить тесты по `04-test-plan.yaml` и запустить ревью повторно. + +## Замечания на полях (НЕ блокирующие, к доработке вне этого ревью) + +Эти пункты НЕ являются P-findings против реализации (её нет), просто +служат напоминанием для следующего ревью, когда код появится: + +- ADR-010 (EnduroRussia) и ADR-011 (ttrails) согласно + `docs/architecture/README.md` ст. 53–60 и ТЗ ст. 59 имеют статус + `proposed/blocked`. Согласно ADR-007 §6 «licensing guard» — pipeline + ОБЯЗАН пропускать источник без `status: accepted`. Это поведение должно + иметь покрытие тестом (`test_pipeline_skips_unaccepted_source`). +- В `src/api/main.py` (`route-line`, `trails-*` слои) при подключении + нового слоя `gps-tracks-layer` важно сохранить z-order, который ТЗ + фиксирует в §7.1: `gps-tracks-layer < gpx-layer-*`. В коде должен быть + явный `beforeId` в `map.addLayer(...)`. +- В `applyBaseLayer()` (ET-007) необходимо добавить шаг по ТЗ §7.2. + Reviewer проверит, что halo `gps-tracks-halo-satellite` переключается + по тому же паттерну, что `trails-track-halo-satellite`. +- Bbox-валидация на endpoint (REQ-NF-01): диапазон координат + площадь. + Должен быть unit-тест на отказ при невалидном bbox. +- `defusedxml` для серверного GPX-парсинга (REQ-NF-01): обязательное + требование, проверится grep'ом на `lxml.etree.parse` без defusedxml. + +## Subjective / Style + +Не применимо — кода нет. + +## Тесты + +Не применимо — тестов нет. После реализации reviewer проверит покрытие +относительно `04-test-plan.yaml` и `04b-ui-test-cases.md`. + +## Заметки по соответствию ADR + +Не применимо для кода. Сами ADR-005…011 не ревьюились в этом проходе +(это работа архитектора/Owner); по PR-changes — приняты как контекст. + +## Рекомендация для CI + +- `04-test-plan.yaml` ссылается на тесты, которых нет → CI должен упасть + на сборе (pytest collection error) или на отсутствии модулей. +- `make lint` пройдёт (нет нового Python-кода), `make test` упадёт. +- Не закрывать ET-008 в Plane как Done. + +--- + +**Итог:** REQUEST_CHANGES. Возврат на стадию Development.