Files
enduro-trails/docs/work-items/ET-013/13-test-report.md
claude-bot 4e28729d13
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 8s
CI / build (push) Successful in 2s
tester(ET): auto-commit from tester run_id=255
2026-06-07 01:13:13 +00:00

1202 lines
87 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
type: test-report
work_item_id: ET-013
title: "Test Report: Перепады высот на z9-z11 — zoom-aware paint"
version: 16
status: blocked
verdict: BLOCKED
created_at: 2026-06-04
updated_at: 2026-06-07
authors:
- "agent:tester"
related:
- "ET-007"
- "PH-6.terrain"
adr_refs:
- "ADR-017"
---
# Test Report — ET-013
> **v16 (2026-06-07).** Независимый перепрогон (tester re-run, свежий
> экземпляр). Состояние кода ET-013 неизменно (фича в `main`;
> `git diff main...HEAD` затрагивает **только docs** —
> `12-review.md`, `13-test-report.md`). Review — **APPROVED**
> (P0/P1 в коде нет). Прогон в venv `/tmp/et013venv`. Итог совпадает
> с v1..v15: **код, автотесты, lint и деплой зелёные, но
> инфраструктурный блокер не устранён** — на test-среде по-прежнему
> отсутствуют z9-тайлы hillshade. **Вердикт: BLOCKED** (данные/PH-6,
> не дефект кода → `back-to:dev` не требуется).
>
> **Что прогнано в v16:**
> - **Health.** `curl`/`make` в песочнице недоступны → probe через
> `python3 urllib`. `GET /enduro/api/health` → **200**
> (`{"status":"ok","db_path":"/app/data/centralfederal.sqlite","db_exists":true}`).
> - **Полный авто-регресс** (`pytest tests/`) → **254 passed,
> 7 skipped, 4 deselected, 0 failed** (4.11 s). Регрессий
> ET-007/008/009/011/012 нет (AC-17 ✅).
> - **ET-013 unit+integration** (`test_terrain_paint.py` +
> `test_terrain_z9_tiles.py`) → **23 passed / 7 skipped** (0.48 s).
> 17 unit PASS (opacity/contrast stops + монотонность, `nearest`,
> регрессия z8=0.70, пик z9-z11≥0.80, обратная совместимость
> `applyTerrainLayer`, порог `zoom < 9` + отсутствие `< 10`, hint
> «Зум 9+», call-count); 6 integration PASS (whitelist
> hypso/hillshade/tri, 404 на unknown-layer/missing-tile/
> invalid-zoom); 7 SKIP — нет PNG-fixtures. AC-15/16/22 ✅.
> - **Lint.** `cd src/api && ruff check .` → **All checks passed!**
> (exit 0, AC-18 ✅).
> - **Деплой ET-013 на test подтверждён прямым fetch:** `/enduro/app.js`
> (200, 132 149 B) содержит `HILLSHADE_PAINT`, `TRI_PAINT`,
> `raster-contrast`, `'nearest'`, `zoom < 9`; **нет** `zoom < 10`.
> `/enduro/index.html` hint = «Зум 9+» (нет «Зум 10+»). AC-01 ✅.
> - **❌ Pre-deploy probe AC-19 / REQ-F-20 §1 — снова FAIL (P1, данные):**
> hillshade **z9-тайлы отсутствуют**. Канонические AC-19 тайлы
> (XYZ `9/308/158`, `10/617/317`, `11/1234/635`) → 404. Сетка 5×5
> вокруг `[37.6, 54.5]`, обе схемы (XYZ и TMS) → **hillshade z9 =
> 0/25, все 404**. Контроль: **TRI z9 (TMS) → 200**,
> **hillshade z10 (TMS) → 200**. Слой hillshade по-прежнему
> начинается с z10. **PH-6 follow-up из v1..v15 не выполнен.**
> - **Следствие для UX:** деплой понизил UI-минзум hillshade до z9 и
> запрашивает `/terrain/hillshade/9/*`, но тайлов нет → на z9
> включённые «Тени рельефа» дают пустой слой; видны только
> «Перепады» (TRI z9 есть). Нарушены **AC-03/07/13/19** (всё, что
> завязано на z9 hillshade).
> - **UI Playwright (TC-UI-01..12) — NOT EXECUTED:** `$UI_TEST_RUNNER`
> не задан, `/home/slin/tools/ui-test/run_tests.js` отсутствует,
> `npx`/`playwright` в песочнице нет (есть только `node`),
> baseline-скриншотов нет. Шаг 4 алгоритма пропущен из-за окружения;
> z9-визуальные TC всё равно не прошли бы без z9-тайлов.
>
> **Заключение v16:** дефекта кода нет (Review APPROVED; unit/
> integration/lint/полный регресс зелёные; деплой корректен). Блокер —
> инфраструктурный/данные: отсутствие z9-тайлов hillshade.
> `back-to:dev` не требуется. Разблокировка = **PH-6 follow-up**
> (нарезать `data/terrain/hillshade/9/*` по TMS-схеме z10+ и
> задеплоить), после чего повторить AC-03/07/13/19 и UI
> TC-UI-01/03/07.
>
> ## Visual / UI тесты (v16)
>
> UI Playwright-раннер в окружении тестировщика недоступен → ни один
> visual-TC не выполнен. Таблица отражает статус прогона, не вердикт
> по коду.
>
> | TC | Назначение | Статус | Severity / прим. |
> |---|---|---|---|
> | TC-UI-01-Z9 | hillshade доступен/виден на z9 | NOT EXECUTED | блокер: нет z9-тайлов + нет раннера |
> | TC-UI-02-Z8-REGRESS | TRI на z8 как до ET-013 | NOT EXECUTED | нет раннера |
> | TC-UI-03-Z9-Q | читаемость z9 (оба слоя) | NOT EXECUTED | блокер: нет z9 hillshade |
> | TC-UI-04-Z10-Q | читаемость z10 | NOT EXECUTED | нет раннера (тайлы z10 есть) |
> | TC-UI-05-Z11-Q | читаемость z11 | NOT EXECUTED | нет раннера (тайлы z11 есть) |
> | TC-UI-06-Z14-REGRESS | hillshade не перегрет z14 | NOT EXECUTED | нет раннера |
> | TC-UI-07-Z9-MOBILE | mobile z9 | NOT EXECUTED | блокер: нет z9 hillshade |
> | TC-UI-08-Z10-SAT-Q | спутник + hillshade z10 | NOT EXECUTED | нет раннера |
> | TC-UI-09-Z10-DARK-Q | тёмная тема + hillshade z10 | NOT EXECUTED | нет раннера |
> | TC-UI-10-PERSIST | localStorage переживает F5 | NOT EXECUTED | нет раннера |
> | TC-UI-11-NETWORK-Q | сетевой объём M-10 | NOT EXECUTED | нет раннера + нет baseline |
> | TC-UI-12-Z9-PAN | панорамирование z9 | NOT EXECUTED | нет раннера |
>
> Severity по блокеру: **P1** (целевой UX ET-013 на z9 для hillshade
> недостижим без данных). Это данные/инфра, не код.
>
> ---
> **v15 (2026-06-07).** Независимый перепрогон (tester re-run, свежий
> экземпляр). Состояние кода ET-013 неизменно (фича в `main`: `5be81f9`
> feat, `099669d` fix-whitelist; `git diff main...HEAD` — только docs).
> Review (re-run #23) — **APPROVED** (P0/P1 в коде нет). Прогон в venv
> `/tmp/et013venv`. Итог: **код и автотесты зелёные, деплой корректен,
> но инфраструктурный блокер v1..v14 не устранён** — на test-среде
> по-прежнему нет z9-тайлов hillshade. **Вердикт: BLOCKED** (данные/PH-6,
> не дефект кода → `back-to:dev` не требуется).
>
> **Что прогнано в v15:**
> - **Health.** `curl`/`make` в песочнице недоступны → probe через
> `python3 urllib`. `GET /enduro/api/health` → **200**
> (`{"status":"ok","db_path":".../centralfederal.sqlite","db_exists":true}`).
> - **ET-013 unit+integration** (`test_terrain_paint.py` +
> `test_terrain_z9_tiles.py`) → **23 passed / 7 skipped** (0.49 s).
> 17 unit PASS (opacity/contrast stops + монотонность, `nearest`,
> регрессия z8=0.70, пик z9-z11≥0.80, обратная совместимость
> `applyTerrainLayer`, порог `zoom < 9` + отсутствие `< 10`, hint
> «Зум 9+», call-count); 6 integration PASS (whitelist hypso/hillshade/
> tri, 404 на unknown-layer/missing-tile/invalid-zoom); 7 SKIP — нет
> PNG-fixtures. AC-15/16/22 ✅.
> - **Полный авто-регресс** (`pytest tests/`) → **254 passed, 7 skipped,
> 4 deselected, 0 failed** (4.39 s). Регрессий ET-007/008/009/011/012
> нет (AC-17 ✅).
> - **Lint.** `make lint` = `cd src/api && ruff check .` → **All checks
> passed!** (exit 0, AC-18 ✅). Примечание: `ruff check .` из корня
> репо находит 4 нарушения (F401×3, E741×1) в **чужих** тест-файлах
> (`tests/api/test_gps_tracks_mvt.py`, `..._sources_osm.py`,
> `tests/unit/test_base_layer.py`) — вне scope ET-013 и вне target'а
> `make lint` (он линтит только `src/api`). Не блокер ET-013; кандидат
> на отдельную housekeeping-задачу.
> - **Деплой ET-013 на test подтверждён прямым fetch:** `/enduro/app.js`
> (200, 132 KB) содержит `HILLSHADE_PAINT`, `TRI_PAINT`, `zoom < 9`;
> **нет** `zoom < 10`. `index.html` hint = «Зум 9+» (нет «Зум 10+»).
> AC-01 ✅.
> - **❌ Pre-deploy probe AC-19 / REQ-F-20 §1 — снова FAIL (P1, данные):**
> hillshade **z9-тайлы отсутствуют**. Широкий скан по ЦФО
> (lat 5357, lon 3540), обе схемы TMS и XYZ → **0 hits, все 404**.
> Контроль: TRI z9 → **200**, hillshade z10 → **200**. Слой hillshade
> по-прежнему начинается с **z10**. Подробная сетка 5×5 вокруг
> `[37.6, 54.5]`: hillshade z9 → **0/25**, z10 → 20/25, z11..z14 → 25/25;
> TRI z8..z12 → 25/25 (z13/z14 у TRI нет — ожидаемо, вне scope ET-013).
> **PH-6 follow-up из v1..v14 так и не выполнен.**
> - **Следствие для UX:** деплой понизил UI-минзум hillshade до z9 и
> запрашивает `/terrain/hillshade/9/*`, но тайлов нет → на z9 включённые
> «Тени рельефа» дают пустой слой; видны только «Перепады» (TRI z9
> есть). Нарушены **AC-03** (видны тени на z9), **AC-07** (читаемость
> z9), **AC-13** (mobile z9) и **AC-19** (z9 = 200).
> - **UI Playwright (TC-UI-01..12) — NOT EXECUTED:** `$UI_TEST_RUNNER`
> не задан, `/home/slin/tools/ui-test/` отсутствует, `npx`/playwright
> в песочнице нет, спеков в `tests/ui|e2e|visual` нет (только template),
> baseline-скриншотов нет. Шаг 4 алгоритма пропущен из-за окружения.
> Кроме того, z9-визуальные TC всё равно не прошли бы без z9-тайлов.
>
> **Заключение v15:** дефекта кода нет (Review APPROVED; unit/integration/
> lint зелёные; деплой корректен). Блокер — инфраструктурный/данные:
> отсутствие z9-тайлов hillshade. `back-to:dev` не требуется.
> Разблокировка = **PH-6 follow-up** (нарезать `data/terrain/hillshade/9/*`
> по той же TMS-схеме, что z10+, и задеплоить), после чего повторить
> AC-03/07/13/19 и UI TC-UI-01/03/07.
>
> ## Visual / UI тесты (v15)
>
> UI Playwright-раннер в окружении тестировщика недоступен → ни один
> visual-TC не выполнен. Таблица отражает статус прогона, не вердикт
> по коду.
>
> | TC | Назначение | Статус | Severity / прим. |
> |---|---|---|---|
> | TC-UI-01-Z9 | hillshade доступен/виден на z9 | NOT EXECUTED | блокер: нет z9-тайлов + нет раннера |
> | TC-UI-02-Z8-REGRESS | TRI на z8 как до ET-013 | NOT EXECUTED | нет раннера |
> | TC-UI-03-Z9-Q | читаемость z9 (оба слоя) | NOT EXECUTED | блокер: нет z9 hillshade |
> | TC-UI-04-Z10-Q | читаемость z10 | NOT EXECUTED | нет раннера (тайлы z10 есть) |
> | TC-UI-05-Z11-Q | читаемость z11 | NOT EXECUTED | нет раннера (тайлы z11 есть) |
> | TC-UI-06-Z14-REGRESS | hillshade не перегрет z14 | NOT EXECUTED | нет раннера |
> | TC-UI-07-Z9-MOBILE | mobile z9 | NOT EXECUTED | блокер: нет z9 hillshade |
> | TC-UI-08-Z10-SAT-Q | спутник + hillshade z10 | NOT EXECUTED | нет раннера |
> | TC-UI-09-Z10-DARK-Q | тёмная тема + hillshade z10 | NOT EXECUTED | нет раннера |
> | TC-UI-10-PERSIST | localStorage переживает F5 | NOT EXECUTED | нет раннера |
> | TC-UI-11-NETWORK-Q | сетевой объём M-10 | NOT EXECUTED | нет раннера + нет baseline |
> | TC-UI-12-Z9-PAN | панорамирование z9 | NOT EXECUTED | нет раннера |
>
> Severity по блокеру: **P1** (целевой UX ET-013 на z9 для hillshade
> недостижим без данных). Это данные/инфра, не код.
>
> ---
> **v14 (2026-06-07).** Независимый перепрогон (tester re-run, свежий
> экземпляр). Состояние кода ET-013 неизменно (фича в `main`: `5be81f9`
> feat, `099669d` fix-whitelist; ветка `feature/ET-013-z9-z11-z8`,
> `git diff main...HEAD` затрагивает только docs). Прогон в venv
> `/tmp/et013venv` (`shapely`, `defusedxml`, `fastapi`, `httpx`, `pytest`,
> `ruff`). Review (re-run #22) — **APPROVED** (P0/P1 в коде нет).
>
> - **Окружение/health.** `curl`/`wget`/`make` в песочнице недоступны —
> probe через `python3 urllib`. `GET /enduro/api/health` → **200**
> (`{"status":"ok","db_path":"/app/data/centralfederal.sqlite",
> "db_exists":true}`).
> - **Полный авто-регресс** (`pytest tests/`) → **254 passed, 7 skipped,
> 4 deselected, 0 failed** (4.08 s). Регрессий ET-007/008/009/011/012
> нет (AC-17).
> - **ET-013 unit+integration** (`tests/unit/test_terrain_paint.py` +
> `tests/integration/test_terrain_z9_tiles.py`) → **23 passed / 7
> skipped** (17 unit PASS: opacity/contrast stops + монотонность,
> `nearest`, регрессия z8=0.70, пик z9-z11≥0.80, обратная совместимость
> `applyTerrainLayer`, порог `zoom < 9` + отсутствие `< 10`, hint «Зум
> 9+», call-count, привязка paint+minzoom к слою; 6 integration PASS:
> whitelist hypso/hillshade/tri, 404 на unknown-layer/missing-tile/
> invalid-zoom; 7 integration SKIP — нет PNG-fixtures. AC-15/16/22 ✅).
> - **Lint** `ruff check .` → **All checks passed!** (exit 0, AC-18).
> - **Деплой ET-013 на test подтверждён:** `app.js` содержит
> `HILLSHADE_PAINT`/`TRI_PAINT`/`zoom < 9`; **нет** `zoom < 10`.
> `index.html` hint = «Зум 9+» (нет «Зум 10+»). AC-01 ✅.
> - **❌ Pre-deploy probe AC-19 / REQ-F-20 §1 — повторно FAIL (P1):**
> hillshade **z9-тайлы отсутствуют** на test-среде. Канонические probe
> из TRZ (`9/308/158` и т.д.) → 404 (XYZ ≠ TMS-схема среды). Скан по
> реальной TMS-схеме вокруг центра `[37.6, 54.5]` (grid 7×7):
> hillshade **z9 → 0/49 → 200** (все 404); при этом hillshade **z10 →
> 200**, **z11 → 200**, **z12 → 200**, **z14 → 200**; TRI
> **z8/z9/z10/z11/z12 → 200**. Слой hillshade по-прежнему начинается с
> **z10**. **PH-6 follow-up из v1..v13 так и не выполнен.**
> - **Следствие для UX:** деплой понизил UI-минзум hillshade до z9 и
> запрашивает `/terrain/hillshade/9/*`, но тайлов нет → на z9 включённые
> «Тени рельефа» дают пустой слой; видны только «Перепады» (TRI z9
> есть). Нарушены **AC-03** («на карте видны тени рельефа» при z9),
> **AC-07** (читаемость z9), **AC-13** (mobile z9) и **AC-19** (z9 = 200).
> - **UI Playwright (TC-UI-01..12) — NOT EXECUTED:** `$UI_TEST_RUNNER`
> пуст, `/home/slin/tools/ui-test/run_tests.js` отсутствует,
> `playwright`/`puppeteer`/браузеры не установлены, `npx` недоступен.
> Визуальная приёмка AC-07..AC-13 не выполнена (см. таблицу ниже).
>
> **Вердикт — BLOCKED** по pre-deploy gate AC-19 (без изменений с
> v8..v13). `back-to:dev` **не требуется**: дефекта кода нет (Review
> APPROVED; unit/integration/lint зелёные; деплой корректен). Блокер
> **инфраструктурный/данные** — на test-среде не нарезаны z9-тайлы
> hillshade. Разблокировка = PH-6 follow-up (догенерить
> `data/terrain/hillshade/9/*` над ЦФО и задеплоить), затем повторный
> AC-19 + Playwright TC-UI-01..12 в окружении с браузерами. Альтернатива
> для Анализа: вернуть UI-минзум hillshade на z10 до появления z9-данных
> (TRI на z9 работает и без этого).
>
> ### Visual / UI тесты (v14)
>
> Раннер UI-тестов недоступен в песочнице (`$UI_TEST_RUNNER` пуст,
> `run_tests.js` отсутствует, `playwright`/`puppeteer` не установлены,
> `npx` недоступен). Все check-visual — **NOT EXECUTED (BLOCKED)**.
> Дополнительно TC, завязанные на hillshade z9, заблокированы отсутствием
> тайлов (AC-19).
>
> | TC | Назначение | Вердикт | Причина |
> |---|---|---|---|
> | TC-UI-01-Z9 | hillshade доступен/виден на z9 | BLOCKED | нет runner + нет z9-тайлов hillshade |
> | TC-UI-02-Z8-REGRESS | TRI на z8 как до ET-013 | NOT EXECUTED | нет runner (TRI z8 тайлы есть) |
> | TC-UI-03-Z9-Q | читаемость перепадов z9 | BLOCKED | нет runner + нет z9-тайлов hillshade |
> | TC-UI-04-Z10-Q | читаемость z10 | NOT EXECUTED | нет runner (тайлы z10 есть) |
> | TC-UI-05-Z11-Q | читаемость z11 | NOT EXECUTED | нет runner (тайлы z11 есть) |
> | TC-UI-06-Z14-REGRESS | hillshade не перегрет z14 | NOT EXECUTED | нет runner (тайлы z14 есть) |
> | TC-UI-07-Z9-MOBILE | mobile, hillshade z9 | BLOCKED | нет runner + нет z9-тайлов |
> | TC-UI-08-Z10-SAT-Q | спутник + hillshade z10 | NOT EXECUTED | нет runner |
> | TC-UI-09-Z10-DARK-Q | тёмная тема + hillshade z10 | NOT EXECUTED | нет runner |
> | TC-UI-10-PERSIST | localStorage переживает F5 | NOT EXECUTED | нет runner |
> | TC-UI-11-NETWORK-Q | сетевой объём ≤135% (M-10) | NOT EXECUTED | нет runner/DevTools |
> | TC-UI-12-Z9-PAN | pan на z9 без лагов | BLOCKED | нет runner + нет z9-тайлов |
> **v13 (2026-06-07).** Независимый перепрогон (tester re-run, свежий
> экземпляр). Состояние кода ET-013 неизменно с v2 (фича в `main`:
> `5be81f9` feat, `099669d` fix-whitelist; `git diff main...HEAD`
> затрагивает только docs — `12-review.md`, `13-test-report.md`). Прогон
> в venv `/tmp/et013-venv-r241` (project `requirements.txt` + pytest/
> pytest-asyncio/ruff). Review #19 — **APPROVED** (P0/P1 в коде нет).
>
> - **Окружение/health.** `curl` в песочнице недоступен (`command not
> found`) — probe через `python3 urllib`. `GET /enduro/api/health` →
> **200** (`{"status":"ok","db_path":"/app/data/centralfederal.sqlite",
> "db_exists":true}`).
> - **Полный авто-регресс** (`pytest tests/ --asyncio-mode=auto`) →
> **254 passed, 7 skipped, 4 deselected, 0 failed** (4.10 s). Регрессий
> ET-007/008/009/011/012 нет (AC-17).
> - **ET-013 unit+integration** → **23 passed / 7 skipped** (17 unit PASS
> [opacity/contrast stops + монотонность, `nearest`, регрессия z8=0.70,
> пик z9-z11≥0.80, обратная совместимость `applyTerrainLayer`, порог
> `zoom < 9` + отсутствие `< 10`, hint «Зум 9+», call-count, привязка
> paint+minzoom к слою] + 6 integration PASS [whitelist hypso/hillshade/
> tri, 404 на unknown-layer/missing-tile/invalid-zoom] + 7 integration
> SKIP — нет PNG-fixtures, AC-15/AC-16/AC-22 ✅).
> - **Lint** `ruff check .` → **All checks passed!** (exit 0, AC-18).
> - **Деплой ET-013 на test подтверждён:** `app.js` (len 132149) содержит
> `HILLSHADE_PAINT`/`TRI_PAINT`/`raster-contrast`/`'nearest'`/
> `opacityOrPaint`/`if (zoom < 9)`; **нет** `if (zoom < 10)`.
> `index.html` hint = «Зум 9+» (нет «Зум 10+»). Деплой корректно
> запрашивает z9 hillshade (AC-01 ✅).
> - `Cache-Control` существующего тайла (`tri/10/616/695`, ct `image/png`,
> 83705 B) = `max-age=31536000` → REQ-F-18 соблюдён (флаг
> `immutable`/`public` колеблется на nginx-edge между прогонами; P3,
> вне скоупа).
> - **❌ Pre-deploy probe AC-19 / REQ-F-20 §1 — повторно FAIL (P1):**
> hillshade **z9-тайлы отсутствуют** на test-среде. Канонические XYZ-probe
> из TRZ (`9/308/158`, `10/617/317`, `11/1234/635`) → все **404** (XYZ ≠
> TMS-схема среды). Скан по реальному TMS вокруг центра `[37.6, 54.5]`
> (grid 5×5): hillshade **z9 → 0/25 → 200** (все 404), **z8 → 0/25**; при
> этом hillshade **z10 → 20/25 → 200**, **z11 → 25/25 → 200**; TRI
> **z8/z9/z10/z11 → 25/25 → 200**. Слой hillshade по-прежнему начинается
> с z10. **PH-6 follow-up из v1..v12 так и не выполнен.**
> - **Следствие для UX:** на z9 включённые «Тени рельефа» дают пустой слой
> (тайлы 404) — видны только «Перепады» (TRI z9 есть). Нарушены AC-03
> («на карте видны тени рельефа» при z9) и AC-19 (z9/z10/z11 = 200).
> - **UI Playwright (TC-UI-01..12) — NOT EXECUTED:** `$UI_TEST_RUNNER`
> пуст, `/home/slin/tools/ui-test/run_tests.js` отсутствует,
> `playwright`/браузеры не установлены (`require('playwright')` → not
> found, нет `~/.cache/ms-playwright`). Визуальная приёмка AC-07..AC-13
> не выполнена (см. таблицу «Visual / UI тесты» ниже).
>
> **Вердикт — BLOCKED** по pre-deploy gate AC-19 (без изменений с v8..v12).
> `back-to:dev` **не требуется**: дефекта кода нет (Review #19 APPROVED,
> unit/integration/lint зелёные, деплой корректен). Блокер
> инфраструктурный — на test-среде не нарезаны z9-тайлы hillshade.
> Разблокировка = PH-6 follow-up (догенерить `data/terrain/hillshade/9/*`
> над ЦФО и задеплоить), затем повторный AC-19 + Playwright TC-UI-01..12
> в окружении с браузерами.
>
> ### Visual / UI тесты (v13)
>
> Раннер UI-тестов недоступен в песочнице (`$UI_TEST_RUNNER` пуст,
> `run_tests.js` отсутствует, `playwright` не установлен). Все
> check-visual — **NOT EXECUTED (BLOCKED)**. Дополнительно TC, завязанные
> на hillshade z9, заблокированы отсутствием тайлов (AC-19).
>
> | TC | Назначение | Вердикт | Причина |
> |---|---|---|---|
> | TC-UI-01-Z9 | hillshade доступен/виден на z9 | BLOCKED | нет runner + нет z9-тайлов hillshade |
> | TC-UI-02-Z8-REGRESS | TRI на z8 как до ET-013 | NOT EXECUTED | нет runner (TRI z8 тайлы есть) |
> | TC-UI-03-Z9-Q | читаемость перепадов z9 | BLOCKED | нет runner + нет z9-тайлов hillshade |
> | TC-UI-04-Z10-Q | читаемость z10 | NOT EXECUTED | нет runner (тайлы z10 есть) |
> | TC-UI-05-Z11-Q | читаемость z11 | NOT EXECUTED | нет runner (тайлы z11 есть) |
> | TC-UI-06-Z14-REGRESS | hillshade не перегрет z14 | NOT EXECUTED | нет runner |
> | TC-UI-07-Z9-MOBILE | mobile, hillshade z9 | BLOCKED | нет runner + нет z9-тайлов |
> | TC-UI-08-Z10-SAT-Q | спутник + hillshade z10 | NOT EXECUTED | нет runner |
> | TC-UI-09-Z10-DARK-Q | тёмная тема + hillshade z10 | NOT EXECUTED | нет runner |
> | TC-UI-10-PERSIST | localStorage переживает F5 | NOT EXECUTED | нет runner |
> | TC-UI-11-NETWORK-Q | сетевой объём ≤135% (M-10) | NOT EXECUTED | нет runner/DevTools |
> | TC-UI-12-Z9-PAN | pan на z9 без лагов | BLOCKED | нет runner + нет z9-тайлов |
> **v12 (2026-06-07).** Независимый перепрогон (tester re-run). Состояние
> кода ET-013 неизменно с v2 (фича в `main`: `5be81f9` feat, `099669d`
> fix-whitelist; последующие коммиты — только docs/review). Перепроверено
> в свежем venv `/tmp/et013-venv-r-new` (`--system-site-packages` +
> `src/api/requirements.txt` + `pytest`/`pytest-asyncio`/`ruff`):
> - **Окружение/health.** `curl` в песочнице недоступен (`command not found`) —
> probe через `python3 urllib`. `GET /enduro/api/health` → **200**
> (`{"status":"ok","db_path":"/app/data/centralfederal.sqlite","db_exists":true}`).
> - **Полный авто-регресс** (`make test` = `pytest tests/ --asyncio-mode=auto`)
> → **254 passed, 7 skipped, 4 deselected, 0 failed** (4.47 s). Регрессий
> ET-007/008/009/011/012 нет.
> - **ET-013 unit+integration** → **23 passed / 7 skipped** (17 unit PASS +
> 6 integration PASS [whitelist hypso/hillshade/tri, 404 на unknown-layer/
> missing-tile/invalid-zoom] + 7 integration SKIP — нет PNG-fixtures, AC-16).
> - **Lint** `ruff check .` → **All checks passed!** (exit 0, AC-18).
> - **Деплой ET-013 на test подтверждён:** `app.js` (len 132149) содержит
> `HILLSHADE_PAINT`/`TRI_PAINT`/`raster-contrast`/`'nearest'`/`opacityOrPaint`/
> `if (zoom < 9)`; **нет** `if (zoom < 10)`. `index.html` hint = «Зум 9+»
> (нет «Зум 10+»). Деплой корректно запрашивает z9 hillshade.
> - `Cache-Control` существующего тайла (`tri/10/618/697`) = `max-age=31536000`,
> ct `image/png` → REQ-F-18 соблюдён (флаг `immutable`/`public` колеблется на
> nginx-edge между прогонами; P3, вне скоупа).
> - **❌ Pre-deploy probe AC-19 / REQ-F-20 §1 — повторно FAIL (P1):**
> hillshade **z9-тайлы отсутствуют** на test-среде. Канонические XYZ-probe из
> TRZ (`9/308/158`, `10/617/317`, `11/1234/635`) → все **404** (XYZ ≠ TMS-схема
> среды). Скан по реальному TMS вокруг центра `[37.6, 54.5]`: hillshade
> **z9 grid 7×7 → 0/49 → 200** (все 404), z8 → 404; при этом hillshade
> **z10 grid 4×4 → 12/16 → 200** и **z11** (`1237/1395`) → **200**; TRI
> **z8/z9/z10/z11** (TMS) → **200**. Слой hillshade по-прежнему начинается с
> z10. **PH-6 follow-up из v1..v11 так и не выполнен.**
> - **Следствие для UX:** на z9 включённые «Тени рельефа» дают пустой слой
> (тайлы 404) — видны только «Перепады» (TRI z9 есть). Нарушены AC-03
> («на карте видны тени рельефа» при z9) и AC-19 (z9/z10/z11 = 200).
> - **UI Playwright (TC-UI-01..12) — NOT EXECUTED:** `$UI_TEST_RUNNER` пуст,
> `/home/slin/tools/ui-test/run_tests.js` отсутствует, `playwright`/браузеры
> не установлены (`require('playwright')` → not found, нет
> `~/.cache/ms-playwright`). Визуальная приёмка AC-07..AC-13 не выполнена.
>
> **Вердикт — BLOCKED** по pre-deploy gate AC-19 (без изменений с v8..v11).
> `back-to:dev` **не требуется**: дефекта кода нет (Review #18 APPROVED,
> unit/integration/lint зелёные, деплой корректен). Блокер инфраструктурный —
> на test-среде не нарезаны z9-тайлы hillshade. Разблокировка = PH-6 follow-up
> (догенерить `data/terrain/hillshade/9/*` над ЦФО и задеплоить), затем
> повторный AC-19 + Playwright TC-UI-01..12 в окружении с браузерами.
> **v11 (2026-06-06).** Независимый перепрогон после Review v15 (APPROVED,
> run_id=236). HEAD = `ac4140e reviewer(ET): auto-commit run_id=236`.
> С момента содержательных коммитов (`5be81f9` feat, `099669d` fix-whitelist)
> ни `src/`, ни `tests/` не менялись — `git diff main..HEAD -- src/ tests/`
> показывает только «удаления» из-за отставания ветки от `main` (фича уже
> смержена в `main`, который ушёл вперёд на ET-014/015). **Состояние кода
> ET-013 идентично v2..v10.** Перепроверено в свежем venv
> `/tmp/et013-venv-r237` (`--system-site-packages` + `requirements.txt` +
> `pytest`/`pytest-asyncio`/`ruff`):
> - **Окружение/health.** `curl` в песочнице недоступен (`command not found`),
> probe выполнены через `python3 urllib`. `GET /enduro/api/health` → **200**
> (`{"status":"ok","db_path":"/app/data/centralfederal.sqlite","db_exists":true}`).
> - **Полный авто-регресс** (`pytest tests/ --asyncio-mode=auto`) →
> **254 passed, 7 skipped, 4 deselected, 0 failed** (4.21 s). Регрессий
> ET-007/008/009/011/012 нет.
> - **ET-013 unit+integration** → **23 passed / 7 skipped** (17 unit PASS +
> 6 integration PASS [whitelist hypso/hillshade/tri, 404 на unknown-layer/
> missing-tile/invalid-zoom] + 7 integration SKIP — нет PNG-fixtures, AC-16).
> - **Lint** `ruff check src/api/` → **All checks passed!** (exit 0, AC-18).
> - **Деплой ET-013 на test подтверждён:** `app.js` (len 132149) содержит
> `HILLSHADE_PAINT`/`TRI_PAINT`/`raster-contrast`/`'nearest'`/`opacityOrPaint`/
> `if (zoom < 9)` и вызов `applyTerrainLayer('terrain-hillshade', …,
> HILLSHADE_PAINT, 9, 15)`; **нет** `if (zoom < 10)`; `index.html` hint =
> «Зум 9+» (нет «Зум 10+»). Деплой действительно запрашивает z9 hillshade.
> - `Cache-Control` существующего тайла (`tri/10/618/697`) =
> `max-age=31536000` → REQ-F-18 соблюдён (флаг `immutable`/`public` колеблется
> на nginx-edge между прогонами; P3, вне скоупа).
> - **❌ Pre-deploy probe AC-19 / REQ-F-20 §1 — повторно FAIL (P1):**
> hillshade **z9 тайлы отсутствуют** на test-среде. Канонические probe из
> TRZ (`9/308/158`, `10/617/317`, `11/1234/635`) → все 404 (XYZ-координаты не
> совпадают с TMS-покрытием test-среды). Скан по реальному TMS вокруг центра
> `[37.6, 54.5]`: hillshade **z9 grid 7×7 (центр 309/348) → 0/49 → 200**
> (все 404); hillshade z8 → 404. При этом hillshade **z10** (`618/697`) и
> **z11** (`1237/1395`) → **200**; TRI **z8/z9/z10/z11** (TMS) → **200**.
> Слой hillshade начинается с z10. **PH-6 follow-up из v1..v10 так и не
> выполнен** — z9-тайлы hillshade не нарезаны.
> - **Следствие для UX:** на z9 включённые «Тени рельефа» дают пустой слой
> (тайлы 404) — видны только «Перепады» (TRI z9 есть). Нарушены AC-03
> («на карте видны тени рельефа» при z9) и AC-19 (все три z9/z10/z11 = 200).
> - **UI Playwright (TC-UI-01..12) — NOT EXECUTED:** `$UI_TEST_RUNNER` пуст,
> `/home/slin/tools/ui-test/run_tests.js` отсутствует, `playwright`/браузеры
> не установлены (`require('playwright')` → not found, нет
> `~/.cache/ms-playwright`). Визуальная приёмка AC-07..AC-13 не выполнена.
>
> **Вердикт — BLOCKED** по pre-deploy gate AC-19 (без изменений с v8..v10).
> `back-to:dev` **не требуется**: дефекта кода нет (Review v15 APPROVED,
> unit/integration/lint зелёные, деплой корректен). Блокер инфраструктурный —
> на test-среде не нарезаны z9-тайлы hillshade. Разблокировка = PH-6 follow-up
> (догенерить `data/terrain/hillshade/9/*` над ЦФО и задеплоить), затем
> повторный AC-19 + Playwright TC-UI-01..12 в окружении с браузерами.
> **v10 (2026-06-06).** Независимый перепрогон после Review v14 (APPROVED).
> Состояние кода идентично v2..v9 (фича в `main`: `5be81f9` feat, `099669d`
> fix-whitelist; последующие коммиты — только docs). Перепроверено в свежем
> venv `/tmp/et013-venv` (`--system-site-packages` + `defusedxml`, `shapely`,
> `mapbox_vector_tile`, `lxml`, `ruff`):
> - Health `GET /enduro/api/health` → **200** (`{"status":"ok","db_exists":true}`).
> - **Полный авто-регресс** (`pytest tests/`) → **254 passed, 7 skipped,
> 4 deselected, 0 failed** (4.58 s). Регрессий ET-007/008/009/011/012 нет.
> - **ET-013 unit+integration** → **23 passed / 7 skipped** (17 unit PASS +
> 6 integration PASS [whitelist hypso/hillshade/tri, 404 на unknown-layer/
> missing-tile/invalid-zoom] + 7 integration SKIP — нет PNG-fixtures, AC-16).
> - **Lint** `ruff check src/api/` → **All checks passed!** (exit 0, AC-18).
> - **Деплой ET-013 на test подтверждён:** `app.js` (len 132172) содержит
> `HILLSHADE_PAINT`/`TRI_PAINT`/`raster-contrast`/`'nearest'`/`if (zoom < 9)`
> (и **нет** `if (zoom < 10)`); вызов hillshade = `applyTerrainLayer('terrain-hillshade',
> …, HILLSHADE_PAINT, 9, 15)`. Деплой действительно запрашивает z9 hillshade.
> - `Cache-Control` существующего тайла (`tri/10/618/697`) =
> `max-age=31536000, public, immutable` → REQ-F-18 соблюдён.
> - **❌ Pre-deploy probe AC-19 / REQ-F-20 §1 — повторно FAIL (P1):**
> hillshade **z9 тайлы отсутствуют** на test-среде. Скан окрестности
> тестового центра `[37.6, 54.5]` (TMS): `x∈[306..312] × y∈[345..352]` →
> **0/56 → 200** (все 404); hillshade z8 → 404. При этом hillshade **z10**
> (`618/697`) и **z11** (`1237/1395`) → **200**; TRI **z9/z10/z11**
> (`309/348`, `618/697`, `1237/1395`) → **200**. Слой hillshade начинается
> с z10. **PH-6 follow-up из v1..v9 так и не выполнен** — z9-тайлы hillshade
> не нарезаны.
> - **Следствие для UX:** на z9 включённые «Тени рельефа» дают пустой слой
> (тайлы 404) — видны только «Перепады» (TRI z9 есть). Нарушены AC-03
> («на карте видны тени рельефа» при z9) и AC-19 (все три z9/z10/z11 = 200).
> - **UI Playwright (TC-UI-01..12) — NOT EXECUTED:** `$UI_TEST_RUNNER` не задан,
> `/home/slin/tools/ui-test/run_tests.js` отсутствует, `playwright`/браузеры
> не установлены в песочнице (`require('playwright')` → not found,
> `~/.cache/ms-playwright` пуст). Визуальная приёмка AC-07..AC-13 не выполнена.
>
> **Вердикт — BLOCKED** по pre-deploy gate AC-19. `back-to:dev` **не требуется**:
> дефекта кода нет (Review v14 APPROVED, unit/integration/lint зелёные, деплой
> корректен). Блокер — инфраструктурный: на test-среде не нарезаны z9-тайлы
> hillshade. Разблокировка = PH-6 follow-up (догенерить `data/terrain/hillshade/9/*`
> над ЦФО и задеплоить), затем повторный прогон AC-19 + Playwright TC-UI-01..12.
> **v9 (2026-06-06).** Перепрогон после Review v13 (APPROVED, run_id=232).
> HEAD = `dd7e1bf reviewer(ET): auto-commit from reviewer run_id=232`.
> С момента содержательных коммитов (`5be81f9` feat, `099669d`
> fix-whitelist) ни `src/`, ни `tests/` не менялись — все последующие
> коммиты (reviewer run 230/232, tester run 229) только docs.
> **Состояние кода идентично v2..v8.** Независимо перепроверено в свежем
> venv `/tmp/et013venv` (deps из `src/api/requirements.txt` +
> `pytest`/`pytest-asyncio`/`ruff`):
> - Health `GET /enduro/api/health` → **200** (`{"status":"ok","db_exists":true}`).
> - Полный авто-регресс (`pytest tests/ --asyncio-mode=auto`) → **254 passed,
> 7 skipped, 4 deselected, 0 failed** (3.83 s). Регрессий
> ET-007/008/009/011/012 нет.
> - ET-013 unit+integration → **23 passed / 7 skipped** (17 unit + 6
> integration PASS + 7 integration SKIP; skip ожидаемы — нет PNG-fixtures,
> AC-16).
> - Lint `ruff check src/api/` → **All checks passed!** (exit 0, AC-18).
> - Деплой ET-013 на test подтверждён: `app.js` (len 132149) содержит
> `HILLSHADE_PAINT`/`TRI_PAINT`/`opacityOrPaint`/`raster-contrast`/
> `'nearest'`/`if (zoom < 9)` (и **нет** `if (zoom < 10)`); hint = «Зум 9+».
> - **❌ Pre-deploy probe AC-19 — повторно FAIL (P1):** hillshade z9 тайлы
> всё ещё **404** (`9/308/158`, `9/309/348`, `9/307/347` → 404; grid 5×5
> вокруг `(309,348)` → **0/25 → 200**; hillshade z8 → 404; стек начинается
> с z10). hillshade z10/z11 (TMS `618/697`, `1237/1395`) → **200**;
> TRI z8/z9/z10/z11 (TMS) → **200**. **PH-6 follow-up из v1..v8 так и не
> выполнен.**
> - UI Playwright (TC-UI-01..12) — снова **NOT EXECUTED**: `$UI_TEST_RUNNER`
> пуст, `/home/slin/tools/ui-test/run_tests.js` отсутствует,
> `playwright`/`npx` недоступны (node без playwright-модуля).
>
> Вердикт остаётся **BLOCKED** по pre-deploy gate AC-19. `back-to:dev`
> не требуется — дефекта кода нет (Review v13 APPROVED), блокер
> инфраструктурный (нет нарезанных z9-тайлов hillshade на test-среде).
> **v8 (2026-06-06).** Перепрогон после Review v11 (APPROVED, run_id=228).
> HEAD = `78f74db reviewer(ET): auto-commit from reviewer run_id=228`.
> `git diff 099669d..HEAD --stat -- src/ tests/` → **пусто**: с момента
> содержательных коммитов (`5be81f9` feat, `099669d` fix-whitelist) ни
> `src/`, ни `tests/` не менялись. **Состояние кода идентично v2..v7.**
> Независимо перепроверено (venv `/tmp/et013venv`, deps проекта):
> - Health `GET /enduro/api/health` → **200** (`{"status":"ok","db_exists":true}`).
> - Полный авто-регресс (`pytest tests/ --asyncio-mode=auto`) → **254 passed,
> 7 skipped, 4 deselected, 0 failed** (3.87 s). Регрессий
> ET-007/008/009/011/012 нет.
> - ET-013 unit+integration → **23 passed / 7 skipped** (17 unit + 6
> integration PASS + 7 integration SKIP; skip ожидаемы — нет PNG-fixtures,
> AC-16).
> - Lint `ruff check src/api/` → **All checks passed!** (exit 0, AC-18).
> - Деплой ET-013 на test подтверждён: `app.js` (len 132172) содержит
> `HILLSHADE_PAINT`/`TRI_PAINT`/`opacityOrPaint`/`raster-contrast`/
> `'nearest'`/`if (zoom < 9)` (и **нет** `if (zoom < 10)`); hint = «Зум 9+».
> - **❌ Pre-deploy probe AC-19 — повторно FAIL (P1):** hillshade z9 тайлы
> всё ещё **404** (`9/308/158`, `9/309/348` → 404; grid 5×5 вокруг
> `(309,348)` → **0/25 → 200**; 4 разнесённых точки z9 → **0/4**;
> hillshade z8 → 404; стек начинается с z10). hillshade z10/z11 (TMS
> `618/697`, `1237/1395`) → **200**; TRI z8/z9/z10/z11 (TMS) → **200**.
> **PH-6 follow-up из v1..v7 так и не выполнен.**
> - `Cache-Control` на test-среде снова `max-age=31536000, public, immutable`
> (флаг колеблется на nginx-edge между прогонами; функционально и формально
> REQ-F-18 соблюдён). P3, не в скоупе.
> - UI Playwright (TC-UI-01..12) — снова **NOT EXECUTED**: `$UI_TEST_RUNNER`
> пуст, `/home/slin/tools/ui-test/run_tests.js` отсутствует,
> `playwright`/`npx` недоступны (node без playwright-модуля).
>
> Вердикт остаётся **BLOCKED** по pre-deploy gate AC-19. `back-to:dev`
> не требуется — дефекта кода нет (Review v11 APPROVED), блокер
> инфраструктурный (нет нарезанных z9-тайлов hillshade на test-среде).
> **v7 (2026-06-06).** Перепрогон после Review v9 (APPROVED, run_id=224).
> HEAD = `7866174 reviewer(ET): auto-commit from reviewer run_id=224`.
> `git diff 099669d..HEAD --stat -- src/ tests/` → **пусто**: с момента
> содержательных коммитов (`5be81f9` feat, `099669d` fix-whitelist) в
> `src/`/`tests/` изменений нет. **Состояние кода идентично v2..v6.**
> Независимо перепроверено (venv `/tmp/et013venv`, deps проекта):
> - Health `GET /enduro/api/health` → **200** (`{"status":"ok","db_exists":true}`).
> - Полный авто-регресс (`pytest tests/ --asyncio-mode=auto`) → **254 passed,
> 7 skipped, 4 deselected, 0 failed** (4.29 s). Регрессий
> ET-007/008/009/011/012 нет.
> - ET-013 unit+integration → **23 passed / 7 skipped** (17 unit PASS +
> 6 integration PASS + 7 integration SKIP; skip ожидаемы — нет PNG-fixtures,
> AC-16).
> - Lint `ruff check src/api/` → **All checks passed!** (exit 0, AC-18).
> - Деплой ET-013 на test подтверждён: `app.js` (len 132149) содержит
> `HILLSHADE_PAINT`/`TRI_PAINT`/`opacityOrPaint`/`raster-contrast`/
> `'nearest'`/`if (zoom < 9)` (и **нет** `if (zoom < 10)`); hint = «Зум 9+».
> - **❌ Pre-deploy probe AC-19 — повторно FAIL (P1):** hillshade z9 тайлы
> всё ещё **404** (`9/309/348`, `9/308/158` → 404; grid 3×3 вокруг
> `(309,348)` → **0/9 → 200**; hillshade z8 → 404; стек начинается с z10).
> hillshade z10/z11 (TMS `618/697`, `1237/1395`) → **200**; TRI z8/z9/z10/z11
> (TMS) → **200**. **PH-6 follow-up из v1..v6 так и не выполнен.**
> - **Изменение со времён v6:** заголовок `Cache-Control` на test-среде снова
> `max-age=31536000` (без `immutable`) — флаг колеблется на nginx-edge
> между прогонами. Функционально (1 год кэша) достаточно; формально
> REQ-F-18/IT-TILE-CACHE-HEADER соблюдён на backend-уровне (integration
> `test_terrain_tile_cache_control_immutable`, корректно SKIP). Остаётся
> P3, не в скоупе ET-013.
> - UI Playwright (TC-UI-01..12) — снова **NOT EXECUTED**: `$UI_TEST_RUNNER`
> пуст, `/home/slin/tools/ui-test/run_tests.js` отсутствует,
> `playwright`/`npx` недоступны (node v22 без playwright-модуля).
>
> Вердикт остаётся **BLOCKED** по pre-deploy gate AC-19. `back-to:dev`
> не требуется — дефекта кода нет (Review v9 APPROVED), блокер
> инфраструктурный (нет нарезанных z9-тайлов hillshade на test-среде).
> **v6 (2026-06-06).** Перепрогон после Review v8 (APPROVED, run_id=222).
> HEAD = `4bb160d reviewer(ET): auto-commit from reviewer run_id=222`.
> `git diff 099669d..HEAD --stat -- src/ tests/` → **пусто**: с момента
> содержательных коммитов (`5be81f9` feat, `099669d` fix-whitelist) в
> `src/`/`tests/` изменений нет (всё после — docs-коммиты ревью/тестера).
> **Состояние кода идентично v2..v5 и не изменилось.** Независимо
> перепроверено в свежем venv `/tmp/et013venv` (deps из
> `src/api/requirements.txt` + `pytest`/`pytest-asyncio`/`ruff`):
> - Health `GET /enduro/api/health` → **200** (`{"status":"ok","db_exists":true}`).
> - Полный авто-регресс (`pytest tests/ --asyncio-mode=auto`) → **254 passed,
> 7 skipped, 4 deselected, 0 failed** (4.03 s). Регрессий
> ET-007/008/009/011/012 нет.
> - ET-013 unit+integration (`test_terrain_paint.py` + `test_terrain_z9_tiles.py`)
> → **23 passed / 7 skipped** (= 17 unit PASS + 6 integration PASS + 7
> integration SKIP; skip ожидаемы — нет PNG-fixtures в sandbox, AC-16).
> - Lint `ruff check src/api/` → **All checks passed!** (exit 0, AC-18).
> - Деплой ET-013 на test-среде подтверждён: `app.js` (len 132172) содержит
> `HILLSHADE_PAINT`/`TRI_PAINT`/`opacityOrPaint`/`raster-contrast`/
> `'nearest'`/`if (zoom < 9)` (и **нет** `if (zoom < 10)`); hint = «Зум 9+».
> - **❌ Pre-deploy probe AC-19 — повторно FAIL (P1):** hillshade z9 тайлы
> всё ещё **404** в обеих схемах (XYZ `9/309/163`, TMS `9/309/348`;
> канонический `9/308/158` → 404). Расширенный зонд: hillshade z9 по 6
> точкам ЦФО → **0/6 → 200**, grid 5×5 вокруг `(309,348)` → **0/25 → 200**;
> hillshade z8 → 404. hillshade z10/z11 (TMS `618/697`, `1237/1395`) →
> **200**; TRI z8/z9/z10/z11 (TMS) → **200**. PH-6 follow-up из v1..v5
> так и **не выполнен**.
> - **Изменение со времён v5:** заголовок `Cache-Control` на test-среде
> теперь содержит `immutable` (`max-age=31536000, public, immutable`) —
> ранее (v5) `immutable` стрипался nginx-проксей. **P3-02 более не
> воспроизводится** (REQ-F-18 / IT-TILE-CACHE-HEADER на edge-слое
> соблюдён). Понижаю P3-02 до «resolved».
> - UI Playwright (TC-UI-01..12) — снова **NOT EXECUTED**: раннера
> `/home/slin/tools/ui-test/run_tests.js` нет, `$UI_TEST_RUNNER` пуст,
> `playwright`/`npx` недоступны (`node v22` без playwright-модуля).
>
> Вердикт остаётся **BLOCKED** по pre-deploy gate AC-19. `back-to:dev`
> не требуется — дефекта кода нет (Review v8 APPROVED), блокер
> инфраструктурный (нет нарезанных z9-тайлов hillshade на test-среде).
> **v5 (2026-06-06).** Перепрогон после Review v7 (APPROVED, run_id=220).
> HEAD = `c9da18f reviewer(ET): auto-commit from reviewer run_id=220`.
> `git diff e948861..HEAD --stat -- src/ tests/` → **пусто**: с момента
> v3/v4 в коде/тестах изменений нет (только docs-коммиты ревью run 216/220
> и тестера run 217). **Состояние идентично v4 и не изменилось.** Повторно
> проверено независимо в свежем venv `/tmp/et013venv`:
> - Health `GET /enduro/api/health` → **200** (`{"status":"ok"}`).
> - Полный авто-регресс (`pytest tests/`) → **254 passed, 7 skipped,
> 4 deselected, 0 failed** (4.26 s). Регрессий ET-007/008/009/011/012 нет.
> - ET-013 unit (`test_terrain_paint.py`) → **17/17 PASS**.
> - ET-013 integration (`test_terrain_z9_tiles.py`) → **6 PASS / 7 SKIP**
> (skip ожидаемы: нет PNG-fixtures в sandbox, AC-16).
> - Lint `ruff check src/api/` → **All checks passed!** (exit 0, AC-18).
> - Деплой ET-013 на test-среде подтверждён: `app.js` содержит
> `HILLSHADE_PAINT`/`TRI_PAINT`/`opacityOrPaint`/`raster-contrast`/
> `'nearest'`/`if (zoom < 9)` (и **нет** `if (zoom < 10)`); hint = «Зум 9+».
> - **❌ Pre-deploy probe AC-19 — повторно FAIL (P1):** hillshade z9 тайлы
> всё ещё **404** (`/terrain/hillshade/9/309/{163,348}.png` → 404 в обеих
> схемах XYZ/TMS; канонический `9/308/158.png` → 404). z10/z11 hillshade
> (TMS) → **200**; TRI z5/z8/z9/z10/z11 → **200**. PH-6 follow-up из
> v1..v4 так и **не выполнен**.
> - UI Playwright (TC-UI-01..12) — снова **NOT EXECUTED**: раннера
> `/home/slin/tools/ui-test/run_tests.js` нет, `$UI_TEST_RUNNER` пуст,
> `npx`/playwright недоступны.
>
> Вердикт остаётся **BLOCKED** по pre-deploy gate AC-19. `back-to:dev`
> не требуется — дефекта кода нет, блокер инфраструктурный (нет нарезанных
> z9-тайлов на test-среде).
> **v4 (2026-06-06).** Перепрогон после Review v6 (APPROVED). HEAD =
> `89b83e3 reviewer(ET): auto-commit from reviewer run_id=216`.
> `git diff e948861..HEAD --stat -- src/ tests/` → **пусто**: с момента
> v3 в коде/тестах изменений нет (только docs-коммиты ревью run 215/216).
> **Состояние идентично v3 и не изменилось:** ET-013 выкатан на
> test-среду (`HILLSHADE_PAINT`/`TRI_PAINT`, hint «Зум 9+», `if (zoom < 9)`
> подтверждены в `/enduro/app.js`), но **hillshade z9-тайлы по-прежнему
> 404** (grid 5×5 вокруг `(309,348)` → 0/25 → 200; 6 точек ЦФО → 0/6;
> hillshade-стек начинается с z10). PH-6 follow-up из v1/v2/v3 так и
> **не выполнен**. Полный авто-регресс зелёный (**254 passed, 7 skipped,
> 4 deselected, 0 failed**), ET-013 unit 17/17 PASS, integration 6 PASS /
> 7 SKIP. UI Playwright — снова NOT EXECUTED (раннер `$UI_TEST_RUNNER`
> пуст, `/home/slin/tools/ui-test/run_tests.js` отсутствует, playwright
> не установлен). Вердикт остаётся **BLOCKED** по pre-deploy gate AC-19.
> `back-to:dev` не требуется — дефекта кода нет.
> **v3 (2026-06-06).** Перепрогон после Review v5 (APPROVED). HEAD =
> `e948861 reviewer(ET): auto-commit from reviewer run_id=214`. С момента
> v2 в коде/тестах изменений нет (только docs-коммиты ревью).
> **Состояние не изменилось:** ET-013 выкатан на test-среду
> (`HILLSHADE_PAINT`/`TRI_PAINT`, hint «Зум 9+», `if (zoom < 9)`), но
> **hillshade z9-тайлы по-прежнему 404** (grid 5×5 вокруг `(309,348)` под
> TMS → 0/25 → 200). PH-6 follow-up из v1/v2 так и **не выполнен**.
> Полный авто-регресс зелёный (**254 passed, 7 skipped, 0 failed**),
> ET-013 unit 17/17, integration 6 PASS / 7 SKIP. UI Playwright — снова
> NOT EXECUTED (раннер/Playwright в контейнере отсутствуют). Вердикт
> остаётся **BLOCKED** по тому же pre-deploy gate AC-19.
> **v2 (2026-06-06).** Перепрогон после Review v3 (APPROVED). Главное
> изменение со времён v1: **ET-013 уже выкатан на test-среду**. При этом
> hillshade z9 тайлы отсутствуют (404). Полный авто-регресс зелёный
> (254 passed). Вердикт **BLOCKED** по pre-deploy gate AC-19.
## TL;DR
- Линтер ✅ (см. примечание ниже), полный авто-регресс **254 passed,
7 skipped, 4 deselected, 0 failed** (в изолированном venv с
установленными зависимостями проекта). Регрессий ET-007/008/009/011/012
нет. ET-013 unit — 17/17 PASS, integration — 6 PASS / 7 SKIP (skip
ожидаемы: нет PNG-fixtures в sandbox).
- Код в ветке `feature/ET-013-z9-z11-z8` 1:1 соответствует TRZ
(REQ-F-01..F-21) и ADR-017 (подтверждено Review v3, **APPROVED**).
- **ET-013 развёрнут на test-среде** (изменение со времён v1):
`GET /enduro/app.js` содержит `HILLSHADE_PAINT`, `TRI_PAINT`,
`opacityOrPaint`, `raster-contrast`, `'nearest'`, `if (zoom < 9)`;
hint в DOM = «Зум 9+».
- **❌ Pre-deploy gate AC-19 — FAIL (P1):** на test-среде по-прежнему
отсутствуют тайлы `hillshade/9/*``hillshade/8/*`). Проверка по
координатам `[37.6, 54.5]` (юг МО / Кашира — основная зона UI-тестов):
`hillshade/z9/309/348.png → 404` (и весь grid 5×5 вокруг + 6 точек
ЦФО → 404). Тайлы `hillshade/z10`, `hillshade/z11`, `tri/z5..z12`
присутствуют (200 OK). **Так как ET-013 уже выкатан**, проблема из
гипотетической стала фактической: прямо сейчас на test-среде при
`setZoom(9)` чекбокс «Тени рельефа» активен, но MapLibre 404'нется
на каждом hillshade-запросе → пользователь видит включённый слой
**без теней** (хуже, чем до ET-013, где чекбокс был disabled с
честным hint'ом «Зум 10+»). На z10/z11 hillshade и TRI z9-z11 —
работают, т.е. ET-013 функционален везде, кроме «заглавного» z9
hillshade.
- **UI Playwright (TC-UI-01..12) — NOT EXECUTED:** раннер
(`$UI_TEST_RUNNER` пуст, `/home/slin/tools/ui-test/run_tests.js`
отсутствует) и `playwright`/`npx` недоступны в этом контейнере.
Визуальные TC должны выполниться оператором/Playwright после
устранения P1 (генерация z9-тайлов). См. §5.
**Вердикт: BLOCKED.** Реализация ET-013 в коде корректна и готова,
но деплой/закрытие остановлены по TRZ REQ-F-20 §1 и AC-19: «При 404 —
задача останавливается, тайлы z9 нужно догенерировать в рамках PH-6
follow-up». Следующий шаг — выполнить PH-6 follow-up
(«generate hillshade tiles z8-z9 для CFO») и после генерации тайлов
повторно прогнать pre-deploy probe + Playwright UI suite. **Это не
дефект кода ET-013 — `back-to:dev` для фронтенда не требуется.**
---
## 1. Окружение прогона (v3)
| Параметр | Значение |
|-------------------------|-------------------------------------------------------------------------|
| Ветка | `feature/ET-013-z9-z11-z8` |
| HEAD (v3) | `e948861 reviewer(ET): auto-commit from reviewer run_id=214` (со времён v2 — только docs-коммиты ревью; `src/`,`tests/` без изменений) |
| HEAD (v2) | `badd559 reviewer(ET): auto-commit from reviewer run_id=207` |
| Содержательные коммиты | `5be81f9 feat(terrain): zoom-aware paint для hillshade/TRI на z9-z11 (ET-013)`<br>`099669d fix(terrain): расширить whitelist endpoint'а на `tri` (ET-013 review F-1)` |
| Python | 3.12 (изолированный venv `/tmp/et013venv`) |
| Зависимости | `make`/`curl` в контейнере отсутствуют → pytest запущен напрямую (как в Makefile), HTTP — через `urllib.request`. В venv доустановлены `shapely`, `defusedxml`, `lxml`, `mapbox-vector-tile`, `pytest-asyncio` (по `src/api/requirements.txt`), что закрыло collection-ошибки v1. |
| Test-среда (HTTP) | https://openclaw.mva154.duckdns.org/enduro/ |
| Состояние test-среды | **ET-013 РАЗВЁРНУТ** (изменение со времён v1). `app.js` содержит `HILLSHADE_PAINT`/`TRI_PAINT`/`opacityOrPaint`/`raster-contrast`/`'nearest'`/`if (zoom < 9)`; hint = «Зум 9+». |
Сетевая проверка `/health`:
```
GET /enduro/api/health → 200
{"status":"ok","db_path":"/app/data/centralfederal.sqlite","db_exists":true}
```
Проверка факта деплоя ET-013 (`urllib` против test-среды):
```
GET /enduro/app.js → len=132149
HILLSHADE_PAINT : True TRI_PAINT : True
opacityOrPaint : True raster-contrast: True
'nearest' : True 'zoom < 9' : True
GET /enduro/ → hint #terrain-hillshade-hint = «Зум 9+»
```
---
## 2. Шаг 1 — линт
`make`/`ruff` в контейнере недоступны, отдельный прогон линта в v2 не
выполнялся. Линт-статус AC-18 опирается на Review v3 (APPROVED, код не
менялся с v1, где `ruff check src/api/` = «All checks passed!»). Код
`src/`/`tests/` идентичен ревью-одобренному (`git diff` от ревью —
только docs).
---
## 3. Шаг 2 — авто-регресс (целевой gate)
### 3.1 Полный прогон (`pytest tests/`)
В отличие от v1 (где sandbox не имел `lxml`/`shapely`/`defusedxml`/
`pytest-asyncio` и collection падал), в v2 собран изолированный venv
со всеми зависимостями `src/api/requirements.txt` + `pytest-asyncio`.
Полный прогон зелёный целиком:
```
cd src/api && python -m pytest ../../tests/ --asyncio-mode=auto
========== 254 passed, 7 skipped, 4 deselected, 23 warnings in 4.27s ==========
```
- `4 deselected` — perf/network маркеры (стандартный exclude).
- `7 skipped``test_terrain_tile_available_z9_z10_z11[*]` (×6) и
`test_terrain_tile_cache_control_immutable` — требуют PNG-fixtures в
`data/terrain/`, которых нет в sandbox. Skip — корректный механизм
(AC-16: «при отсутствии тайлов — skipped с reason»).
- **0 failed. Регрессий ET-007 / ET-008 / ET-009 / ET-011 / ET-012 — НЕТ.**
### 3.2 Прицельный прогон ET-013
```
python -m pytest tests/unit/test_terrain_paint.py \
tests/integration/test_terrain_z9_tiles.py --asyncio-mode=auto -v
=================== 17 passed (unit) · 6 passed + 7 skipped (integration) ===================
```
| Suite | Кейсов | PASS | SKIP | Покрытие AC |
|-----------------------------------------------|--------|------|------|----------------------------|
| `tests/unit/test_terrain_paint.py` | 17 | 17 | 0 | AC-01, AC-04, AC-05, AC-15, AC-22 |
| `tests/integration/test_terrain_z9_tiles.py` | 13 | 6 | 7 | AC-16 |
Что покрывают unit-тесты (выборка):
- `test_hillshade_paint_defined`, `test_hillshade_opacity_is_interpolate_by_zoom`,
`test_hillshade_opacity_stops`, `test_hillshade_contrast_peak_z9`,
`test_hillshade_resampling_nearest` — структура `HILLSHADE_PAINT`,
stops 9/10/11/12/14 → 0.65/0.60/0.55/0.50/0.40, contrast пик z9 ≥0.30 / z14 ≤0.10.
- `test_tri_paint_defined`, `test_tri_opacity_z8_regression` («8, 0.70»
ровно, защита AC-06), `test_tri_opacity_peak_z9_z11` (z10/z11 ≥ 0.80),
`test_tri_resampling_nearest`.
- `test_apply_terrain_layer_signature_uses_opacity_or_paint`,
`test_apply_terrain_layer_normalizes_number_to_legacy_paint`,
`test_apply_terrain_layer_uses_paint_variable` — обратная
совместимость `applyTerrainLayer` (AC-22).
- `test_minzoom_threshold_lowered_to_9` (`if (zoom < 9)` найден,
`< 10` отсутствует), `test_hint_text_updated_to_z9` («Зум 9+»),
`test_apply_terrain_layer_caller_count` (ровно 2 вызова),
`test_hillshade_call_uses_paint_constant_and_minzoom_9`,
`test_tri_call_uses_paint_constant_and_minzoom_5`.
Что покрывают integration-тесты:
- **PASS:** `test_known_terrain_layer_accepted_by_whitelist[hypso|hillshade|tri]`
(доказывает фикс F-1 review v1), `test_unknown_terrain_layer_returns_404`,
`test_missing_terrain_tile_returns_404`, `test_invalid_zoom_returns_404`.
- **SKIP:** `test_terrain_tile_available_z9_z10_z11[*]` ×6,
`test_terrain_tile_cache_control_immutable` — требуют PNG-fixtures
в `data/terrain/`, которых нет в sandbox-репо. Skip — корректный
механизм через `_maybe_skip`; AC-16 говорит «при отсутствии тайлов
в CI — тесты skipped с reason», что в точности и наблюдается.
**Результат:** ✅ PASS (AC-15, AC-16 в части автоматики, AC-17, AC-18).
---
## 4. Шаг 3 — E2E (контракт API на test-среде)
### 4.1 IT-TILE-* «вживую» против test-среды
Поскольку sandbox без data fixtures даёт SKIP, я выполнил эквивалент
IT-TILE-* напрямую HTTP-запросом (`urllib`) к test-среде. Координата
`[37.6, 54.5]` (юг МО / Кашира) — основная для UI-тестов (см.
04b-ui-test-cases.md §«Координаты»). Тайлы под TMS-схемой (как
объявлено в `addSource(... scheme: 'tms' ...)`):
| z | hillshade (x, y_tms) | hillshade status | tri (x, y_tms) | tri status |
|----|---------------------------|------------------|---------------------------|------------|
| 5 | `5/19/21` | **❌ 404** ² | `5/19/21` | ✅ 200 |
| 8 | `8/154/174` | **❌ 404** | `8/154/174` | ✅ 200 |
| 9 | `9/309/348` | **❌ 404** | `9/309/348` | ✅ 200 |
| 10 | `10/618/697` | ✅ 200 | `10/618/697` | ✅ 200 |
| 11 | `11/1237/1395` | ✅ 200 | `11/1237/1395` | ✅ 200 |
| 12 | `12/2475/2790` | ✅ 200 | `12/2475/2790` | ✅ 200 |
| 14 | `14/9903/11162` | ✅ 200 | `14/9903/11162` | ❌ 404 ¹ |
¹ TRI z=14 404 — за пределами TRI-стека (TRI генерится до z12 в
PH-6, регрессия известная, в скоупе ET-013 не трогается). Это **не**
новая регрессия ET-013, такое же поведение было до ET-013. Фиксирую
как P3 для PH-6 follow-up.
² hillshade на z5-z9 не сгенерирован вообще — hillshade-стек начинается
с z10. Это и есть корень P1: ET-013 объявляет hillshade c z9, но данных
ниже z10 нет.
Дополнительная проверка покрытия hillshade z=9 — 6 точек ЦФО
(`[37.6,54.5]`, `[37.6,55.7]`, `[38.6,54.0]`, `[36.0,55.0]`,
`[39.0,55.0]`, `[37.0,53.5]`) + grid 5×5 вокруг центра `(309, 348)`:
```
hillshade z=9 across 6 CFO points : 0/6 → все 404
hillshade z=9 grid 5×5 around (309,348) : 0/9 → все 404
```
То есть на z=9 нет ни одного hillshade-тайла, не только «целевого»;
данных просто нет в pipeline.
### 4.2 Заголовок Cache-Control
```
hillshade z=10 → Cache-Control: max-age=31536000
hillshade z=11 → Cache-Control: max-age=31536000
tri z=8 → Cache-Control: max-age=31536000
```
Только `max-age=31536000`; `immutable`-флаг **отсутствует** в ответах
nginx-перед-fastapi на test-среде. Это **предсуществующая** ситуация
(не введена ET-013): backend FastAPI отдаёт `Cache-Control: max-age=…,
immutable`, но nginx-конфиг на test-среде стрипает `immutable`. На
бизнес-логику это не влияет (`max-age=1y` достаточен), но формальная
формулировка REQ-F-18 / IT-TILE-CACHE-HEADER «immutable сохраняется»
выполняется только на backend-уровне (см. integration-тест
`test_terrain_tile_cache_control_immutable`, корректно SKIPPED здесь).
**Не блокер ET-013.** Фиксирую как P3 (известная инфра-косметика,
не в скоупе).
### 4.3 `/health` стабилен
См. раздел 1. ✅
---
## 5. Шаг 4 — UI / Visual тесты
### 5.1 Состояние раннера
```
$UI_TEST_RUNNER → (пусто)
ls /home/slin/tools/ui-test/ → No such file or directory
which playwright / npx → not found
node -e require.resolve(playwright)→ playwright NOT installed
find / -name run_tests.js -path *ui* → (нет результатов)
```
UI-test раннер, Playwright и `npx` в этом контейнере отсутствуют.
Запустить TC-UI-01..12 автоматически невозможно. `node v22.22.2`
присутствует, но без playwright-модуля и браузеров.
### 5.2 Состояние test-среды (ET-013 РАЗВЁРНУТ)
```
GET https://openclaw.mva154.duckdns.org/enduro/app.js
HILLSHADE_PAINT in body: True
TRI_PAINT in body: True
'if (zoom < 9)' in body: True
opacityOrPaint in body: True
GET /enduro/ → hint «Зум 9+»
```
В отличие от v1, на test-среде сейчас выкатан **код ET-013**. Поэтому
визуальные TC уже релевантны — но раннер недоступен (§5.1), а ключевой
для z9 контент (hillshade-тайлы) отсутствует (§4.1).
## Visual / UI тесты
Автоматический прогон визуальных кейсов в текущем контейнере не
выполнен (нет раннера/Playwright). Ниже — статус каждого TC с учётом
**фактического** состояния test-среды (ET-013 выкатан; hillshade z9 =
404; hillshade z10/z11 = 200; TRI z9-z11 = 200). Кейсы, зависящие от
hillshade z9, помечены FAIL по данным §4.1 — это не требует скриншота:
слой физически не имеет тайлов и отрисуется пустым.
| TC | Зум | Проверка | Вердикт | Обоснование |
|----|-----|----------|---------|-------------|
| TC-UI-01-Z9 | 9 | Чекбокс активен, hint скрыт, hillshade виден | **FAIL (P1)** | Чекбокс/hint — OK (код выкатан), но hillshade z9 = 404 → теней нет. AC-03 не выполнен. |
| TC-UI-02-Z8-REGRESS | 8 | TRI как до ET-013 | NOT RUN | Нужен скриншот+baseline (нет раннера). TRI z8 = 200, код paint совпадает (unit PASS). |
| TC-UI-03-Z9-Q | 9 | Перепады читаются ≥ z8 | **FAIL (P1)** | hillshade z9 = 404; читаемость z9 деградирована относительно ожидания AC-07. TRI z9 работает, но hillshade-компонента отсутствует. |
| TC-UI-04-Z10-Q | 10 | Перепады читаются | NOT RUN | Контент есть (hillshade+TRI z10 = 200); требует визуальной приёмки оператором. |
| TC-UI-05-Z11-Q | 11 | Перепады читаются | NOT RUN | Контент есть (z11 = 200); визуальная приёмка. |
| TC-UI-06-Z14-REGRESS | 14 | Hillshade не «перегрет» | NOT RUN | hillshade z14 = 200, paint-stops подтверждены unit-тестом (opacity 0.40 / contrast 0). |
| TC-UI-07-Z9-MOBILE | 9 | Mobile: чекбокс/hint, нет H-scroll | **FAIL (P1)** | Та же причина, что TC-UI-01: hillshade z9 = 404. |
| TC-UI-08-Z10-SAT-Q | 10 | Hillshade поверх спутника | NOT RUN | Контент z10 есть; визуальная приёмка. |
| TC-UI-09-Z10-DARK-Q | 10 | Hillshade на тёмной теме | NOT RUN | Контент z10 есть; визуальная приёмка. |
| TC-UI-10-PERSIST | 10 | F5 не теряет состояние | NOT RUN | Логика persistence не менялась (REQ-F-17); требует браузера. |
| TC-UI-11-NETWORK-Q | 8-11 | Σ traffic ≤ 135% baseline | NOT RUN | Требует DevTools Network + baseline. |
| TC-UI-12-Z9-PAN | 9 | Pan без «белых дыр» | NOT RUN | На z9 hillshade-слой и так пустой (404) → проверка теряет смысл до фикса P1. |
**Легенда:** FAIL — кейс провален по объективным данным (404-тайлы);
NOT RUN — не выполнен из-за отсутствия раннера/Playwright, требует
ручного/Playwright-прогона оператором после устранения P1. Результаты
приколоть к `14-deploy-log.md`.
---
## 6. Матрица Acceptance Criteria → Test
| AC | Покрытие | Результат |
|---------|-------------------------------------------------------------------------------------------|------------------------|
| AC-01 | `test_minzoom_threshold_lowered_to_9`, `test_hint_text_updated_to_z9` | ✅ PASS |
| AC-02 | DevTools на test-среде | ⏳ DEFER → deploy log |
| AC-03 | TC-UI-01-Z9 + видимость hillshade-слоя | **❌ FAIL** (z9-тайлы 404, среда выкатана) |
| AC-04 | `test_hillshade_opacity_is_interpolate_by_zoom`, `…contrast_peak_z9`, `…resampling_nearest` | ✅ PASS |
| AC-05 | `test_tri_opacity_z8_regression`, `test_tri_opacity_peak_z9_z11`, `…resampling_nearest` | ✅ PASS |
| AC-06 | `test_tri_opacity_z8_regression` (z8 = 0.70 ровно) + TC-UI-02-Z8-REGRESS | ✅ PASS (код) / ⏳ DEFER (visual) |
| AC-07 | TC-UI-03-Z9-Q | **❌ FAIL** (z9-тайлы 404, среда выкатана) |
| AC-08 | TC-UI-04-Z10-Q | ⏳ DEFER → deploy log |
| AC-09 | TC-UI-05-Z11-Q | ⏳ DEFER → deploy log |
| AC-10 | TC-UI-06-Z14-REGRESS | ⏳ DEFER → deploy log |
| AC-11 | TC-UI-09-Z10-DARK-Q | ⏳ DEFER → deploy log |
| AC-12 | TC-UI-08-Z10-SAT-Q | ⏳ DEFER → deploy log |
| AC-13 | TC-UI-07-Z9-MOBILE | **❌ FAIL** (z9-тайлы 404, среда выкатана) |
| AC-14 | TC-UI-10-PERSIST | ⏳ DEFER → deploy log |
| AC-15 | `pytest tests/unit/test_terrain_paint.py` — 17/17 | ✅ PASS |
| AC-16 | `pytest tests/integration/test_terrain_z9_tiles.py` — 6 pass / 7 skip (по плану) | ✅ PASS |
| AC-17 | Полный `pytest tests/`**254 passed, 7 skipped, 4 deselected, 0 failed** | ✅ PASS |
| AC-18 | Линт (Review v3, код не менялся) + полный `pytest` зелёный | ✅ PASS |
| AC-19 | Pre-deploy probe `.../hillshade/{9,10,11}/X/Y.png``hillshade/9` отдаёт **404** | **❌ FAIL (P1)** |
| AC-20 | Документация work item (см. §8) | ✅ PASS (12+ файлов) |
| AC-21 | TC-UI-11-NETWORK-Q (требует baseline + Playwright) | ⏳ DEFER → deploy log |
| AC-22 | `test_apply_terrain_layer_normalizes_number_to_legacy_paint` + `…uses_paint_variable` | ✅ PASS |
**Итого:** 11/22 AC закрыты авто-зелёные · 1 AC **FAIL (блокер P1,
AC-19)** · 3 AC **FAIL** (AC-03/07/13 — следствие AC-19: z9-тайлы 404)
· 7 AC делегированы Deployer-агенту (визуальная приёмка z10/z11/dark/
sat/persist/network).
---
## 7. Findings
### P0
Нет.
### P1
#### P1-01 — Pre-deploy gate AC-19: hillshade z=9 тайлы отсутствуют
**Где.** Test-среда `https://openclaw.mva154.duckdns.org/enduro/terrain/hillshade/9/*.png`.
**v3 re-confirm (2026-06-06).** Перепроверено повторно: `/api/health`
200; hillshade `z9/{308/158, 309/348, 307/347, 310/349}` → 404; grid 5×5
вокруг TMS `(309,348)` → 0/25 → 200; hillshade z10/z11 (TMS `618/697`,
`1237/1395`) → 200; TRI z5/z8/z9/z10/z11/z12 → 200. ET-013-код на test
по-прежнему выкатан (`HILLSHADE_PAINT`/`TRI_PAINT`/`zoom < 9`, hint
«Зум 9+»). **Изменений нет — блокер тот же.**
**Симптом.** Все запросы вида `GET /terrain/hillshade/9/X/Y.png`
`hillshade/5..8/…`) возвращают 404. Покрытие отсутствует на всю
изученную область юга МО / ЦФО (проверено 6 точками ЦФО + grid'ом 5×5
вокруг целевой плитки `(309, 348)` под TMS). hillshade-стек начинается
только с z10.
**Почему блокер (в v2 — уже фактический, не гипотетический).** ET-013
**уже выкатан** на test-среду:
- UI-минзум hillshade понижен до 9 → чекбокс «Тени рельефа» активен
на z=9;
- `source.minzoom` = 9 → MapLibre запрашивает `/terrain/hillshade/9/X/Y.png`;
- получает 404 → слой рисуется пустым **прямо сейчас**.
Пользователь видит **включённый** слой **без теней**. Это хуже, чем
до ET-013, где чекбокс был disabled с честным hint'ом «Зум 10+».
**Регрессия UX**, явно противоречащая AC-03 / AC-07 / AC-13 / BRD-цели
ET-013 («перепады читаются на z9-z11»). На z10/z11 hillshade и на
z9-z11 TRI — работают корректно (тайлы 200).
**Что делать.** TRZ REQ-F-20 §1 и AC-19 однозначно говорят:
> Если 404 — задача останавливается, тайлы z9 нужно догенерировать в
> рамках PH-6 follow-up.
Действия:
1. Открыть PH-6 follow-up: «Generate hillshade tiles z8-z9 for CFO
coverage» (как минимум область, покрываемая текущим
`data/terrain/hillshade/10..14/`).
2. После генерации повторно прогнать probe из §4.1.
3. После 200 OK на z=9 — повторный запуск Tester'а + переход на
Deployer.
**Severity = P1, не P0** только потому, что: (a) код ET-013 корректен
и proven unit/integration-тестами; (b) деградирован только z9 hillshade
— z10/z11 hillshade и z9-z11 TRI работают; (c) рабочий процесс PH-6
follow-up — стандартная процедура для такого класса проблем. Тем не
менее в v2 проблема **фактическая** (ET-013 уже на test), а не только
pre-deploy-гипотеза.
### P2
Нет.
### P3
#### P3-01 — TRI z=14 отдаёт 404 (предсуществующая регрессия PH-6, не в скоупе ET-013)
`GET .../tri/14/X/Y.png → 404` (TRI-стек заканчивается на z12).
ET-013 не трогает TRI pipeline, но при включённом TRI и z>12
пользователь видит пустой слой. Покрыть follow-up'ом «extend TRI
tiles to z14».
#### P3-02 — Cache-Control `immutable` стрипается nginx-проксей на test
Backend FastAPI отдаёт `max-age=31536000, immutable`, на проде через
nginx остаётся только `max-age=31536000`. Формально REQ-F-18 нарушен
на edge-слое, но `max-age=1y` функционально достаточен. Не в скоупе
ET-013.
#### P3-03 — `from __future__ import annotations` в unit-тесте не используется
`tests/unit/test_terrain_paint.py:15` — косметика (унаследовано из
review v2 F-5).
#### P3-04 — Комментарий в `HILLSHADE_PAINT` не учитывает MapLibre clamping ниже z9
`src/web/app.js:2728-2733` — унаследовано из review v2 F-3. Не блокер;
актуально только если UI-минзум hillshade когда-нибудь понизят до z<9.
---
## 8. Документация work item (AC-20)
```
docs/work-items/ET-013/
00-business-request.md ✅
01-brd.md ✅
02-trz.md ✅
03-acceptance-criteria.md ✅
04-test-plan.yaml ✅
04b-ui-test-cases.md ✅
06-adr/ADR-017-zoom-aware-terrain-paint.md ✅
07-infra-requirements.md ✅
08-data-requirements.md ✅
10-tech-risks.md ✅
12-review.md ✅
13-test-report.md ← этот файл
14-deploy-log.md ⏳ ожидается после устранения P1-01
```
---
## 9. Вердикт
**BLOCKED.** Реализация ET-013 в коде корректна:
- Полный авто-регресс зелёный: **254 passed, 7 skipped, 4 deselected,
0 failed**. ET-013 unit 17/17 PASS, integration 6 PASS / 7 SKIP
(ожидаемо без data fixtures). Регрессий ET-007/008/009/011/012 нет.
- Соответствие TRZ / ADR-017 — 1:1 (подтверждено Review v3, APPROVED).
- Контракт API на test-среде стабилен; ET-013-фронт корректно выкатан.
Однако **pre-deploy/acceptance gate AC-19 не пройден** (P1-01): на
test-среде отсутствуют тайлы `hillshade/z5..z9/*`. Поскольку ET-013
уже на test, это даёт **фактическую** UX-регрессию: AC-03/AC-07/AC-13
(z9 hillshade) — FAIL. Закрытие/полная приёмка остановлены согласно
TRZ REQ-F-20 §1 и BRD-приоритету «UX-regression > frontend-fix ready».
### Что должно произойти дальше
1. **Открыть/выполнить PH-6 follow-up:** «Generate hillshade tiles
z5..z9 for CFO coverage area» (≈ область, покрытая
`data/terrain/hillshade/10/`, расширенная вверх по zoom-иерархии).
В v1 этот follow-up был рекомендован, но **не выполнен** — тайлы
z9 по-прежнему 404.
2. **После генерации тайлов:**
- повторный пробинг по §4.1 — ячейки hillshade/tri × z=9..11 → 200;
- повторный запуск Tester'а (патч-версия отчёта);
- визуальная приёмка z9.
3. **Deployer / оператор (ручная Playwright-приёмка):**
- выполнить ручные шаги REQ-F-20 §2: открыть карту, `setZoom(9)`,
включить hillshade, скриншот → визуальная приёмка AC-03..AC-05;
- прогнать Playwright TC-UI-01..12 (приоритет P1: TC-UI-01, -03, -07;
плюс уже-исполнимые z10/z11/dark/sat/persist — TC-UI-04/05/06/08/09/10);
- замерить network-объём (TC-UI-11/AC-21) против baseline;
- зафиксировать всё в `14-deploy-log.md`.
4. **Если визуальная приёмка AC-07..AC-09 «перепады недостаточно
выразительны»** — корректировка stops в HILLSHADE_PAINT/TRI_PAINT
(калибровка, не баг — см. BRD §6).
### Что НЕ нужно делать
- **Не back-to:dev для ET-013-frontend.** Код ET-013 правильный, тесты
зелёные, ревью пройдено (v3 APPROVED). Правки в `src/web/app.js` /
`src/web/index.html` не требуются — это блокер данных PH-6, не кода.
- **Не закрывать ET-013 без устранения P1-01.** Текущее состояние test
даёт включённый, но пустой hillshade на z=9.
---
## 12. Изменения в v4 (относительно v3)
- **Перезапуск после Review v6 (APPROVED).** HEAD сдвинут
`e948861 → 89b83e3`, но `git diff e948861..HEAD --stat -- src/ tests/`
даёт **пусто** — новые коммиты (tester run 215, reviewer run 216) —
только docs. Код/тесты бит-в-бит совпадают с v3.
- **Окружение прогона:** `make`/`curl` в контейнере отсутствуют → pytest
запущен напрямую в изолированном venv `/tmp/et013venv` (deps:
`shapely`/`lxml`/`defusedxml`/`mapbox-vector-tile`/`pytest-asyncio`),
HTTP-зонд — через `urllib`.
- **Авто-регресс повторён:** `pytest tests/` → **254 passed, 7 skipped,
4 deselected, 0 failed** (3.98s). ET-013 unit **17/17 PASS**,
integration **6 PASS / 7 SKIP** (skip — нет PNG-fixtures в sandbox,
механизм по AC-16). Регрессий ET-007/008/009/011/012 нет.
- **Pre-deploy probe AC-19 повторён → результат идентичен v3:**
- `/api/health` → 200 (`db_exists: true`).
- `/enduro/app.js` содержит `HILLSHADE_PAINT`/`TRI_PAINT`/`opacityOrPaint`/
`raster-contrast`/`'nearest'`/`if (zoom < 9)` → ET-013 выкатан.
- `hillshade/9/308/158`, `hillshade/9/309/348`**404**;
grid 5×5 вокруг `(309,348)`**0/25 → 200**; 6 точек ЦФО → **0/6**;
`hillshade/5..8` → 404 (стек начинается с z10).
- `hillshade/10`, `hillshade/11` → 200; `tri/8`, `tri/9`, `tri/10`,
`tri/11` → 200.
- **PH-6 follow-up по нарезке hillshade z5..z9 так и не выполнен.**
- **UI Playwright** — снова NOT EXECUTED (раннер/Playwright недоступны).
Visual-таблица §5 и матрица AC §6 без изменений относительно v3.
- **Вердикт без изменений: BLOCKED** (AC-19, P1-01). `back-to:dev` не
требуется — код корректен (Review v6 APPROVED), это блокер данных PH-6.
## 11. Изменения в v3 (относительно v2)
- Перезапуск после Review v5 (APPROVED). HEAD сдвинут `badd559 → e948861`,
но это **только docs-коммиты ревью**`src/` и `tests/` бит-в-бит
совпадают с v2. Авто-регресс повторён: **254 passed, 7 skipped, 0 failed**;
ET-013 unit 17/17 PASS, integration 6 PASS / 7 SKIP.
- Pre-deploy probe AC-19 повторён → результат **идентичен v2**: hillshade
z9 отсутствует целиком (grid 5×5 → 0/25), z10/z11 работают, TRI z5-z12
работают. **PH-6 follow-up по нарезке z9-тайлов так и не выполнен.**
- UI Playwright — снова NOT EXECUTED (раннер `$UI_TEST_RUNNER` пуст,
`/home/slin/tools/ui-test/run_tests.js` отсутствует, playwright не
установлен).
- Вердикт без изменений: **BLOCKED** (AC-19, P1-01). `back-to:dev` не
требуется — дефекта кода нет.
## 10. Изменения в v2 (относительно v1)
- Полный авто-регресс теперь зелёный (254 passed) — в venv доустановлены
`shapely`/`defusedxml`/`lxml`/`mapbox-vector-tile`/`pytest-asyncio`,
чего не хватало в sandbox для v1 (collection-ошибки сняты).
- **test-среда теперь держит код ET-013** (в v1 — до-ET-013). Поэтому
AC-03/07/13 переведены из BLOCKED в **FAIL** (объективно проваливаются
на живой среде из-за 404-тайлов z9).
- Уточнены границы стеков: hillshade z10..z14 (200), TRI z5..z12 (200);
hillshade z5..z9 и TRI z13+ — отсутствуют.
- P1-01 остаётся открытым: PH-6 follow-up по z9-тайлам **не выполнен**
со времён v1.