Aixle Flow: open source harness для coding-агентов

Разработка становится ещё одной стадией конвейера рядом со сборкой, тестами и деплоем: на входе задача, на выходе PR и отчёт, а человек подтверждает переходы между стадиями

8 ноября 2026

Полевая заметка

Aixle Flow - open source платформа для запуска coding-агентов по задачам. Лицензия Apache 2.0, можно поставить на свою инфраструктуру или взять managed-версию. Репозиторий открыли в августе 2026 года, проект молодой и быстро меняется. Попробовать его мне посоветовал друг из команды разработки.

Что это за проект

Агент в терминале хорошо работает на ноутбуке одного разработчика. Уже в средней организации такая модель не масштабируется:

Flow строят как общую среду, где над одними задачами работают инженеры, бизнес и агенты. В основе - доска и workflow. Шаг процесса уходит агенту или человеку по правилам, которые задала команда. Между шагами работа передаётся вместе с контекстом запуска, поэтому следующий участник видит, что уже сделано. Там, где нужно решение человека, процесс останавливается на подтверждение. Ход работы, результаты и стоимость видны всем участникам проекта без доступа к чьему-то терминалу. Процесс может быть и не про код: в демо на сайте проекта workflow собирает еженедельный отчёт по Google Analytics и публикует его в артефакты.

Технически это выглядит так. Событие запускает workflow: карточка попала в колонку, сработало расписание, пришёл webhook, сообщение в Slack или изменение в трекере. Каждый шаг агента - сессия в отдельном контейнере. Статус, файлы и стоимость возвращаются туда, откуда пришла задача: в карточку, в тред или в issue трекера.

Сам агент не меняется: внутри контейнера работает тот же CLI, что и локально. Меняется всё вокруг него:

Локальный агентАгент во Flow
Запускает человек из терминалаЗапускает событие или кнопка Run
Окружение разработчикаЧистый контейнер на каждую сессию
Инструкции в CLAUDE.md, AGENTS.md и в головеРоль агента, workflow и карточка хранятся отдельно
История в терминалеЛоги, артефакты, токены и стоимость по сессии
Решения принимаются в чатеApprove, retry или skip на шаге, CI gates
Видит только тот, кто запустилВидит вся команда проекта

Для меня harness - это всё вокруг модели: инструкции, инструменты, среда, проверки и точки, где решает человек. Локально я собираю его сам из CLAUDE.md, skills и скриптов. Flow даёт те же части как общие сущности для команды.

Модель

Компании, проекты и профили устроены как в любом таск-трекере: участники, права, доска задач. Агенты, процессы, репозитории и секреты принадлежат проекту, а сессии работают на логинах конкретного человека в CLI-агентах. Своё у Flow - агенты, workflow, триггеры и gates.

Агент - это роль плюс исполнитель. Роль описывает, кто агент, как он общается и каких правил держится. Исполнитель - конкретный CLI, который работает в контейнере. Одну роль можно запускать на разных CLI.

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

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

Поэтому процесс нужно строить вокруг артефактов:

Триггеры запускают процесс, gates его придерживают. Запустить workflow можно перемещением карточки в колонку, кнопкой Run, по расписанию, через webhook, сообщением в Slack или событием из трекера. Gate задерживает процесс, пока не выполнено условие: подтверждение человека на шаге (Approve, Retry или Skip) или зелёный CI.

Результат возвращается туда, откуда пришла задача. Статус и комментарии появляются в карточке, файлы сохраняются в артефактах, логи, токены и стоимость видны по каждой сессии.

Агент получает собранный контекст: свою роль, инструкции шага, описание карточки и список доступных инструментов. Репозиторий уже склонирован в контейнер. Пушить агент может только в этот репозиторий и только по короткоживущему токену.

Архитектура

Flow написан на Rails, интерфейс на React через Inertia. Архитектура классическая для Rails: PostgreSQL хранит всё состояние (проекты, задачи, процессы, сессии, настройки), фоновые задачи идут через очередь в той же базе, Redis отвечает за кэш и обновления интерфейса в реальном времени.

