
# Podróż workflow w czasie

Queuety może cofnąć workflow do wcześniejszego kroku i wznowić wykonanie od tego miejsca. Przydaje się to, gdy krok wygenerował nieprawidłowe dane wyjściowe, gdy chcesz ponowić próbę z inną konfiguracją lub gdy trzeba odzyskać dane po ich uszkodzeniu bez ponownego uruchamiania całego workflow.

Cofanie opiera się na [Dzienniku zdarzeń workflow](https://queuety.inline0.dev/pl/docs/workflows/event-log). Dziennik zdarzeń musi zawierać dane `state_after` dla kroku docelowego.

## Cofanie workflow

### PHP API

Wywołaj `Queuety::rewind_workflow()`, podając identyfikator workflow i indeks kroku, do którego chcesz cofnąć wykonanie:

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

Parametr `to_step` to indeks liczony od zera kroku, którego ukończony stan ma zostać przywrócony. Wykonywanie jest wznawiane od _następnego_ kroku (to_step + 1).

### CLI

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

| Opcja | Opis |
|---|---|
| `<id>` | Identyfikator przepływu pracy (wymagany) |
| `<step>` | Indeks kroku, do którego należy cofnąć, liczony od 0 (wymagany) |

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

## Jak to działa

Gdy cofasz workflow do kroku N:

1. W dzienniku zdarzeń wyszukiwana jest wartość `state_after` zarejestrowana po zakończeniu kroku N
2. Jeśli nie ma migawki, zgłaszany jest `RuntimeException`
3. Wiersz przepływu pracy zostaje zablokowany
4. Stan przepływu pracy zostaje zastąpiony migawką, z zachowaniem wszystkich zarezerwowanych kluczy (`_steps`, `_queue`, `_priority` itd.) z bieżącego wiersza przepływu pracy
5. `current_step` zostaje ustawione na N + 1, a `status` na `running`
6. Pola `error_message` i `failed_at` zostają wyczyszczone
7. Krok o indeksie N + 1 zostaje umieszczony w kolejce do przetworzenia
8. Rejestrowane jest zdarzenie dziennika `workflow_rewound`

Następnie proces roboczy pobiera umieszczony w kolejce krok i przepływ pracy jest kontynuowany od tego momentu w zwykły sposób.

## Wymagania

Cofnięcie wymaga danych `state_after` w dzienniku zdarzeń. Dziennik zdarzeń rejestruje je automatycznie dla każdego zdarzenia `step_completed`. Jeśli dziennik zdarzeń został przycięty (za pomocą `WorkflowEventLog::prune()`), a stan docelowego kroku już nie istnieje, cofnięcie się nie powiedzie.

Upewnij się, że okres przechowywania dziennika zdarzeń obejmuje czas, do którego możesz chcieć cofnąć przepływ pracy.

## Zastosowania

### Naprawa wadliwego obsługiwania kroku

Jeśli obsługa kroku zawierała błąd powodujący nieprawidłowe dane wyjściowe, możesz wdrożyć poprawkę i cofnąć przepływ pracy:

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

### Ponowienie z inną konfiguracją

Gdy krok nie powiódł się z przyczyn zewnętrznych (API limit zapytań, nieprawidłowe dane uwierzytelniające), popraw konfigurację i cofnij przepływ pracy, aby uruchomić go ponownie:

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

### Odzyskiwanie po błędnych danych

Jeśli wcześniejszy krok wprowadził błędne dane do stanu, cofnij przepływ pracy do migawki ze znanym prawidłowym stanem:

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

## Porównanie z ponowieniem

| Aspekt | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| Wznawia od | Nieudanego kroku | Dowolnego wcześniejszego kroku |
| Stan | Bieżący stan przepływu pracy | Przywrócony z migawki dziennika zdarzeń `state_after` |
| Wymagania | Przepływ pracy ma status `failed` | Migawka dziennika zdarzeń na docelowym kroku |
| Status po operacji | `running` | `running` |
| Zdarzenie w dzienniku | brak | `workflow_rewound` |
