Браузерная игра началась у меня с разговора в ChatGPT. Я обсуждал концепт, возвращался к деталям и дорабатывал его. Затем попросил ChatGPT составить промпт для агента Codex. С Codex продолжил работу над сюжетом и изображениями, а для программирования использовал Claude Code.
Открыть игру «Осквернённый Грааль: Ненаписанная легенда».
Эта цепочка не превращала большой замысел в одну команду «сделай RPG». Нужно было передать между инструментами смысл истории, ограничения и проверяемый результат. Разберём это на первом срезе «Осквернённого Грааля: Ненаписанная легенда» — неофициального фанатского проекта по Tainted Grail.
Распределение инструментов — моя история работы; технические решения ниже восстановлены по документам от 20 сентября и первому Git-срезу от 21 сентября. Точный передающий промпт из ChatGPT здесь не цитируется: его текст не сохранён среди исследованных артефактов.
Из разговора о концепте — в поручение исполнителю
На этапе ChatGPT я уточнял, какую игру хочу получить. Следующий промпт для Codex должен был сохранить этот замысел при переходе от обсуждения к работе над сюжетом. Такой переход требует отделить принятые решения от идей, которые ещё можно менять: гладкое резюме легко делает все варианты одинаково окончательными.
В самом проекте это различие закрепили инструкциями: гипотезы не становятся фактами, большой бриф не означает немедленную реализацию всей игры. Это уже материал для последующих задач Codex и Claude Code. Названия клиентов сами по себе не сохраняют контекст — его нужно записать в понятных источниках и связать с текущим поручением.
Сначала ограничили результат для игрока
В CORE-001 требовались Laravel с Vue/Inertia, PostgreSQL и воспроизводимые проверки. Игровых правил на этом этапе ещё не было. Задача отдельно запрещала заранее создавать заглушки будущих систем. Для агента это существенное ограничение: название RPG не давало повода сразу проектировать бой, торговлю и редактор мира.
Следующая задача, CORE-002, уже описывала действие игрока: выбрать короткую опасную дорогу или длинный обход, потратить время, увидеть изменившееся место и продолжить после перезагрузки. Получился пролог «Пока держит переправа»: три происхождения, пять мест, два маршрута к мельнице, пять действий и два завершения.
Мой выбор как автора здесь — масштаб итерации и смысл развилки. Агенту можно поручить связать экран, команду и сохранение, но из названий технологий не следует, почему игрок должен выбирать между риском и опозданием. Это решение должно появиться в постановке до реализации.
Что агент должен был прочитать
Корневой AGENTS.md направлял к задаче, архитектуре и нарративным документам, затем требовал перечислить затронутые системы. Большой дизайн-бриф прямо запрещалось трактовать как требование реализовать всю игру сразу. Постоянные правила не заменяли короткую постановку текущего этапа.
Локальный skill repo-discovery задавал конкретную работу с инструментами: искать через rg, проследить маршрут от запроса до домена и интерфейса, подтвердить существование файлов. Если приложения ещё нет, карта должна закончиться документацией. Нельзя отвечать ссылкой на сервис, который только предложен в плане.
Перед программированием в Claude Code контекст дополняли проектные процедуры. Для запуска предназначался local-dev: сначала проверить Compose, Makefile и manifests, использовать сервисы своего проекта, не читать секреты в отчёт и не очищать игровую БД ради проверки. Для изменения правил — module-architecture, для игрового экрана — frontend-shell. Такая привязка делает skill рабочей процедурой: он уточняет действия именно в этом проекте.
Как выглядело ограниченное поручение
В шаблоне задачи были цель, источники, влияние на игру, объём, зависимости, критерии и результат. Ниже — краткая реконструкция по CORE-002, а не дословная запись исторического промпта:
Результат: игрок проходит один из двух маршрутов и продолжает
после перезагрузки. Время меняется от действий, не от ожидания.
Контекст: задача CORE-002, правила времени, текущий код,
процедуры окружения, серверных команд и игрового интерфейса.
Граница: без полного боя и общего движка всех сюжетных сцен.
Проверить: оба пути, опоздание, повтор команды, чужую кампанию,
устаревшую версию и отсутствие частичных изменений.
У каждого пункта есть наблюдаемое последствие. Например, закрытая вкладка не продвигает календарь; короткий путь в этом срезе стоит предсказуемой усталости, а случайных встреч ещё нет. Так агенту не приходится самостоятельно выбирать семантику времени и случайности под видом реализации.
Роли были подготовлены, запуск не доказан
В пакете есть backend-laravel и frontend-vue. Первой роли предписаны серверная проверка, атомарность и повтор команды, второй — отображение проекции и состояния запроса. Это удобное описание границ поручений. Но README пакета прямо говорит: файл роли не запускает субагента и не выдаёт ему инструменты.
Журнала вызовов этих ролей для пролога не сохранено в исследованных материалах. Поэтому нельзя утверждать, что два агента писали его параллельно. Достоверно другое: граница была описана заранее и видна в результате — браузер отправляет намерение, сервер вычисляет состояние. При реальном разделении работ этот общий контракт следовало бы передать обоим исполнителям.
Принимали поведение, а не отчёт о количестве кода
CORE-002 фиксирует серверные и браузерные проверки, включая два конкурентных процесса PostgreSQL. Повтор запроса не должен повторно списывать ресурсы; отказ не должен оставлять частично изменённое сохранение. Это исторический отчёт этапа, не новый запуск при написании статьи.
Процедура delivery-docs требовала записать рядом ограничения. Они действительно есть: гостевой доступ зависит от cookie, аккаунтов и переноса между устройствами ещё нет. Кнопка «Продолжить» не выдаётся за обещание восстановления доступа в любых условиях.
Человеку остаётся пройти оба маршрута и оценить понятность выбора. Если технические проверки зелёные, а игрок не видит цену дороги, задача ещё не принята. Следующий материал показывает, как тот же подход к контексту работает со сценарием и знаниями персонажей.