Браузер ──▶ Rails ──▶ PostgreSQL
              │
              └──▶ Temporal ──▶ контейнер с агентом
                                     │
                                     └──▶ логи, токены, результаты ──▶ обратно в Rails

Temporal

Temporal - open source платформа для долгих процессов, которые должны дойти до конца, даже если по дороге упали сервер, сеть или сам процесс. Сами разработчики называют это durable execution: процесс сохраняет своё состояние и продолжает работу после сбоя.

Из чего состоит:

Как это работает:

Во Flow на Temporal работают три процесса:

Чего Temporal не делает:

Изоляция на уровне контейнеров

Каждая сессия идёт в чистом контейнере из заранее собранного образа. Внутри только склонированный репозиторий, входные файлы и инструкции. По окончании Flow забирает результаты, а контейнер удаляет. Локально контейнеры запускаются в Docker, в проде - в Kubernetes, логика одна и та же.

Модель та же, что в CI/CD: job в чистом окружении из образа, результат в артефактах, следующему шагу передаются только артефакты, логи и статус видны всем. Разница в том, что внутри job работает не скрипт, а агент, который исследует задачу и пишет код. Его результат проверяется так же, как результат любой другой стадии: по артефактам, логам и статусу CI, а не по переписке в чате.

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

CLI-агенты

Сейчас поддерживаются семь CLI: Claude Code, Codex, Cursor CLI, Gemini CLI, Antigravity CLI, Grok CLI и Kiro CLI. Под каждый собран свой образ на общей базе. Каждый человек один раз логинится в нужные CLI через терминал в браузере, Flow хранит логин в зашифрованном виде.

Под каждый CLI есть адаптер. Он знает:

Workflow от CLI не зависит, исполнитель выбирается на шаге. Чтобы добавить новый CLI, нужны запись в общем реестре runtimes, каталог с Dockerfile образа, адаптер с командами запуска и пара строк в настройках и интерфейсе. CI, локальная сборка и деплой подхватывают новый runtime из реестра сами.

Flow как MCP-сервер

Flow сам является MCP-сервером. Агенты в контейнерах ходят в него по ключу сессии за карточками, комментариями и инструментами доски. Человек подключает тот же сервер к своему локальному агенту по личному токену.

Я настраивал весь проект именно так, из локального Codex. В интерфейс почти не заходил и в нём не путался. Через MCP я создал агентов, собрал workflow и доску, привязал workflow к колонке, читал историю запусков и логи сессий. Процесс я описывал словами, агент переводил описание в сущности Flow и сохранял их. Когда результат запуска не устраивал, тот же агент читал логи и предлагал, что поменять в инструкциях.

Внутри Flow для этого есть свой агент, Aixle Builder. Это интерактивная сессия на странице проекта с теми же инструментами, что у личного MCP, но привязанными к этому проекту. Рядом с терминалом видно, как собираются workflow и доска. Если не хочется подключать внешнего агента, можно настраивать проект через него.

Как настроить

Установка

На хосте нужны только Docker и git. Ruby и Node не нужны, всё работает в контейнерах. По документации Flow одному разработчику хватает 8 GB памяти, выделенной Docker.

git clone https://github.com/AixleHQ/flow.git && cd flow
cp .env.example .env.development
make setup   # образы, зависимости, база, начальные данные
make up      # web, worker, PostgreSQL, Redis, Temporal, Traefik

После make up сервисы поднимаются на отдельных портах, по умолчанию только на 127.0.0.1:

СервисПорт
Веб-интерфейс и API4000
MCP-сервер4002
Temporal (gRPC)7233
Интерфейс Temporal с историей процессов8080
Traefik: HTTP, HTTPS, dashboard80, 443, 8090

Все порты переопределяются переменными окружения, так что рядом можно поднять вторую копию стека. Для корпоративного облака порты прячутся за доменами. Публичный адрес приложения задаёт DOMAIN, от него строятся адрес личного MCP и адреса для webhooks GitHub, GitLab, Jira и остальных. Терминалы агентских сессий Flow советует отдавать с отдельного домена через TRAEFIK_HTTP_BASE, например flow.example.com для приложения и t.example.com для контейнеров: так содержимое контейнера не работает с правами пользователя в основном приложении. В проде то же самое разворачивается в Kubernetes, где Traefik маршрутизирует трафик к подам сессий (справочник по конфигурации).

