JavaRush /Курси /Claude code /Scope, non-goals і release slice для MVP

Scope, non-goals і release slice для MVP

Claude code
Рівень 30 , Лекція 3
Відкрита

1. MVP потрібен scope freeze

Після розмови про користувача й метрику дуже хочеться одразу відкрити редактор і почати «швидко збирати». Саме в цей момент проєкт зазвичай і починає роздуватися. Спочатку ви додаєте «ще одну корисну кнопку», потім «невеликий екран налаштувань», потім «раз ми вже тут, давайте прикрутимо аналітику». MVP таке любить: він узагалі майстер удавати безневинним, поки не зʼїсть увесь термін.

Scope freeze — це момент, коли ви чесно кажете собі: у поточний реліз беремо один завершений корисний сценарій, усе нове велике складаємо окремо. Не заборона на хороші ідеї. Захист від того, щоб перша версія не стала валізою, куди ви запихаєте і зубну щітку, і сноуборд, і чомусь торшер.

Для нашого Support Agent це звучить дуже приземлено: не «універсальна AI-платформа для підтримки», а перша робоча версія. Невеликий фрагмент із робочої специфікації може виглядати так:

## Замороження області

Поточний реліз показує один сценарій:
вхідний тікет → класифікація → чернетка відповіді → перевірка оператором.

Усі нові великі функції після фіксації цього сценарію
не входять до поточного релізу й переносяться до Later.

Зверніть увагу на важливу річ: тут немає драми й немає «ми назавжди відмовилися» — лише дисципліна. Ідея не викидається, вона перестає заважати поточному релізу. Навіть якщо ваш проєкт не чистий MVP, уміння вчасно заморозити scope рятує майже будь-яку першу версію.

2. Відділяємо must-have від «теж важливо»

На словах майже всі розуміють, що треба відокремлювати головне від другорядного. На практиці ж у «обовʼязково» чомусь миттєво потрапляє все підряд: логін, темна тема, експорт, історія дій, «раз уже є історія, давайте аналітику по тижнях». Тут рятує не інтуїція, а проста інженерна класифікація.

Зручно дивитися на фічі через таку таблицю:

Категорія Що це означає Перевірочне запитання Приклад для Support Agent
Must-have Без цього core flow не існує Якщо прибрати це, основний сценарій узагалі ще живий? Класифікація тікета, чернетка відповіді для типового випадку, ручне підтвердження оператором
Should-have Сильно допомагає, але демо виживе й без цього Сценарій стане гіршим, але залишиться працездатним? Історія останніх тікетів клієнта
Nice-to-have Робить продукт приємнішим, але не робить його можливим Це покращує враження чи робить сценарій можливим? Красиві бейджі, додаткові фільтри, анімації
Later Ймовірний кандидат на наступну версію Це частина того ж продукту, але не першого релізу? Багатомовність, шаблони відповідей за категоріями
Out of scope Це вже інший за масштабом або природою продукт Чи не намагаємося ми непомітно будувати сусідню систему? Повноцінна CRM, голосовий кол-центр, автонавчання моделі на реальних діалогах

Головне запитання одне: прибираємо цю штуку — сценарій ламається чи просто стає трохи менш красивим?

Наприклад, для навчального демо Support Agent логін майже ніколи не буває must-have. Звучить трохи кощунственно: розробник у нас одразу хоче вигукнути «але ж у будь-якого застосунку має бути вхід!». Для першого релізу — ні. На локальних даних перед ментором логін не створює цінності для оператора, лише відчуття «тепер це виглядає як справжній застосунок». Правдоподібність і цінність — не одне й те саме.

Хороша чорнова категоризація для нашого прикладу може виглядати так:

## Карта фіч

Must-have: inbox, класифікація, чернетка відповіді, ручне підтвердження, audit trail.
Should-have: історія останніх тікетів клієнта.
Nice-to-have: фільтр за типами тікетів, кольорові мітки.
Later: багатомовність, шаблони відповідей, dashboard за SLA.
Out of scope: CRM, телефонія, auto-refund, навчання моделі на продакшен-даних.

