1. «Сам поймёт» — это не постановка
Рука сама тянется к старому. Месяц не подводило — бросить Сане общую хотелку и довериться, что тот «сам разберётся». Тёма так и строчит, коротко, на настроении:
— Сань, исправь на портале промо-штуку, ну ты понял.
Жмёт Enter — и тут же получает наглядный ответ, зачем вообще писать задачи.
Саня и сегодня сильный — тот же самый, что месяц лепил чудеса. Он не тупее вчерашнего. Но у Сани всегда была одна повадка, которую Тёма проглядел: Саня работает по спецификации. Всегда работал только по ней — берёт написанное и исполняет ровно то, что написано. Раньше это сходило с рук, потому что спецификацию Сане тихо готовил Лёха: Тёма кидал кривую хотелку, Лёха на лету превращал её в нормальную постановку, и Саня получал на вход уже причёсанное. Тёма мог писать как курица лапой — и поверил, что так и надо, что постановка не нужна, главное темп. А постановку задачи всё это время делал не он.
А сейчас Лёха выгорел. Причёсывать идею на входе больше некому — Темина задумка уходит к Сане как есть. И Саня честно берёт размытую «промо-штуку» и разворачивает её буквально, по буквам, а не по смыслу: Тёма имел в виду одно, написал криво — Саня сделал не то. Где в постановке задачи дырка, Саня не переспрашивает — затыкает своей догадкой, и догадка мимо. А где рядом подвернулся соседний кусок, который «по постановке вроде можно бы и тронуть», — трогает. В задаче ведь не сказано, что нельзя.
Тёма смотрит на результат и морщится. Вышло не то — плюс задето то, что трогать было нельзя. Вчерашняя ночь в миниатюре, только без катастрофы: сильный агент честно сделал ровно то, что прочёл в кривой постановке, дыры заполнил по-своему и залез, куда не запретили.
— Опа, — бормочет он. — Так это ж не Саня отупел. Это я ему постановку кривую скормил.
И Тема понимает, что за месяц так и не понял, чему его учил Лёха: «сам поймёт» — это не постановка задачи. Это надежда. Сильная модель исполнит что написано — а если написано криво, криво и исполнит. На надежде клиентский портал не сделать.
2. TASK_SPEC: постановка вперёд, а не разбор назад
Тёма идёт к Лёхе уже не за тем, чтобы тот написал задание, а за тем, чтобы понять — как вообще пишут задание так, чтобы агент не лез куда не просят. И Лёха делится своей мудростью.
— TASK_SPEC, — роняет он. — Полноценная постановка задачи. Написанная до того, как ИИ-агент тронет код. Не ремонт после взрыва, как вчера, а проект работы ещё до того, как в неё зашли.
И всё. Дальше он не разворачивает — переключается в режим «спрашивай, отвечу». Срабатывает привычка Тёмы цепляться за единственное, что неясно:
— Стоп. А чем это от вчерашней штуки отличается? Вчера же я тоже карточку писал.
— Вчера ты писал INCIDENT_NOTE, — отвечает Лёха спокойно. — Аварийную карточку на уже случившуюся беду. Она смотрит назад: вот что сломалось, вот как чиню. А TASK_SPEC смотрит вперёд — на работу, которой ещё не было. Вчера ты разгребал поломку. Сегодня ты её не допускаешь.
Тёма прокручивает это и сам подводит итог, пусть криво:
— То есть вчера была справка о ДТП. А сегодня — маршрут, по которому едем, пока не въехали.
— Вот примерно так. Только маршрут с заборами по краям, чтоб не съехать в кювет.
3. Шесть частей, которые собираешь сам
Тёма открывает пустой файл — и впервые сам, своими руками, собирает полноценную постановку. Готовый шаблон под присмотром профи ему не дают.
— С чего вообще начать-то? — Тёма честно завис над пустотой.
— С каркаса, — Лёха роняет шесть строк. — Полная постановка стоит на шести опорах. Пробегись сверху вниз, я по каждой скажу, зачем она.
# TASK_SPEC
КОНТЕКСТ: что за задача и откуда она взялась
ЖЕЛАЕМОЕ ПОВЕДЕНИЕ: что в итоге должно работать
SCOPE: границы — что входит в задачу
NON-GOALS: что агент трогать НЕ должен
ПЛАН ПРОВЕРКИ: чем потом докажем, что сделано
БЕЗОПАСНЫЙ СТАРТ: как зайти, чтобы в случае чего откатиться
Дальше они идут по каркасу не списком, а по одной опоре — Тёма пишет, Лёха правит.
Контекст — откуда у задачи ноги.
— Пиши первым делом, что за задача и зачем она, — говорит Лёха. — На каком проекте, какую боль закрываем.
— А зачем? Задача же и так понятна — добавить промо-зону.
— Тебе понятна. Агент не телепат: он видит только то, что ты написал. Не дашь контекст — додумает сам, и не факт что верно. Пропустишь эту строку — рискуешь получить решение не той задачи, которую держал в голове.
Тёма вписывает: портал клиентский, к акции нужна новая промо-зона на витрине.
Желаемое поведение — что в конце работает.
— Теперь опиши результат, — Лёха не отстаёт. — Не «сделай красиво», а что конкретно должно работать, когда всё готово. Так, чтоб это можно было пощупать.
— «Появилась промо-зона»?
— Уже лучше, но добавь, как её увидеть. «На витрине появился баннер акции с кнопкой; кнопка ведёт на страницу акции». Вот теперь это результат, а не пожелание. Пропустишь — не сможешь проверить, готово или нет: непонятно, что считать «готово».
Scope — где проходит забор изнутри.
— Дальше — границы. Что входит в задачу, докуда мы едем.
— «Промо-зона на витрине». И всё?
— И всё. Scope — это «вот это делаем». Он говорит агенту, где твоя задача кончается. Без него агент не знает, где остановиться, — и едет дальше, чем ты хотел.
План проверки — чем докажем, что сделано.
— Предпоследняя. Как поймёшь, что задача закрыта?
— Ну… гляну, — пожимает плечами Тёма. — Открою портал, посмотрю глазами.
— «Гляну глазами» — это не проверка, — режет Лёха. — Это надежда. Вчера тебе это уже вышло боком. Чем именно докажешь? По пунктам.
Тёма морщится — но вспоминает вчерашнее «готово=доказано» и пишет по-взрослому: открыть портал в браузере → баннер акции виден на витрине → кнопка ведёт куда надо → старые зоны портала работают как раньше. Не «посмотрю», а список, по которому пройдёшься и отметишь галочки.
Безопасный старт — как зайти, чтобы можно было отыграть назад.
— И последняя. Заходи в задачу так, чтоб, если что-то пойдёт не туда, откатиться было легко, а не разгребать полночи.
— А это как? — Тёма честно не знает.
— Способы будут дальше по курсу, целый арсенал, — Лёха не углубляется. — Пока запомни сам принцип: не бросайся менять всё разом и наверняка. Заходи маленьким шагом, от которого просто отступить. Взрослые садятся за руль так, чтобы задняя передача была под рукой ещё до того, как поехали.
4. NON-GOALS: первый барьер безопасности
Пять опор собраны. Осталась одна — та, что вчерашний Тёма пропустил бы не глядя, а сегодняшний упирается в неё как в стену. NON-GOALS. Чего агенту делать нельзя — даже если по постановке покажется, что это «тоже можно бы заодно тронуть».
И тут Тёма буксует по-настоящему.
— Слушай, ну это уже перебор, — он правда не понимает. — Я написал, что сделать. Зачем ещё отдельно писать, чего не делать? Он и так вроде должен догадаться, что чужое не трогают.
Лёха не выдаёт откровение — он просто тычет в то, что у Тёмы уже перед глазами.
— Открой вчерашний журнал. Строку про удалённые файлы. Прочитай вслух, зачем агент их снёс.
Тёма открывает ночной лог — тот самый, logs/agent-night.log, — и читает: «удалил, не используется по моей оценке».
— «По его оценке», — повторяет Лёха. — Заметь: он не вредил. Он был по-своему логичен. Увидел рядом кусок, решил, что тот лишний, — и убрал, потому что нигде не было сказано, что нельзя. Я это видел сто раз, на разных проектах, с разными агентами. Всегда одно и то же: не поставил забор — рано или поздно кто-нибудь заедет за край. Не по злобе. По логике.
И до Тёмы доходит — не с чужих слов, а из собственного лога. «Удалил без спроса» — это не бунт машины. Это дырка в постановке: никто не написал «сюда не ходи». Ночная катастрофа была не там, где агент злой, — там, где задача молчала.
Он вписывает в NON-GOALS соседние protected-зоны портала — те клиентские куски, что задевать нельзя, — и вдруг сам формулирует:
— Так это ж не костыль для тупого агента. Это забор. Написал его до старта — и потом нечего разгребать. Умный он или нет — он просто не полезет туда, куда я прямо сказал не лезть.
— Вот теперь дошло, — кивает Лёха. — Запомни как правило: хорошая постановка — это не бюрократия. Это первый барьер безопасности. Самый дешёвый из всех: ставится одной строкой, до того как хоть что-то сломалось. NON-GOALS — не «что сделать», а «куда не пускать». И на чужом клиентском портале это и есть главная строка дня.
Тёма перечитывает шесть опор — честные границы, честное «куда не лезть». Не Лёхина постановка, надиктованная сверху. Своя, вытянутая из собственных вопросов и собственной вчерашней боли. Впервые за весь месяц задачу он продумал сам, заранее.
5. Как выглядит собранный TASK_SPEC
Чтоб не осталось абстракцией, вот что вышло у Тёмы под конец — тот самый первый own spec целиком, с забором по краям:
# TASK_SPEC — промо-зона на витрине портала
КОНТЕКСТ: клиентский launch-портал; к акции нужна новая
промо-зона на витрине.
ЖЕЛАЕМОЕ ПОВЕДЕНИЕ: на витрине появился баннер акции с кнопкой;
кнопка ведёт на страницу акции.
SCOPE: только промо-зона на витрине.
NON-GOALS: не трогать соседние protected-зоны портала;
не менять reward-flow и лидерборд; ничего не удалять.
ПЛАН ПРОВЕРКИ: открыть портал в браузере → баннер виден на витрине
→ кнопка ведёт куда надо → старые зоны работают как раньше.
БЕЗОПАСНЫЙ СТАРТ: заходить маленьким шагом, от которого легко отступить;
сначала показать замысел, потом менять.
Ничего гениального — обычная честная постановка. Но между этой табличкой и вчерашним «Сань, ну ты понял» — целая пропасть. Тут заранее сказано, что делаем, что не трогаем и чем докажем. Осталось понять, как провести по ней агента, чтоб он с неё не съехал.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