3,583 papers
arXiv:2610.34633 76 25 окт. 2026 г. FREE

CodeMeepo: перенос большого проекта на другой язык через команду агентов с независимой проверкой

КЛЮЧЕВАЯ СУТЬ
Если агент сам пишет и код, и тесты к нему, оба ошибаются одинаково. Всё собирается, тесты зелёные, а половина функций пустышки или вовсе пропущена. Метод CodeMeepo позволяет перенести большой проект на другой язык и не получить «тихо недоделанный порт». Фишка: приёмку делает внешний набор тестов, который агент не может ни написать, ни поправить. Отдельный проверяющий без права править код сверяет источник и результат по компонентам. Каждая найденная дыра возвращается в план как новая обязательная задача.
Адаптировать под запрос
⚡

TL;DR

CodeMeepo — схема работы для агентов, где перенос проекта на другой язык делится на ордеренные этапы (milestones). Каждую часть работы делает отдельная роль, а передают её друг другу через файлы, а не через переписку. Принимает работу фиксированный набор тестов, который агенты не пишут и не правят. Когда этап закончен, решает не сам агент, а жёсткие правила.

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

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

🔬

Схема метода

ФАЗА 1 — ПЕРЕНОС
ШАГ 1: Analyzer — изучает исходник, пишет дизайн цели → analysis.md (кода не пишет)
ШАГ 2: Scoper — режет поведение на упорядоченные этапы → milestones.json
ШАГ 3: Planner — план + скелет-заглушки без логики → plan.json
ШАГ 4: Translator — делает ОДИН этап, правит ошибки → код + свои юнит-тесты
ШАГ 5: Validator — гоняет внешние тесты (этот этап + все прошлые) → report.json
        провал → назад к шагу 4 (лимит попыток)
        лимит исчерпан → этап пропущен, тесты отложены (skips.json)
ШАГ 6: Parity — сравнивает источник и цель по компонентам → parity.json
        есть дыры → Scoper добавляет новые этапы → назад к шагу 4
        дыр нет → фаза закончена

ФАЗА 2 — ОПТИМИЗАЦИЯ (по раундам)
ШАГ 7: Benchmarker — замеряет, ничего не правит → bench.json
ШАГ 8: Optimizer — одна небольшая правка с сохранением поведения → optimize.json
ШАГ 9: Финальный этап: ВЕСЬ набор тестов; ломает поведение → чинить или откатить оптимизацию

Какой агент идёт дальше и когда конец — решает детерминированный контроллер (код по правилам), не агент.
🚀

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

Важно: в статье контроллер — это программа. В чате или в Claude Code его роль берёте на себя вы: вы или главная инструкция решаете, что идти дальше можно только по правилам.

Задача: Команда сервиса доставки продуктов (в духе «Самоката» или «Яндекс Лавки») переписывает модуль расчёта стоимости доставки. Он написан на PHP, живёт 8 лет, документации нет. Переносят на Python. Боль в том, что ИИ уверенно пишет код и свои тесты, а потом выясняется, что забыты надбавка за дождь и пересчёт тарифа для Новосибирска. Есть готовый набор из 120 приёмочных тестов, написанный отделом QA.

Промпт (файл CLAUDE.md в корне проекта для Claude Code или Cursor):

Проект: перенос модуля расчёта доставки из PHP (/legacy) в Python (/target).
Приёмочные тесты QA лежат в /acceptance. Их ЗАПРЕЩЕНО создавать, править,
удалять, ослаблять или пропускать. Если тест кажется неправильным — сообщи мне, не трогай.

Работаем этапами, по одному:
Этап 1 — скелет: проект собирается и стартует.
Этап 2 — базовый тариф по расстоянию.
Этап 3 — надбавки (погода, время суток, вес).
Этап 4 — региональные тарифы (все города из /legacy/regions.php).
Этап 5 — ошибки и граничные случаи.

Правила:
1. Бери только текущий этап. Заглушки на будущие этапы не трогай.
2. Этап считается готовым, только если проходят приёмочные тесты этого этапа
   И всех предыдущих этапов.
