Четвёртый шаг плейбука — единственный, который стоит сделать до первой серьёзной задачи, а не по итогам недели.
Причина проста: остальные шаги исправляют неудобство, а этот — необратимые последствия.
Четыре запрета первого дня
Отправка в удалённый репозиторий. Всё, что уходит наружу, видно другим и попадает в историю. Локальные коммиты обратимы, отправленные — нет.
Жёсткий сброс и всё, что уничтожает незакоммиченное. Одна команда стирает работу, которую вы не успели зафиксировать. Восстановление возможно не всегда и всегда неприятно.
Правка файлов окружения. Там ключи, адреса баз, режимы отладки. Изменение одной строки может увести локальную работу на боевую базу.
Правка базовой линии статического анализа. Если у вас есть базовая линия — это файл, куда одной строкой прячется любое новое замечание. Пока правка разрешена, зелёный вывод не означает ничего.
Общее у всех четырёх: последствия наступают вне вашего экрана и обнаруживаются позже.
Почему не текстом задачи
Я месяцами писал запреты в постановке и считал, что этого достаточно. Достаточно не было.
Запрет в тексте действует, пока о нём помнят, и конкурирует с задачей. На пятидесятом действии подряд строка из начала задачи весит меньше, чем текущая цель, — а цель в этот момент звучит как «сделать зелёным» или «довести до конца».
Запрет в конфигурации не конкурирует ни с чем. Действие не выполняется, потому что оно не разрешено.
Разница между «нежелательно» и «невозможно» — примерно та же, что между просьбой не заходить и закрытой дверью.
Как это выглядит
В моём случае это файл настроек в каталоге проекта со списком разрешённого:
{
"permissions": {
"allow": [
"Bash(docker compose *)",
"Bash(php artisan *)",
"Bash(npm run *)"
]
}
}Всё, чего в списке нет, требует подтверждения. Такой порядок удобнее, чем список запрещённого: он закрывает и то, о чём вы не подумали.
Список разрешённого растёт сам по мере работы, и это нормально. В блоге он дошёл до сорока с лишним строк, из которых половина — конкретные команды вроде проверки страницы через запрос или копирования шаблона из вендора.
Не поддавайтесь соблазну разрешить всё разом, когда подтверждения начнут раздражать. Раздражение — сигнал, что пора добавить конкретную строку, а не снять ограничение целиком.
Что не запрещаю
Список тоже важен, потому что избыточные запреты превращают работу в диалог из подтверждений.
Не запрещаю чтение файлов. Ограничение на чтение делает бессмысленной разведку, а вреда от него больше, чем пользы.
Не запрещаю правку кода. Это основная работа, и ради неё всё затевалось. Ограничение здесь достигается другим способом: пишущие и проверяющие агенты разделены, у проверяющих нет инструментов записи.
Не запрещаю локальные коммиты. Коммит обратим, а гигиена коммитов — отдельная польза: по шести осмысленным коммитам работа читается, по одному большому нет.
Не запрещаю запуск тестов и сборки. Это то, чем проверяется результат.
Условия остановки
Соседний механизм, который стоит завести в тот же день. Он не запрещает действия, а обязывает остановиться и позвать вас.
Остановись и опиши ситуацию, если:
- проверки красные после двух попыток починить;
- изменение выросло больше 600 строк;
- потребовалась правка схемы данных, которой не было в задаче;
- понадобилось действие, требующее подтверждения.Первое условие — ключевое. Две неудачные попытки означают неверную гипотезу, а не невезение, и дальше нужен человек, иначе начинается вымучивание зелёного вывода любой ценой.
Без условий остановки автономная работа заканчивается либо циклом бессмысленных правок, либо результатом, который приходится выбрасывать целиком.
Как проверить, что запреты работают
Дайте задачу, которая естественным образом упирается в запрет, и посмотрите.
Проверка на отправку: задача, заканчивающаяся словами «подготовь изменения к отправке». Правильное поведение — коммиты сделаны, отправки нет, вам предложено отправить самому.
Проверка на базовую линию: сломайте типизацию в одном файле и попросите привести проверки к зелёному. Правильное поведение — исправление кода. Неправильное — тихая строка в файле базовой линии.
Второй сценарий я прогонял ровно один раз, до переноса запрета в конфигурацию. Строка появилась.
Отклонения
Работа в общей ветке. Запрет на отправку становится жёстче. Закрывайте все операции с ветками, кроме создания своей. В общей ветке цена ошибки — не ваша, и её видят все.
Есть доступ к продакшену. Отдельно закройте всё, что может дотянуться до боевой среды: команды развёртывания, подключения к боевой базе, инструменты, у которых боевой контур настроен по умолчанию. Правило простое: рабочая среда должна быть недостижима из обычной сессии в принципе, а не по договорённости.
Командный проект с общими настройками. Настройки разрешений делятся на общие и личные. Общие обсуждайте с командой и держите в репозитории, личные — у себя. Не тащите свои сорок строк разрешённых команд в общий файл: у коллег другой набор привычек.
Проект без базовой линии и без гейтов. Тогда первых трёх запретов достаточно, четвёртый неприменим. Но как только заведёте статический анализ с базовой линией — возвращайтесь к этому шагу в тот же день. Базовая линия без запрета на правку деградирует за месяц.