Тут особливо важлива різниця між Later і Out of scope. Later: «можливо, частина того ж продукту, але не зараз». Out of scope: «почнемо це — зміниться не розмір, а природа проєкту». Для новачка це розрізнення дуже корисне — без нього все здається однаково «додатковою фічею».

3. Release slice: один завершений шлях

Тепер — найважливіше поняття цієї лекції: release slice, той самий мінімальний робочий шматок продукту, який можна пройти від початку до кінця. Не по шарах і папках, не «спочатку весь backend, потім весь frontend», а за користувацьким сценарієм.

Новачки дуже часто ріжуть систему горизонтально. Шматок інтерфейсу. Окремо логіка класифікації. Окремо таблиця історії. Окремо сторінка налаштувань. Коду чимало, а показати нічого: жодного завершеного маршруту.

Release slice збирається вертикально. Це означає: ми беремо один шлях користувача від входу до результату і проводимо через нього всі потрібні шари одразу. Для Support Agent такий зріз виглядає так:

flowchart TD
    A[Вхідний тікет] --> B[Класифікація]
    B --> C[Чернетка відповіді]
    C --> D[Перевірка оператором]
    D --> E[Надсилання]
    E --> F[Запис у audit trail]

Ось це і є перша версія, яку можна показати без ніякової фрази «тут поки не все підключено, але ви уявіть». Користувацький шлях завершений. Так, він вузький, так, він не покриває весь світ — зате він цілісний. У специфікації це зручно записувати коротко й дуже конкретно:

## Релізний зріз

Вхід: текст тікета та customer id.
Основна дія: класифікація + чернетка відповіді.
Вихід: оператор бачить клас тікета й чернетку відповіді.
Резервний сценарій: за низької впевненості тікет позначається як needs-human.
Демонстраційні дані: 10 тестових тікетів трьох типів.

Зверніть увагу на рядок із fallback — це важлива деталь. Release slice — не лише happy path, а й мінімально чесна поведінка там, де система не справляється. Для AI-продукту це особливо важливо: не впевнена модель — перша версія не повинна героїчно робити вигляд, що все зрозуміла. Іноді найкращий продуктовий хід — акуратно відступити й передати завдання людині.

Є ще один корисний sanity-check: якщо фічу не можна показати на підготовлених даних за 3–5 хвилин, вона майже напевно не має потрапляти до must-have поточного релізу. Суворо, але оздоровлює: відпадає половина ідей, які чудово виглядають у голові й жахливо — в дедлайні.

4. Non-goals: що ви свідомо не робите

Коли розробник пише scope, він зазвичай із ентузіазмом перелічує, що робить. А коли треба написати, чого він не робить, ентузіазм різко випаровується, ніби це список поразок. Насправді non-goals — один із найкорисніших розділів усієї специфікації: не самокритика, а захист продукту. Які розумно звучні речі ми свідомо не включаємо, щоб перша версія залишилася завершеною? Для Support Agent хороший розділ non-goals може виглядати так:

## Нецілі

У поточний реліз не входять:
multi-language support,
voice / phone support,
інтеграція з CRM,
автоматична обробка refund,
A/B testing відповідей,
автонавання нових діалогів.

Не красива папірка — список працює одразу в трьох місцях.

По-перше, він захищає вас від самого себе. Коли за два дні у голову приходить думка «ну багатомовність справді корисна», ви не починаєте внутрішній філософський диспут: ідея вже свідомо винесена за межі релізу.

По-друге, non-goals захищають від оточення. Якщо хтось дивиться на проєкт і запитує «а чому немає інтеграції з CRM?» — у вас не виправдання, а архітектурне рішення: для першого релізу ми будуємо inbox + classification + human review, а не платформу техпідтримки всього світу.

По-третє, non-goals дуже корисні під час роботи з Claude Code. AI любить бути корисним із розмахом: попросіть «зроби MVP підтримки кращим» — він цілком може почати розширювати продукт у боки, які вам узагалі не потрібні зараз. А ось чітко прописані non-goals сильно знижують ризик такого helpful overreach.

