Браузерная игра. Я никогда не писал игры. 114 тысяч строк TypeScript. Навайбкожена за три недели. То, что ИИ умеет писать рабочий код, уже не новость. Я расскажу вам о том, что удерживает проект такого размера управляемым, когда код уже не влезает в контекстное окно.
Игра - Vacuum Rogues. Тот же принцип, что и у безоблачных инструментов. Всё в браузере, без сервера.
За 3 недели (вечера и выходные) был разработан игровой движок. Целый мир - планеты, космос, NPC, экономика, квесты, бои, даже игрушечная банковская система для реализации простейшего кредитования.
Осталось множество мелких правок UI, квестов и экономического/военного баланса. Всё, что требует кропотливого описания, как это должно выглядеть, - требует ещё недели три доработок. А мне хотелось бы делегировать эту работу и переключиться к написанию саундтреков для игры. Поэтому решено зарелизить Beta-версию c формой обратной связи. Issue можно оставить из интерфейса игры.
Сначала несколько обзорных слов о проекте, а потом перейдём к методике.
Масштаб
100 часов вербализации намерения в течение 3-х недель
611 коммитов
114 544 строки кода
63 юзер стори
538 TS-файлов
206 e2e-тестов в 36 playwright spec-файлах
2628 юнит-тестов в 302 файлах
всего 3263 файла
59 МБ - prod bundle (вместе с 26Мб картинок)
При таком объёме главная проблема - не сломать то, чего сейчас нет перед глазами.
Поиски подхода
От промпт-driven подхода я отказался сразу. One-shot не работает нигде.
В компании, где я работаю, есть доступ к open-source нейросетям, развернутым в контуре. Я успел наиграться с ними и уже обкатал подход, который показывал лучший и предсказуемый результат там - SPDD (Structured Prompt Driven Development). Этот подход предполагает создание сложных всеобъемлющих промптов, в которых очень высокий уровень детализации - какой файл и как править, вплоть до типов и переменных. Промпт как часть проекта. На что платный ИИ мне сразу сказал - не надо так делать, давай лучше BDD.
С BDD дело пошло лучше и быстрее. Но мне стало не хватать автоматизации. Я шел одним и тем же паттерном по кругу - архитектура, BDD, план, тесты, реализация, ревью, фиксы, коммит.
Я решил поднять уровень абстракции и установил ralphex, чем автоматизировал весь цикл работы.
План как единица работы
Физически это markdown-файл в docs/plans/ с разбивкой на задачи, у каждой задачи обязательные тесты, и следующая задача не начинается, пока тесты предыдущей не зелёные. План переживает и переполнение контекста, и обрыв сессии - после рестарта видно, что сделано, и работа продолжается с того же места. За три недели 62 плана. По сути, это 62 User Story.
Выполняет план не интерактивная сессия, а оркестратор. Он гоняет задачи по циклу и, главное, переживает ошибки API.
План и вся память о проекте - строго на английском для экономии токенов.
На случай сомнений модели, в проекте лежит файл SOURCE-OF-TRUTH.md, содержащий high-level game design документ для избегания лишних вопросов.
Работа заспорилась, но через пару дней я обнаружил, что появились файлы больше 5000 строк, а сделав один план, мы ломаем то, что работало до этого.
Настало время принимать меры.
Летсплей нейронкой
Чтобы отлавливать баги после рефакторинга, нужно было заходить и играть самому. Я заставил это делать нейронку через плагин к браузеру. Отловил так только какой-то процент багов. Помогло как смоук-тест. Благо, последующий рефакторинг сильно улучшил качество работы нейросети и ломать всё подряд она перестала.
Знать радиус поражения до правки
Правка ядра - главный источник каскадных поломок. Особенно когда ядро не влезает в контекстное окно.
Радиус поражения считается с помощью gitNexus, а для экономии контекста я попросил саму нейросеть написать “vacuum MCP” - чтобы можно было брать тело функции из файла в 5000 строк без чтения всего файла. В большинстве случаев (95%) используется поиск и чтение через grep/Read. Но в 5% случаев без графа зависимостей и vacuum MCP никак.
Плотная работа с графом понадобилась только дважды. Первый раз - при рефакторинге ради уменьшения размера файла, второй - когда я прокладывал между модулями адаптеры для лучшей изоляции. Потом его можно было бы удалить, но я оставил на случай, если ядро разрастётся.
SOLID и GRASP ИИ понимает на уровне типичного Senior. То есть может рассказать, что значит аббрревиатура и даже интуитивно применить. Но как именно это применить - индивидуально для каждого проекта. Применение шаблонов сильно зависит от степени мутности представления о будущем развитии функциональности. Поэтому архитектура - решает.
Мне повезло - моё смутное видение не множилось на количество участников, как бывает при обычном согласовании и всё порезалось на модули довольно легко, так как я имел ясное представление о том, чего я хочу получить в итоге.
Однонаправленная архитектура
Граф зависимостей помогает анализировать радиус поражения, но сам радиус задаётся архитектурой. Если слои ссылаются друг на друга в обе стороны, под удар попадает каждый раз половина проекта. Строгое направление зависимостей физически ограничивает, что вообще может сломаться от одной правки. Я нашел решение в ECS
Было - связи в обе стороны Стало - однонаправленный поток presentation ⇄ systems presentation → systems → domain → ECS systems ⇄ domain правка нижнего слоя не тянет верхние presentation ⇄ domain
В AGENTS.md это одна строка - strict dependency direction, top to bottom only. Записана там, где модель прочитает её прежде, чем начнёт писать. Domain - чистые сущности без PixiJS и DOM, поэтому игровая логика тестируется без экрана.
Получилось буквально - ядро - центральный модуль игры, который описыват, ЧТО система умеет, но не КАК, - и слои вокруг него. Например, порт ISaveService умеет сохранять и загружать, без подробностей. Адаптер - конкретная реализация SaveManagerAdapter, которая дергает “внешний мир”.
То есть схема такая:
ядро ──(знает только порт-контракт)──▶ ПОРТ ◀──(реализует)── АДАПТЕР ──(дёргает)──▶ IndexedDB / ONNX / PixiJS
А в сборке архитектура движка выглядит так:
GameEngine цикл кадров · смена сцен · суточная симуляция мира │ ▼ всё через порты ядра (core) presentation → systems → domain + ECS рендер PixiJS механика чистое состояние без экрана сбоку - data (сейвы, миграции) · ai (ONNX + fallback) что внутри systems → бой · NPC · галактика · торговля · квесты · банк · снаряжение · физика · диалоги · звук · справочник
Рефлексия модели
После нескольких фиксов в стиле “ой, да, ты прав, недосмотрел” я завёл скилл /learn, чтобы выученные уроки сохранялись для дальнейшего избегания проблем. При этом возникла другая проблема - AGENTS.md тоже не резиновый.
А раз модули к этому времени стали максимально изолированными, решение - иерархия контекстов.
Память и слоистый контекст
Чтобы сессия не начиналась с нуля, работают два механизма. Кросс-сессионная память держит решения, которые переживают конец сессии, вроде “этот модуль не трогаем” или “здесь была ловушка”. Слоистый AGENTS.md разложен по подпапкам, поэтому в контекст подтягивается ровно то, что относится к текущему модулю, а не вся документация разом.
Я люблю писать промпты в стиле “планеты должны вращаться в разных направлениях, вид корпуса должен меняться при покупке нового и запили АБС”. ralphex очень выручает в таких случаях, раскидывая это по таскам в разных планах в зависимости от места изменений, чтобы контекст не перегружался.
Зелёные тесты - это ещё не рабочая игра
Текстовый тест проверяет логику, но не видит картинку. Поэтому поверх него два контура. Regression-first - на найденный баг сначала пишется красный тест, и только потом фикс, так регрессия не возвращается. В истории это видно дословно, коммит reproduce wait-turn pause runaway as red regression test, и следом починка. Второй контур - верификация скриншотом, то, что должно отрисоваться, проверяется по реальному кадру, а не по зелёному ассерту.
В момент, когда я понял, что большая часть работает как надо, я запретил ИИ менять тесты - только добавлять. Это важно, потому что иначе он бессовестно переписывает тесты под реализацию. Стало жить гораздо проще.
Гейты, чтобы регрессия не уехала в master
Последний рубеж - автоматические хуки (я использую lefthook). Они отбраковывают плохой коммит до того, как он попадёт в историю, и работают одинаково, кто бы ни писал код - человек или модель.
правка │ ▼ pre-commit ── eslint --fix · prettier · tsc --noEmit · тесты по файлам ──┐ │ прошло упало ──┘→ к правке ▼ pre-push ──── полные тесты · полный линт · сборка ───────────────────────┐ │ прошло упало ──┘→ к правке ▼ master → авто-деплой
До push доходит только то, что прошло все три. Из 594 коммитов 138 - это правки по итогам мульти-агентного ревью (ralphex запускает для этого аж 5 субагентов). Откатывать не приходилось.
Итог
Игра получилась благодаря строгим рамкам, авто-планам, иерархии модулей и strictly-english контексту.
память → план → оркестратор → impact → правка → регресс → гейты → master → деплой
Как видно, сработали ровно те же подходы, что и в человеческих командных процессах разработки. Точно так же сама правка кода занимает мизерную часть по сравнению с подготовкой планов и приёмкой результата.
Самое главное - я уже неделю не переживаю что мелкая правка что-то кардинально сломает. Такое перестало происходить. Это самый важный результат.
А игру ещё дорабатывать и дорабатывать по всяким мелочам, прошу, побудьте бета-тестерами, обещаю исправить все нюансики в кратчайшие сроки.
Отзывы бета-тестеров падают из игры прямо в GitHub Issues (нужен аккаунт на GitHub). Исходники открою самым активным.
PS. В формате after-title show хотелось бы поделиться несколькими интересностями.
WebP ужал 600Мб картинок до 29Мб без особой потери качества
Картинки тоже генерировала нейронка - сама собрала пайплан на ComfyUI на боксе с RTX4090 и сама написала промпты
В проекте есть валидация экономики. Без игрока - это игра с нулевой суммой, только действия игрока могут перевесить чашу весов.
Вращение планет и солнц сделано с помощью экви-ректангулярных плоскостей, сгенерированных Stable Diffusion
Музыку для игры тоже отчасти будет писать нейросеть - через плагин AbletonOSC она может подкидывать midi-файлы и крутить крутилки у инструментов. То есть интенция, живые инструменты, мастеринг и контроль остаются за мной.
Комментарии (22)

