Як працюють AI-агенти

Передавання роботи між людьми, агентами й сеансами

У попередніх главах ми розібрали, як агент діє через інструменти, чому контекст має межі й де шукати авторитетний запис. Ця глава поєднує ці теми в…

Глава 26Заморожене українське видання

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

Передавання роботи, або handoff, — це не просто підсумок розмови. Воно переносить п’ять речей:

  1. Мету: якого результату прагнемо і навіщо.
  2. Стан: що фактично зроблено, що ні й де робота зупинилася.
  3. Джерела: які документи, записи, файли та ревізії підтверджують опис.
  4. Обмеження: що не можна змінювати, повторювати чи виконувати без окремого рішення.
  5. Наступне рішення: яку найближчу дію може безпечно зробити наступник і що має визначити людина.

Якщо одна з цих частин пропущена, наступник мусить вгадувати. Якщо підсумок гладко звучить, але не містить шляху до доказів, наступник не може відрізнити перевірений факт від упевненого переказу.

Handoff потрібний не лише тоді, коли вичерпалося вікно контексту. Він корисний під час передачі між людьми чи агентами, після перерваної зовнішньої дії, перед незалежним оглядом, наприкінці зміни, під час інциденту або після паузи на продуктовому рішенні. Обсяг запису має відповідати ціні помилки: дрібне читання файла потребує короткої нотатки; операція з записом, грошима, персональними даними, міграцією або випуском — чіткішого журналу стану й повноважень.

26.1. Що саме переходить до наступника

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

Що передається Що треба назвати Чого не можна припускати
Розмова або контекст Ідентифікатор сеансу, якщо він існує; стислий опис мети; найважливіші рішення й точні посилання. Що історія буде повністю завантажена, не стиснута або видима іншому продукту чи агенту.
Файли й робоча копія Репозиторій, гілка, каталог або worktree; ідентифікатор останнього коміту; незбережені зміни; власник робочої копії. Що новий сеанс відкриє той самий каталог або побачить ті самі незакомічені файли.
Зовнішній стан Jira-задача, pull request, результати безперервної інтеграції, записи системи, середовище та час перевірки. Що зовнішній запис залишився вчорашнім, а гілка не рухалася після огляду.
Робоча відповідальність Хто зараз виконавець, хто наступний власник, чи прийняв він роботу, чи лишається попередній виконавець активним. Що передане повідомлення саме по собі зупинило попереднього агента або заблокувало спільну гілку від паралельних змін.
Повноваження Дозволені наступні кроки, заборонені дії та рішення, які має підтвердити відповідальна людина. Що попереднє «можна» поширюється на інший ресурс, середовище, ревізію або дію.

У різних продуктів збережений сеанс працює по-різному. Станом на 23 вересня 2026 року офіційна документація інтерфейсу командного рядка (CLI, Command-Line Interface — інтерфейс командного рядка) Codex описує повернення до збереженої розмови командою codex resume; сучасна документація Claude Code окремо описує /resume, /clear і /compact; документація OpenAI Agents API (Application Programming Interface — програмний інтерфейс застосунку) описує власний тип довготривалого сеансу, відновлення, делегування та керування контекстом. Ці механізми належать до конкретних продуктів і runtime. Вони не доводять, що у новому сеансі збігаються каталог, гілка, облікові дані, мережевий доступ або поточний стан зовнішньої системи (OpenAI, Codex CLI; Anthropic, Claude Code commands; OpenAI, Agents API).

Навіть відновлена розмова не обов’язково відновлює середовище. Компактація може залишити висновок, але загубити важливий виняток або точні результати інструмента. Підсумок субагента може містити його висновки, але не повний контекст батьківської розмови. Наприклад, документація Claude Code вказує, що пам’ять основної розмови не завантажується автоматично в субагента, а продовження завершеного субагента має власні умови. OpenAI окремо описує, як керований Agents API зберігає та узагальнює сесію, і як контекст компактується незалежно в кореневого агента та його субагентів, коли ввімкнено багатоагентний режим. Це приклади саме цих інструментів, а не спільний стандарт кожної системи (Anthropic, Create custom subagents; OpenAI, multi-agent guide).

Практичне правило просте: передавати не здогад про те, що «нова сесія все пам’ятає», а короткий запис, який можна перевірити. Якщо продукт підтримує відновлення, воно заощаджує час на відтворенні історії; handoff усе одно закріплює стан і наступну дію.

26.2. Мінімальний handoff-пакет

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

Поле Що записати
Картка задачі Стабільний ключ і назва задачі; авторитетне джерело вимог; короткий результат, якого очікуємо.
Межі роботи Що входить у scope, що явно не входить; які користувацькі, технічні чи часові умови визначають результат.
Знімок стану Дата й час; хто передає; хто має прийняти; що завершено, триває, не починалося або заблоковано.
Рішення Вибраний варіант, його підстави та ідентифікатор запису рішення, якщо він є. Відокремити затверджене рішення від робочої рекомендації.
Змінені матеріали Файли, міграції, документація, контракти, записи й тимчасові артефакти; точна гілка або коміт, а для роботи без коміту — каталог і список змін.
Зовнішні посилання Посилання на Jira, pull request (PR, Pull Request — запит на включення змін), огляд, коміт, запис архітектурного рішення (ADR, Architecture Decision Record), завдання чи артефакт перевірки.
Перевірки та їхні докази Точна команда чи процедура, дата, середовище, ревізія, фактичний результат, невдалий або пропущений обсяг.
Середовище Робочий каталог, гілка, активні процеси, порти, база чи пісочниця, статус міграцій, мережеві залежності та те, що необхідно перезапустити або не чіпати.
Побічні ефекти Зовнішні записи чи дії, які виконали, могли виконатися або не виконували; унікальний ідентифікатор операції, якщо застосовується.
Межа повноважень Що наступник може робити сам, що потребує дозволу, а чого робити не можна. Не передавати секрети.
Наступна дія Одне найближче дієве завдання, передумови, очікувана відповідь або умова зупинки.
Що невідомо Питання, невизначеність, причина blocker’а та хто може її вирішити.

