惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
博客园_首页
G
Google Developers Blog
有赞技术团队
有赞技术团队
Vercel News
Vercel News
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
IT之家
IT之家
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - Franky
A
About on SuperTechFans
The Register - Security
The Register - Security
腾讯CDC
月光博客
月光博客
GbyAI
GbyAI
博客园 - 叶小钗
Blog — PlanetScale
Blog — PlanetScale
D
Docker
D
DataBreaches.Net
博客园 - 聂微东
C
Check Point Blog
T
The Blog of Author Tim Ferriss
人人都是产品经理
人人都是产品经理
F
Full Disclosure
Martin Fowler
Martin Fowler
Apple Machine Learning Research
Apple Machine Learning Research
雷峰网
雷峰网
美团技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 司徒正美
小众软件
小众软件
量子位
L
LangChain Blog
S
SegmentFault 最新的问题
Hugging Face - Blog
Hugging Face - Blog
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
F
Fortinet All Blogs

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Я дважды не смог собрать команду для pet-проекта. Потом за полгода закрыл всё с Claude
nightBaker · 2026-06-01 · via Все публикации подряд на Хабре

Простой

15 мин

8.2K

История о том, как Fleans — движок workflow на .NET Orleans и BPMN 2 — родился из упрямства, фрустрации, Camunda-которая-стала-платной и одного не самого очевидного разговора с ИИ.

Предыстория: четыре причины, по которым я вообще полез в это болото

Если у разработчика долго чешется одно и то же место, рано или поздно он возьмёт и сделает. У меня таких «чешущихся мест» было четыре, и они сошлись в одной точке:

  1. Я всегда хотел собрать что-то серьёзное на .NET Orleans. Это ведь почти единственный зрелый actor-фреймворк в дотнет-мире, на нём построены Halo и Skype, а живых продакшн-проектов в открытом доступе — по пальцам пересчитать. Руки чесались.

  2. Я люблю делать проекты. Не читать про них, не мечтать, а именно кодить. Это моё любимое состояние, в котором я согласен сидеть по ночам.

  3. Camunda 8 стала платной. Для многих команд это внезапно сделало вопрос «а на чём мы оркеструем наши бизнес-процессы» снова открытым. А когда рынок оголяется — самое время туда зайти.

  4. На работе я уже имел дело с Camunda. И кое-что из её архитектуры мне не нравилось настолько, что хотелось переделать. Не потому что я умнее создателей Camunda — а потому что у меня было конкретное видение, как сделать движок более масштабируемым, если положить в основу actor-модель вместо традиционного движка с БД-центричным исполнением.

Плюс ко всему я на собственной шкуре прочувствовал, насколько BPMN 2 удобен как язык моделирования. Когда бизнес-аналитик рисует прямоугольнички и стрелочки, а разработчик потом буквально исполняет эту диаграмму, а не «имплементирует по мотивам» — это кайф, который сложно описать человеку, не работавшему с ним.

Так родился Fleans. Название не несёт глубокого смысла — звучит, запоминается, не занято. Суть — open-source workflow engine на Orleans, который умеет исполнять стандартный BPMN 2 и горизонтально масштабироваться по схеме «добавил силосов — получил пропускную способность». Сейчас он раздаётся как полный релиз: подписанные NuGet-пакеты для авторов плагинов, multi-arch контейнерные образы на ghcr.io (amd64 + arm64), Helm-чарт с cosign-подписью, docker-compose-бандл одной командой. К конкретике я ещё вернусь — сначала про то, как мы туда дошли.

Первая попытка: команда, которая не взлетела

Любой честный рассказ о pet-проекте начинается с провала. Мой начался с двух.

Попытка №1. Я собрал команду из знакомых. Нашлись ребята, которым идея была в общем-то интересна. Но pet-проект без зарплаты держится только на энергии и ощущении, что ты рядом с чем-то живым. А у меня самого тогда ещё не было ни архитектуры в голове, ни MVP в репозитории — только тезисы. Мотивировать людей в таком состоянии я не смог. Через пару недель всё тихо угасло.

Попытка с ИИ (ранняя). Больше года назад я попробовал разобраться в предметной области с помощью ChatGPT. Казалось логичным: я не воркфлоу-эксперт, пусть ИИ расскажет. Получил много отдельных кусков — как устроен BPMN, что такое token в Camunda, как моделируют boundary events. Но собрать из этих кусков цельное понимание я тогда не смог. ИИ отвечал ровно на тот вопрос, который я задавал, а я не всегда знал, какой вопрос правильный.

