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
Щоб не лишилося абстракцією, ось що вийшло в Тьми наприкінці — той самий перший власний spec цілком, із парканом по краях:
# TASK_SPEC — промо-зона на вітрині порталу
КОНТЕКСТ: клієнтський launch-портал; до акції потрібна нова
промо-зона на вітрині.
БАЖАНА ПОВЕДІНКА: на вітрині зʼявився банер акції з кнопкою;
кнопка веде на сторінку акції.
SCOPE: лише промо-зона на вітрині.
NON-GOALS: не чіпати сусідні protected-зони порталу;
не змінювати reward-flow і лідерборд; нічого не видаляти.
ПЛАН ПЕРЕВІРКИ: відкрити портал у браузері → банер видно на вітрині
→ кнопка веде куди треба → старі зони працюють як раніше.
БЕЗПЕЧНИЙ СТАРТ: заходити маленьким кроком, від якого легко відступити;
спочатку показати задум, потім змінювати.
Нічого геніального — звичайна чесна постановка. Але між цією табличкою й учорашнім «Сашку, ну ти зрозумів» — ціла прірва. Тут заздалегідь сказано, що робимо, що не чіпаємо і чим доведемо. Залишилося зрозуміти, як провести по ній агента, щоб він із неї не зʼїхав.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