1. Одного goal мало
Гарна мета лишає дірки. «Додати поле notes у refund-request» не відповідає: поля немає зовсім чи воно є, але не зберігається? notes лише у формі чи ще й у деталях повернення? потрапляє в подію для інших сервісів? є обхідний шлях? У цих дірках Claude імпровізує — закриває порожнечі здогадками. Чим більше порожнеч, тим сильніше він «лікує проєкт по фотографії»: бачить ідею, не бачить проблему.
Goal задає напрямок, але не розрив між «зараз» і «треба». Розрив описують ще два блоки:
Goal — «Куди хочемо прийти?»
Current behavior — «Що відбувається зараз?»
Desired behavior — «Як має виглядати правильний стан?»
Три частини поруч — і задача перестає бути побажанням.
2. Current behavior: фіксуємо реальність
Задача блоку одна: описати, що спостерігається зараз, без здогадок про причину. Спершу факти, потім версії. Інакше в spec поїде ваша інтерпретація, а Claude схопиться за неї.
Для бага сюди входять симптом, кроки відтворення, фактичний результат, іноді оточення, логи, вплив на користувача. Для фічі — поточне обмеження, обхідний шлях і бізнес-проблема. Current behavior — не тільки для багфіксів.
Одні й ті самі елементи в задачах двох типів:
| Що фіксуємо | Якщо це bugfix | Якщо це feature |
|---|---|---|
| Точка входу | Де відтворюється помилка | Де користувач упирається в обмеження |
| Поточна дія | Які кроки виконують | Що користувач робить зараз |
| Actual result | Що реально сталося | Чого зараз у системі немає |
| Workaround | Як обходять проблему | Як команда живе без потрібної можливості |
| Impact | Чим заважає баг | Чому відсутність функції створює проблему |
Крихітний bugfix:
## Поточна поведінка
1. Відкрити `/login`
2. Ввести коректний email і неправильний пароль
3. Натиснути кнопку «Увійти»
Фактичний результат: екран стає порожнім, повідомлення про помилку немає.
Спостерігається у: локальному запуску та staging.
Ні «зламалася backend-валидація», ні «React десь падає». Поки не доведено — це не факт, а версія.
Для фічі логіка та сама: не рішення, а поточний стан — чого немає, як обходяться, чому незручно.
3. Desired behavior: спостережуваний результат
Друга сторона розриву. Пастка — абстракції «має працювати нормально», «зробити зручно»: Claude не знає, де у вас «нормально». Гарний desired такий, що після реалізації проходиш очима по пунктах: так, є; ні, немає.
Описуйте результат зі сторони користувача, інтерфейсу, API, даних, граничних випадків — без технічного рішення. «Використати таку-то бібліотеку» — це шлях реалізації; desired відповідає на «що стане істинним після зміни».
| Слабке формулювання | Чому слабке | Сильне формулювання |
|---|---|---|
| «Додати зручні нотатки» | Незрозуміло, що вважається зручністю | «Оператор може ввести нотатку під час створення refund-request і побачити її в деталях повернення» |
| «Полагодити відображення помилки» | Незрозуміло, де і як вона має виглядати | «За неправильного пароля форма лишається на сторінці логіну та показує текст помилки під полем пароля» |
| «Покращити збереження даних» | Немає спостережуваного результату | «Після надсилання форми значення notes зберігається в записі повернення і доступне під час повторного відкриття деталей» |
Гарний desired буває коротким, але точним:
## Бажана поведінка
Після неправильного пароля сторінка не стає порожньою.
Користувач залишається на `/login` і бачить зрозуміле повідомлення про помилку.
Успішний логін продовжує працювати без змін.
Останній рядок — про те, що не має випадково зламатися. Ще не розділ про межі задачі, а нагадування про наявну коректну поведінку.
Для фіч desired не дає Claude обмежитися половиною. Не напишете, що поле має і зберігатися, і відображатися, і потрапляти в подію — зробить одну частину і вирішить, що молодець.
4. Hypothesis vs evidence: здогадка і факт
Мозок миттєво підсовує пояснення: «мабуть, валідація», «скоріше за все, міграція», «подію не оновили». Без гіпотез інженерії немає. Біда — коли гіпотеза потрапляє в spec як факт.
Різниця між «спостерігаємо X» і «причина в Y» для Claude критична. Запишете припущення в current behavior без маркування — агент прийме його за дані й почне лагодити цю ділянку. Так народжується random patching: причина не перевірена, код уже правлять.
Evidence — те, що спостерігаємо і можемо показати.
Hypothesis — те, як пояснюємо спостережуване.
Орієнтир за формулюваннями:
| Формулювання | Що це? | Як із ним поводитися |
|---|---|---|
| «Після submit екран порожній» | Evidence | Можна писати прямо в current behavior |
| «У логах є NullPointerException у AuthController» | Evidence | Можна писати прямо в current behavior |
| «Схоже, ламається backend validation» | Hypothesis | Позначити явно і попросити перевірити |
| «Мабуть, у таблиці вже є колонка notes» | Hypothesis | Не вважати фактом до перевірки схеми |
Робоча форма запису:
Гіпотеза: проблема може бути в backend-валидації.
Спершу перевір, перш ніж редагувати.
Приписка робить дві речі: зберігає думку і не перетворює її на команду «йди прав backend». Claude отримує сигнал: версія є, спочатку підтвердь.
Процес:
flowchart TD
A[Спостереження] --> B[Гіпотеза]
B --> C{Є перевірка?}
C -- Ні --> D[Не редагуємо код так, ніби причина вже доведена]
C -- Так --> E[Отримуємо evidence]
E --> F[Тільки потім змінюємо код]
Маленька схема, а економить час — особливо там, де хочеться «одразу почати виправляти».
5. Commerce OS: F-03, current і desired
Переносимо все у наскрізний проєкт курсу. Задача з Commerce OS: F-03: Add notes field to refund-request. Фіча, не багфікс — і на ній видно, що current behavior потрібен не тільки для помилок.
Робочий фрагмент TASK_SPEC.md draft, який уже можна давати Claude:
## Поточна поведінка
Оператор створює refund-request з `admin/orders/{id}`.
Немає поля, щоб додати контекстну нотатку, наприклад:
«клієнт подзвонив, узгодили часткове повернення».
Зараз нотатка зберігається в окремому коментарі до сапорт-тикета
і не пов’язана із записом повернення.
У підсумку фінансові ревізори не бачать логіку оператора
під час подальшого аудиту повернень.
Гіпотеза: колонка `notes` може вже існувати в таблиці `refunds`
зі старої міграції. Спершу перевір поточну схему, перш ніж редагувати.
Мова фактів: не «сервіс погано спроєктований», а спостережуване — поля немає, нотатка їде в коментар, зв’язок губиться. Гіпотеза про колонку позначена і не видається за факт.
Цільовий стан:
## Бажана поведінка
- форма refund-request у `admin/orders/{id}` містить необов’язкове поле `notes`
(textarea, до 1000 символів);
- під час надсилання форми `notes` зберігається разом із записом повернення;
- у картці повернення нотатка відображається в окремій секції;
- payload події `refund.created` містить поле `notes`;
- наявні повернення без нотатки рендеряться коректно, без помилок.
Не розмите «додати нотатки», а п’ять перевірюваних тверджень — кожне закриває свій шматок: введення, збереження, відображення, подію для інтеграцій, зворотну сумісність.
Після цих двох блоків Claude бачить увесь розрив, а не один рядок на фронтенді, і не фантазує про причину без перевірки схеми. Приклад сам підводить до потрібних запитань: де живе форма, як зберігається запис, чи є колонка в БД, хто формує refund.created, як рендеряться старі записи. Не «вгадати фікс», а зрозуміти систему за фактами.
6. Спершу перевірка, потім правки
Блоки описані — не просіть Claude «одразу зробити фічу». Нехай спершу прочитає їх як інженерний вхід. Не задасте ритм — він кинеться правити код раніше, ніж підтвердить версії.
Працює коротка інструкція «спершу розберись із фактами»:
Прочитай блоки `Current behavior`, `Desired behavior` і `Hypothesis`.
Спочатку переліч:
1. які твердження вже підтверджені фактами;
2. які потрібно перевірити в коді або схемі;
3. які файли та сутності, ймовірно, пов’язані із задачею.
Код поки не змінюй.
Щоб акуратніше відділити факти від здогадок, тримайте в чорновику TASK_SPEC.md шаблон:
## Поточна поведінка
...
## Бажана поведінка
...
## Гіпотези для перевірки
- ...
- ...
## Відомі докази
- ...
- ...
Не переплутайте рівні. Current behavior і Desired behavior — стійкі частини spec. Hypotheses to verify і Known evidence — тимчасові нотатки: тримайте до правок, після перевірки стисніть або приберіть. Навіть короткий Known evidence привчає питати: «це я спостерігав чи красиво здогадуюся?»
У підсумку Claude отримує не туманне прохання, а інженерний вхід: що є, що має стати, що припускаємо, але не довели. Від цього місця він менше ворожка з клавіатурою і більше помічник, який спершу читає факти, потім торкається коду.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