3,583 papers
arXiv:2610.29456 77 21 окт. 2026 г. FREE

RegoMender: мультиагентный ремонт кода по циклу «проверка → диагноз → правка → откат при застое»

КЛЮЧЕВАЯ СУТЬ
Если после каждой правки вылезают новые ошибки, а модель предлагает «переписать всё заново», дело не в её глупости. Она не помнит, что уже пробовала, и не видит, что ошибка не меняется. Метод RegoMender позволяет чинить конфиги, SQL-запросы и политики доступа автоматически, пока линтер и тесты не скажут «зелёное». Работают три роли: диспетчер (Orchestrator), диагност (Analyzer) и исполнитель (Repairer). Фишка: диспетчер сам код не пишет. Он только смотрит на вердикт проверки и решает, кому передать работу. При застое он откатывает код к последней рабочей версии.
Адаптировать под запрос
⚡

TL;DR

RegoMender — система из трёх ролей: Orchestrator (диспетчер), Analyzer (диагност) и Repairer (исполнитель). Они чинят код по замкнутому циклу. После каждой правки официальный проверяющий инструмент (линтер, тесты) сообщает, стало ли лучше. Роли обмениваются записями через общую «доску» (Blackboard), а при застое система откатывается к последней рабочей версии.

Главная боль: модель чинит один сбой, а под ним вылезает следующий. Или она ходит по кругу: меняет код, ошибка та же, и так пять раз. Причина в том, что модель не видит состояния процесса. Она не помнит, что уже пробовала, и не знает, когда пора остановиться. Кроме того, ей не хватает контекста о коде вокруг ошибки. В эксперименте убрали инструмент сбора контекста (Context Scan), и именно это просадило результат сильнее всего.

Метод разводит роли. Диспетчер сам код не пишет, а только решает, кому передать работу. Простые ошибки с понятной строкой идут сразу исполнителю, сложные и повторяющиеся сначала диагносту. Если состояние ошибок не меняется несколько попыток подряд, диспетчер откатывает код и просит новый диагноз. Цикл заканчивается, только когда проходят обе проверки: синтаксис и тесты.

🔬

Схема метода

ЦИКЛ (до лимита итераций):
ШАГ 1: Orchestrator берёт код с доски → запускает Verify → получает список ошибок
ШАГ 2: Orchestrator фиксирует «сигнатуру ошибок» (категория, количество, серия повторов)
ШАГ 3: Маршрутизация:
   • простая ошибка (ясная строка)        → Repairer
   • неясная / про зависимости / повторная → Analyzer → диагностический отчёт на доску → Repairer
ШАГ 4: Repairer правит: Patch (точечно) или Rewrite (больше 10 ошибок, нужна перестройка блока)
ШАГ 5: Verify снова:
   • состояние изменилось → прогресс, серия повторов обнуляется
   • не изменилось → новый диагноз от Analyzer
   • серия достигла порога → ОТКАТ к снимку до застоя + новый диагноз
ВЫХОД: Done только если прошли и синтаксис, и тесты (или лимит итераций)

Всё это работает как программа с отдельными вызовами модели. В обычном чате цикл придётся вести вручную или поручить агенту с доступом к терминалу.

🚀

Пример применения

Метод сильнее всего там, где есть автоматическая проверка с чётким вердиктом: линтер, компилятор, тесты. Статья показала, что подход переносится с Rego на HCL (язык Terraform) и SQL.

Задача: DevOps-инженер в российской финтех-компании переносит инфраструктуру в Яндекс Облако. Terraform-конфиг на 400 строк падает на terraform validate. Он чинит одну ошибку, и вылезают три новые. ChatGPT в чате уже дважды предлагал «переписать всё заново».

Промпт (для Claude Code или другого агента с доступом к терминалу):

Ты работаешь по протоколу ремонта с тремя ролями. Файл: infra/main.tf.
Проверка: `terraform validate` (синтаксис) и `terraform plan` без ошибок (смысл).

