Концепт игры я обсуждал и дорабатывал в ChatGPT. Затем попросил подготовить промпт для Codex и продолжил с ним работу над сюжетом и изображениями. Для программирования использовал Claude Code. Самая важная передача между этими занятиями происходила там, где авторская фраза должна была стать исполняемым правилом.
Открыть игру «Осквернённый Грааль: Ненаписанная легенда».
«После разговора открыть дорогу и изменить отношение персонажа» понятно сценаристу, но недостаточно разработчику. Нужно определить событие, состояние, условие и последствия. Разберём технический этап 21 сентября: какой контекст проект задавал кодовому агенту и как проверялся полученный результат. Распределение инструментов подтверждено мной как автором; конкретные решения ниже — задачами и кодом.
Передать сценарий вместе с границами реализации
В NAR-002 прямо зафиксировано: авторский каталог не импортируется существующим загрузчиком. Значит, Claude Code нельзя было поручать лишь «подключить готовый JSON». Часть условий записана словами; составные операции требуется разложить, а отсутствующие типы сначала реализовать.
Для такого этапа в проекте подготовлены module-architecture и developer. Первый связывает состояние кампании, атомарную команду и неизменяемый релиз. Второй предписывает пройти путь от HTTP до домена и проекции, проверить вход и не доверять цене или эффектам из браузера. Это содержание инструкций, а не восстановленный журнал их чтения агентом.
В контекст конкретной задачи входят выбранные сцены, текущий реестр, загрузчик и существующие тесты. Весь сюжет повторять не требуется; зато нужно передать смысл условия. Если авторское слово «отношение» допускает несколько трактовок, выбор шкалы нельзя спрятать в техническую реализацию.
Разбить работу ИИ на проверяемые изменения
Учебная реконструкция поручения по этому контракту выглядит так:
Переведи выбранную сцену в существующий формат контента.
Для каждого условия и эффекта найди поддержку в реестре и исполнителе.
Неподдерживаемую операцию назови отдельно; не создавай условный тип,
который загрузчик примет, а движок проигнорирует.
Сохрани смысл выбора, цену, границу знания и версию старого сохранения.
Верни изменённые файлы, проверки и нерешённые авторские вопросы.
Такое поручение оставляет программирование агенту, но делает видимыми решения, которые должен принять человек. Возможность написать обработчик не означает разрешения изменить сюжетный исход. После кода нужно вернуться к исходной сцене и проверить, что реализована именно она.
Зачем нужен закрытый набор правил
В классе условий используется явный реестр типов. У каждого указаны обязательные поля; неизвестный тип вызывает ошибку. Условия можно соединять через all, any и not, но возможность композиции не разрешает добавлять произвольные новые операции.
Ниже короткий фрагмент из проверки одного условия. Он показывает именно защитную границу, а не весь алгоритм исполнения:
foreach (self::TYPES[$type] ?? throw new RuleViolation('Неизвестный тип условия: '.$type) as $field) {
if (! array_key_exists($field, $condition)) {
throw new RuleViolation('Условие '.$type.' без поля '.$field);
}
}
У сравнения также есть ограничение типов: строку и число нельзя молча считать равными, а числовой оператор нельзя применить к произвольному значению. Для контента, который может готовить помощник, такой отказ полезнее попытки «догадаться», что имелось в виду.
В отчёте этапа зафиксированы 25 типов условий и 35 типов эффектов. Это размер реализованного на тот момент реестра, а не обещание, что любое авторское пожелание уже выражается готовой командой.
Проверить неприятный повтор, а не только удачный ход
В StoryService результат команды ищется до проверки ожидаемой версии. Это важная деталь при приёмке кода Claude Code: первый запрос мог завершиться, а ответ потеряться. Повтор с тем же идентификатором возвращает прежний результат; другое содержимое под тем же ID вызывает конфликт.
Принадлежность кампании, блокировка строки, загрузка закреплённого релиза, изменение состояния и запись результата соединены в одном серверном процессе. Архитектура здесь служит доказательством ограничения, заданного агенту: повтор не становится вторым ходом, чужое сохранение не меняется, частичный сбой не списывает время отдельно от последствия.
Проверка должна включать исходное состояние и повтор одной команды. Фраза исполнителя «добавлена идемпотентность» не заменяет наблюдения, что состояние после повтора осталось прежним. Аналогично наличие хеша контента ещё нужно связать с загрузкой именно того релиза, на который ссылается кампания.
Почему роли не равны доказанным субагентам
В локальном пакете backend-laravel и frontend-vue получают разные обязанности. Серверный исполнитель меняет правило, интерфейсный показывает доступный выбор и отказ. Общий контракт — серверная проекция и команда с ID/revision. Наличие двух файлов не доказывает, что в этом этапе работали две отдельные сессии: журнал такого запуска не найден.
Для повторения процесса это всё же полезная заготовка. Сначала согласовать контракт, затем раздавать независимые изменения, а после соединения проверить полный путь. Нельзя заставлять интерфейсного помощника угадывать ещё не принятое серверное решение.
Что я должен принять сам
CORE-004 фиксирует RegistryTest, StoryCampaignTest и сверку каталога. Это исторический результат этапа; при подготовке статьи проверки заново не запускались. У кода есть машинные основания для приёмки, у сюжета — человеческие: обещанная цена, понятный результат и отсутствие случайно раскрытой тайны.
Клиенту передаётся доступная часть истории, а не закрытые авторские условия. Скрыть секрет стилем недостаточно, если он уже пришёл в ответе. Поэтому я бы принимал такое изменение по паре: исполненное правило и фактический ответ браузеру. После локальных проверок остаётся пройти связанные главы — этому посвящён разбор проверки нелинейной истории.