Надежные системы из ненадежных компонентов
Архитектурный стандарт оркестрации ИИ-агентов в Enterprise-контуре.
От магии промптов к промышленным конвейерам.
Либретто
Spec-Driven DevelopmentМы не просим ИИ "угадать" результат. Архитектор проектирует Спецификацию — исполнимый чертеж, который становится жестким контрактом для всех моделей в системе.
Нотный стан
Schema-Guided ReasoningЖесткие структуры Pydantic/JSON управляют процессом мышления. Модель обязана заполнить все поля по порядку.
Оркестр
Multi-model EnsembleДинамическое распределение ролей. Композиторы планируют, Виртуозы пишут код, Ритм-секция закрывает рутину. Оптимизация TCO.
Лаборатория
Deterministic CodeПереход от "мнений" к вычислениям. ИИ генерирует Python-скрипт, который исполняется в Sandbox, возвращая проверяемый и воспроизводимый факт.
Состав оркестра
| Секция | Инструменты (примеры на начало 2026) | Партия в системе |
|---|---|---|
| Композиторы Архитекторы | OpenAI 5.1, o3, Claude Opus 4.5, DeepSeek V3.2 | Разработка Либретто, проектирование Нотного стана, высокоуровневая декомпозиция, моделирование угроз и стратегическая рефлексия (System 2 Thinking). |
| Виртуозы Тех-лиды | Claude Sonnet 4.5, Gemini 3 Pro | Написание скелета кода, контрактов и руководств. Задание "золотого эталона". |
| Ритм-группа Разработчики | Gemini 3 Flash, Grok Code Fast, Qwen 3 Coder | FIM-кодинг по образцу, рефакторинг, отладка, вызовы инструментов. Основной объем работы. |
| Критики Аудит и ИБ | Llama Guard 3, Grok 4.1, малые модели, ML (не LLM) | Аудит безопасности, фильтрация и классификация на входе и выходе, поиск ошибок и галлюцинаций, LLM-as-a-Judge. Адвокаты дьявола. |
Инженерное наследие
"Сила не в одном алгоритме, а в правильной организации множества"- Джон фон Нейман (1956): Синтез надежных организмов из ненадежных компонентов.
- Лео Брейман (2001): Теория ансамблей и Random Forest.
- Виктор Варшавский и Дмитрий Поспелов (1984): Оркестр играет без дирижера.
Применимость
-
Суверенный контур
Сборка оркестра на Open-Weights моделях полностью On-Premise. -
Zero-Hallucination
Верификация каждого шага через SGR и детерминированное исполнение кода в песочнице. -
Agentic AgentOps
Архитектура "Микроядро + Плагины" для масштабируемых ИИ-ассистентов.
Архитектура системы
Часть I. Философия: Кибернетика хаоса
Мы привыкли строить IT-системы из детерминированных кирпичей. В мире LLM (Large Language Models) компоненты стали вероятностными. Нейросеть — это не калькулятор, а "интуитивная машина", которая может выдать гениальное решение или убедительно соврать.
Как строить надежный Enterprise из ненадежных элементов? Ответ — в синтезе трех принципов:
- Принцип Фон Неймана (Надежность из ненадежности): Мы не верим в "идеального агента". Мы строим систему с избыточностью, валидацией и песочницами, где ошибки одного агента гасятся архитектурой.
- Принцип Лео Бреймана (Сила Ансамбля): "Оркестр" специализированных моделей (дорогих и медленных "Стратегов" и быстрых и дешевых "Исполнителей") работает точнее и экономичнее, чем один универсальный гигант.
- Принцип Варшавского — Бойда (Рефлексивный Центр): Эффективность системы зависит от скорости обновления её Картины Мира (цикл OODA). Большинство агентов застревают в тактике (ReAct). Партитура возвращает им стратегический контекст ("Ориентацию").
Суть метода: Мы заменяем "Дирижера" (центральный микроменеджмент) на "Партитуру" (общий артефакт, содержащий правила, цели и состояние). Это Design-time Orchestration + Runtime Choreography.
Часть II. Архитектура: Reactive Spreadsheet Blackboard
"Потоки данных" и координация через изменение среды вместо "Потока управления".
Представьте систему как Таблицу, где:
- Ячейки (Cells): Артефакты проекта (ТЗ, Скелет кода, Реализация, Тесты, Отчет Критика).
- Связи (Dependencies): Изменение одной ячейки (например, ТЗ) автоматически помечает зависимые (Код) как
DIRTY(требующие обновления). - Агенты: Это "функции", которые пересчитывают ячейки.
4 Слоя Партитуры
1. Слой Состояния
Это "Память" и "Истина" системы. Ориентированный граф (DAG), хранящий состояние проекта.
- Каждая ячейка — это контейнер с историей, статусом и схемой валидации (Pydantic).
- Это позволяет видеть процесс в динамике ("Визуальный дебаггинг") и откатываться назад при ошибках.
2. Слой Вычислений
Динамическая труппа агентов. Мы не используем одну модель. Мы используем ролевую специализацию:
- Стратег (Architect): Умная модель. Пишет Scaffold (Скелет кода) и Спецификации.
- Виртуоз (Developer): Быстрая модель. Работает в режиме In-filling (FIM), заполняя пустоты в скелете. Она не придумывает архитектуру, она "играет по нотам".
- Критик (Judge): Adversarial-модель. Проверяет результат на соответствие контракту.
- Санитар (Linter): Детерминированный скрипт для проверки синтаксиса.
3. Слой Протоколов
Язык, на котором общаются агенты.
- Schema-Guided Reasoning (SGR): Агенты не чатятся текстом. Их вывод жестко структурирован JSON-схемами.
- Code-as-Context: Мы не пишем промпты "напиши код". Мы даем агенту Scaffolding (типы, интерфейсы), и он "достраивает" его, подтягиваясь до уровня архитектора.
4. Слой Управления
Механизмы защиты от хаоса.
- Router: Оценивает сложность задачи и назначает подходящую модель (Dynamic Casting).
- Budget Controller: Останавливает агента, если он сжигает токены в бесконечном цикле.
- Security Gatekeeper: Песочница (Sandbox) и проверка на утечку данных.
Часть III. Сценарий работы: Симфония кода
Как это выглядит на практике?
- Замысел: Человек пишет идею в ячейку
Spec("Нужен сервис авторизации"). - Волна изменений: Движок видит изменение. Зависимая ячейка
ScaffoldстановитсяDIRTY. - Ориентация: Просыпается Агент-Архитектор. Он читает
Specи генерируетScaffold(классы, типы, докстринги). Статус ячейки ->VALID. - Действие: Ячейка
ImplementationстановитсяDIRTY. Агент-Разработчик видит идеальный Скелет и просто заполняет тела функций. - Рефлексия: Ячейка
ReviewстановитсяDIRTY. Агент-Критик запускает тесты и сверяет код со Спекой.- Если ошибка -> он помечает
ImplementationкакDIRTYс комментарием. Цикл повторяется. - Если успех ->
VALID.
- Если ошибка -> он помечает
Часть IV. Почему это работает
Эта архитектура соответствует уровню зрелости (Swarm-Ready System) и трендам 2026 года:
- Zero-Hallucination: Жесткие схемы и Scaffolding не дают агенту выдумывать несуществующие библиотеки.
- Resilience: Ошибка одного агента — это просто
DIRTYстатус ячейки. Система самовосстанавливается. - Cost Efficiency: Мы тратим дорогие токены только на Архитектуру, а рутину делают дешевые модели.
Партитура — это отказ от микроменеджмента в пользу проектирования среды. Мы создаем условия, в которых ИИ-агенты неизбежно делают правильные вещи.
Архитектура Partitura: Reactive Spreadsheet Blackboard
В центре системы находится Reactive Blackboard (Реактивная Доска).
В отличие от классических Blackboard-систем 80-х, где данные лежали неструктурированной кучей, наша Доска структурирована как Электронная Таблица (Spreadsheet).
Три кита:
-
Ячейки как Типизированные Контейнеры.
Ячейка — это не просто место для текста. Это слот с жестким контрактом. Если ячейка имеет типPythonCode, в неё физически нельзя записатьMarkdownилиJSONс ошибкой. Это гарантирует Type Safety на уровне архитектуры. -
Агенты как «Тяжелые Формулы».
В Excel формула вычисляется мгновенно. В Партитуре «формула» — это Асинхронная Трансформация.- Вход: Значения из зависимых ячеек (
Spec). - Процесс: Вызов LLM-агента (дорого, долго, стохастично).
- Выход: Значение текущей ячейки (
Code).
- Вход: Значения из зависимых ячеек (
-
Реактивность.
Система сама следит за актуальностью. ИзменениеЯчейки А(ТЗ) автоматически помечает зависимуюЯчейку Б(Код) статусомDIRTY(Требует обновления). Человеку не нужно «перезапускать пайплайн», система сама стремится к согласованному состоянию.
Реактивная Доска
Это Источник Истины.
- Топология: Ориентированный ациклический граф (DAG), где узлы — это Ячейки.
- Ячейка: Атомарная единица состояния.
Value: Полезная нагрузка (артефакт).Schema: Валидатор (Pydantic/JSON Schema). Ячейка отвергает невалидные данные.Status: Жизненный цикл (EMPTY→DIRTY→PROCESSING→VALID/ERROR).History: Иммутабельный лог изменений (Git-like).Meta: Бюджет, тайминги, использованная модель.
Агентный Рантайм
Это Вычислительные мощности. Агенты здесь — это Stateless Workers (функции без памяти).
- Принцип: Агент не хранит историю общения. Вся история и контекст каждый раз загружаются из Ячеек Доски.
- Триггер: Агент просыпается только тогда, когда Ячейка переходит в статус
DIRTY. - Специализация:
- Architect:
Text→Scaffold. - Developer:
Scaffold→Code. - Critic:
Code+Spec→Review.
- Architect:
Механика Синхронизации
Это «Движок правил», который крутит цикл.
- Dependency Engine: Распространяет статус
DIRTYвниз по графу при изменениях сверху. - Budget Controller: «Финансовый директор». Блокирует выполнение агента, если исчерпан лимит токенов/денег на ячейку.
- Consistency Guard: Гарантирует, что агент читает только
VALIDданные из родительских ячеек.
Мы проектируем Ячейку как объект, который знает о себе всё: что в нем должно лежать, от кого это зависит и кто имеет право это менять.
На уровне кода Ячейка состоит из 4-х изолированных слоев: Контракт, Состояние, Данные, Метаданные.
from typing import Generic, TypeVar, List, Optional
from pydantic import BaseModel, Field
from datetime import datetime
T = TypeVar("T") # Тип контента (Code, Doc, Plan)
class SmartCell(BaseModel, Generic[T]):
# --- 1. ID & TOPOLOGY (Где я в графе?) ---
id: str = Field(..., description="Уникальный адрес, напр. 'auth.service.scaffold'")
dependencies: List[str] = Field(default_factory=list, description="IDs ячеек, от которых я завишу")
dependents: List[str] = Field(default_factory=list, description="IDs ячеек, которые зависят от меня")
# --- 2. THE CONTRACT (ДНК ячейки) ---
schema_ref: str = Field(..., description="Ссылка на Pydantic-схему или JSON Schema валидатора")
instruction: str = Field(..., description="Промпт/Задача для агента. 'Формула' этой ячейки")
# --- 3. THE STATE (Жизненный цикл) ---
status: CellStatus = Field(default=CellStatus.VOID)
locked: bool = False # Блокировка от записи (например, Human Override)
# --- 4. THE PAYLOAD (Тело) ---
value: Optional[T] = None # Текущий контент (код, текст)
error: Optional[str] = None # Если валидация не прошла
# --- 5. OBSERVABILITY (Черный ящик) ---
history: List[Revision] = Field(default_factory=list) # Git-like лог изменений
budget: float = Field(default=1.0) # Оставшийся бюджет ($)
А. Контракт
Это то, что делает Ячейку не принимающей «мусор».
schema_ref: Это ссылка на валидатор. Если Ячейка предназначена для Python-кода, здесь ссылка на парсер, который проверит синтаксис (AST) и наличие типов. Если это JSON-конфиг — здесь JSON Schema.- Механика: Агент-Исполнитель не может записать данные в
value, если они не проходят проверкуschema_ref. Система отбросит попытку записи (Exception) и понизит репутацию агента.
Б. Конечный автомат (машина состояний)
Ячейка живет своей жизнью. Вот её состояния (CellStatus):
- VOID (Пусто): Ячейка создана, но данных нет.
- DIRTY (Грязно):
- Либо изменилась зависимость (апстрим).
- Либо Критик отверг текущее значение.
- Сигнал: «Нужен Агент!».
- LOCKED (В работе): Агент взял задачу. Ячейка заблокирована для других (мьютекс), чтобы избежать гонки.
- PENDING_REVIEW (На проверке): Агент записал значение, схема прошла первичную валидацию. Ждем Критика.
- STABLE (Стабильно): Критик одобрил. Значение считается «Истиной». Это состояние триггерит зависимые ячейки (Downstream).
- FROZEN (Заморожено): Вмешался Человек. Агентам запрещено трогать эту ячейку, даже если зависимости изменились. (Важно для фиксации архитектуры).
В. История
Мы не перезаписываем данные. Мы дописываем версию. Объект Revision хранит:
timestampauthor_agent_id(Кто писал: Claude, DeepSeek или User Alex).diff(Что изменилось).reasoning_trace(Критически важно!): Ссылка на лог "мыслей" агента. Почему он решил написать именно этот код?cost: Сколько токенов сожгла эта итерация.
Как Ячейка реагирует на изменения? Это логика электронной таблицы.
- Человек меняете ячейку
Spec(ТЗ). - Ячейка
Specпереходит вSTABLE. - Она посылает сигнал
invalidate()всем своимdependents. - Ячейка
Scaffold(зависимая) получает сигнал.- Проверяет: «Я
FROZEN?». Нет. - Переходит в статус
DIRTY. - Сбрасывает
value(опционально, или оставляет как контекст для diff).
- Проверяет: «Я
- Система видит
DIRTYячейку и выставляет ордер на биржу агентов.
Вложенность
Ячейка может содержать в value... ссылку на другую Партитуру (Sub-Graph).
- У вас есть ячейка
AuthModule. - Для верхнего уровня — это просто черный ящик, который должен принимать
Loginи отдаватьToken. - Но если «провалиться» внутрь, то
AuthModule— это отдельный граф из 5 ячеек (UserDB,JWTService,RateLimiterи т.д.).
Зачем это нужно? Это позволяет использовать разные модели на разных уровнях зума.
- Верхний уровень (Архитектура) рисует Claude Opus 4.5.
- Внутренний уровень (Реализация методов) заполняет дешевый Gemini 3 Flash или Claude Haiku 4.5 или Qwen3 Coder.
- Система не грузит контекст целиком. Она подгружает только тот уровень абстракции (тот "Лист" в Экселе), который сейчас пересчитывается.
Критик — это агент-валидатор. Его задача — не допустить, чтобы энтропия (грязный код) просочилась вниз по графу зависимостей.
1. Объект «Вердикт»
Критик не просто меняет статус ячейки. Он производит структурированный артефакт.
class ReviewVerdict(BaseModel):
# --- 1. Решение ---
status: Literal["APPROVED", "REJECTED", "BLOCKING_ISSUE"]
# --- 2. Детализация ---
# Критик должен указать, ГДЕ ошибка и В ЧЕМ она.
issues: List[Issue] = Field(..., description="Список дефектов")
# --- 3. Навигация ---
guidance: str = Field(..., description="Инструкция для Исполнителя: что именно исправить.")
# --- 4. Метрики ---
compliance_score: float = Field(..., ge=0, le=1.0) # Насколько соответствует ТЗ
Механика Взаимодействия
Взаимодействие между Исполнителем и Критиком происходит асинхронно через Ячейку. Это не чат. Это редактирование документа с комментариями.
- Commit (Попытка 1):
DeveloperAgentзаписывает код вCell.value.- Статус ячейки ->
PENDING_REVIEW.
- Review (Анализ):
- Система видит статус
PENDING_REVIEWи будитCriticAgent. - Входные данные Критика:
Spec(Истина),Candidate(Текущий код),History(Предыдущие ошибки). - Критик находит логическую ошибку (например, "нет проверки токена").
- Система видит статус
- Reject (Отказ):
- Критик создает объект
ReviewVerdict(Статус: REJECTED). - Система записывает этот вердикт в Историю Ячейки (
Cell.history). - Ключевой момент: Статус ячейки меняется на DIRTY.
- Критик создает объект
- Feedback Injection (Обратная связь):
- Система снова видит DIRTY. Она снова зовет
DeveloperAgent. - НО! В этот раз Контекст (Промпт) собирается иначе.
- Система снова видит DIRTY. Она снова зовет
Алгоритм пересборки Контекста
Система видит, что это не первая попытка, и собирает для Исполнителя «Пакет исправления»:
# SYSTEM PROMPT FOR DEVELOPER (ATTEMPT 2)
Твоя задача: Написать реализацию для [Spec ID].
ВАЖНО: Это ПОВТОРНАЯ попытка. Твой прошлый код был отклонен.
--- КОНТЕКСТ ПРОШЛОЙ ПОПЫТКИ ---
Твой код: [Ссылка на Hash v1]
Вердикт Критика:
❌ ОШИБКА: Отсутствует валидация JWT токена.
СОВЕТ: Используй библиотеку PyJWT и добавь декоратор @verify_token.
--- ЗАДАЧА ---
Перепиши код, ИСПРАВИВ указанные ошибки. Не ломай то, что работало.
Результат: Исполнитель не генерирует с нуля. Он делает Self-Correction на основе четкого сигнала.
3. Уровни Критики
Чтобы не жечь дорогие токены на пропущенные запятые, Критик устроен слоисто.
- Уровень 1: Синтаксический (Linter / Static Analysis)
- Агент: Ruff, MyPy, Prettier.
- Логика: Если Линтер падает, код даже не доходит до LLM-Критика. Ячейка сразу становится DIRTY.
- Уровень 2: Семантический (LLM Critic)
- Агент: Claude 4.5 Sonnet.
- Логика: Сравнивает
SpecvsImplementation. Ловит логические ошибки и галлюцинации.
- Уровень 3: Тестовый (Execution Critic)
- Агент: PyTest Runner.
- Логика: Запускает код в песочнице. Если тесты падают ->
REJECTED.
Замыкание петли: Budget & Circuit Breaker
Самый большой риск такой системы — бесплодное зацикливание. В Ячейку встроен механизм «Предохранитель» (Circuit Breaker).
def governance_loop(cell):
if cell.retry_count > MAX_RETRIES (например, 5):
cell.status = "FATAL_ERROR"
cell.error = "Агенты не смогли договориться. Требуется человек."
notify_human(cell.id)
return
if cell.budget_spent > cell.budget_limit:
cell.status = "BANKRUPT"
return
Стратегия эскалации (пример): Попытки 1-2: быстрые модели → Попытка 3: умные модели (Sonnet/Opus) → Попытка 5: человек.
Вложенность
Если Ячейка содержит Sub-Graph (вложенную Партитуру), то Критик работает на уровне интерфейса этого графа. Внутренние агенты могут спорить внутри AuthModule, а внешний Критик проверяет только результат.
Движок — это бесконечный цикл, который следит за появлением грязных Ячеек и пытается их стабилизировать.
В основе лежит DAG (Directed Acyclic Graph) — Направленный Ациклический Граф зависимостей. Но в отличие от Airflow, этот граф динамический.
Когда вы (Человек) меняете ячейку Spec (ТЗ):
- Движок проходит вниз по графу.
- Он помечает всех прямых и косвенных потомков (
Scaffold,Code,Tests) статусом DIRTY (илиCASCADE_PENDING). - Важно: Он не запускает пересчет всего сразу. Он просто маркирует территорию как "устаревшую".
Агент может менять граф в процессе работы.
- Сценарий: Агент-Архитектор видит, что
Specслишком сложный. - Действие: Он не просто пишет код. Он создает новые ячейки (
Sub-Module A,Sub-Module B) и линкует их в граф. - Движок на лету перестраивает зависимости без перезагрузки.
Биржа Задач
Движок не вызывает агентов напрямую (agent.run()).
- Очередь задач:
Движок собирает все ячейки со статусом DIRTY.Task #101: ОбновитьScaffold(High Priority, так как блокирует остальных).Task #102: ОбновитьReadme(Low Priority).
- Диспетчер:
Cмотрит на пул свободных Агентов (воркеров).- Есть свободный слот для
Claude Opus? -> Отдаем емуTask #101. - Все слоты заняты? -> Задача висит в
Pending.
- Есть свободный слот для
Цикл Реактора
Вот псевдокод ядра системы.
async def reactor_loop(graph: ScoreBoard):
while True:
# 1. Сбор событий (кто изменился?)
changes = graph.get_state_changes()
# 2. Волна инвалидации
if changes:
graph.propagate_dirty_status(changes)
# 3. Планирование (Какие ячейки готовы к работе?)
# Ячейка готова, если она DIRTY, но все её родители STABLE.
runnable_cells = graph.get_runnable_cells()
# 4. Диспетчеризация (Назначаем агентов)
for cell in runnable_cells:
if budget_controller.can_afford(cell):
# Асинхронный запуск в фоне
asyncio.create_task(spawn_agent(cell))
else:
log.warning("Budget freeze for cell", cell.id)
# 5. Сбор урожая (Обработка завершенных)
# Если агент закончил, проверяем статус (STABLE / REJECTED)
# и обновляем граф.
await asyncio.sleep(0.1)
Механизмы защиты
Движок — это единственный компонент, который имеет право убить агента.
Движок хранит хеши состояний графа. Если граф пришел в состояние A -> B -> A -> B (Агент 1 правит, Агент 2 отменяет правку, Агент 1 снова правит), Движок:
- Замечает осцилляцию.
- Ставит обе ячейки в статус CONFLICT.
- Зовет Человека (или Арбитра).
Когда Движок готовит задачу для Агента, он делает стряхивание дерева.
- Агенту, который пишет метод
login(), не нужно знать про модульBilling. - Движок вырезает из графа только релевантные зависимые узлы и подает их в контекст.
Это экономит токены и повышает точность (меньше шума).
Резюме: Как это работает вместе
- Вы (Человек) меняете одну строчку в Спецификации.
- Движок видит изменение, делает
Invalidateдля 50 зависимых файлов. - Движок видит, что 5 файлов (верхний уровень) готовы к пересчету.
- Движок нанимает 5 Архитекторов.
- Архитекторы обновляют Скаффолды.
- Движок видит, что Скаффолды стали STABLE. Открывается фронт работ для 20 Кодеров.
- Движок запускает рой Кодеров.
- ... через 5 минут ...
- Движок сообщает: «Проект пересобран. Все тесты зеленые».
UI для Партитуры — это гибрид IDE, BI-дашборда и Стратегической игры. Человек здесь — не собеседник. Человек — Наблюдатель и Арбитр. Интерфейс должен решать главную проблему: Снижение когнитивной нагрузки при наблюдении за роем.
Основной экран: Топологическая Карта (The Graph View).
В центре экрана — Живой Граф Зависимостей (DAG).
- Визуализация: Ячейки соединены стрелками зависимостей.
- Цветовое кодирование (Светофор):
- Зеленый: STABLE (Все тесты прошли).
- Красный: ERROR / REJECTED (Требуется внимание).
- Желтый: DIRTY (Ожидает пересчета).
- Пульсирующий Синий: PROCESSING (Агент прямо сейчас пишет код).
- Семантический Зум:
- Zoom Out: Вы видите квадраты микросервисов («Auth», «Billing»).
- Zoom In: Квадрат распадается на файлы/классы.
- Deep Zoom: Вы видите конкретные методы внутри класса.
Волна изменений бежит по графу. Вы поменяли ТЗ слева — и видите, как желтая волна DIRTY накрывает зависимые модули справа.
Инспектор Ячейки
Когда вы кликаете на узел графа, справа выезжает панель Детального просмотра. Это не просто редактор кода.
А. Вкладка "Content" (Код + Контракт)
- Сверху: Pydantic Schema / Interface (Неизменяемая часть, написанная Архитектором).
- Снизу: Monaco Editor (VS Code) с текущим значением
value. - Кнопка «God Mode»: Вы можете вручную отредактировать код. Как только вы начинаете печатать, статус ячейки меняется на 🔒 FROZEN (User Lock). Агенты больше не смеют трогать этот файл, пока вы не снимете замок.
Б. Вкладка "Reasoning" (Мысли Агента)
Здесь мы видим почему ИИ написал этот код.
- Не сырой лог, а Структурированный Трейс:
- 🎯 Цель: "Реализовать метод login".
- ⚠️ Риски: "Нужно проверить SQL-инъекции".
- 📝 План: "Импортирую SQLAlchemy..."
- ❌ Ошибка (попытка 1): "Syntax Error".
- ✅ Фикс (попытка 2): "Исправлено".
В. Вкладка "Reviews" (Вердикт Критика)
Здесь лежит отчет от CriticAgent.
- Красная плашка: "REJECTED".
- Список претензий:
- [High] Не используется соль для хеширования пароля.
- [Low] Нет докстринга.
Лента Событий
Внизу экрана (как терминал в VS Code) бежит лента событий в реальном времени.
Если нажать на строчку лога, Граф автоматически фокусируется на соответствующей ячейке.
Панель Управления
Сверху — приборная панель состояния системы.
- Бюджет: "$45.20 / $100.00". (Если деньги кончаются, полоска краснеет).
- Нагрузка: "Active Agents: 12 / 50".
- Кнопка «PANIC BUTTON» (Большая красная):
Как выглядит работа с таким UI:
- Вы открываете Топологическую Карту. Видите, что модуль
Reportingгорит красным . - Кликаете на него. В Инспекторе видите вердикт Критика: "Агент зациклился, 5 попыток провалено".
- Открываете вкладку Reasoning. Видите, что агент пытается использовать библиотеку, которая устарела.
- Вы нажимаете «Edit Scaffold».
- Дописываете в комментарий к коду:
# HINT: Используй библиотеку Pandas v2.2. - Снимаете статус
ERROR, ставитеDIRTY. - Система видит: "О, человек дал подсказку".
- Запускает агента заново.
- Вы видите, как ячейка стала (Processing), потом (Stable).
Вы не писали код. Вы подтолкнули застрявшего робота.