Смотровая — визуальный стенд сценариев: продукт смотрится глазами, а не тестами. Стенд гоняет реальное приложение по сценариям и раскладывает снимки в ленту; человек листает ленту и отдаёт агенту адрес шага, а не место в коде. Владеет различением стенд ⊥ Смотровая, контрактом кадра, девятью инвариантами прогона и экономикой снимка (дешёвый ⊥ дорогой). Активируется на: «смотровая», «стенд сценариев», «прогнать сценарии», «посмотреть глазами что получилось», «разбери ленту снимков», «почему сни...
Scanned 9/5/2026
Install to Claude Code
npx -y skills add noxxer/core-team --skill smotrovaya --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Smotrovaya?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/noxxer-smotrovaya)More formats (shields.io, HTML) on the badges page.
---
name: smotrovaya
description: >
Смотровая — визуальный стенд сценариев: продукт смотрится глазами, а не тестами.
Стенд гоняет реальное приложение по сценариям и раскладывает снимки в ленту;
человек листает ленту и отдаёт агенту адрес шага, а не место в коде. Владеет
различением стенд ⊥ Смотровая, контрактом кадра, девятью инвариантами прогона и
экономикой снимка (дешёвый ⊥ дорогой). Активируется на: «смотровая», «стенд
сценариев», «прогнать сценарии», «посмотреть глазами что получилось», «разбери
ленту снимков», «почему снимок не снялся», «дубль снимка», «лента врёт», «visual
deck», «screenshot deck», «scenario verification», «прогон стенда», «карта
продукта по экранам», «что на экране на самом деле».
---
# Смотровая — продукт смотрится глазами
**Зелёные тесты не значат, что человек видит правду.** Стенд, зелёный на 183 шагах из
183, дефекты экранов не фиксирует по построению: он проверяет, что шаг **дошёл**, а не
что на экране **правда**. Смотровая — прибор для второго вопроса.
Замер, ради которого этот навык существует: разбор 183 снимков глазами дал **восемь корней
дефектов**, из них три — один класс («величина ехала по ненадёжному ключу»), и один из них
печатал ТТГ под именем «Т4 свободный» на зелёной спокойной карточке. Тихий отказ, который
не видит ни один тест, потому что тест сверяет с той же неправдой.
## Различение, с которого всё начинается
> **Стенд** — механизм, который снимает. **Смотровая** — место, где смотрят.
Разводить их обязательно: «стенд упал» и «на Смотровой видно» — про разные вещи, и
слипание этих слов прячет ровно тот случай, когда стенд зелёный, а продукт врёт.
## Место в контуре: сбоку, а не снизу
Смотровая — **прибор проверки слоя сценариев**, а не слой под кодом. Внизу код;
Смотровая предъявляет доказательство, что **сценарий** проходится. Поставив её под кодом,
подразумеваешь «код → кадр», а на деле «сценарий → кадр», и код — лишь одна из причин,
по которым снимок может не сняться (данные, внешний вебхук, чужой коммит посреди прогона).
Следствие: **сценарий считается живым, когда у всех его шагов есть свежий кадр**, а не
когда код написан.
## Четыре предмета
| Предмет | Что это | Чем НЕ является |
|---|---|---|
| **Сценарий** | путь пользования шагами, у каждого шага — экран и состояние | не тест-кейс: он не утверждает «правильно», он предъявляет «вот что видно» |
| **Шаг** | действие + снимок ПОСЛЕ него | не проверка: шаг **толерантен к ошибке** и снимает даже при сбое |
| **Снимок** | снимок экрана с измеренной подписью | не скриншот-эталон: с ним не сравнивают попиксельно |
| **Лента** | снимки прогона по порядку, листаются подряд | не отчёт: у отчёта есть вывод, у ленты — только правда экрана |
**`screen` — смысловой ЭКРАН, а не момент сценария.** Состояние данных идёт в `state`, а
не в новый код экрана. Нарушение накапливается молча и завышает продукт вдвое: замер —
один экран получил **девять** кодов, карта показала 52 «экрана» вместо 32.
## Девять инвариантов прогона
Полностью, с формой проверки и ценой нарушения — `references/guards.md`. Коротко:
1. **Дубль снимка падает.** Шаг, чей снимок байт-в-байт совпал с предыдущим, переснял тот же
экран под новым именем — лента молча врёт о состоянии продукта. Замер: **33 из 183 (18%)**;
после гарда — **2 из 183 (1.1%)**, и **пять из семи срабатываний оказались настоящими
дефектами сценариев**, а не шумом.
2. **Подпись снимка измеряется, а не объявляется.** Ширина окна меряется у страницы; окно без
размера пишет в манифест `0` — «не измерено» честнее, чем выдуманное значение.
3. **Пустой экран — находка.** Body без текста = битый роут, а не «нечего показывать».
4. **Шаг толерантен, прогон честен.** Шаг снимает при сбое (иначе теряется улика), но
`finish()` **валит** сценарий, если внутри есть сломанный шаг. Иначе стенд рапортует
«passed» при сломанном checkout — отдельный найденный класс дефекта.
5. **Версия — пара (код, прогон).** Два прогона одного кода дают разные снимки. Схлопывание
в одну папку затирает предыдущий прогон и убивает сравнение «до/после».
6. **Порядок версий — по времени прогона.** Лексикографическая сортировка открывает
случайную версию: хэш, начинающийся с буквы поближе к концу алфавита, побеждает.
7. **Прогон сериализует волну.** Dev-сервер с горячей перезагрузкой подхватит чужой коммит
посреди живого сценария: ярлык версии назовёт один коммит, а часть ленты снята другим.
Либо правки, либо снимки.
8. **Локаль стенда — рабочая локаль продукта.** Прибор искажает ровно тот предмет, который
им измеряют: стенд в чужой локали две сессии подряд снимал даты, о которых шла работа.
9. **Полнота устройств.** Мобильный — основной случай у большинства продуктов, и лента без
единого мобильного снимка не покрывает его ничем.
## Экономика снимка — называется до прогона
**Дешёвый кадр** снимается из засеянного состояния. **Дорогой** идёт настоящим путём —
живой движок, платное распознавание, внешний вебхук. Смета инвалидации обязана считать их
**отдельно**: «переснять 40 снимков» при неразделённом счёте оказывается решением на
несколько тысяч рублей, принятым не глядя.
Практика: один-два сценария идут настоящим путём, остальные сеют готовое состояние.
## Три строки замечания — контур до обязательства
Человек, увидевший неправду, копирует из ленты **три строки**: адрес снимка · путь к файлу ·
сценарий и шаг. По ним агент находит снимок, код на момент прогона (`git show <версия>`),
шаг сценария и его заметку. Форма — `references/frame-contract.md`.
**Четвёртая строка — узел спеки,** если в проекте закрыта точка `module-contracts`. Тогда
«мне не нравится этот экран» доходит до **нарушенного обязательства**, а не до места в коде.
Это замыкает контур сверху вниз и снизу вверх.
## Что делает этот навык, а что — нет
**Делает:** задаёт контракт снимка, инварианты прогона, форму сценария, порядок разбора ленты.
**Не делает:** не выбирает библиотеку. Стенд строится на том, чем проект уже гоняет браузер.
Каркас на Playwright разворачивает `/deck init` — как образец, а не как догму.
**Не заменяет тесты.** Стенд — прибор для человека, а не для CI: полный прогон идёт минуты
и часть снимков стоит денег. Тесты отвечают «не сломалось ли», Смотровая — «что видно».
## Порядок работы
1. `/deck init` — каркас стенда: контракт снимка, четыре проверки, первый сценарий.
2. `/deck run` → лента. Перед прогоном: дерево не трогать, локаль проверить, дорогие сценарии назвать.
3. `/deck review` — разбор ленты дорожками в непересекающихся зонах → корни, а не список.
4. Находки — в тот слой, где родилась ложь. Правка в источнике, а не в снимке.
**Разбор ленты глазами не заменяется вычитыванием логов.** Замер: шесть дорожек глазами нашли
4 группы дублей из 16 — то есть четверть; остальное нашёл машинный скан. И наоборот: восемь
корней дефектов экранов машина не нашла бы вовсе. Приборы разные, оба нужны.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!