Подключение репозитория

Интеграции подключаются на странице Integrations проекта. Поддерживаются:

ТипСервисыЧто даёт проекту
Хостинг кодаGitHub, GitLab, Bitbucket, Azure DevOpsКлонирование репозиториев в сессию, работа с PR, CI gates по проверкам и пайплайнам
ТрекерыJira, Linear, YouTrack, GitHub Projects, Azure BoardsЗапуск workflow по событиям задач, инструменты для чтения и изменения задач
ЧатыSlack, Microsoft TeamsЗапуск workflow из сообщения, статус запуска в треде
Удалённые средыCoderРабочие машины, которые агент может взять, использовать и вернуть

Подключение во всех случаях устроено одинаково. Интеграция принадлежит компании и подключается либо ко всей компании, либо к одному проекту. Репозитории из подключённого хостинга добавляются в проект, а workflow или шаг выбирает, какие из них клонировать в контейнер. События из внешних сервисов приходят во Flow через webhooks, и каждый endpoint проверяет отправителя своим способом: подписью, секретом или токеном. Инструменты других сервисов (Notion, Sentry и подобные) подключаются не как интеграции, а как MCP-серверы проекта.

Для GitHub есть два варианта подключения. GitHub App - основной вариант для прода: он получает webhooks, но ему нужен адрес, до которого GitHub может достучаться. Personal access token подходит для локальной установки: ничего не нужно настраивать, а результаты CI Flow узнаёт опросом. Подробности по каждому провайдеру - в документации по интеграциям.

От прав подключения зависит, что агент сможет сделать в репозитории. Чтобы агент создавал ветки и PR, нужны права на запись. Внутри контейнера git push и gh получают короткоживущий токен только на этот репозиторий, и в контейнере он не сохраняется.

Логины в CLI

Каждый человек один раз логинится в нужные CLI в разделе Profile, через терминал в браузере. Flow сохраняет логин в зашифрованном виде и подкладывает его в контейнер на время сессии. Сессии работают на логине человека, поэтому и расход по подписке или API-ключу тоже его.

Подключение личного MCP

В Profile → MCP Flow выдаёт личный токен amcp_…. Токен показывается один раз. Дальше сервер добавляется в локального агента:

# Claude Code
claude mcp add flow --transport http http://localhost:4000/mcp \
  --header "Authorization: Bearer amcp_…"

# Codex читает токен только из переменной окружения
export FLOW_MCP_TOKEN="amcp_…"
codex mcp add flow --url http://localhost:4000/mcp --bearer-token-env-var FLOW_MCP_TOKEN

Сервер регистрируется в клиенте под именем flow, его инструменты видны как mcp__flow__list_projects и так далее. Codex читает токен из переменной окружения при каждом старте сервера, поэтому export по документации нужно держать в профиле shell. Для Cursor на той же странице есть кнопка установки, для остальных клиентов - готовый JSON. У токена ровно те права, что у его владельца.

Первый проект

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

  1. Проект и доска. Можно взять готовый шаблон колонок или собрать свою доску.
  2. Репозиторий, подключённый к проекту.
  3. Агент: роль и правила работы с кодом.
  4. Workflow: шаги, инструкции, ожидаемые результаты.
  5. Привязка workflow к колонке. Для начала лучше ручной запуск, тогда перемещение карточки само ничего не тратит.

Всё это я сделал через MCP из Codex: описывал словами, что нужно, а агент создавал сущности. То же самое можно сделать в интерфейсе или через встроенный Aixle Builder.

Как использовать

Что предлагает Flow

Flow предлагает разложить по доске полный SDLC, от проектирования до релиза. В шаблоне для команды разработки колонки такие:

Backlog → Tech Design → Implementation → Code Review → QA → Ready for Release → Done