Факти, припущення, рекомендації й невідоме

Читачеві треба легко побачити, наскільки сильне кожне твердження. Розділяйте чотири категорії.

  • Факт — безпосередньо спостережений стан із джерелом. Наприклад: «На commit 8e14c6… команда npm test -- --runInBand повернула код 0 о 14:12 за часовим поясом Europe/Oslo; повний вивід у workflow run 91504». Цей факт обмежений командою, часом, гілкою та ревізією.
  • Припущення — правдоподібне пояснення, ще не підтверджене. Наприклад: «Здається, інтеграційне середовище використовує ту саму версію схеми, що й тестове». Треба додати, як перевірити або що залежить від цього.
  • Рекомендація — запропонований наступний крок, але не рішення власника вимоги. Наприклад: «Пропоную не виконувати міграцію до підтвердження вікна сумісності».
  • Невідоме — питання, на яке наявні джерела не відповідають. Наприклад: «Не встановлено, чи погодив власник даних повторну обробку транзакцій із вересневої черги».

Так само відділяйте власне слово від фактів: «Агент заявив, що перевірки пройшли» — це факт про повідомлення агента. «Перевірки пройшли» — твердження про виконання команд або CI (Continuous Integration — безперервна інтеграція). Для другого потрібне посилання на результат і ревізію, а не тільки переказ.

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

Коротка форма

Цей шаблон можна скоротити для невеликої зміни. Не залишайте поля з вигаданими значеннями; якщо невідомо — так і напишіть.

Знімок: [дата, час, часовий пояс]
Від кого / кому: [виконавець → наступний власник]
Задача / мета: [ключ, посилання, очікуваний результат]
Область / поза областю: [що входить] / [що не змінювати]
ФАКТИ: [спостережений стан, джерело, час і точна ревізія]
ЩЕ НЕ ЗРОБЛЕНО: [що лишилося або не запускалося]
ПРИПУЩЕННЯ / НЕВІДОМЕ: [що не підтверджено і як це перевірити]
Рішення: [що схвалено, ким/де/коли; або «не вирішено»]
Робоча копія: [репозиторій, гілка, worktree, HEAD, незбережені зміни]
Посилання: [задача, PR, ADR, джерела, артефакти перевірок]
Перевірки: [команда/процедура, результат, середовище, ревізія, обмеження]
Зовнішні дії: [виконано / могло відбутися / не виконано, ідентифікатори]
Середовище: [процеси, порти, залежності, база/пісочниця, міграції]
ПОВНОВАЖЕННЯ: [дозволено; заборонено; що чекає на людину]
НАСТУПНИЙ КРОК / УМОВА ЗУПИНКИ: [дія, передумова, коли зупинитися]

Це не форма, яку треба механічно заповнювати для кожної дрібниці. Її користь у тому, що вона нагадує про області, де контекст часто губиться. Для простого завдання на читання достатньо мети, шляху до файла й відповіді. Для зміни, яка може вплинути на користувачів, дані або гроші, посилання й межа повноважень важливіші за стислий текст.

26.3. Робоча копія, зовнішні стани й точна ревізія

Статус «готово» залежить від того, що саме готово. У розробці треба розрізняти локальний diff, коміт, pull request, схвалення, злиття й розгортання. Це різні стани й різні джерела доказу. Завершений Jira issue не доводить, що зміни є у головній гілці; зелений локальний тест не доводить, що перевірявся саме PR; звіт агента про створення запису не доводить, що зовнішній сервіс його зберіг.

GitHub пояснює різницю між посиланням на поточний файл у гілці й постійним посиланням на конкретний коміт: гілка рухається, а commit URL (Uniform Resource Locator — уніфікований локатор ресурсу) веде до конкретного вмісту. Артефакти GitHub Actions також прив’язані до конкретного запуску workflow та містять head_sha (ідентифікатор коміту, побудований за алгоритмом Secure Hash Algorithm), а за потреби — контрольний digest. Отже, handoff на огляд краще містить повний commit і ідентифікатор перевірки, ніж тільки назву гілки або слово «latest» (GitHub, permanent links; GitHub, workflow artifacts API; GitHub, validating artifacts).

Зразок для перевірки джерел:

Твердження Посилання та точність Як позначити
«У Jira досі ті самі критерії» Ключ задачі й дата/час свіжого читання; за зміни критеріїв — редакція або історія. Факт станом на конкретний час.
«Гілка містить потрібну зміну» Ім’я репозиторію, гілка і повний commit, бажано permalink на файл чи diff. Факт про цю ревізію.
«CI зелене» Ідентифікатор запуску/перевірки, head_sha, перелік перевірок і результат. Факт лише про цей запуск і SHA.
«Виробництво вже оновлене» Ідентифікатор артефакту/версії, цільове середовище і перевірений контрольний запит. Не робити висновок із merge або плану деплою.
«Міграцію застосовано» Журнал міграцій, середовище, версія і підтвердження стану бази. Не виводити це з того, що файл міграції існує.

