feat(terrain): zoom-aware paint для hillshade/TRI на z9-z11 (ET-013) #26
Reference in New Issue
Block a user
Delete Branch "feature/ET-013-z9-z11-z8"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
HILLSHADE_PAINTиTRI_PAINT— zoom-aware MapLibreinterpolate-выражения по[zoom]. Пик читаемости на z9-z11, возврат к исходным значениям к z12-z14.applyTerrainLayerпринимает либоnumber(старый контракт), либоobjectpaint-properties — обратно-совместимо.style.json, конфиги — без изменений (ADR-017).Test plan
pytest tests/unit/test_terrain_paint.py— 17/17 PASS (UT-PAINT-, UT-PAINT-COMPAT-, UT-REG-MINZOOM-9, UT-REG-HINT-TEXT, UT-REG-CALLERS).pytest tests/unit/— 86/86 PASS, без регрессий.node --check src/web/app.js— синтаксис JS чистый.pytest tests/integration/test_terrain_z9_tiles.py(CI / Docker): IT-TILE-Z9/Z10/Z11, IT-TILE-INVALID-LAYER, IT-TILE-MISSING, IT-TILE-CACHE-HEADER.curl -sI .../terrain/hillshade/{9,10,11}/...png→ HTTP 200.14-deploy-log.md.13-test-report.md.Refs: ET-013
ADR: ADR-017
tri(ET-013 review F-1)Reviewer'ом найден pre-existing P1: backend `terrain_tile` whitelist не пропускал слой `tri`, хотя фронтенд (`onTerrainCheckbox`) шлёт запросы на `/terrain/tri/{z}/{x}/{y}.png` для слоя «Перепады высот». На test/prod-среде эти запросы перехватывает nginx (подтверждено эмпирически — 404 идёт с сигнатурой `nginx/1.18.0 (Ubuntu)`, а не с FastAPI JSON-detail), но в dev-режиме (`make dev` → FastAPI на :5556 напрямую) endpoint обязан поддерживать `tri` нативно. Изменения: - `src/api/main.py:1252`: whitelist `("hypso", "hillshade")` → `("hypso", "hillshade", "tri")`. Ответ-контракт и заголовки идентичны существующим слоям; REQ-F-18 «API contract без изменений» не нарушен (поведение для уже-известных layer'ов не меняется, добавляется только поддержка нового layer'а). - `tests/integration/test_terrain_z9_tiles.py`: новый параметризованный тест `test_known_terrain_layer_accepted_by_whitelist[hypso|hillshade|tri]`, фиксирующий регрессию F-1 (не требует локальных PNG-данных: для несуществующего файла ожидает `detail: "Tile not found"`, а не `"Unknown layer"`). - `tests/integration/test_terrain_z9_tiles.py`: параметризация `test_terrain_tile_available_z9_z10_z11` по `(layer × zoom)` — 6 кейсов вместо 3 (review F-2). - `tests/integration/test_terrain_z9_tiles.py`: убран неиспользуемый `from __future__ import annotations` (review F-4); type-аннотации упрощены (Python 3.10+ нативно). - `tests/integration/test_terrain_z9_tiles.py`: `test_unknown_terrain_layer_returns_404` усилен ассертом `detail == "Unknown layer"` (парность с whitelist-тестом). Тесты: 17/17 unit PASS, 6/6 non-data-зависимых integration PASS, 6 layer×zoom кейсов SKIPPED (нет PH-6 данных в sandbox — корректное поведение `_maybe_skip`). Refs: ET-013, review F-1/F-2/F-4 (`docs/work-items/ET-013/12-review.md`). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>