
Вы проверяете каждый шаг, который делают ваши агенты. Не потому, что хотите этого, а потому, что больше этого никто не делает.
Чтобы встать с этого стула, нужны две вещи, а почти все строят только одну из них.
Цикл делает отдельную единицу работы правильной без вашего участия. Граф решает, какие единицы работы вообще должны существовать.
Ниже — различие между ними, неочевидная механика и точка, в которой вы утверждаете одну вещь вместо всего подряд.
Цикл — это проверка, которая может завершиться неудачей
Если отбросить всё остальное, цикл состоит из четырёх частей: создать, проверить, исправить, повторять до зелёного результата.
Проверка — это и есть весь цикл.
Если нет механизма, способного отклонить работу, пока вас нет рядом, у вас не цикл. У вас планировщик.
Это кажется очевидным, но почти никто не пишет проверку первой.
Сначала строят саму работу, затем прикручивают ревью в конец, а ревью оказывается ещё одной моделью, которую попросили посмотреть на результат.
Два оптимиста согласились друг с другом.
Сначала напишите условие — и сформулируйте его так, чтобы его могла вычислить программа:
ЗЕЛЁНЫЙ набор тестов завершился с кодом 0
ЗЕЛЁНЫЙ каждое утверждение содержит строку источника
ЗЕЛЁНЫЙ diff затрагивает только файлы, перечисленные в плане
НЕ ПРОВЕРКА результат выглядит хорошо
НЕ ПРОВЕРКА модель говорит, что уверена
НЕ ПРОВЕРКА ошибок не возникло
Последний пункт ловит даже аккуратных людей. Отсутствие ошибки не доказывает правильность.
Постройте на этом цикл — и получите систему, которая уверенно повторяет одну ошибку, пока не закончится бюджет, сохраняя при этом безупречно чистый журнал.
Потолок, о котором никто не предупреждает
Цикл улучшает одну единицу работы. Это вся его задача, и с ней он справляется очень хорошо.
Он не может решить, какие единицы должны существовать, в каком порядке они идут и действительно ли двум из пяти шагов нужно ждать друг друга.
В результате вы получаете очень хорошего агента, который выполняет три неправильных шага, в неправильном порядке и по одному.
Каждый шаг выполнен правильно. Итог всё равно медленный и всё равно имеет неверную структуру. Настройка цикла это не исправит, потому что ошибка находится не внутри отдельной единицы.
Именно в этот момент люди начинают винить модель. И именно в этот момент следующий уровень начинает окупаться.

Граф — это уровень выше
Граф — это форма работы: что запускается, что выполняется одновременно, что ждёт, что не запускается вовсе и куда возвращаются результаты.
Всего два понятия. Узел — это единица работы: одна ограниченная задача, один вход, один выход.
Ребро — это зависимость: выход одного узла подаётся на вход другого.
Ошибка, стоящая за каждым лишним ожиданием, — считать слова «а затем» ребром.
Между задачами «суммировать файл» и «затем проверить погоду» нет ребра. Проверка погоды не использует резюме файла.
Это два независимых узла, которые линейный скрипт связал лишь потому, что вы напечатали их в таком порядке.
Поэтому задайте вопрос для каждой стрелки в уже существующем конвейере: следующий шаг действительно читает результат предыдущего?
Если вы не можете назвать переменную, которая передаётся дальше, ребра нет, а ожидание — чистая потеря времени.
В большинстве цепочек есть две или три такие стрелки. Обычно их обнаружение даёт самое большое единичное ускорение из всех доступных.
Четыре вида узлов, и один из них — не модель
Разделитель, работник, кодовый узел, шлюз. Это весь словарь.
Разделитель разрезает работу на единицы и стоит в самом начале.
Он принимает больше решений, чем любой другой узел, потому что разделение по неправильному признаку впустую расходует всё, что находится ниже по графу.
Разделите репозиторий по папкам — и четыре работника будут проверять одни и те же три файла.
Разделите по радиусу воздействия — и каждый увидит то, чего не могут увидеть остальные.
Каждый работник выполняет одну единицу, смотрит через одну призму и работает в собственном контексте. Последнюю часть постоянно пропускают.
Дайте четырём аудиторам общее окно — и они сойдутся в одной точке: первый запишет находку, остальные её прочтут, и все четыре отчёта сосредоточатся на одном и том же.
Вы заплатили в четыре раза больше за одно мнение и три его эха.
Кодовый узел — тот, о существовании которого люди забывают. Слияние, ранжирование, дедупликация, сравнение каждого экспорта до и после.
Ничто из этого не является рассуждением. У каждой операции есть ровно один правильный ответ, каждая занимает несколько строк кода, а запуск через модель добавляет стоимость, задержку и вариативность туда, где их не было.
Если преобразование можно описать без слов «судить», «решать», «оценивать» или «суммировать», это код.
Граф, в котором каждое ребро — агент, платит аренду за собственную проводку.