Веди файл notes/blackboard.md — это общая доска. В нём три раздела:
- Code: номер версии и что изменено (перед каждой правкой делай git commit как снимок)
- Report: диагнозы Analyzer (категория ошибки, строка, сообщение, контекст, приоритет)
- Signature: <категория ошибки, число ошибок, серия повторов подряд>

Роль Orchestrator: сам код не правишь. Запускаешь проверку, обновляешь Signature,
решаешь, кому передать работу.
- Ошибка локальная и строка ясна → Repairer
- Ошибка неясная, про зависимости между ресурсами или повторяется → сначала Analyzer
- Состояние изменилось → прогресс, серия = 0
- Состояние не изменилось → запрос нового диагноза у Analyzer
- Серия = 3 → git revert к снимку до застоя и запрос нового диагноза
- Лимит: 15 итераций, потом остановись и покажи, что осталось
- Done только когда проходят и validate, и plan

Роль Analyzer: читаешь вывод проверки, раскладываешь каждую ошибку на
категорию / строку / сообщение, собираешь контекст (какие ресурсы и переменные
связаны с этим блоком), записываешь причину в Report. Код не меняешь.

Роль Repairer: берёшь диагноз из Report. Точечная ошибка → правишь одну строку.
Больше 10 ошибок или сломана структура блока → переписываешь блок целиком.
Не удаляй ресурсы, чтобы «пройти проверку».

Начинай с Orchestrator.

Результат: агент создаст файл-доску и будет вести журнал. В каждой итерации будет видно, какая роль работала и что показала проверка. Когда он зациклится, в логе появится откат к снимку. Финал: либо оба вердикта зелёные, либо остановка по лимиту со списком остатка.

🧠

Почему это работает

Слабость. Модель «в лоб» делает цикл «правка → ошибка → правка» без памяти о прошлых попытках. Она не замечает, что состояние не меняется, и не умеет откатываться. Часто она «чинит» проблему тем, что удаляет проверяемый код. Ещё одна слабость: модель плохо знает редкие языки и не видит контекст вокруг строки с ошибкой.

Сильная сторона. Модель хорошо работает, когда задача узкая и чётко описана. Она отлично читает вывод проверяющей программы и диагностирует по структурированному отчёту. Лучше всего она справляется, когда вердикт даёт внешний инструмент, а не её собственное мнение.

Как метод это использует. Он выносит «память процесса» наружу: на доску и в счётчик повторов. Решение «что делать дальше» принимает отдельная роль по явным правилам, а не модель между делом. Проверка остаётся единственным источником истины. Откат превращает тупик в управляемую ситуацию.

Рычаги управления: - Порог застоя (в примере 3) → меньше значит быстрее откат, больше значит больше попыток подряд. - Лимит итераций → защита от бесконечного цикла и от расхода токенов. - Порог «более 10 ошибок → переписать» → под свою задачу: когда точечные правки уже не помогают. - Правила маршрутизации → что считать «простой» ошибкой, а что «сложной». - Обязательный сбор контекста → в статье он дал самый заметный вклад, поэтому не выбрасывай эту роль ради экономии.

📋

Шаблон промпта


Починить {файл_или_артефакт}.
Проверка 1 (синтаксис): {команда_проверки_1}
Проверка 2 (смысл): {команда_проверки_2}



Файл доски: {путь_к_файлу_доски}
- Code: версии кода (перед каждой правкой — снимок: {способ_снимка})
- Report: диагнозы Analyzer (категория, строка, сообщение, контекст, приоритет)
- Signature: <категория ошибки, число ошибок, серия повторов>



- Verify: запускает проверки, возвращает список ошибок
- ContextScan: собирает переменные, зависимости, связанные блоки вокруг ошибки
- ErrorTriage: превращает вывод проверки в список «категория / строка / сообщение»
- Patch: точечная правка одной строки
- Rewrite: замена блока целиком



