8.0 KiB
type, work_item_id, verdict, version, created_at, updated_at, authors, related
| type | work_item_id | verdict | version | created_at | updated_at | authors | related | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| review | ET-013 | APPROVED | 16 | 2026-06-04 | 2026-06-06 |
|
|
Review ET-013 — Перепады высот на z9-z11 (re-run #16)
Re-run #16 (independent). Перечитаны TRZ (
02-trz.md), AC (03-acceptance-criteria.md), ADR-017, CLAUDE.md. Построчно сверена реализация в рабочем дереве с REQ-F-01..F-19 и решениями ADR-017.Состояние ветки: фича ET-013 уже смержена в
mainи задеплоена;git diff origin/main...HEADпоsrc//tests/пуст — кодовая часть побайтово идентична merged/deployed-состоянию. В ветке относительноmainотличаются только docs (12-review.md,13-test-report.md). Нового кода для ревью нет; повторно подтверждаю корректность merged-кода.Сверено по факту в этой итерации:
HILLSHADE_PAINT(app.js:2734-2752) — opacity 9:0.65→10:0.60→11:0.55→ 12:0.50→14:0.40; contrast 9:0.40→10:0.35→11:0.30→12:0.15→14:0.00;raster-resampling: 'nearest'. Точно по REQ-F-05/06/07 и решению 4 ADR-017.TRI_PAINT(app.js:2755-2768) — opacity z5:0.55, z7:0.65, z8:0.70 (регрессия), z9:0.80, пик z10-z11:0.85, спад z12:0.75, z15:0.70;nearest. Точно по REQ-F-08/09.applyTerrainLayer(app.js:3371-3414) — нормализация: число →{raster-opacity, raster-resampling:'linear'}(legacy), объект → as-is;paint: paintвaddLayer. Обратная совместимость соблюдена (REQ-F-04).onTerrainCheckboxвызовы (app.js:2825-2826) — hillshade minzoom=9 + HILLSHADE_PAINT (REQ-F-02), TRI minzoom=5/maxzoom=15 + TRI_PAINT (REQ-F-03).updateHillshadeAvailability(app.js:3425) —if (zoom < 9); старый< 10отсутствует (REQ-F-01/11).index.html:60— hint «Зум 9+» (REQ-F-10).terrain_tile(main.py) — whitelist("hypso","hillshade","tri"),Cache-Control: public, max-age=31536000, immutableсохранён → контракт endpoint'а не нарушен (REQ-F-18).- Unit-тесты перезапущены локально — 17/17 PASS (0.03 s).
Вердикт подтверждён повторно: APPROVED.
TL;DR
- Branch:
feature/ET-013-z9-z11-z8(фича уже вmain; в ветке — docs). - Содержательные коммиты: feat zoom-aware paint + fix whitelist
tri. - Scope: zoom-aware paint hillshade/TRI на z9-z11, понижение
UI-минзума hillshade z10→z9, обратно-совместимое расширение
applyTerrainLayer, расширение backend-whitelist наtri. - P0/P1 findings: нет.
- Вердикт: APPROVED.
Соответствие ТЗ (проверено по коду)
| REQ | Требование | Статус |
|---|---|---|
| F-01/11 | updateHillshadeAvailability: zoom < 9 (app.js:3425) |
✅ старый < 10 отсутствует |
| F-02 | hillshade minzoom=9, paint=HILLSHADE_PAINT (app.js:2825) | ✅ |
| F-03 | TRI minzoom=5/maxzoom=15, paint=TRI_PAINT (app.js:2826) | ✅ не тронут |
| F-04 | applyTerrainLayer(opacityOrPaint) (app.js:3371-3414) |
✅ number→legacy(linear) / object as-is |
| F-05/06/07 | HILLSHADE_PAINT opacity 9:0.65→14:0.40; contrast 9:0.40→14:0.00; nearest | ✅ stops точно по TRZ/ADR |
| F-08/09 | TRI_PAINT opacity z8=0.70, пик z9-z11=0.85, спад до 0.70; nearest | ✅ stops точно |
| F-10 | hint «Зум 9+» (index.html:60) | ✅ |
| F-12 | контракт onTerrainCheckbox, persistence localStorage, .active |
✅ без изменений |
| F-13/14 | unit-тесты (Вариант B, Python-парсер) + регрессии | ✅ 17 тестов, PASS |
| F-15 | integration smoke z9 (test_terrain_z9_tiles.py) с skipif |
✅ присутствует |
| F-18 | API контракт /terrain/{layer}/{z}/{x}/{y}.png, Cache-Control: immutable |
✅ сохранён |
| F-19 | style.json/style-dark.json/app.css/config не тронуты | ✅ diff чист |
Соответствие ADR-017
- Реализация точно следует P-A (frontend paint-калибровка): paint
zoom-aware через
interpolate ['linear'] ['zoom'], 0 перегенерации тайлов, 0 новых слоёв/источников. ✅ - O-B (linear-stops), C-A (contrast только hillshade), R-A (
nearestглобально), U-A (UI-порог z9), A-A (обратно-совместимая сигнатура), M-A (константы вapp.js) — все соблюдены. ✅ - Отклонённые «жирные» альтернативы (z-factor 2.5, raster-dem, theme-specific paint) корректно вынесены в follow-up. ✅
Findings
| # | Severity | Файл | Описание | Статус |
|---|---|---|---|---|
| F-1 | (resolved) | src/api/main.py |
Whitelist endpoint'а не включал tri → 404 в dev без nginx. |
Исправлено, документировано, покрыто integration-регрессией. |
| N-1 | P3 (info) | src/api/main.py |
TRZ §2 декларировал backend «без изменений», но фикс F-1 — необходимая корректная правка (TRI был latent-broken в dev). Контракт endpoint'а (URL, коды, Cache-Control) не нарушен → REQ-F-18 соблюдён. Не дефект. |
Принято. |
Качество кода
applyTerrainLayerрасширен обратно-совместимо; ветвлениеtypeof opacityOrPaint === 'number'собирает legacy-paint (raster-opacity+linear) либо пробрасывает object as-is. JSDoc на месте.HILLSHADE_PAINT/TRI_PAINTвынесены рядом сTERRAIN_BASE_URLс пояснением логики stops; конфигурируемость через env/config справедливо отвергнута (калибровка живёт в коде).- Дублирования, необработанных ошибок, мёртвого кода не выявлено.
Качество тестов
- Unit (17): opacity/contrast stops, монотонность,
nearest, регрессия z8=0.70, пик z9-z11≥0.80, обратная совместимостьapplyTerrainLayer, порогzoom < 9, текст hint, число call-site, привязка paint-константы и minzoom к каждому слою. 17/17 PASS локально (0.03 s). - Integration: TestClient против
src.api.main:app; тайло-зависимые кейсыskippedпри отсутствии PH-6 данных, whitelist/404-регрессии работают всегда.
Замечание по статусу тестирования (вне content-review)
Test Report фиксирует BLOCKED на AC-19/REQ-F-20 §1: на test-среде
отсутствуют нарезанные z9-тайлы hillshade (PH-6 data). Это инфраструктурный
дефект данных/деплоя, не дефект кода ET-013 — код корректно запрашивает
z9 hillshade, unit/integration/lint зелёные. Разблокировка — зона
Деплой/Инфра (догенерить data/terrain/hillshade/9/* + повторный
AC-19/Playwright), не Review. Кодовых P0/P1 не порождает.
Вердикт
Нет P0/P1. Реализация полностью соответствует TRZ и ADR-017, тесты адекватны и зелёные. APPROVED.