Дисциплина bug-hunt: 28 багов и правило «сначала тест»
Месяц быстрой разработки = месяц накопленных багов. Мы не размазывали починку по чуть-чуть, а проводили bug-hunt'ы — целенаправленные охоты, где за один заход вычищается пачка проблем.
За 17–19 июня прошло 3 хунта + 4-й по провайдерам — 28+ багов закрыто и запушено.
Правило, которое делает багфикс надёжным
Главный принцип (из регламента проекта): «Почини баг» = сначала тест, воспроизводящий баг, потом фикс, который его гасит. Не наоборот. Не «фикс + тест, который удачно проходит» — а тест, который падает на текущем коде, и фикс, после которого он зеленеет. Иначе ты не знаешь, чинил ли ты вообще что-то.
Примеры реальных багов из хунтов (по тегам из коммитов):
- B4 —
before=''для существующего пустого файла трактовался как «файла не было» → revert удалял файл. Различили:null= не существовал,''= был пустым. - B8 — один битый серверный скилл ронял загрузку всех скиллов. Изолировали парсинг.
- B5 —
default_modelскилла не применялся, если провайдер того же семейства. Починили sticky-логику. - C3/C4/C5 — коннекторы: github dir-листинг, avito cross-account, wordstat phrases.
- review #1 — валидация
projectPathна границеai:send(security).
Что покрыто сильно, что слабо (без прикрас)
Сильно покрыто чистой логикой: compact-history (6 тестов), with-retry (14), pricing (12), apply-patch. Это места, где баг = деньги или порча данных, и юнит-тест ловит регрессию мгновенно.
Слабо: IPC-хендлеры, agent loop, review flow, multi-chat routing — интеграционные пути, которые трудно тестировать без mock-окружения Electron. Это честно записано в STATUS.md как тех-долг §3, и покрытие растёт по мере хунтов (добавили agent-loop тест-харнес).
Хитрость с «шумом» в тестах
Есть нюанс, который легко принять за регрессию: ~8 sqlite-тестов падают по NODE_MODULE_VERSION 137 vs 143. Это не баг — это better-sqlite3, скомпилированный под Electron (ABI 143), а vitest идёт под Node (ABI 137). Правило: если падений ровно 8 — всё в порядке; если больше — что-то сломал. Когда приложение закрыто и native-байндинг не залочен, прогон зелёный целиком (1171 тест).
Эта мелочь экономит часы: без неё каждый прогон выглядит как «8 регрессий», и ты либо паникуешь, либо перестаёшь смотреть на тесты вообще.
Вывод
Bug-hunt работает, потому что у него есть рамка: пачкой, с тестом-репродьюсером на каждый баг, с чётким критерием «сколько ожидаемого шума». Это не «давай починим что заметим» — это охота с правилами.
→ Дальше: Сага релизов: 9% install error и лимит GitHub API