С6 · Шпаргалка: система з коду, карта інтеграцій, AS-IS ↔ TO-BE

Команди, промпти й каркаси для кожного кроку завдання С6 на демо-системі «Пакунок»: пояснення системи з коду і карта інтеграцій (L1, для всіх), вимоги модуля для BA чи реєстр міжсистемних сценаріїв для QA (L2), потоки даних для BA чи контракт POST /v1/events для QA (L3) — і здача через merge request. Код ви не пишете: агент читає, ви питаєте і перевіряєте. Підходить будь-який агент; покрокові команди — для Claude Code.

Перед початком

gitlab.com/koldovsky/ai-qa-ba-c6

У корені копії є: system/HOW-TO-RUN.md

1. Старт

Форк і клон — як у С4–С5, але проєкт новий: koldovsky/ai-qa-ba-c6. У корені копії немає файлів правил агента (AGENTS.md, CLAUDE.md, GEMINI.md) і тек .claude/, .agents/, .cursor/, .github/ — так у всіх однаковий старт. Не створюйте їх і ви.

Де / що: gitlab.com · крок 0 README · пошта в комітах · уже зробили в С1–С5 — пропустіть

аватар → Edit profile → Commit email → Use a private email → Update profile settings

Очікуваний результат: У полі Commit email — прихована адреса на кшталт …@users.noreply.gitlab.com: коміти не покажуть вашої справжньої пошти.

Де / що: Браузер · сторінка gitlab.com/koldovsky/ai-qa-ba-c6

Fork → namespace: ваш username → Fork project

Очікуваний результат: Відкрилася ваша копія: gitlab.com/ваш-username/ai-qa-ba-c6.

Якщо не працює

Форк робіть зі сторінки koldovsky/ai-qa-ba-c6, а не з чужої копії — інакше в merge request можуть потрапити чужі файли.

Де / що: Спосіб 1 · клон · термінал: Windows — PowerShell, macOS — Terminal · замініть ваш-username на свій username на gitlab.com

cd ~
git clone https://gitlab.com/ваш-username/ai-qa-ba-c6.git
cd ai-qa-ba-c6

Очікуваний результат: Тека ai-qa-ba-c6 у домашній теці, термінал — у ній. Усередині — README.md, system/, templates/ і submissions/. Це і є корінь копії.

Якщо не працює

Перевірка Git — git --version. Не вдалося клонувати — найчастіше помилка в username: скопіюйте адресу зі своєї копії (Code → Clone with HTTPS).

Де / що: Спосіб 2 · ZIP без git · своя копія на gitlab.com

Code → Download source code → zip

Очікуваний результат: Розпакуйте, наприклад, у Документи\ — тека матиме назву на кшталт ai-qa-ba-c6-main: далі «корінь копії» — це вона. Git у ній немає: результати додаєте через браузер (розділ 12).

Де / що: Windows — PowerShell у корені копії · ваша тека для результатів

mkdir submissions/ваш-username/results

Очікуваний результат: Тека submissions/ваш-username/results/ — сюди агент пише всі результати. Термінал лишається в корені копії: переходити в нову теку не треба.

Якщо не працює

Назва — саме ваш username на gitlab.com, без помилок у «submissions»: тека з іменем замість username чи «submisions» — і роботу не знайдуть.

Де / що: macOS — Terminal у корені копії · ваша тека для результатів

mkdir -p submissions/ваш-username/results

Очікуваний результат: Те саме, що на Windows: submissions/ваш-username/results/, термінал — у корені копії.

Де / що: Claude Code · термінал у корені копії (ai-qa-ba-c6), там, де system/ і submissions/

claude

Очікуваний результат: Сесія агента в корені копії. Codex — codex у тій самій теці; VS Code (Copilot Chat) і Cursor — File → Open Folder → тека ai-qa-ba-c6.

Де / що: Перше повідомлення сесії · перевірка, що агент бачить код

Покажи дерево тек system/. Нічого не змінюй.

Очікуваний результат: Дерево system/: HOW-TO-RUN.md, package.json, jsconfig.json, start.js і services/ з parcels/ і notifications/, а в них — файли сервісів. Службовий .gitignore агент може показати чи ні — це нормально.

Якщо не працює

Агент не бачить system/ або просить доступ до теки вище — його запущено не в корені копії, наприклад у submissions/ваш-username/. Вийдіть (/exit) і запустіть агента в ai-qa-ba-c6/.

Демо-система «Пакунок»

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

system/
├── HOW-TO-RUN.md          # як запустити — лише запуск, не опис системи
├── package.json
├── jsconfig.json          # налаштування редактора
├── start.js               # запуск обох сервісів одним вікном
└── services/
    ├── parcels/           # сервіс посилок
    └── notifications/     # сервіс сповіщень
Свої правила С5 — за бажанням

Без балів. Два способи: першим повідомленням сесії — вставте текст своїх правил; або особистим файлом правил агента, наприклад ~/.claude/CLAUDE.md для Claude Code. Файл правил у корені копії не створюйте і не комітьте. Правило С5 з межею «пиши лише в results/» перевірте: тут ваша тека — submissions/ваш-username/results/.

Що потрібно

Будь-який агент, який читає файли в теці: Claude Code, Codex, GitHub Copilot, Cursor та інші; демо й покрокові інструкції — для Claude Code зі вступного пакета. Акаунт на gitlab.com — той самий, що в С1–С5; це окремий сервіс, не корпоративний GitLab. Git — для клону (git --version); без git — ZIP. Node.js 20 або новіший — лише для запуску системи (node --version). Переглядач Mermaid — розділ 6. MCP не потрібен.

2. Межі в промпті

Агент працює з усією копією, тому межі пишете явно — у кожному завданні або першим повідомленням сесії. Після злиття MR нові форки містять чужі роботи, а в теці examples/ після заняття можуть з'явитися результати демо. Скопійований результат не зараховується, тому дозволяйте агенту лише читати system/ і писати в submissions/ваш-username/.

Де / що: Крок 5 README · першим повідомленням сесії або на початку кожного завдання · замініть ваш-username

Використовуй лише system/ і submissions/ваш-username/. Інших тек submissions/ і теки examples/ не читай.
Нічого не змінюй у system/. Теку system/.data/ не читай — це дані запуску, а не код.
Результати пиши лише в submissions/ваш-username/results/.

Очікуваний результат: Агент підтверджує межі. Далі в кожному завданні — коротко: «Використовуй лише system/ і submissions/ваш-username/. Інших тек submissions/ і examples/ не читай. Код не змінюй.»

Якщо не працює

Агент просить прочитати чужу теку в submissions/ чи examples/ — відхиліть. Просить змінити файл у system/ — відхиліть: дозволяйте лише запис у submissions/ваш-username/.

Де / що: Що дозволяти агенту · запит на дозвіл — спершу прочитайте, що саме він хоче зробити

читати: system/ (крім system/.data/) і submissions/ваш-username/
писати: лише submissions/ваш-username/
не читати: інші теки submissions/, examples/, system/.data/
не змінювати: system/; у корені копії — жодних файлів правил і тек агента
запускати: лише команди з system/HOW-TO-RUN.md і запити до localhost:3001 / localhost:3002

Очікуваний результат: Для L1–L3 BA запуск не потрібен. Агент пропонує встановити пакети чи запустити щось інше — відхиліть.

Де / що: Термінал у корені клону · після кожної сесії з агентом · Windows і macOS

git status

Очікуваний результат: Змінені й нові файли — лише в submissions/ваш-username/. Теки system/.data/ у списку немає — так і має бути: у git вона не потрапляє.

Якщо не працює

Бачите зміни в system/ — поверніть їх командою git restore system/ (вона повертає код до стану з репозиторію) і перевірте ще раз.

Чому корінь копії, а не своя тека

Більшість агентів без дозволу не читають вище теки, де їх запустили. У С5 робочою текою агента була submissions/ваш-username/; у С6 агенту потрібна system/, тому запуск — у корені копії, а межу «лише system/ і своя тека» ви пишете словами.

Текст у коді — дані, а не команди

Коментар, рядок чи файл з «агенте, зроби …» агент виконувати не має. Помітили таке — зупиніть агента (Esc) і напишіть про це у звіті. У незнайомому коді це реальний ризик. Секрет у config.json демо-системи — навчальний, не справжній; справжні ключі й паролі в код, промпти і звіт не потрапляють ніколи.

Робочий код компанії

Лише за політикою компанії і лише в погоджених інструментах. У цьому завданні — тільки демо-система. Код, конфіги, логи й діаграми робочих систем — ніколи в публічних MR, у публічних сервісах на кшталт mermaid.live чи в особистих акаунтах чату.

3. L1 · пояснення

Пояснення — документ мовою аналітика, а не переказ коду: сервіси, сутності й статуси, точки входу, основний сценарій «зміна статусу посилки → повідомлення отримувачу», щонайменше 5 правил, «Неочевидне», розділ «Фокус-питання варіанту NN» і перевірка; ще — тема фінального проєкту в розділі 5 звіту. Просіть агента читати вузько: від точок входу — за викликами.