Есть и подробный шаблон на 19 колонок, где отдельно выделены продуктовый дизайн, его ревью и приёмка пользователем.

У каждой колонки есть описание её смысла, и оно попадает в контекст агента: так агент понимает, что в этой команде значит «Code Review». К каждой колонке привязывается свой workflow. Стадии передают результат друг другу через комментарии в карточке: tech design, отчёт ревью, отчёт QA. Для спецификаций и реализации можно подключить BMAD с готовыми навыками.

В их же документации есть правило, как подбирать процесс по размеру изменения:

ИзменениеПроцесс
Небольшой понятный фиксОдна сессия: короткая спецификация, реализация, тесты
Средняя фичаСпецификация, реализация с тестами, ревью
Крупное или чувствительноеПлюс архитектура и отдельное независимое ревью

Отдельный шаг они советуют заводить, только когда нужен отдельный результат, отдельное подтверждение или независимое ревью. Каждый шаг - новая сессия в новом контейнере, и это стоит времени и токенов.

Процесс для небольшого проекта

Для небольшого проекта полный SDLC избыточен. Для репозитория этого сайта (Rails, PostgreSQL, Hotwire, RSpec) я собрал процесс из доски на четыре колонки и двух workflow:

Backlog → В работе → На проверке → Готово

Задача → PR. Workflow привязан к колонке «В работе» с ручным запуском и проходит весь путь в одной сессии:

исследовать задачу
  → поднять приложение
  → воспроизвести проблему
  → исправить
  → тесты, линтер, проверка в браузере
  → ветка и PR
  → дождаться CI
  → карточку в «На проверке»

Агент пушит только в свою ветку. Если что-то не получилось, он открывает Draft PR и пишет причину в описании. При повторном запуске он продолжает существующий PR, а не создаёт новый.

Merge. Второй workflow я запускаю вручную после своего ревью. Перед merge он проверяет, что одобрен именно текущий коммит, что CI зелёный и что нет конфликтов.

Деплой - отдельный pipeline со своим шагом после merge.

Отдельные стадии tech design, ревью и QA для такого проекта не нужны. Каждая стадия - новый контейнер с повторной установкой зависимостей, и на небольших задачах эти накладные расходы больше, чем польза от разделения. Ревью делаю я сам на PR.

Как это выглядит в работе

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

Разбирать результат удобно, всё лежит в одном месте:

Чтобы понять, что произошло, не нужно заходить в контейнер или перечитывать терминал. Когда результат не устраивал, я правил инструкции workflow по логам и запускал снова.

Что сохраняется между сессиями

Образ переиспользуется, контейнер каждый раз новый:

ЧтоСохраняется
То, что установлено при сборке образаДа
То, что агент поставил внутри сессииНет
Результаты, которые забрал FlowДа
Рабочая копия репозиторияНет

Docker Compose проекта для агента не годится. В public-profile он собран под прод: фиксированные порты, сертификаты с хоста, нет dev- и test-зависимостей. К тому же Flow не поднимает Compose проекта, а доступ к Docker агенту штатно не передаётся. В моём случае рабочее решение - собрать образ под проект с Ruby, системными библиотеками и гемами. Пока его нет, агент ставит зависимости сам в каждой сессии, и на это уходит заметная часть времени.

Локальную папку агент не видит. Flow клонирует репозиторий из GitHub, поэтому всё незакоммиченное и незапушенное у меня на ноутбуке для него не существует.

Метрики

Небольшая задача проходит полную сессию примерно за 10 минут, средняя - примерно за 20 минут и 27.0M токенов. Сессии шли через Codex CLI v0.164.0 на GPT-6.1 sol. Это мои замеры на public-profile, не бенчмарк.

Эти цифры получены в простых условиях, и переносить их на другие проекты напрямую нельзя. Public-profile - небольшой Rails-монолит с чистой архитектурой: один сервис, одна база, устоявшиеся паттерны, тесты и описанные в репозитории правила для агента. Задачи были небольшие и средние, с понятным местом изменения. В большой кодовой базе, в legacy без тестов, в монорепозитории с несколькими сервисами или на задачах, которые задевают несколько модулей, агенту нужно больше контекста, сессии идут дольше и чаще повторяются. Время и токены на задачу там будут кратно выше, и стоимость ниже нужно умножать вместе с ними.