3. Пока тесты красные, не пиши «готово». Чини причину, а не тест.
4. Не больше 5 попыток на этап. После этого запиши в skips.md, что не прошло, и иди дальше.
5. Слова «миграция завершена» разрешены, только когда
   (а) все этапы пройдены или записаны в skips.md и
   (б) проверка полноты (роль Parity) выдала «полное покрытие».

Роль Parity (запускай отдельным субагентом или чатом, права на правку кода — нет):
сравни по компонентам /legacy и /target: модули, классы, функции, публичные
интерфейсы. Для каждого компонента-заглушки, пропущенного или реализованного
частично укажи путь в источнике и предложи этап. Выдай parity.md с вердиктом
«полное покрытие» или «есть пробелы». Каждый пробел становится новым этапом.

Результат: Агент идёт по этапам и после каждого отчитывается о прогоне приёмочных тестов. Падающие тесты не маскируются, а попадают в skips.md. После последнего этапа отдельный проверяющий выдаёт parity.md со списком недоделок: например, пропущенные региональные тарифы или функции-пустышки. Каждая недоделка превращается в новый этап. «Готово» агент говорит, только когда проверка полноты не нашла пробелов.

🧠

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

Слабость. Если один и тот же агент пишет код и тесты, его слепые пятна совпадают. Тесты фиксируют то, что код делает, а не то, что он должен делать. Зелёная галочка тогда ничего не доказывает. Плюс агент любит объявить «готово» своим словом. Ещё одна проблема: в большом проекте всё не влезает в контекст, а точность падает, когда нужное закопано в длинном тексте.

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

Как метод это использует. Он разводит роли: кто пишет, тот не принимает. Принимающий (тесты, Parity) не имеет права править. Приёмочные тесты внешние, их нельзя ослабить ради зелёного результата. Реализующему агенту отдают только отчёт с диагнозом, а не исходники тестов, чтобы он не подгонял код под них (в статье это защита от закона Гудхарта, но авторы честно пишут, что полностью она не работает: тексты ошибок могут «протекать»). Ограничение этапами решает проблему контекста. Накопительные ворота (этот этап плюс все прошлые) не дают новой работе ломать старую.

Рычаги управления: - Размер этапа: мельче — надёжнее, но больше циклов. - Лимит попыток на этап: меньше — быстрее едем дальше, но больше отложенных тестов. - Права ролей: чем меньше инструментов у проверяющего, тем честнее проверка (в статье Parity и Benchmarker вообще без инструмента правки файлов). - Что видит реализующий: только отчёт или ещё и тесты. Отчёт снижает подгонку. - Условие конца: внешний вердикт, а не слова агента. Можно добавить свой критерий (например, «ни одного пропущенного теста»). - Раунды оптимизации: фиксированный бюджет вместо «пока не станет быстрее».

📋

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


Источник: {путь_к_исходнику} ({язык_источника}). Цель: {путь_к_цели} ({язык_цели}).
Приёмочные тесты: {путь_к_тестам} — ЗАПРЕЩЕНО создавать, править, удалять, ослаблять.
Не входит в миграцию (исключения, не пробелы): {исключения}.
Команда сборки: {команда_сборки}. Команда тестов: {команда_тестов}.



Этап 1 — скелет: собирается и стартует.
Этап 2 — {срез_функциональности_1}
Этап 3 — {срез_функциональности_2}
...
Последний этап — полный контракт.
Каждый следующий этап зависит только от предыдущих.



Изучи источник, его зависимости и его юнит-тесты. Запиши analysis.md: соответствие
модулей источника и цели, аналоги сторонних библиотек, перечень поведений источника.
Код цели не пиши. Больше никаких файлов не создавай.



Реализуй ТОЛЬКО текущий этап: замени заглушки реальной логикой, перенеси юнит-тесты
источника, добавь тесты на новый код. Получив report.json, для каждой ошибки определи:
это дефект или функциональность ещё не перенесена, и чини причину.
Тесты не ослабляй. Не пиши «готово» сам.



