175 тестов зелёные, а ребёнок не спит
Самый дешёвый research-метод в Сказии — заплатить собственному боту реальные деньги и уложить с ним ребёнка спать. Один вечерний прогон дал 15 находок, которых не видно ни из кода, ни из проходящих юнит-тестов.
Резкий звук в конце колыбельной
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 и пула респондентов. Зато ты можешь стать своим пользователем по-настоящему — с деньгами и последствиями. Зелёные тесты и резкий звук в конце колыбельной уживаются в одной сборке. Решает не тот, кто гонит тесты, а тот, кто дослушал сказку до тишины.