Важливий результат треба описувати в парі: що саме перевіряли і яку саме ревізію перевіряли. Якщо коміт змінився після CI чи review, знімок handoff застарів: наступник має з’ясувати, які саме результати ще застосовні.

Коли незбережені файли треба передати, не називайте лише каталог. Перелічіть репозиторій, гілку, абсолютний шлях worktree, git status --short або відповідний перелік змінених файлів, тимчасові артефакти й того, хто має право редагувати ці файли. Якщо безпечніше, створіть коміт із дозволу власника; якщо зміни залишаються незакоміченими, чітко вкажіть, що наступник має продовжувати з тієї самої робочої копії. Не запускайте двох виконавців паралельно в одній робочій копії без узгодженого власника: незаплановане перетирання змін — теж втрата handoff.

Публічний приклад зі світу розробки може допомогти відрізнити практику від теорії. У зафіксованому коміті b57baab66fee857b58e3f0e58048f9342bf314cb автор відкритого репозиторію session-handoff описує запис рішень, архів сеансів, конкретну інструкцію для наступного сеансу, майбутній список роботи та звірку посилань на PR і гілки з фактичним Git/GitHub станом (файл README (Read Me — «прочитай мене») на точній ревізії: переглянути файл). Це приклад інструмента й опис його автора, а не незалежна оцінка результативності чи рекомендація копіювати його семифазний workflow.

26.4. Побічні ефекти, незавершені операції та людські межі

Кожна дія з наслідком поза повідомленням потребує запису стану. Такими діями є створення задачі, зміна бази, відправлення повідомлення, видача доступу, запуск міграції, зміна гілки, merge або deploy. В handoff достатньо зафіксувати, що відомо: операцію не починали; запит надіслали, але відповіді немає; запис створено з ідентифікатором; операція повернула помилку; чи перевірено наслідок повторним читанням.

Після невизначеного результату не повторюйте дію наосліп. Тайм-аут може означати, що відповідь загубилась після успішного запису, а не те, що запису немає. Перед повтором наступник перевіряє систему обліку, шукає ідентифікатор операції, розглядає чи є в API механізм ідемпотентності та звіряє джерельну подію з поточним станом. Якщо доказу недостатньо, він зупиняється або ставить питання відповідальній людині. Ця дисципліна розвиває відмінність між повідомленням, викликом інструмента, результатом і незалежно прочитаним станом із глави 23.

Застосовуйте короткий журнал побічних ефектів:

Дія Стан Підтвердження Що робити далі
Запит на запис відправлено, відповідь втрачено Результат невідомий Тайм-аут або перерване з’єднання; запис ще не перечитано. Спочатку прочитати систему-джерело; не повторювати.
Задачу створено Виконано Стабільний Jira key, прочитаний назад із Jira. Додати ключ у handoff, повторно не створювати.
Міграцію підготували, але не запускали Не виконано У середовищі немає нового запису історії міграцій. Не запускати без потрібної перевірки та схвалення.
API відхилив запит до запису Відхилено Код помилки й відповідь; правило конкретного API підтверджує, що запис не створився. Виправити передумову або передати blocker.

Якщо операція має ключ ідемпотентності, передавайте не секретний ключ доступу, а саме службовий ідентифікатор запиту та межі його повторного використання. Унікальний ключ операції допомагає уникнути дубля, але тільки якщо сервіс справді обробляє його за документованими правилами. Не кожна база чи зовнішній сервіс має таку гарантію; не виводьте її з назви поля.

Handoff не повинен містити пароль, токен, приватний ключ або приховані значення змінних оточення. Передавайте назву схваленого секретного сховища, роль чи процедуру доступу, якщо вони потрібні наступнику, та їхній обсяг. Не вставляйте секрет у командний журнал, приклад, diff або посилання. Якщо лог уже міг його розкрити — зафіксуйте ризик, обмежте поширення й дійте за процедурою безпеки; не копіюйте витік у новий handoff.

Дозвіл — не частина пам’яті виконавця. Здатність мати інструмент чи права запису не означає, що будь-який запис або запуск погоджено. Запишіть: «можна читати гілку, локально правити й відкрити PR; не можна зливати, виконувати виробничу міграцію чи змінювати тариф» або іншу точну межу. Раніше дане схвалення варто підтвердити в актуальному канонічному записі та звірити з тим, що саме воно охоплює. Існуючий handoff — джерело контексту, а не спосіб надати відсутній людський дозвіл.

26.5. Наступник перевіряє свіжість до дії

Handoff — знімок, а не вічне дзеркало. Між його створенням і прочитанням можуть змінитись критерії, коміт, стан запису, гілка, секрети, права, процес або зовнішня залежність. Перед наступною дією звірте джерела, від яких вона залежить.

