Read in:
Русский

Съёмка демо — это тест

Чтобы записать чистое видео фичи, приходится пройти весь её happy path на настоящем продукте. Всплывают ровно те баги, которые иначе ждали бы живого демо перед клиентом.

Мы собирались записать видео онбординга: скачать стартовый vault, поставить плагин, сохранить заметку, увидеть её на сайте. Ничего экзотического, ровно тот путь, которым идёт каждый новый пользователь. Запись заняла на несколько дней больше плана, и почти вся задержка была не про видео. Дубль за дублем падал, потому что продукт на живом проде отказывался делать то, что по всем тестам умел. В этом и оказалась ценность. Съёмка — репетиция демо, и она ловит демо-баги, пока они стоят пересъёмку, а не доверие клиента.

Видео: скоро будет. Готовая запись появится здесь.

Класс багов, которые находит камера

У всех багов, пойманных камерой, одна форма: баг сидит прямо на happy path и невидим для юнит-тестов, потому что ни один юнит не сломан. Сломаны только швы.

Несколько примеров, на уровне принципа, а не ченджлога:

  • Установочный артефакт, который скачивают реальные пользователи, тихо отстал от кода. Каждая часть протестирована; собранную комбинацию не проверял никто, потому что сборка случилась однажды. В кадре сохранение должно было опубликоваться само. Не опубликовалось.
  • Живые инстансы на деле не переехали на новую сборку, и запросы падали посреди выката. Это видно только на той системе, которой пользуются клиенты: стейджинг не выкатывается так, как прод.
  • Сброс сцены между дублями показал: если спрятать контент и вернуть обратно, он остаётся спрятанным. Переход состояния, о котором не спрашивал ни один тест. Кто вообще прячет и возвращает? Любой, кто готовит демо. А потом какой-нибудь пользователь.
  • Сигнал, по которому мы проверяли «деплой доехал», мерил совсем другое. Мы читали кэш-маркер фронтенда и называли это проверкой деплоя.
  • Автосохранение редактора при переключении файлов не всегда отправляло правку. Деталь тайминга, которую замечаешь, только когда сидишь и смотришь на экран, ожидая изменение, а оно не приходит.

Ничего глубокого здесь нет. Любой из этих багов умирает за пять минут, если его увидеть. Проблема в самом «увидеть»: каждый прячется ниже разрешения тестового прогона и выше терпения чеклиста. Есть ровно одно место, где они всплывают все сразу, и до сих пор этим местом было живое демо.

Репетиция, которую не страшно провалить

У записи те же свойства, что у демо перед клиентом: настоящий продукт, весь путь, скучные шаги не пропустить, зритель замечает всё. С одной разницей. Провалился дубль — чинишь баг и жмёшь запись ещё раз. Провалилось демо — объясняешься с человеком, который был готов платить.

И это строже, чем чеклист QA. Чеклист терпит «работает, но с оговоркой». Дубль не терпит: оговорка остаётся в кадре. Сайт, который так и не показался, комментарием не прикроешь.

Установка, в принципе

Сама запись автоматизирована: проходить один и тот же путь руками перестаёт чему-то учить уже на втором разе. Не превращая это в инструкцию, сами идеи:

  • Риг работает на Linux. Впечатление такое: Linux даёт более гибкое управление окнами, чем альтернативы, а это важно, когда скрипту нужно расставить их, поменять размер и захватить картинку. Впечатление, не бенчмарк.
  • Всё это крутится на голом Xorg без GPU-ускорения, и в виртуалке, и на сервере, и там уже проверено. Особого железа автоматизации съёмки не нужно.
  • Финальная картинка при этом оформлена в окно в стиле macOS. Где записываешь и что видит зритель — независимые решения.
  • Браузером можно управлять двумя способами: через протокол DevTools или симуляцией кликов. Работают оба, а ломаются по-разному, и иногда это само по себе полезно.
  • Анимации кликов вшиты в код, чтобы зритель видел, как курсор двигается и нажимает. Запись, где всё происходит без видимой причины, читается как монтаж, а не как демо.
  • Сегодня всем ригом управляет Claude Code, локально, на моей машине, а те же скилы мы упаковываем в Hermes — открытый агент, который запускаем сами. Ничто не привязано к одной модели: камеру может держать любой, кто умеет читать сценарий и нажимать кнопки.

Не пошагово. Но идея понятна.

Как агент это делает

Один прогон выглядит так. Поднимается графическая сессия на Xorg, без GPU. Агент запускает наш стек и клиентов — браузер и Obsidian, оба с remote-debugging-портом. Дальше ведёт их по DevTools-протоколу: расставляет и ресайзит окна, кликает, печатает, ждёт, пока изменение доедет до сайта. Поверх рисуется курсор с анимацией нажатия, чтобы в кадре была видна причина каждого действия. Всё это пишет ffmpeg с X-дисплея. На монтаже кадр оборачивается в окно в стиле macOS, накладывается озвучка, сегменты склеиваются в ролик.

От обучения к запакованному агенту

Риг начинался не как код. Он начинался как агент, который сам разбирался с машиной: расставить окна, повести браузер, запустить приложение, пройти путь. Первый проход медленный и жрёт токены, потому что агент вживую продумывает каждый шаг.

Как только шаг понятен, он переезжает в код. Агент перестаёт заново выводить, как нажать кнопку, которую нажимал сто раз; прогон дешевеет и становится повторяемым; решения остаются за агентом, а механика застывает под ним. Сегодня ригом рулит Claude Code и учит его шагам; эти же скилы мы упаковываем в Hermes — открытый агент, который запускаем сами. Конец этого пути — Hermes как агент релизов: запускается на каждом релизе и сам делает свежее демо «что нового».

Раз это агент, одним дело не ограничивается. Можно запустить десяток сразу на том же happy path, и каждый пройдёт его чуть иначе: другой порядок, другой тайминг, другие мелкие выборы. Один заскриптованный дубль видит один путь через продукт. Десять агентов видят десять и вместе выбивают баги, которые всплывают, только когда шаги идут не в том порядке, что заложил сценарий. Ничего хитрого. Просто много глаз одновременно проходят скучный путь — честное применение грубой силы.

Результат и есть смысл

Обычный QA производит отчёт, который стареет в бэклоге. Здесь на выходе видео, которое и так было нужно лендингу, а тестирование пришло бесплатно. Можно посчитать и наоборот: тестирование было настоящим, а материал для маркетинга — бесплатным. Сходится в обе стороны, что бывает редко.

За этим стоит домашнее правило: строить, когда тянет контент, и здесь тянул именно контент. Нам было нужно видео; видео требовало, чтобы happy path был правдой; сделать его правдой и было работой. Dogfooding в самом строгом виде: свой продукт, на проде, одним непрерывным дублем, под запись.