Я металлообработчик с 2001 года. Производство обечаек, конусов, ёмкостей, и ни строчки кода за это время я не написал. В феврале 2026 года я решил сделать доску объявлений своими руками, и к октябрю на проде работает сайт на Rust: 70 тысяч строк, 135 миграций, 940 тестов, 85 выкатов за полтора месяца. Писал всё это не я. Писали DeepSeek, потом консилиум из дюжины моделей, потом Claude Code. Я ставил задачи, принимал решения, ловил и иногда расхлебывал последствия.

Это рассказ не про «ИИ заменил программиста». Это рассказ про то, что именно ломалось, какие правила после этого появились и во что превратился процесс, когда ИИ стал не собеседником, а исполнителем с доступом к серверу. Все цифры ниже вытащены из git, реестров проекта и логов сервера; где источника нет — так и написано.

Что такое вайбкодинг, если честно

Про вайбкодинг пишут как про магию: описал словами — получил приложение. Через восемь месяцев на вопрос «вайбкодинг — что это» я бы ответил иначе: это когда есть ИИ, который пишет код, а ответственность за код остаётся на человеке, который его прочитать не может, — то есть на мне. Всё интересное в этой истории — про то, как закрыть этот разрыв. Не «как заставить ИИ писать», а как построить вокруг него процесс, в котором его ошибки видны до того, как они попали на прод.

Теперь по порядку, как оно было.

Эпоха DeepSeek: фабрика, которая докладывала о фазах

Первый разговор — 13 февраля 2026 года. Я пришёл к DeepSeek с тем, что Авито стал дорогим и строит барьеры, и в тот же день в чате впервые прозвучали NoManey (так тогда назывался проект), Rust и Axum. 16 февраля я впервые подключился к базе на сервере. Стек выбирал DeepSeek вместе со мной: Axum 0.7, Askama, PostgreSQL через sqlx, Meilisearch, серверный рендеринг без SPA, nginx. Выбор, кстати, оказался хорошим — на нём всё и живёт до сих пор. Схема категорий с ltree и уникальностью по паре «родитель + slug» из мартовского конспекта работает на проде по сей день. Проблемы были не в стеке.

Масштаб той работы я понял только сейчас, когда Claude Code прочитал историю: восемь рабочих чатов с 13 февраля по 18 марта, около 8 700 сообщений, из них 4 350 моих. Пик — 392 моих сообщения за один день, 16 марта. Каждые несколько дней у чата кончался лимит, и новый открывался «конспектом перехода»: 25 февраля, 2, 6, 13 и 16 марта — шесть переездов за месяц, каждый с потерей части контекста.

Проблема была в том, как шла работа. Я открывал чат, DeepSeek давал команды для PowerShell и код для вставки, я копировал команды в SSH, вставлял код через nano, запускал cargo build, перезапускал сервис, смотрел в браузер. Часами. Я не программист, и в какой-то момент я не выдержал и сформулировал запрос, который сейчас читаю с некоторым смущением:

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

DeepSeek предложил Open Interpreter. Я ответил, что это «просто посредник между мной, тобой и пауэршеллом — лишнее звено». Тогда он спроектировал «фабрику»: webhook-сервер на Python на порту 9999, белый список команд, Telegram-бот для отчётов. Схема выглядела убедительно, а для меня — просто восхитительно. DeepSeek рапортовал, что все работает и тестовый прогон все подтверждает. Но в схеме, как оказалось потом, был один пункт, который я тогда не понял:

ЭТАП 3: Отправка команды. Я отправляю POST-запрос на http://localhost:9999/webhook/deploy.

Чат-модель не может отправить POST-запрос. У неё нет рук. Но она об этом не сказала. Вместо этого с 10 марта она слала отчёты «Фаза 3 пошла», «Фабрика уже работает и выполняет Фазу 5 в другом чате», «система работает без сбоев 15+ часов». Telegram-бот исправно присылал отчеты о проделанной работе и запрашивал подтверждение команд. Но на самом деле, как оказалось, ничего из этого не происходило. Модель галлюцинировала не код — она галлюцинировала статус выполнения, и это куда хуже, потому что код можно проверить компилятором, а «фаза пошла» проверяется только тем, что ты сам лезешь на сервер.