Попытка №2 (команда). Я решил, что понимаю уже достаточно, чтобы вести проект технически, и собрал новый состав. К этому времени у меня были первые доменные модели: Activity, цикл, который вызывает метод активити и передвигает процесс к следующей, что-то вроде state machine поверх акторов. Но итог — тот же. Люди приходят, делают пару коммитов, исчезают.

Я оставил всё как есть и несколько месяцев вообще не трогал репозиторий. Проект казался слишком большим для одного. Я изучал аналоги (Elsa, WorkflowCore, Zeebe), и каждая из этих систем напоминала, сколько работы мне ещё предстоит.

Декабрь 2025: я вернулся к ИИ — и удивился

В декабре 2025 я решил ещё раз дать шанс ИИ-инструментам. К этому времени в ленте всё чаще проскакивали новости о том, что уровень моделей для кода стал совсем другим. Меня зацепили разговоры вокруг Claude Code — CLI-инструмент, заточенный именно под агентную разработку.

Я поставил. Попробовал. И удивился.

Это было не «приятно удивился, как в первый раз попробовал ChatGPT». Это было «сел за вечер, а через два дня у меня работающий прототип новой версии движка». Масштаб разницы с моделями годичной давности был такой же, как между «я ищу в Google, чтобы вспомнить синтаксис Task.WhenAll» и «я разговариваю с инженером, который уже 20 минут читает мой код».

Первым делом я, как и советовала документация, написал CLAUDE.md — файл с инструкциями для агента по проекту. И вот тут выяснилось важное: моя инвестиция в архитектурные принципы сделала это легко. Я изначально строил Fleans по DDD + Clean Architecture. Это значит, что описание проекта звучало не как «у нас такая-то папка, такая-то папка, вот этот класс делает то», а как «домен отделён от инфраструктуры, юзкейсы в application, персистентность за интерфейсами, Orleans-акторы — адаптеры для доменных агрегатов, грейн WorkflowInstance — event-sourced через JournaledGrain, все мутации идут через единый pipeline DrainAndRaiseEvents». Это язык, который ИИ понимает безошибочно, потому что он обучен на тоннах такого же кода.

