
# Větvení workflow

Queuety může rozvětvit běžící workflow do zcela nezávislé kopie. Rozvětvené workflow začne ve stejném kroku a se stejným stavem jako původní, ale od té chvíle postupují nezávisle. Změny jednoho neovlivní druhé.

## Rozvětvení workflow

### PHP API

Zavolejte `Queuety::fork_workflow()` s ID workflow. Vrátí nové ID workflow:

```php
use Queuety\Queuety;

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

### CLI

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

| Možnost | Popis |
|---|---|
| `<id>` | ID pracovního postupu k rozvětvení (povinné) |

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

## Jak to funguje

Při rozvětvení workflow:

1. Řádek původního workflow se uzamkne a načte
2. Vloží se nový řádek workflow se stejným stavem, definicemi kroků a aktuálním krokem
3. Název nového workflow je `{original_name}_fork_{timestamp}`
4. Aktuální krok se zařadí do fronty pro rozvětvené workflow
5. Do původního i rozvětveného workflow se zaznamená událost protokolu `workflow_forked`
6. Původní workflow pokračuje v běžném zpracování

Rozvětvené workflow je zcela nezávislé. Má vlastní ID workflow, kopii stavu i položky ve frontě úloh. Od okamžiku rozvětvení se může každé workflow vyvíjet jinak.

## Příklady použití

### A/B testování obslužných rutin kroků

Rozvětvěte workflow a otestujte dvě různé implementace nadcházejícího 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 scénářů „co kdyby“

Rozvětvěte workflow v bodě rozhodnutí a prozkoumejte různé větve:

```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é rozvětvení pokračuje se stejným vstupním stavem, ale lze ho upravit tak, aby se vydalo jinou cestou.

### Experimenty souběžně

Když workflow dosáhne bodu, od kterého chcete souběžně vyzkoušet několik přístupů, rozvětvěte ho pro každý přístup a po dokončení všech rozvětvení porovnejte výsledky.

## Sledování rozvětvených workflow

Událost protokolu v každém workflow obsahuje odkaz na to druhé:

- V původním: `context.forked_workflow_id` odkazuje na nové workflow
- V rozvětveném: `context.forked_from_workflow_id` odkazuje na původní workflow

Dotazem nad protokoly najděte všechna rozvětvení workflow:

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

## Omezení

- Rozvětvené workflow nepřebírá historii protokolu událostí původního workflow. Začíná s prázdným protokolem událostí.
- Vztahy ke spuštěným workflow se nekopírují. Pokud v původním workflow právě běželo další workflow, jeho kopii rozvětvené workflow nedostane.
- Rozvětvení je snímkem aktuálního stavu. Rozpracované úlohy původního workflow se nekopírují.
