
# Töövoo ajas tagasi kerimine

Queuety saab töövoo tagasi eelmise sammuni kerida ja jätkata täitmist sellest punktist. See on kasulik, kui samm andis halva väljundi, kui soovite uuesti proovida teistsuguse seadistusega või kui peate rikutud andmed taastama kogu töövoogu uuesti käivitamata.

Tagasikerimine tugineb [Töövoo sündmuslogile](https://queuety.inline0.dev/et/docs/workflows/event-log). Sündmuslogis peavad sihtsammu kohta olema `state_after` andmed.

## Töövoo tagasikerimine

### PHP API

Kutsuge välja `Queuety::rewind_workflow()`, edastades töövoo ID ja sammu indeksi, milleni tagasi kerida:

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

Parameeter `to_step` on selle sammu nullpõhine indeks, mille lõpetatud olek tuleb taastada. Täitmine jätkub _järgmisest_ sammust (to_step + 1).

### CLI

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

| Suvand | Kirjeldus |
|---|---|
| `<id>` | Töövoo ID (nõutav) |
| `<step>` | Samm, milleni tagasi kerida, alates 0-st (nõutav) |

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

## Kuidas see töötab

Kui kerite töövoo tagasi sammuni N:

1. Sündmuste logist küsitakse pärast sammu N lõpuleviimist salvestatud väärtust `state_after`
2. Kui hetktõmmist pole, visatakse `RuntimeException`
3. Töövoo rida lukustatakse
4. Töövoo olek asendatakse hetktõmmisega, säilitades praeguse töövoo rea kõik reserveeritud võtmed (`_steps`, `_queue`, `_priority` jne)
5. `current_step` väärtuseks määratakse N + 1 ja `status` väärtuseks `running`
6. Kõik väljad `error_message` ja `failed_at` tühjendatakse
7. Indeksis N + 1 olev samm lisatakse töötlemisjärjekorda
8. Salvestatakse logisündmus `workflow_rewound`

Seejärel võtab töötaja järjekorda lisatud sammu ette ja töövoog jätkub sellest punktist tavapäraselt.

## Nõuded

Tagasikerimiseks on sündmuste logis vaja andmeid `state_after`. Logi salvestab need automaatselt iga sündmuse `step_completed` puhul. Kui sündmuste logi on kärbitud (käsuga `WorkflowEventLog::prune()`) ja sihtsammu olekut enam pole, siis tagasikerimine nurjub.

Veenduge, et sündmuste logi säilitusaeg kataks perioodi, milleni võib olla vaja tagasi kerida.

## Kasutusjuhud

### Vigase sammutöötleja parandamine

Kui sammutöötlejas oli viga, mille tõttu see andis vale väljundi, saate paranduse juurutada ja tagasi kerida:

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

### Uuesti proovimine teistsuguse konfiguratsiooniga

Kui samm nurjus väliste tegurite tõttu (API kiiruspiirang, valed identimisteabe andmed), parandage konfiguratsioon ja käivitage samm tagasikerimisega uuesti:

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

### Vigastest andmetest taastamine

Kui varasem samm lisas olekusse vigaseid andmeid, kerige tagasi teadaolevalt korras hetktõmmiseni:

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

## Võrdlus uuesti proovimisega

| Aspekt | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| Jätkab alates | Nurjunud sammust | Mis tahes varasemast sammust |
| Olek | Praegune töövoo olek | Taastatakse sündmuste logi `state_after` põhjal |
| Eeldus | Töövoo olek on `failed` | Sihtsammu hetktõmmis on sündmuste logis olemas |
| Olek pärast toimingut | `running` | `running` |
| Logisündmus | puudub | `workflow_rewound` |
