Skip to content

05. Матрица повторного аудита

Как читать статус

Допустимы только:

  • PASS — сценарий действительно выполнен, критерии соблюдены, evidence сохранён;
  • FAIL — сценарий выполнен, есть воспроизводимый defect и evidence;
  • BLOCKED — запуск невозможен из-за конкретного environment/fixture blocker;
  • NOT RUN — не запускался или был проверен только частично;
  • N/A — impossible by design — состояние запрещено FSM, с доказательством.

Нельзя превращать NOT RUN в PASS по сходству с соседним viewport или по статическому чтению кода.

Coverage tiers

TierЧто покрываетКогда обязателен
AВсе legal core modes × dark/light × mandatory screenshot viewportsФинальный release audit
BВсе overlays и transitions на desktop, phone portrait, phone landscapeПосле изменения interaction/layering
CPairwise basemap/color/input/motion/contrast/browser/data extremesФинальный release audit и рискованные visual changes
DDense machine geometry sweep без screenshot каждого sampleПосле responsive/overlay изменения

Mandatory viewports

IDSizeГлавный рискBaseline 2026-07-18
xs320×568минимальная ширина и короткая высотаtop width probe FAIL; полный state NOT RUN
sm360×800narrow modern phonetop width probe FAIL; полный state NOT RUN
phone390×844canonical phone portraittop/drawer probes FAIL; полный Tier A NOT RUN
phone-lg412×915large phonetop overlap probe FAIL; полный state NOT RUN
landscape844×390short mobile landscapeNOT RUN в canonical baseline
tablet-p768×1024breakpoint portraitexternal screenshots есть; canonical retest NOT RUN
tablet-l1024×768breakpoint landscapeNOT RUN
laptop-short1280×720bottom pressureNOT RUN
desktop1440×900canonical reviewcapture screenshots есть; full audit NOT RUN
desktop-hd1920×1080large desktopNOT RUN
wide2560×1440excessive spacingNOT RUN
short-stress1024×256WCAG short-height stressNOT RUN

Breakpoint-adjacent widths необходимо пересобрать через rg -n '@media'. Начальный seed:

text
559/560/561
639/640/641
679/680/681
767/768/769
1023/1024/1025
1199/1200/1201

Tier A — core state matrix

На старте все клетки ниже NOT RUN как полный Tier A scenario. Focused failure probe не доказывает остальные checks клетки.

ModeRequired checks
M01 Cold IDLEtoolbar, top-right, MapLibre controls, settings, Changelog, attribution, disabled clarity, отсутствие route stats collision
M02 DRAW one waypoint/loadingloading, partial route, duplicate-action states, marker/toolbar coexistence
M03 DRAW valid routeroute/waypoints, BottomBar, actions, save/export/plan-as-trip, undo/redo
M04 PROJECT_VIEWtimeline, aggregate layers, disabled toolbar contract, stage menus, BottomBar
M05 Project stage draw/editStage HUD, route edit, cancel/save, timeline exclusion
M06 Manual trip editorshell/map/top-right, close/unsaved safeguards, nested scroll, background isolation

Execution ledger template:

IDMode/stateEntry pathViewportThemeInputResultEvidenceNotes
A-M01-xs-darkM01cold /320×568darkfine+keyboardNOT RUNPhase 1 required
A-M01-phone-darkM01cold /390×844darkcoarseFAILgeometry JSONtop toolbar occludes MapLibre; not a full M01 audit
A-M03-phone-dark-loopM03 + Loopvalid route → Loop390×844darkcoarsePASSPlaywright testChangelog hidden, Generate Loop reachable and clickable. (Note: physical devices not tested)
A-M03-phone-dark-searchM03 + Searchvalid route → Search390×844darkcoarsePASSPlaywright testChangelog hidden, Reverse route direction reachable and clickable. (Note: physical devices not tested)

При полном прогоне создаётся отдельная строка для каждой комбинации M01–M06 × 11 mandatory viewports × dark/light; short-stress добавляется для panels/controls. Нельзя записывать одно общее «desktop PASS».

Tier B — interaction и transition ledger

Минимальные environments для каждого сценария: 1440×900, 390×844, 844×390; обе темы, если layout или color может отличаться.

Toolbar

IDScenarioCritical assertionsStatus
B-TB-01Routing profile open/navigate/select/closekeyboard arrows, name, focus return, no clippingNOT RUN
B-TB-02Route actions open/keyboard/dismissexpanded state, menu order, Escape topmost onlyNOT RUN
B-TB-03Surface → Gradient → Colorpressed state, label-in-name, no top overlapFAIL — name/geometry
B-TB-04Slope legend open/closetarget size, focus, tooltip/legend placementNOT RUN
B-TB-05Color tray + every swatchtarget spacing, selection, Escape/outside clickFAIL — target baseline
B-TB-06Undo/redo/reset confirmdisabled clarity, rapid activation, focus restoreNOT RUN
B-TB-07Save/Export/Import/Compare/Referencemode legality, layer stack, feedbackNOT RUN

Exclusive panels

IDScenarioCritical assertionsStatus
B-PN-01Search empty/loading/error/many resultsscroll endpoints, Reverse/reset reachablePARTIAL
B-PN-02Loop min/max/generate/preview/errorprimary CTA reachable, cancel/acceptPARTIAL
B-PN-03POI empty/many/create/edit/deleteedge placement, drawer actions, popup exclusivityNOT RUN
B-PN-04Rapid Search → Loop → POIexactly one panel, stable BottomBarNOT RUN
B-PN-05Dismiss by close/Escape/outsideonly topmost closes, focus restoresFAIL — Escape layering
B-PN-06Resize/orientation while openno stale offsets/hidden CTANOT RUN

