
# Розгалуження процесу

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

## Розгалуження процесу

### PHP API

Викличте `Queuety::fork_workflow()`, вказавши ID процесу. Метод повертає ID нового процесу:

```php
use Queuety\Queuety;

$forked_id = Queuety::fork_workflow( $workflow_id );
```

### CLI

```bash
wp queuety workflow fork <id>
```

| Опція | Опис |
|---|---|
| `<id>` | ID робочого процесу для розгалуження (обов’язково) |

```bash
wp queuety workflow fork 42
# Success: Workflow #42 forked. New workflow ID: 43.
```

## Як це працює

Під час розгалуження процесу:

1. Запис вихідного процесу блокується та зчитується
2. Створюється новий запис процесу з тим самим станом, визначеннями кроків і поточним кроком
3. Назва нового процесу — `{original_name}_fork_{timestamp}`
4. Поточний крок ставиться в чергу для розгалуженого процесу
5. В обох процесах записується подія журналу `workflow_forked`
6. Вихідний процес продовжує виконуватися у звичайному режимі

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

## Варіанти використання

### A/B-тестування обробників кроків

Створіть копію процесу, щоб перевірити два варіанти реалізації наступного кроку:

```php
// Original workflow will use the existing CallLLMHandler (GPT-4).
// Fork it to test with a different handler.
$forked_id = Queuety::fork_workflow( $workflow_id );

// Modify the forked workflow's state to use a different model.
// (Update the state via a custom step or direct DB update.)
```

### Аналіз сценаріїв «що, якби»

Створіть копію процесу в точці прийняття рішення, щоб перевірити різні гілки:

```php
// Workflow is at step 3, about to process data.
// Fork it so we can try two different processing strategies.
$fork_a = Queuety::fork_workflow( $workflow_id );
$fork_b = Queuety::fork_workflow( $workflow_id );
```

Кожна копія продовжує роботу з тим самим вхідним станом, але її можна змінити, щоб обрати інший шлях.

### Паралельні експерименти

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

## Відстеження розгалужень

Подія журналу кожного процесу містить посилання на інший:

- У вихідному процесі: `context.forked_workflow_id` вказує на новий процес
- У копії: `context.forked_from_workflow_id` вказує на вихідний процес

Виконайте запит до журналів, щоб знайти всі копії процесу:

```php
$logs = Queuety::logger()->for_workflow( $workflow_id );

foreach ( $logs as $entry ) {
    if ( 'workflow_forked' === $entry['event'] ) {
        $context = json_decode( $entry['context'] ?? '{}', true );
        // $context['forked_workflow_id'] is the new workflow
    }
}
```

## Обмеження

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