
# Perjalanan Waktu Alur Kerja

Queuety dapat mengembalikan alur kerja ke langkah sebelumnya dan melanjutkan eksekusi dari titik tersebut. Ini berguna ketika suatu langkah menghasilkan output yang buruk, saat Anda ingin mencoba lagi dengan konfigurasi berbeda, atau ketika perlu memulihkan data yang rusak tanpa memulai ulang seluruh alur kerja.

Pengembalian alur kerja bergantung pada [Log Peristiwa Alur Kerja](https://queuety.inline0.dev/id/docs/workflows/event-log). Log peristiwa harus memiliki data `state_after` untuk langkah target.

## Mengembalikan alur kerja

### PHP API

Panggil `Queuety::rewind_workflow()` dengan ID alur kerja dan indeks langkah yang menjadi tujuan pengembalian:

```php
use Queuety\Queuety;

// Rewind workflow 42 to step 1.
// The state is restored to the snapshot taken after step 1 completed,
// and step 2 is enqueued for re-execution.
Queuety::rewind_workflow( $workflow_id, to_step: 1 );
```

Parameter `to_step` adalah indeks berbasis 0 dari langkah yang status selesainya harus dipulihkan. Eksekusi dilanjutkan dari langkah _berikutnya_ (to_step + 1).

### CLI

```bash
wp queuety workflow rewind <id> <step>
```

| Opsi | Deskripsi |
|---|---|
| `<id>` | ID workflow (wajib) |
| `<step>` | Indeks langkah untuk dikembalikan, berbasis 0 (wajib) |

```bash
wp queuety workflow rewind 42 1
```

## Cara kerjanya

Saat Anda mengembalikan alur kerja ke langkah N:

1. Log peristiwa diperiksa untuk nilai `state_after` yang tercatat setelah langkah N selesai
2. Jika tidak ada snapshot, `RuntimeException` akan dilempar
3. Baris alur kerja dikunci
4. Status alur kerja diganti dengan snapshot, dengan mempertahankan semua kunci yang dicadangkan (`_steps`, `_queue`, `_priority`, dll.) dari baris alur kerja saat ini
5. `current_step` diatur ke N + 1 dan `status` diatur ke `running`
6. Kolom `error_message` dan `failed_at` apa pun akan dikosongkan
7. Langkah pada indeks N + 1 dimasukkan ke antrean untuk diproses
8. Peristiwa log `workflow_rewound` dicatat

Worker kemudian mengambil langkah yang masuk antrean dan alur kerja berlanjut seperti biasa dari titik tersebut.

## Persyaratan

Pengembalian memerlukan data `state_after` di log peristiwa. Log peristiwa mencatatnya secara otomatis untuk setiap peristiwa `step_completed`. Jika log peristiwa telah dipangkas (melalui `WorkflowEventLog::prune()`) dan status untuk langkah target sudah tidak ada, pengembalian akan gagal.

Pastikan retensi log peristiwa mencakup periode yang mungkin Anda perlukan untuk melakukan pengembalian.

## Kasus penggunaan

### Memperbaiki handler langkah yang bermasalah

Jika handler langkah memiliki bug yang menghasilkan output keliru, Anda dapat menerapkan perbaikan lalu mengembalikan alur kerja:

```php
// Step 2 (CallLLMHandler) produced garbled output due to a prompt bug.
// After fixing CallLLMHandler, rewind to step 1 so step 2 runs again
// with the corrected handler.
Queuety::rewind_workflow( $workflow_id, to_step: 1 );
```

### Mencoba lagi dengan konfigurasi berbeda

Ketika langkah gagal karena faktor eksternal (API batas laju, kredensial tidak valid), perbaiki konfigurasi dan kembalikan alur kerja untuk menjalankannya lagi:

```php
// Step 3 failed because the API key was expired.
// After updating the key, rewind to step 2 so step 3 retries.
Queuety::rewind_workflow( $workflow_id, to_step: 2 );
```

### Memulihkan dari data yang buruk

Jika langkah sebelumnya memasukkan data yang buruk ke dalam status, kembalikan alur kerja ke snapshot yang diketahui baik:

```php
// Step 0 fetched correct data, but step 1 corrupted it.
// Rewind to step 0 to restore the good state and re-run step 1.
Queuety::rewind_workflow( $workflow_id, to_step: 0 );
```

## Perbandingan dengan percobaan ulang

| Aspek | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| Melanjutkan dari | Langkah yang gagal | Langkah sebelumnya mana pun |
| Status | Status alur kerja saat ini | Dipulihkan dari `state_after` log peristiwa |
| Persyaratan | Alur kerja berstatus `failed` | Snapshot log peristiwa pada langkah target |
| Status setelahnya | `running` | `running` |
| Peristiwa log | tidak ada | `workflow_rewound` |
