diff --git a/docs/work-items/ET-013/12-review.md b/docs/work-items/ET-013/12-review.md index b07221d..03b1445 100644 --- a/docs/work-items/ET-013/12-review.md +++ b/docs/work-items/ET-013/12-review.md @@ -2,9 +2,9 @@ type: review work_item_id: ET-013 verdict: APPROVED -version: 17 +version: 18 created_at: 2026-06-04 -updated_at: 2026-06-06 +updated_at: 2026-06-07 authors: - "agent:reviewer" related: @@ -14,17 +14,20 @@ related: - "ET-013:test-report" --- -# Review ET-013 — Перепады высот на z9-z11 (re-run #17) +# Review ET-013 — Перепады высот на z9-z11 (re-run #18) -> **Re-run #17 (независимая сверка.)** Перечитаны TRZ (`02-trz.md`), +> **Re-run #18 (независимая сверка.)** Перечитаны TRZ (`02-trz.md`), > AC (`03-acceptance-criteria.md`), ADR-017, CLAUDE.md. Построчно сверена -> реализация в рабочем дереве с REQ-F-01..F-19 и решениями ADR-017. +> реализация в рабочем дереве с REQ-F-01..F-21 и решениями ADR-017. +> Unit-тесты исполнены локально. > > Состояние ветки: фича ET-013 уже смержена в `main` и задеплоена. > `git diff main...HEAD` затрагивает только docs (`12-review.md`, > `13-test-report.md`) — кодовая часть в рабочем дереве идентична -> merged/deployed-состоянию. Нового кода для ревью нет; повторно -> подтверждаю корректность merged-кода непосредственным чтением файлов. +> merged/deployed-состоянию (commits `5be81f9` feat + `099669d` +> whitelist-fix). Нового кода для ревью нет; повторно подтверждаю +> корректность merged-кода непосредственным чтением файлов и прогоном +> unit-тестов. ## TL;DR @@ -39,7 +42,7 @@ related: | REQ | Требование | Статус | |---|---|---| -| F-01/11 | `updateHillshadeAvailability`: `zoom < 9` (app.js:3425) | ✅ старый `< 10` отсутствует | +| F-01/11 | `updateHillshadeAvailability`: `zoom < 9` (app.js:3425) | ✅ старый `< 10` отсутствует в теле функции | | F-02 | hillshade minzoom=9, paint=HILLSHADE_PAINT (app.js:2825) | ✅ | | F-03 | TRI minzoom=5/maxzoom=15, paint=TRI_PAINT (app.js:2826) | ✅ minzoom не тронут | | F-04 | `applyTerrainLayer(opacityOrPaint)` (app.js:3371-3414) | ✅ number→legacy(linear) / object as-is, `paint: paint` в addLayer | @@ -47,9 +50,9 @@ related: | F-08/09 | TRI_PAINT opacity z5:0.55,z7:0.65,**z8:0.70 (регрессия)**,z9:0.80,пик z10-z11:0.85,z12:0.75,z15:0.70; `nearest` (app.js:2755-2768) | ✅ stops точно | | F-10 | hint «Зум 9+» (index.html:60) | ✅ | | F-12 | контракт `onTerrainCheckbox`, persistence `localStorage`, `.active` | ✅ без изменений сигнатуры/логики | -| F-13/14 | unit-тесты (Вариант B, Python-парсер) + регрессии | ✅ 17 тестов, **17/17 PASS локально (0.03 s)** | +| F-13/14 | unit-тесты (Вариант B, Python-парсер) + регрессии | ✅ **17/17 PASS локально (0.03 s)** | | F-15 | integration smoke z9 (`test_terrain_z9_tiles.py`) с `skipif` | ✅ присутствует, whitelist/404-регрессии работают без данных | -| F-18 | API контракт `/terrain/{layer}/{z}/{x}/{y}.png`, `Cache-Control: public, max-age=31536000, immutable` (main.py:1252-1264) | ✅ сохранён | +| F-18 | API контракт `/terrain/{layer}/{z}/{x}/{y}.png`, `Cache-Control: public, max-age=31536000, immutable` (main.py:1252-1264) | ✅ контракт сохранён | | F-19 | style.json/style-dark.json/app.css/config не тронуты | ✅ | ## Соответствие ADR-017 @@ -68,13 +71,13 @@ related: | # | Severity | Файл | Описание | Статус | |---|---|---|---|---| -| N-1 | P3 (info) | `src/api/main.py:1252` | TRZ §2 декларировал backend «без изменений», но в whitelist добавлен `tri` (`("hypso","hillshade","tri")`). Это необходимый багфикс: в dev-режиме (FastAPI без nginx) запросы `/terrain/tri/...` иначе возвращали бы 404. Контракт endpoint'а (URL-шаблон, коды ответа, `Cache-Control: immutable`, новых query/headers нет) не нарушен → REQ-F-18 соблюдён. Покрыто integration-регрессией `test_known_terrain_layer_accepted_by_whitelist`. Не дефект. | Принято. | +| N-1 | P3 (info) | `src/api/main.py:1252` | TRZ §2 декларировал backend «без изменений», но в whitelist добавлен `tri` (`("hypso","hillshade","tri")`, commit `099669d`). Это необходимый багфикс: в dev-режиме (FastAPI без nginx) запросы `/terrain/tri/...` иначе возвращали бы 404 «Unknown layer». Контракт endpoint'а (URL-шаблон, коды ответа, `Cache-Control: immutable`, отсутствие новых query/headers) не нарушен → REQ-F-18 соблюдён. Покрыто integration-регрессией `test_known_terrain_layer_accepted_by_whitelist` (parametrize по hypso/hillshade/tri) + парным `test_unknown_terrain_layer_returns_404`. Документировано в docstring endpoint'а. Не дефект. | Принято. | ## Качество кода - `applyTerrainLayer` расширен обратно-совместимо; ветвление `typeof opacityOrPaint === 'number'` собирает legacy-paint - (`raster-opacity` + `linear`) либо пробрасывает object as-is. JSDoc на месте. + (`raster-opacity` + `linear`) либо пробрасывает object as-is. JSDoc/коммент на месте. - `HILLSHADE_PAINT`/`TRI_PAINT` вынесены рядом с `TERRAIN_BASE_URL` с пояснением логики stops; конфигурируемость через env/config справедливо отвергнута (калибровка живёт в коде, ADR-017 M-A). @@ -82,17 +85,16 @@ related: ## Качество тестов -- **Unit (17):** opacity/contrast stops, монотонность, `nearest`, +- **Unit (17):** opacity/contrast stops + монотонность, `nearest`, регрессия z8=0.70, пик z9-z11≥0.80, обратная совместимость - `applyTerrainLayer`, порог `zoom < 9`, текст hint, число call-site, - привязка paint-константы и minzoom к каждому слою. **17/17 PASS локально.** + `applyTerrainLayer` (number→linear legacy / object as-is), порог + `zoom < 9` (+ отсутствие `zoom < 10`), текст hint «Зум 9+», число + call-site, привязка paint-константы и minzoom к каждому слою. + Парсер устойчив к пробелам/переносам. **17/17 PASS локально.** - **Integration:** TestClient против `src.api.main:app`; тайло-зависимые кейсы параметризованы по слоям (hillshade/tri) и зумам (9/10/11), `skipped` при отсутствии PH-6 данных; whitelist/404/Cache-Control — - регрессии работают всегда. Сбой коллекции в окружении ревью вызван - отсутствием `shapely` (зависимость API) — это инфра-вопрос окружения, - не дефект тестов/кода; в CI с установленными зависимостями импорт - проходит. + регрессии работают всегда (без локальных PNG). Адекватно. ## Замечание по статусу тестирования (вне content-review) @@ -106,4 +108,4 @@ Test Report фиксирует blocker на AC-19/REQ-F-20 §1: на test-сре ## Вердикт Нет P0/P1. Реализация полностью соответствует TRZ и ADR-017, тесты -адекватны и зелёные. **APPROVED.** +адекватны и зелёные (17/17). **APPROVED.**