flancer
23.06.2026 01:43Да, несколько непонятно, что именно нужно делать в игре. Нужно разбираться методом проб и ошибок. Но в целом - впечатляет (y) Интересно, а насколько долго в неё можно играть? Насколько большая "игровая Вселенная"? Если это "браузерка", то все возможные повороты сценария должны быть предопределены и загружены. Если, в теории, я выполню все квесты, то - всё?
Слоистый
AGENTS.mdразложен по подпапкам, поэтому в контекст подтягивается ровно то, что относится к текущему модулю, а не вся документация разом.Я называл такой подход "иерархией AGENTS.md", "слоистый" - интересный подбор терминов. Необычный, как по мне. В любом случае, ваш опыт также подтверждает, что множественное использование AGENTS.md в одном проекте - вполне себе практическое решение. А то мне за ту статью минусов в панамку напихали, типа нейрослоп. Ну, да - нейрослоп. Специально сжатый. Не умеем мы ещё читать нейрослоп. Даже специально сжатый.
Это так, мысли вслух. Удачи в эволюции приложения!

SolidSnack
23.06.2026 01:43Какой-то текстовый квест с элементами 3д) С телефона было очень больно это пробовать))
Кажется что это демо пример игры который нейронка просто повторяет))
Так-же как восхищались люди что нейронка может солнечную систему в 3д нарисовать, что собственно изложенно в документации к three.js например и делается без нейронки)

