almcreate Авторский IT-блог

Бумажный лист сохранения проиграл. Но сначала AI пришлось прочитать правила

Я делал приложение для своей любимой настолки и боялся не плохого кода. Я боялся, что агент «вспомнит» игру вместо того, чтобы её прочитать.

Александр Морозов · 22 сен 2026 · 6 мин чтения · 4 просмотра
Помятый лист сохранения и телефон с его цифровой копией, кубики и жетоны на деревянном столе
Сгенерированная обложка · ImageGenalmcreate

Кампания «Осквернённого Грааля» не заканчивается за вечер. Она тянется неделями, и между партиями вся жизнь отряда хранится на одном листе бумаги: шкалы энергии, здоровья и ужаса, номера карт навыков, где стоят менгиры, чему равен каждый счётчик. Лист кладут в коробку, коробку ставят на полку, а через неделю кто-то пытается разобрать, это была семёрка или единица.

У меня собрана вся линейка, от «Падения Авалона» до «Королей краха». Любимая игра. Поэтому в какой-то момент я сел и сделал то, что давно хотелось: приложение, где отряд ведёт сохранение с телефона прямо за столом.

Называется Campaign Save Keeper, живёт на boardgame.mpdev.ru. Первый коммит — 17 сентября, сейчас в истории 48 коммитов. Почти весь код написали агенты: в основном Claude, часть — Cursor. И этот пост не про скорость, хотя она впечатляет. Он про то, что меня пугало с самого начала.

AI знает Грааль. Это и было проблемой

Спросите любую модель про «Осквернённый Грааль», и она уверенно расскажет про Авалон, менгиры и искаженье. Где-то верно, где-то приблизительно, а где-то смешает первое издание с обновлёнными правилами. Для разговора о настолке этого хватает. Для листа сохранения нет.

Лист сохранения — это договор с правилами. Если приложение позволит энергии превысить здоровье, а правила это запрещают, отряд этого не заметит. Он просто сыграет неправильно следующие три вечера. Хуже бага, который падает, только баг, который выглядит как фича.

Поэтому первым делом я запретил агенту опираться на память. Все PDF правил лежат в docs/pdf/ (в репозиторий они не попадают, это мои файлы), и прежде чем писать код, агент сделал разбор: docs/research/rules-notes.md. Только то, что влияет на данные и экраны. У каждого утверждения — страница.

rules-notes.mdправило → источник
Начальные ячейки у каждого героя свои
(Беор начинает с 9 здоровья, 6 энергии, 0 ужаса — ПА с. 6).
Энергия не может превысить здоровье.
Процедура сохранения — ПА с. 13, КК с. 19.

Ссылки на страницы — не бюрократия. По ним я проверяю агента за минуту: открыл PDF, нашёл страницу, сравнил. Без них пришлось бы каждый раз гадать, откуда он это взял — из книги или из головы.

Правила спроектировали экран лучше меня

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

Я бы собрал форму по таблицам. Так думает разработчик. А за столом думают по-другому: «сначала каждый записывает себя, потом летописец — карту». Интерфейс, повторяющий ритуал игры, оказался понятнее интерфейса, повторяющего базу.

Тут AI сработал не как кодер, а как внимательный читатель документа, который я сам много раз листал и перестал видеть.

Вопросы, на которые AI не ответит

Вторая привычка, которую я закрепил, — доска задач с открытыми вопросами к заказчику. Заказчик тут я. Вопросы пронумерованы, от В1 до В11, и у каждого есть ссылка на задачу, которую он блокирует.

Часть вопросов агент закрыл сам, вернувшись к книгам. Что такое «счётчик» в блоке персонажа? Значение счётчика миссии или карты секрета этого героя, правила, с. 13. Как записываются навыки? Номерами карт рядом с характеристикой, каждая карта даёт очко. В «Королях краха» на листе двенадцать слотов. Появился новый тип поля — список номеров — и итоговая характеристика стала считать «маркеры плюс карты». Один коммит, три закрытых вопроса, и каждый ответ со ссылкой на страницу.

А вот В11 так и висит. Длина шкал энергии, здоровья и ужаса у каждого из семнадцати героев, стартовые ячейки, где начинается красная зона. Это напечатано на планшетах героев. Не в правилах. На картоне, который лежит у меня в коробках.

Для четырёх героев «Падения Авалона» я сфотографировал планшеты, и агент перенёс числа в конфиг. Осталось тринадцать героев из дополнений. Никакая модель их не угадает, и я очень не хочу, чтобы она пыталась. Правдоподобное «у Ниав, наверное, 8 здоровья» хуже честного пустого поля.

Мне нравится, что эта граница видна в документе. Вот что AI вычитал из источника. Вот что он не может знать. Вот кто должен принести ответ. Раньше такие вещи терялись у меня в голове между «потом посмотрю» и «да вроде так».

Как я не дал агенту захардкодить любимую игру

Самый опасный соблазн в таком проекте — сделать приложение под одну игру. Грааль мне дорог, Грааль в каждом промпте, Грааль во всех примерах. Агент тоже это видит и начинает писать под него: здесь if на слово «ужас», там компонент «Шкала менгиров».

Я хотел другого. Новая кампания должна добавляться JSON-конфигурацией: без миграций, без новых Vue-страниц. Но фраза «продукт не зависит от игры» в AGENTS.md ничего не гарантирует. Агент кивнёт и через два дня всё равно зашьёт что-нибудь в код.

Это требование я закрепил тестами. В tests/fixtures живёт вторая игра, которой нет в природе: synthetic-quest. Пилот вместо героя, трюм с грузом вместо менгиров, другая форма листа, никакой темы и портретов. Её единственная задача — быть непохожей.

ArchitectureTest.phpчто держит проект
test_a_second_game_works_as_configuration_only
test_products_and_side_campaigns_reshape_the_sheet_without_code
test_a_limit_may_follow_the_hero_instead_of_the_campaign
test_the_client_carries_no_knowledge_of_any_game

Последний тест мне нравится больше всех. Фронтенд ничего не знает ни об одной игре. Если агент протащит туда «здоровье» или «Авалон», тест покраснеет, и спорить будет не со мной.

Настоящая проверка случилась позже. Оказалось, что «Короли краха» — не дополнение, а самостоятельная игра со своим листом. Раньше я бы готовился к переписыванию половины интерфейса. Здесь игра получила собственный каталог конфигурации, миграция перенесла уже начатые прохождения, а фронтенд листа никто не тронул. В этот момент я окончательно поверил, что synthetic-quest того стоил.

Чем сильнее любишь предметную область

…тем меньше стоит доверять тому, что AI о ней «знает». Звучит странно, но на любимой теме ошибки AI особенно коварны: они совпадают с твоими собственными смутными воспоминаниями, и ты киваешь.

На этом проекте у меня было три опоры. Первоисточник вместо памяти: PDF и номера страниц. Честный список того, что знаю только я: вопросы на доске, фото планшетов. И тест, который не даёт одной любимой игре расползтись по коду.

Код получился быстро, но скорость тут не главное. Главное — что в следующий раз я открою приложение за столом и не стану сверять его с книгой правил. Это уже сделано, со ссылками на страницы.

А бумажный лист я всё равно оставлю в коробке. На всякий случай. Тринадцать героев пока без шкал.

#ai #архитектура #coding agents #тесты #дневник #настольные игры #Осквернённый Грааль

Соседние рубрики