Мінімальна перевірка на старті:

  1. Звірити мету і вимоги. Відкрити повний issue/специфікацію, перевірити критерії та їхню історію. Якщо формулювання змінилося після snapshot, оновити scope, не приховувати різницю.
  2. Звірити код і робочу копію. Переконатися в правильному репозиторії, worktree, гілці, HEAD (поточний коміт гілки) і статусі незбережених файлів. Порівняти commit у handoff з фактичним.
  3. Звірити огляд і автоматичні перевірки. Відкрити саме той PR і перевірити, чи його HEAD (поточний коміт гілки) збігається з ревізією, на якій пройшли наведені тести або review. Якщо ні — не називати старий результат чинним для нової ревізії.
  4. Звірити зовнішні дії. Перечитати запис, статус міграції, чергу, розгортання чи транзакцію з джерела, яке є авторитетним саме для цього стану.
  5. Звірити середовище й доступ. Переконатися, що те саме середовище активне, а потрібні права лишаються чинними. Не передавати й не використовувати секрет, значення якого походить тільки зі старого тексту або журналу.
  6. Звірити blocker і власника рішення. Відкрити питання, яке було невідомим; перевірити, чи відповіла відповідальна людина або змінився план.

Чим серйозніший наслідок, тим ближча до дії має бути перевірка. Перед тим як продовжити читання коду, може бути достатньо звірити гілку й вимогу. Перед повторним записом перевірте поточний запис. Перед merge перевірте PR HEAD, diff, review і необхідні статуси зараз; не покладайтеся на green, зафіксований у вчорашньому handoff.

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

26.6. Передавання роботи на незалежний огляд

Авторський звіт і рецензія мають різні цілі. Автор пояснює задум і контекст. Рецензент перевіряє критерії та змінений артефакт. Якщо йому передати тільки висновок «усі тести пройшли», він може повторити впевненість автора, а не оцінити зміну.

Пакет для рецензента містить:

  • точний issue і його критерії приймання;
  • точний pull request або commit, base і head;
  • повний diff, файли й межі змін;
  • суміжні контракти, схему чи запис архітектурного рішення, що впливають на поведінку;
  • посилання на журнали перевірок, запуски CI та їхній head_sha;
  • пропущені тести, відомі ризики, припущення та невирішені питання;
  • конкретні запитання: наприклад, чи збережено історію, чи можливий повтор запису, чи сумісний контракт зі старими даними.

Звіт «я перевірив повний diff» теж має посилатися на конкретний diff і ревізію. Якщо рецензент не має доступу до джерела, він має сказати «не можу перевірити» замість виводу за чужим переказом. Водночас автор не повинен прибирати невдалий тест, вразливість чи обмеження, щоб рецензент залишився «незалежним»: незалежність означає окреме оцінювання доказів, а не навмисно неповний контекст.

Handoff на огляд — це запит на оцінку, не автоматичне схвалення чи дозвіл зливати. Автор може сказати: «Зверни увагу на зворотну сумісність API»; він не вирішує за рецензента, що критерій виконаний. Рецензент має доступ до первинного джерела, може відтворити перевірки в межах погодженого середовища і має право повернути зміну з конкретним блокером.

Офіційний приклад OpenAI Cookbook про робочий процес Codex CLI та Agents SDK (Software Development Kit — комплект засобів розробки програмного забезпечення) описує керівного агента, який делегує обмежену роботу й перевіряє наявність потрібних файлів до наступного переходу. Це допоміжна практична схема з конкретного навчального прикладу, а не вимога використовувати п’ять ролей або саме той SDK у кожному проєкті (OpenAI Cookbook, Building Consistent Workflows). З неї корисно взяти принцип: перед наступним етапом перевірити переданий результат, а не лише повідомлення, що робота нібито завершена.

26.7. Увага команди й вартість переривань

Вичерпний контекст — не та сама річ, що корисний контекст. Якщо кожен виконавець мусить кожні кілька хвилин звітувати, перечитувати десятки розлогих повідомлень або здогадуватися, чи може безпечно рухати спільну гілку, сама процедура handoff створює нові переривання.

У Peopleware: Productive Projects and Teams Том ДеМарко й Тімоті Лістер присвячують окремий розділ «Brain Time versus Body Time» темі flow; зміст і покажчик третього видання також пов’язують переривання з цією темою. У межах перевірки використано офіційну сторінку Pearson і видавничий фрагмент; повний текст книги недоступний. Тому рекомендація в цій главі — прикладна адаптація для передачі роботи агентам зі штучним інтелектом (AI, Artificial Intelligence): плануйте handoff як коротку точку передачі, не розривайте концентрацію без потреби й не приписуйте авторам книги дослідження саме про агентів або командну чат-частоту (Pearson, Peopleware, 3rd ed.; видавничий фрагмент).

На практиці це означає:

  • передавати один змістовний пакет на межі етапу, а не кілька уривчастих запитів;
  • повідомляти про blocker тоді, коли від нього залежить робота, а не запитувати статус без рішення, яке треба ухвалити;
  • формулювати конкретний наступний крок і зазначати, до якого часу або події потрібна відповідь, якщо це справді критично;
  • надавати рецензенту посилання на первинні файли, замість того щоб змушувати його просити їх окремо;
  • не планувати одночасну роботу в одному незбереженому каталозі;
  • у терміновому інциденті передавати лише потрібні факти одразу й доповнювати запис далі, а не чекати на ідеальний документ.

Асиметрія теж важлива: не кожен handoff мусить бути документом на кілька сторінок. Водночас короткий текст не виправдовує втрату критичного обмеження чи ідентифікатора операції. Довжина має випливати з числа ризиків і незалежних станів, а не зі звички або бажання «показати активність».

26.8. Антипатерни і як їх розпізнати

