
# Työnkulun haarauttaminen

Queuety voi haarauttaa käynnissä olevan työnkulun täysin itsenäiseksi kopioksi. Haarautettu työnkulku alkaa samasta vaiheesta ja samassa tilassa kuin alkuperäinen, mutta työnkulut jatkavat tästä eteenpäin itsenäisesti. Toiseen tehdyt muutokset eivät vaikuta toiseen.

## Työnkulun haarauttaminen

### PHP API

Kutsu toimintoa `Queuety::fork_workflow()` työnkulun tunnuksella. Se palauttaa uuden työnkulun tunnuksen:

```php
use Queuety\Queuety;

$forked_id = Queuety::fork_workflow( $workflow_id );
```

### CLI

```bash
wp queuety workflow fork <id>
```

| Valitsin | Kuvaus |
|---|---|
| `<id>` | Haarautettavan työnkulun tunniste (pakollinen) |

```bash
wp queuety workflow fork 42
# Success: Workflow #42 forked. New workflow ID: 43.
```

## Näin se toimii

Kun haarautat työnkulun:

1. Alkuperäisen työnkulun rivi lukitaan ja luetaan
2. Uusi työnkulun rivi lisätään samalla tilalla, vaihemäärityksillä ja nykyisellä vaiheella
3. Uuden työnkulun nimi on `{original_name}_fork_{timestamp}`
4. Nykyinen vaihe lisätään haarautetun työnkulun jonoon
5. `workflow_forked`-lokitapahtuma kirjataan sekä alkuperäiseen että haarautettuun työnkulkuun
6. Alkuperäinen työnkulku jatkaa käsittelyä normaalisti

Haarautettu työnkulku on täysin itsenäinen. Sillä on oma työnkulun tunnus, oma tilakopio ja omat työjonon merkinnät. Haarautumiskohdasta eteenpäin työnkulut voivat edetä eri suuntiin.

## Käyttötapaukset

### Vaihekäsittelijöiden A/B-testaus

Haarauta työnkulku testataksesi kahta eri toteutusta tulevassa vaiheessa:

```php
// Original workflow will use the existing CallLLMHandler (GPT-4).
// Fork it to test with a different handler.
$forked_id = Queuety::fork_workflow( $workflow_id );

// Modify the forked workflow's state to use a different model.
// (Update the state via a custom step or direct DB update.)
```

### Mitä jos -analyysi

Haarauta työnkulku päätöskohdassa tutkiaksesi eri haaroja:

```php
// Workflow is at step 3, about to process data.
// Fork it so we can try two different processing strategies.
$fork_a = Queuety::fork_workflow( $workflow_id );
$fork_b = Queuety::fork_workflow( $workflow_id );
```

Jokainen haara jatkaa samalla syötetilalla, mutta sitä voi muokata kulkemaan eri reittiä.

### Rinnakkainen kokeilu

Kun työnkulku saavuttaa kohdan, jossa haluat kokeilla useita lähestymistapoja rinnakkain, haarauta se kutakin lähestymistapaa varten ja vertaa tuloksia, kun kaikki haarat ovat valmistuneet.

## Haarautumisten seuranta

Kummankin työnkulun lokitapahtuma sisältää viittauksen toiseen:

- Alkuperäisessä: `context.forked_workflow_id` viittaa uuteen työnkulkuun
- Haarautetussa: `context.forked_from_workflow_id` viittaa alkuperäiseen

Kysely lokista löytääksesi työnkulun kaikki haarat:

```php
$logs = Queuety::logger()->for_workflow( $workflow_id );

foreach ( $logs as $entry ) {
    if ( 'workflow_forked' === $entry['event'] ) {
        $context = json_decode( $entry['context'] ?? '{}', true );
        // $context['forked_workflow_id'] is the new workflow
    }
}
```

## Rajoitukset

- Haarautettu työnkulku ei peri alkuperäisen tapahtumalokia, vaan aloittaa puhtaalla lokilla.
- Työnkulun suoritusten välisiä suhteita ei kopioida. Jos alkuperäisessä työnkulussa oli käynnissä oleva työnkulun suoritus, haarautettu työnkulku ei saa siitä kopiota.
- Haarautettu työnkulku on nykyisen tilan tilannekuva. Alkuperäisen työnkulun käynnissä olevia töitä ei kopioida.