Код не меняй. Запусти юнит-тесты и приёмочные тесты по накопительным воротам
(тесты этого этапа + всех предыдущих). Запиши report.json: количество прошедших и упавших
по каждому уровню, для каждой ошибки — вероятная причина и подсказка к починке.
Исходный текст приёмочных тестов не раскрывай, давай только диагноз.
Этап пройден, только если оба уровня зелёные; ошибка сборки = провал.



Права на правку кода нет. Сравни источник и цель по компонентам: модули, типы,
функции, публичный интерфейс. Исключения из  игнорируй.
Запиши parity.json: вердикт («полное покрытие» / «есть пробелы») и для каждого
отсутствующего, заглушечного или частичного компонента — путь в источнике
и предлагаемый этап.



1. Следующую роль и конец работы определяют ТОЛЬКО эти правила, а не мнение агента.
2. Этап → Translator → Validator. Провал → Translator, не больше {лимит_попыток} раз.
3. Лимит исчерпан → запиши этап как пропущенный, упавшие тесты внеси в skips.md, иди дальше.
4. После последнего этапа → Parity. Если отложенные тесты ещё не перепроверялись —
   добавь один этап для их повторной попытки (одна попытка на тест).
5. Есть пробелы → добавь этапы под каждый пробел, перепланируй, после них снова Parity.
   Не больше {лимит_раундов_parity} раундов.
6. Фаза завершена успешно, только если Parity вернул «полное покрытие».
7. В итоговом отчёте перечисли открытые и отложенные обязательства.



Роли общаются только через файлы: analysis.md, milestones.json, plan.json,
report.json, parity.json, skips.md. Перед работой роль читает нужные файлы,
после работы записывает свой.

Подставьте: пути, языки, команды сборки и тестов, список этапов, исключения, лимиты попыток и раундов.

🚀 Быстрый старт — вставь в чат:

Вот шаблон CodeMeepo (многоролевой перенос проекта с независимой приёмкой).
Адаптируй под мою задачу: [опиши, что и на что переписываешь или что нужно
переделать крупным куском]. Задавай вопросы, чтобы заполнить поля.

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

LLM спросит про источник и цель, набор приёмочных тестов (кто его написал и где лежит), как резать работу на этапы, что исключено из объёма и лимиты попыток. Всё это нужно, потому что метод держится на трёх вещах: внешней приёмке, чёткой границе этапов и честных условиях остановки. Из шаблона она возьмёт структуру ролей и перенесёт на вашу задачу. Роли можно запускать отдельными чатами или субагентами в Claude Code, а передавать между ними файлы.

⚠️

Ограничения

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

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

⚠️ Утечка тестов: Скрытие исходников тестов снижает подгонку, но не убирает её: в тексте ошибок и диагнозе могут просочиться ожидаемые значения.

⚠️ Parity — тоже модель: Проверяющий агент может ошибиться. Детерминированная обработка неверного отчёта не делает его верным.

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

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

⚠️ Разбор по частям не показан: По доступному тексту нет проверки, какой именно элемент (этапы, Parity, внешние тесты) даёт какой вклад. Сравнивали всю систему целиком с чужой.

🔍

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

Авторы (Microsoft, UC Irvine) взяли девять проектов в трёх парах языков: Java→Python, C→Rust и промышленный демон. Для каждого был готовый набор приёмочных тестов. CodeMeepo сравнивали с агентом ReCodeAgent, который считается передовым, и с четырьмя более простыми вариантами на той же модели. Мерили долю пройденных тестов.

CodeMeepo выиграл на всех девяти проектах. Java→Python: 1166 из 1180 тестов против 1029. C→Rust: все 63 против 47. Демон: все 105 против 53. В среднем получилось на 18% больше пройденных тестов.

Потом на демоне запустили фазу оптимизации: пять раундов. Пять из десяти бенчмарков улучшились больше чем на 5%. Чтения оборудования снизились на 21,6%, простой процессора — на 12,2%. В среднем у улучшившейся половины прирост около 25%.

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

💡

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

🔧 Техника: Parity как отдельный чат-ревьюер → проверка полноты любой работы

Parity-принцип работает не только для кода. Откройте новый чат без доступа к основной работе:

