
# Călătorie în timp în fluxurile de lucru

Queuety poate derula un flux de lucru înapoi la un pas anterior și poate relua execuția din acel punct. Acest lucru este util când un pas a produs rezultate incorecte, când doriți să reîncercați cu o configurație diferită sau când trebuie să recuperați date corupte fără să reporniți întregul flux de lucru.

Derularea înapoi se bazează pe [Jurnalul de evenimente al fluxului de lucru](https://queuety.inline0.dev/ro/docs/workflows/event-log). Jurnalul de evenimente trebuie să conțină `state_after` pentru pasul țintă.

## Derularea înapoi a unui flux de lucru

### PHP API

Apelați `Queuety::rewind_workflow()` cu ID-ul fluxului de lucru și indexul pasului la care doriți să reveniți:

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

Parametrul `to_step` este indexul de la 0 al pasului a cărui stare încheiată trebuie restaurată. Execuția se reia de la pasul _următor_ (to_step + 1).

### CLI

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

| Opțiune | Descriere |
|---|---|
| `<id>` | ID-ul fluxului de lucru (obligatoriu) |
| `<step>` | Indexul pasului la care se revine, numerotat de la 0 (obligatoriu) |

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

## Cum funcționează

Când derulați un flux de lucru înapoi la pasul N:

1. Jurnalul de evenimente este interogat pentru valoarea `state_after` înregistrată după finalizarea pasului N
2. Dacă nu există niciun instantaneu, se aruncă o `RuntimeException`
3. Rândul fluxului de lucru este blocat
4. Starea fluxului de lucru este înlocuită cu instantaneul, păstrând toate cheile rezervate (`_steps`, `_queue`, `_priority` etc.) din rândul curent al fluxului de lucru
5. `current_step` este setat la N + 1, iar `status` este setat la `running`
6. Câmpurile `error_message` și `failed_at` sunt șterse
7. Pasul de la indexul N + 1 este pus în coadă pentru procesare
8. Este înregistrat un eveniment de jurnal `workflow_rewound`

Apoi, lucrătorul preia pasul pus în coadă, iar fluxul de lucru continuă normal din acel punct.

## Cerințe

Revenirea necesită date `state_after` în jurnalul de evenimente. Jurnalul de evenimente le înregistrează automat pentru fiecare eveniment `step_completed`. Dacă jurnalul de evenimente a fost curățat (prin `WorkflowEventLog::prune()`), iar starea pentru pasul țintă nu mai există, revenirea va eșua.

Asigurați-vă că perioada de păstrare a jurnalului de evenimente acoperă intervalul la care ați putea avea nevoie să reveniți.

## Cazuri de utilizare

### Remediați un handler de pas cu probleme

Dacă un handler de pas a avut o eroare care a produs rezultate incorecte, puteți implementa remedierea și reveni:

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

### Reîncercați cu o configurație diferită

Când un pas a eșuat din cauza unor factori externi (API limită de rată, acreditări incorecte), remediați configurația și reveniți pentru a-l executa din nou:

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

### Recuperați-vă după date incorecte

Dacă un pas anterior a introdus date incorecte în stare, reveniți la un instantaneu valid cunoscut:

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

## Comparație cu reîncercarea

| Aspect | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| Reia de la | Pasul eșuat | Orice pas anterior |
| Stare | Starea curentă a fluxului de lucru | Restaurată din jurnalul de evenimente `state_after` |
| Necesită | Fluxul de lucru are starea `failed` | Instantaneul din jurnalul de evenimente pentru pasul țintă |
| Stare după | `running` | `running` |
| Eveniment de jurnal | niciunul | `workflow_rewound` |
