
# Potovanje skozi čas v potekih dela

Queuety lahko potek dela vrne na prejšnji korak in nadaljuje izvajanje od te točke. To je uporabno, kadar je korak ustvaril napačen izhod, kadar ga želite ponoviti z drugačno konfiguracijo ali kadar morate obnoviti potek dela po poškodbi podatkov, ne da bi ga začeli znova od začetka.

Vračanje v prejšnje stanje je odvisno od [Dnevnika dogodkov poteka dela](https://queuety.inline0.dev/sl/docs/workflows/event-log). Dnevnik dogodkov mora vsebovati podatke `state_after` za ciljni korak.

## Vrnitev poteka dela v prejšnje stanje

### PHP API

Pokličite `Queuety::rewind_workflow()` z ID-jem poteka dela in indeksom koraka, na katerega se želite vrniti:

```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 indeks koraka, štet od nič, katerega dokončano stanje je treba obnoviti. Izvajanje se nadaljuje z naslednjim korakom (to_step + 1).

### CLI

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

| Možnost | Opis |
|---|---|
| `<id>` | ID poteka dela (obvezno) |
| `<step>` | Indeks koraka, na katerega želite povrniti potek, od 0 naprej (obvezno) |

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

## Kako deluje

Ko potek dela vrnete na korak N:

1. V dnevniku dogodkov se poišče vrednost `state_after`, zabeležena po dokončanju koraka N
2. Če posnetek stanja ne obstaja, se sproži `RuntimeException`
3. Vrstica poteka dela se zaklene
4. Stanje poteka dela se nadomesti s posnetkom stanja, pri čemer se ohranijo vsi rezervirani ključi (`_steps`, `_queue`, `_priority` itd.) iz trenutne vrstice poteka dela
5. `current_step` se nastavi na N + 1, `status` pa na `running`
6. Vsa polja `error_message` in `failed_at` se počistijo
7. Korak z indeksom N + 1 se uvrsti v čakalno vrsto za obdelavo
8. Zabeleži se dogodek dnevnika `workflow_rewound`

Delavec nato prevzame korak, dodan v čakalno vrsto, in potek dela se od te točke naprej nadaljuje kot običajno.

## Zahteve

Za vrnitev na prejšnje stanje so potrebni podatki `state_after` v dnevniku dogodkov. Dnevnik jih samodejno zabeleži za vsak dogodek `step_completed`. Če je bil dnevnik dogodkov skrajšan (prek `WorkflowEventLog::prune()`) in stanje za ciljni korak ne obstaja več, vrnitev na prejšnje stanje ne bo uspela.

Poskrbite, da hramba dnevnika dogodkov zajema obdobje, na katero se boste morda morali vrniti.

## Primeri uporabe

### Popravite napačno delujoč obravnavalnik koraka

Če je imel obravnavalnik koraka napako, zaradi katere je ustvaril napačen izhod, lahko uvedete popravek in se vrnete na prejšnje stanje:

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

### Ponovni poskus z drugačno konfiguracijo

Če korak ni uspel zaradi zunanjih dejavnikov (API omejitev hitrosti, napačni poverilnici), popravite konfiguracijo in se vrnite na prejšnje stanje za ponovni zagon:

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

### Obnovitev po napačnih podatkih

Če je prejšnji korak v stanje vstavil napačne podatke, se vrnite na znan dober posnetek stanja:

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

## Primerjava s ponovnim poskusom

| Vidik | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| Nadaljuje od | Neuspešni korak | Kateri koli prejšnji korak |
| Stanje | Trenutno stanje poteka dela | Obnovljeno iz dnevnika dogodkov `state_after` |
| Zahteva | Potek dela je v stanju `failed` | Posnetek dnevnika dogodkov za ciljni korak |
| Stanje po dejanju | `running` | `running` |
| Dogodek dnevnika | brez | `workflow_rewound` |