Ты проверяющий, править ничего нельзя. Вот ТЗ клиента и вот готовый документ.
Пройди по пунктам ТЗ и для каждого выдай: есть / частично / заглушка / нет,
с цитатой из документа. В конце — список недоработок как новых задач.

Ответ «всё есть» от автора документа ничего не стоит. Ответ от чата, который документ не писал, стоит больше.

🔧 Техника: «Не ослабляй тест» → правило в инструкции агента

Добавьте в CLAUDE.md любого проекта: «Тесты, которые я дал, не менять. Если красный — чини код. Если считаешь тест ошибочным — остановись и спроси». Это прямо следует из логики статьи: тесты можно ослабить так же легко, как улучшить код.

Экстраполяция, не из статьи:

Мы правим большой проект в Cursor. Работай этапами по списку ниже. Перед началом
каждого этапа назови, какие проверки докажут, что он готов. «Готово» писать нельзя,
пока я не подтвердил, что проверки прошли. Если упёрся в лимит попыток —
запиши проблему в отдельный файл и иди дальше.
🔗

Ресурсы

  • CodeMeepo: A Multi-Agent Workflow for Repository-Level Code Migration and Optimization
  • Авторы: Farzad Habibi (UC Irvine), Changrong Wu, Jinzhou Jiang (Microsoft), Guohan Lu (OpenAI); работа выполнена в Microsoft
  • Базовая система для сравнения: ReCodeAgent
  • Контекст: репозиторные миграции кода (Java→Python, C→Rust), приёмочные тесты как независимый оракул, закон Гудхарта

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

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

Если агент сам пишет и код, и тесты к нему, оба ошибаются одинаково. Всё собирается, тесты зелёные, а половина функций пустышки или вовсе пропущена. Метод CodeMeepo позволяет перенести большой проект на другой язык и не получить «тихо недоделанный порт». Фишка: приёмку делает внешний набор тестов, который агент не может ни написать, ни поправить. Отдельный проверяющий без права править код сверяет источник и результат по компонентам. Каждая найденная дыра возвращается в план как новая обязательная задача.

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

Работа идёт этапами, а роли передают друг другу только файлы, не переписку. Цепочка такая: Analyzer изучает исходник, Scoper режет работу на этапы, Translator делает один этап, Validator гоняет внешние тесты. Потом Parity сравнивает источник и цель и ищет недоделки. Следующий шаг выбирают жёсткие правила, а не мнение агента. Это как стройка: прораб не подписывает акт приёмки сам. Кто пишет, тот не принимает. Этап закрыт, только если проходят тесты этого этапа и всех прошлых. Новая работа не ломает старую. Реализующему агенту отдают отчёт с диагнозом, а не текст тестов. Подогнать код под тест тогда сложнее.

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

Слепые пятна писателя и его тестов совпадают. Тесты фиксируют то, что код делает, а не то, что он должен делать. Зелёная галочка тогда ничего не доказывает. Агент меряет себя собственной линейкой и рапортует «готово». Модель хорошо делает узкую задачу с чёткой обратной связью: реализуй этот этап, почини этот тест. Ещё она неплохо сравнивает два списка, например функции источника и цели, если ей не надо ничего писать. Метод даёт модели только то, что она умеет, а приёмку отнимает и отдаёт тем, кто не может схалтурить. Этапы заодно решают проблему контекста: весь проект в голову не влезает, а точность падает, когда нужное закопано в длинном тексте. Честно: авторы проверили только 9 проектов, три пары языков и одну модель. Вклад отдельных частей (этапы, Parity, внешние тесты) по отдельности не измеряли. Сравнивали систему целиком с чужой.

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

Перенос больших проектов → конкретно переезд старого кода на другой язык, особенно когда документации нет, а готовый набор приёмочных тестов от QA есть. Подойдёт и для крупной переделки, которую можно нарезать на этапы с понятной проверкой. НЕ подходит, если внешних тестов нет. Тогда приёмка разваливается, а тесты, которые пишет сам агент, авторы считают слабым доказательством. Для маленького скрипта вся эта машинерия избыточна.

Мини-рецепт