Код не пишет. В каждой итерации:
1. Verify на последней версии кода с доски.
2. Обновить Signature.
3. Маршрут:
   - локальная ошибка, строка ясна → Repairer
   - неясная / про зависимости / повторяется → Analyzer, затем Repairer
4. После правки снова Verify:
   - состояние изменилось → серия = 0
   - не изменилось → новый диагноз от Analyzer
   - серия = {порог_застоя} → откат к снимку до застоя + новый диагноз
5. Done только когда проходят обе проверки.
6. Стоп при {макс_итераций} итерациях.



ErrorTriage + ContextScan → причина каждой ошибки → запись в Report. Код не меняет.



Берёт диагноз из Report. Ошибок больше {порог_переписывания} → Rewrite, иначе Patch.
Запрещено удалять проверяемый код, чтобы пройти проверку.


Начни с Orchestrator.

Что подставлять: - {файл_или_артефакт}: конфиг, SQL-запрос, скрипт, политика. - Команды проверки: то, что даёт чёткий вердикт («прошло» или «упало»). - {порог_застоя}: обычно 2–3. - {макс_итераций}: 10–20. - {порог_переписывания}: в статье 10.

🚀 Быстрый старт — вставь в чат или в агента:

Вот шаблон протокола ремонта RegoMender (Orchestrator, Analyzer, Repairer + доска + откат при застое).
Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.

[вставить шаблон выше]

LLM спросит, чем проверять результат (команды, тесты), где хранить снимки и какие инструменты есть у агента. Метод держится на внешнем вердикте и откате: без них цикл не замкнётся. Она возьмёт паттерн из шаблона и подстроит под твой стек.

⚠️

Ограничения

⚠️ Нужна внешняя проверка: метод построен вокруг инструмента с чётким вердиктом (линтер, компилятор, тесты). Для текстов, стратегий, креатива, где «правильно» нельзя проверить командой, он не годится.

⚠️ Нужны инструменты: в оригинале вызовы Verify, Context Scan и других реализованы программно (дерево разбора кода, граф зависимостей). В чате без терминала цикл придётся вести руками. Агент с терминалом справится, но в статье такой перенос не проверяли: это адаптация.

⚠️ Узкая область: основная проверка проведена на Rego, языке политик. Перенос на HCL и SQL показан, но на обычные языки вроде Python или JavaScript и на длинные многофайловые проекты оценки нет. Набор тестов брал только исправления в одном файле.

⚠️ Промптов нет в доступной части: текст статьи обрезан, самих системных промптов агентов нет. Структура описана словами, поэтому шаблон выше — реконструкция по описанию, а не копия оригинала.

⚠️ Цена: три роли и повторные проверки дороже одного запроса. Для простых однострочных ошибок оверхед не окупается.

🔍

Как исследовали

Сначала авторам пришлось собрать тестовый набор: для ремонта Rego его не существовало. Они взяли 2 847 репозиториев на GitHub и вытащили 54 821 правку. Правки отфильтровали: убрали косметику и случаи, где разработчик просто удалил код, чтобы пройти проверку. Остались только исправления в одном файле, которые воспроизводятся. В итоге набралось 1 159 реальных ошибок семи типов. Три опытных разработчика разметили их по сложности, согласованность оказалась очень высокой. Почти 60% случаев — «цепочки»: починил одну ошибку, и вылезла другая.

RegoMender сравнили с четырьмя существующими методами автоматического ремонта кода. Он добился 82,9% синтаксического и 77,9% смыслового успеха (по тестам), то есть на 13,4% лучше сильнейшего конкурента. Он занял первое место по всем семи типам ошибок. Устойчивость на цепочечных ремонтах удивила: у других методов результат на сложных случаях падал, а у RegoMender почти нет.

Затем авторы по очереди убирали инструменты. Самый сильный удар по качеству дало отключение Context Scan. Вывод для практики: починка кода держится на контексте, а не на «умности» модели. Они проверили метод на HCL и SQL, где он тоже обогнал конкурентов, и на 132 реальных уязвимостях (CVE), где починил 86,4%. Лучший баланс цены и качества дала модель DeepSeek-V3.1-Terminus.