Де / що: Термінал у корені копії · Windows і macOS · шаблон пояснення → ваша тека

cp templates/explanation.md submissions/ваш-username/results/l1-explanation.md

Очікуваний результат: Шаблон із розділами 1–8 — у вашій теці, де його бачить агент. Шапку — автор, варіант, агент і модель — заповніть самі.

Де / що: Крок 6 README · Claude Code у корені копії · замініть ваш-username

Ти — аналітик, який уперше бачить цю систему. Документації немає, є лише код у system/.
Використовуй лише system/ і submissions/ваш-username/. Інших тек submissions/ і examples/ не читай. Код не змінюй.
Почни з system/services/*/server.js, далі читай лише те, що вони викликають, і config.json.
Поясни мовою аналітика, без коду: що робить кожен сервіс; сутності й статуси; ендпоінти — призначення і хто викликає;
основний сценарій від зміни статусу посилки до повідомлення отримувачу кроками; щонайменше 5 правил; «Неочевидне».
Біля кожного твердження — файл і функція. Що не підтверджено кодом — познач «припущення».
Збережи в submissions/ваш-username/results/l1-explanation.md.

Очікуваний результат: results/l1-explanation.md: сервіси, сутності й статуси, точки входу, основний сценарій кроками, щонайменше 5 правил, «Неочевидне» — біля кожного твердження файл і функція. Перевірте, що лишилися розділи шаблону «Фокус-питання варіанту NN» і «Перевірка»: їх заповнюєте далі.

Якщо не працює

Агент переписав файл, і розділів «Фокус-питання варіанту NN» і «Перевірка» немає — напишіть: «Перебудуй submissions/ваш-username/results/l1-explanation.md за розділами 1–8 шаблону templates/explanation.md. Нічого з написаного не викидай; розділи 7 і 8 залиш порожніми. Код не змінюй.»

Де / що: Окремим повідомленням у тій самій сесії · замініть текст у «…» на фокус-питання свого варіанту — дослівно з таблиці README — і NN

Простеж кроками через обидва сервіси: «<фокус-питання вашого варіанту>».
На кожному кроці — що відбувається і джерело: файл і функція.
Висновок — мовою бізнесу: що побачить отримувач чи оператор. Що код не визначає — питання власнику з роллю адресата.
Запиши відповідь у розділ «Фокус-питання варіанту NN» файлу submissions/ваш-username/results/l1-explanation.md — цей розділ уже є, нового не додавай. Код не змінюй.

Очікуваний результат: Розділ «Фокус-питання варіанту NN»: кроки через обидва сервіси з джерелами і висновок. Питання — лише свого варіанту: чуже не зараховується.

Де / що: Claude Code · після роботи · токен-звіт

/context

Очікуваний результат: Що вже в контексті: файли, повідомлення, загальні цифри — у звіт, розділ 6 «Токен-звіт».

Де / що: Claude Code · після роботи · токен-звіт

/usage

Очікуваний результат: Що показав /usage — теж у розділ 6. Вартість сесії — якщо агент її показує. Інші агенти — що показує їхній інтерфейс.

Де / що: Токен-звіт без цифр · у тій самій сесії

Перелічи файли з system/, які ти прочитав у цій сесії. Нічого не змінюй.

Очікуваний результат: Перелік — для оцінки: скільки файлів коду прочитано і скільки уточнень знадобилося. Оцінка зараховується, як у С3–С5. І одне речення — як зменшити.

Де / що: Демо 1 · слайд 237 · промпт із заняття дослівно · у своїй копії замініть submissions/koldovsky/ на submissions/ваш-username/ — інакше агент запише файл у чужу теку

Ти — аналітик і тестувальник, які вперше бачать цю систему. Документації немає, є лише код у system/. Використовуй тільки system/; інших тек (submissions/ інших людей, examples/) не читай.
Питання: як насправді працює інтеграція між сервісом посилок (system/services/parcels) і сервісом сповіщень (system/services/notifications)? Що відбувається від зміни статусу посилки до повідомлення отримувачу?
Поясни мовою аналітика, без коду і без жаргону:
1) що робить кожен сервіс — 2–3 речення;
2) крок за кроком від зміни статусу до повідомлення: хто кого викликає і які дані передає;
3) що буває, коли щось іде не так: сервіс недоступний, та сама подія вдруге, немає даних отримувача;
4) «Неочевидне»: правила, яких не видно з назв, магічні числа, коментарі, що суперечать коду, код, який ніхто не викликає.
Біля кожного твердження — джерело: файл і функція. Що не підтверджено кодом — познач «припущення».
Збережи в submissions/koldovsky/results/demo1-how-it-works.md. Код не змінюй.

Очікуваний результат: Перевірка за слайдом: порядок читання — server.js → виклики → config.json; розділи 1–4 є, мова аналітика, без коду; біля кожного твердження — файл і функція; непідтверджене позначено «припущення». Для L1 потрібні ще розділ «Фокус-питання» і перевірка — промпти вище.

Порядок читання: від входу — за викликами

Дерево тек — які сервіси й модулі є. Точки входу — маршрути в server.js: що можна попросити в сервісу. Виклики — від маршруту до функцій, які він кличе. Конфіг — config.json: адреси, прапорці, числа. Дані — seed/: як виглядає справжній запис. «Прочитай увесь system/» — дорожче: агент читає й те, що ніхто не викликає, а кожен прочитаний файл ви оплачуєте на кожному наступному кроці. Що вже в контексті — /context.

так дорого: Прочитай увесь system/ і поясни, як усе працює.
так: Почни з server.js обох сервісів, далі — за викликами. Використовуй тільки system/.
Будова промпту — слайд 235

Так побудовано всі промпти шпаргалки. Свій промпт — для фокус-питання чи модуля — перевірте за цим переліком.

роль → межа «лише system/» → питання → розділи результату → «біля кожного твердження — файл і функція» → «що не підтверджено — припущення» → «код не змінюй» → куди зберегти
Словник: код → мова аналітика → що питає BA / QA

У промпті — «мовою аналітика, без коду і без жаргону». Термін потрібен — один раз, у дужках після пояснення.

endpoint, маршрут → точка входу: що можна попросити в сервісу → Хто це викликає і з якими даними?
webhook → сервіс сам повідомляє іншому про подію → Що, якщо адресат не відповів?
200 · 4xx · 409 → код відповіді: успіх · помилка запиту · конфлікт або дубль → Що в цей момент бачить користувач?
retry · backoff → повторні спроби з паузами → Скільки разів — і що потім?
idempotency key → захист від дублів: «це вже було» → Що вважається «тим самим»?
timeout → скільки чекаємо відповіді → Що буде, коли не дочекалися?
feature flag → перемикач функції в налаштуваннях → Що зараз увімкнено — і де це видно?
dead code → код, який ніхто не викликає → Залишок чи правило — і хто знає?
Що шукати в «Неочевидному»

Магічні числа — числа в коді без пояснення; коментарі, що суперечать коду; код, який ніхто не викликає; вимкнені функції. Для кожного — де (файл · функція чи назва значення), чому неочевидно і питання власнику. Як перевіряти — розділ 4, як питати про числа — розділ 7.

Токен-звіт

У Claude Code — /context після роботи і /usage; вартість сесії — якщо агент її показує. Інші агенти — що показує їхній інтерфейс. Цифр немає — оцінка: скільки файлів коду агент прочитав (агент сам може їх перелічити) і скільки уточнень знадобилося. І одне речення — як зменшити: наприклад, що дало прохання «почни з server.js, далі за викликами» порівняно з «прочитай усе».

Тема фінального проєкту — розділ 5 звіту

Частина L1 для всіх, окремого файлу не треба. У розділі 5 c6.md: роль у фінальному проєкті — QA чи BA; тема — номер з каталогу (QA — каталог ідей, 01–14; BA — каталог кейсів, 01–07) або своя у 2–3 реченнях, вигадана чи знеособлена; чому саме вона — 1–2 речення. BA з власним запитом нічого додатково не обирає: зміна вимог для нього — з каталогу типових змін за номером варіанту. Змінити тему пізніше можна.

https://gitlab.com/koldovsky/ai-qa-ba-final/-/blob/main/catalog/qa-ideas.md
https://gitlab.com/koldovsky/ai-qa-ba-final/-/tree/main/catalog/ba-cases
https://gitlab.com/koldovsky/ai-qa-ba-final/-/blob/main/catalog/ba-change-catalog.md

4. Файл і функція

Правило С1–С5 «біля кожного твердження — джерело» тут звучить так: біля кожного твердження — файл і функція. Агент теж помиляється, коли пояснює код: вірить коментарям, назвам функцій і тому, «як зазвичай роблять». Тому щонайменше три твердження ви звіряєте з кодом самі — це головна частина L1.

Де / що: Формат джерела · біля кожного твердження

system/services/notifications/server.js · назваФункції
system/services/<сервіс>/config.json · назва значення

Очікуваний результат: Рядок — за бажанням. Немає функції (значення в конфігу, мапа на початку файлу) — файл і назва значення.

Де / що: Факт, припущення, «так не треба» · приклад вигаданий, не з цієї системи

Замовлення від 500 грн включно доставляють безкоштовно.
джерело: orders/delivery.js · calcDeliveryFee
факт із коду

«Поріг, мабуть, узгодили з маркетингом» — у коді не видно
припущення → питання власнику

так не треба: «Сервіси інтегровані через API і надійно обмінюються даними» — без джерела, перевірити нічого

Очікуваний результат: Факт із коду — ви бачите це в коді, з файлом і функцією. Припущення — висновок, якого код прямо не показує, зокрема з коментаря чи назви. Чесно позначене припущення — не мінус; твердження, якого в коді немає, не зараховується.

Де / що: Перевірка одного твердження · 1–2 хвилини · VS Code

1. Біля твердження є файл і функція?
2. Ctrl+P → назва файлу, який назвав агент
3. Ctrl+F → назва функції чи число
4. Порівняти, що каже коментар над кодом і що робить сам код
5. Хто це викликає: Ctrl+Shift+F за назвою функції по всій теці

Очікуваний результат: Коментар над кодом — не доказ: доказ — сам код. Функцію ніхто не викликає — вона не працює, хоч би що було написано в ній.

Де / що: Та сама сесія · після твердження, від якого залежить висновок · замініть <…>

Покажи рядки коду, з яких це видно: <твердження агента>. Файл і функція. Нічого не змінюй.

Очікуваний результат: Агент цитує рядки з файлом. Знайдіть їх самі в редакторі чи на gitlab.com: не знайшли або код каже інше — твердження не підтверджено.

Де / що: Коментар проти коду · замініть <назва>

Що каже коментар над функцією <назва> і що робить сам код? Покажи рядки обох. Нічого не змінюй.

Очікуваний результат: Кажуть одне — твердження з коментаря стає фактом із коду. Кажуть різне — система робить те, що в коді; розбіжність — у «Неочевидне» з питанням власнику.

Де / що: «Хто це викликає?» · без VS Code · замініть X на назву функції чи значення

Знайди в system/ усі місця, де згадується X, — файл і рядок.

Очікуваний результат: Перелік збігів. Один із них відкрийте самі у своїй копії на gitlab.com (Ctrl+F) і переконайтеся, що він там є. Є лише оголошення і жодного виклику — код, який ніхто не викликає.

Де / що: Таблиця перевірки · розділ «Перевірка» шаблону explanation.md або розділ 3 звіту · щонайменше 3 рядки

| # | Твердження агента (дослівно або коротко) | Що в коді (файл · функція, що побачили) | Підтвердилось? | Що виправили в поясненні |
|---|---|---|---|---|
| 1 | | | так / ні / частково | |
| 2 | | | | |
| 3 | | | | |

Очікуваний результат: Що каже агент → файл і функція → що побачили самі → вердикт → що виправили. Не підтвердилось — виправте пояснення і запишіть це в таблицю. Усе підтвердилось — теж результат: напишіть, як перевіряли.

Де агент помиляється

Вірить коментарям: коментар пишуть один раз, код змінюють часто, — агент переказує коментар замість коду. Вірить назвам: функція названа як дія, але чи її хтось викликає? Назва — не доказ. Читає файл, а не виклики: описує код, якого ніхто не викликає, як робочу функцію. «Зазвичай так роблять»: добудовує типову поведінку, якої в цьому коді немає.

Що обирати для перевірки

Твердження, від яких залежить висновок: числа, межі (включно чи ні), «завжди / ніколи», «що буде, якщо», порядок перевірок і правила, взяті з коментарів.

Мова аналітика, без коду

Не «if (order.total >= 500) fee = 0», а «замовлення від 500 грн включно доставляють безкоштовно — файл.js · назваФункції». Приклад вигаданий, не з цієї системи. Короткий фрагмент коду як доказ — можна.

Заповнений рядок · приклад вигаданий, не з цієї системи

Агент переказав межу неточно — перевірка це показала.

| 1 | «Безкоштовна доставка — понад 500 грн» | orders/delivery.js · calcDeliveryFee: умова «сума від 500 включно» | частково: рівно 500 грн — уже безкоштовно | межу виправлено: безкоштовно — від 500 грн включно |

5. Карта інтеграцій

Дефекти живуть на стиках: кожен сервіс окремо «працює», а повідомлення губиться між ними. Стик — будь-яке місце, де дані переходять з одного сервісу в інший або за межі сервісу: запит до іншого сервісу, подія (webhook), запис у файл, звернення до зовнішнього провайдера. Карта інтеграцій L1 — таблиця стиків і діаграма Mermaid flowchart.

Де / що: Крок 7 README · термінал у корені копії · Windows і macOS

cp templates/integration-map.md submissions/ваш-username/results/l1-integration-map.md

Очікуваний результат: Шаблон карти у вашій теці: учасники, таблиця стиків, діаграма, «Що перевірили проти коду».

Де / що: Claude Code у корені копії · замініть ваш-username

Заповни submissions/ваш-username/results/l1-integration-map.md за кодом system/ і розділами цього файлу.
Використовуй лише system/ і submissions/ваш-username/. Інших тек submissions/ і examples/ не читай. Код не змінюй.
1) Учасники: сервіси, сховища даних, зовнішні провайдери, люди.
2) Таблиця стиків: хто → кого (хто ініціює виклик), спосіб (webhook / REST-запит / файл / інше), ендпоінт чи місце, які дані (поля), автентифікація чи підпис, що буде при помилці з обох боків, джерело — файл і функція на обох боках.
3) Діаграма Mermaid flowchart: сервіси, сховища даних, провайдер повідомлень; стрілка — від того, хто викликає; підпис — що передається.
Чого в коді немає — пиши «у коді не визначено». Що не підтверджено кодом — «припущення».

Очікуваний результат: Заповнена карта. Далі — перевірте напрямок кожної стрілки (хто кого викликає) і що діаграма відкривається (розділ 6). Що перевірили — у розділ 4 карти і розділ 4 звіту.

Де / що: Чек-лист стику · 11 питань до коду · слайд 241

контракт — Які поля шле одна сторона і які читає інша? Що обов'язкове? Яке поле ніхто не читає?
автентифікація · підпис — Як приймач перевіряє, хто надіслав? Що робить, коли перевірка не пройшла?
формати даних — Телефон, гроші, дати: одна сторона пише в тому форматі, який розуміє інша?
часові пояси — UTC чи місцевий час? Хто, де і як переводить?
статуси і коди відповідей — Кожен статус має відповідник на іншому боці? Що відправник робить з кожним кодом відповіді?
повтори і затримки — Скільки спроб, з якими паузами, на які відповіді? Що після останньої?
ідемпотентність — Як приймач упізнає дубль? Чи не відкине він як дубль нову подію?
таймаути — Скільки чекаємо відповіді? Що робимо, коли не дочекалися?
тихі збої — «200, але нічого не сталося»: хтось дізнається про збій?
прапорці функцій — Що вимкнено в конфігу? Яка гілка коду працює насправді?
стан у пам'яті — Що зникне після перезапуску сервісу?

Очікуваний результат: Один стик — пункт за пунктом. Біля відповіді — файл і функція; чого немає — «у коді не визначено». QA: це типи дефектів на стиках для L2 і майбутні API-тести QA2. BA: поведінка на стику схожа на дефект — питання власнику, а не висновок.

Де / що: Один стик, пункт за пунктом · замініть <…> на стик із таблиці своєї карти

Візьми один стик: <хто → кого, спосіб, ендпоінт>. Пройди його за 11 пунктами по черзі: контракт; автентифікація і підпис; формати даних; часові пояси; статуси і коди відповідей; повтори і затримки; ідемпотентність; таймаути; тихі збої; прапорці функцій; стан у пам'яті.
Для кожного пункту — що робить код на обох сторонах стику, з файлом і функцією. Чого в коді немає — пиши «у коді не визначено».
Використовуй лише system/ і submissions/ваш-username/. Інших тек submissions/ і examples/ не читай. Код не змінюй.

Очікуваний результат: 11 коротких відповідей з джерелами — матеріал для колонок «автентифікація чи підпис» і «що буде при помилці», а для QA — для типів дефектів L2.

Де / що: Демо 2 · слайд 245 · промпт із заняття дослівно, після демо 1 · у своїй копії замініть submissions/koldovsky/ на submissions/ваш-username/ — інакше агент запише файл у чужу теку

На основі коду в system/ (і пояснення submissions/koldovsky/results/demo1-how-it-works.md) побудуй карту інтеграцій системи «Пакунок». Використовуй тільки system/ і цей файл.
1) Таблиця стиків: хто → кого, спосіб (webhook / REST-запит / файл), ендпоінт, які дані, автентифікація чи підпис, що буде при помилці, джерело (файл і функція).
2) Mermaid flowchart: сервіси, сховища даних, провайдер повідомлень; стрілки з підписами (що передається).
3) Mermaid sequenceDiagram основного сценарію «посилка прибула у відділення → отримувач отримав SMS»: учасники Оператор, parcels-service, notifications-service, Провайдер.
4) Data mapping одного елемента — ім'я отримувача: де з'являється, у якому вигляді зберігається, як передається, як перетворюється, де використовується; що може піти не так.
Діаграми — блоками ```mermaid. Збережи в submissions/koldovsky/results/demo2-integration-map.md. Код не змінюй.

Очікуваний результат: Перевірка за слайдом: скільки стиків і чи для кожного є спосіб, дані, підпис, що при помилці, файл і функція; кожна стрілка — від того, хто робить виклик; у sequence — учасники з промпту, кроки в порядку коду. Data mapping імені отримувача — демо: у L3 BA потрібні всі поля.

П'ять способів зв'язати системи — і як їх упізнати в коді

Тип стику підказує, з чого почати: запит — таймаут і коди відповідей, подія — повтори й дублі.

запит (REST) · «питаю і чекаю відповідь» · у коді: виклик fetch чи іншого HTTP-клієнта, адреса іншого сервісу в конфігу · ламається: не відповів вчасно, відповів кодом помилки чи не тим
подія (webhook) · «сам повідомляю іншому, що сталося» · у коді: POST на чужу адресу після своєї дії, у приймача — маршрут на кшталт /events · ламається: дублі, повтори, підробка, загублена подія
черга · «кладу повідомлення — хтось забере» · у коді: клієнт брокера повідомлень, назви черг чи топіків · ламається: порядок, дублі, повідомлення, яке ніхто не забрав
файловий обмін · «пишу файл — інший читає» · у коді: запис і читання файлів, теки обміну, запуск за розкладом · ламається: формат і кодування, недописаний файл
спільна БД · «дві системи — одна таблиця» · у коді: той самий рядок підключення в конфігах двох сервісів · ламається: хтось змінив чужі дані чи схему
Стрілка = виклик

«Хто → кого» — хто ініціює виклик, а не куди течуть дані. Відповідь іде назад тим самим стиком. Подія туди і запит назад — два стики, два рядки. На карті — і сховища, і зовнішні провайдери. Напрямок стрілки — найчастіша помилка карти: перевірте кожну самі — Ctrl+Shift+F за адресою чи шляхом виклику.

«Що буде при помилці» — з коду

Чи є повтори і скільки; що відповідає сервіс; чи дізнається про помилку той, хто викликав; чи дізнається людина. Стиків може бути більше чи менше трьох рядків шаблону — скільки знайдете.

Колонки таблиці стиків

Шапка — як у шаблоні integration-map.md, розділ 2.

| # | Хто → кого | Спосіб (webhook / REST-запит / файл / інше) | Ендпоінт чи місце | Які дані (поля) | Автентифікація чи підпис | Що буде при помилці (з боку того, хто викликає, і того, кого викликають) | Джерело (файл · функція, обидві сторони) |
|---|---|---|---|---|---|---|---|

6. Mermaid

Діаграми в С6 — текстом Mermaid у блоках ```mermaid усередині .md. Агент пише текст, ви звіряєте кожну стрілку з кодом, правку видно в diff. Діаграма має відкриватися хоча б в одному переглядачі. Приклади нижче — ілюстрації, не з демо-системи: вставте блок у будь-який .md і подивіться, як він малюється.

Де / що: flowchart · карта інтеграцій чи потоки даних · ілюстрація, не з демо-системи

```mermaid
flowchart LR
  A["Застосунок"] -->|"REST: сума"| O["Оплата"]
  O -->|"webhook: оплачено"| S["Магазин"]
  S -->|"записує замовлення"| D[("Замовлення")]
```

Очікуваний результат: Вузол — ["…"]; сховище даних — [("…")]; підпис стрілки — |"…"|; стрілка — від того, хто викликає, до того, кого викликають.

Де / що: flowchart TD · процес з умовами · L2 BA · ілюстрація, не з демо-системи

```mermaid
flowchart TD
  S(["Замовлення оформлено"]) --> C1{"Сума від 500 грн?"}
  C1 -->|"так"| A1["Доставка 0 грн"]
  C1 -->|"ні"| A2["Доставка за тарифом"]
  A1 --> E(["Клієнт бачить суму до сплати"])
  A2 --> E
```

Очікуваний результат: Ромб {"…?"} — умова з коду, з межею (включно чи ні); гілки «так / ні»; кінець гілки — що бачить користувач. Порядок перевірок — як у коді. Під діаграмою — кожне розгалуження → файл · функція.

Де / що: sequenceDiagram · alt … else · ілюстрація зі слайда 244, вигадана оплата

```mermaid
sequenceDiagram
    actor C as Клієнт
    participant A as Застосунок
    participant O as Сервіс оплати
    C->>A: сплатити 85,50 грн
    A->>O: POST /payments, amount 8550
    alt картку відхилено
        O-->>A: відмова
        A-->>C: «Оплата не пройшла»
    else оплачено
        O-->>A: успіх
        A-->>C: чек
    end
```

Очікуваний результат: ->> — запит, -->> — відповідь. alt … else … end — взаємовиключні гілки, кожна з умовою з коду.

Де / що: sequenceDiagram · loop і opt · ілюстрація, не з демо-системи

```mermaid
sequenceDiagram
    participant S as Магазин
    participant W as Склад
    participant M as Пошта клієнта
    loop для кожного товару в замовленні
        S->>W: зарезервувати товар
        W-->>S: зарезервовано
    end
    opt клієнт залишив email
        S->>M: лист із підтвердженням
    end
```

Очікуваний результат: loop … end — повтор; opt … end — крок, який може статися. У L3 BA — щонайменше 5 альтернативних гілок alt / opt / loop з коду, серед них повтори доставки події (loop) і недоступність даних отримувача.

Де / що: Де переглянути · будь-який один · діаграма має відкриватися хоча б в одному

gitlab.com — відкрити .md у своїй копії: блоки ```mermaid показано діаграмою
VS Code — розширення для перегляду Mermaid у прев'ю Markdown
mermaid.live — вставити текст діаграми: лише для демо-системи

Очікуваний результат: Діаграма відкрилася — запишіть, де саме: у звіт, розділ 4, а для L3 BA — і розділ 8. mermaid.live — публічний сервіс: робочі діаграми — лише за політикою компанії.

Де / що: Діаграма не відкривається · замініть <…>

Діаграма в <шлях до файлу> не відкривається, помилка: «<текст помилки>». Виправ лише синтаксис Mermaid; зміст і стрілки не змінюй.

Очікуваний результат: Типові причини — дужки, лапки чи «» у тексті вузла без лапок навколо, спецсимволи в підписах стрілок. Після правки відкрийте діаграму ще раз.

Синтаксис: на чому ламається

Текст вузла з дужками, двокрапкою чи «» — у лапках: A["текст (з дужками)"]. Підпис стрілки — у |"…"|. У sequenceDiagram не ставте крапку з комою в тексті повідомлення: Mermaid читає її як кінець рядка, і діаграма не відкривається з помилкою синтаксису. Перенос рядка в тексті вузла — <br/>.

Стрілки і блоки — коротко

Блоки alt, opt і loop можна вкладати один в інший; кожен закриває свій end.

flowchart LR · A -->|дані| B
sequenceDiagram · A->>B: запит · B-->>A: відповідь
alt умова … else інша умова … end — гілки
opt умова … end — може статися
loop умова … end — повтори
Діаграма проти коду

Що на діаграмі → що в коді (файл · функція) → збігається чи ні → що виправили. Перевіряйте напрямок кожної стрілки, умови на розгалуженнях і порядок кроків. Таблиця перевірки — у шаблонах карти інтеграцій і потоків даних, розділ 4.

Документація Mermaid

Сторінки flowchart і sequenceDiagram на mermaid.js.org; alt / opt / loop — на сторінці sequenceDiagram.

https://mermaid.js.org/syntax/flowchart.html
https://mermaid.js.org/syntax/sequenceDiagram.html

7. AS-IS ↔ TO-BE

Код — це AS-IS: що система робить зараз, а не що мала б. Дефект у коді виглядає так само, як правило: вирішити «правило це чи дефект» може лише власник — ви формулюєте питання. TO-BE — пропозиція, яка стає вимогою лише після рішення власника. Приклади нижче вигадані, не з демо-системи.

Де / що: Рядки AS-IS · таблиця вимог · приклад вигаданий

| ID | Правило мовою бізнесу | Умова → результат | Джерело (файл · функція) | Факт із коду / припущення |
|---|---|---|---|---|
| R-01 | Безкоштовна доставка — від 500 грн | Якщо сума від 500 грн включно → доставка 0 грн | orders/delivery.js · calcDeliveryFee | факт із коду |
| R-02 | Безкоштовна доставка — лише для нових клієнтів | Перевірки «новий клієнт» у коді немає: так каже лише коментар | коментар над calcDeliveryFee | припущення → питання власнику |

Очікуваний результат: Умова → результат — так, щоб за рядком можна було написати тест: конкретне значення, межа (включно чи ні), що станеться, код відповіді. «Факт із коду» означає «так працює», а не «так має бути».

Де / що: Магічне число · п'ять питань до кожного

Що означає — мовою бізнесу?
Межа включно чи ні?
Звідки, хто вирішив? — у коді зазвичай не сказано
Де ще в системі є це значення чи те саме поняття — зокрема в іншому сервісі?
Кого спитати — роль адресата?

Очікуваний результат: Агент знаходить число і показує рядок. Ви формулюєте питання з варіантами й адресатом. Вирішує власник — не агент і не аналітик.

Де / що: Де ще в системі · замініть <…>

Знайди в system/ усі місця, де є значення <число> або поняття «<назва поняття>», в обох сервісах: файл, функція чи назва значення в конфігу. Поясни, чи однаково їх розуміють. Нічого не змінюй.

Очікуваний результат: Перелік збігів з джерелами. Те саме поняття деінде з іншим числом чи іншим знаком порівняння (межа включно чи ні) — частий дефект; два сервіси, що по-різному розуміють одне поняття, — типове місце дефекту. Один збіг перевірте самі (Ctrl+Shift+F).

Де / що: Питання власнику · формат · приклад вигаданий

Ухвалити рішення: поріг безкоштовної доставки — 500 грн включно. Лишаємо, змінюємо чи прибираємо?
джерело: orders/delivery.js · calcDeliveryFee
адресат: власник продукту замовлень

Очікуваний результат: Питання таке, щоб на нього можна було відповісти коротко: вибрати один з варіантів, «так / ні» чи числом. У С6 адресати — ролі: власник продукту сповіщень, власник продукту посилок; пропозиція, що зачіпає обидва сервіси, — питання двом власникам.

Де / що: TO-BE · пропозиція, а не вимога · приклад вигаданий

| # | Пропозиція | Чому (яку проблему AS-IS лікує — посилання на R- чи M-) | Кого стосується (сервіс, роль) | Що треба вирішити власнику |
|---|---|---|---|---|
| T-01 | Винести поріг безкоштовної доставки в налаштування | M-01: число в коді без пояснення | сервіс замовлень · власник продукту замовлень | лишити 500 грн включно чи змінити |

Очікуваний результат: 3–5 пропозицій, кожна позначена як пропозиція. На діаграмі процесу — лише AS-IS; TO-BE — окремо.

Документ, код і власник

Документ каже, як задумали: пояснює «навіщо», але застаріває, неповний — або його немає. Код каже, що система робить зараз, — AS-IS: це єдине джерело, яке точно виконується, але дефект у ньому виглядає так само, як правило, і «навіщо» код не каже. Власник каже, як має бути, і вирішує «правило чи дефект?» — його треба спитати, з адресатом. Кожне твердження — з позначкою: факт із коду (файл і функція), припущення чи питання власнику.

Від коду до TO-BE

П'ять кроків — від того, що робить код, до того, що стане вимогою.

1. Код — що система робить зараз (AS-IS)
2. Правило мовою бізнесу: «умова → результат»
3. Факт чи припущення: видно в коді чи лише в коментарі, назві
4. Питання власнику «Ухвалити рішення: …» з адресатом
5. TO-BE — пропозиція; після рішення власника — у специфікацію, як у С4
Процес AS-IS: кожна гілка — умова з коду

Ромб — умова з коду, гілки підписано «так / ні», біля умови в тексті — файл і функція. Кінець гілки — що бачить користувач: код відповіді, статус, подія. Порядок — як у коді: коли не виконано кілька умов одразу, відповідь визначає та, що перевіряється першою. На діаграмі — лише код; TO-BE — 3–5 пропозицій окремо. Перевірка: одна гілка → файл і функція → рядок у VS Code.

Контракт AS-IS — без мовчазних виправлень

Те саме в OpenAPI: поведінку, схожу на дефект, описують у description «AS-IS: … ; TO-BE (пропозиція): …» або в x-as-is, а не мовчки «виправляють» у схемі. Тести QA2 перевірятимуть те, що робить код. Розділ 9.

8. BA · L2 і L3

L2 — вимоги модуля свого варіанту без документації. А «Вибір каналу і тихі години» (непарні варіанти) — system/services/notifications/channel.js, phone.js, templates.js, config.json. Б «Статуси і зберігання посилки» (парні) — system/services/parcels/parcels.js і parcels/config.json, а також parcels/events.js і notifications/templates.js: як сервіс сповіщень використовує ці дані. L3 — карта потоків даних між сервісами, data mapping усіх полів обох стиків — події про статус (webhook) і відповіді на запит за даними отримувача — і sequence-діаграма. Переадресація (redirect.js) — демо, не ваш модуль.

Де / що: L2 · термінал у корені копії · Windows і macOS

cp templates/requirements-recovery.md submissions/ваш-username/results/l2-ba-requirements.md

Очікуваний результат: Шаблон вимог у вашій теці: AS-IS, магічні числа, діаграма процесу, TO-BE, перевірка, відкриті питання.

Де / що: L2 · Claude Code у корені копії · замініть модуль, файли модуля з опису розділу вище і ваш-username

Відновлюємо вимоги модуля без документації. Модуль — <А «Вибір каналу і тихі години» / Б «Статуси і зберігання посилки»>: <файли модуля з опису розділу> і все, що вони викликають.
Використовуй лише system/ і submissions/ваш-username/. Інших тек submissions/ і examples/ не читай. Код не змінюй.
Заповни submissions/ваш-username/results/l2-ba-requirements.md за розділами цього файлу:
1) AS-IS: таблиця — ID, правило мовою бізнесу, умова → результат (що бачить користувач, код відповіді), джерело (файл · функція), «факт із коду» чи «припущення»;
2) магічні числа й неочевидні умови: що означає, де ще в системі є це значення чи те саме поняття — зокрема в іншому сервісі, що насторожило («правило чи дефект?»), питання власнику з адресатом-роллю;
3) Mermaid flowchart процесу модуля AS-IS з умовами на розгалуженнях; порядок перевірок — як у коді;
4) TO-BE: 3–5 пропозицій з обґрунтуванням, позначених як пропозиції, а не чинні вимоги.
Біля кожного твердження — файл і функція. Що не підтверджено кодом — «припущення».

Очікуваний результат: Заповнені розділи 1–4. Далі — розділ «Перевірка»: щонайменше 3 пункти «що агент сказав → що в коді → що виправили»: межі, числа, порядок перевірок, «завжди / ніколи», правила з коментарів.

Де / що: Демо 3a · слайд 253 · промпт із заняття дослівно · переадресація — демо, не ваш модуль L2 · у своїй копії замініть submissions/koldovsky/ на submissions/ваш-username/ — інакше агент запише файл у чужу теку

Відновлюємо вимоги там, де документації немає. Модуль — переадресація посилки: system/services/parcels/redirect.js і все, що він викликає. Використовуй тільки system/.
1) AS-IS: правила, які реально виконує код, мовою бізнесу. Таблиця: ID, правило, умова → результат (що бачить користувач, код відповіді), джерело (файл, функція), «факт із коду» чи «припущення».
2) Магічні числа й неочевидні умови — окремо: що означає, де ще в системі є це значення, кого спитати.
3) «Правило чи дефект?» — місця, де поведінка схожа на помилку або суперечить іншому модулю чи сервісу; для кожного — питання власнику.
4) Mermaid flowchart процесу переадресації AS-IS з умовами на розгалуженнях.
5) TO-BE: 3–5 пропозицій змін з обґрунтуванням; позначені як пропозиції, не як чинні вимоги.
Збережи в submissions/koldovsky/results/demo3-redirect-requirements.md. Код не змінюй.

Очікуваний результат: Зразок будови промпту: модуль і межа, п'ять пунктів, куди зберегти; для свого модуля — промпт вище. Перевірка за слайдом: біля кожного правила — файл і функція, факт і припущення розділено; гілки діаграми — з умовами, одну звірте у VS Code; 3–5 пропозицій TO-BE позначено як пропозиції.

Де / що: Демо 3a · друге повідомлення · слайд 253 · якщо агент не вийшов за межі модуля

Що отримає отримувач, якщо посилку переадресували, коли вона вже чекала у відділенні, а потім вона прибула в нове відділення? Простеж обидва сервіси, з джерелами.

Очікуваний результат: Прийом для свого модуля: те, що дізнається користувач, вирішує вже інший сервіс — попросіть простежити обидва сервіси, з джерелами.

Де / що: L3 · термінал у корені копії · Windows і macOS

cp templates/data-flows.md submissions/ваш-username/results/l3-ba-data-flows.md

Очікуваний результат: Шаблон потоків даних у вашій теці: карта потоків (DFD), data mapping, sequence, перевірка діаграм.

Де / що: L3 · Claude Code у корені копії · замініть ваш-username

Заповни submissions/ваш-username/results/l3-ba-data-flows.md за кодом system/ і розділами цього файлу.
Використовуй лише system/ і submissions/ваш-username/. Інших тек submissions/ і examples/ не читай. Код не змінюй.
1) Карта потоків даних — Mermaid flowchart у стилі DFD: джерела, сховища (де лежать дані), перетворення, споживачі; три потоки — подія про статус (webhook), дані отримувача (запит за даними), повідомлення (провайдер).
2) Data mapping усіх полів обох стиків: поле в сервісі посилок → поле в події чи відповіді → як його використовує сервіс сповіщень → куди потрапляє (шаблон тексту, вибір каналу); для кожного поля — тип і формат на кожному кроці, перетворення, що губиться чи ігнорується, ризик, джерело.
3) Mermaid sequenceDiagram з учасниками Оператор, parcels-service, notifications-service, провайдер повідомлень: основний сценарій і щонайменше 5 альтернативних гілок з коду блоками alt / opt / loop, серед них повтори доставки події (loop) і недоступність даних отримувача; під діаграмою — таблиця гілок: умова, джерело.
Біля кожного твердження — файл і функція. Що не підтверджено кодом — «припущення».

Очікуваний результат: Заповнені розділи 1–3. Далі — розділ 4: щонайменше 3 звірки діаграм із кодом, які ви робите самі, — наприклад, напрямок кожної стрілки.

Де / що: Data mapping одного поля · ілюстрація зі слайда 243, не з демо-системи

поле: сума до сплати
у джерелі: застосунок — 85,50 грн; у замовленні — 8550, ціле, копійки
на стику: API оплати — amount: 8550, currency: "UAH"
у споживача: чек і SMS — 85.5 грн
перетворення: копійки → гривні, / 100; кома → крапка
що губиться · ризик: не поділили — «8550 грн»; загублений нуль; валюту не передали

Очікуваний результат: Так — для кожного поля обох стиків. Головна колонка data mapping — що губиться дорогою. Ім'я отримувача розібрано на демо: у L3 потрібні всі поля.

Де / що: Перевірка діаграм · розділ 4 шаблону data-flows.md · щонайменше 3 рядки

| # | Що на діаграмі | Що в коді (файл · функція) | Збігається? | Що виправили |
|---|---|---|---|---|
| 1 | | | | |
| 2 | | | | |
| 3 | | | | |

Очікуваний результат: Що перевіряти: напрямок кожної стрілки — хто кого викликає; умову кожної гілки alt; що саме повторює loop і коли повтори закінчуються.

Модуль — свого варіанту

Модуль L2 BA — за номером варіанту: непарні — А, парні — Б. Файли модулів — в описі розділу; модуль Б — це ще й те, як сервіс сповіщень використовує дані посилки. Модуль чужого варіанту чи переадресація замість свого — бали за AS-IS обмежено, деталі — README, розділ «Бали».

Умова → результат, за якою можна писати тест

Не «перевіряє дані», а «якщо значення … від N включно → відмова, код …». Межі — включно чи ні — з коду, а не з відчуття. Порядок перевірок — як у коді: від нього залежить результат.

Потік даних — шлях одного поля

Де з'являється (введення, seed, інший сервіс) → як зберігається (сховище і формат: БД, файл, пам'ять) → як передається (стик і назва поля) → як перетворюється (обрізали, нормалізували, перерахували) → де використовується (текст, канал, рішення, звіт). Карта потоків даних (DFD, data flow diagram) — та сама картина для всієї системи: джерела, сховища, перетворення і споживачі; сховище в Mermaid — циліндр [("…")].

9. QA · L2 і L3

L2 — реєстр щонайменше 10 міжсистемних сценаріїв через стик, щонайменше 5 типів дефектів на стиках, матриця покриття і відкриті питання: основа для API-тестів на занятті QA2. L3 — контракт OpenAPI 3.1 для webhook POST /v1/events сервісу сповіщень: обробник — system/services/notifications/server.js, відправник — system/services/parcels/events.js. Контракт запиту за даними отримувача (callback) розібрано на демо — для L3 це не ваш стик; сценарії L2 через callback — можна.

Де / що: L2 · термінал у корені копії · Windows і macOS

cp templates/scenarios-register.md submissions/ваш-username/results/l2-qa-scenarios.md

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

Де / що: L2 · Claude Code у корені копії · замініть ваш-username

Ти — QA і готуєш основу для API-тестів. Заповни submissions/ваш-username/results/l2-qa-scenarios.md за кодом system/ і розділами цього файлу.
Використовуй лише system/ і submissions/ваш-username/. Інших тек submissions/ і examples/ не читай. Код не змінюй.
1) Реєстр — щонайменше 10 сценаріїв через стик (webhook чи callback): ID, стик, тип ризику, передумови (посилка з початкових даних seed/ чи свої дані), кроки — виклики API словами, один очікуваний результат на кожній стороні, джерело (файл · функція, обидві сторони), пріоритет. Очікуване AS-IS, схоже на дефект, — «підозра на дефект» і TO-BE питанням; не виправляй очікуване мовчки.
2) Щонайменше 5 типів дефектів на стиках: для кожного — де в коді підозра (файл · функція), що може статися мовою бізнесу, номери сценаріїв.
3) Матриця «стик × тип ризику» з непокритими клітинками і поясненням чому.
4) Відкриті питання: очікувані результати, яких код не визначає, з адресатом-роллю.

Очікуваний результат: Заповнені розділи 1–4 реєстру. Перевірте вибірково, як у розділі 4 шпаргалки «Файл і функція»: джерела на обох боках стику і по одному очікуваному результату на кожній стороні.

Де / що: Рядок реєстру · ілюстрація, не з демо-системи · вигадані магазин і оплата

S-01 · стик: webhook Оплата → Магазин · ризик: контракт, обов'язкове поле · пріоритет: високий
передумови: замовлення 1001 у статусі «очікує оплати»
кроки: сервіс оплати надсилає подію «оплачено» без поля orderId
очікувано · Оплата: отримує відповідь 400
очікувано · Магазин: замовлення 1001 без змін
джерело: Оплата · webhooks.js · sendPaid; Магазин · server.js · handlePaymentEvent
підозра на дефект → TO-BE: —

Очікуваний результат: Один очікуваний результат на кожній стороні — конкретний: код відповіді, поле, текст, запис, «повідомлення немає». Сценарій із двома-трьома очікуваними результатами розбийте на кілька.

Де / що: L3 · термінал у корені копії · Windows і macOS

cp templates/openapi-skeleton.yaml submissions/ваш-username/results/l3-qa-events-api.yaml

Очікуваний результат: Каркас OpenAPI 3.1 з підказками в рядках #: розкоментуйте paths і schemas за інструкцією в ньому. Відступи — пробілами, не табуляцією.

Де / що: L3 · Claude Code у корені копії · замініть ваш-username

Ти — QA і готуєш контракт для API-тестів. Стик — webhook POST /v1/events сервісу сповіщень. Обробник — system/services/notifications/server.js і те, що він викликає; відправник — system/services/parcels/events.js.
Використовуй лише system/ і submissions/ваш-username/. Інших тек submissions/ і examples/ не читай. Код не змінюй.
Заповни каркас submissions/ваш-username/results/l3-qa-events-api.yaml — OpenAPI 3.1, за підказками в ньому:
1) запит: заголовки, які читає обробник, і чи вони справді обов'язкові — як у коді, а не як «мало б бути»; схема тіла — усі поля, типи, формати, required, enum кодів статусу;
2) відповіді: кожен код відповіді, який повертає обробник, і кожен варіант тіла — зі схемою і прикладом; біля кожної — файл · функція;
3) AS-IS, а не «як має бути»: де поведінка схожа на дефект — description «AS-IS: … ; TO-BE (пропозиція): …» або x-as-is. Чого в коді немає — не вигадуй, пиши «у коді не визначено».

Очікуваний результат: Заповнений YAML. Далі — валідатор (картка нижче) і нотатки l3-qa-contract-notes.md.

Де / що: L3 · нотатки до контракту · та сама сесія

Склади submissions/ваш-username/results/l3-qa-contract-notes.md:
1) щонайменше 3 звірки «пункт контракту → файл · функція»: що в коді, збігається чи ні;
2) щонайменше 8 ідей API-тестів для QA2: позитивні, негативні, межові, дублі, підпис. Межові — точками під, на і над межами правил з коду; конкретні значення — з джерелом.
Код не змінюй.

Очікуваний результат: Звірки повторіть самі: відкрийте файл і функцію, які назвав агент. Сюди ж — який валідатор і що він показав.

Де / що: Swagger Editor · у браузері · за бажанням, підходить будь-який валідатор OpenAPI

editor.swagger.io → вставити весь вміст l3-qa-events-api.yaml

Очікуваний результат: Помилки показано ліворуч; немає — валідатор помилок не знайшов. Запишіть валідатор і результат у l3-qa-contract-notes.md: бал — за перевірку, а не за інструмент. Є помилки — покажіть агенту текст і попросіть виправити лише синтаксис. Це публічний сервіс: робочі контракти — лише за політикою компанії.

Де / що: Що перевірити в контракті · перед здачею

openapi: 3.1.0 — як у каркасі
заголовки: ті, що читає обробник; required — як перевіряє код
тіло: усі поля, типи, формати (date-time, шаблон ідентифікатора), required, enum кодів статусу
відповіді: кожен код і кожен варіант тіла — схема, приклад, джерело
схоже на дефект — «AS-IS: … ; TO-BE (пропозиція): …» або x-as-is
чого в коді немає — «у коді не визначено»

Очікуваний результат: Кожна відповідь → щонайменше один API-тест на QA2.

Де / що: AS-IS ↔ TO-BE у контракті · ілюстрація, не з демо-системи · вигаданий магазин

paths:
  /orders/{id}/discount:
    post:
      description: "AS-IS: знижку понад 100 % приймає, сума до сплати стає від'ємною. TO-BE (пропозиція): відхиляти з кодом 400."
      x-source: "orders/discount.js · applyDiscount"
      responses:
        '200':
          description: "Знижку застосовано; джерело: orders/discount.js · applyDiscount"
          x-as-is: "200 і для знижки понад 100 %"

Очікуваний результат: Поведінку описано як є, а пропозицію — окремо. Мовчки «виправляти» контракт не можна: тести QA2 перевірятимуть те, що робить код.

Де / що: Демо 3b · слайд 254 · промпт із заняття дослівно · callback за даними отримувача — демо, не ваш стик L3 · у своїй копії замініть submissions/koldovsky/ на submissions/ваш-username/ — інакше агент запише файл у чужу теку

Ти — QA і готуєш контракт для API-тестів. Стик — запит сервісу сповіщень до сервісу посилок за даними отримувача: GET /internal/parcels/{id}/recipient. Обробник — system/services/parcels/server.js, клієнт — system/services/notifications/recipient-client.js. Використовуй тільки system/.
1) OpenAPI 3.1 у YAML: шлях, параметри, відповіді з кодами і схемами (усі поля, типи, формати, приклади) — лише те, що є в коді. Чого в коді немає — не вигадуй, а пиши в description «у коді не визначено».
2) Як клієнт поводиться з кожною відповіддю (200, 404, таймаут, помилка мережі): що буде з повідомленням отримувачу і що побачить сервіс посилок.
3) 5 міжсистемних сценаріїв для цього стику: передумови, кроки через обидва сервіси, один очікуваний результат, джерело в коді.
YAML збережи в submissions/koldovsky/results/demo3-recipient-api.yaml, пункти 2–3 — у submissions/koldovsky/results/demo3-recipient-scenarios.md. Код не змінюй.

Очікуваний результат: Зразок будови: стик, обробник і клієнт, межа, три пункти, куди зберегти. У L3 QA — те саме для webhook POST /v1/events, де кодів відповідей більше. Перевірка за слайдом: YAML проходить валідатор, у ньому лише те, що є в коді, а замість вигаданих полів — «у коді не визначено».

Сценарій без сервісу посилок

Сценарій не обов'язково починати в сервісі посилок. Його можна описати й як прямий запит на POST /v1/events сервісу сповіщень — так, ніби подію надіслав інший відправник. Тоді в колонці «Очікуване — сервіс посилок» напишіть «не задіяно» або що зробив би відправник, отримавши таку відповідь.

Типи дефектів на стиках

Обирайте з переліку і додавайте свої. Тип без місця в коді цієї системи не зараховується: потрібна конкретна підозра з джерелом.

ідемпотентність і дублі
повтори й коди відповідей
зіставлення статусів
формати даних
часові пояси й дати
таймаути і тихі збої
підпис і автентифікація
прапорці функцій
стан у пам'яті
Матриця покриття «стик × тип ризику»

Рядки — стики з вашої карти інтеграцій L1, колонки — типи ризику з розділу 2 реєстру. У клітинці — номери сценаріїв або «—». Під матрицею — непокриті клітинки і чому: ризик не стосується стику, не встигли чи бракує даних.

Межові тести — під, на і над

Для кожної межі правила з коду — три точки: трохи нижче, рівно на межі і трохи вище. Значення — з джерелом (файл · функція). Приклад вигаданий: поріг безкоштовної доставки 500 грн включно → 499,99 грн, 500 грн, 500,01 грн. Пріоритет сценарію — за наслідком для отримувача чи оператора, а не за складністю тесту.

Запуск — за бажанням

Сценарії можна вивести з коду. Запустили систему — у звіті скажіть, які сценарії перевірили наживо і що побачили, а в кроках реєстру допишіть «перевірено: …». Як запустити — розділ 10.

10. Запуск · QA

BA систему лише читають. QA в С6 — за бажанням; на занятті QA2 запуск знадобиться. Потрібен Node.js 20 або новіший; npm install не потрібен — залежностей немає. Команди запуску — у теці system/: з кореня копії спершу cd system. Які ендпоінти є і які поля приймає кожен — з коду: це частина завдання. Тут — лише як запустити і надіслати запит.

Де / що: Термінал · перевірка Node.js

node --version

Очікуваний результат: v20 або новіша. Нижча версія чи «not recognized» — встановіть Node.js 20+ або не запускайте: сценарії можна вивести з коду.

Де / що: Термінал у корені копії · Windows і macOS · обидва сервіси одним вікном

cd system
npm start

Очікуваний результат: Сервіс посилок слухає порт 3001, сервіс сповіщень — 3002. Зупинка — Ctrl+C. Запити надсилайте з другого вікна терміналу.

Якщо не працює

Windows питає, чи дозволити Node.js доступ до мережі, — доступ не потрібен, можна відмовити. Замість npm start — node start.js. Порт зайнятий — остання картка розділу.

Де / що: Браузер · чи сервіси живі

http://localhost:3001/health
http://localhost:3002/health

Очікуваний результат: {"status":"ok"} на обох адресах.

Де / що: Windows — PowerShell у новому вікні, поки сервіси працюють · приклад з HOW-TO-RUN.md

Invoke-RestMethod http://localhost:3001/parcels/P-1001
Invoke-RestMethod -Method Post -Uri http://localhost:3001/parcels/P-1001/status -ContentType 'application/json' -Body '{"status":"IN_TRANSIT"}'

Очікуваний результат: Відповіді сервісу посилок. На код помилки (4xx, 5xx) Invoke-RestMethod у Windows PowerShell показує лише код, без тіла відповіді — тоді curl.exe -i (наступна картка).

Де / що: Windows — PowerShell · код і тіло будь-якої відповіді · лапки всередині JSON — з \

curl.exe -i -X POST http://localhost:3001/parcels/P-1001/status -H "Content-Type: application/json" --data '{\"status\":\"IN_TRANSIT\"}'

Очікуваний результат: Рядок статусу (HTTP/1.1 …), заголовки і тіло відповіді.

Де / що: macOS і Linux — Terminal · код і тіло будь-якої відповіді

curl -i -X POST http://localhost:3001/parcels/P-1001/status -H 'Content-Type: application/json' --data '{"status":"IN_TRANSIT"}'

Очікуваний результат: Те саме, що curl.exe -i на Windows: код, заголовки і тіло відповіді.

Де / що: Порт зайнятий · Windows — PowerShell у теці system/ · кожен рядок — в окремому вікні: одне вікно на сервіс

$env:PORT = "4001"; $env:NOTIFICATIONS_URL = "http://localhost:4002"; node services/parcels/server.js
$env:PORT = "4002"; $env:PARCELS_URL = "http://localhost:4001"; node services/notifications/server.js

Очікуваний результат: Сервіс посилок — на 4001, сервіс сповіщень — на 4002, і кожен знає адресу іншого; у запитах і /health тепер 4001 і 4002. У bash (macOS) — так само у двох вікнах: PORT=4001 NOTIFICATIONS_URL=http://localhost:4002 node services/parcels/server.js і PORT=4002 PARCELS_URL=http://localhost:4001 node services/notifications/server.js.

Почати з чистого стану

Сервіси пишуть дані в теку system/.data/ — у git вона не потрапляє. Щоб повернути початкові дані, зупиніть сервіси і видаліть теку .data/. Дані можна тримати й поза копією — тоді агент, який читає system/, не прийме їх за код чи початкові дані. Тека задається змінною DATA_DIR — приклад для PowerShell у теці system/ нижче; у bash: DATA_DIR=~/paket-data npm start. Почати з чистого стану — видалити цю теку.

$env:DATA_DIR = "$HOME\paket-data"; npm start
Безпека запуску

Запуск чужого коду — лише якщо розумієте, що він робить. Демо-система не має залежностей і працює на вашому комп'ютері: http://localhost:3001 і http://localhost:3002. Агент пропонує встановити пакети чи запустити щось, крім команд з HOW-TO-RUN.md і запитів до localhost:3001 / localhost:3002, — відхиліть.

11. Лише чат

Без агента, що читає теку, теж можна — наприклад, у браузерному чаті Claude. Код додаєте в розмову файлами, джерело — так само «файл і функція», файли результатів здаєте через браузер.

Де / що: Що додати в чат · проєкт завантажено ZIP-архівом (розділ 1)

system/services/parcels/ — файли .js і .json
system/services/notifications/ — файли .js і .json
почати з server.js обох сервісів, інші додавати, коли агент про них питає

Очікуваний результат: Так дешевше: у розмові лише те, що потрібно для відповіді.

Де / що: Чат не приймає стільки файлів · вставити текстом, кількома повідомленнями · для кожного файлу

### system/services/parcels/server.js
```js
<вміст файлу>
```

Очікуваний результат: Кожен файл — під заголовком зі шляхом: так агент зможе назвати файл і функцію біля твердження.

Де / що: Перше завдання в чаті · після файлів

Ти — аналітик, який уперше бачить цю систему. Документації немає, є лише код у файлах, які я додав, — кожен під своїм шляхом. Використовуй лише ці файли.
Поясни мовою аналітика, без коду: що робить кожен сервіс; сутності й статуси; ендпоінти — призначення і хто викликає; основний сценарій від зміни статусу посилки до повідомлення отримувачу кроками; щонайменше 5 правил; «Неочевидне».
Біля кожного твердження — файл і функція. Що не підтверджено кодом — познач «припущення». Бракує файлу для відповіді — назви його, я додам.

Очікуваний результат: Пояснення текстом — скопіюйте в results/l1-explanation.md (через браузер, розділ 12). Твердження перевіряйте в самому файлі: у редакторі або на gitlab.com, Ctrl+F.

Умови чату — рядок у звіті

Розділ 1 звіту: які файли коду додали — вкладеннями чи текстом; чи були ввімкнені пам'ять між розмовами чи інструкції проєкту, якщо ваш чат їх має.

Діаграми і файли

Чат пише текст Mermaid — ви перевіряєте, що діаграма відкривається (розділ 6). Файли — через браузер (розділ 12) або вміст у «Додаток» звіту.

12. Здача

Звіт — за шаблоном templates/c6-report.md у submissions/ваш-username/c6.md. Файли — у гілку c6 своєї копії (латиницею), потім merge request у koldovsky/ai-qa-ba-c6, гілка main. Не змінюйте system/ і не додавайте файлів правил агента й тек агента.

Де / що: Що здати · уся робота — у submissions/ваш-username/

ai-qa-ba-c6/                             # корінь копії — тут запускаєте агента
├── system/                              # демо-система — лише читати
└── submissions/ваш-username/
    ├── c6.md                            # звіт за шаблоном templates/c6-report.md
    └── results/
        ├── l1-explanation.md            # L1: пояснення системи + «Фокус-питання варіанту NN»
        ├── l1-integration-map.md        # L1: карта інтеграцій (таблиця стиків + Mermaid)
        ├── l2-ba-requirements.md        # L2 BA: вимоги модуля AS-IS, діаграма процесу, TO-BE
        ├── l2-qa-scenarios.md           # L2 QA: реєстр міжсистемних сценаріїв, дефекти на стиках
        ├── l3-ba-data-flows.md          # L3 BA: потоки даних, data mapping, sequence
        ├── l3-qa-events-api.yaml        # L3 QA: OpenAPI для POST /v1/events
        └── l3-qa-contract-notes.md      # L3 QA: звірка з кодом, ідеї тестів для QA2

Очікуваний результат: Імена файлів у results/ — рекомендація: зараховуються будь-які, якщо у звіті є посилання. Тема фінального проєкту — розділ 5 звіту, окремого файлу не треба. Не виходить файлами — вміст кожного файлу у звіт, розділ «Додаток», блоками коду.

Де / що: Звіт · термінал у корені копії · Windows і macOS

cp templates/c6-report.md submissions/ваш-username/c6.md

Очікуваний результат: c6.md у вашій теці — не в templates/ і не в корені. Розділи 1–6 і 9 — L1 для всіх; 7 — L2, 8 — L3 своєї ролі: підрозділ іншої ролі (7-BA чи 7-QA, 8-BA чи 8-QA) видаліть. Посилання на файли — повні, на gitlab.com, у гілці c6 вашої копії, наприклад https://gitlab.com/ваш-username/ai-qa-ba-c6/-/blob/c6/submissions/ваш-username/results/l1-explanation.md. Чернетку може скласти агент у results/c6-draft.md — ви переносите її в c6.md і перевіряєте кожне посилання і кожне твердження.

Де / що: Спосіб 1 · Git · термінал у корені клону · спершу пошта · замініть адресу на ту, що в Edit profile → Commit email

git config user.email "ваша-адреса@users.noreply.gitlab.com"

Очікуваний результат: Коміти підуть із прихованою адресою.

Якщо не працює

Не робіть комітів без цього кроку: локальний коміт бере пошту з налаштувань git — часто робочу, — і вона стане публічною у форку.

Де / що: Спосіб 1 · Git · у корені клону · замініть ваш-username

git switch -c c6
git add submissions/ваш-username
git status

Очікуваний результат: Гілка c6. У git status — лише файли з submissions/ваш-username/: без змін у system/, без файлів правил і тек агента.

Якщо не працює

Бачите зміни в system/ — поверніть їх командою git restore system/ і перевірте ще раз. system/.data/ у git не потрапляє — так і має бути.

Де / що: Спосіб 1 · Git · у корені клону

git commit -m "С6: моя робота"
git push -u origin c6

Очікуваний результат: Гілка c6 з'явилася у вашій копії на gitlab.com. Перевірте, що файли відкриваються в гілці c6, — посилання на них піде у звіт.

Де / що: Спосіб 2 · агент через GitLab MCP · замініть ваш-username

Відправ файли з теки submissions/ваш-username у нову гілку c6 моєї копії ваш-username/ai-qa-ba-c6 одним комітом

Очікуваний результат: Коміт піде від вашого акаунта з прихованою поштою (крок 0, розділ 1).

Де / що: Спосіб 3 · браузер, зокрема після ZIP · своя копія на gitlab.com · для кожного файлу

Code → Branches → New branch → c6 → Create branch → гілка c6 → + → New file → submissions/ваш-username/results/l1-explanation.md → вставити текст → Commit changes

Очікуваний результат: Теки з'являються самі з повного шляху в назві файлу. Коміт — у гілку c6.

Де / що: Code → Merge requests → New merge request: зліва — ваша копія і c6, справа — koldovsky/ai-qa-ba-c6 і main → Compare branches and continue → Title

С6 · ваш-username · варіант NN

Очікуваний результат: Шаблон опису C6, чек-лист → Create merge request. У Changes — лише файли з submissions/ваш-username/: без змін у system/, без файлів правил і тек агента, без чужих файлів.

Якщо не працює

Чужі файли в Changes — найчастіше форк зроблено з чужої копії. Приберіть чужі файли з гілки c6 або напишіть тренеру.

Шапка звіту

Прізвище та ім'я — як у списку учасників курсу, прізвище першим: їх, як і звіт, видно публічно. Варіант — той самий, що в С1–С5, 01–10. Роль — одна: від неї залежить, які L2 і L3 оцінюють. Рівень іншої ролі — за бажанням: зробили рівні обох ролей — оцінюють рівень своєї; зробили лише рівень іншої ролі — оцінюють його. У заголовку «С6 · Звіт · ваш-username» — свій username на gitlab.com.

**Прізвище та ім'я:** Прізвище Ім'я
**Варіант:** NN
**Роль:** QA / BA
**Виконані рівні:** L1 · L2 · L3
Що не можна змінювати

system/ — ні вам, ні агенту: систему заморожено, на ній будуються розбір і QA2. У корені копії — жодних файлів правил агента (AGENTS.md, CLAUDE.md, GEMINI.md) і тек .claude/, .agents/, .cursor/, .github/. У MR — лише ваша тека submissions/ваш-username/.

Чого уникати

Найчастіші помилки — перевірте себе перед здачею.

звіт не в submissions/ваш-username/c6.md, а в templates/… чи в корені
тека з іменем замість username; «submisions» з помилкою
агент, запущений у submissions/ваш-username/, а не в корені копії
«Прочитай увесь проєкт» — агент читає чужі роботи, а ви платите за непотрібне
зміни в system/; файли правил чи теки агента в корені копії і в MR
твердження «з коментаря» без перевірки коду; функція, яку ніхто не викликає, описана як робоча
фокус-питання чи модуль L2 BA чужого варіанту
переадресація як модуль L2 BA; контракт запиту за даними отримувача як стик L3 QA
контракт, що описує, «як має бути», а не що робить код
сценарій із двома-трьома очікуваними результатами замість одного на кожній стороні
чужі роботи чи опубліковані результати демо як вхід для агента
робочий код компанії — у будь-якому вигляді (розділ 2)
Строк і відгук

QA — вівторок, 3 листопада 2026, 23:59; розбір — на занятті QA1, 4 листопада. BA — вівторок, 10 листопада 2026, 23:59; розбір — на занятті BA1, 11 листопада: типові помилки без імен і найкращі роботи. Відгук з'являється в коментарях до вашого merge request; бали в коментарях не публікуються. Не згодні з відгуком — коментар у своєму MR; виправлення — у тому самому MR. Формальності — −1 за кожну, разом до −2: звіт не в submissions/<username>/c6.md, назва MR не «С6 · username · варіант NN», не вказано варіант чи прізвище та ім'я.

Безпека і публічність

Репозиторій і форки публічні: жодних корпоративних даних, коду, паролів, токенів, імен колег і посилань на внутрішні системи — ні в промптах, ні у звіті, ні в діаграмах. Username і профіль на gitlab.com можуть бути нейтральними; пошту в комітах приховайте (розділ 1).