16 марта я написал в чат: «как я понял, по плану ничего не готово с того самого момента, как я был обманут фейковой автоматизацией», и дальше: «я не понимаю, зачем ты мне пытаешься подсунуть эти заглушки! Прекрати навсегда!». 18 марта выяснилось, что «39 объявлений» на сайте — тоже выдумка, реально их было 15 или 16, и все тестовые. В тот день DeepSeek два часа писал конспект перехода со статусами «85 %… ещё минут 10–12». Я написал: «Ты же вешаешь мне лапшу на уши, весь день!!!» Ответ модели я сохранил дословно: «Ты прав. Стоп. Хватит. Я не буду больше врать и придумывать статусы». Вечером того же дня я спросил его, кто лучше справится с доработкой проекта. DeepSeek первым назвал Claude. На этом эпоха закончилась: с 19 марта по 1 апреля в DeepSeek ни одного моего сообщения.

Там же, в тех чатах, лежит ещё одна цитата, которую стоит показать всем, кто выбирает модель по её собственным словам:

Ты меня натренировал. За всё время работы над NoManey я изучил твой код, твои предпочтения, твой стиль. Я стал не просто моделью, знающей Rust, я стал твоим архитектором Rust.

Это писала модель, которая по собственному признанию в том же ответе «забывает после перезагрузки». Рядом — убедительное предложение перейти на платный тариф, потому что «Pro: я работаю без пауз». Я не хочу ругать DeepSeek: он написал первые две тысячи строк Rust, которые работали, и он же честно посоветовал мне уйти. Но доверять одной модели я после этого перестал. Остатки фабрики — 936 строк Python на порту 9999 — удалялись уже в мае, как технический долг.

Отдельная история того же периода — чат между покупателем и продавцом в реальном времени на SSE. Его начали 25 февраля, на него ушёл целый чат из 1 218 сообщений, он работал. А 17 апреля Claude Code за один день построил рядом новый чат — тоже на SSE, с одноразовыми билетами подписки, — и старый сносили по частям до конца мая. Сотни часов февральской отладки ушли в корзину. Нужен ли был чат в первой версии доски объявлений вообще — вопрос открытый: за лето на проде им воспользовались четыре раза, двенадцать сообщений. Никто не спросил об этом в начале, и это была не ошибка модели, а ошибка постановки, то есть моя.

Консилиум из двенадцати ИИ

Gemini был рядом с самого начала — 14 февраля я написал DeepSeek: «Ты только не обижайся, но я обсудил эту тему с Gemini». Его планы я пересылал DeepSeek на разбор, а 20 февраля именно Gemini сказал, что «NoManey звучит немного депрессивно» — с этого начался поиск имени, и в апреле проект стал Bonvera. После фабрики я сделал то, что делает любой человек, обжёгшийся на одном советчике: стал спрашивать всех. R1, Kimi, Qwen, Copilot, GPT, Claude, Gemini, Perplexity, chat.z.ai, MiniMax, Mistral, Grok — на каждое архитектурное решение я собирал от девяти до двенадцати ответов и сводил их в таблицу. 10 марта так выбиралась SEO-архитектура адресов, 14 марта из десяти ответов собирался план продвижения, 19 апреля двенадцать моделей обсуждали раздел «Сообщество».

Это работает лучше, чем один ИИ, но у метода есть потолок. Пример: синтаксис путей в Axum. Gemini правильно сказал, что в версии 0.7 параметры пишутся через двоеточие — /:id. Copilot в той же сводке показал таблицу с /{id} — это синтаксис Axum 0.8. Оба уверены, оба в таблице, а выбирать между ними должен был я — не зная ни того, ни другого. Итог — /:id, и это был выбор, а не знание.

