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