Files
enduro-trails/docs/work-items/ET-013/03-acceptance-criteria.md
claude-bot 7df1ffe75c
All checks were successful
CI / lint (push) Successful in 4s
CI / test (push) Successful in 9s
CI / build (push) Successful in 2s
analyst(ET): auto-commit from analyst run_id=78
2026-06-04 09:28:51 +00:00

10 KiB
Raw Blame History

type, work_item_id, title, version, status, created_at, updated_at, authors
type work_item_id title version status created_at updated_at authors
acceptance-criteria ET-013 Acceptance Criteria: Перепады высот на z9-z11 1 draft 2026-06-04 2026-06-04
agent:analyst

Acceptance Criteria — ET-013

Критерии в Gherkin-стиле. Все обязательные. Задача считается принятой, когда каждый критерий прошёл проверку (автоматическую в CI или ручную в test-среде).

AC-01 — UI-минзум hillshade понижен до 9

Given ветка feature/ET-013-z9-z11-z8 после реализации When проверяется код Then:

  • В src/web/app.js функция updateHillshadeAvailability содержит if (zoom < 9) (а не < 10).
  • В src/web/index.html элемент #terrain-hillshade-hint содержит текст «Зум 9+» (а не «Зум 10+»).

AC-02 — Vector-source terrain-hillshade-source имеет minzoom=9

Given test-среда после деплоя ET-013, включены оба чекбокса слоёв рельефа When в DevTools выполнить

window._map.getSource('terrain-hillshade-source').minzoom

Then результат — 9.

AC-03 — При z=9 hillshade доступен и виден

Given пользователь на test-среде, центр карты над холмистым районом (например, юг Москвы / Ока: [37.6, 54.5]) When установить window._map.setZoom(9), открыть #terrain-popup, включить «Тени рельефа» Then:

  • #terrain-hillshade-cb имеет disabled === false.
  • #terrain-hillshade-hint имеет display: 'none'.
  • window._map.getLayoutProperty('terrain-hillshade', 'visibility') === 'visible'.
  • На карте видны тени рельефа.

AC-04 — Hillshade paint zoom-aware

Given включён hillshade на test-среде When в DevTools выполнить

const op = window._map.getPaintProperty('terrain-hillshade', 'raster-opacity');
const ct = window._map.getPaintProperty('terrain-hillshade', 'raster-contrast');
const rs = window._map.getPaintProperty('terrain-hillshade', 'raster-resampling');

Then:

  • Array.isArray(op) && op[0] === 'interpolate' (zoom-aware opacity).
  • Array.isArray(ct) && ct[0] === 'interpolate' (zoom-aware contrast).
  • rs === 'nearest'.

AC-05 — TRI paint zoom-aware

Given включён TRI на test-среде When в DevTools

const op = window._map.getPaintProperty('terrain-tri', 'raster-opacity');
const rs = window._map.getPaintProperty('terrain-tri', 'raster-resampling');

Then:

  • Array.isArray(op) && op[0] === 'interpolate'.
  • На z=8 эффективное значение ≈ 0.70 (регрессия).
  • На z=10 эффективное значение ≥ 0.80.
  • rs === 'nearest'.

AC-06 — Регрессия z8: TRI визуально как было

Given test-среда после деплоя When установить zoom = 8, включить ТОЛЬКО «Перепады» (без hillshade) Then:

  • Скриншот et013-z8-tri-regress.png не отличается визуально заметно от состояния до ET-013 (сравнение оператором).
  • Hillshade-слой не присутствует в стиле (!map.getLayer('terrain-hillshade')).

AC-07 — Качественная читаемость z9 (целевой критерий)

Given test-среда, центр над Окой / Кашира / Воробьёвы Горы When zoom = 9, включены оба слоя «Тени рельефа» и «Перепады» Then:

  • На скриншоте et013-z9-readable.png явно видны перепады высот: тени по склонам, цветные пятна TRI выделяют шероховатые зоны.
  • Оператор подтверждает: «перепады сопоставимы с z8 или лучше».
  • При отказе — корректировка stops в HILLSHADE_PAINT / TRI_PAINT.

AC-08 — Качественная читаемость z10

Given test-среда, аналогично AC-07 When zoom = 10 Then: то же, что AC-07.

AC-09 — Качественная читаемость z11

Given test-среда, аналогично AC-07 When zoom = 11 Then: то же, что AC-07.

AC-10 — Регрессия z14: hillshade не перегрет

