<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
    <title>Notes &amp; Insights - devops</title>
    <subtitle>Блог об архитектуре систем, AI-агентах, распределенных системах и алгоритмическом трейдинге.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://xsa-dev.github.io/tags/devops/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://xsa-dev.github.io"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-10-08T00:00:00+00:00</updated>
    <id>https://xsa-dev.github.io/tags/devops/atom.xml</id>
    <entry xml:lang="ru">
        <title>Self-Improving AI Software Factory: архитектура распределенной фабрики кода на базе LLM-агентов</title>
        <published>2026-10-08T00:00:00+00:00</published>
        <updated>2026-10-08T00:00:00+00:00</updated>
        
        <author>
          <name>Alexei Savin</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://xsa-dev.github.io/posts/self-improving-ai-software-factory/"/>
        <id>https://xsa-dev.github.io/posts/self-improving-ai-software-factory/</id>
        
        <content type="html" xml:base="https://xsa-dev.github.io/posts/self-improving-ai-software-factory/">&lt;p&gt;Локальные инструменты агентного кодинга (Codex, Claude Code, Aider, OpenDevin) совершили революцию в индивидуальной разработке. Однако при попытке масштабировать этот подход на уровень команды или автоматизированного пайплайна инженеры неизбежно упираются в системный тупик:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Локальный хаос промптов и конфигураций:&lt;/strong&gt; у каждого разработчика свои настройки контекста, разные версии моделей и несогласованные правила форматирования.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Отсутствие воспроизводимости:&lt;/strong&gt; невозможно точно оценить, улучшило ли очередное изменение в системном промпте качество кодогенерации или сломало граничные кейсы.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Неэффективная трата токенов:&lt;/strong&gt; использование мощных LLM для механических задач (проверка синтаксиса, парсинг логов, поиск файлов) вместо детерминированных скриптов.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Решением становится переход от локальных CLI-утилит к &lt;strong&gt;AI Software Factory&lt;/strong&gt; — централизованной распределенной системе оркестрации агентных воркеров с замкнутым контуром самообучения (&lt;em&gt;Self-Improving Feedback Loop&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Разберем архитектуру такой фабрики (на примере системы &lt;em&gt;Machinist&lt;/em&gt;, исследованной Оуэйном Льюисом).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-arkhitektura-fabriki-control-plane-i-worker-pool&quot;&gt;1. Архитектура фабрики: Control Plane и Worker Pool&lt;/h2&gt;
&lt;p&gt;В основе промышленной фабрики кода лежит строгое разделение между уровнем управления (&lt;strong&gt;Control Plane&lt;/strong&gt;) и изолированными вычислительными узлами (&lt;strong&gt;Worker Pool&lt;/strong&gt;):&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    subgraph&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; Triggers &lt;/span&gt;&lt;span&gt;[&amp;quot;⚡ Входной поток задач &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Triggers&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)&lt;/span&gt;&lt;span&gt;&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        T1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Webhooks / CI / Jira / CLI&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Triggers &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Новый тикет / запрос&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; CP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    subgraph&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; CP &lt;/span&gt;&lt;span&gt;[&amp;quot;🎛️ CONTROL PLANE &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Machinist&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)&lt;/span&gt;&lt;span&gt;&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        direction TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        DB&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Task Queue &amp;amp; Global State&amp;lt;br/&amp;gt;(SQLite / WAL)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Catalog&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Prompts &amp;amp; Skills Catalog&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Dashboard&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Web Dashboard &amp;amp; Traces&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        SSHGate&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;SSH Tunnel Gateway&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CP &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;==&amp;gt;|&lt;/span&gt;&lt;span&gt;🔒&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; Dispatches jobs over SSH tunnel&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; WP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    subgraph&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; WP &lt;/span&gt;&lt;span&gt;[&amp;quot;☁️ WORKER POOL &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Hetzner / Cloud VMs&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)&lt;/span&gt;&lt;span&gt;&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        direction TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Foreman&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;👑 1. Foreman Agent&amp;lt;br/&amp;gt;(Планирование и декомпозиция)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        SubAgents&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🤖 2. Sub-Agents Swarm&amp;lt;br/&amp;gt;(Claude Coder / Codex / PyTest)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Audit&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;🛡️ 3. Audit Agent + Deterministic Evals&amp;lt;br/&amp;gt;(mypy, pytest, 3-Agent Review)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Foreman &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Делегирование подзадач&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; SubAgents&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        SubAgents &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Код, патчи и артефакты&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; Audit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;preimushchestva-takoi-topologii&quot;&gt;Преимущества такой топологии:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Изоляция окружения:&lt;/strong&gt; агенты выполняют сборку, запуск тестов и системные команды на недорогих облачных серверах (например, Hetzner Cloud VM с 16–32 GB RAM), не засоряя локальную машину разработчика.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Очередь задач с лимитом параллелизма:&lt;/strong&gt; Control Plane контролирует лимиты API (&lt;code&gt;max_concurrent_jobs&lt;/code&gt;) и защищает от исчерпания рейтов LLM-провайдеров.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-ierarkhiia-agentnykh-rolei-foreman-sub-agents-audit&quot;&gt;2. Иерархия агентных ролей: Foreman → Sub-agents → Audit&lt;/h2&gt;
&lt;p&gt;Монолитный агент, пытающийся одновременно планировать архитектуру, писать код, ставить зависимости и проверять тесты, быстро теряет фокус из-за раздувания контекстного окна (&lt;em&gt;Context Rotting&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;В фабрике реализовано четкое разделение ответственности:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Роль&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Зона ответственности&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Инструменты&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Foreman (Прораб)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Принимает высокоуровневый тикет, исследует кодовую базу, формирует план и распределяет подзадачи.&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;search_files&lt;/code&gt;, &lt;code&gt;read_file&lt;/code&gt;, &lt;code&gt;delegate_task&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Sub-Agent (Кодер)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Выполняет строго одну изолированную задачу в конкретном модуле (написание функции, рефакторинг, фикс бага).&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;patch&lt;/code&gt;, &lt;code&gt;write_file&lt;/code&gt;, &lt;code&gt;terminal&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Audit Agent (Аудитор)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Проверяет соответствие критериям приемки, соответствие стилю и отсутствие побочных регрессий.&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;pytest&lt;/code&gt;, &lt;code&gt;cargo test&lt;/code&gt;, &lt;code&gt;git diff&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-determinirovannye-evals-vmesto-lishnikh-llm-vyzovov&quot;&gt;3. Детерминированные Evals вместо лишних LLM-вызовов&lt;/h2&gt;
&lt;p&gt;Одна из главных ошибок при проектировании AI-фабрик — попытка решать все задачи через промпты нейросетей.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Золотое правило:&lt;/strong&gt; если задачу можно надежно и дешево решить регулярным выражением, статическим анализатором или bash-скриптом — &lt;strong&gt;не отправляйте ее в LLM&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;# Пример детерминированного гейта качества без участия нейросети&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;import&lt;/span&gt;&lt;span&gt; subprocess&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;import&lt;/span&gt;&lt;span&gt; sys&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; verify_code_artifact&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;repo_path&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; str&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; bool&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;    # 1. Синтаксический анализ и типы&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    typecheck&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; subprocess&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;run&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;mypy&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; repo_path]&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; capture_output&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;True&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    if&lt;/span&gt;&lt;span&gt; typecheck&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;returncode&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; !=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;        print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;[FAIL] Typecheck errors:&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;\n{&lt;/span&gt;&lt;span&gt;typecheck&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;stdout&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;decode&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;    # 2. Модульные тесты&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tests&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;/span&gt;&lt;span&gt; subprocess&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;run&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;pytest&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;-q&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;{&lt;/span&gt;&lt;span&gt;repo_path&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;/tests&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;/span&gt;&lt;span&gt; capture_output&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;True&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    if&lt;/span&gt;&lt;span&gt; tests&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;returncode&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; !=&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;        print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;[FAIL] Unit tests broken:&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;\n{&lt;/span&gt;&lt;span&gt;tests&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span&gt;stdout&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;decode&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span style=&quot;color: #95E6CB;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; False&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; True&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;if&lt;/span&gt;&lt;span&gt; __name__&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; verify_code_artifact&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        sys&lt;/span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Детерминированные скрипты дают &lt;strong&gt;100% стабильный результат&lt;/strong&gt;, выполняются за миллисекунды и экономят тысячи долларов на API-токенах.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-self-improving-feedback-loop-obuchenie-na-treisakh&quot;&gt;4. Self-Improving Feedback Loop: обучение на трейсах&lt;/h2&gt;
&lt;p&gt;Почему фабрика называется &lt;em&gt;самообучающейся&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Агентная фабрика не просто исполняет задачи, она непрерывно накапливает базу знаний об ошибках:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;flowchart&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Fail&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;❌ Неудачный запуск / Broken Build&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;] --&amp;gt;&lt;/span&gt;&lt;span&gt; Trace&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;📋 Трейс выполнения: логи + контекст&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    subgraph&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; RootCause &lt;/span&gt;&lt;span&gt;[&amp;quot;🔍 Автоматический анализ узкого места&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        direction TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        P1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Неточная инструкция в системном промпте?&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        P2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Недостаточный контекст из документации?&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        P3&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;Сбойный вспомогательный скрипт?&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Trace &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; RootCause&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    subgraph&lt;/span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; KnowledgeUpdate &lt;/span&gt;&lt;span&gt;[&amp;quot;🚀 Обновление фабрики &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Feedback Loop&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;)&lt;/span&gt;&lt;span&gt;&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        direction TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        K1&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;1. Обновление каталога Skills &amp;amp; Prompts&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        K2&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;2. Создание нового синтетического Eval-теста&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        K1 &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;&amp;lt;--&amp;gt;&lt;/span&gt;&lt;span&gt; K2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    RootCause &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;==&amp;gt;&lt;/span&gt;&lt;span&gt; KnowledgeUpdate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    KnowledgeUpdate &lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;-.-&amp;gt;|&lt;/span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;Внедрение в воркеры&lt;/span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;|&lt;/span&gt;&lt;span&gt; Fail&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Когда один агент находит решение сложной проблемы или совершает ошибку, исправление вносится в &lt;strong&gt;централизованный репозиторий промптов и скиллов&lt;/strong&gt;. В следующий раз все воркеры фабрики автоматически получают обновленную базу знаний.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kliuchevye-vyvody&quot;&gt;Ключевые выводы&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Централизация побеждает локальный хаос:&lt;/strong&gt; единый Control Plane с версионированием промптов и очереди задач обеспечивает воспроизводимость.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Разделение труда (Foreman / Sub-agents / Audit):&lt;/strong&gt; узкоспециализированные агенты с компактным контекстом работают надежнее и дешевле монолитов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Детерминизм во главе угла:&lt;/strong&gt; используйте классические линтеры, компиляторы и тесты вместо LLM-судей везде, где это возможно.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Контур обратной связи (Evals Loop):&lt;/strong&gt; каждый упавший трейс превращается в синтетический тест для предотвращения будущих регрессий.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;pervoistochniki-i-materialy&quot;&gt;Первоисточники и материалы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Оригинальное видео и автор:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://youtu.com/ZDOTYfJBuLw&quot;&gt;Owain Lewis — I Built A Self-Improving AI Software Factory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Детальный структурированный конспект:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev/obsidian-vault/blob/main/YouTube/Owain-Lewis-Self-Improving-AI-Software-Factory-2026.md&quot;&gt;Obsidian Vault: Owain Lewis Software Factory (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Инженерные наработки:&lt;/strong&gt; &lt;a rel=&quot;external&quot; href=&quot;https://github.com/xsa-dev&quot;&gt;github.com/xsa-dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
</feed>
