
# Rozvetvovanie workflowov

Queuety dokáže rozvetviť spustený workflow do úplne nezávislej kópie. Rozvetvený workflow začne na tom istom kroku a v rovnakom stave ako pôvodný, no od tohto momentu pokračujú samostatne. Zmeny v jednom neovplyvnia druhý.

## Rozvetvenie workflowu

### PHP API

Zavolajte `Queuety::fork_workflow()` s ID workflowu. Vráti ID nového workflowu:

```php
use Queuety\Queuety;

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

### CLI

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

| Možnosť | Popis |
|---|---|
| `<id>` | ID workflowu, ktorý chcete rozvetviť (povinné) |

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

## Ako to funguje

Pri rozvetvení workflowu:

1. Riadok pôvodného workflowu sa uzamkne a načíta
2. Vloží sa nový riadok workflowu s rovnakým stavom, definíciami krokov a aktuálnym krokom
3. Názov nového workflowu je `{original_name}_fork_{timestamp}`
4. Aktuálny krok sa zaradí do frontu pre rozvetvený workflow
5. V pôvodnom aj rozvetvenom workflowe sa zaznamená udalosť `workflow_forked` v protokole
6. Pôvodný workflow pokračuje v spracovaní ako zvyčajne

Rozvetvený workflow je úplne nezávislý. Má vlastné ID workflowu, vlastnú kópiu stavu a vlastné položky vo fronte úloh. Od okamihu rozvetvenia sa každý workflow môže vyvíjať samostatne.

## Prípady použitia

### Testovanie obslužných rutín krokov A/B testovaním

Rozvetvite workflow a otestujte dve rôzne implementácie nadchádzajúceho kroku:

```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.)
```

### Analýza scenárov „čo ak“

Rozvetvite workflow v bode rozhodovania a preskúmajte rôzne vetvy:

```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 );
```

Každé rozvetvenie pokračuje s rovnakým vstupným stavom, no môžete ho upraviť tak, aby zvolilo inú cestu.

### Paralelné experimentovanie

Keď workflow dosiahne bod, v ktorom chcete vyskúšať viacero prístupov súčasne, rozvetvite ho pre každý prístup a po dokončení všetkých rozvetvení porovnajte výsledky.

## Sledovanie rozvetvení

Udalosť v protokole každého workflowu obsahuje odkaz na druhý workflow:

- V pôvodnom: `context.forked_workflow_id` odkazuje na nový workflow
- V rozvetvenom: `context.forked_from_workflow_id` odkazuje na pôvodný workflow

Vyhľadajte všetky rozvetvenia workflowu v protokoloch:

```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
    }
}
```

## Obmedzenia

- Rozvetvený workflow nepreberá históriu udalostí z pôvodného workflowu. Začína s prázdnym protokolom udalostí.
- Vzťahy k spusteným workflowom sa neduplikujú. Ak mal pôvodný workflow spustený podriadený workflow, rozvetvený workflow jeho kópiu nedostane.
- Rozvetvený workflow je snímkou aktuálneho stavu. Žiadne rozpracované úlohy pôvodného workflowu sa neduplikujú.