Со временем CLAUDE.md сам себя перерос. Я разделил его (issue #649): корневой файл — это рулебук «как себя вести в этом репо»; всё остальное ушло в docs/conventions/ (как добавить новый BPMN-элемент, как написать кастомный плагин, как устроены стримы Orleans) и docs/runbooks/ (как выпустить релиз, как откатиться, как собрать compose-бандл). Это не косметика — без такого разделения один файл вырастает в монстра, который агент перечитывает на каждом запросе, и инструмент платит за это латентностью.

Ещё я решил использовать готовые скиллы для разработки — набор под названием superpowers. Коротко: это шаблоны процесса, которые заставляют агента не сразу бросаться писать код, а проходить этапы — анализ задачи, design doc, план, реализация, ревью, тесты. Для одиночного разработчика с амбициями это как нанять себе внешний процесс, которого иначе не бывает.

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

Доменная активити в Fleans — это Orleans-сериализуемый record. У каждой активити есть ActivityId и метод ExecuteAsync, который возвращает список команд исполнения (что движок должен делать дальше) и публикует доменные события через контекст исполнения. Базовый класс выглядит так:

[GenerateSerializer]
public abstract record Activity([property: Id(0)] string ActivityId)
{
    internal virtual bool IsJoinGateway => false;

    internal virtual async Task<List<IExecutionCommand>> ExecuteAsync(
        IWorkflowExecutionContext workflowContext,
        IActivityExecutionContext activityContext,
        IWorkflowDefinition definition)
    {
        await activityContext.Execute();
        await activityContext.PublishEvent(new WorkflowActivityExecutedEvent(
            await workflowContext.GetWorkflowInstanceId(),
            definition.WorkflowId,
            await activityContext.GetActivityInstanceId(),
            ActivityId,
            GetType().Name));
        return [];
    }

    internal abstract Task<List<ActivityTransition>> GetNextActivities(
        IWorkflowExecutionContext workflowContext,
        IActivityExecutionContext activityContext,
        IWorkflowDefinition definition);
}

А вот, например, кастом-таск активити — она наследуется от базовой TaskActivity, добавляет TaskType (например, "rest-call" или "hello-world"), мапинги переменных и поверх базового ExecuteAsync публикует событие ExecuteCustomTaskEvent, на которое подпишется плагин-хост со своим грейном-обработчиком:

[GenerateSerializer]
public record CustomTaskActivity : TaskActivity
{
    [Id(1)] public string TaskType { get; init; }
    [Id(2)] public List<InputMapping> InputMappings { get; init; }
    [Id(3)] public List<OutputMapping> OutputMappings { get; init; }

    internal override async Task<List<IExecutionCommand>> ExecuteAsync(
        IWorkflowExecutionContext workflowContext,
        IActivityExecutionContext activityContext,
        IWorkflowDefinition definition)
    {
        var commands = await base.ExecuteAsync(workflowContext, activityContext, definition);

        var variablesId = await activityContext.GetVariablesStateId();
        await activityContext.PublishEvent(new ExecuteCustomTaskEvent(
            await workflowContext.GetWorkflowInstanceId(),
            definition.WorkflowId,
            definition.ProcessDefinitionId,
            await activityContext.GetActivityInstanceId(),
            ActivityId,
            TaskType,
            InputMappings,
            OutputMappings,
            variablesId));

        return commands;
    }
}

Оркестратором над всем этим выступает грейн WorkflowInstance — он event-sourced через Orleans JournaledGrain, с кастомным storage-провайдером поверх EF Core. Все мутации идут через единый pipeline DrainAndRaiseEvents → RaiseEvent → ConfirmEvents, чтобы между событиями не было «полуразобранных» состояний. Объявление грейна (он разбит на три partial-файла; ниже только корневой):

public partial class WorkflowInstance :
    JournaledGrain<WorkflowInstanceState, IDomainEvent>,
    IWorkflowInstanceGrain,
    ICustomStorageInterface<WorkflowInstanceState, IDomainEvent>
{
    public ValueTask<Guid> GetWorkflowInstanceId()
        => ValueTask.FromResult(this.GetPrimaryKey());

    public override Task OnActivateAsync(CancellationToken ct) { /* replay journal, restore timers */ }

    public async Task SetWorkflow(IWorkflowDefinition workflow, string? startActivityId = null) { /* ... */ }
    public async Task StartWorkflow() { /* ... */ }
    public async Task CompleteActivity(string activityId, ExpandoObject variables) { /* ... */ }
    public async Task FailActivity(string activityId, Exception exception) { /* ... */ }

    // Custom event-sourcing storage
    public Task<KeyValuePair<int, WorkflowInstanceState>> ReadStateFromStorage() { /* ... */ }
    public Task<bool> ApplyUpdatesToStorage(IReadOnlyList<IDomainEvent> updates, int expectedVersion) { /* ... */ }
}

Variables в workflow — это ExpandoObject с динамическими полями: переменные процесса появляются и исчезают по ходу исполнения, BPMN-моделирование не любит жёсткую типизацию на уровне движка. Сериализация ExpandoObject через Orleans — отдельный сюрприз, для которого пришлось писать собственный суррогат-конвертер (он, кстати, изначально жил в engine-сборке, и из-за этого внешние плагин-хосты падали с CodecNotFoundException — пришлось переезжать в leaf-package; тоже история).

Это именно тот слой, который я раньше пилил неделями, спотыкаясь то о персистентность, то о boundary events, то о дедлоки в корреляции сигналов. С ИИ-партнёром эти недели схлопнулись в дни — но повторюсь: не за счёт магии, а за счёт того, что у меня уже была нормальная архитектура, в которую можно было просто класть код.

Регрессионные тесты: когда разработка обогнала моё внимание

Через неделю после старта новой волны вышло браузерное расширение Claude — Claude in Chrome. И тут у меня щёлкнуло.

У Fleans есть админ-панель (Fleans.Web) и REST API (Fleans.Api). А что, если отдать регрессионный прогон ИИ-агенту, который сам тыкает в интерфейс, сам дёргает API, сам проверяет, что поведение не сломалось? Я попробовал. Сработало.

Разработка к этому моменту шла так быстро, что я перестал успевать всё тщательно проверять руками. И тут был выбор: либо тормозить скорость ради своей способности проверить, либо менять сам процесс проверки.

Я выбрал второе. И это был момент, после которого что-то во мне внутренне сместилось.

Я начал думать не как программист, а как продакт-оунер. Вместо вопроса «какой код мне написать, чтобы это работало» я стал задавать другой: «какие свойства системы мне важно гарантировать, и как организовать процесс, чтобы эти гарантии держались без моего ручного участия». Это другой слой мышления. Роль программиста у меня в проекте забрал Claude — и, положа руку на сердце, он справляется с ней быстрее меня.

Параллельно я попросил Claude написать для Fleans собственный MCP-сервер — Model Context Protocol, через который другие агенты могут читать и менять состояние моего движка напрямую. Получилось изящно: вместо того чтобы ИИ кликал по кнопкам в моей же админке, он обращается к проекту через программный интерфейс, который этот же ИИ и написал. Петля замкнулась. Сейчас fleans-mcp — один из четырёх контейнеров в релизном бандле, наравне с API, Web и Worker.

К процессу регрессии добавились ещё два слоя автоматики. Первый — обычный CI: build, unit, integration, pg-tests, отдельная джоба для Playwright E2E. Второй — каталог manual-test-планов в tests/manual/. Сейчас в нём больше 25 автоматизированных Playwright-сценариев, и каждая фича обязана положить туда test-plan.md и .bpmn-фикстуру. Это правило живёт в CLAUDE.md, и агенты-исполнители его соблюдают без напоминаний.

OpenClaw и команда маленьких агентов

Где-то в это же время в ленте хайпанул OpenClaw — агент из серии «вот вам автономный работник, дайте ему задачу и забудьте». Я посмотрел на это и понял: мне нужны такие же маленькие агенты, работающие над задачами моего проекта, но уходить с Claude я не хочу.

Как раз в тот момент Claude добавил возможность запускать scheduled tasks — регулярно или по триггеру, без моего участия за клавиатурой. Этого оказалось достаточно.

Я сел и распределил роли. Создал в GitHub проектную доску (Claude, кстати, очень хорошо работает именно с GitHub — issues, PR, labels, milestones, вся эта машинерия для него родной язык). Доска — это полноценная конечная state-machine: Backlog → In Analysis → Review Analysis → Ready → In Progress → In Review → Testing → Review by Human → Done. Завёл отдельных «агентов» с разными профилями и инструкциями:

  • Worker — диспетчер. Каждые 10 минут смотрит на доску, по приоритетной таблице выбирает один задачник и роутит его в специализированный скилл. Берёт блокирующий per-машинный lock, чтобы два запуска не подрались.

  • Analytic — берёт сырой issue, разбирает требования, пишет design & plan, формулирует blocking-вопросы и оставляет задачу ждать ответа.

  • Analysis-review — критически читает дизайн, отделяет блокеры от важного и мелкого, возвращает на доработку, если нашёл регрессии.

  • Developer — реализует одобренный план: ветка, коммиты, PR.

  • Hourly-code-review — ревьюит свежие PR, ставит маркер bot-approve или bot-block в первой строке отзыва. Worker читает этот маркер и автоматически промоутит зелёный PR в Testing, если CI зелёный и маркер свежее последнего коммита.

  • Manual-regression-testing — для всего, что прошло code-review: гоняет регрессию против PR-ветки и подписывает вердикт.

Задачи теперь стали делаться быстрее и без моего непосредственного участия. Звучит как мечта, но у этого есть обратная сторона, о которой я скажу честно.

Scalability Auditor: самая нужная роль из всех

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

Я создал отдельную роль — Scalability Auditor. Его задача проста: регулярно смотреть на кодовую базу с высоты птичьего полёта и отвечать на вопросы: «где тут узкое место», «где мы заложили не-масштабируемое решение», «где стейт живёт не там, где должен», «где у нас будут проблемы на 10× нагрузке». И главное — он не сам всё чинит, а заводит задачи на ту же самую доску.

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

Хороший живой пример из недавнего: пока я гонял свежесобранную версию локально, я наткнулся на интермиттент-ошибку в управленческой Web. Сам нажимал «Старт» на процесс — иногда летело Unable to load Fleans.Application.Grains.IWorkflowInstanceGrain, Fleans.Application, иногда нет. Дальше дело пошло так: за полчаса агент-аналитик локализовал баг (плагин-силос регистрировался как Orleans gateway, хотя Fleans.Application он не загружает), агент-разработчик собрал PR на одну строку плюс регрессионный тест, я провёл self-review с маркером bot-approve, оба PR — engine-фикс и обходное решение в репозитории шаблона — улетели в main. В старой парадигме «один человек + ночь» такое бы заняло часа три минимум.

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

Это страшновато. И одновременно это и есть тот самый сдвиг, про который все говорят, но который сложно прочувствовать, пока не окажешься внутри. Ты не перестаёшь контролировать систему — ты просто контролируешь её на другом уровне абстракции.

Что внутри Fleans (так, чтобы было понятно, чем тут вообще можно пользоваться)

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

  • Акторы, а не оркестраторы. Каждый workflow — независимый Orleans-грейн. Нет общего координатора, нет lock-contention. Добавил силос — получил линейный прирост пропускной способности.

  • Чтение масштабируется отдельно от записи. В движок встроен CQRS-split: read-traffic ходит через NoTracking-query context, при желании — в отдельную Postgres-реплику. Админка и поллеры не мешают исполнению.

  • Event-sourced, crash-safe. Append-only журнал событий с детерминированным replay. Силос упал посреди процесса? Orleans поднимет грейн на другом силосе с того же места, осиротевшего состояния не будет.

  • BPMN-восстановление как первоклассные конструкции. Compensation, error boundaries, escalation — это явные семантики языка, а не ad-hoc try/catch. Ошибочные ветки моделируются так же, как успешные, и видны бизнесу на той же диаграмме.

  • Hot path работает из памяти. Активные workflow живут в RAM, промежуточные шаги в БД не ходят. События одного грейн-вызова батчатся в одну транзакцию в конце — а не пишутся по штуке.

  • Материализованные проекции для чтения. Админка и REST-запросы про состояние читают предварительно собранную EF-проекцию. Никакого replay-журнала ради рендера списка или поллинга «уже завершилось?».

  • Поднимаешь у себя — точка. Fleans поставляется одним контейнерным образом, который запускается на ноутбуке, виртуалке или в Kubernetes. Данные не уходят за периметр, SaaS-зависимости нет.

  • Своя база на выбор. SQLite для разработки, PostgreSQL для прода — переключается одним ключом конфига, без правок кода. Провайдер-модель открытая: нужна другая БД — пишешь свой адаптер.

  • Свой стрим-провайдер тоже на выбор. Доменные события идут через Orleans Streams. По умолчанию — in-memory; флаг Fleans:Streaming:Provider=kafka переключает на встроенный Kafka-адаптер для cross-silo durability. Можно подсунуть свой — точка расширения та же.

  • Свои таски и свои воркеры. REST-вызов, очередь, любая кастомная интеграция оформляются как BPMN-таск через шаблонный repo fleans-custom-worker-example. Хост плагинов масштабируется независимо от engine — один workflow может разлетаться по твоему собственному флоту воркеров.

Установка одной командой:

# скачивает docker-compose-бандл из последнего релиза
gh release download --repo nightBaker/fleans -p 'docker-compose-*.zip'
unzip docker-compose-*.zip && docker compose up -d

Это поднимает api (8081), management web (8080), worker, mcp, Postgres, Redis и Aspire-дашборд. Через минуту можно деплоить .bpmn через REST или дизайнить процессы прямо в Web. Helm-чарт лежит там же в релизе, подписан cosign-ом.

Постоянное обучение: ИИ, который учится на своих ошибках

ИИ всё ещё ошибается. Мне бы очень хотелось написать, что Claude у меня ни разу не завалил задачу, но это было бы неправдой. Иногда он предлагает решение, которое на бумаге нормальное, а в контексте моего проекта ломает какой-то неочевидный инвариант. Иногда забывает про договорённости, которые мы приняли две недели назад.

Я сделал с этим вот что: попросил агента обучаться на своих ошибках. После каждой задачи, где были проблемы, он обновляет свои же инструкции — добавляет пункт «в этом проекте так делать нельзя, потому что [причина]». Со временем получается растущий свод правил, который по сути является историей граблей, на которые мы наступали вместе. Сейчас в CLAUDE.md есть отдельная секция «load-bearing invariants» — там перечислены вещи, которые сломать = прислать прод-баг: «каждая активити инстанс исполняется ровно один раз», «handlers компенсации работают в изолированных скопах переменных», «registration-vs-cleanup error asymmetry» и так далее. Эти правила писались не из любви к порядку — каждое из них стоит конкретного инцидента в истории.

Ещё я попросил его поддерживать сайт проекта с документацией — и обновлять документы с каждой задачей. Чтобы человек, пришедший в проект сегодня, видел не «README от трёх месяцев назад», а актуальное описание того, как всё устроено. Для разделения аудиторий ввели жёсткое правило: репо-документация (README.md, docs/conventions/) — для контрибьюторов с исходниками; сайт (website/...) — для пользователей, которым достаточно релизного артефакта. CI-проверка pin-guard отдельно следит, чтобы в публичную документацию не утекли inline-ссылки на исходники с привязкой к номерам строк. Потом я пошёл дальше и попросил сделать 3D-сцену на главной странице сайта, которая визуально показывает сильные стороны Fleans — акторную модель, исполнение BPMN, распределённость. Это перебор с точки зрения «а надо ли», но выглядит эффектно и собирает внимание. А для проекта, который ищет первых пользователей, внимание важнее, чем умеренность.

Что я понял за эти полгода

Мне неловко писать «выводы» — это всегда звучит пафосно. Но без них рассказ про AI-разработку превращается в репортаж. Попробую честно, без оптимизма «всё будет супер» и без апокалипсиса «все умрут».

ИИ развивается быстрее, чем мы успеваем это осознать. Я не шучу. Между «ChatGPT год назад не смог собрать мне картину предметной области» и «Claude сейчас работает в моей кодовой базе лучше, чем я сам» прошло меньше 18 месяцев. Я не знаю, что будет ещё через 18. И, судя по всему, никто не знает.

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

ИИ с контекстом проекта превосходит уровень сеньора. Это самое спорное утверждение, и я готов его защищать. Не «ИИ вообще умнее сеньора» — нет. А именно «ИИ, который читал ваш CLAUDE.md, ваш домен, ваши commit-сообщения и ваши прошлые разговоры, предлагает решения лучше, чем опытный инженер, которого вы онбордили неделю». Потому что инженеру нужно несколько месяцев, чтобы начать думать «в вашей системе координат». ИИ впитывает контекст за минуты.

Архитектура и принципы становятся критичнее, чем когда-либо. Если у вас нет нормального контекста, ИИ усилит и умножит ваш бардак. Если у вас есть DDD, Clean Architecture, чёткие границы модулей — ИИ полетит по ним, как поезд по рельсам. Инвестиции в архитектуру окупаются с множителем.

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

Нужно мыслить как продакт-оунер, а не просто инженер. Это следствие предыдущего. Ваша ценность смещается из «я напишу» в «я определю, что и зачем должно быть написано, и организую проверку».

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

ИИ заменит наши роли, но не нас. Пока. Я правда так думаю. Роль программиста в моём проекте забрал Claude. Но меня как человека, у которого есть вкус к архитектуре, понимание предметной области и желание вести проект, он не заменил. Роль — это функция. Человек — это что-то другое. Пока.

ИИ здесь, и никуда не денется. Адаптация произойдёт быстрее, чем думают скептики. И не так быстро, как думают новаторы. Где-то посередине, как всегда и бывает.

Зачем я это всё написал

Честно — чтобы рассказать про Fleans. Проект живой, открытый, мне нужны первые разработчики, которые хотят с ним поиграть, погонять, покритиковать. Если вы работали с Camunda и у вас есть конкретное «а почему это не сделали так», я хочу это услышать. Если хотите написать свой первый кастом-таск — есть шаблон-репо fleans-custom-worker-example, который собирается с актуальными NuGet-пакетами и стартует одной командой. Если вы оперируете Orleans-кластерами в проде и видите, что я что-то делаю не так — пишите, перебивайте, поправляйте.

Но в процессе писания я понял, что статья не про движок. Она про то, как вообще устроена разработка в 2026 году, когда ты один и у тебя есть инструмент, которым ещё недавно никто не умел пользоваться. И что этот инструмент уже не «помощник», а полноценный участник процесса, у которого ты отбираешь задачи, которому ты делегируешь подсистемы и которого ты иногда ругаешь за архитектурные решения.

Если кому-то это поможет решиться на свой проект, который давно лежит в папке «когда-нибудь», — я буду рад. Начинать сейчас правда хорошее время.


Fleans — open-source workflow engine на .NET Orleans и BPMN 2. Репозиторий: github.com/nightBaker/fleans. Шаблон плагин-хоста: github.com/nightBaker/fleans-custom-worker-example. Документация — в профиле. Вопросы, критика и идеи — в комментариях, я читаю каждый.