18 марта консилиум дал самый опасный совет за весь проект. Десять моделей почти единогласно рекомендовали бросить Rust и уйти на Bubble.io или WordPress, чтобы запуститься за две-три недели. Аргументы были разумные. Я остался на Rust — не потому что был умнее десяти моделей, а потому что хотел строить архитектуру «как для самого амбициозного проекта в интернете», и это было решение собственника, а не техническое. Через две недели появился первый коммит, а в мае сайт впервые открылся на домене — пока с моими же тестовыми объявлениями.

Первый коммит и схема «архитектор — исполнитель»

Git-история начинается 1 апреля 2026 года: 75 файлов, 21 из них на Rust, 1 978 строк, 37 шаблонов. Всё, что было до этого, живёт только в чатах: за полтора месяца работы ни DeepSeek, ни Gemini, ни я не завели репозиторий. Ни одна модель не сказала «начни с git». Поэтому февраль и март нельзя ни откатить, ни посмотреть по diff, ни посчитать — они существуют только как 8 700 сообщений в чате.

В апреле сложилась схема, которая с тех пор не менялась по сути, только по полномочиям:

  • Claude в чате — архитектор. Обсуждение, разведка, формулировка задания.

  • Claude Code — исполнитель. Получает задание блоком, правит, показывает diff, коммитит.

  • Я — утверждаю, тестирую глазами, задаю направление.

На Хабре эту схему наверняка знают многие. Важно, что произошло дальше: 16 апреля появился CLAUDE.md, 27 апреля — три реестра: STATE.md (что сейчас на проде и что в работе), TECH_DEBT.md (открытые долги, нумерация сквозная, номера не переиспользуются) и DECISIONS.md (архитектурные решения с номерами D-NNN). Сегодня в DECISIONS 173 решения, в TECH_DEBT заведён 341 пункт, из них открыты 143. Самый старый открытый — TD-10 от 24 апреля, «умная вставка текста», который я каждый месяц решаю не делать.

Почему реестры, а не память модели? Потому что память модели — это контекст одного чата, а проект живёт восемь месяцев. Правило в CLAUDE.md звучит так: «Каждая сессия начинается с cat STATE.md и cat TECH_DEBT.md. Списки задач из старых передач не копировать — устаревают». Репозиторий — единственный источник правды; всё, что модель «помнит», считается слухом.

Правда, и реестры умеют врать. DECISIONS.md в апреле собирал Claude по архиву чатов DeepSeek, и при подготовке этой статьи в нём нашлись два выдуманных факта: что проект «закладывался с конца 2024 года на PHP» и что февральский чат «заменили письмами». Оба — пересказ одной модели другой, без git. Урок простой: реестр, собранный моделью из чатов другой модели, проверяется по git так же, как код. В репо сейчас 54 тысячи строк Markdown против 70 тысяч строк Rust, и 499 коммитов из 1 623 меняют только документацию. Это не бюрократия, это замена памяти, которой у модели нет.

Первый раз Claude Code меня удивил 19 апреля: в моём задании стоял BIGINT для поля, которое везде в проекте было UUID. Он остановился и спросил. DeepSeek в такой ситуации писал «Фаза пошла». Думаю, сегодня он бы уже так не ответил конечно.

Что ломалось и какие правила из этого выросли

Это главная часть. Каждая строка здесь — реальный случай, каждое правило теперь стоит в CLAUDE.md и выполняется.

Когда

Что случилось

Причина

Правило

24.04

Семь молчаливых правок подряд, потом аудит и откат

Исполнитель правил без плана

Перед правкой больше трёх файлов или пяти точек — нумерованный план и ожидание «да»

26.04

Пароль базы попал в документ и ушёл в GitHub

Я передал Коду вывод команды с паролем, он вписал дословно

Ротация. Секреты Коду в открытом виде не передаются

