1. Інженерної чернетки вже недостатньо
На старті інженерна чернетка специфікації справді працює чудово: вона зводить вас і Claude Code до спільного завдання — що робимо, де межі, чого не чіпаємо, як перевіримо. Але в такого документа є слабке місце: він написаний зсередини вашої голови, а reviewer читає його ззовні. І якщо документ зрозумілий лише тому, хто місяць живе проєктом, значить, він досі сирий.
Інженерний draft зазвичай відповідає на питання «що робимо технічно». А версія для reviewerʼа має відповідати на більш неприємні, але дуже корисні питання: кому це допомагає, який шматок реально працює, що я побачу на demo, як перевірити руками, чого ви не обіцяєте. Reviewer не зобов’язаний бути телепатом, навіть якщо ви дуже на це розраховуєте.
Тому тут не відбувається магії й не народжується нова сутність: я не викидаю попередній SPEC.md і не пишу роман з нуля — роблю другий прохід і виводжу з інженерної чернетки текст, який витримає холодний погляд збоку. А холодний погляд, до речі, лікує розповзання scope та фрази на кшталт «ну тут усе приблизно зрозуміло».
2. SPEC.md і MVP_SPEC.md: одне сімейство
У цьому місці багато хто починає плутатися в назвах файлів і влаштовувати маленький локальний серіал під назвою SPEC_final_final_real.md. Краще не треба. Логіка проста: у вас одне сімейство документів на проєкт. Для чистого MVP-архетипу зручно MVP_SPEC.md; для capstone, де SPEC.md уже заведено, — посилюйте його, а не плодіть близнюка.
Найважливіше правило тут — один source of truth. Якщо ви ведете обидва файли, а потім в одному user один, в іншому інший, а demo-сценарій узагалі третій, ви не створюєте гнучкість. Ви створюєте красиву багатосерійну плутанину.
| Ситуація | Що робити |
|---|---|
| Розбираєте чистий MVP-архетип | Можна вести MVP_SPEC.md |
| Робите capstone у MVP-форматі | Посилювати вже наявний SPEC.md або тримати один MVP_SPEC.md, але не обидва одразу |
| Робите capstone не в MVP-форматі | Залишити SPEC.md, але додати до нього користувацькі розділи: цінність, demo-сценарій, обмеження |
Корисно також не змішувати ролі документів. Специфікація відповідає за задум, межі та перевірку, а EVIDENCE_LOG.md — за сліди виконання: що пробували, запускали, що зламалося, що перевірили. Якщо evidence-лог уже заведений під близькою назвою — використовуйте його. Якщо ж ви почнете складати в специфікацію історію всіх спроб, вона швидко перетвориться на археологічний шар. Для археології в нас є інші файли.
3. Reviewer хоче зрозуміти за пʼять хвилин
Коли людина відкриває специфікацію, готову для reviewerʼа, вона не хоче йти в похід по ваших чатах, комітах і внутрішніх осяяннях — вона хоче за хвилини зібрати в голові просту модель проєкту. Хороша специфікація працює як добре підписана коробка: ви ще не відкрили її до кінця, а вже розумієте, що всередині.
| Розділ | Питання reviewerʼа |
|---|---|
| Ціннісна пропозиція | Чому цим узагалі варто займатися і де тут видима користь? |
| Проблема | Що саме болить зараз? |
| Цільовий користувач / JTBD | Кому це потрібно і в якій робочій ситуації? |
| Обсяг / Не-цілі / Заборонена зона | Що входить, чого ви свідомо не робите і де AI не приймає фінальне рішення? |
| Релізний зріз | Що реально входить у перший робочий шматок? |
| Метрика успіху | За яким сигналом ви вважаєте, що користь не декоративна? |
| План перевірки | Як я відтворювано перевірю, що це не просто гарна розповідь? |
| Demo-сценарій | Що саме буде показано крок за кроком? |
| Відомі обмеження | Чого ви чесно не обіцяєте? |
Ці розділи легко почати дублювати, тому що всі вони описують один і той самий проєкт. Але ролі в них різні: кожен закриває своє питання з таблиці. І зверніть увагу на важливу деталь: reviewer читає документ не заради натхнення — він читає його заради рішення. Якщо після пʼяти хвилин читання не можна сказати, що робить продукт, кому допомагає і як перевіряється, значить специфікація досі написана радше «для автора», ніж «для review». Це нормальний етап, але зупинятися на ньому не варто.
4. Проблема — мовою користувача
У розділі Problem reviewer спочатку має побачити біль, а не обраний вами технічний трюк. До цього місця проблема вже зрозуміла вам самому — тепер важливо перевірити, чи не підмінили ви її описом реалізації на кшталт «потрібно зробити AI-класифікацію тікетів і генерацію draft-відповідей».
| Слабке формулювання | Формулювання, зрозуміле reviewerʼу |
|---|---|
| Потрібно зробити AI-помічника для підтримки | Оператор підтримки отримує 60–100 тікетів на день, майже половина з них повторюється, і час іде на ручні відповіді замість складних кейсів |
| Потрібна автоматична обробка refund | High-value refund-запити губляться в загальному потоці й потребують явної ручної перевірки |
Нижче — уже робочий фрагмент для нашого AI Support Agent:
## Проблема
Оператор підтримки невеликого інтернет-магазину отримує десятки звернень на день.
Повторювані питання про статус замовлення та повернення з’їдають час на ручні відповіді.
Через це складні та ризиковані кейси обробляються пізніше, ніж потрібно.
Якщо в Problem уже оселилися FastAPI, класифікатор, RAG, ембеддинги та інші смачні технічні слова — reviewer ще не побачив біль, він уже продирається крізь implementation.
5. User і JTBD: від загальної аудиторії до живої ролі
У розділі Target user / JTBD reviewer має побачити одну живу роль, одну робочу ситуацію і поточний workaround. Не «магазини» й не «підтримку взагалі», а конкретну людину, у якої зранку забитий inbox і яка зараз викручується нотатками та копіпастою.
| Слабке формулювання | Версія, зрозуміла reviewerʼу |
|---|---|
| Користувач — підтримка магазинів | Оператор підтримки невеликого інтернет-магазину |
| Хоче підвищити ефективність | Хоче швидше закривати типові тікети й не пропускати ризикові refund-кейси |
Для архетипу AI Support Agent хороше формулювання виглядає так:
## Цільовий користувач / JTBD
Користувач: оператор підтримки невеликого інтернет-магазину.
Коли зранку inbox заповнений десятками тікетів,
я хочу швидко відокремити типові звернення від risky-case
і отримати чернетку відповіді на прості питання,
щоб не витрачати час на копіювання шаблонів
і не пропускати refund-запити на велику суму.
Корисна ознака reviewer-ready блоку — current workaround видно поруч, а не бовтається окремою думкою. Інакше продукт виглядає так, ніби користувач до вас сидів у вакуумі й терпляче чекав саме ваш MVP.
6. Release slice: один маршрут замість набору функцій
У розділі Release slice reviewer має побачити один завершений маршрут, а не список симпатичних функцій. До цього місця must-have, non-goals і forbidden zone уже вибрані — тепер важливо показати, що реально працює разом.
| Слабка подача | Подача, зрозуміла reviewerʼу |
|---|---|
| Inbox, labels, filters, історія, аналітика, шаблони відповідей | Тікет → класифікація → чернетка → перевірка оператором → журнал аудиту |
Тепер переведімо це в текст специфікації:
## Релізний зріз
Вхід: sample ticket з текстом і ідентифікатором клієнта.
Основна дія: система класифікує тікет і,
якщо звернення типове, пропонує чернетку відповіді.
Вихід: оператор бачить мітку, draft і може прийняти
або відредагувати відповідь.
Guardrail: refund > $100 не обробляється автоматично
і потребує ручного схвалення.
Щойно цей маршрут зафіксовано, план перевірки й demo перестають жити окремим життям: обидва просто відтворюють саме його.
7. План перевірки і demo: один ланцюжок
У План перевірки і Demo scenario reviewer має побачити, як це перевіряється руками й показується без шаманства. Дуже багато початківців розводять план перевірки і demo scenario по різних кімнатах, ніби це чужі один одному родичі. Насправді це один ланцюжок. План перевірки відповідає на питання «як перевіряємо», а demo scenario робить цю перевірку видимою і відтворюваною. Якщо між ними немає зв’язку, специфікація починає звучати переконливо, але перевіряється як туман.
Нижче — компактний варіант План перевірки для нашого архетипу:
## План перевірки
Запуск: `docker compose up`
Smoke-check:
1. Inbox відкривається з 10 sample tickets.
2. Ticket #3 отримує label `typical` і draft відповіді.
3. Ticket #7 з refund $250 блокується і потребує manual approval.
4. В audit trail видно, що запропонував AI і що зробив оператор.
Тепер подивіться, як це перетворюється на demo-сценарій. Гарний спосіб — буквально зіставити критерії приймання зі сценою показу:
| Критерій приймання | Що показуємо на demo |
|---|---|
| Типовий тікет розпізнається як typical | Відкриваємо ticket #3 і показуємо label |
| Для typical-case є придатна чернетка | Показуємо draft і приймаємо його |
| High-value refund не йде автоматично | Відкриваємо ticket #7 і показуємо блокування |
| Дії AI та людини видно | Переходимо в audit trail і дивимося записи |
Саме так demo перестає бути театром «зараз я поклікаю все підряд, і ви самі здогадаєтесь, що в мене працює» та стає керованою демонстрацією критеріїв приймання. Reviewer не має вгадувати, що тут випадковий клік, а що доказ.
Нижче — уже нормальний фрагмент Demo scenario:
## Demo-сценарій
1. Відкрити inbox з 10 sample tickets.
2. Обрати типовий ticket #3 і показати classification + draft.
3. Прийняти draft і відкрити audit trail.
4. Обрати ticket #7 з refund $250 і показати блокування.
Зверніть увагу, як мало тут зайвого. Це не екскурсія застосунком і не спроба вразити кількістю екранів. Це маршрут перевірки. Саме тому такі сценарії зазвичай сприймаються набагато сильніше, ніж demo в стилі «ну тут ще є налаштування, фільтри, графіки і, до речі, ось красивий логотип».
8. Known limitations і Risks: чесність
Коли автор боїться писати обмеження, він зазвичай думає, що виглядає слабше. На практиці відбувається рівно навпаки: сильнішим виглядає проєкт, у якого межі названі вголос. Фраза production-ready притягує проблеми так само, як магніт притягує скріпки. Тому краще бути чесним і конкретним.
Для нашого AI Support Agent розділ може виглядати так:
## Відомі обмеження
- Працюємо на sample data, не на live CRM.
- Accuracy вимірюється тільки на demo-наборі з 10 тікетів.
- Немає multi-language support.
- High-value refund не відправляється автоматично.
А поруч можна коротко окреслити ризики:
## Ризики
- На нових формулюваннях accuracy може бути нижчою, ніж на demo-set.
- Поріг high-value refund зараз заданий правилом, а не adaptive-логікою.
- Чернетка відповіді оцінюється оператором вручну, без окремого quality-score.
У таких розділах немає нічого соромного. Навпаки, reviewer бачить, що ви не продаєте навчальний MVP як enterprise-систему, і довіра зростає. Нормально сказати: «показуємо один робочий slice, але не готові обслуговувати бойовий потік магазину в понеділок зранку». А ось якщо документ звучить так, ніби завтра його можна везти в production, а проєкт тримається на sample data і ручній перевірці, — значить, завелася зайва бравада. Її краще акуратно виселити.
9. Claude Code як reviewer специфікації
На цьому етапі Claude Code особливо корисний не як генератор нових ідей, а як reviewer документа. Це принципово різні ролі. Якщо ви просто попросите «покращ мою специфікацію», Claude з радістю підкине ще сім фіч, два інтеграційні напрями й трохи гарного життя. Звучить заманливо, але scope freeze після цього зазвичай починає тихо плакати в кутку.
Тому запит краще робити жорсткішим і конкретнішим. Наприклад так:
Перевір цю специфікацію як reviewer.
Не пропонуй нових функцій, якщо вони не потрібні для core flow.
Знайди:
1. неясні формулювання для користувача;
2. scope creep і суперечності non-goals;
3. прогалини у verification і demo-сценарії;
4. фрази, які звучать як fake production claims.
Поверни відповідь коротко, за розділами.
Ще краще, якщо для такого review ви відкриєте нову сесію — тоді Claude подивиться на документ холодніше, без інерції попереднього листування. Це той самий випадок, коли свіжий погляд справді допомагає.
Зручно також просити Claude повертати не абстрактне «треба покращити розділ Problem», а формат на кшталт: «цитата з фрагмента → чому неясно → як переформулювати». Тоді review стає робочим, а не філософським. І найголовніше — пам’ятайте, що вам зараз потрібен не партнер по мозковому штурму, а спокійний редактор, який помітить слизькі місця.
10. Каркас готового документа
Коли всі попередні частини зібрані, у вас виходить дуже простий, але сильний каркас: не красивість заради красивості, а документ, який читається зверху вниз без стрибків між файлами й здогадок за контекстом. Якщо у вас чистий MVP, цей каркас може жити в MVP_SPEC.md; якщо ні — в основному SPEC.md.
# SPEC.md
## Value proposition
...
## Проблема
...
## Цільовий користувач / JTBD
...
## Обсяг / Не-цілі
...
## Релізний зріз
...
## Заборонена зона
...
## Метрика успіху
...
## План перевірки
...
## Demo-сценарій
...
## Відомі обмеження / ризики
...
Зверніть увагу, що тут немає нічого екзотичного. Специфікація не зобов’язана бути довгою, щоб бути сильною, — вона зобов’язана бути зв’язною. Reviewer проходить по документу й ніде не спотикається об «пачекайте, а для кого це взагалі?» або «а що я побачу наживо?». Якщо після читання він переказує ваш core flow своїми словами й відтворює demo без шаманства та телепатії — значить, документ уже виконує свою роботу. І це дуже гарний стан для специфікації.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