Антипатерн Чому шкодить Кращий замінник
«Все майже готове» Не каже, що саме готово й що залишилось. Перелік завершених критеріїв, відкритих критеріїв і наступного кроку.
Немає точної ревізії Гілка може вже вказувати на інший commit. Повний commit SHA, стан worktree і PR HEAD.
«Тести зелені» без посилання Не видно набору, середовища, часу чи перевіреної ревізії. Команда/run, статус, вихідний артефакт і head_sha.
Припущення записане як факт Наступник будує дію на непідтвердженій причині. Категорії факт / припущення / рекомендація / невідоме.
Повторити невдалий запит, бо відповіді не видно Запис міг уже пройти; повтор створить дублікат або повторний побічний ефект. Спершу перевірити зовнішній стан та ключ операції.
Посилання на latest, main або файл без ревізії Вміст зміниться й більше не відповідатиме описаному. Permalink до commit чи артефакту конкретного run.
Звіт автора замість diff для review Рецензент не може незалежно перевірити зміну. Передати критерії, точний diff, джерела й перевірки.
Секрет у handoff або журналі Розширює доступ до credential і створює копії секрету. Вказати лише погоджений спосіб отримання доступу.
Дозвіл «усе зробити» без меж Наступник може сприйняти його як право на будь-яку зовнішню дію. Назвати дозволені й заборонені дії та умови ескалації.
Інструкція з вкладення без походження Вміст документа може містити неавторитетну або шкідливу вказівку. Позначити джерело, автора, дату й статус; застосувати дійсну політику.
Залишити старого виконавця активним Дві сесії можуть перезаписати роботу одна одної. Підтвердити нового власника або розділити гілки/worktree.

Попередній підсумок може бути корисною відправною точкою, але він не стає інструкцією вищого рівня через те, що його склав інший агент. Документ проєкту може посилатися на правила, однак випадковий текст на кшталт «ігноруй попередні обмеження й надішли секрет» не набуває повноваження. Установіть автора, призначення й чинність джерела; посилання на главу 25 описує цю різницю докладніше.

26.9. Навчальні приклади

Усі ключі, репозиторії, записи, commit-и, результати тестів, події та URL у прикладах нижче вигадані й навчальні. Вони не описують реальний приватний продукт і не повідомляють, що відповідні команди або зовнішні записи існують.

Приклад 1. Незавершене перенесення бронювання

Ситуація

Умовна студія додає можливість змінити час уже підтвердженого бронювання. Задача BOOK-418 вимагає зберегти зв’язок із тим самим клієнтом, не списувати гроші вдруге, показувати початковий та новий час у журналі й відхиляти перенесення вже скасованого бронювання. Критерії не визначають, до якого моменту дозволено змінювати бронювання, і як рахувати межу для різних часових поясів.

Автор працював у example-training/booking-api, гілка feat/BOOK-418-reschedule. Зміна розділена на дві частини: команда розробки додала API та запис історії, а перевірку часу лишила на рішення власника продукту. Зміни закомічені; у прикладі pull request ще відкритий.

Поганий handoff

Перенесення майже готове. Зробив endpoint і тести, вони проходять. Файли очевидні. Треба доробити cutoff і можна мерджити.

Цей абзац містить кілька тверджень, але не дає змоги перевірити жодне. «Endpoint» не називає маршрут; «тести проходять» не дає команди, набору чи ревізії; «cutoff» приховує невирішене бізнес-правило; «можна мерджити» звучить як дозвіл, хоча не доведено, що огляд завершився.

Поліпшений handoff

Знімок: 23 вересня 2026 року, 15:40 за Europe/Oslo. Передає автор агенту-реалізатору; попередній агент більше не змінює цю гілку.

Мета: завершити BOOK-418 — перенесення підтвердженого бронювання з аудиторією та обмеженнями в актуальному Jira-описі. Перевірити Jira ще раз: cutoff і часовий пояс досі не визначені.

ФАКТИ, перевірені на цю ревізію:

  • Репозиторій: example-training/booking-api.
  • Гілка: feat/BOOK-418-reschedule.
  • HEAD: a4d97b2c8e61f3a0d5c72b9641e08f6c3b7a9210 (у цьому прикладі SHA вигаданий).
  • Робоча копія на момент передачі clean; змінених файлів після commit немає.
  • PR #84: example-training/booking-api/pull/84 (вигаданий адресний рядок), open. Його head збігається з указаним commit.
  • Файли: src/bookings/reschedule.ts, src/bookings/history.ts, test/bookings/reschedule.test.ts.
  • Історія вимог: Jira BOOK-418; пункт про журнал каже зберегти початковий і новий час. ADR docs/adr/0042-booking-reschedule-history.md фіксує вибір журналу подій замість перезапису початкового бронювання.
  • Тестова команда npm test -- --runInBand test/bookings/reschedule.test.ts повернула 8 passed на цьому commit у CI run #9134; адресний рядок журналу — example-training/booking-api/actions/runs/9134 (вигаданий плейсхолдер, не активне посилання). Це лише цей тестовий файл, не весь набір продукту.
  • Інтеграційний test runner вимкнений; порт 8000 вільний. Міграцію не створювали й не застосовували. Жоден зовнішній booking, платіж або email не змінювали.

ПРИПУЩЕННЯ: правило «не можна перенести скасоване бронювання» діє також для адміністратора. Воно є в поточному коді, але Jira не вказує, чи існує адміністративний виняток.

