175 тестов зелёные, а ребёнок не спит
The cheapest research method for my product Skazia: pay my own bot real money and use it to put a child to sleep. One evening session surfaced 15 findings that passing unit tests never would.
Резкий звук в конце колыбельной
12 июня я уложил восьмилетку спать со своим продуктом. Не «посмотри, что папа сделал» — в боевом режиме: реальная оплата Telegram Stars, две купленные серии («Ошибки и настойчивость» и «Садик/школа»), озвучка вслух, как это делает любая семья вечером.
В конце колыбельной — резкий звук. Будто телефон уронили. Ребёнок, который почти заснул, открыл глаза.
В коде на этот момент всё зелёное. Тесты проходят, генерация отвечает, оплата проходит, серии отдаются. С точки зрения CI продукт работает. С точки зрения ребёнка в кровати — продукт только что разбудил того, кого должен был усыпить. Это не баг сборки. Это баг продукта, и увидеть его можно было ровно одним способом: дослушать сказку до конца рядом со спящим человеком.
Заплатить своему боту реальные деньги
Метод звучит издевательски просто: оплати собственный продукт настоящими деньгами и пройди им весь сценарий как живой пользователь. Не дев-стенд, не мок, не «прокликаю воронку» — Telegram Stars, чекаут, две купленные серии, вечер, ребёнок.
Сравни с альтернативами. Юнит-тесты дёшевы и врут о главном: их много, все зелёные, и ни один не поймал, что озвучка будит ребёнка, а в чекауте обещан несуществующий PDF. Интервью с пользователями честнее, но дороже по времени и всё равно не воспроизводит физику момента — никто на интервью не лежит в темноте и не ждёт, пока сказка закончится тишиной. Платный прогон с собственным ребёнком стоит цену двух серий и один вечер — и вскрывает класс багов, который не виден ни из кода, ни из разговора.
Я выбираю этот метод не потому что он «человечный», а потому что он самый дешёвый на единицу найденной правды. Один вечер дал 15 находок, привязанных к строкам кода с severity (docs/product/16-bot-ux-audit.md). Это не оптимизация процесса. Это и есть research.
Класс багов, невидимый из кода
Находки разложились не по тяжести, а по природе. И природа здесь важнее серьёзности.
Первый класс — доверие и деньги. В чекауте строкой шло «PDF для печати — включено». PDF не существует, он в бэклоге роадмапа. Продукт обещал то, чего у него нет, прямо в момент оплаты реальными деньгами (bot/text.ts:334). Из кода это не баг: строка рендерится корректно. Из кресла платящего родителя это нарушение обещания. P0, чинить немедленно — ломается не функция, а доверие.
Второй класс — слом сценария. Посреди оплаты бот снова спросил имя ребёнка, хотя профиль давно заполнен. Причина в стейт-машине: в состоянии idle любой текст без распознанного имени уводит в await_name, даже если child.name уже сохранён (bot/index.ts:397). Технически — корректная ветка роутера. По ощущению — «бот всё забыл» ровно в тот момент, когда человек отдаёт деньги.
Третий класс — физика и эмоция. Тот самый резкий звук в конце озвучки: склейка opus-чанков идёт -c copy, без перекодирования и без fade-out, на хвосте — щелчок (tts/engines.ts:73). Отдельно — «Спокойной ночи» приклеивалось к дневным темам: ребёнок днём слушает сказку про настойчивость и получает в конце пожелание спокойной ночи, потому что финальная строка ставится всегда (bot/text.ts:77).
Ни один из этих классов не ловится тестом. Тест проверяет, что код делает то, что написано. А находки — про то, что написанное не совпадает с тем, что нужно человеку в кровати.
Восьмилетка попросила сказку про себя
Самая важная находка вечера пришла не из бага, а из реплики. Восьмилетка попросила «сказку про себя».
Продукт был рассчитан на возраст 3–7. Восьмилетний ребёнок в целевую не попадал — по таблице. По факту он сидел рядом, хотел сказку про себя и был ровно тем пользователем, ради которого всё затевалось. Я расширил диапазон до 3–10. Это решение не из аналитики и не из юнит-теста — его невозможно получить, не посадив рядом живого ребёнка нужного возраста.
Тот же возраст подсветил контентный долг: главы короче минуты при регламенте около пяти. Одна генерация на всю серию в 5200 токенов физически не вмещает 5–10 минут чтения на главу (generation.ts:162). Цифра в коде (max_tokens) и ощущение в кровати («сказка кончилась, не успев начаться») — две разные правды, и вторую видно только вечером.
Что отсюда забрать
Зелёный CI отвечает на вопрос «делает ли код то, что написано». Он не отвечает на вопрос «нужно ли это человеку и не ломает ли это ему вечер». Это два разных вопроса, и второй дороже — но платится он не деньгами, а вниманием: одним прогоном в реальных условиях, с реальной оплатой, рядом с реальным пользователем.
Если ты строишь продукт в одиночку на AI, у тебя нет команды QA и пула респондентов. Зато ты можешь стать своим пользователем по-настоящему — с деньгами и последствиями. Зелёные тесты и резкий звук в конце колыбельной уживаются в одной сборке. Решает не тот, кто гонит тесты, а тот, кто дослушал сказку до тишины.
Part of the series «Skaziya: building 0→1 solo with AI»
More in the series
Maxim Vechkitov · Senior Product Designer · Design Engineer
Open to senior/lead roles and part-time work.