Game-Logic IR — атомарные примитивы вместо свободного JavaScript
После нуля играбельных игр мы диагностировали настоящую проблему: просить LLM писать программы — неправильная абстракция. Вот что мы строим вместо этого.
Несмотря на месяцы декомпозиции пайплайна, закалки промптов и архитектурных улучшений, проект не произвёл ни одной играбельной игры. Ни одной. Ceiling probe (task-184) подтвердил: даже фронтирная модель на простейшей игре проходила структурную валидацию, но падала на семантике — ресурс начислялся не тому игроку, преждевременный emit, отсутствующая инициализация. Цикл исправлений исчерпывал бюджет, не починив ни одного бага.
Диагноз: system.executeScript (ADR-012) превратил генерацию GraphDoc в синтез программы из естественного языка. Это одна из тяжелейших задач для LLM, особенно для бесплатных open-weight моделей. Пространство семантических ошибок бесконечно. Закалка промптов лечит симптомы по одному, но выразительность, порождающая баги, остаётся.
ADR-026 предложил третий путь между двумя провалившимися крайностями:
- Левый край (ADR-012): свободный JS → бесконечное пространство семантических ошибок
- Правый край (запрещён ADR-008): кодировать каждую механику макро-плагином → взрыв каталога
Третий путь: Game-Logic IR — малый, ортогональный, жёстко типизированный, композируемый набор низкоуровневых примитивов логики. Вместо написания JavaScript AI собирает механики из 15-20 строительных блоков: data.filter, math.calculate, state.set, resources.modify, turns.*. Сложные механики становятся цепочками: turns.getCurrentPlayer → players.filter(id≠current) → math.multiply(round, 2) → resources.decrease(target, 'hp', amount).
Ключевой инсайт: выразительность стремится к бесконечности через композицию, а пространство семантических ошибок коллапсирует, потому что правила сборки контролируются на уровне грамматики. Неправильные программы становятся непредставимыми.
После того как ceiling probe подтвердил H2 (фронтирные модели тоже падают на свободном JS), ADR был принят. Контракт IR специфицирован в lean_spec/ai/game-logic-ir.md. Он включает три фундаментальных шва (резолвер для модифицируемых значений, compute-then-commit с перехватываемыми хуками, реестр модификаторов как ДАННЫЕ в стейте) и effect-stack для моделей исполнения push/pull.
Это не улучшение промпта. Это сдвиг представления — изменение того, что генерирует AI, а не того, как он генерирует.