Ранас Мукминов – Оркестрация ИИ-агентов. Claude Opus 4.7 (страница 75)
Сигнал в рантайме | На что указывает | Тип дефекта
Частые срабатывания роли-перехватчика | Зоны основных ролей дырявы | Зазор покрытия
Ситуации, доходящие до владельца последней инстанции по типовым поводам | Внутренние роли не покрывают штатное | Зазор покрытия
Повторная обработка одного входа разными ролями | Зоны действия пересекаются | Перекрытие действия
Конкурирующие записи в один ресурс | Нарушен single-writer | Перекрытие записи
Циклы «правка — откат — правка» между двумя ролями | Пересечение зон оценки | Перекрытие оценки, livelock
Подзадачи, зависшие без терминального статуса | Никто не отвечает за отказ исполнителя | Зазор отказа
Работа, потерянная на передаче между агентами | Handoff не транзакционен | Зазор времени
Расхождение между выходами двух ролей, которое никто не свёл | Межролевой инвариант ничей | Зазор инварианта
Ключевая метрика здоровья границ — частота и характер срабатываний перехватчика и эскалаций. Низкая частота и нетиповой характер (перехватчик ловит действительно редкие, новые ситуации) — признак здоровой нарезки. Высокая частота или типовой характер (в дно регулярно проваливается рутина) — прямое измерение дырявости зон. Эта метрика ценна тем, что измеряет именно зазоры — то, что по своей природе является отсутствием и иначе невидимо.
Всё сказанное усложняется, когда роли назначаются на лету (см. главу 21) или когда координация эмерджентна, а не оркестрована (см. главу 44). При статичном наборе ролей матрицу можно построить один раз. При динамическом назначении пространство активных ролей меняется в рантайме, и зазор может открыться в конкретной конфигурации, которой не было при проектировании: две роли, по отдельности покрывающие свои зоны, в некоторой комбинации оставляют между собой дыру, которой нет в других комбинациях.
Это смещает диагностику с этапа проектирования на этап исполнения: для динамических роёв рантайм-сигналы зазора (срабатывания перехватчика, оборванные цепочки эскалации) важнее статической матрицы, потому что статическая матрица описывает один срез из многих возможных. Чем динамичнее распределение ролей, тем больше веса на роль-дно и на наблюдаемость стыков, и тем меньше можно полагаться на проверку границ до запуска.
Найденный дефект границы устраняется не одним универсальным приёмом, а выбором из нескольких, и выбор зависит от типа дефекта. Перечислим основные ходы и условия их применимости — это репертуар проектировщика границ.
Закрепление зоны за одной ролью. Базовое лечение перекрытия действия и записи: из двух ролей, претендующих на участок, одна назначается единственным владельцем, вторая лишается этой части зоны. Так восстанавливается single-writer и устраняется двойная работа. Условие применимости — перекрытие непреднамеренное; преднамеренное так трогать нельзя.
Введение арбитра. Когда перекрытие сохраняется намеренно (дублирование ради надёжности, конкурирующие предложения), его делают безопасным не устранением, а добавлением роли-арбитра, которая выбирает один из конкурирующих результатов и тем самым замыкает ответственность за итог на себя. Перекрытие зон действия остаётся, но перекрытие зоны ответственности за итог снимается — отвечает арбитр. Это связывает главу с агрегацией результатов (см. главу 37): арбитр и агрегатор — близкие роли.
Назначение единственного владельца итога. Лечение размывания ответственности. Зоны действия могут пересекаться, но за итоговый исход ситуации назначается ровно одна роль — та, с которой спрашивают. Размывание исчезает не оттого, что роли перестали пересекаться в работе, а оттого, что появился названный ответственный за результат.
Перенос инварианта в явную зону. Лечение зазора межролевого инварианта. Инвариант, висевший между ролями, делают чьей-то явной обязанностью: либо расширяют зону одной из соседних ролей, включив в неё проверку инварианта, либо вводят отдельную роль-сторожа инварианта. Выбор между этими вариантами — это компромисс между числом ролей (меньше ролей проще) и чистотой их зон (отдельная роль не размывает существующие).
Транзакционизация передачи. Лечение зазора времени на handoff. Передача делается атомарной: работа считается либо полностью у отправителя, либо полностью у получателя, без промежуточного состояния «уже не у одного, ещё не у другого». Это прямое применение идемпотентности и подтверждаемой доставки (см. главы 29 и 43) к границе ответственности во времени.
Совмещение границ ответственности и полномочий. Лечение их рассогласования: либо полномочия роли расширяют до её зоны ответственности (если ответственность была фиктивной), либо ответственность сужают до полномочий (если назначили отвечать за неконтролируемое), либо полномочия сжимают до ответственности (если они избыточны и образуют поверхность атаки).
Сводка соответствия дефектов и лечений:
Дефект границы | Основное лечение | Связанный механизм
Перекрытие действия/записи (непреднамеренное) | Закрепить зону за одной ролью | single-writer (глава 41)
Перекрытие, нужное ради надёжности | Ввести арбитра результата | агрегация (глава 37)
Размывание ответственности | Назначить единственного владельца итога | —
Зазор межролевого инварианта | Перенести инвариант в явную зону или роль-сторожа | —
Зазор времени на handoff | Транзакционизировать передачу | идемпотентность (глава 43)
Зазор отказа | Назначить роль, обрабатывающую отказ | переподхват (глава 72)
Зазор непредусмотренного | Роль-перехватчик и цепочка эскалации | graceful degradation (глава 73)
Рассогласование ответственности и полномочий | Совместить обе границы | least privilege (глава 88)
Общий принцип всех лечений один: каждый дефект устраняется явным решением, кто отвечает, — а не надеждой, что роли «как-нибудь договорятся». Договариваться о границах роли не умеют; границы назначает проектировщик.
— Каждая граница между двумя ролями — это перекрытие, чистый стык или зазор. Чистый стык не возникает сам; перекрытия и зазоры — состояние по умолчанию при нарезке ролей «через их задачи». Границу проводят отдельно, поверх задач, явным решением для каждого стыка.
— Перекрытие зон чтения и оценки приемлемо и часто полезно (взаимная проверка, эшелонированная оборона); перекрытие зон записи опасно всегда и ведёт к гонкам и потере консистентности. Преднамеренное перекрытие отличается от дефекта наличием назначенного арбитра.
— Зазоры системнее и опаснее перекрытий: перекрытие проявляется как лишняя активность и видно, а зазор проявляется как бездействие и тих. Зазоры заводятся в предсказуемых местах — на стыках ролей, на неописанных исходах, на отказах, на межролевых инвариантах и во времени передачи.
— Пространство ситуаций агентной системы не перечислимо заранее, поэтому полнота покрытия достигается не перечислением, а ролью-перехватчиком, превращающей молчаливый провал в явную эскалацию. Цепочка «роль → перехватчик → владелец последней инстанции» должна быть полной и нигде не обрываться.
— Граница ответственности и граница полномочий должны совпадать. Ответственность шире полномочий — фиктивная ответственность; полномочия шире ответственности — поверхность атаки. Обе границы проверяются парой для каждой роли.
— Зазоры не находятся проверкой ролей по отдельности — каждая роль может быть корректна, а стык дыряв. Диагностика идёт по стыкам: статически через матрицу ответственности и прохождение сценариев отказа, динамически через рантайм-сигналы.
— Главная метрика здоровья границ — частота и характер срабатываний перехватчика и эскалаций: она измеряет именно зазоры, то есть отсутствие, которое иначе невидимо. Для динамических и эмерджентных роёв рантайм-сигналы важнее статической матрицы.
Глава 21. Динамическое назначение ролей
Предыдущие главы части рассматривали роль как заранее заданную тройку — промпт, инструменты, права (см. главу 16) — с проверяемым контрактом (см. главу 18) и зафиксированными границами ответственности (см. главу 20). Во всех этих главах подразумевалось, что состав ролей известен до запуска роя: архитектор решает, что в системе есть планировщик, три исполнителя и ревьюер, и этот состав не меняется по ходу работы. Такое назначение называют статическим. Оно удобно тем, что весь риск роли — какие у неё права, какие инструменты, какие границы — разрешается на этапе проектирования и фиксируется в конфигурации, которую можно прочитать, проверить и проревьюировать.
Динамическое назначение ролей отказывается от этого допущения. Роль агента определяется не заранее, а в момент работы: на основании содержания задачи, текущего состояния роя, доступных ресурсов или промежуточных результатов. Агент, который минуту назад был исполнителем, получает роль ревьюера; задача, для которой не нашлось подходящего специалиста, порождает новую роль на лету; оркестратор, увидев перекос нагрузки, переназначает воркеров с одного типа работы на другой. Гибкость очевидна. Менее очевидно, что вместе с ней на время выполнения переносится всё, что статическая роль разрешала на этапе проектирования, — и поверхность ошибок, и поверхность атаки, и трудность отладки.
Эта глава разбирает, что именно назначается динамически, какими механизмами, какой ценой для управляемости и какие failure modes при этом возникают. Центральный тезис: динамическое назначение оправдано не там, где «так гибче», а там, где пространство задач заранее неизвестно настолько, что статический каталог ролей либо не покрывает реальную нагрузку, либо вынужден быть избыточно широким; и даже тогда динамику нужно ограничивать заранее заданными рамками, иначе система теряет свойство, ради которого роли вообще вводились, — предсказуемость поведения каждого агента.