Кнопка-звёздочка у поля коммита обещает избавить от скучного: она сама напишет сообщение по вашим изменениям. Соблазн - принять сгенерированное не глядя и коммитить: экономит секунды, выглядит аккуратно. Но commit message - это не украшение, а запись намерения для того, кто будет читать историю через год, и автопилот здесь незаметно портит именно её.
Механику стоит понять до нажатия. Сначала вы стейджите изменения в git-панели, потом жмёте sparkle у поля сообщения; функция анализирует staged diff и предлагает текст, который нужно прочитать и отредактировать до коммита. Она доступна всем платным пользователям без лимитов и даёт лучший результат на небольших сфокусированных коммитах. Ключевое слово - предлагает: последнее слово и здесь за человеком.
Хорошее сообщение объясняет намерение, а не перечисляет файлы. "Обновил три файла в auth" - это то, что и так видно в diff; ценно другое - зачем менялось и что теперь верно: "исправил проверку срока действия токена, из-за которой валидные сессии отклонялись". Сгенерированный текст сам по себе тяготеет к описанию изменений; работа человека - поднять его от того, что тронуто, к тому, что и почему сделано.
Отсюда приём, который начинается раньше кнопки, - на стадии stage. Индексируйте только связанные изменения: один коммит - одно намерение. Механический форматинг, изменение поведения и миграцию схемы разводите по разным коммитам, а не сваливайте в один. Тогда и сгенерированное сообщение получается точным, потому что описывать надо одну связную вещь, а не мешанину.
У генерации есть неожиданно полезная роль - она работает как проба на ширину коммита. Если модель не может кратко и внятно описать staged diff и выдаёт общее "различные улучшения", это не её слабость, а сигнал: коммит слишком широк и смешивает несколько намерений. Расплывчатое авто-сообщение - повод не подредактировать текст, а пересобрать сам stage на более узкие части.
Отдельно - о приватности, и здесь важна точность формулировки. Документация утверждает дословно, что ваш код и commit messages остаются приватными: их не сохраняют и не используют для обучения моделей. Это сильное и конкретное обещание - но оно дано именно для функции AI commit messages. Распространять его автоматически на всех агентов, на облако и тем более на сторонние ACP - ошибка чтения.
Почему границу обещания надо держать жёстко. Разные поверхности Devin - разные политики данных, а сторонние ACP-агенты и вовсе работают по условиям своего провайдера, где приватность и обучение регулируются иначе. Обещание, данное для одной узкой функции, не переносится на другую среду просто потому, что бренд один. Кто судит о приватности по строке из одной страницы, легко ошибётся о границах данных в другой.
Цена автопилота двоякая. Приняли сгенерированное сообщение не глядя - и история проекта наполняется строками, которые перечисляют файлы, но не объясняют решений; через полгода такой лог не помогает понять, почему код стал таким. Перенесли обещание приватности на все среды - и отправили чувствительный код туда, где эта гарантия не действует. Первая беда медленная, вторая - разовая и дорогая.
Проверять результат стоит двумя разными вопросами. Первый - к тексту: объясняет ли сообщение намерение так, что коллега поймёт причину правки, не открывая diff? Если нет, дописать руками. Второй - к охвату: соответствует ли staged diff одному намерению, которое сообщение и описывает? Если модель заговорила общими словами, сузить stage. А утверждение о приватности сверять не с памятью об этой главе, а с актуальной страницей той функции или среды, о которой идёт речь.
Полезно помнить, зачем сообщение вообще пишут отдельно от diff. Diff показывает, что изменилось построчно; сообщение хранит то, чего в строках нет, - причину, контекст решения, связь с задачей или багом. Это два разных слоя памяти проекта, и они должны согласовываться: если сообщение обещает одно, а diff делает другое, доверие теряют оба. Поэтому редактируют не ради красоты формулировки, а чтобы запись намерения не расходилась с записью изменений. Хорошая привычка - держать заголовок коротким и по существу, а подробности и причину выносить в тело сообщения, где им есть место.
Типичные провалы предсказуемы. Приняли авто-сообщение как есть - и в истории осталось "misc changes" вместо причины. Смешали в одном коммите форматинг, поведение и миграцию - и ни человек, ни модель не описали его кратко. Решили, что всё приватно, раз так написано, - и распространили обещание одной функции на облако и ACP. Признак общий: и текст, и охват, и границу приватности приняли на автопилоте. Прочитать, сузить и сверить источник - и коммит снова говорит правду.