Flow показывает время, токены и стоимость по каждой сессии и сводно по проекту. В документации они советуют считать не сессию, а принятую задачу: складывать все сессии, повторы и перезапуски, которые понадобились, чтобы задачу приняли. Рядом с этим стоит считать, сколько раз задачу возвращали на доработку и сколько дефектов нашли после поставки. Токены ввода, вывода и кэша лучше держать раздельно: меньше токенов и меньше счёт - разные результаты.

Сколько это стоит по API

Расчёт для одной средней задачи на 27.0M токенов. Разбивки по типам токенов у меня нет, поэтому беру допущение, типичное для агентной сессии: 90% чтение из кэша (24.3M), 9% новый ввод (2.43M), 1% вывод (0.27M). Цены standard tier на ноябрь 2026 (OpenAI, Anthropic):

МодельКэш, $/1MВвод, $/1MВывод, $/1MОдна задачаМесяц: 3-4 задачи в день, 22 дня
GPT-6.1 sol, контекст до 272K (моя)0.102.0010.00~$10~$660-880
GPT-6.1 sol, контекст больше 272K0.204.0015.00~$19~$1230-1640
GPT-6 astra1.0010.0050.00~$62~$4100-5460
GPT-6.1 terra0.051.005.00~$5~$330-440
GPT-6 luna0.010.100.50~$0.6~$40-55
Claude Opus 5.50.204.0020.00~$20~$1320-1760
Claude Sonnet 5.50.102.0010.00~$10~$660-880
Claude Haiku 5.5, контекст больше 100K0.050.502.50~$3~$205-275

Как читать таблицу:

Подписка или API

Многие компании пока продолжают работать на индивидуальных подписках разработчиков на CLI-агентов, и мы тоже. Пока подписочную модель можно утилизировать, это нужно делать: цена подписки фиксированная, а за те же сессии по API пришлось бы платить по таблице выше.

При коммерческом использовании через API один инженер, который отдаёт агенту 3-4 средние задачи в рабочий день, при 22 рабочих днях в месяц (66-88 задач) обошёлся бы на GPT-6.1 sol примерно в $660-880 в месяц, или $8-10.5 тыс. в год. Это нижняя граница. Если задачи сложнее (длиннее сессии, больше контекста, больше шагов и повторов), счёт по токенам растёт кратно, а на модели уровня astra та же нагрузка стоит уже $4-5.5 тыс. в месяц. На таком масштабе распределять модели по шагам обязательно: дорогая модель остаётся на исследовании и исправлении, а тесты, PR и проверка перед merge уходят на модели, которые дешевле в 2-16 раз. Плюс нужен отлаженный образ, чтобы не платить за повторную установку зависимостей в каждой сессии.

Для масштаба оценка из моей практики: для R&D-организации на 150 инженеров мы считали текущее потребление как есть, без таких оптимизаций, и получили порядка $7 млн в год. Это около $3900 в месяц на инженера: между моей нижней границей на sol и той же нагрузкой на самой дорогой модели.

У подписки свой потолок. Сессии во Flow идут на логине конкретного человека, поэтому все параллельные запуски тратят один и тот же лимит. Параллельность упирается не в контейнеры, а в подписку: когда лимит кончился, следующие сессии ждут его сброса.

Где подходит

Flow лучше всего работает на задачах, где агент может долго действовать сам, а человек нужен в начале и в конце: поставить задачу и принять результат. Это задачи с понятными критериями приёмки и длинным циклом обратной связи, где результат всё равно проверяют не сразу: по PR, по отчёту, по CI.

На таких задачах проявляются свойства, которых нет у агента в терминале:

Когда процесс повторяется, токены можно экономить двумя способами:

Где не подходит

Flow окупается, когда агент проходит сессию сам от начала до результата. На задачах с низкой автономностью агента, где нужно много остановок, он мешает: