Skip to content

04. Evidence и test baseline

Provenance

ПолеЗначение
Repository/Users/uladzislau/Documents/pets/bike-maps
Commitaabfa583cf3949ecfc5243e93071599244b4a85d
Commit subjectfix(web): enrich imported GPX surfaces
Дата/timezone2026-07-18, Asia/Tbilisi
Nodev24.17.0
pnpm9.0.0
Playwright package1.59.1
Browsersystem Google Chrome 150.0.7871.127 через channel chrome
App URL во время probeslocal Vite dev server
Основной probe viewport390×844; дополнительные widths 320/360/375/412

Dirty tree до и после baseline audit

До создания этой папки уже существовали пользовательские изменения:

text
 M apps/web/tests/manual-trip-editor.spec.ts
 M package.json
 M pnpm-lock.yaml
?? screenshot.ts
?? take_responsive_screenshots.cjs
?? take_responsive_screenshots.ts

Они не редактировались в рамках документирования. Новый diff должен состоять только из канонической папки docs/audits/main-map-2026-07/**, публикуемой копии raw JSON в docs/public/audits/main-map-2026-07/** и одной навигационной ссылки в docs/WIKI.md поверх указанного pre-existing dirty state.

Исходные отчёты

ИсточникSHA-256Состояние хранения
/Users/uladzislau/.codex/attachments/e71bb2b7-a213-4748-b963-35d8f39165ed/pasted-text.txt311f226ee7a7c507d0d25bb13f0fd695bea299cfc2eba4a4e81fd65fee43f9cbCodex attachment, вне repository
/Users/uladzislau/.codex/attachments/83d9b3d1-4c2e-46b0-99d5-3c7528f5738f/pasted-text.txt15c0729c6a58bcdc25c8e617096f91bfd6017741a60898826fbcb4a534e17aa1Codex attachment, вне repository
Expert UX & UI Heuristic Audit из user messageне применимосохранён по смыслу в reconciliation; отдельного файла attachment не было

Хэши позволяют проверить, что при будущей сверке читаются те же два вложения.

Выполненные test suites

Layout/toolbar baseline

bash
PLAYWRIGHT_BROWSER_CHANNEL=chrome \
  pnpm --dir apps/web test:e2e -- \
  tests/map-layout.spec.ts \
  tests/responsive-map-controls.spec.ts \
  tests/toolbar-fsm.spec.ts

Результат: 3 passed, 3.4s.

Интерпретация: существующие assertions зелёные, но не проверяют cross-surface overlap между toolbar и MapLibre и между Changelog и drawer actions. Поэтому PASS этого запуска совместим с подтверждёнными дефектами.

Screenshot capture/context-menu baseline

bash
PLAYWRIGHT_BROWSER_CHANNEL=chrome \
  pnpm --dir apps/web test:e2e -- \
  tests/visual-regression-audit.spec.ts \
  tests/visual-context-menu-overlap.spec.ts

Результат: 3 passed, 16.4s.

Интерпретация: specs успешно создали screenshots и выполнили interaction assertions. visual-regression-audit.spec.ts использует page.screenshot(), но не toHaveScreenshot()/image diff. Это capture PASS, а не доказательство отсутствия visual regressions. В console наблюдалось предупреждение об autocomplete у input; оно не было assertion failure и отдельно не расследовалось.

Что в этом baseline не запускалось

  • весь Playwright suite;
  • waypoint-interactions.spec.ts и заявленный strict-mode failure;
  • Firefox и WebKit;
  • axe-core/Lighthouse automated run с сохранённым raw report;
  • physical iOS/Android device;
  • полный Tier A–D audit matrix;
  • production backend/network/tile behavior;
  • screen reader VoiceOver/NVDA manual session.

Ни один из этих пунктов нельзя помечать PASS по умолчанию.

Runtime geometry — верхняя зона

Высота viewport во всех portrait измерениях — 844px.

WidthTop row rightПолностью внутриColor внутриПересечение с Zoom InКто сверху в центре Zoom
320388.7nono1108.4 px²toolbar Gradient child
360388.7nono1108.4 px²toolbar SVG child
375388.7nono1108.4 px²toolbar Color child
390388.7yes, почти без запасаyes1108.4 px²toolbar Color child
412388.7yesyes707.4 px²custom color button

Постоянные measured boxes:

  • top row: x=12, y=12, 376.7×32.6;
  • Color: x=321.4, y=15, 64.3×26.6;
  • Zoom In: 34×34, y=11, привязан справа (x = viewportWidth - 45).

Вывод: на 390px toolbar формально помещается, но занимает место MapLibre control. На 320–375px добавляется собственный containment failure top row. Из-за overflow: hidden документа page scrollWidth не раскрывает эту проблему; проверять нужно bounding boxes и hit-test.

Runtime geometry — нижние mobile collisions

Loop drawer

ElementBox
Changelogx=16, y=796, 32×32
Generatex=13, y=794, 364×37
Intersection1024 px²

Changelog полностью лежит внутри vertical/horizontal bounds Generate в своей области. Hit-test в центре Changelog возвращает его SVG descendant, то есть верхний control перехватывает interaction.

Search drawer

ElementBox
Changelogx=16, y=796, 32×32
Reversex=13, y=768, 93.1×32
Intersection128 px²

Это частичное пересечение верхней полосы Changelog с нижней полосой Reverse.

SaveModal semantics и focus

Accessibility tree содержит:

text
dialog "Save Track"
  heading "Save Track" level=2
  button "Close"
  textbox "Track name"
  textbox "Description"
  ...
  button "Cancel"
  button "Save"

Runtime facts:

ПроверкаРезультат
Dialog role/namePASS — dialog "Save Track"
aria-modalPASS — присутствует
Initial focusPASS — INPUT#track-name внутри dialog
Forward focus containmentFAIL — выход после 14 Tab transitions
Background inertFAIL по keyboard behavior
Escape topmost onlyFAIL — закрыты dialog и Route Builder
Focus restorationне подтверждено; должно войти в regression test

Accessibility tree и focus order

Route color group

text
group "Route color mode"
  text "Route color mode"
  button "Surface" pressed
  button "Color route by slope percentage": Gradient
  button "Select custom route line color": Color

Следствия:

  • group name существует; claim о missing legend/label опровергнут;
  • accessible name Gradient не содержит visible label Gradient; claim label-in-name подтверждён;
  • одновременно присутствуют aria-label и hidden legend, что может быть избыточно, но не является missing semantics.

Changelog

Accessibility snapshot:

text
button "What's New (Changelog)"

Имя получается из title; кнопка не безымянна. Явный aria-label допустим как robustness improvement, но не должен маскировать реально подтверждённые a11y issues.

Первые focus stops

  1. Map
  2. Zoom in
  3. Zoom out
  4. Drag to rotate map, click to reset north
  5. Toggle attribution
  6. MapLibre
  7. Routing profile
  8. Surface
  9. Color route by slope percentage
  10. Select custom route line color
  11. Close color selection
  12. Sunset Gold

Это подтверждает порядок, но не keyboard trap. Классификация — heuristic/efficiency issue до утверждения desired focus architecture.

Target sizes

Fine pointer baseline

Control groupMeasured hit box
Search/Loop/Save tools32×32
MapLibre navigation34×34
Library/Garage/Changelog32×32
Logout mobile icon24×24
Profile/Surface/Gradient/Colorоколо 26px по высоте
Color swatches16×16, gap около 4px

Coarse pointer baseline

ControlMeasured box
Search44×44
Loop44×44
Save44×44
Zoom In34×34
Routing profile104×26
Surface77×26.6
Gradient81.4×26.6
Color64.3×26.6
Library/Garage32×32
Logout24×24
Changelog32×32
Color swatch16×16

Примечание: tools row горизонтально scrollable; координата конкретного элемента за правой границей при одном scroll position не означает, что control навсегда недоступен. Таблица здесь используется для размера hit area, а не для containment verdict.

Contrast sample

Logout sample:

text
foreground: #939ab7
background: #585b70
contrast ratio: 2.40:1
required for normal text: 4.5:1

Это подтверждает конкретный failure, но не является полным contrast audit всей карты.

Static code evidence

Ключевые места на baseline commit:

  • apps/web/src/pages/map/MapPage.tsx — общий Escape handler; MapCanvas расположен в DOM до primary toolbar; raw color classes top-right/Changelog;
  • apps/web/src/pages/map/MapPage.module.css100vh, mobile offsets, bottom-left control;
  • apps/web/src/widgets/floating-toolbar/FloatingToolbar.tsx — корректно именованный fieldset и некорректное Gradient accessible name;
  • apps/web/src/widgets/floating-toolbar/FloatingToolbar.module.css — top row без wrap, scrollable tools row, target sizing, raw dropdown layer, infinite pulse;
  • apps/web/src/widgets/save-modal/SaveModal.tsx — dialog semantics и initial focus есть, containment/restore contract отсутствует;
  • apps/web/src/widgets/user-menu/UserMenu.module.css — Logout colors и mobile 24×24;
  • apps/web/src/widgets/floating-toolbar/ExportModal.module.css — overlay на --z-toast;
  • apps/web/src/widgets/project-stage-hud/ProjectStageHUD.module.css — raw z-index: 1000;
  • apps/web/src/widgets/map-canvas/ui/MapPopups.module.css — raw 950/1100, small controls и raw overlay;
  • apps/web/src/styles/tokens.css — текущая z scale и theme colors.

Raw literal scanner

Запуск audit_color_literals.py для apps/web/src относительно tokens.css дал:

  • 30 colors в token source;
  • 455 known-token-value literals вне token source;
  • 226 unknown literals.

Эти числа — search candidates, а не 681 автоматически валидный defect. Требуются категории исключений: map/data ramps, third-party/brand, SVG/generated assets, comments/tests и semantic one-offs.

Screenshot inventory

Current Playwright output в repository worktree

Capture folders:

  • apps/web/test-results/visual-regression-audit-Au-23d64-capture-desktop-screenshots-chromium/ — 8 desktop PNG;
  • apps/web/test-results/visual-regression-audit-Au-84f68--capture-mobile-screenshots-chromium/ — 5 mobile PNG;
  • apps/web/test-results/visual-context-menu-overla-3bdc2-u-and-map-popup-exclusivity-chromium/ — before/after PNG.

test-results обычно временный и может быть очищен следующим run; эти файлы не являются долговременным versioned evidence.

Внешний evidence отчёта B

Папка существует:

text
/Users/uladzislau/.gemini/antigravity/brain/ed0b3a96-41da-4a50-b389-b18da64f9463/

В ней 24 PNG: desktop/tablet/mobile × dark/light × idle/draw/loop/search. Это наиболее полная историческая screenshot matrix, но она находится вне repo.

Внешний evidence отчёта C

Существуют три PNG:

text
/Users/uladzislau/.gemini/antigravity/brain/bee2445c-be43-4f05-bbbb-3a3c5dcf840b/desktop-layout.png
/Users/uladzislau/.gemini/antigravity/brain/bee2445c-be43-4f05-bbbb-3a3c5dcf840b/search-panel.png
/Users/uladzislau/.gemini/antigravity/brain/bee2445c-be43-4f05-bbbb-3a3c5dcf840b/poi-action.png

Они также вне repository. Перед очисткой .gemini важные before/after screenshots следует скопировать в согласованное versioned или artifact storage; в этой документальной фазе копирование не выполнялось.

Ограничения и уровень уверенности

ОбластьУверенностьОграничение
Mobile top collisionвысокаяChromium emulation; не physical device
Drawer/Changelog collisionвысокаяТочная geometry и hit-test на 390×844
SaveModal focus/EscapeвысокаяDirect keyboard probe и accessibility tree
Gradient semanticsвысокаяCurrent accessibility snapshot
Logout contrastвысокая для одного stateНе весь component state/theme matrix
Safe-area/dynamic chromeсредняяStatic evidence; нужен real Safari/Android
Reduced motionсредняя-высокаяStatic styles; полный runtime inventory не выполнен
Z-index conflictsсредняяScale violation есть; pairwise runtime collisions не все проверены
Full release readinessнеполнаяПолный Tier A–D, browsers и real device не прогнаны

Машиночитаемая версия ключевых runtime измерений: geometry-baseline.json. Source-файл находится в docs/public/audits/main-map-2026-07/evidence/, чтобы VitePress публиковал JSON без преобразования.