Хирургия вместо кувалды — инструмент graph_patch
Почему мы дали AI скальпель вместо бульдозера для исправления игровых графов — и почему JSON Patch не подошёл.
У цикла авто-исправлений (ADR-017) была проблема: единственный инструмент Builder’а для модификации графов был graph_update, требующий отправки всего JSON графа. Для сложной игры это 500-1000 строк. Исправить один аргумент в одном ActionFlow? Регенерировать все 1000 строк. А поскольку LLM — существа креативные — «исправление» одной вещи регулярно ломало три другие.
Мы рассматривали JSON Patch (RFC 6902), но он использует абсолютные индексы массивов (/nodes/14/actions/3). LLM ужасно считают индексы в длинных массивах. Builder гарантированно промахивался мимо нужного узла.
Решение — graph_patch, семантический инструмент патчинга. Вместо индексов он использует уникальные ID, которые Builder сам же и придумал:
upsertNodes— добавить или заменить конкретные узлы по IDremoveNodeIds— удалить узлы по IDupdateSettings— изменить глобальные свойства графа
Сервер обрабатывает мердж. Builder отправляет 10-строчный патч вместо 1000-строчной регенерации. Работающие узлы остаются нетронутыми. Регрессии становятся физически невозможными, потому что Builder буквально не может тронуть узлы, которые не упомянул.
В цикле исправлений Builder теперь инструктирован использовать graph_patch для правок на уровне узлов и graph_update только при фундаментальном изменении архитектуры (переписывание 80%+). plugin_config_update обрабатывает точечные изменения конфигов.
Это был маленький инструмент с массивным эффектом на сходимость цикла исправлений. Радиус поражения снизился с «весь граф» до «конкретные узлы, упомянутые в патче».