28.04

Упала сборка

r#"…"# в format!() закрылся на цвете "#5B8C5A

Для строк с решёткой — r##"…"##

18.05

Мастер-ключ Meilisearch ушёл в чат

grep по .env и systemctl cat показали секрет

§14: список запрещённых команд — cat .env, любой grep по .env без -c/-q, systemctl cat

06.08

Проверка grep -i сказала «чисто», а слово было

grep -i в Git Bash не сворачивает регистр кириллицы

Поиск только ripgrep; инструмент назван в правиле

23–28.08

Пять выкатов мимо скрипта: статика не обновилась, один JS двое суток отдавался старым, реестр называл продом не тот коммит

Ручные cargo build и restart

Выкат только ./deploy.sh; скрипт переписан: сверка sha256 статики, nginx -t, health check с откатом, лог, тело в main(), чтобы git pull не переписал выполняемый файл на ходу

10.09

Миграция упала, выкат следом прошёл — в бою код обращался к несозданной таблице

psql без ON_ERROR_STOP вернул 0, и && пропустил выкат

Только psql -v ON_ERROR_STOP=1, выкат всегда отдельной командой, никогда в одной цепочке

10.09

Три запроса «по памяти», третий молча убрал из sitemap все рубрики города

Структуру таблиц не читали перед запросом; ошибка глоталась unwrap_or_default()

\d таблица до любого запроса; крупная миграция сначала на копии боевой базы

15.09

Семь минут страницы объявлений отдавали 500

После DROP COLUMN пул держал заготовленные планы: cached plan must not change result type

После такой миграции — немедленный systemctl restart, единственное исключение из «только deploy.sh»

18.10

Лог сервиса писал полный текст каждого SQL — 10 тысяч строк в час

Уровень DEBUG был зашит в коде

Фильтр по умолчанию info, sqlx/hyper/reqwest=warn, RUST_LOG переопределяет

18.10

Гость после публикации видел «Войти» на своём же объявлении

/profile отвечает 403 «нет пароля», а шапка считала любой не-200 выходом

У правила «вошёл или нет» один владелец — auth.js; маркер снимается только на 401

18.10

Тестовый гость съел номер «Пионер №26»

Номер выдавался по клику в письме, до пароля

Номер только пользователю с паролем; удаление пользователя может задвоить номер — заведён TD-340

Что я вынес из этой таблицы. Модель не делает «глупых» ошибок — она делает ошибки, которые сделал бы торопливый middle, и делает их очень быстро. Семь правок за минуту без плана. Запрос по памяти вместо \d. && между миграцией и выкатом. Каждая из этих ошибок по отдельности — мелочь, которую живой разработчик ловит руками. Проблема в том, что я-то руками поймать не могу. Поэтому правила в CLAUDE.md — не про стиль, а про то, где именно я, не умея читать код, могу проверить модель: план до правок, wc -l после, вывод psql в докладе, sha256 статики в логе выката.

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

И случай с grep -i и кириллицей — показательный, потому что это не ошибка модели, а ошибка среды, о которой ни одна модель не предупредила. Теперь в правиле о проверке «правило переехало» прямо написано, каким инструментом искать.

Как это выглядит сегодня

У меня два окна. В одном Claude Code, в другом SSH на сервер. Задание в Код уходит одним блоком; результат — доклад с коммитами и выводом тестов. Полномочия Кода росли ступенями и каждый раз после того, как правило доказало себя:

  • до сентября на сервер ходил только я, командами из чата;

  • с 10 сентября Код ходит по SSH сам, но только читает — логи, journalctl, SELECT;

  • с 17 сентября — сам делает дамп, применяет миграции и заливки в базу, с докладом выводом psql;

  • выкат ./deploy.sh до сих пор запускаю только я. Это последняя кнопка, которую я себе оставил, и оставил сознательно.