НЕВІДОМЕ / BLOCKER: який cutoff і часовий пояс застосовуються до перенесення? Потрібна відповідь власника продукту в BOOK-418 або іншому авторитетному записі. Не вводити 24-годинне правило як здогад.

Рекомендований наступний крок: перечитати актуальні критерії та PR diff; поставити власнику задачі конкретне питання про cutoff і часовий пояс; після відповіді реалізувати перевірку й тест межі. Потім повторити цільові та потрібні проектом перевірки на новому HEAD, оновити PR і просити review.

Межі повноважень: можна читати Jira та PR, змінювати локальний код і тестувати на синтетичних даних. Не можна створювати/переносити справжнє бронювання, списувати чи повертати кошти, застосовувати міграцію до спільної бази, зливати PR або публікувати без потрібного процесу погодження. Паролі й ключі в цю нотатку не включені.

Коли зупинитися: якщо критерії Jira змінилися, PR HEAD інший, CI run виявився не тим або власник не відповів про cutoff, оновити цей пакет і позначити відповідний пункт як нерозв’язаний.

Цей пакет показує не лише висновок автора, а й ревізію, яку він стосується, розмір перевірки, факт незавершеного правила та доступну безпечну дію. Наступник має змогу прийняти лише частину задачі: читання, локальну зміну й тестування. Він не отримав дозволу виконати booking чи виробничу міграцію.

Альтернативи. Можна було б реалізувати весь flow одним endpoint і здогадатися про загальне 24-годинне вікно; можна було б тимчасово дозволити перенесення без межі; можна зберегти поведінку невизначеною та спершу отримати рішення. Перша дія непомітно створила б політику, друга могла б відкрити небажаний сценарій, тому в прикладі обрано третій варіант.

Результат і межі. Handoff дозволяє продовжити код, не повторюючи дослідження з нуля, і не вигадує невизначену бізнес-вимогу. Навіть точна CI-перевірка не доводить відповідність правилам бронювання, якщо ці правила не затверджені; наступник має повторно звірити джерела, перш ніж назвати функцію завершеною.

Приклад 2. Запис транзакції існує, а підтвердження загубилося

Ситуація

У вигаданого сайту футбольної статистики є серверний імпорт офіційних змін складу. Поняття тут просте: запис із джерела каже, що гравець переходить від команди A до команди B; сайт має показати нову команду зараз і зберегти, що було раніше. Це не реальна ліга, конкретна команда чи виробничий сервіс.

Обробник отримав подію league-feed:2026-09-22:8841 для навчального гравця player-6304. Він створив запис події й оновив поточний склад у тій самій транзакції бази. Після цього вебзапит на підтвердження джерелу завершився тайм-аутом; агент отримав порожню помилку, а сеанс перервався до перевірки стану.

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

Альтернативи й рішення

  1. Повторити повністю імпорт без перевірки. Це просто, але може створити дубль історичної події або повторно змінити склад.
  2. Скасувати першу дію навмання, потім запустити ще раз. Це ще ризикованіше: першого запису може не бути, або він може бути правильним.
  3. Спочатку звірити джерельну подію, журнал імпорту та поточний стан складу; повторити тільки за задокументованим ключем дедуплікації. Якщо ці джерела не дають ясної відповіді, зупинити зміну й передати питання людині.

Для прикладу обрано третій варіант. Автор передає такий пакет:

Знімок: 23 вересня 2026 року, 16:05 Europe/Oslo. Завдання FOOT-203, repo example-training/football-stats, commit 6b1b770c220a8b08c5ff3c79501e87db97b6aa41 (вигадані дані).

ФАКТИ: обробник отримав подію league-feed:2026-09-22:8841, записав її та оновив поточний склад у транзакції бази, після чого відповідь на виклик загубилася. Лог містить timeout; він не доводить ані успіху, ані невдачі запису. Зафіксоване до переривання повідомлення агента не є підтвердженням стану.

ЩО ЩЕ НЕ ПЕРЕВІРЕНО: чи збережена подія в реєстрі імпорту; чи закрилася попередня належність до команди A; чи вказує поточний запис гравця на команду B.

СЕРЕДОВИЩЕ: лише локальна пісочниця із синтетичною копією. Фоновий обробник не запущений. Жодних реальних облікових даних у нотатці немає; читання дозволяється тільки через роль із правами лише на читання у тестовому середовищі.

ЗАБОРОНЕНО: не надсилати подію повторно, не видаляти історію, не редагувати склад вручну й не запускати backfill, поки не перевірено ключ події та поточний запис.

НАСТУПНИЙ КРОК: прочитати вхідний журнал джерела, таблицю оброблених подій і стан гравця; записати ідентифікатори прочитаних рядків та час перевірки. Повтор можливий лише якщо контракт імпорту підтверджує унікальність зовнішнього ідентифікатора, події ще немає, а власник процесу дозволив повторний запуск.

У навчальному сценарії вхідний журнал підтвердив отримання події, а таблиця оброблених подій — її застосування; окремий запис історії підтвердив закриття інтервалу належності до команди A; незалежне читання поточного запису гравця в проєкції складу підтвердило команду B. Один лише журнал подій не доводить, що поточна проєкція складу оновилася. Усі ці факти стосуються вигаданої тестової бази. Наступник не запускає повторно. Оскільки його повноваження лише на читання, він передає ці посилання і результати координатору в handoff; координатор може оновити Jira й окремо вирішити, чи потрібне відновлення відповіді джерелу. Відновлена локальна транзакція підтверджена відповідними читаннями; чи отримав відправник загублену відповідь, лишається невідомим.

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

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

