Додавання прикладу
Sample App — це канонічне місце для демонстрації шаблонів Durable Workflow у справжньому Laravel-проєкті. Якщо ваш шаблон може допомогти іншим інженерам, наприклад нова структура saga, інше використання потоків повідомлень або інтеграція з інструментом, якого ще немає в прикладах, цей посібник допоможе включити його до проєкту.
Цей контракт навмисно короткий. Приклад, який його дотримується, потрапляє до проєкту в передбачуваний строк. Приклад із пропущеними вимогами залишається на розгляді, доки прогалини не буде заповнено.
Перед написанням коду
- Спочатку відкрийте issue
sample-request. Шаблонsample-requestвизначає можливість, публічну сторінку документації з її контрактом і мінімальну потрібну версію пакета Durable Workflow. В issue супроводжувачі й автор погоджують цінність прикладу до роботи над PR. - Оберіть можливість, якої ще немає в індексі прикладів.
Індекс прикладів README
перелічує всі показані шаблони. Якщо ідея зводиться до іншого запису
простого workflow, це зміна документації
App\Workflows\Simple\SimpleWorkflow, а не новий приклад. - Знайдіть найближчий наявний клас workflow. Новий приклад має бути
схожим на сусідні: та сама структура каталогів
app/Workflows/<Pattern>/, форма команди Artisan і підхід до тестів. Приклади з новою довільною інфраструктурою відхиляються, навіть якщо показаний шаблон корисний.
Яким має бути прийнятий приклад
Прийнятий приклад є виконуваним, зрозумілим для навчання, перевіреним тестами й доступним для пошуку. Для цього в репозиторії sample-app мають бути чотири конкретні складові:
- Клас workflow у
app/Workflows/<Pattern>/, який демонструє шаблон від початку до кінця. Код workflow залишається детермінованим: читання часу черезsideEffect(), зовнішня робота в activity, очікування через signal, update, timer або потоки повідомлень. Клас компілюється безOPENAI_API_KEYта інших зовнішніх облікових даних, якщо шаблон не вимагає їх явно. - Команда Artisan, яка запускає workflow з реалістичними вхідними
даними, щоб читач виконав одну команду й побачив запуск у Waterline.
Вона розміщується поруч із відповідними командами Artisan у
routes/console.phpабо аналогічному місці реєстрації та дотримується тієї самої схеми назвapp:<short-pattern>. - Запис
config/workflow_mcp.phpіз класом workflow, шаблоном, командою, потрібними обліковими даними й аргументами. Він робить приклад доступним через MCP-сервер. Перевірка upstream-coverage не позначає рядок покриття якcovered, доки запис не з’явиться. - Тест у
tests/, який виконує workflow через worker v2 у пам’яті. Не потрібно перевіряти кожну типізовану подію історії, але тест має довести завершення workflow для вхідних даних команди Artisan.
Якщо приклад демонструє виправлення помилки, а не можливість,
він розміщується в app/Workflows/Bug/<short-id>/ із тими самими
чотирма складовими.
Зміни документації
Після прийняття прикладу оновлюються три частини документації:
- Sample Index у README репозиторію sample-app — один рядок для кожного прикладу з метою, класом workflow, командою Artisan і ключем MCP. Це джерело істини.
- Галерея прикладів на сайті документації
(
docs/sample-app.md) — відображення того самого рядка з очікуваним екраном Waterline. Галерея дає читачу змогу обрати відповідний приклад перед клонуванням репозиторію. - Посилання зі сторінки шаблону документації, що визначає можливість: saga, signal, потоки повідомлень, дочірні workflow тощо. Таблиця посилань унизу сторінки sample-app є канонічним списком. Запис із назвою можливості без посилання на приклад вважається прогалиною.
Надсилайте приклад і зміни README у PR sample-app, а галерею та зміни сторінки
шаблону — у пов’язаному PR сайту документації. Супроводжувачі включають
пов’язані зміни разом. Приклад без відображення на сайті документації має
стан gap у трекері upstream-coverage до прийняття PR документації,
тому авторам рекомендується готувати їх разом.
Назви, структура й стиль
- Структура класів.
app/Workflows/<Pattern>/<Pattern>Workflow.phpіз класами activity поруч уapp/Workflows/<Pattern>/Activities/. Відтворення помилок розміщуються вapp/Workflows/Bug/<short-id>/за тією самою структурою. - Команда Artisan.
app:<short-pattern>малими літерами без дефісів. Довгі назви на кшталтapp:run-<pattern>не використовуються. - Ключ MCP. Має відповідати короткій назві шаблону команди Artisan, щоб MCP-клієнт бачив ту саму назву, яку людина вводить у терміналі.
- Коментарі. Пояснюйте чому, а не що. Інваріанти безпеки replay
варто коментувати: чому значення обгорнуте в
sideEffect()або чому очікування використовує timer замістьusleep(). Однаковий коментар біля кожного виклику activity не потрібен. - Знімки екрана Waterline. Галерея sample-app на сайті документації визначає очікуваний екран Waterline. Додайте або оновіть його в межах роботи над прикладом.
Причини відхилення прикладу
Приклад повертається на доопрацювання, якщо:
- код workflow використовує
now(),random_*()або інші недетерміновані виклики позаsideEffect()або activity; - activity виконують стійкий облік, яким уже керує рушій: прямо
записують
workflow_messages, вручну переміщують курсори потоків або зберігають стан Waterline з коду workflow; - команда Artisan вимагає зовнішніх облікових даних без зазначення
цього в полі
requiresзапису MCP; - індекс прикладів README, рядок галереї документації та посилання зі сторінки шаблону не входять до однієї узгодженої зміни;
- приклад повторює наявну можливість без нової структури, сценарію помилки або інтеграції. Той самий шаблон з іншим описом є зміною документації, а не новим прикладом.
Ці самі вимоги перевіряють upstream-coverage та список перевірки sample-app. Виправлення прогалин перед відкриттям PR пришвидшує його прийняття.
Короткий список перевірки
Використовуйте цей список під час відкриття PR:
- Є issue
sample-requestіз посиланням на публічну сторінку шаблону. - Клас workflow у
app/Workflows/<Pattern>/. - Команда Artisan зареєстрована з назвою
app:<short-pattern>. - Запис
config/workflow_mcp.phpіз класом, шаблоном, командою, вимогами й аргументами. - Тест, який виконує workflow від початку до кінця.
- Рядок Sample Index у README.
- Рядок галереї сайту документації у
docs/sample-app.md. - Посилання з відповідної сторінки шаблону на сайті документації.
- Перевірка публічних меж пройшла (
scripts/check-public-boundary.sh).
Супроводжувачі перевіряють той самий список, тому PR, який виконує всі вимоги, має потрапити до проєкту протягом одного циклу випуску.