
# Cestování workflow časem

Queuety může vrátit workflow k předchozímu kroku a obnovit vykonávání od tohoto místa. Hodí se, když krok vytvořil chybný výstup, když jej chcete zopakovat s jinou konfigurací nebo když potřebujete obnovit stav po poškození dat, aniž byste museli restartovat celé workflow.

Vrácení zpět závisí na [protokolu událostí workflow](https://queuety.inline0.dev/cs/docs/workflows/event-log). Pro cílový krok musí protokol událostí obsahovat data `state_after`.

## Vrácení workflow zpět

### PHP API

Zavolejte `Queuety::rewind_workflow()` s ID workflow a indexem kroku, ke kterému se chcete vrátit:

```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` je index kroku číslovaný od nuly, jehož dokončený stav se má obnovit. Vykonávání pokračuje následujícím krokem (to_step + 1).

### CLI

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

| Možnost | Popis |
|---|---|
| `<id>` | ID pracovního postupu (povinné) |
| `<step>` | Index kroku, ke kterému se vrátit, od 0 (povinné) |

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

## Jak to funguje

Když vrátíte workflow ke kroku N:

1. V protokolu událostí se vyhledá hodnota `state_after` zaznamenaná po dokončení kroku N
2. Pokud žádný snímek stavu neexistuje, vyvolá se `RuntimeException`
3. Řádek workflow se uzamkne
4. Stav workflow se nahradí snímkem stavu a zachovají se všechny vyhrazené klíče (`_steps`, `_queue`, `_priority` atd.) z aktuálního řádku workflow
5. Nastaví se `current_step` na N + 1 a `status` na `running`
6. Odstraní se všechna pole `error_message` a `failed_at`
7. Krok s indexem N + 1 se zařadí do fronty ke zpracování
8. Zaznamená se událost protokolu `workflow_rewound`

Pracovní proces poté převezme zařazený krok a workflow od tohoto bodu pokračuje jako obvykle.

## Požadavky

Vrácení zpět vyžaduje data `state_after` v protokolu událostí. Pro každou událost `step_completed` se tato data zaznamenávají automaticky. Pokud byl protokol událostí pročištěn (pomocí `WorkflowEventLog::prune()`) a stav cílového kroku už neexistuje, vrácení zpět selže.

Zajistěte, aby doba uchovávání protokolu událostí pokrývala období, ke kterému se možná budete chtít vrátit.

## Příklady použití

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

Pokud měl obslužný program kroku chybu, která způsobila nesprávný výstup, můžete nasadit opravu a vrátit workflow zpět:

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

### Opakování s jinou konfigurací

Pokud krok selhal kvůli vnějším vlivům (omezení rychlosti API, nesprávné přihlašovací údaje), opravte konfiguraci a spusťte jej znovu vrácením workflow:

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

### Obnovení po chybných datech

Pokud dřívější krok vložil do stavu chybná data, vraťte se ke známému správnému snímku 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 );
```

## Porovnání s opakováním

| Aspekt | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| Pokračuje od | Selhaného kroku | Libovolného předchozího kroku |
| Stav | Aktuální stav workflow | Obnoven z `state_after` protokolu událostí |
| Vyžaduje | Workflow má stav `failed` | Snímek stavu cílového kroku v protokolu událostí |
| Stav poté | `running` | `running` |
| Událost v protokolu | žádná | `workflow_rewound` |