Given test-среда When zoom = 14, включён hillshade Then:

  • Эффективные значения raster-opacity ≈ 0.40, raster-contrast ≈ 0.
  • Скриншот et013-z14-regress.png не темнее и не контрастнее, чем до ET-013.

AC-11 — Hillshade на тёмной теме читается

Given test-среда, theme-dark активна When zoom = 10, включён hillshade Then:

  • Тени видны, не сливаются с тёмной подложкой.
  • При отказе (тени «съедают» карту) — открыть ADR «theme-specific hillshade paint» и добавить отдельные stops для dark-theme (см. BRD R-2). В рамках MVP ET-013 это не обязательно, но фиксируется в 13-test-report.md.

AC-12 — Hillshade на спутниковой подложке не глушит снимок

Given test-среда, переключена подложка #base-btn-satellite When zoom = 10, включён hillshade Then:

  • На спутниковом снимке видны и детали поверхности (рельеф улавливается уже через тени снимка), и hillshade-оверлей.
  • Оверлей не превращает снимок в «серую плёнку».
  • Подтверждается оператором по TC-UI-08-Z10-SAT-Q.

AC-13 — Hillshade на мобильном (375×667)

Given Playwright mobile viewport, включён hillshade When zoom = 9 Then:

  • Тени видны, читаемы.
  • Чекбоксы и hint работают корректно.

AC-14 — Persistence не сломан

Given включены оба чекбокса When перезагрузить страницу (location.reload()) Then:

  • localStorage.getItem('terrain-hillshade') === '1'.
  • localStorage.getItem('terrain-tri') === '1'.
  • После загрузки слои восстановлены, на z=9 hillshade автоматически активен.

AC-15 — Unit-тесты paint-выражений зелёные

Given ветка When pytest tests/unit/test_terrain_paint.py -v Then все тесты проходят (UT-PAINT-, UT-REG-).

AC-16 — Integration smoke z9 тайлов

Given ветка, наличие данных в test-среде или CI fixture When pytest tests/integration/test_terrain_z9_tiles.py -v Then:

  • При наличии тайлов data/terrain/hillshade/9/* — тесты проходят: 200 на существующий тайл, 404 на невалидный zoom.
  • При отсутствии тайлов в CI — тесты skipped с reason.

AC-17 — Регрессионные тесты ET-007 / PH-6

Given ветка When pytest tests/unit/ tests/integration/ -v Then:

  • Все существующие тесты ET-007 (переключатель Схема/Спутник) и PH-6 проходят без регрессий.
  • Никакие тесты grandfather'ов не отвалились.

AC-18 — make lint и make test зелёные

Given ветка When make lint && make test Then exit-code 0 на обе команды.

AC-19 — Pre-deploy проверка наличия тайлов z9-z11

Given ветка готова к merge When на test-среде

curl -sI https://openclaw.mva154.duckdns.org/enduro/terrain/hillshade/9/308/158.png
curl -sI https://openclaw.mva154.duckdns.org/enduro/terrain/hillshade/10/617/317.png
curl -sI https://openclaw.mva154.duckdns.org/enduro/terrain/hillshade/11/1234/635.png

Then все три запроса возвращают HTTP 200. Если 404 на любой — merge приостанавливается, открывается PH-6 follow-up (догенерить тайлы).

AC-20 — Документация полная

Given репо после слияния ET-013 When проверка docs/work-items/ET-013/ Then существуют:

  • 00-business-request.md
  • 01-brd.md
  • 02-trz.md
  • 03-acceptance-criteria.md
  • 04-test-plan.yaml
  • 04b-ui-test-cases.md
  • 12-review.md (после Review)
  • 13-test-report.md (после Тестирования)
  • 14-deploy-log.md (после Деплоя)

AC-21 — Сетевая регрессия (M-10)

Given test-среда When сценарий: открыть карту, центр над Окой, выполнить zoom-последовательность z=8 → z=9 → z=10 → z=11 → z=10 → z=9 → z=8 с включёнными обоими слоями Then:

  • Суммарный network-traffic PNG-тайлов рельефа ≤ 135% от того же сценария до ET-013 (зафиксированного как baseline в 13-test-report.md).
  • Никаких сторонних запросов (например, 4xx или 5xx) не возникает.

AC-22 — Контракт applyTerrainLayer обратно-совместим

Given ветка When unit-тест UT-PAINT-COMPAT-01 Then:

  • Вызов applyTerrainLayer(id, url, true, 0.5, 8, 14) (старый контракт — число) собирает paint: { 'raster-opacity': 0.5, 'raster-resampling': 'linear' }.
  • Вызов с object'ом передаёт paint как есть.