Модуль 2 · Строим · урок 6 из 13
Итерации: маленькие шаги и частые коммиты
Агент пишет код быстрее, чем вы его читаете. Если дать ему большую задачу, получите дифф на тысячу строк, который невозможно проверить, и откатить его можно только целиком. Короткие шаги с коммитом после каждого делают работу проверяемой и обратимой. Разберём на третьем срезе «Переговорок» — входе по корпоративной почте.
Какого размера шаг
Хороший шаг — одна мысль, которую можно проверить за один проход: один коммит, одно изменение поведения, дифф, который вы готовы прочитать целиком. Если описание шага не помещается в одно предложение без «и ещё», он слишком большой.
Срез «вход по почте» в спецификации звучит просто. В коде это шесть шагов:
- Модель
User(почта, роль), сид с двумя учебными пользователями. POST /api/auth/request-link: принимает почту корпоративного домена, создаёт одноразовый токен (в базе — только его хэш, срок жизни 15 минут), отправляет письмо со ссылкой. Локально письмо видно в Mailpit.GET /api/auth/verify: проверяет токен, гасит его, создаёт сессию, ставит cookie.- Проверка сессии для всех маршрутов
/api, замена всехTODO(auth)на реального пользователя. - Выход: удаление сессии.
- Экран входа и обработка истёкшей ссылки.
Попросите агента составить такую разбивку сам, в режиме планирования, и запишите её подпунктами в docs/PLAN.md. Тогда новая сессия завтра начнётся с чтения плана, а не с ваших воспоминаний.
Цикл одного шага
Шаг 3.2 из docs/PLAN.md: POST /api/auth/request-link.
Токен: 32 случайных байта (crypto.randomBytes), в базе — SHA-256 хэш,
expiresAt = now + 15 минут. Почта только домена из CORPORATE_DOMAIN.
Ответ всегда 202 и одинаковый текст — не раскрываем, есть ли такой сотрудник.
Письмо через nodemailer на SMTP из окружения (локально Mailpit).
Только этот шаг. Готово, когда: npm run check зелёный, есть тест
на чужой домен и на то, что сырой токен не попадает в базу.Дальше всегда одинаково:
- Агент работает. Если видите, что он ушёл не туда, не ждите конца: в CLI Enter во время работы добавляет указание в текущий ход, а Tab ставит сообщение в очередь на следующий.
- Проверка:
npm run checkагент прогонит сам, но для шагов с поведением нажмите сами — откройте Mailpit наlocalhost:8025и посмотрите письмо. - Дифф:
/diff. Для кода входа читайте всё — это одно из мест, где курс требует чтения построчно. - Коммит.
git add -A
git commit -m "auth: запрос ссылки для входа (PLAN 3.2)"Каталог .git в песочнице Codex защищён от записи даже в режиме workspace-write, поэтому агент попросит одобрения на коммит. Многие предпочитают коммитить сами: коммит — момент, когда вы подтверждаете, что прочитали дифф.
Когда шаг не получился
Не чините плохой результат пятью поправками подряд. Каждая неудачная попытка остаётся в контексте и тянет следующие ответы в ту же сторону. Варианты по возрастанию решительности:
- Поправить постановку. Двойной Esc на пустом поле ввода открывает редактирование предыдущего сообщения — можно переформулировать задачу и ответвиться от этой точки.
- Откатить код.
git restore .иgit clean -fd(сначала посмотрите список черезgit clean -n) возвращают рабочее дерево к последнему коммиту. Именно поэтому коммиты частые: откат стоит одного шага, а не дня. - Начать заново. Новый чат (
/new) с промптом, в который вы добавили то, что поняли из неудачи. Документация Codex прямо называет антипаттерном один чат на весь проект — один чат должен соответствовать одной единице работы.
Если сессия просто разрослась, а шаг идёт нормально, хватит /compact. Подробнее о сессиях — в уроке «Сессии», об откатах — в уроке «Git как страховка».
Длинные автономные циклы
Противоположность коротким шагам — цикл, в котором агент работает без вас часами. Джеффри Хантли описал крайнюю форму под названием Ralph: один и тот же промпт подаётся агенту снова и снова, каждая итерация берёт одну задачу из приоритизированного списка, а тесты, типы и статический анализ отвергают плохой результат. На Codex это выглядело бы так:
while :; do cat PROMPT.md | codex exec --sandbox workspace-write - ; doneСам автор говорит, что подход годится для новых проектов с ожиданием «готово примерно на 90%», а для существующих кодовых баз его не рекомендует. Он работает, только если обратная связь сильная: без хорошего набора тестов цикл уверенно накапливает заглушки и сломанную сборку. Мягкий вариант в интерактивном Codex — режим цели /goal, где агент держит долгосрочную задачу.
Для «Переговорок» честный вывод такой: длинный цикл уместен для рутины с жёсткой проверкой («доведи покрытие сервиса броней до всех правил R1–R5»), но не для входа и прав доступа.
Ритм дня
Практичный ритм для вайбкод-проекта: утром новая сессия читает docs/PLAN.md и берёт следующий шаг; после каждого шага — коммит; в конце дня агент записывает в план, что сделано и что осталось. Через неделю у вас история из небольших коммитов, по которой легко найти, где появилась ошибка (git bisect на такой истории работает быстро и точно).
Попробуйте сами
10–15 мин на рабочем месте- Возьмите следующий срез своего проекта и попросите Codex разбить его на шаги, каждый из которых описывается одним предложением. Запишите шаги в
docs/PLAN.md. - Пройдите два шага полным циклом: промпт, проверка,
/diff, коммит. Засеките, сколько времени уходит на чтение диффа. - Намеренно отклоните один результат: откатите
git restore ., поправьте промпт через двойной Esc и сравните вторую попытку с первой.
Коротко
- Шаг — одна мысль, один коммит, дифф, который вы прочитаете целиком.
- Разбивку среза на шаги храните в
docs/PLAN.md, а не в чате. - Цикл: промпт — проверка — дифф — коммит.
- Не чините плохой результат серией поправок: откат и новый промпт дешевле.
- Длинные автономные циклы требуют сильной автоматической проверки и не подходят для критичного кода.