
# Percabangan Alur Kerja

Queuety dapat mencabangkan alur kerja yang berjalan menjadi salinan yang sepenuhnya independen. Alur kerja hasil percabangan dimulai dari langkah dan status yang sama dengan alur kerja asli, tetapi keduanya berjalan secara independen sejak saat itu. Perubahan pada salah satunya tidak memengaruhi yang lain.

## Mencabangkan alur kerja

### PHP API

Panggil `Queuety::fork_workflow()` dengan ID alur kerja. Fungsi ini mengembalikan ID alur kerja baru:

```php
use Queuety\Queuety;

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

### CLI

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

| Opsi | Deskripsi |
|---|---|
| `<id>` | ID workflow yang akan dibuat cabang (wajib) |

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

## Cara kerjanya

Saat Anda mencabangkan alur kerja:

1. Baris alur kerja asli dikunci dan dibaca
2. Baris alur kerja baru disisipkan dengan status, definisi langkah, dan langkah saat ini yang sama
3. Nama alur kerja baru adalah `{original_name}_fork_{timestamp}`
4. Langkah saat ini dimasukkan ke antrean untuk alur kerja hasil percabangan
5. Peristiwa log `workflow_forked` dicatat pada alur kerja asli dan hasil percabangan
6. Alur kerja asli terus diproses seperti biasa

Alur kerja hasil percabangan sepenuhnya independen. Alur ini memiliki ID alur kerja, salinan status, dan entri antrean tugas sendiri. Sejak titik percabangan, setiap alur kerja dapat berjalan ke arah yang berbeda.

## Kasus penggunaan

### Menguji handler langkah A/B

Cabangkan alur kerja untuk menguji dua implementasi berbeda dari langkah yang akan datang:

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

### Analisis bagaimana jika

Cabangkan alur kerja pada titik keputusan untuk menjelajahi cabang yang berbeda:

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

Setiap cabang berjalan dengan status input yang sama, tetapi dapat diubah agar menempuh jalur yang berbeda.

### Eksperimen paralel

Saat alur kerja mencapai titik ketika Anda ingin mencoba beberapa pendekatan secara paralel, cabangkan untuk setiap pendekatan dan bandingkan hasilnya setelah semua cabang selesai.

## Melacak percabangan

Peristiwa log pada setiap alur kerja menyertakan referensi ke alur kerja lainnya:

- Pada alur kerja asli: `context.forked_workflow_id` menunjuk ke alur kerja baru
- Pada cabang: `context.forked_from_workflow_id` menunjuk ke alur kerja asli

Buat kueri log untuk menemukan semua cabang dari suatu alur kerja:

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

## Batasan

- Alur kerja hasil percabangan tidak mewarisi riwayat log peristiwa dari alur kerja asli. Alur ini dimulai dengan log peristiwa kosong.
- Relasi run-workflow tidak diduplikasi. Jika alur kerja asli memiliki run-workflow yang sedang berjalan, cabang tidak mendapat salinannya.
- Cabang adalah snapshot status saat ini. Tugas yang sedang berjalan untuk alur kerja asli tidak diduplikasi.