Где на самом деле живёт цикл
Одно предложение снимает всю путаницу: цикл живёт внутри узла, граф живёт между узлами.
Внутри одной единицы: создать, проверить, исправить, повторять до зелёного результата.
Между единицами: разделить, разветвить, слить, проверить шлюзом, вернуть назад. Ничто из второго списка нельзя выразить изнутри одной единицы.
Поэтому выбирать между ними не нужно. Граф без циклов внутри узлов производит непроверенную работу параллельно — а это хуже последовательного выполнения, потому что такой работы становится больше.
Цикл без графа вокруг — один очень хороший шаг в очереди, которую никто не проектировал.
Два обратных пути — и тот, который пропускают почти все
Граф без обратного пути — это конвейер. Он выдаёт результат и забывает о нём.
На следующей неделе он начнёт с той же точки и с теми же слепыми зонами.
В рабочих графах есть два обратных пути, и они выполняют разные задачи.
Ребро исправления короткое. Шлюз отклоняет одну единицу обратно к породившему её шагу — и исправляет текущий запуск.
Ребро обучения длинное. Принятый результат возвращается к разделителю в виде ограничения — и исправляет все последующие запуски.
Почти все строят первый путь и пропускают второй. Узнать такую систему легко: она быстрая, но никогда не становится умнее.
Ребро обучения переносит не результат, а ограничение, выведенное из результата:
ПРИНЯТО срез utils перенесён, зелёный с первого прохода
ВЫВЕДЕНО адаптеры точно сохраняют именованные аргументы
ПОПАДАЕТ В бриф разделителя для каждого следующего среза
Обратите внимание, куда оно попадает. Не в инструкции работника, а в бриф, который определяет способ разделения работы.
Подтверждённая причина становится правилом, поэтому следующая поломка начинается там, где закончилась предыдущая.

Возвращайте единицу, а не весь пакет
Это самая дорогая ошибка на обратном пути, и её стоит сформулировать прямо.
Перенесены четыре среза. Один не проходит тесты. Если вернуть весь пакет, три правильных среза будут переписаны.
Их следующая версия окажется другой, но не лучшей, потому что в них ничего не было сломано.
Теперь вам нужно заново проверить все четыре, и любой из трёх может на этот раз не пройти по причинам, не связанным с исходной ошибкой.
Вы превратили один сбой в четыре неопределённых результата и ещё заплатили за это. Сделайте так дважды за один запуск — и система никогда не сойдётся.
Снаружи это выглядит так, будто модель снова и снова терпит неудачу. На деле обратный путь уничтожает правильную работу.
С возвратом передаются четыре вещи, и каждая выполняет свою задачу:
UNIT срез handlers
VERDICT red
REASON test_auth_redirect failed
EVIDENCE expected 302, got 200, handlers/auth.py:88
SCOPE исправить только этот файл, не трогать другие срезы
Строка области действия важнее, чем кажется.
Без неё возвращённая единица разрастается: агент открывает файл, замечает две соседние проблемы, исправляет и их — и коррекция одного среза превращается в diff на четыре файла, который никто не проверял.
Ограничьте цикл тремя попытками. Если единица не проходит три исправления, проблема находится в плане, который её породил, а цикл не видит план.
Открывайте шлюз по радиусу поражения, а не по уверенности
В большинстве материалов строят показатель уверенности, задают порог и пропускают всё, что находится выше него. Это неправильная переменная.
Уверенность — самый слабый входной сигнал для такого решения по неочевидной причине: это единственный сигнал, на который способна влиять сама модель.
Сильная переменная — последствия ошибки. Сортируйте работу по стоимости отмены неправильного изменения:
Обратимо и локально. Изменение текста, тест, изолированная функция с покрытием. Одна плохая интеграция стоит одного отката, поэтому эта ветвь может открываться первой.
Обратимо, но широко. Общая утилита, добавление схемы, всё, к чему обращается десяток потребителей. Открывайте шлюз по детерминированным проверкам и чистой траектории.
Трудно откатить. Миграции, удаления, всё, что записывает данные в продакшен или перемещает деньги. Эта ветвь не открывается независимо от оценки.
Третья строка — не порог, установленный очень высоко. Это ветвь, которая не открывается. Разница важна: пороги корректируют, закрытые ветви — нет.
Внутри открытой ветви шлюз читает доказательства по порядку: детерминированные результаты, затем траекторию текущего запуска, затем частоту предыдущих откатов работы из этого узла и лишь в конце — собственную оценку модели.

С чего начать в собственной работе
Возьмите одну задачу, которую выполняете регулярно. Нарисуйте разделитель, ветви, слияние, один шлюз и одно обратное ребро.
Сначала постройте шлюз. Всё становится проще, когда что-то способно громко завершиться неудачей, а граф без шлюза — лишь более быстрый способ производить непроверенный результат.
Затем добавьте ветви. Ребро обучения — последним, потому что нельзя выводить ограничения из принятых результатов, пока ещё ничто не принимает результаты.
Оставьте человека на одном шаге — в точке с самыми тяжёлыми последствиями и самой низкой обратимостью.
Утверждайте слияние. Выбирайте, какие исправления попадут в выпуск. Не просматривайте промежуточные результаты и не подтверждайте каждый шаг.
Человек в середине графа становится его самым медленным узлом, и граф работает ровно со скоростью человека, который что-то читает.
Вся дисциплина держится на трёх строках. Измеряйте путь, а не только ответ, к которому он пришёл.
Вердикт, который не меняет следующий запускаемый шаг, — это отчёт.
А любой сбой, который вы не превратили в постоянное ограничение, встретится вам снова.
Большинство продолжит настраивать один цикл и называть его системой.
Те, кто нарисует вокруг него граф, будут управлять целым флотом — и никогда до конца не поймут, почему всем остальным так трудно за ними успевать.
Если прежде всего вам нужна одностраничная версия уровня графа, напишите автору в личные сообщения слово Graph.
Также подпишитесь на автора, чтобы получать больше материалов о внутреннем устройстве агентов, и на его Telegram-канал: