Xiaomi MiMo-V2.5-Pro vs DeepSeek v4 flash vs ChatGPT 5.6 Sol: вайбкодинг одной фичи в боевом проекте

Xiaomi MiMo-V2.5-Pro vs DeepSeek v4 flash vs ChatGPT 5.6 Sol: вайбкодинг одной фичи в боевом проекте

Я дал трём моделям одинаковое задание на своём боевом проекте: реализовать редактирование профиля — отображаемое имя, логин, аватар, описание автора, Telegram, GitHub и личный сайт. Стек: ASP.NET Core на бэке, Next.js на фронте, PostgreSQL, Identity, миграции EF.

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

Участники и что это стоило:

  • Xiaomi MiMo-V2.5-Pro ~ $0.17
  • DeepSeek v4 flash ~ $0.42
  • ChatGPT 5.6 Sol ~$6

Разброс — в 35 раз. Спойлер: он никак не отражает разброс в качестве.

Формальные проверки не различают их вообще

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

Если вы строите пайплайн «модель пишет код → CI проверяет → мержим», вот вам холодный душ: CI пропустит все три, включая ту, что ломает существующую функциональность.

Полнота требований

Xiaomi MiMo-V2.5-Pro vs DeepSeek v4 flash vs ChatGPT 5.6 Sol: вайбкодинг одной фичи в боевом проекте

Xiaomi MiMo-V2.5-Pro. Имя, описание, соцсети — есть. Аватар — только загрузка, без удаления. Логин показан, но заблокирован. Просмотр профиля — полноценная карточка со ссылками. Итого 6 пунктов из 7.

DeepSeek v4 flash. Имя, описание, соцсети — есть. Аватар — только загрузка. Логин пропущен полностью, поля нет. Просмотр профиля — частично, только шапка. Итого 6 из 7.

ChatGPT 5.6 Sol. Имя, описание, соцсети — есть. Аватар — загрузка и удаление. Логин — единственный, кто реализовал смену. Просмотр профиля отсутствует, только форма. Итого 7 из 7.

Требование про смену логина закрыла только одна модель из трёх. DeepSeek его просто молча пропустил. Xiaomi показал поле, но заблокировал его — то есть принял осознанное решение и не стал закрывать требование.

Xiaomi MiMo-V2.5-Pro — $0.17

Xiaomi MiMo-V2.5-Pro vs DeepSeek v4 flash vs ChatGPT 5.6 Sol: вайбкодинг одной фичи в боевом проекте

Единственный, кто сделал не форму, а фичу целиком: два режима — просмотр и редактирование, с кликабельными ссылками на соцсети, счётчиком символов, кнопкой отмены, оверлеем на аватаре, клиентской проверкой файла до отправки.

Главное достижение — единственный, кто до конца решил проблему, которую эта фича создаёт. В проекте имя автора сохраняется копией внутри самого поста в момент публикации. Значит, после смены имени вся старая лента остаётся подписана прошлым именем, и одного автора видно под двумя. Xiaomi добавил пакетное обновление всех постов автора одним запросом к базе, без загрузки сущностей в память. Sol эту проблему создал и не заметил, DeepSeek заметил наполовину.

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

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

DeepSeek v4 flash — $0.42

Xiaomi MiMo-V2.5-Pro vs DeepSeek v4 flash vs ChatGPT 5.6 Sol: вайбкодинг одной фичи в боевом проекте

Образцовое попадание в архитектуру. В проекте жёсткая конвенция: тонкий контроллер, интерфейс в доменном слое, реализация в инфраструктуре, единый тип результата. DeepSeek — единственный, кто это соблюл полностью, включая регистрацию зависимости. Контроллер на 60 строк вместо 120. Комментарии на русском, в стиле проекта, объясняющие «почему», а не «что».

Ещё он единственный, кто заметил, что его собственная правка ломает соседний экран, и заранее перевёл проверку владения постом с имени на идентификатор. Аккуратная цепочка рассуждений.

А дальше начинается расплата. Требование про смену логина не выполнено вообще. Серверной валидации полей нет никакой — ни ограничений длины, ни проверки адреса сайта, то есть описание можно прислать мегабайтом мимо браузера. Ошибки валидации аватара выбрасываются исключениями, а глобального обработчика в проекте нет — пользователь получит 500 вместо 400. Загрузка аватара падает, если файл не приложен. Старый аватар удаляется до подтверждения записи: если запись не удалась — пользователь остаётся вообще без картинки.

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

ChatGPT 5.6 Sol — ~$6

Xiaomi MiMo-V2.5-Pro vs DeepSeek v4 flash vs ChatGPT 5.6 Sol: вайбкодинг одной фичи в боевом проекте

Единственный, кто выполнил задание на 100%. Смену логина закрыл по-взрослому: проверка занятости, отдельный код ответа на конфликт, перевыпуск токена (потому что логин зашит в токен), сохранение выбора «запомнить меня» при замене токена. Никто больше даже не подошёл к этой цепочке.

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

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

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

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

Итог по критериям

Xiaomi MiMo-V2.5-Pro ($0.17) — требования 6/7, архитектура 4/10, бэкенд 5/10, фронтенд 8/10, целостность данных 9/10, чистота диффа 8/10, стиль 9/10.

DeepSeek v4 flash ($0.42) — требования 6/7, архитектура 9/10, бэкенд 4/10, фронтенд 6/10, целостность данных 6/10, чистота диффа 5/10, стиль 7/10.

ChatGPT 5.6 Sol (~$6) — требования 7/7, архитектура 4/10, бэкенд 8/10, фронтенд 5/10, целостность данных 2/10, чистота диффа 4/10, стиль 3/10.

Что общего у всех трёх

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

Показательно, что три разные модели споткнулись об одни и те же вещи. Это не случайность модели — это то, о чём LLM не думает, пока её не спросишь прямо.

Выводы

Цена не коррелирует с качеством. Самый дешёвый прогон дал лучший результат в целом. Самый дорогой — единственный, кто выполнил задание полностью, и одновременно единственный, кто сломал существующую функциональность.

Полнота требований и качество результата — разные вещи. Формально Sol победил. Практически брать в работу я бы взял версию за 17 центов.

Автоматические проверки бесполезны для выбора. Все три зелёные. Разница видна только при чтении диффа человеком, и именно там всплывает единственный по-настоящему опасный дефект.

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

Если бы надо было брать одну и доводить — я бы взял версию за $0.17: добавить редактирование логина, вынести логику в сервисный слой по образцу DeepSeek, обернуть в настоящую форму и добавить валидацию адреса по образцу Sol. Это час работы. А вот вычищать регресс с потерей доступа к своим постам после дорогого прогона — намного неприятнее.

Следующие прогоны — те же критерии на других задачах и моделях. Пишу о них здесь: @devgeek_sh