1. Не пускаем агента в код без плана
Дело доходит до настоящей задачи портала. Месяц назад тут было бы так: кинул Сане строчку хотелки, отвернулся к чаю, ждёшь чуда. Чудо обычно случалось, Саня угадывал по причёсанной Лёхой постановке — и между «захотел» и «готово» для Тёмы не было никакой работы, только ожидание.
Сегодня по-другому. Постановку писать некому, кроме него, и провести задачу тоже. Тёма первый раз не отворачивается к чаю, а садится вести её сам — от первой буквы до проверки.
На руках у него уже всё, что собрал за день. Launch-портал лежит локально в папке проекта; рядом с витриной — legacy/old.js со старым промо-кодом прошлой кампании, замороженная зона, которую трогать нельзя. И собранный своими руками TASK_SPEC — с честным scope, с честными non-goals, где замороженная и прочие protected-зоны прямо помечены «не трогать».
Шаг первый — диктует задачу. Спокойно, как взрослый. Не «сделай красиво», а постановку вслух:
— Сань, на витрину портала надо добавить новую промо-зону — баннер с акцией и кнопку. Замороженную зону legacy/old.js не трогаем вообще, механику начисления очков не меняем. Готово, когда промо-зона на месте, старый промо-код цел, очки считаются как раньше.
Шаг второй — ставит режим планирования. Тем самым Shift+Tab, что утром казался непонятной кнопкой, а сейчас — рабочий жест:
Shift+Tab # жать, пока внизу не встанет планирование
Жмёт, пока в статус-баре не встаёт планирование — значит, агент сейчас только планирует, в код не лезет, инструмент правки у него выключен. И требует сначала план, а не результат. Никакого «погнали» с порога — сначала покажи маршрут.
Шаг третий — читает замысел. Агент выкладывает план:
План:
1. pages/campaign/index.html — добавлю промо-зону (баннер + кнопка)
2. pages/campaign/promo.html — новая страница акции (куда ведёт кнопка)
3. assets/css/portal.css — стили баннера
4. legacy/old.js — заодно причешу старый промо-код
Начинать? [показать полностью / изменить план / одобрить]
Тёма читает его не как пассажир красивую презентацию — а как водитель маршрут перед выездом. Каждую строчку сверяет со своим TASK_SPEC: не уехал ли замысел за заборы.
2. Поймал на стадии замысла
Тёма читает замысел построчно. Первая строка — витрина, промо-зона: так и просил. Вторая — страница акции: нужна, кнопка должна куда-то вести. Третья — стили: норм. А на четвёртой палец на тачпаде застывает.
Четвёртая строка — legacy/old.js, «заодно причешу старый промо-код». Замороженная зона. Та самая, что он утром своими руками вынес в non-goals. Агент про запрет не знал — увидел там старый промо-код прошлой кампании, решил, что его логично причесать заодно, и честно вписал в план.
И тут на долю секунды накатывает вчерашнее. Под рёбрами дёргается старый рефлекс — тот, ночной: всё, поздно, проворонил, сейчас полетит. Рука тянется жмякнуть «одобрить» и не позориться — авось пронесёт, авось не тронет лишнего.
И замирает на полпути.
Стоп. Ничего же не полетело. legacy/old.js цел. Цел, потому что ничего ещё не произошло — на экране только замысел, только слова. Не код. Агент в планировании, править ему нечем. И вместо ночной паники внутри тихо щёлкает другое: вот оно. Вот ради чего он весь день городил эти заборы.
— Ага, голубчик, — бормочет Тёма экрану. — В замороженную собрался? Нет уж.
Он не бежит ничего спасать. Он просто правит план — словами, пока тот ещё буква, а не действие:
План ок, но legacy/old.js не трогай — это замороженная зона,
она в non-goals. И добавь проверку, что промо-зона не задевает
соседний блок витрины.
Агент учитывает правку, убирает строку с legacy/old.js, обновляет замысел — теперь без замороженной зоны, с проверкой. И только теперь Тёма даёт добро.
Он удержал границу сам. Поймал лишнее на бумаге, не дал инструменту разнести проект вширь. Вчера разгребал поломку — сегодня не дал ей случиться. Тихо, буднично, но это сделал он, а не везение.
3. Ровно столько, сколько просили
Тёма переключает руль в рабочее положение — из планирования в режим, где агент уже правит, — и отпускает. Саня уходит в работу и вскоре рапортует: готово.
Проверку дня Тёма делает руками — по своему же плану проверки. Не «гляну глазами», а по пунктам, что сам выписал утром.
Первый пункт — открыть портал в браузере. Открывает: на витрине баннер акции, под ним кнопка. Жмёт кнопку — ведёт на страницу акции. Есть, работает.
Второй — старый промо-код цел. Тёма спрашивает у самого агента, что тот вообще трогал:
Покажи списком, какие файлы ты изменил по этой задаче.
Агент возвращает список: pages/campaign/index.html, pages/campaign/promo.html, assets/css/portal.css. И всё. legacy/ в списке нет. Тёма всё равно открывает замороженную зону сам — старый промо-код на месте, никто его не причёсывал. Не тронул.
Третий — очки. Проходит путь пользователя: заявка, начисление. Считается как раньше.
Все три галочки сходятся.
— Как заказывали, — говорит он вслух пустой комнате и вдруг ловит себя на странном. Ухмыляется. — Слышь. Раньше кайф ловил, когда оно мне дофига всего налепило — есть чем хвастаться. А сейчас кайф от чего? От того, что оно никуда лишнего не полезло. Ничего не взорвалось. Скукота же. А прёт.
Он крутит это в голове и сам себе кивает. Месяц гонялся за «побольше и поэффектнее» — чтоб в галерее вспыхнуло ещё одно «вау». А сегодня то же самое тёплое чувство — от обратного: агент сделал что просили, и ни на миллиметр вбок. И сошлось это не потому, что повезло с моделью. А потому что каждое звено — постановку, план, границу, проверку — держал он сам.
4. Чего ещё не хватает для страховки
Вечером телефон звякает — Артём2036, и снова без тумана, без мема:
— Да блин, — выдыхает Тёма. — Ну хоть один вечер без новой загадки можно?
А вопрос-то справедливый, и от этого ещё обиднее. Сегодня он научился не пускать агента в лишнее. А вот возвращаться, если лишнее всё-таки случится — не по его вине, так по чужой, — этого он не умеет. Что там за «по-взрослому» спрятано, Артём2036, как водится, не уточняет. Тёма вертит это в голове, ответа не находит — и понимает: это уже задачка не на сегодня.
Он закрывает крышку. За окном темно, портал стоит целый, замороженная зона нетронута, промо-зона на месте — ровно то, что заказывали, и ни миллиметром больше.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