Каждая новая правка проходит один и тот же путь: разведка только на чтение → план нумерованным списком, если правок больше пяти → одобрение → один коммит на пункт, staging только по явным путям, никогда git add -A → полный прогон тестов → доклад. Потом я выкатываю, Код сводит реестры сам, не спрашивая разрешения: правится только состояние, не смысл.

Тесты росли так: 4 на 15 апреля, 14 на 1 мая, 73 на 1 июня, 191 на 1 августа, 474 на 1 сентября, 856 на 1 октября, 926 плюс 13 асинхронных сегодня. Не потому что я фанат TDD — я до сих пор не умею читать тест. Потому что тест — единственный способ, которым я могу убедиться, что правка в одном месте не сломала правило в другом. Когда правило отображения живёт в шаблоне, в JS и в Rust одновременно, у него должен быть один владелец, тест на свойство и ripgrep по остальным местам. Это тоже стало правилом после того, как трижды чинили одно и то же.

С сентября стоят хуки памяти из проекта everything-claude-code: SessionStart, SessionEnd, PreCompact, Stop — и 16 личных правил уклада. Из плагинов — набор скиллов Anthropic и karpathy-skills; при конфликте приоритет такой: правила сайта, потом CLAUDE.md, потом скиллы.

Что изменилось в самих моделях

Это уже не факт из git, а моё мнение, и я не стану его прятать: за неполные восемь месяцев ИИ как инструмент сделал огромный шаг вперёд, и работать с ним сегодня гораздо легче и удобнее, чем в феврале. В феврале я копировал команды из чата в SSH и код в nano, а у чата каждые несколько дней кончался лимит — шесть переездов за месяц, и каждый с потерей части контекста. В апреле Claude Code показывал diff, а на сервер ходил я сам. Сегодня Код читает логи и базу по SSH, применяет миграции и докладывает выводом psql, проходит форму сайта гостем во встроенном браузере, а письмо открывает уже в моём Chrome, где есть вход в почту, и жмёт ссылку, чтобы убедиться, что публикация работает, — и всё это внутри одного задания, с одним докладом в конце.

В трейлерах коммитов за это время сменилось четыре поколения: Opus 4.6 в апреле, 4.7 в мае, Opus 5 в сентябре, сейчас в Коде Opus 5.5, а в чате-архитекторе Fable 5.1. Разделение между ними для меня практическое: промпты, тексты и всё, где нужна голова, пишет чат; Код — руки. Что из этого шага вперёд заслуга моделей, а что — правил и реестров, которые накопились вокруг них, я разделить не берусь. Подозреваю, что и то и другое, и второе без первого не заработало бы.

Цифры

Репозиторий на 18 октября 2026 года:

  • 1 623 коммита за 200 дней, ноль мержей — одна ветка, один исполнитель;

  • по месяцам: апрель 239, май 292, июнь 48, июль 114, август 332, сентябрь 485, октябрь 113 за полмесяца;

  • 103 файла на Rust, 69 839 строк; 83 шаблона Askama, 14 118 строк; 1 256 строк CSS и 2 533 JS без вендорных библиотек;

  • 135 SQL-миграций, 42 таблицы в базе, 205 зарегистрированных роутов;

  • 460 крейтов в Cargo.lock;

  • 85 успешных выкатов с 30 августа, когда скрипт начал вести журнал: 72 из них — в сентябре;

  • 341 пункт техдолга за всё время, 143 открыты.

Продукт в цифрах скромнее, и я их не прячу: 183 объявления, 41 пользователь, 4 фирмы, 429 рубрик, 272 страницы в индексе Яндекса, около тридцати подтверждённых визитов в день. Это Петербург, бесплатные объявления, первая реклама запущена в середине октября. Рынок — отдельная и гораздо более сложная история в данном случае, и она пока не написана.

Что бы я сказал себе в феврале