KseniiaVi
23.06.2026 01:43На маленьких экранах интерфейс не помещается и в итоге часть кнопок просто не использовать, почему не сделать элементарный скроллинг, я уже не говорю про адаптивную вёрстку?
С тачпада корабль не умеет летать: кликаешь на кнопку по экрану, а он летит в случайное другое место. Анимации рывками.
Внутри "галактического банка" нет кнопки "назад", возможно опять интерфейс не влез.
Вы вот это называете рабочей игрой? С такими серьезными багами я бы даже друзьям не стал бы такое показывать. За баги в вёрстке и отсутствие адаптива вообще стыдно, это то чему учат в первую неделю любых курсов.

LyuMih
23.06.2026 01:43Интересная статья.
Я сейчас для себя тоже делаю браузерную игру с помощью ИИ + Cursor, идея которой живёт со мной много лет))
Я использую скилл Superpowers - он отвечает за полный цикл разработки - с последними версиями Superpowers и Composer 2.5 у него получается выполнить задачу за 1 заход + небольшие корректировки после. В сгенерерированный код специально не лезу.
Игра Gen находится на этапе прототипа и наполнения контента. После того, как будет готовый MVP планирую портировать его на Unity / веб и переписать архитектуру вручную - без нейрослопа.
Тоже думал об форме обратной связи. Наверное надо сделать отправку как у вас - на GitHub + добавить соц сети для обратной связи
badattech Автор
23.06.2026 01:43Я даже сделал mattermost чатики для работы в тредах задач и собрал там команду ботов, но система ролей - слишком много жрет контекста и никакой особой ценности не несёт, ИИ прекрасно понимают свою роль по контексту, задаче и доступным тулам. Поэтому решил гитхабом воспользоваться.

