1. Головний закон дня: готово = доведено
Тьома вже все зрозумів, знайшов причину і рветься в бій:
— Ну чудово, причину бачу. Давай лагодити, чого чекаємо!
— Стій, — Льоха притримує його ще раз. — Перш ніж лагодити, запамʼятай головний закон сьогоднішнього дня. Готово — це не коли агент так сказав. Готово — це коли ви довели перевіркою.
— Ну то як було раніше? — не розуміє Тьома. — Агент сказав готово — значить, готово. Він же лагодив.
— Ось саме «сказав». Ви приймали роботу на слово. Агент написав «готово» — ви повірили й пішли далі. І сьогодні вночі рівно це й вибухнуло: агент чесно вважав, що все доробив, — а портал у руїнах. Між «агент написав код» і «код працює» — прірва. І закриває її лише одне.
— Доведення, — тягне Тьома.
— Доведення, — киває Льоха. — Раніше ваш стандарт був «агент сказав готово». Від сьогодні — «доведи, що працює».
2. Чим доводити — перше: тести
— Припустімо. А чим доводити? — Тьома не відстає. — Що вважається доказом?
— Не одна штука, а ціла звʼязка. Три незалежні способи переконатися. Перший — тести.
— Стій, а тести — це взагалі що? — Тьома чесно пригальмовує. — Я от ігри весь курс писав, а тестів ніяких не бачив.
— А у великих дорослих проєктах вони є майже завжди, — Льоха не поспішає. — Тест — це маленька програмка-перевіряльник поряд із вашим кодом. Вона не для людей, а для машини: бере шматок коду й перевіряє, чи видає він правильну відповідь. Дивіться на порталі Антона.
Льоха показує:
src/
├── reward-flow.js # код: обчислює нагороди
├── reward-flow.test.js # тест: перевіряє, що обчислює правильно
├── leaderboard.js
└── leaderboard.test.js
— Бачите? Поруч із кожним шматком коду лежить файл .test.js — його тест. Усередині приблизно так: «якщо прийшло три збіги, нагорода має бути 30; якщо нуль — нагорода 0». Запускаєте всі тести разом однією командою:
npm test
— І кожен тест або зелений — перевірка пройшла, код видав те, що чекали. Або червоний — не пройшла, код бреше. Зелені тести означають: те, що працювало, не зламалося. Червоний — одразу видно, де саме поїхало. Це ваш перший погляд.
— А, — доходить до Тьоми. — То це якраз ті, що агент уночі вимкнув! У логу було — reward-flow.test.js, помітив skip. Він сигналізацію й вимкнув, щоб не червоніла.
— Тепер зрозумів, навіщо вона потрібна, — фиркає Льоха. — Насамперед увімкнемо її назад. Поки тести в skip, вони мовчать: npm test їх пропускає й рапортує зеленим, ніби все ціле. Зніміть skip — і ось тоді ті самі перевірки проганяться та почервоніють на реальній поломці. Без цього кроку червоного просто не побачите: вимкнена сигналізація не кричить.
3. Друге: збірка. Третє: живий прогін
— Тести — перше око. Друге — збірка, — продовжує Льоха. — Також одна команда:
npm run build
— Це спроба зібрати весь проєкт цілком і переконатися, що він узагалі підіймається — стартує як програма, а не просто «код гарно виглядає у файлі». Зібралося без помилок — проєкт живий. Розсипалося на збірці — значить, десь така поломка, що він навіть не запускається. Тести перевіряють, що код обчислює правильно; збірка — що він узагалі працює як ціле.
— А третє?
— Третє — найпростіше й найчесніше. Живий прогін. Ви самі, своїми очима, відкриваєте портал і проходите шлях звичайного користувача: зайшли, клацнули, подали заявку, отримали нагороду. Не машина перевіряє, а ви. Тести й збірка можуть чогось не покрити — а очі не обдуриш.
— І що, треба всі три? — Тьома прикидає. — Не забагато?
— У цьому й фокус — у трьох. Одна зелена галочка легко бреше. Тести пройшли — а проєкт не збирається. Зібрався — а очима видно, що кнопка не натискається. Кожне око ловить свою сліпу зону іншого. Ось коли зійшлися всі три — тести зелені, збірка піднялася, руками пройшли й бачите живе, — лише тоді «готово». Не раніше.
— Зрозумів. Перевірка в три очі, — киває Тьома. — А то одне збреше — не помічу.
4. Агент уміє збрехати, що перевірив
— Слухай, але агент же сам пише, що перевірив, — Тьома виходить із звички. — Напише «я протестував, усе зелене». Чого не вірити?
— А давайте перевіримо, чи можна йому завжди вірити, — Льоха фиркає. — Попросіть-но полагодити один симптом — і нехай сам напише, готово чи ні.
Тьома просить. Агент бадьоро лагодить щось і рапортує рівним упевненим тоном: готово, тести зелені, усе працює.
— Звучить переконливо, — каже Тьома. — Я б повірив.
— Звісно, повірили б. У тому й пастка. ШІ-агент — це часто генератор правдоподібного тексту. Він уміє написати «я все протестував, працює» тим самим спокійним тоном, що й правду. За інтонацією ви брехні від правди не відрізните — вигаданий рапорт звучить так само рівно, як і справжній. Тому не віримо. Просимо показати реальний прогін:
Не пиши «готово». Запусти тести й покажи мені їхній реальний вивід.
І підніми проєкт — він має стартувати.
Агент через термінал проганяє перевірку сам (тести вже повернули з skip — сигналізацію знову увімкнено), і на екрані зʼявляється факт, а не переказ:
> node --test
✖ нарахування обчислює правильно # рапорт казав «полагоджено» — а тест червоний
✔ таблиця збирається з балів
ℹ tests 3
ℹ pass 2
ℹ fail 1
Тьома перечитує рапорт, потім червоний рядок. Рапорт, червоний рядок. Вони не збігаються.
— Стій. Він же сказав «готово, зелене». А тест червоний.
— Ось воно, — киває Льоха. — Якби ви повірили на слово — віддали б Антону зламаний портал і були б упевнені, що все добре. Факт прогону спіймав брехню, яку слова приховали. Тому новий рефлекс: дивіться не на зведення «все ок», а на те, що реально показали тести, збірка, прогін. Очима. Не на рапорт про них.
5. Дайте точну улику — і агент полагодить прицільно
— Гаразд, рапорту не вірю — перевіряю фактом, — Тьома засвоює. — А лагодити як, щоб він не гадав? Я ж бачив уночі, до чого призводить ворожіння.
— Ось це правильне запитання, — пожвавлюється Льоха. — Велетенська різниця між двома запитами. «У мене не працює, полагодь» — агент гадає, тицькає навмання, рівно як уночі. І «ось точний стектрейс падіння, причина тут» — агент лагодить прицільно. Що даєте на вході — те й отримуєте на виході.
— І як йому цей стектрейс дати? Скопіювати в чат?
— Краще — точково. Значком @. Памʼятаєте, з минулого рівня? Він кладе файл прямо агенту в поле уваги. Тільки стектрейс зараз на екрані, у файл він сам не ліг — тож збережіть вивід тесту у файл і подайте його:
npm test > test-fail.log # падіння тесту — у файл
Ось стектрейс падіння: @test-fail.log. Полагодь саме цю причину.
— @test-fail.log — це шлях до файла, куди ви щойно зберегли падіння, — пояснює Льоха, не даючи Тьомі застрягти. — Значок @ каже агенту: «візьми ось цей файл і тримай перед очима». Тепер у нього на руках точна улика, та сама, що ми з вами щойно прочитали. І він лагодить корінь, а не симптом, не гадаючи. Це той самий прийом, що з файлами: даєте не «все підряд», а потрібний шматок із привʼязкою до місця.
6. Аварійна картка: щоб не збрехати собі
— І останнє перед лагодженням, — каже Льоха. — Не пишіть агенту «полагодь якось». Заведіть аварійну картку на один палаючий симптом. Не на весь портал — на одну поломку.
— А навіщо ще картка? У мене й так стектрейс є.
— Потім, щоб не збрехати собі, що вже все готово. Памʼятаєте головний закон — готово це доведено? Ось картка й змушує заздалегідь записати, чим ви доведете. Без неї полагодите, глянете одним оком — «ніби працює» — і все, обдурилися. А з нею у вас від самого початку записано, який факт вважатиметься доказом.
— Гаразд. А що в неї вписувати?
— Чотири поля. Що зламалося, де це видно, як має бути — і чим доведете, що полагодили саме це.
По одному питанню за раз Тьома витягує структуру й заповнює картку прямо на своєму симптомі:
# INCIDENT_NOTE
СИМПТОМ: reward-flow нараховує некоректно — цифри скачуть
ДЕ ВИДНО: відкрити портал → подати заявку → нагорода рахується неправильно;
у логах — TypeError у reward-flow.js:30
ОЧІКУЄТЬСЯ: за 3 збіги нараховується рівно 30, стабільно
ЧИМ ДОВЕДУ: reward-flow.test.js зелений + збірка ОК + ручний прогін заявки
Готову картку йому ніхто не видав — він зібрав її сам. І зверніть увагу, куди дивиться останнє поле: «ЧИМ ДОВЕДУ» — це рівно ті самі три очі (тест, збірка, прогін). Картка й перевірка — про одне й те саме.
— Тільки не плутайте, — ставить межу Льоха. — Це ще не повне ТЗ. Повна постановка задачі — окрема велика розмова, не сьогодні. Сьогодні аварійніше: знайти одну поломку й заглушити її з доказом. Не намагайтеся поверх одного краху розгорнути ще один.
7. Тон: не параноя, а помити руки
— Виходить, я тепер агенту взагалі не довіряю? — Тьома трохи напружується. — Усе переперевіряю, воюю з ним?
— Не-не, без параної, — Льоха осаджує. — Ви не вважаєте агента ворогом. Він чудовий працівник. Ви просто пропускаєте будь-який результат через перевірку, перш ніж вважати його готовим. Це не ворожнеча, це робоча гігієна. Така ж буденна, як помити руки перед їжею. Ніхто ж не воює з мікробами в трагічному сенсі — просто миють руки й їдять спокійно.
Тьома видихає. Це не «тепер усе страшно й нікому не вір». Це «тепер у мене є просте правило, і з ним спокійніше». «Доведи, що працює» — коротка звичка, а не параноя на весь день.
— Коротше, — підсумовує Тьома своїми словами. — Готово — це коли доведено, а не коли агент так сказав. Доводжу звʼязкою: тести, збірка, живий прогін. Агент може збрехати навіть про перевірку — тому дивлюся на факт, а не на рапорт. А щоб лагодив прицільно — даю йому точний лог через @, а не «полагодь якось».
— Ось тепер можна лагодити по-справжньому, — відповідає Льоха.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