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

68 KiB
Raw Blame History

type, work_item_id, title, version, status, verdict, created_at, updated_at, authors, related, adr_refs
type work_item_id title version status verdict created_at updated_at authors related adr_refs
test-report ET-013 Test Report: Перепады высот на z9-z11 — zoom-aware paint 13 blocked BLOCKED 2026-06-04 2026-06-07
agent:tester
ET-007
PH-6.terrain
ADR-017

Test Report — ET-013

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/health200 ({"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+integration23 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/health200 ({"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+integration23 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/health200 ({"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+integration23 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/health200 ({"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+integration23 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/health200 ({"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/health200 ({"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/health200 ({"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/health200 ({"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/health200 ({"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)
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 skippedtest_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.pnghillshade/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.pnghillshade/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/348404; 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.