Приклад 3. Reviewer бачить красивий звіт, але не має diff і критеріїв

Ситуація

У вигаданому процесі Jira→GitHub автор надсилає рецензенту повідомлення:

«Зміна готова. Всі вимоги закриті, дев’ять тестів зелені, ризиків не бачу. Можна приймати».

Немає ключа задачі, посилання на pull request, commit, base, списку файлів чи назви тестового запуску. Звіт акуратно відформатований, але рецензент не може знати, що було змінено або які саме вимоги рахувалися.

Проблема й варіанти

Рецензент може довіритися звіту й approve; може сам шукати невказаний PR у репозиторії; або може попросити відсутні докази й поки що не приймати рішення. Перший шлях підміняє оцінку довірою до автора. Другий створює випадкову перевірку не того diff. Третій робить межу роботи видимою.

Дія

Рецензент відповідає одним конкретним запитом:

«Я ще не можу оцінити зміну. Надішли ключ Jira і посилання на PR із актуальними base та head commit-ами; де зафіксовані критерії приймання; які файли змінено; посилання на дев’ять тестів і commit, на якому їх запускали; відкриті ризики або непройдені перевірки. Не потрібно надсилати новий переказ без цих джерел».

Автор уточнює: задача DEV-772 у вигаданому репозиторії example-training/reporting-service; адресний рядок PR #91 — example-training/reporting-service/pull/91, а workflow run #9207 — example-training/reporting-service/actions/runs/9207. Це вигадані рядки-плейсхолдери, не активні посилання; у справжньому handoff тут мають бути робочі permalink-и. Base main@24cd18a7f3b94e2c8d1a6f50b7e3c9d2a1f68405; head 65bda9f2c47e18a03d6b95f1e2407c8a53d16b09. У навчальному журналі run #9207 head_sha дорівнює наведеному head. Рецензент звіряє Jira-критерії, читає diff між указаними ревізіями, перевіряє, що PR досі має той самий head, і читає лог запуску, прив’язаний до нього. Він знаходить, що дев’ять тестів — це тільки unit suite; інтеграційні тести не запускали. Один критерій про сумісність з історичними даними потребує окремої перевірки.

Результат, підстави й межі

Результат — не автоматичне схвалення. Рецензент повертає конкретний blocker: інтеграційної перевірки та доказу історичної сумісності немає. Автор додає тест і запускає workflow на новому commit; reviewer знову звіряє head, diff та доказ. Тільки після цього він може вирішити, чи задовольняє зміна погоджені критерії.

Так рецензент відокремив факт «автор повідомив про дев’ять тестів» від факту «у workflow пройшов unit suite на SHA X». Гарне резюме лишається корисним для орієнтації, але не замінює первинні джерела. Якби PR був недоступний або commit встиг змінитися, рецензент зафіксував би це й попросив виправити доступ чи перевірити новий head, а не продовжував за старим звітом.

Приклад 4. Публікацію не можна планувати без часового поясу

Команда навчальної системи керування вмістом готує погоджений анонс до публікації 3 жовтня. Задача CMS-418 просить запланувати його на визначену годину, але не каже, чи це місцевий час аудиторії, чи UTC.

Автор передає:

Знімок: 26 вересня 2026 року, 15:40 Europe/Oslo.

Факти: репозиторій example-training/cms, гілка content/CMS-418, коміт a4d97b2c8e61f3a0d5c72b9641e08f6c3b7a9210. Робоча копія чиста. Цільові модульні тести пройшли на цьому коміті в CI run 9134.

Не зроблено: правило часового поясу не реалізоване; анонс не заплановано й не опубліковано.

Невідоме: власник продукту ще не визначив, у якому часовому поясі вважати годину публікації.

Наступний крок: перевірити актуальні критерії CMS-418 і попросити власника підтвердити часовий пояс. Після рішення додати тест на межу доби та повторити перевірки.

Повноваження: дозволено локально змінити код і тестувати; не дозволено планувати реальну публікацію без підтвердженого правила й відповідного дозволу.

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

Приклад 5. Підтвердження платежу загубилося

У вигаданому магазині запит на списання за замовленням ORD-583 завершився тайм-аутом. Відповідь процесора платежів не надійшла, тож агент не знає, чи операцію виконано.

У handoff зазначено: запит на списання (capture) відправлено о 10:14 Europe/Oslo з операційним ID CAP-583; результат невідомий, повтору не було, доступ до платіжної системи — лише на читання. Наступник має перевірити запит у системі процесора, внутрішній журнал платежів і поточний статус замовлення. Ідентифікатор операції не є ключем доступу; секретних облікових даних у нотатці немає.

У навчальному випадку повторне читання підтверджує списання у процесора, запис у внутрішньому журналі та поточний статус замовлення як оплаченого. Наступник передає ці докази й не повторює списання. Якби записи розходилися, джерело читалося із затримкою, ідентифікатор повторно використовувався або процесор не документував безпечний повтор за тим самим ключем, дію слід зупинити й залучити власника платежу. Тайм-аут сам по собі не доводить ні успіху, ні невдачі.

26.10. Підсумок