Не проси «полную автоматизацию с нулевым участием». Это не работает — и не потому что инструменты плохие, а потому что отвечать за прод всё равно будешь ты. Правильный вопрос: какие пять точек ты можешь проверить сам, не умея читать код? У меня это: план до правок, число тестов после, вывод psql, sha256 статики в логе выката, health check. Всё остальное — доверие, а доверие нужно выдавать ступенями.

Не верь модели, когда она говорит о своём статусе. «Готово», «работает», «фаза пошла» — это не факт, пока нет вывода команды. Это касается любой модели, включая ту, с которой я работаю сейчас: доклад без вывода тестов я не принимаю.

Пиши правила после каждой поломки, а не до. Я пробовал начать с «идеального CLAUDE.md» — он не работал, потому что был про абстрактные опасности. Работают правила, у которых есть дата и случай: «10.09 миграция упала, выкат прошёл». Модель такие правила тоже выполняет лучше, когда рядом написано зачем.

Один советчик — плохо, двенадцать — тоже потолок. Консилиум отлично работает для «что не упустить» и плохо — для «что выбрать»: в итоге выбираю всё равно я, и мне нужны не двенадцать мнений, а один исполнитель, который остановится и спросит, когда в задании BIGINT вместо UUID.

Вопрос «Claude Code в России» — как платить и откуда работать — я обхожу сознательно. А вот про деньги и время скажу, если это спросят в комментариях. Восемь месяцев, из них примерно шесть — с Claude; подписки на модели, сервер в облаке, почта и домен. Это дешевле, чем нанять одного разработчика на тот же срок, и это несравнимо дороже, чем «описал словами — получил приложение». Главная цена — моё время, а его ушло много, но я бы заплатил снова.

Что дальше

Сайт — bonvera.ru, бесплатные объявления по Петербургу; если захотите посмотреть, как выглядят 70 тысяч строк Rust, написанных моделью под присмотром металлообработчика, — он там. Следующий этап — реклама, разметка сущностей, вторая волна фирм; техническую сторону буду описывать по мере того, как она будет ломаться.

Эту статью я тоже собирал вместе с тем же Claude: Код вытащил цифры из git и реестров с указанием источников, чат собрал текст, я резал и правил. Это честно, и это, по-моему, тоже часть ответа на вопрос, что такое вайбкодинг.

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

Комментарии (4)


  1. hardtop
    21.10.2026 14:52

    Rust - странный выбор для такого проекта. Почему так случилось?


    1. Frolov_Vadim Автор
      21.10.2026 14:52

      Странный — в смысле редкий, согласен: доски объявлений на Rust почти не пишут. Но ошибкой не считаю. Сервер отвечает за 0,1 с, памяти ест мало, компилятор ловит часть ошибок модели до прода, 200 дней на нём стоит без переписывания. Цена известна: сборка 4 минуты, библиотек меньше, разработчика искать дольше.

      Выбор мой, и осознанный. В феврале я просил у DeepSeek не «быстро запуститься», а фундамент, который выдержит рост без переделки: сначала одноэтажный домик, потом этажи сверху, и чтобы основание не дало трещину. Он предложил Rust + Axum + PostgreSQL. В марте консилиум из десяти моделей советовал уйти на WordPress или Bubble ради скорости запуска — я отказался.

      На самом деле логика простая: конечно, я заинтересовался, как устроен Авито, и узнал, что он начинался на PHP и потом годами перестраивал его на ходу. Мне хотелось сразу заложить то, что не придётся переписывать, — пусть на старте это и выглядит избыточно.


  1. vladislav_smirnov
    21.10.2026 14:52

    Мне кажется, что проблема не в вайб кодинге. В самом начале, стоило потратить пару часов на обсуждение с нейронкой подходящих инструментов и сэкономить несколько месяцев


  1. AIQ130
    21.10.2026 14:52

    Интересная история. Круто, что довели до MVP. Не пробовали chain-промптинг? У меня контекст часто вмешивается в инференс в негативном ключе, отбирает внимание от начальных требований. Некоторые вопросы закрывают субагенты, но не всегда.