Modals and feedback

IDScenarioCritical assertionsStatus
B-MD-01SaveModal open/Tab/Shift+Tabdialog naming, containment, inert backgroundFAIL
B-MD-02SaveModal Escapedialog only closes, panel retained, focus restoreFAIL
B-MD-03SaveModal submit/error/successvalidation, duplicate submit guard, toast visibleNOT RUN
B-MD-04ExportModal + toastmodal below toast, error visibleNOT RUN
B-MD-05Import collision choicesReference/Append/Replace/Cancel, focus, data safetyNOT RUN
B-MD-06Confirmation/Rename/Collection modalsshared dialog contractNOT RUN

Projects/manual trips/map anchoring

IDScenario groupCritical assertionsStatus
B-PR-01Project enter/exit, zero/one/many stagestimeline/HUD/layers/menu placementNOT RUN
B-PR-02Stage add/reorder/rename/edit/drawnested overlay ownership, save/cancelNOT RUN
B-TR-01Manual trip draft/day/legsnested scroll, background isolationNOT RUN
B-TR-02Add/import/draw/libraryempty/loading/error/list, focusNOT RUN
B-TR-03Unsaved close/before-unloadcancel/confirm/data preservationNOT RUN
B-MP-01Map settings/basemaps/terrainanchored layout and state persistenceNOT RUN
B-MP-02Context menu at center/edgescontainment, target access, exclusivitycapture test PASS, full matrix NOT RUN
B-MP-03POI/cue/route popup at edgesno toolbar/right/bottom collisionNOT RUN
B-MP-04Drag handles near edges/panelsedge pan and keyboard alternativeNOT RUN

Tier C — pairwise presentation plan

Не требуется полный Cartesian product. Pair selection должен покрыть риски:

Pair IDAxesSuggested state/viewportsStatus
C-01dark/light × standard/satelliteM03 at phone + desktopNOT RUN
C-02Surface/Gradient/Solid × busy basemapM03 phone/tabletNOT RUN
C-03fine/coarse × all target classesM01/M03 phone + desktoppartial FAIL
C-04normal/reduced motion × HUD/modal/dropdown/saveM03/M05 desktop + phoneNOT RUN
C-05normal/forced colorstoolbar/dialog/popupNOT RUN
C-06Chromium/Firefox/WebKitM01/M03 + critical transitionsChromium partial only
C-07default/200% zoom/text spacing overridepanels/dialogs/toolbarNOT RUN
C-08normal/long stringstoolbar/search/project/manual tripNOT RUN
C-09normal/extreme route+POI dataM03/M04/M06NOT RUN

Tier D — continuous geometry probes

Sweep

  • width 320–1920 с шагом 16px;
  • heights 256, 320, 390, 568, 667, 720, 768, 844, 900, 1024, 1080;
  • breakpoint-adjacent widths;
  • dark/light там, где geometry отличается;
  • fine/coarse там, где media query меняет hit target.

Собирать на каждом sample

  • document overflow;
  • viewport containment visible independent surfaces;
  • pairwise intersections toolbar/right controls/MapLibre/panels/drawers/BottomBar/Changelog;
  • hit target size и center spacing;
  • elementsFromPoint для occlusion;
  • zero-size visible controls;
  • reachable first/last internal scroll elements;
  • focused element, полностью скрытый fixed content.

Screenshot policy

Не сохранять тысячи одинаковых PNG. Сохранять:

  1. первый failing sample;
  2. каждый новый failure signature;
  3. ближайший PASS слева и справа от breakpoint/failure interval;
  4. canonical review viewports.

Cross-cutting quality gates

Geometry

  • независимые интерактивные поверхности не пересекаются;
  • intentional overlay документирован и не закрывает actionable content;
  • primary CTA и close control всегда достижимы;
  • page не получает неожиданный horizontal scroll.

Keyboard/modal

  • visible focus;
  • нет traps вне modal contract;
  • modal focus contained;
  • Escape закрывает только topmost;
  • focus возвращается к логичному opener;
  • background не actionable под modal/editor shell.

Accessibility

  • icon controls имеют accessible name;
  • visible label входит в accessible name;
  • groups/fields/dialogs именованы;
  • state отражён через pressed/expanded/selected;
  • target соответствует 24px AA либо документированному spacing exception; coarse product target проверяется отдельно;
  • contrast проверен по component states, а не одним global PASS.

Visual/theme

  • semantic surfaces используют tokens;
  • data/map/brand colors имеют явную категорию/allowlist;
  • route/waypoint читаемы на representative basemaps;
  • dark/light screenshots сравниваются с реальными baseline assertions для стабильных states.

Resilience

  • console/page errors записываются;
  • network fixtures детерминированы;
  • slow/error/offline states имеют recoverable UI;
  • rapid activation не создаёт duplicate actions;
  • theme/resize во время overlay не ломает state.

Evidence contract для финального отчёта

Каждая FAIL/BLOCKED строка должна содержать:

  • commit и environment;
  • exact state entry path;
  • viewport/theme/input;
  • expected/actual;
  • screenshot или trace;
  • geometry/accessibility raw output, если применимо;
  • test name/command;
  • issue ID из canonical ledger.

Каждая PASS строка должна ссылаться хотя бы на test report или screenshot artifact. Итоговые totals считаются автоматически из ledger, а не вводятся вручную — это предотвращает повторение ошибки 23/24 при восьми видимых FAIL.