
# Rozgałęzianie przepływu pracy

Queuety może utworzyć w pełni niezależną kopię uruchomionego przepływu pracy. Rozgałęziony przepływ pracy rozpoczyna od tego samego kroku i z tym samym stanem co oryginał, ale od tej chwili oba przepływy działają niezależnie. Zmiany w jednym nie wpływają na drugi.

## Rozgałęzianie przepływu pracy

### PHP API

Wywołaj `Queuety::fork_workflow()`, podając identyfikator przepływu pracy. Zwróci ono identyfikator nowego przepływu:

```php
use Queuety\Queuety;

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

### CLI

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

| Opcja | Opis |
|---|---|
| `<id>` | Identyfikator przepływu pracy do rozdzielenia (wymagany) |

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

## Jak to działa

Podczas rozgałęziania przepływu pracy:

1. Wiersz oryginalnego przepływu pracy jest blokowany i odczytywany
2. Wstawiany jest nowy wiersz przepływu pracy z tym samym stanem, definicjami kroków i bieżącym krokiem
3. Nowy przepływ pracy otrzymuje nazwę `{original_name}_fork_{timestamp}`
4. Bieżący krok jest dodawany do kolejki dla rozgałęzionego przepływu pracy
5. W dzienniku zdarzeń obu przepływów pracy zapisywane jest zdarzenie `workflow_forked`
6. Oryginalny przepływ pracy jest nadal przetwarzany normalnie

Rozgałęziony przepływ pracy jest całkowicie niezależny. Ma własny identyfikator, kopię stanu i wpisy w kolejce zadań. Od momentu rozgałęzienia każdy przepływ może swobodnie podążać inną ścieżką.

## Zastosowania

### Testy A/B procedur obsługi kroków

Rozgałęź przepływ pracy, aby przetestować dwie różne implementacje nadchodzącego 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.)
```

### Analiza hipotetycznych scenariuszy

Rozgałęź przepływ pracy w punkcie decyzyjnym, aby sprawdzić różne gałęzie:

```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żda kopia rozpoczyna od tych samych danych wejściowych, ale można ją zmodyfikować tak, aby podążała inną ścieżką.

### Równoległe eksperymenty

Gdy przepływ pracy osiągnie punkt, w którym chcesz równolegle wypróbować kilka podejść, rozgałęź go osobno dla każdego z nich i porównaj wyniki po zakończeniu wszystkich kopii.

## Śledzenie rozgałęzień

Zdarzenie w dzienniku każdego przepływu pracy zawiera odwołanie do drugiego:

- W oryginalnym przepływie: `context.forked_workflow_id` wskazuje nowy przepływ pracy
- W rozgałęzionym: `context.forked_from_workflow_id` wskazuje oryginalny przepływ pracy

Aby znaleźć wszystkie rozgałęzienia danego przepływu pracy, wyszukaj w dziennikach:

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

## Ograniczenia

- Rozgałęziony przepływ pracy nie dziedziczy historii dziennika zdarzeń oryginału. Zaczyna z pustym dziennikiem.
- Powiązania między przepływami pracy a ich uruchomieniami nie są kopiowane. Jeśli w oryginalnym przepływie trwa uruchomienie run-workflow, rozgałęziony przepływ nie otrzymuje jego kopii.
- Rozgałęzienie jest migawką bieżącego stanu. Zadania będące w toku w oryginalnym przepływie pracy nie są kopiowane.
