Files
enduro-trails/docs/work-items/ET-013/13-test-report.md
claude-bot c66d4fbde2
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 10s
CI / build (push) Successful in 2s
tester(ET): auto-commit from tester run_id=209
2026-06-06 21:39:20 +00:00

31 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 2 blocked BLOCKED 2026-06-04 2026-06-06
agent:tester
ET-007
PH-6.terrain
ADR-017

Test Report — ET-013

v2 (run_id текущий, 2026-06-06). Перепрогон после Review v3 (APPROVED). Главное изменение со времён v1: ET-013 уже выкатан на test-среду (app.js содержит HILLSHADE_PAINT/TRI_PAINT, hint = «Зум 9+», if (zoom < 9)). При этом hillshade z9 тайлы по-прежнему отсутствуют (404) — PH-6 follow-up из v1 не выполнен. Полный авто-регресс теперь зелёный целиком (254 passed) — в venv доустановлены shapely/defusedxml/lxml/pytest-asyncio, которых не хватало в sandbox в v1. Вердикт остаётся 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. Окружение прогона (v2)

Параметр Значение
Ветка feature/ET-013-z9-z11-z8
HEAD 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.

Симптом. Все запросы вида 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.

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.