
# Darbplūsmas laika ceļošana

Queuety var atgriezt darbplūsmu pie iepriekšējas darbības un atsākt izpildi no šī punkta. Tas noder, ja darbība radīja nepareizu izvadi, ja vēlaties mēģināt vēlreiz ar citu konfigurāciju vai ja jāatkopjas pēc bojātiem datiem, nepārstartējot visu darbplūsmu.

Atgriešanās balstās uz [Darbplūsmas notikumu žurnālu](https://queuety.inline0.dev/lv/docs/workflows/event-log). Notikumu žurnālā jābūt mērķa darbības `state_after` datiem.

## Atgriešanās darbplūsmā

### PHP API

Izsauciet `Queuety::rewind_workflow()`, norādot darbplūsmas ID un darbības indeksu, pie kura atgriezties:

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

Parametrs `to_step` ir no nulles sākts indekss darbībai, kuras pabeigtais stāvoklis jāatjauno. Izpilde tiek atsākta ar nākamo darbību (to_step + 1).

### CLI

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

| Opcija | Apraksts |
|---|---|
| `<id>` | Darbplūsmas ID (obligāts) |
| `<step>` | Darbības indekss, līdz kuram attīt, sākot no 0 (obligāts) |

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

## Kā tas darbojas

Atgriežot darbplūsmu pie darbības N:

1. Notikumu žurnālā tiek meklēta vērtība `state_after`, kas ierakstīta pēc darbības N pabeigšanas
2. Ja momentuzņēmuma nav, tiek izmests `RuntimeException`
3. Darbplūsmas rinda tiek bloķēta
4. Darbplūsmas stāvoklis tiek aizstāts ar momentuzņēmumu, saglabājot visas rezervētās atslēgas (`_steps`, `_queue`, `_priority` u. c.) no pašreizējās darbplūsmas rindas
5. `current_step` tiek iestatīts uz N + 1, bet `status` — uz `running`
6. Visi lauki `error_message` un `failed_at` tiek notīrīti
7. Darbība ar indeksu N + 1 tiek ievietota apstrādes rindā
8. Tiek reģistrēts `workflow_rewound` žurnāla notikums

Pēc tam izpildītājs paņem rindā ievietoto darbību un no šī punkta turpina darbplūsmu kā parasti.

## Prasības

Lai atgrieztos, notikumu žurnālā jābūt `state_after` datiem. Notikumu žurnāls tos automātiski ieraksta katram `step_completed` notikumam. Ja notikumu žurnāls ir apgriezts (izmantojot `WorkflowEventLog::prune()`) un mērķa darbības stāvoklis vairs nepastāv, atgriešanās neizdosies.

Pārliecinieties, ka notikumu žurnāla saglabāšanas periods aptver laiku, pie kura, iespējams, būs jāatgriežas.

## Lietojuma gadījumi

### Izlabojiet kļūdainu darbības apstrādātāju

Ja darbības apstrādātāja kļūda radīja nepareizu izvadi, varat izvietot labojumu un atgriezties:

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

### Mēģiniet vēlreiz ar citu konfigurāciju

Ja darbība neizdevās ārēju faktoru dēļ (API ierobežojums, nepareizi piekļuves dati), izlabojiet konfigurāciju un atgriezieties, lai mēģinātu vēlreiz:

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

### Atkopšanās pēc kļūdainiem datiem

Ja iepriekšēja darbība ievietoja stāvoklī kļūdainus datus, atgriezieties pie zināma derīga momentuzņēmuma:

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

## Salīdzinājums ar atkārtotu mēģinājumu

| Aspekts | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| No kurienes atsāk | Neveiksmīgā darbība | Jebkura iepriekšēja darbība |
| Stāvoklis | Pašreizējais darbplūsmas stāvoklis | Atjaunots no notikumu žurnāla `state_after` |
| Nepieciešams | Darbplūsmai ir statuss `failed` | Notikumu žurnālā ir mērķa darbības momentuzņēmums |
| Statuss pēc tam | `running` | `running` |
| Žurnāla notikums | nav | `workflow_rewound` |