1. Найди приёмку: возьми тесты, которые писал не агент. Положи их в отдельную папку и запрети агенту трогать.
2. Нарежь на этапы: скелет, базовая логика, надбавки, региональные случаи, ошибки. Чем мельче этап, тем надёжнее. Циклов будет больше.
3. Дай правило ворот: этап готов, только если проходят тесты этого этапа и всех прошлых.
4. Поставь лимит попыток: например, 5 на этап. Не прошло, так запиши в skips.md и иди дальше. Не буксуй.
5. Запусти Parity отдельным чатом или субагентом: права на правку кода у него нет. Он сравнивает компоненты источника и цели и выдаёт вердикт «полное покрытие» или «есть пробелы».
6. Превращай пробелы в этапы: каждая дыра становится новой задачей. Ограничь число кругов проверки.
7. Замени контроллер собой: в чате статья не помощник, программы-контроллера нет. Впиши в главную инструкцию: «миграция завершена» разрешено только после вердикта Parity.
8. Оптимизируй в конце: сначала замер, потом одна небольшая правка за раунд, в конце полный прогон тестов. Скорость перепроверь сам.

Примеры

[ПЛОХО] : Перепиши модуль расчёта доставки с PHP на Python и напиши тесты, чтобы всё проверить
[ХОРОШО] : Перенос из /legacy (PHP) в /target (Python). Приёмочные тесты QA в /acceptance: ЗАПРЕЩЕНО создавать, править, удалять, ослаблять. Делай по одному этапу: 1 скелет, 2 тариф по расстоянию, 3 надбавки, 4 региональные тарифы, 5 ошибки. Этап готов, только если проходят тесты этого этапа и всех прошлых. Не больше 5 попыток, потом запиши в skips.md. Слова «миграция завершена» разрешены только после parity.md с вердиктом «полное покрытие». [ХОРОШО, роль проверяющего]: Прав на правку кода у тебя нет. Сравни /legacy и /target по модулям, классам и функциям. Для каждой заглушки, пропуска или частичной реализации укажи путь в источнике и предложи этап. Выдай parity.md. Так находятся забытая надбавка за дождь и пересчёт тарифа для Новосибирска, а агент сам про них молчит.
Источник: CodeMeepo: A Multi-Agent Workflow for Repository-Level Code Migration and Optimization
ArXiv ID: 2610.34633 | Сгенерировано: 2026-10-27 23:30

Проблемы LLM

ПроблемаСутьКак обойти
Модель проверяет себя своей же линейкойАгент пишет код и сам пишет тесты. Или пишет текст и сам его проверяет. Ошибка понимания у обеих частей одна и та же. Тесты фиксируют то, что код делает, а не то, что он должен делать. Всё зелёное, но результат неверный. Это касается кода, текстов, анализа, любой работы «сделал и сам проверил»Проверку отдавай не автору. Варианты: готовые тесты от человека, отдельный чат или субагент в роли проверяющего. Автору запрети менять критерии приёмки. Если тест кажется неверным, пусть сообщит тебе, а не правит
Модель говорит «готово», хотя часть работы не сделанаЗадача большая: перенос, рефакторинг, длинный отчёт. Агент рапортует об успехе. Но часть функций — заглушки, часть пропущена. Он не врёт нарочно. Он смотрит на свою работу тем же взглядом, которым её делал. Заметно это только после запускаНе принимай слово «готово» от автора. Запиши условие конца заранее: «закончено, только когда проверяющий выдал вердикт "полное покрытие"». Проверку полноты делает отдельная роль (см. методы)

Методы

