
# Cestovanie v čase v pracovnom postupe

Queuety dokáže vrátiť pracovný postup k predchádzajúcemu kroku a pokračovať vo vykonávaní od tohto bodu. Hodí sa to, keď krok vytvoril nesprávny výstup, keď ho chcete zopakovať s inou konfiguráciou alebo keď potrebujete obnoviť postup po poškodení dát bez opätovného spustenia celého pracovného postupu.

Vrátenie späť závisí od [Denníka udalostí pracovného postupu](https://queuety.inline0.dev/sk/docs/workflows/event-log). Denník udalostí musí obsahovať `state_after` údaje pre cieľový krok.

## Vrátenie pracovného postupu späť

### PHP API

Zavolajte `Queuety::rewind_workflow()` s ID pracovného postupu a indexom kroku, ku ktorému sa chcete vrátiť:

```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` je index začínajúci od 0 kroku, ktorého dokončený stav sa má obnoviť. Vykonávanie pokračuje od _nasledujúceho_ kroku (to_step + 1).

### CLI

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

| Možnosť | Popis |
|---|---|
| `<id>` | ID workflowu (povinné) |
| `<step>` | Index kroku, na ktorý sa chcete vrátiť, od 0 (povinné) |

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

## Ako to funguje

Pri vrátení pracovného postupu ku kroku N:

1. V denníku udalostí sa vyhľadá hodnota `state_after` zaznamenaná po dokončení kroku N
2. Ak neexistuje snímka stavu, vyhodí sa `RuntimeException`
3. Riadok pracovného postupu sa uzamkne
4. Stav pracovného postupu sa nahradí snímkou stavu, pričom sa zachovajú všetky rezervované kľúče (`_steps`, `_queue`, `_priority` atď.) z aktuálneho riadka pracovného postupu
5. `current_step` sa nastaví na N + 1 a `status` sa nastaví na `running`
6. Všetky polia `error_message` a `failed_at` sa vymažú
7. Krok s indexom N + 1 sa zaradí do frontu na spracovanie
8. Zaznamená sa udalosť denníka `workflow_rewound`

Worker potom prevezme zaradený krok a pracovný postup od tohto bodu pokračuje ako zvyčajne.

## Požiadavky

Vrátenie späť vyžaduje údaje `state_after` v denníku udalostí. Denník udalostí ich automaticky zaznamenáva pri každej udalosti `step_completed`. Ak bol denník udalostí skrátený (pomocou `WorkflowEventLog::prune()`) a stav cieľového kroku už neexistuje, vrátenie späť zlyhá.

Uistite sa, že doba uchovávania denníka udalostí pokrýva obdobie, ku ktorému sa možno budete potrebovať vrátiť.

## Prípady použitia

### Oprava chybného obslužného programu kroku

Ak mal obslužný program kroku chybu, ktorá spôsobila nesprávny výstup, môžete nasadiť opravu a vrátiť pracovný postup späť:

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

### Opätovné spustenie s inou konfiguráciou

Ak krok zlyhal z externých dôvodov (obmedzenie počtu požiadaviek API, nesprávne prihlasovacie údaje), opravte konfiguráciu a spustite ho znova návratom späť:

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

### Obnovenie po chybných dátach

Ak predchádzajúci krok vložil do stavu nesprávne údaje, vráťte sa k známej správnej snímke stavu:

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

## Porovnanie s opakovaným pokusom

| Aspekt | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| Pokračuje od | Krok, ktorý zlyhal | Ľubovoľný predchádzajúci krok |
| Stav | Aktuálny stav pracovného postupu | Obnovený z denníka udalostí `state_after` |
| Vyžaduje | Pracovný postup má stav `failed` | Snímku stavu cieľového kroku v denníku udalostí |
| Stav potom | `running` | `running` |
| Udalosť denníka | žiadna | `workflow_rewound` |
