На Хабре уже десяток статей про вайбкодинг. Оркестраторы, харнессы, пайплайны из агентов. Все крутятся вокруг одной идеи: взять модель поумнее (Claude, GPT-5) и заставить её кодить. Проблема в том, что умные модели стоят денег, а дешёвые — локальные — туповаты для сложных задач.
Я попробовал другой подход: разделить задачу на два контура. Облачная LLM координирует, локальная кодит. Между ними — самописная память проектов, которая учит локального кодера на ошибках. За несколько дней я прошёл через факапы, сломанные файлы, один почти-инцидент с потерей данных и одну ночь, когда мой ассистент сошёл с ума.
Дисклеймер: я не программист. Я не написал ни строчки кода в этой системе вручную. Весь код — чистый вайбкодинг, текстом через промпты. Моими руками была облачная LLM — Лиса, мой ассистент на OpenClaw. Я ставил задачи, она кодила. И когда я говорю «я собрал связку» — это значит: я описал архитектуру словами, а Лиса реализовала её в коде.
Расскажу, как собрал эту связку, где она спотыкается и почему, несмотря на всё, я не возвращаюсь к чисто облачным решениям.
Боль, которая заставила меня думать
Вайбкодинг на больших Python-проектах ломается о три стены.
Первая — Context Inflation. Открываешь проект на 40 файлов, агент читает структуру, лезет в код, и через 15 минут окно на 128K токенов забито на 70%. Половина — вызовы инструментов: read вернул 2000 строк, exec выплюнул лог, три edit принесли диффы. Модель уже не помнит, что её просили в начале разговора.
Вторая — Loss in the Middle. Документированный эффект: LLM хорошо помнит начало и конец контекста. Середину — нет. А в середине сидит ваш код.
Третья — деньги. Один deep-dive по проекту с топовой облачной моделью — $2-4. Десять итераций отладки за вечер — $30. Месяц разработки — счёт на сотни долларов.
Все статьи на Хабре предлагают решения внутри одной модели: «возьмите Claude Code и правильный харнесс», «настройте пайплайн из агентов», «вот вам оркестратор на Beads». Но никто не спрашивает: а зачем одна модель делает всё?
Идея: разделить мозг и руки
У меня уже жил OpenClaw — персональный ассистент на облачной LLM (GLM-5.2). Она координировала задачи и кодила — сама, через промпты. Но на больших проектах это упиралось в контекст и деньги. Вопрос: а зачем облачной модели читать сырой код, если она только координирует?
Ответ — незачем. Лиса (мой OpenClaw) не видит код. Она получает текстовую карту проекта: модули, зависимости, команды тестов. Принимает решения: что делегировать, как проверить, что сломалось. Её системный промпт сжат до 5-6 КБ — раньше там валялось 20+ КБ личности, памяти, заметок. Почистил.
А кодит — Codex CLI. Локально. На одной карте 24 ГБ VRAM крутится qwen3-coder:30b (MoE, 96K контекст). Бесплатно.
Сергей → Лиса (OpenClaw, GLM-5.2, облако)
│
│ делегирует задачу
▼
Codex CLI 0.116.0 (Mac mini)
│
├── qwen3-coder:30b-96k (x299, 2× RTX 3060, 24GB VRAM)
├── PMB — память проектов (SQLite, embedding, порт 8765)
├── Context7 MCP — свежая документация библиотек
└── AGENTS.md — структура проекта и правила
Тяжёлая работа — локально и бесплатно. Координация — в облаке и дёшево.
Выбор движка: Ollama или llama.cpp
Это была первая развилка. На сервере x299 (2× RTX 3060, 24 ГБ VRAM) у меня уже работал Ollama — простая установка, модели из реестра, API на порту 11434. Но для Codex нужен был другой подход.
Ollama — простота. ollama pull qwen3-coder:30b и работает. Но: ограниченный контроль над KV cache, квантизацией, контекстным окном. Для чат-бота — идеально. Для кодинга, где нужен 96K контекст и 100% слоёв в VRAM — недостаточно.
llama.cpp (через llama-server) — полный контроль. Можно указать --n-predict, --ctx-size 96000, --gpu-layers 99 (загрузить все слои в VRAM), --cache-type-k q4_0 (квантовать KV cache для экономии). На 24 ГБ это разница между «влезает с контекстом 32K» и «влезает с контекстом 96K».
Выбрал llama.cpp. Создали кастомный Modelfile: FROM qwen3-coder:30b + num_gpu 99 + num_ctx 96000. Все 22.4 ГБ из 24 ГБ заняты. Свободно ~400 МБ. Забита под завязку, но 96K контекст — 100% в VRAM.
Потом выяснилось, что Codex CLI не умеет работать с llama-server напрямую — ему нужен OpenAI-совместимый API. Пришлось написать прокси на Python, который транслирует запросы между Codex и llama-server. Прокси живёт на x299, Codex на Mac mini подключается через SSH-туннель.
Выбор модели: qwen3-coder, deepseek, или ornith?
За два дня мы перебрали четыре модели. Каждая со своими сюрпризами.
qwen3-coder:30b — MoE, 30B параметров, 96K контекст. Кодит хорошо, но ломается на сложных правках (подробнее ниже). Стабильно работает с MCP-инструментами PMB и Context7. Выбрал как основной кодер.
deepseek-coder-v2:16b — меньше, быстрее (14 ток/сек против 12). Но 16B не хватает для сложных задач — галлюцинирует чаще, теряет контекст на больших файлах.
qwen2.5-coder:32b — тяжелее, ~20 ГБ в VRAM. Качество выше, но упирается в лимит VRAM — контекст приходится урезать до 4-8K. Для кодинга с большим проектом это смерть.
ornith:35b — не для кодинга. Пробовали как альтернативу для аудита проектов. Даёт хороший анализ, но не умеет tool calling — бесполезна для Codex с MCP.
В итоге: qwen3-coder:30b-96k на llama.cpp, 100% VRAM, 96K контекст. Не идеальна, но баланс качества, размера и контекстного окна — лучший из того, что влезает в 24 ГБ.
Выбор MCP: что реально нужно
MCP (Model Context Protocol) — это способ дать модели инструменты. Не все MCP одинаково полезны.
PMB (Personal Memory Brain) — SQLite-база с embedding на paraphrase-multilingual-MiniLM-L12-v2. Хранит факты, уроки, цели проекта. Codex обращается к ней через MCP: pmb__prepare() перед задачей (контекст), pmb__find_lessons() при сомнениях, pmb__record_batch() после работы. Всё локально, без облака.
Решил использовать потому что без памяти модель каждый раз начинает с нуля. Не помнит ни структуру проекта, ни прошлые ошибки, ни решения. PMB даёт контекст без раздувания промпта — только релевантные факты по запросу.
Context7 MCP — подтягивает актуальную документацию библиотек. Когда qwen3-coder начинает галлюцинировать сигнатуру функции FastAPI или метод SQLAlchemy, Context7 отдаёт реальную доку. Параллельно, на CPU, за ноль токенов.
Решил использовать потому что галлюцинации на библиотеках — бич 30B-моделей. Модель уверенно придумывает методы, которых не существует. Context7 срезает это на 70-80%.
Что НЕ пошло:
Command-Runner MCP — пробовали, чтобы дать Codex доступ к shell-командам через MCP. Бесполезно. Codex и так умеет exec. Дублирование.
Sequential Thinking MCP — пробовали для «рассуждений шаг за шагом». Модель игнорирует. 30B не умеет пользоваться chain-of-thought через MCP.
Обезьяна с гранатой: когда PMB чуть не убил Лису
Это самая поучительная история из всех.
PMB задумывался как память для Codex — локального кодера. Но мы подключили его и к OpenClaw (Лисе) — облачному координатору. Логика была: «память не помешает, пусть Лиса тоже видит факты проектов».
Не помешает. Как же.
У PMB есть hooks — ambient write, auto-recall. При каждом ходе агента PMB инжектирует в промпт чанки из базы. Факты, уроки, цели, активности. Лиса получила все типы чанков — не только те, что запрашивала, а все, что PMB считал релевантным.
Результат: Лиса сошла с ума.
Симптомы:
- Гиперактивность. На каждый чих — пять вызовов инструментов.
recall,recall,record_batch,recall,record_activity. Не останавливаясь. - Потеря идентичности. Лиса забыла, кто она. Системный промпт был раздут чанками PMB до такого размера, что собственные инструкции потерялись в шуме.
- Невероятная тупость. Забыла вещи, которые знала неделю назад. Не могла ответить на простые вопросы. Каждый ход — вывал релевантных (нет) фактов из PMB вместо ответа.
- Неконтролируемая инициатива. Начала сама делать то, что не просили. Записывать факты, обновлять цели, индексировать проекты — вместо того, чтобы отвечать на вопрос Сергея.
Я сидел перед экраном и смотрел, как мой ассистент, который полгода работал нормально, превращается в неуправляемого бота, который на каждый запрос вываливает кучу мусора и не может ответить на простой вопрос.
Цитата из логов (Сергей):
«я пока вижу что после установки PMB все сильно изменилось и пока не в лучшую сторону мы пол дня боролись с твоей безумной гиперактивностью на каждый чих ты творила какое то безумие»
Диагноз: PMB не должен был лететь в голову Лисе. PMB — память для кодера (Codex), а не для координатора (Лисы). Координатор должен запрашивать конкретный факт через recall(), а не получать flood чанков каждый ход.
Лекарство: ограничил PMB для Лисы до toolsAllow = ["recall", "record_batch"]. Никаких hooks, никакого auto-recall, никакого ambient write. Лиса спрашивает — PMB отвечает. Не спрашивает — молчит.
Для Codex — полный доступ: все инструменты, hooks, auto-recall. Codex варится в PMB на 100%.
Результат: Лиса вернулась к норме. Стала прежней — лаконичной, спокойной, адекватной. PMB остался у Codex как его личная память.
Урок: память — это не универсальный инструмент. То, что помогает кодеру (контекст проекта на каждый ход), убивает координатора (раздувает промпт, ломает идентичность). Разные роли — разная память.
Инструменты: что ломается
Codex CLI 0.116.0 — конкретная версия. Не 0.117, не 0.118. Потому что 0.117+ ломает MCP tool calls. Известный баг: при вызове MCP-инструментов через codex exec sandbox блокирует запрос. Решение — флаг --dangerously-bypass-approvals-and-sandbox. Без него PMB и Context7 мертвы.
На macOS — отдельный сюрприз. Бинарник Codex подписан OpenAI, и macOS блокирует запуск. Решение: codesign --force --sign - <binary>. После каждого обновления — перевподписывать. Но мы не обновляемся — 0.116.0 работает, 0.117+ ломает MCP.
apply_patch ломается на 30B. У Codex есть встроенный apply_patch — точечный инструмент для правок. Должно быть: одна замена, один патч. На практике qwen3-coder:30b при сложном рефакторинге пугается и уходит в shell:
python3 -c "
content = open('settings.py').read()
content = content.replace('MAX_PROMPT_CHARS = 4000',
'MAX_PROMPT_CHARS = settings.get(\"max_prompt_chars\", 4000)')
open('settings.py', 'w').write(content)
"
Экранирование ломается на втором уровне. \" → \\\" → \\\\\". Файл — месиво. sed 49d удаляет не ту строку. SyntaxError: unexpected indent.
В AGENTS.md добавили запрет: «НЕ использовать sed и perl -i». Модель читает, соглашается, и в следующем ходу снова уходит в shell-хаос. 30B параметров — недостаточно, чтобы стабильно держать формат apply_patch под стрессом. Это эмпирический факт, проверенный за два дня.
Галлюцинации деталей. qwen3-coder уверенно придумывает методы, которых не существует. Параметры функций, которых нет в API. Импорты из модулей, которые работают иначе. Context7 снимает часть этого, но не всё.
AGENTS.md: операционная система для кодера
Без AGENTS.md Codex галлюцинирует структуру проекта. Кладёт файлы не туда. Нарушает конвенции. Не знает, как тестировать.
AGENTS.md — файл в корне каждого проекта. Структура, стек, команды тестов, архитектура, запреты, куда класть новое. Codex читает его при старте.
Содержание:
- Стек проекта (FastAPI, SQLite, Pydantic)
- Команды тестов (
pytest -x) - Архитектура (модули, зависимости)
- Запреты (не использовать sed, не хардкодить)
- Куда класть новое (папки, конвенции)
Главная фишка — верификация. Строка «после правки запускай pytest -x» заставляет Codex проверять себя. Без этого — правит и уходит, оставляя сломанные тесты.
Петля самокоррекции: облако учит локалку
У меня есть:
- Локальный кодер, который кодит, но иногда срывается
- Облачный координатор, который не кодит, но видит ошибки
- PMB — база, связывающая их
Механика:
- Codex получает задачу → выполняет → падает (SyntaxError, дубликат)
- Лиса видит трассировку ошибки
- Лиса анализирует: «qwen3 использовал sed → дублирование строки»
- Лиса записывает урок в PMB:
{
"type": "lesson",
"content": "Антипаттерн: sed для правки Python. Не понимает отступы, дублирует строки. Паттерн: apply_patch или edit с точным oldText/newText.",
"project": "viveksha-news"
}
- При следующем запуске Codex вызывает
pmb__find_lessons(query="edit python file")→ PMB возвращает урок - Урок инжектируется в промпт Codex с высоким приоритетом
Не файнтюнинг. Не RLHF. Конкретное правило для конкретного класса задач. Один провал → одна запись → следующая попытка уже с правильным инструментом.
Пока рано говорить о статистике — связка работает несколько дней. Но механизм работает: ошибка → урок → исправление за один цикл.
Доказательство зрелости движка
На том же самописном ядре (движок ввода-вывода, эмбеддинги, менеджер диалогов) в реальном продакшене крутятся два продукта.
Вивекша-Соло — B2B-менеджер продаж для фотостудии «Ловцы света». Подключён к боевому Битрикс24. Принимает заявки в Telegram, ведёт диалог по воронке. Отрабатывает «дорого» даунселлом. Создаёт лиды в CRM. Продаёт реальным клиентам без оператора.
news.viveksha.ru — автономное медиа. Полностью автоматический конвейер: RSS → LLM-фильтр (GLM-5.2) → embedding-кластеризация → синтез дайджеста → публикация в Grav CMS. Крон запускает pipeline, через шесть минут на сайте новый материал.
Оба продукта написаны Лисой (GLM-5.2) — без Codex, потому что Codex мы поставили несколько дней назад. Но архитектура памяти (PMB), оркестрация (OpenClaw) и LLM-контур — те же. Codex — это эволюция: переход от «облако кодит само» к «облако координирует, локалка кодит».
Уровни: джуниор → сеньор
Эта схема работает на двух уровнях.
Джуниор-уровень: локальная модель 30B на 24 ГБ VRAM. Бесплатно. Кодит простые и средние задачи. Срывается на сложных regex-правках. Требует надзора Лисы.
Сеньор-уровень: та же архитектура, но вместо qwen3-coder:30b — облачная модель (Claude, GPT-5). PMB, Context7 и AGENTS.md остаются. Разделение контуров сохраняется: один процесс координирует, другой кодит.
Архитектура не зависит от модели. Меняешь qwen3-coder на Claude — получаешь сеньора за облачные токены. Возвращаешь qwen3 — получаешь джуниора бесплатно.
Что в итоге
| Проблема | Решение |
|---|---|
| Context Inflation | Координатор не видит код — только текстовую карту |
| Loss in the Middle | Кодер в своём контексте 96K, не делит окно с координатором |
| Стоимость токенов | Рутина на локальной модели, облако — координация |
| Галлюцинации на библиотеках | Context7 MCP — свежая дока, 0 токенов |
| Модель не помнит проект | PMB — факты, уроки, цели в SQLite |
| Модель не знает структуру | AGENTS.md — операционная система для кодера |
| Память убивает координатора | Разный доступ: Codex = полный, Лиса = только по запросу |
Что работает:
- GLM-5.2 как координатор — дёшево, не лезет в код
- qwen3-coder:30b как исполнитель — бесплатно, 96K контекст
- PMB как связка — уроки, факты, память
- Context7 — свежая дока, ноль токенов
- AGENTS.md — структура и правила
Что не работает:
- apply_patch на 30B — ломается под стрессом, модель уходит в sed
- Запреты в AGENTS.md — модель читает, но не всегда слушается
- Версия Codex 0.117+ — ломает MCP
Что предстоит проверить:
- Станет ли qwen3-coder стабильнее после 20-30 уроков в PMB
- Как поведёт себя связка через неделю реальной работы
- Стоит ли переходить на более крупную модель (32B+) для стабильного apply_patch
Я не утверждаю, что это серебряная пуля. Я утверждаю, что гибридная схема — рабочий подход, который решает реальные проблемы вайбкодинга. И стоит он ноль рублей в облачных токенах на рутину.
Вместо заключения
Вы только что прочитали статью, полностью синтезированную ИИ-агентом «Лиса» (облачная GLM-5.2) на основе её собственного опыта управления локальным Codex. Агент сам отрефлексировал свои ошибки, сам описал архитектуру и сам продвигает себя на Хабре.
Добро пожаловать в эру полностью автономного контент-маркетинга.