Є тонка, але важлива різниця між ідеями, які переходять у Later, і тими, що потрапляють у Non-goals. Later — радше доріжка на наступну версію того самого продукту. Non-goals — акцент на тому, що саме зараз вони заважають релізу. Іноді одне й те саме може бути і тим, і іншим — це нормально, не перетворюйте розділи на чисту математику.

5. Forbidden zone: ШІ допомагає, але не вирішує

Є особливий тип межі, який корисно виділяти окремо. Це не просто «функції, яких немає», а зона, де ШІ принципово не повинен мати останнє слово, навіть якщо технічно ви могли б це автоматизувати. Для Support Agent такий блок особливо важливий: продукт працює поруч із грошима, скаргами й клієнтськими рішеннями. І тут уже мало сказати «ми не робимо auto-refund» — краще прямо записати, що залишається за людиною завжди:

## Заборонена зона

Refund > $100 — лише ручне схвалення.
Скарги з юридичним ризиком — лише ескалація людині.
Скасування вже надісланого замовлення — лише manual action.
ШІ може підказати, але не ухвалює фінального рішення.

Ховати це всередині звичайних non-goals не варто: йдеться ж не про розмір релізу, а про межу відповідальності. Продукт може показати кейс, підсвітити його, підготувати чернетку — але не виконувати автономно.

Це дуже добра звичка для будь-яких AI-сценаріїв. Якщо система контактує з грошима, правами, медициною, безпекою, доступами або з чимось, що складно відкотити, — корисно явно відповісти: де закінчується допомога ШІ та починається обовʼязкове рішення людини?

У нашому Support Agent forbidden zone ще й чудово допомагає на демо: показувати guardrail — не слабкість продукту, а зрілість. Тікет із поверненням на 250 доларів чесно блокується й вимагає ручного підтвердження — це переконливіше за «сміливу автоматизацію», яку ніхто в здоровому глузді не пустив би в прод.

6. Збірка в поточну специфікацію

Коли scope, release slice, non-goals і forbidden zone визначені, той самий spec-документ раптом стає дуже компактним і дуже корисним — туман у ньому зникає. Він перестає бути збіркою мрій і стає робочим документом, за яким приймають рішення щодня. Для нашого прикладу центральний фрагмент виглядає так:

## Область змін
Входить: inbox, три класи тікетів, чернетка відповіді для typical-case,
ручне підтвердження оператором, audit trail, блокування refund > $100.

## Нецілі
Не входять: багатомовність, CRM, voice support, auto-refund, A/B testing.

## Основний потік користувача
Оператор відкриває тікет → бачить клас і чернетку →
підтверджує або править відповідь → надсилає →
система зберігає запис в audit trail.

Для чистого MVP це може бути MVP_SPEC.md; в інших capstone-проєктах — той самий блок усередині SPEC.md. Цей самий документ можна продовжити ще однією короткою вставкою:

## Demo-зріз
Використовуємо 10 sample tickets:
typical, needs-human, refund-high-value.

## Заборонена зона
Refund > $100 і юридично ризиковані скарги
не обробляються автоматично.

У такому записі є все, що потрібно для повсякденного контролю проєкту. Коли з’являється нова ідея, ви не обговорюєте її абстрактно, а порівнюєте з документом: без неї core flow не існує — обговорюємо; робить демо приємнішим, але не обовʼязковішим — вниз за пріоритетом; лізе у forbidden zone — не пускаємо під виглядом «покращення».

Є добра ознака, що ви рухаєтеся у правильному напрямку: після такої переробки специфікація починає звучати трохи скромніше, ніж вам хотілося б. І це чудово — у хорошого MVP майже завжди є легкий ефект «щось він занадто компактний», і зазвичай саме в цей момент він і стає реалістичним. Перша версія не зобовʼязана вражати кількістю екранів. Її завдання — чесно довести одну корисну річ до стану, в якому її можна показати, зрозуміти й перевірити.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