💡

Адаптации и экстраполяции

🔧 Техника: добавить обязательный первый шаг «собери контекст» → меньше слепых правок

Перед любой правкой в Repairer добавь в промпт: Перед правкой перечисли переменные, импорты и связанные блоки вокруг строки с ошибкой. Только потом меняй. Ablation в статье показывает, что именно этот шаг даёт наибольший вклад.

🔧 Техника: показывать журнал → видеть, где зациклился

Добавь в Orchestrator: После каждой итерации печатай одну строку: номер, роль, сигнатура до → после, решение. Так застой виден сразу, а не после десятого круга.

Экстраполяция — тот же каркас для тестов в проекте на Python:

Задача: починить падающие тесты в {папка}. Проверка: `pytest -x`.
Роли и доска — как в протоколе выше. Новое правило для Repairer:
нельзя менять или удалять сами тесты, чтобы они прошли.
Порог застоя — 2 прогона подряд с тем же падающим тестом → откат (git reset к снимку).
🔗

Ресурсы

  • RegoMender: A Multi-agent Framework for Automated Rego Policy Repair (ASE '26, Мюнхен)
  • Авторы: Ruijie Zhang, Huaxiao Yin, Li Hu, Fanqi Kong, Haozhe Liang, Shaoyin Cheng, Kun Zhang, Bibo Tu
  • Институты: Institute of Information Engineering (CAS), University of Chinese Academy of Sciences, USTC, Peking University
  • Упомянуто в работе: RegoBench (1 159 исправлений Rego), Open Policy Agent (OPA), сравнения с ThinkRepair и RepairAgent
  • DOI: https://doi.org/10.1145/3832783.3837490

📋 Дайджест исследования

Ключевая суть

Если после каждой правки вылезают новые ошибки, а модель предлагает «переписать всё заново», дело не в её глупости. Она не помнит, что уже пробовала, и не видит, что ошибка не меняется. Метод RegoMender позволяет чинить конфиги, SQL-запросы и политики доступа автоматически, пока линтер и тесты не скажут «зелёное». Работают три роли: диспетчер (Orchestrator), диагност (Analyzer) и исполнитель (Repairer). Фишка: диспетчер сам код не пишет. Он только смотрит на вердикт проверки и решает, кому передать работу. При застое он откатывает код к последней рабочей версии.

Принцип работы

Это конвейер с замкнутым циклом: проверка → диагноз → правка → снова проверка. 1. Диспетчер запускает официальную проверку (линтер, компилятор, тесты) и записывает сигнатуру ошибок: категория, количество, сколько раз подряд она не меняется. 2. Простая ошибка с ясной строкой идёт сразу исполнителю. Неясная, про зависимости или повторная идёт сначала диагносту. Тот пишет отчёт на общую «доску» (обычный файл). 3. Исполнитель правит точечно. Если ошибок больше 10, он переписывает блок целиком. 4. Сигнатура не изменилась несколько раз подряд? Откат к снимку до застоя и новый диагноз. Цикл закончится только тогда, когда проходят обе проверки: и синтаксис, и тесты. Это как врач, который не выписывает пациента, пока анализы не в норме. Самочувствие пациента его не интересует.

Почему работает

Модель «в лоб» крутится в цикле «правка → ошибка → правка» без памяти. Иногда она «чинит» код тем, что удаляет проверяемый кусок. Проверка проходит, но смысл потерян. Метод выносит память процесса наружу: на доску и в счётчик повторов. Решение «что делать дальше» принимает отдельная роль по явным правилам, а не модель между делом. Вердикт даёт внешний инструмент, а не мнение самой модели. В экспериментах убрали сбор контекста (Context Scan), то есть переменные и связанные блоки вокруг ошибки. Именно это просадило результат сильнее всего, сильнее, чем отключение любой другой части. Модель чинит строку вслепую, не зная, что с ней связано. Честно: в доступной части статьи нет красивых итоговых цифр. Основная проверка шла на Rego (язык политик доступа). Перенос на Terraform-конфиги (HCL) и SQL показан, но проверен слабее.

Когда применять

Исправление кода и конфигов → особенно когда есть команда с чётким вердиктом «прошло или упало»: terraform validate, компилятор, тесты, линтер. Идеально для случая, когда правишь одну ошибку и вылезают три новые. Не подходит для текстов, стратегий и креатива: там «правильно» командой не проверить. Для однострочных ошибок тоже не нужен: три роли и повторные проверки дороже одного запроса. В обычном чате цикл придётся вести руками, поэтому лучше брать агента с доступом к терминалу. Такой перенос в статье не проверяли, это адаптация.

Мини-рецепт

1. Найди судью: команда, которая честно говорит «прошло» или «упало». Лучше две: на синтаксис и на смысл.
2. Заведи доску: файл blackboard.md с тремя разделами: Code (версии), Report (диагнозы), Signature (категория ошибки, число ошибок, серия повторов).
3. Включи снимки: перед каждой правкой делай git commit. Без снимка откат невозможен.
4. Раздай роли: диспетчер не правит код, диагност не меняет код, исполнитель берёт только готовый диагноз.
5. Выбери пороги: застой 2–3 повтора, лимит 10–20 итераций, переписывать блок при более чем 10 ошибках.
6. Запрети жульничество: «не удаляй ресурсы, чтобы пройти проверку».
7. Не режь диагноста ради экономии: сбор контекста дал самый заметный вклад.
8. Не хочешь писать сам: вставь шаблон из исследования и попроси модель адаптировать его под твою задачу. Она спросит, чем проверять, где хранить снимки и какие инструменты есть у агента.

Примеры

[ПЛОХО] : Terraform падает на validate, исправь ошибки в main.tf Модель чинит одну ошибку, вылезают три новые. Через два круга она предлагает переписать всё с нуля. Что уже пробовала, не помнит.
[ХОРОШО] : Работаешь по протоколу ремонта с тремя ролями. Файл: infra/main.tf. Проверки: terraform validate (синтаксис) и terraform plan без ошибок (смысл). Веди notes/blackboard.md: Code, Report, Signature <категория ошибки, число ошибок, серия повторов>. Перед каждой правкой делай git commit. Orchestrator код не правит: запускает проверку и обновляет Signature. Ясная строка идёт в Repairer, неясная или повторная сначала в Analyzer. Состояние не изменилось: новый диагноз. Серия = 3: git revert к снимку до застоя и новый диагноз. Лимит 15 итераций. Done, только когда проходят и validate, и plan. Repairer не удаляет ресурсы, чтобы пройти проверку. Начинай с Orchestrator. В журнале видно, какая роль работала и что показала проверка. Если агент зациклился, там появится откат к снимку. Финал: либо оба вердикта зелёные, либо остановка по лимиту со списком того, что осталось.
Источник: RegoMender: A Multi-agent Framework for Automated Rego Policy Repair
ArXiv ID: 2610.29456 | Сгенерировано: 2026-10-22 17:00

Проблемы LLM

ПроблемаСутьКак обойти
Модель ходит по кругу при исправлении ошибокПросишь починить код, конфиг или запрос. Проверка показывает ошибки. Модель правит, и ошибка та же или вылезает новая. Так пять раз подряд. Модель не помнит прошлые попытки. Не замечает, что ничего не меняется. Не умеет остановиться и вернуться назад. Это касается любых задач «правка → проверка → правка»Вынеси память процесса наружу. Веди журнал: версия кода, список ошибок, сколько раз подряд список не менялся. Перед каждой правкой делай снимок (git commit). Если список ошибок не меняется 2–3 попытки, откатись к снимку и начни с нового диагноза. Поставь лимит итераций

Методы

МетодСуть
Журнал ошибок и откат при застое — выход из зацикливанияЗаведи файл-журнал. Записывай в него «сигнатуру ошибок»: категория, число ошибок, серия одинаковых результатов подряд. После каждой правки запускай проверку и сравнивай сигнатуру. Изменилась — прогресс, серия обнуляется. Не изменилась — серия растёт, и просишь новый диагноз. Серия дошла до порога (обычно 2–3) — откат к последней рабочей версии и новый диагноз. Почему работает: модель сама не видит, что топчется на месте. Счётчик в тексте делает застой заметным. Откат убирает испорченные правки, которые тянут её в тот же тупик. Дополнительно: разделяй работу. Простая ошибка с ясной строкой — сразу на правку. Неясная или повторная — сначала отдельный шаг диагноза (категория, строка, причина), код на нём не меняется. Когда ошибок больше 10 или сломан блок, проси переписать блок целиком, а не латать по строке. Когда применять: есть команда проверки с ответом «прошло/упало» (линтер, компилятор, тесты). Когда не работает: тексты, креатив, стратегии, где «правильно» нельзя проверить командой. Для одной простой ошибки это лишние траты. В обычном чате журнал придётся вести вручную. Лучше работает в агенте с доступом к терминалу

Тезисы

ТезисКомментарий
Контекст вокруг ошибки важнее остальных приёмовМодель видит строку с ошибкой, но не видит окружения. Не знает, какие переменные, ресурсы и соседние блоки с ней связаны. Особенно это заметно в редких языках и конфигурациях. Без сбора контекста качество падает сильнее, чем без любого другого приёма. Применяй: вместе с ошибкой отдавай связанные блоки, объявления переменных, зависимости. Не экономь на этом шаге, даже если вся схема с ролями упрощена
📖 Простыми словами

RegoMender: A Multi-agentFramework for Automated Rego Policy Repair

arXiv: 2610.29456

Обычные нейронки чинят код на редких языках вроде Rego как слепые котята: ловят ошибку, вслепую вносят правку, получают новую ошибку и зацикливаются. Хуже того — когда модель заходит в тупик, она часто просто удаляет проблемный кусок кода и делает вид, что всё исправила. RegoMender ломает этот тупой паттерн. Вместо одиночного чата здесь рулит мультиагентная система с памятью, которая сверяет каждый чих с реальным компилятором и откатывается назад, если зашла в дебри.

Это как пьяный сантехник, который чинит капающий кран: каждый раз крутит случайную гайку, заливает соседей, а потом просто срезает трубу болгаркой, заявляя, что капать перестало. Одиночная модель делает ровно то же самое. Но если приставить к работяге прораба с чертежами и проверять давление манометром после каждого движения ключа, фокусы закончатся — начнётся нормальный инженерный ремонт.

Система держится на чётком разделении труда: роли Orchestrator, Analyzer и Repairer последовательно ставят диагноз и пишут фикс. Они не теряют контекст, а скидывают мысли на общую доску — Blackboard. Главный предохранитель здесь — официальный линтер в роли неподкупного судьи. Если правка не сработала или агенты начали топтаться на месте, включается механизм отката к прошлой стабильной версии, вместо того чтобы плодить новые костыли.

Авторы гоняли фреймворк на специфичном Rego, но принцип универсален. Подход отлично ложится на HCL для Terraform и сложный SQL — вообще на любые языки, где есть въедливый автоматический проверяльщик вроде линтера или юнит-тестов. Как только среда даёт чёткий бинарный вердикт без абстрактных рассуждений, агенты перестают гадать на кофейной гуще и начинают методично выдавать рабочий код.

Короче: хватит просить одиночную модель «починить этот скрипт» простым промптом — на выходе получишь вырезанную логику и скрытые уязвимости. Специализированные роли, общая память и жёсткие автотесты превращают галлюцинирующую сетку в адекватного разработчика. Кто продолжит править сложный код в одном окне чата, будет вечно выгребать самодельный мусор.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с