
# Munkafolyamat időutazása

A Queuety lehetővé teszi, hogy egy munkafolyamatot visszaállítson egy korábbi lépésre, és onnan folytassa a végrehajtást. Ez akkor hasznos, ha egy lépés hibás kimenetet adott, más konfigurációval szeretne újrapróbálkozni, vagy sérült adatokból kell helyreállnia a teljes munkafolyamat újraindítása nélkül.

A visszaállítás a [Munkafolyamat eseménynaplójára](https://queuety.inline0.dev/hu/docs/workflows/event-log) támaszkodik. Az eseménynaplónak rendelkeznie kell `state_after` adattal a célként megadott lépéshez.

## Munkafolyamat visszaállítása

### PHP API

A visszaállításhoz hívja meg a `Queuety::rewind_workflow()` metódust a munkafolyamat azonosítójával és a lépés indexével:

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

A `to_step` paraméter annak a lépésnek a nullától kezdődő indexe, amelynek befejezett állapotát vissza kell állítani. A végrehajtás a _következő_ lépésből folytatódik (to_step + 1).

### CLI

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

| Beállítás | Leírás |
|---|---|
| `<id>` | Munkafolyamat-azonosító (kötelező) |
| `<step>` | Visszaállítási lépés indexe, 0-tól számozva (kötelező) |

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

## Működés

Ha egy munkafolyamatot az N. lépésre állít vissza:

1. Az eseménynapló lekéri az `state_after` értéket, amelyet az N. lépés befejezése után rögzített
2. Ha nincs pillanatkép, `RuntimeException` kivétel keletkezik
3. A munkafolyamat sora zárolásra kerül
4. A munkafolyamat állapotát a pillanatkép váltja fel, megőrizve az aktuális munkafolyamat-sorból az összes fenntartott kulcsot (`_steps`, `_queue`, `_priority` stb.)
5. Az `current_step` értéke N + 1 lesz, az `status` értéke pedig `running`
6. Az összes `error_message` és `failed_at` mező törlődik
7. Az N + 1 indexű lépés feldolgozási sorba kerül
8. Rögzítésre kerül egy `workflow_rewound` naplóesemény

Ezután a munkafolyamat-kezelő felveszi a sorba állított lépést, és a munkafolyamat ettől a ponttól a megszokott módon folytatódik.

## Követelmények

A visszaállításhoz `state_after` adatokra van szükség az eseménynaplóban. Az eseménynapló minden `step_completed` eseménynél automatikusan rögzíti azokat. Ha az eseménynaplót ritkították (a `WorkflowEventLog::prune()` segítségével), és a célként megadott lépés állapota már nem létezik, a visszaállítás sikertelen lesz.

Gondoskodjon róla, hogy az eseménynapló megőrzési ideje lefedje azt az időszakot, amelyre vissza kellhet állnia.

## Felhasználási esetek

### Hibás lépéskezelő javítása

Ha egy lépéskezelő hibája miatt helytelen kimenet keletkezett, telepítheti a javítást, majd visszaállíthatja a munkafolyamatot:

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

### Újrapróbálkozás más konfigurációval

Ha egy lépés külső tényezők (API sebességkorlátozás, hibás hitelesítő adatok) miatt hibázott, javítsa a konfigurációt, majd állítsa vissza a munkafolyamatot az újrafuttatáshoz:

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

### Helyreállítás hibás adatokból

Ha egy korábbi lépés hibás adatokat írt az állapotba, állítsa vissza a munkafolyamatot egy ismert, helyes pillanatképre:

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

## Összehasonlítás az újrapróbálkozással

| Szempont | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| Folytatás innen | A sikertelen lépés | Bármely korábbi lépés |
| Állapot | Aktuális munkafolyamat-állapot | Visszaállítva az eseménynapló `state_after` pillanatképéből |
| Követelmény | A munkafolyamat állapota `failed` | Eseménynapló-pillanatkép a célként megadott lépésnél |
| Utólagos állapot | `running` | `running` |
| Naplóesemény | nincs | `workflow_rewound` |
