From e75a823996c0c0bc25ee1671ff6ce55d474e31dd Mon Sep 17 00:00:00 2001 From: claude-bot Date: Sun, 7 Jun 2026 01:33:50 +0000 Subject: [PATCH] reviewer(ET): auto-commit from reviewer run_id=258 --- docs/work-items/ET-013/12-review.md | 42 +++++++++++++++-------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/docs/work-items/ET-013/12-review.md b/docs/work-items/ET-013/12-review.md index 889678a..3a5aa37 100644 --- a/docs/work-items/ET-013/12-review.md +++ b/docs/work-items/ET-013/12-review.md @@ -2,7 +2,7 @@ type: review work_item_id: ET-013 verdict: APPROVED -version: 25 +version: 26 created_at: 2026-06-04 updated_at: 2026-06-07 authors: @@ -14,7 +14,7 @@ related: - "ET-013:test-report" --- -# Review ET-013 — Перепады высот на z9-z11 (re-run #25) +# Review ET-013 — Перепады высот на z9-z11 (re-run #26) > **Независимая сверка, свежий экземпляр reviewer.** Перечитаны > `02-trz.md` (REQ-F-01..F-21), `03-acceptance-criteria.md` (AC-01..AC-22), @@ -27,10 +27,11 @@ related: ## 1. Объём ревью Четыре оси: соответствие ТЗ, соответствие ADR-017, качество кода, -качество тестов. Код фичи слит в `main` (commit `5be81f9`); ревью -выполнено по фактическому состоянию рабочего дерева: `src/web/app.js`, -`src/web/index.html`, `src/api/main.py`, `tests/unit/test_terrain_paint.py`, -`tests/integration/test_terrain_z9_tiles.py`. +качество тестов. Код фичи слит в `main`; `git diff main...HEAD` +затрагивает только docs (`12-review.md`, `13-test-report.md`). Ревью +выполнено по фактическому состоянию рабочего дерева: +`src/web/app.js`, `src/web/index.html`, `src/api/main.py`, +`tests/unit/test_terrain_paint.py`, `tests/integration/test_terrain_z9_tiles.py`. ## 2. Соответствие ТЗ (REQ-F-01..F-21) @@ -39,11 +40,10 @@ related: | F-01 / F-11 | `updateHillshadeAvailability`: `if (zoom < 9)` (app.js:3425); `< 10` отсутствует | ✅ | | F-02 | hillshade-вызов `applyTerrainLayer(..., HILLSHADE_PAINT, 9, 15)` (app.js:2825) | ✅ | | F-03 | TRI-вызов `applyTerrainLayer(..., TRI_PAINT, 5, 15)` — minzoom=5 без изменений (app.js:2826) | ✅ | -| F-04 | Сигнатура `applyTerrainLayer(id, tileUrl, enabled, opacityOrPaint, minzoom, maxzoom)`; нормализация `typeof === 'number'` → legacy paint (app.js:3371-3380) — обратно-совместимо | ✅ | -| F-05/06/07 | `HILLSHADE_PAINT`: opacity (9→0.65,10→0.60,11→0.55,12→0.50,14→0.40), contrast (9→0.40,10→0.35,11→0.30,12→0.15,14→0.00), `'nearest'` (app.js:2734-2752) — дословно по ТЗ | ✅ | -| F-08/09 | `TRI_PAINT`: opacity (5→0.55,7→0.65,8→0.70,9→0.80,10→0.85,11→0.85,12→0.75,15→0.70), `'nearest'` (app.js:2755-2768) | ✅ | +| F-04 / F-12 | Сигнатура `applyTerrainLayer(id, tileUrl, enabled, opacityOrPaint, minzoom, maxzoom)`; нормализация `typeof === 'number'` → legacy paint (app.js:3371-3380); `onTerrainCheckbox` + persistence `localStorage` без изменений | ✅ | +| F-05/06/07 | `HILLSHADE_PAINT` (app.js:2734-2752): opacity 9→0.65,10→0.60,11→0.55,12→0.50,14→0.40; contrast 9→0.40,10→0.35,11→0.30,12→0.15,14→0.00; `'nearest'` — дословно по ТЗ | ✅ | +| F-08/09 | `TRI_PAINT` (app.js:2755-2768): opacity 5→0.55,7→0.65,8→0.70,9→0.80,10→0.85,11→0.85,12→0.75,15→0.70; `'nearest'` | ✅ | | F-10 | `#terrain-hillshade-hint` = «Зум 9+» (index.html:60) | ✅ | -| F-12 | `onTerrainCheckbox` контракт + persistence `localStorage` (`terrain-hillshade`/`terrain-tri`) без изменений | ✅ | | F-13/14 | `tests/unit/test_terrain_paint.py` — 17 тестов: stops, регрессия z8=0.70, пик z9-z11≥0.80, монотонность, `nearest`, обратная совместимость, порог 9, hint, call-count | ✅ | | F-15 | `tests/integration/test_terrain_z9_tiles.py` — параметризация по слою/зуму, `skipif` без данных, 404-регрессии независимы от данных | ✅ | | F-17/F-18/F-19 | persistence без миграции; стили `style.json`/`style-dark.json` и конфиги не тронуты | ✅ | @@ -54,7 +54,7 @@ related: ## 3. Соответствие ADR-017 - **P-A** (frontend paint-калибровка) — ✅ правка во фронтенде, без перегенерации тайлов, без смены paint-pipeline. -- **O-B** (linear interpolate stops) — ✅ stops совпадают с ADR §O-B; явная точка `8→0.70` (регрессия AC-06) и clamping на верхнем стопе z14 (регрессия AC-10). +- **O-B** (linear interpolate stops) — ✅ stops совпадают с ADR §Решение п.4-5; явная точка `8→0.70` (регрессия AC-06) и clamping на верхнем стопе (регрессия AC-10). - **C-A** (`raster-contrast` zoom-aware только для hillshade) — ✅, TRI контраст не трогается. - **R-A** (`'nearest'` глобально для обоих слоёв) — ✅. - **U-A** (UI-гейт hillshade понижен до z9, не до z8) — ✅. @@ -81,19 +81,21 @@ related: значения и монотонность stops, отсутствие старого порога `< 10`, обратная совместимость, hint-текст, число вызовов. Локальный прогон **17/17 PASS**. -- Integration — параметризация по обоим слоям, whitelist-регрессия, - cache-header; 404-проверки не зависят от наличия PNG, тайловые тесты - корректно `skipif` при отсутствии z9-данных. -- Примечание по среде: локально модуль `tests/integration/...` не - импортируется из-за отсутствия `shapely`, но `shapely==2.0.4` указан в - `src/api/requirements.txt` и `pyproject.toml` → в CI импорт проходит. - Это дефект локального окружения, не кода. +- Integration — параметризация по обоим слоям, whitelist-регрессия + (`test_known_terrain_layer_accepted_by_whitelist`), cache-header; + 404-проверки не зависят от наличия PNG, тайловые тесты корректно + `skipif` при отсутствии z9-данных. +- Примечание по среде: в песочнице ревью модуль + `tests/integration/...` не импортируется из-за отсутствия `shapely`, + но `shapely==2.0.4` указан в `pyproject.toml` → в CI импорт проходит. + Это дефект локального окружения, не кода (подтверждено + `13-test-report.md`: полный регресс 254 passed). ## 6. Findings | ID | Severity | Описание | |---|---|---| -| F-INFO-1 | P3 (informational) | `src/api/main.py:1252` добавляет `tri` в whitelist слоёв (`hypso`/`hillshade`/`tri`). Формально ТЗ §2 и REQ-F-18 декларировали «main.py без изменений», но это **необходимый и уже завизированный прошлым ревью (F-1) фикс**: фронтенд запрашивает `/terrain/tri/{z}/{x}/{y}.png`, и без whitelist слой «Перепады» возвращал бы 404 в dev-режиме (без nginx). Изменение обратно-совместимо, контракт endpoint'а не ломается (добавление допустимого значения, без новых query/headers/кодов). Покрыто регрессией `test_known_terrain_layer_accepted_by_whitelist`. Не блокер. | +| F-INFO-1 | P3 (informational) | `src/api/main.py:1252` добавляет `tri` в whitelist слоёв (`hypso`/`hillshade`/`tri`). Формально ТЗ §2 / REQ-F-18 и ADR-017 «Классификация изменения» декларировали «main.py без изменений», но это **необходимый и ранее завизированный (F-1) фикс**: фронтенд запрашивает `/terrain/tri/{z}/{x}/{y}.png`, и без whitelist слой «Перепады» возвращал бы 404 «Unknown layer» в dev-режиме (без nginx). Изменение обратно-совместимо — добавление допустимого значения, без новых query/headers/кодов; контракт endpoint'а не ломается. Покрыто регрессией `test_known_terrain_layer_accepted_by_whitelist` + парным `test_unknown_terrain_layer_returns_404`. Не блокер. | Findings уровня P0/P1/P2 нет. @@ -102,7 +104,7 @@ Findings уровня P0/P1/P2 нет. `13-test-report.md` имеет `verdict: BLOCKED`. Блокировка относится к **данным деплой-стадии** (на test-среде не нарезаны z9-тайлы hillshade → pre-deploy gate AC-19 и визуальная приёмка z9 не проходят), а **не к -коду**. Разблокировка = PH-6 follow-up (догенерить z9-тайлы). Это вне +коду**. Разблокировка = PH-6 follow-up (догенерить z9-тайлы), вне четырёх осей code-review. По коду, ТЗ, ADR и автотестам блокеров нет. ## 8. Вердикт