
# Workflows aufspalten

Queuety kann einen laufenden Workflow in eine vollständig unabhängige Kopie aufspalten. Der aufgespaltene Workflow beginnt beim selben Schritt und mit demselben Status wie das Original, doch ab diesem Punkt laufen beide Workflows unabhängig voneinander weiter. Änderungen an einem Workflow wirken sich nicht auf den anderen aus.

## Einen Workflow aufspalten

### PHP API

Rufe `Queuety::fork_workflow()` mit der Workflow-ID auf. Die Methode gibt die neue Workflow-ID zurück:

```php
use Queuety\Queuety;

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

### CLI

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

| Option | Beschreibung |
|---|---|
| `<id>` | Workflow-ID für die Abzweigung (erforderlich) |

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

## So funktioniert es

Beim Aufspalten eines Workflows geschieht Folgendes:

1. Der ursprüngliche Workflow-Eintrag wird gesperrt und gelesen
2. Ein neuer Workflow-Eintrag wird mit demselben Status, denselben Schrittdefinitionen und demselben aktuellen Schritt angelegt
3. Der Name des neuen Workflows lautet `{original_name}_fork_{timestamp}`
4. Der aktuelle Schritt wird für den aufgespaltenen Workflow eingereiht
5. Für den ursprünglichen und den aufgespaltenen Workflow wird jeweils ein `workflow_forked`-Protokollereignis aufgezeichnet
6. Der ursprüngliche Workflow wird normal weiterverarbeitet

Der aufgespaltene Workflow ist vollständig unabhängig. Er hat eine eigene Workflow-ID, eine eigene Statuskopie und eigene Aufträge in der Warteschlange. Ab dem Aufspaltungspunkt können sich die beiden Workflows frei unterschiedlich entwickeln.

## Anwendungsfälle

### Schritt-Handler im A/B-Test vergleichen

Spalte einen Workflow auf, um zwei verschiedene Implementierungen eines bevorstehenden Schritts zu testen:

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

### Was-wäre-wenn-Analyse

Spalte einen Workflow an einem Entscheidungspunkt auf, um verschiedene Zweige auszuprobieren:

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

Jede Kopie wird mit demselben Eingabestatus fortgesetzt, kann aber so geändert werden, dass sie einen anderen Pfad einschlägt.

### Paralleles Experimentieren

Wenn ein Workflow einen Punkt erreicht, an dem du mehrere Ansätze parallel ausprobieren möchtest, spalte ihn für jeden Ansatz auf und vergleiche die Ergebnisse, sobald alle Kopien abgeschlossen sind.

## Aufspaltungen nachverfolgen

Das Protokollereignis jedes Workflows enthält einen Verweis auf den jeweils anderen:

- Beim Original: `context.forked_workflow_id` verweist auf den neuen Workflow
- Bei der Kopie: `context.forked_from_workflow_id` verweist auf das Original

Frage die Protokolle ab, um alle Aufspaltungen eines Workflows zu finden:

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

## Einschränkungen

- Der aufgespaltene Workflow übernimmt nicht den Ereignisprotokollverlauf des Originals. Er beginnt mit einem leeren Ereignisprotokoll.
- Beziehungen zu ausgeführten Workflows werden nicht dupliziert. Wenn für den ursprünglichen Workflow gerade ein Run-workflow ausgeführt wurde, erhält die Kopie keine davon.
- Die Aufspaltung ist eine Momentaufnahme des aktuellen Status. Laufende Aufträge des ursprünglichen Workflows werden nicht dupliziert.