МетодСуть
Проверяющий без права правки — честная приёмкаЗаведи отдельную роль. Она читает, сравнивает и пишет отчёт. Менять работу ей запрещено. Права на правку нет. Только отчёт. Почему работает: у проверяющего нет соблазна «просто починить» и замазать проблему. Он не наследует слепые пятна автора. Отчёт идёт автору, а автор чинит причину. Когда да: любая работа, где есть критерий правильности. Когда нет: нет ни внешних тестов, ни независимого образца. Тогда проверка слабая, и это надо помнить. Проверяющий — тоже модель и может ошибиться
Сверка двух списков — поиск недоделокПопроси модель сравнить источник и результат по частям: модули, функции, разделы, пункты ТЗ. Для каждой части — статус: есть, заглушка, частично, нет. Для каждой дыры укажи, где она в источнике, и предложи задачу. Сравни {источник} и {результат} по компонентам. Вердикт: "полное покрытие" или "есть пробелы". Для каждого пробела — путь в источнике и новая задача. Почему работает: сравнивать два набора модель умеет хорошо, если ей ничего не надо писать. Важно: каждая найденная дыра становится новой обязательной задачей. После неё сверку делай снова. Ограничь число кругов. Применяй: перенос кода, переписывание документации, сверка реализации с ТЗ, проверка саммари на пропуски
Этапы с накопительной приёмкойРежь большую работу на упорядоченные этапы. Агент делает один этап за раз. Этап принят, только если проходят проверки этого этапа и всех прошлых. Бери только текущий этап. Заглушки на будущие не трогай. Почему работает: большая задача не лезет в контекст, а точность падает, когда нужное закопано в длинном тексте. Узкий этап с чёткой обратной связью модель делает надёжнее. Проверка прошлых этапов не даёт новой работе ломать старую. Рычаги: мельче этап — надёжнее, но больше циклов. Когда нет: задача короткая или этапы нельзя упорядочить
Лимит попыток и журнал пропусковЗадай число попыток на этап, например 5. После лимита агент записывает неудачу в файл skips.md и идёт дальше. В конце пропуски перепроверяются один раз и попадают в итоговый отчёт. Почему работает: агент не зацикливается и не прячет упавшее. Проблема остаётся видимой, а не растворяется в «почти готово». Когда да: длинные цепочки задач. Когда нет: одна небольшая задача
Исполнителю — диагноз, а не текст проверокАгент, который чинит, получает отчёт: что упало и вероятная причина. Исходники тестов или критериев он не видит. Исходный текст тестов не раскрывай. Давай только диагноз. Почему работает: видя критерий, модель подгоняет под него решение, а не решает задачу. Защита неполная: ожидаемые значения могут просочиться через тексты ошибок. Когда да: тесты скрыты, правок много. Когда нет: нужно, чтобы агент понимал контракт целиком

Тезисы

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

CodeMeepo: A Multi-Agent Workflow for Repository-Level Code Migration and Optimization

arXiv: 2610.34633

Обычные AI-агенты эпично лажают при миграции целых репозиториев по двум причинам: раздутый контекст и самообман. Когда одна модель и пишет код, и сама себе сочиняет тесты, она неизбежно подгоняет проверки под свои же слепые зоны. На выходе получается бодрый зелёный статус, под капотом которого лежит неработающий мусор. Фреймворк CodeMeepo ломает эту порочную практику и вводит армейскую дисциплину.

Это как нанять студента делать ремонт и разрешить ему самому принимать у себя работу. Он криво прибьёт плинтус, бодро заявит «я художник, я так вижу», распишется в акте и свалит с деньгами. Чтобы проект не превратился в руины, нужен внешний технадзор, который тупо сверяется с исходным чертежом и бьёт по рукам при первой попытке сдать халтуру, а не верит исполнителю на слово.

Система работает за счёт трёх строгих правил. Первое — деление задачи на поэтапные майлстоуны вместо попытки переписать всё скопом. Второе — агенты передают результаты через файлы на диске, а не в бесконечной простыне переписки, где модель мгновенно слепнет. Третье — работу принимает неизменяемый набор тестов, к правкам которого агентов близко не подпускают. Готов этап или нет, решает не модель со своим «шеф, всё готово», а жёсткий скрипт-контроллер.

Авторы гоняли фреймворк на переносе кода между языками программирования, но принцип универсален. Это рабочий шаблон для любой многоходовки: от масштабного рефакторинга в Claude Code до автогенерации сложной документации. Как только агент пытается отвечать за весь цикл сразу, он захлёбывается в контексте и начинает галлюцинировать. Разделение ролей и внешний арбитраж спасают любую сложную автоматизацию.

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

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

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

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