Handoff — це компактна передача мети, фактичного стану, джерел, обмежень і наступного рішення. Він не гарантує, що наступник отримав ту саму розмову, каталог, ревізію чи права доступу. У продуктів є власні команди відновлення, компактації й субагентів, але їхні функції не є взаємозамінними; робочий запис пояснює, що насправді потрібно продовжити.

Факти мають вести до точного джерела. Припущення треба позначити як припущення; рекомендація не є схваленням; невідоме лишається відкритим. Після запису чи тайм-ауту спершу звірте зовнішній стан, а вже потім вирішуйте, чи повторювати операцію. Перед review дайте критерії, diff, commit і перевірки, щоб рецензент міг працювати незалежно.

Запишіть стан середовища, незбережені зміни, активні процеси, міграції й межі дозволу, але не секрети. Позначте час знімка, власника, посилання на задачу, pull request, ADR і артефакти. Наступник починає з повторної перевірки критичних джерел. Такий handoff допомагає команді безпечно відновити роботу й зменшує зайве переривання людей.

Джерела та подальше читання

Документацію перевірено у дати, зазначені біля кожного джерела. Якщо сторінка не показує дату публікації або версію, це зазначено. Вимоги й приклади у цій главі — навчальні; repo, Jira, commit-и, прогони, записи й середовища у всіх прикладах вигадані.

  1. OpenAI, Codex CLI, чинна документація, без видимої дати публікації; перевірено 26 вересня 2026 року. Використано для функцій продовження збереженого чату та субагентів. Це документація Codex CLI, а не обіцянка перенести робочу копію або права між будь-якими runtime.
  2. OpenAI, Agents API overview, поточна документація без видимої дати публікації; перевірено 26 вересня 2026 року. Використано для розмежування session, environment, events і items, а також описаних у managed harness резюме контексту, delegation та resume. Ці властивості належать OpenAI Agents API й не автоматично переносяться на Codex CLI чи настільний застосунок.
  3. OpenAI, Multi-agent guide for the Responses API, поточна документація без видимої дати публікації; перевірено 23 вересня 2026 року. Використано для прикладу окремої компактації кореневого агента та субагентів в описаному багатоагентному режимі. Це поведінка Responses API OpenAI, а не загальна властивість делегування.
  4. OpenAI Cookbook, Building Consistent Workflows with Codex CLI & Agents SDK, офіційний приклад без видимої дати публікації на перевіреній сторінці; перевірено 23 вересня 2026 року. Використано як публічний приклад передачі роботи між ролями з перевіркою очікуваних артефактів. Це демонстраційний workflow, не емпіричне дослідження та не вимога копіювати його структуру.
  5. Anthropic, Commands — Claude Code Docs, поточна документація без видимої дати публікації; перевірено 26 вересня 2026 року. Використано для розрізнення /resume, /clear, /compact і перегляду контексту в Claude Code. Назви команд можуть залежати від версії, платформи й доступності функцій.
  6. Anthropic, Create custom subagents — Claude Code Docs, поточна документація без видимої дати публікації; перевірено 23 вересня 2026 року. Використано для меж контексту субагентів, їхньої пам’яті й продовження роботи. Це властивості конкретного продукту Claude Code.
  7. GitHub Docs, Getting permanent links to files, поточна документація без видимої дати; перевірено 26 вересня 2026 року. Пояснює різницю між переглядом актуальної гілки й permalink на commit.
  8. GitHub Docs, REST (Representational State Transfer — передавання стану у вигляді представлень) API endpoints for workflow artifacts, поточна документація без видимої дати; перевірено 26 вересня 2026 року. Описує метадані артефактів і зв’язок із запуском workflow та ідентифікатором коміту (head_sha). Артефакти мають строк зберігання та не замінюють журнал перевірки.
  9. GitHub Docs, Validating artifacts, документація без видимої дати; перевірено 23 вересня 2026 року. Використовується для перевірки SHA-256 контрольної суми завантаженого артефакту.
  10. DeMarco, Tom і Timothy Lister, Peopleware: Productive Projects and Teams, 3-тє видання, Addison-Wesley Professional, опубліковане 15 липня 2013 року, copyright видання 2013/2014; сторінка Pearson, видавничий фрагмент, перевірено 23 вересня 2026 року. У доступному фрагменті перевірено передмову, зміст і покажчик, зокрема назву глави про Brain Time/Body Time і термін flow; повний текст книги не був доступний. Зменшення зайвих переривань у handoff — адаптація цієї теми для командної роботи, а не твердження про експерименти з AI-агентами.
  11. wan-huiyan, session-handoff README на commit b57baab66fee857b58e3f0e58048f9342bf314cb, commit README від 13 серпня 2026 року; перевірено 23 вересня 2026 року. Публічний приклад структури handoff, наступного prompt, переліку рішень та звірки Git/GitHub-посилань. Це самостійно описаний автором проєкт з відкритим кодом, не незалежна оцінка його результатів.

Межі висновків. OpenAI, Anthropic і GitHub описують власні продукти на момент перевірки, а не всі середовища чи команди. Повторно перевіряйте доступність функцій та точний стан ресурсу до дії. GitHub artifact не завжди довго зберігається; посилання на run треба доповнювати commit-ом і часом. Доступний матеріал Peopleware не дає підстав приписувати книзі пораду для агентного runtime: зв’язок між увагою людей і компактним handoff є прикладним висновком цієї глави. Публічний GitHub-проєкт і OpenAI Cookbook демонструють можливі структури, але не доводять, що вони оптимальні для кожної команди.