feat(terrain): zoom-aware paint для hillshade/TRI на z9-z11 (ET-013) #26

Merged
admin merged 8 commits from feature/ET-013-z9-z11-z8 into main 2026-06-04 13:10:55 +03:00
Owner

Summary

  • Понижаем UI-минзум hillshade с 10 до 9 (HTML hint обновлён, source.minzoom=9).
  • HILLSHADE_PAINT и TRI_PAINT — zoom-aware MapLibre interpolate-выражения по [zoom]. Пик читаемости на z9-z11, возврат к исходным значениям к z12-z14.
  • applyTerrainLayer принимает либо number (старый контракт), либо object paint-properties — обратно-совместимо.
  • TRI на z8 остаётся 0.70 (регрессия AC-06), hillshade на z14 — 0.40 / contrast 0 (регрессия AC-10).
  • Backend, тайлы на диске, 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.
  • Pre-deploy E2E-PRE-DEPLOY-01: curl -sI .../terrain/hillshade/{9,10,11}/...png → HTTP 200.
  • E2E-DEPLOY-01..07 (test-среда после деплоя) — фиксируется в 14-deploy-log.md.
  • Playwright UI TC-UI-01..TC-UI-10 — после деплоя, фиксируется в 13-test-report.md.

Refs: ET-013
ADR: ADR-017

## Summary - Понижаем UI-минзум hillshade с 10 до 9 (HTML hint обновлён, source.minzoom=9). - `HILLSHADE_PAINT` и `TRI_PAINT` — zoom-aware MapLibre `interpolate`-выражения по `[zoom]`. Пик читаемости на z9-z11, возврат к исходным значениям к z12-z14. - `applyTerrainLayer` принимает либо `number` (старый контракт), либо `object` paint-properties — обратно-совместимо. - TRI на z8 остаётся 0.70 (регрессия AC-06), hillshade на z14 — 0.40 / contrast 0 (регрессия AC-10). - Backend, тайлы на диске, `style.json`, конфиги — без изменений (ADR-017). ## Test plan - [x] `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). - [x] `pytest tests/unit/` — 86/86 PASS, без регрессий. - [x] `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. - [ ] Pre-deploy E2E-PRE-DEPLOY-01: `curl -sI .../terrain/hillshade/{9,10,11}/...png` → HTTP 200. - [ ] E2E-DEPLOY-01..07 (test-среда после деплоя) — фиксируется в `14-deploy-log.md`. - [ ] Playwright UI TC-UI-01..TC-UI-10 — после деплоя, фиксируется в `13-test-report.md`. Refs: ET-013 ADR: ADR-017
admin added 4 commits 2026-06-04 12:46:28 +03:00
docs: init ET-013 business request
All checks were successful
CI / lint (push) Successful in 5s
CI / test (push) Successful in 9s
CI / build (push) Successful in 2s
010b1e72f5
analyst(ET): auto-commit from analyst run_id=78
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 9s
CI / build (push) Successful in 2s
7df1ffe75c
architect(ET): auto-commit from architect run_id=79
Some checks failed
CI / lint (push) Successful in 5s
CI / test (push) Failing after 5s
CI / build (push) Has been skipped
6b88bcee28
feat(terrain): zoom-aware paint для hillshade/TRI на z9-z11 (ET-013)
All checks were successful
CI / lint (push) Successful in 5s
CI / test (push) Successful in 9s
CI / build (push) Successful in 2s
CI / lint (pull_request) Successful in 4s
CI / test (pull_request) Successful in 9s
CI / build (pull_request) Successful in 2s
5be81f97a5
Понижаем UI-минзум hillshade с 10 до 9 и переводим raster-paint
обоих terrain-слоёв в zoom-aware форму через MapLibre interpolate.
На z9-z11 — пик opacity/contrast, чтобы рельеф читался как на z8;
на z12-z14 — возврат к исходным значениям (регрессия по AC-10).
TRI на z8 остаётся 0.70 (регрессия по AC-06), пик 0.80-0.85 на z9-z11.

Изменения:
- src/web/app.js: добавлены HILLSHADE_PAINT и TRI_PAINT; applyTerrainLayer
  расширена для поддержки object-paint (обратно-совместимо); порог
  updateHillshadeAvailability понижен до 9; вызовы для hillshade переведены
  на minzoom=9.
- src/web/index.html: hint обновлён с «Зум 10+» на «Зум 9+».
- tests/unit/test_terrain_paint.py: 17 тестов покрытия zoom-stops, контракта
  applyTerrainLayer и регрессий (UT-PAINT-*, UT-REG-*).
- tests/integration/test_terrain_z9_tiles.py: smoke /terrain endpoint на
  z9-z11 + кэш-заголовки (IT-TILE-*).

Backend, тайлы на диске, конфиги, стили — без изменений.

Refs: ET-013
ADR: ADR-017

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
admin added 1 commit 2026-06-04 12:54:24 +03:00
reviewer(ET): auto-commit from reviewer run_id=82
All checks were successful
CI / lint (push) Successful in 4s
CI / lint (pull_request) Successful in 4s
CI / test (push) Successful in 10s
CI / build (push) Successful in 3s
CI / test (pull_request) Successful in 10s
CI / build (pull_request) Successful in 2s
f6fc9be324
admin added 1 commit 2026-06-04 12:59:56 +03:00
fix(terrain): расширить whitelist endpoint'а на tri (ET-013 review F-1)
All checks were successful
CI / lint (push) Successful in 5s
CI / lint (pull_request) Successful in 5s
CI / test (push) Successful in 11s
CI / build (push) Successful in 3s
CI / test (pull_request) Successful in 10s
CI / build (pull_request) Successful in 2s
099669deeb
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>
admin added 1 commit 2026-06-04 13:02:58 +03:00
reviewer(ET): auto-commit from reviewer run_id=84
All checks were successful
CI / lint (push) Successful in 4s
CI / lint (pull_request) Successful in 4s
CI / test (push) Successful in 10s
CI / build (push) Successful in 2s
CI / test (pull_request) Successful in 9s
CI / build (pull_request) Successful in 2s
397dc60822
admin added 1 commit 2026-06-04 13:10:27 +03:00
tester(ET): auto-commit from tester run_id=85
All checks were successful
CI / lint (push) Successful in 4s
CI / lint (pull_request) Successful in 4s
CI / test (push) Successful in 10s
CI / build (push) Successful in 2s
CI / test (pull_request) Successful in 9s
CI / build (pull_request) Successful in 2s
316bb0d1a6
admin merged commit be7a0524f9 into main 2026-06-04 13:10:55 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/enduro-trails#26