
# Tijdreizen in workflows

Met Queuety kun je een workflow terugzetten naar een eerdere stap en de uitvoering vanaf dat punt hervatten. Dit is handig wanneer een stap onjuiste output heeft opgeleverd, wanneer je het opnieuw wilt proberen met een andere configuratie of wanneer je corrupte gegevens wilt herstellen zonder de hele workflow opnieuw te starten.

Terugzetten is afhankelijk van het [Workflow Event Log](https://queuety.inline0.dev/nl/docs/workflows/event-log). Het gebeurtenislogboek moet `state_after`-gegevens voor de doelstap bevatten.

## Een workflow terugzetten

### PHP API

Roep `Queuety::rewind_workflow()` aan met de workflow-ID en de index van de stap waarnaar je wilt terugzetten:

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

De parameter `to_step` is de index vanaf nul van de stap waarvan de voltooide status moet worden hersteld. De uitvoering wordt hervat vanaf de _volgende_ stap (to_step + 1).

### CLI

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

| Optie | Beschrijving |
|---|---|
| `<id>` | Workflow-ID (vereist) |
| `<step>` | Stapindex om naar terug te zetten, vanaf 0 geteld (vereist) |

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

## Werking

Wanneer je een workflow terugzet naar stap N:

1. Het gebeurtenislogboek wordt doorzocht op de waarde `state_after` die is vastgelegd nadat stap N was voltooid
2. Als er geen snapshot bestaat, wordt een `RuntimeException` gegenereerd
3. De workflowregel wordt vergrendeld
4. De workflowstatus wordt vervangen door de snapshot, waarbij alle gereserveerde sleutels (`_steps`, `_queue`, `_priority`, enz.) uit de huidige workflowregel behouden blijven
5. `current_step` wordt ingesteld op N + 1 en `status` wordt ingesteld op `running`
6. Alle velden `error_message` en `failed_at` worden gewist
7. De stap op index N + 1 wordt in de wachtrij geplaatst voor verwerking
8. Er wordt een `workflow_rewound`-loggebeurtenis vastgelegd

De worker verwerkt vervolgens de stap die in de wachtrij is geplaatst en de workflow gaat vanaf dat punt verder zoals gebruikelijk.

## Vereisten

Voor terugzetten zijn `state_after`-gegevens in het gebeurtenislogboek nodig. Het gebeurtenislogboek legt deze automatisch vast voor elke `step_completed`-gebeurtenis. Als het gebeurtenislogboek is opgeschoond (via `WorkflowEventLog::prune()`) en de status voor de doelstap niet meer bestaat, mislukt het terugzetten.

Zorg ervoor dat de bewaartermijn van je gebeurtenislogboek lang genoeg is voor de periode waarnaar je mogelijk wilt terugzetten.

## Toepassingen

### Een foutieve staphandler herstellen

Als een staphandler een fout bevatte waardoor onjuiste output werd geproduceerd, kun je de fix implementeren en de workflow terugzetten:

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

### Opnieuw proberen met een andere configuratie

Als een stap door externe factoren is mislukt (API-limiet, onjuiste inloggegevens), herstel je de configuratie en zet je de workflow terug om de stap opnieuw uit te voeren:

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

### Onjuiste gegevens herstellen

Als een eerdere stap onjuiste gegevens aan de status heeft toegevoegd, zet je de workflow terug naar een snapshot waarvan je weet dat die goed is:

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

## Vergelijking met opnieuw proberen

| Aspect | `retry_workflow()` | `rewind_workflow()` |
|---|---|---|
| Hervat vanaf | De mislukte stap | Elke eerdere stap |
| Status | Huidige workflowstatus | Hersteld uit het gebeurtenislogboek `state_after` |
| Vereist | Workflow heeft de status `failed` | Snapshot van de doelstap in het gebeurtenislogboek |
| Status na afloop | `running` | `running` |
| Loggebeurtenis | geen | `workflow_rewound` |