LyuMih
23.06.2026 01:43Я на 20$ тарифе в курсоре делаю. В режиме Composer Fast за полноценную задачу съедает примерно 8% лимита.
Если в медленном режиме Composer в районе 3-4% за заход.
При контексте в 200к подхожу обычно в лимит 170-180к на задаче)
Интересно будет посмотреть на работу, когда будет больше контекста

Void-Cowboy
23.06.2026 01:43Оо, косморенджеры в браузере) ну практически так как 2д таки
за инструкцию писали - было бы неплохо если игра бы начиналась с обучения
другой момент в том что игра вообще не вылизана под мобилки - у меня наползали и не влазили в экран окна, хотя по идее с телефона в такое играть как раз
к слову такое можно по локальной сети с друзьями играть тоже чисто в рамках браузера

badattech Автор
23.06.2026 01:43Спасибо что подсветили, повешу дисклеймер "не для маленьких экранов". Онбординг в процессе, сегодня будет.

Void-Cowboy
23.06.2026 01:43зарядите нейросеть. кодовые агенты отлично умеют работать с браузером самостоятельно.
если правильно расписать промт оно может и пару часов пыхтеть с тестами и перепроверками но в итоге будет полностью работающий фронт-енд на всех краевых условиях что вы описали

badattech Автор
23.06.2026 01:43Я знаю что умеют, в статье написано про летсплей. Но читать такие сложные скрины ни одна из них пока не научилась. Округлые непонятные вещи CLIP Vision не очень хорошо распознаёт. Буду ждать распространения символьных нейронок, может там эта проблема решится.

Void-Cowboy
23.06.2026 01:43хз, я недавно как раз заряжал создание фронт-енда со сложной логикой и тд
я расписал что хочу и как проверять на разных екранах и платформах и агент сам там тыкал, емулировал нажатия, открытие и заполнение окон и тд
и это при том что он делал скрины и по ним смотрел что там вообще происходит

badattech Автор
23.06.2026 01:43Это не работает в играх. Популярные нейросети обучены только на квадратно-кнопочных интерфесах. Я пишу специальный движок для летсплея, чтобы модель данных и скриншоты были более понятны LLM. А в научных работах по летсплею обычно обучают отдельную нейронку специализированную на конкретной игре.

badattech Автор
23.06.2026 01:43По поводу игры по локалке - это пошаговая игра, не совсем представляю как это сделать игрой по сети.

Axelaredz
Попробовал. Честно говоря - не очень) Кажется переусложнили. Игра должна быть понятна почти сразу или иметь обучающее начало. Или в меню добавить пункт обучение.
Тоже вот баловался с Qwen 3.7. Сварганил даже 3D html игру по мотивам SEGA - Rock N Roll Racing)
https://chat.qwen.ai/s/deploy/t_2627c6d3-8cbb-48a7-a218-abb675962db9
управление - газ вниз)
vkrasikov
Трасса огонь, астероиды-додекаэрды тоже)) Но вот управление с газом "вниз" - не удобное. И так и не понял, по кому оружие применять.
А в целом, круто, что настало время, когда можно просто сгенерировать игру без навыков программирования и тут же задеплоить, не отходя от кассы.