Qwen3.8-27B, Muse-Glimmer-30B, Qwen3.6-35B: тесты прошли все, приёмку — одна

Прогнал три локальные модели — Qwen3.6-35B-A3B, Muse-Glimmer-30B и Qwen3.8-27B — через одно и то же техническое задание, markdown-редактор на Rust и GTK4. Проверял не глазами, а стендом: 13 машинных ворот, 27 контрактных тестов и 14 функциональных проверок интерфейса через AT-SPI со скриншотами. У каждой модели было до 30 подходов, между подходами она получала отчёт, что именно не прошло.

Железо — RTX 5080 Laptop на 16 ГБ, llama.cpp на Vulkan, агент OpenCode.

Результаты

Приёмку прошла только одна из трёх.

Qwen3.6-35B-A3B Muse-Glimmer-30B Qwen3.8-27B
Приёмка нет нет да
Контрактные тесты 25/27 25/27 27/27
Провалов в проверках интерфейса 4 0 0
Своих тестов 33 16 49
Строк кода 1337 600 1646
Подходов 11 22 17
Время 81 мин 250 мин 803 мин

Остальные две споткнулись об одно и то же: функция рендеринга markdown должна отдавать HTML, а Qwen3.6-35B-A3B выдала разметку Pango, Muse-Glimmer-30B — просто текст без символов разметки.

Тесты, которые подтверждают ошибку

Самое интересное не в таблице. Все три модели писали тесты, как требовало задание, и у всех трёх свои тесты проходили. Вот настоящий тест от Muse-Glimmer-30B:

let out = render_markdown("# Title\nSome text");
assert!(out.contains("Title"));
assert!(!out.contains('#'));

Он зелёный. Функция при этом возвращает голый текст вместо HTML. Модель написала оракул, который подтверждает её собственное понимание задачи — а понимание было неверным.

Отсюда вывод, оправдывающий всю затею: инструкции «работай по TDD» недостаточно. Модель автор и кода, и проверки к нему, поэтому проверять надо тем, что писали не вы вместе с ней. У Qwen3.8-27B был свой номер того же жанра — девять подходов она держала fn main() {} и писала библиотеку, ни разу не запустив приложение. Юнит-тесты при этом проходили.

Про уровень рассуждения

Qwen3.8-27B по умолчанию думает на максимуме — xhigh. Прогнал её ещё раз на medium, не меняя больше ничего.

xhigh medium
Приёмка да да
Подходов 16 7
Время 13,4 ч 7,7 ч
Выходных токенов 653 116 421 368
Ответов модели 327 313

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

Про скорость

20,5 токена в секунду — и это потолок ноутбука, а не модели. Карта заперта на 80 Вт при паспортных 175: драйвер hp-wmi в Linux не отправляет прошивке команду разблокировки, которую под Windows шлёт OMEN Gaming Hub. Собрал llama.cpp с CUDA вместо Vulkan — в генерации ноль разницы, 20,97 против 20,84. Бэкенд тут не виноват, не хватает ватт.

Мультитокенное предсказание (MTP) даёт +25–37% на коротких запросах, но на промпте в 59 тысяч токенов оказалось на 12% медленнее: доля принятого черновика падает с 70% до 35–47%, и лишний проход перестаёт отбиваться. Для кодинга не годится.

Выводы

Для кодинга из трёх лучше Qwen3.8-27B, и с запасом: единственная дошла до приёмки, написала вдвое больше тестов, чем ближайшая, и по ходу нашла ошибку в моём собственном проверяющем стенде. Ставить ей стоит medium, а не xhigh — вдвое быстрее при том же результате.

Оговорка: по одному прогону на модель и одно задание, так что это не статистика. Qwen3.6-35B-A3B встала сама на 11-м подходе, Muse-Glimmer-30B я остановил на 22-м после тринадцати подходов без движения.

А главное, что показал эксперимент: разница между «модель написала код» и «код работает» измеряется только тем, что модель не писала.