
# Ramificação de fluxos de trabalho

Queuety pode ramificar um fluxo de trabalho em execução e criar uma cópia totalmente independente. O fluxo de trabalho ramificado começa na mesma etapa e com o mesmo estado do original, mas ambos seguem de forma independente a partir desse ponto. As alterações em um não afetam o outro.

## Ramificar um fluxo de trabalho

### PHP API

Chame `Queuety::fork_workflow()` com o ID do fluxo de trabalho. Ele retorna o novo ID do fluxo de trabalho:

```php
use Queuety\Queuety;

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

### CLI

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

| Opção | Descrição |
|---|---|
| `<id>` | ID do fluxo de trabalho a ramificar (obrigatório) |

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

## Como funciona

Ao ramificar um fluxo de trabalho:

1. A linha do fluxo de trabalho original é bloqueada e lida
2. Uma nova linha de fluxo de trabalho é inserida com o mesmo estado, as mesmas definições de etapas e a mesma etapa atual
3. O nome do novo fluxo de trabalho é `{original_name}_fork_{timestamp}`
4. A etapa atual é enfileirada para o fluxo de trabalho ramificado
5. Um evento de registro `workflow_forked` é registrado nos fluxos de trabalho original e ramificado
6. O fluxo de trabalho original continua sendo processado normalmente

O fluxo de trabalho ramificado é totalmente independente. Ele tem seu próprio ID, sua própria cópia do estado e suas próprias entradas na fila de trabalhos. A partir da ramificação, cada fluxo de trabalho pode seguir caminhos diferentes livremente.

## Casos de uso

### Testar manipuladores de etapas com testes A/B

Ramifique um fluxo de trabalho para testar duas implementações diferentes de uma próxima etapa:

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

### Análise de cenários hipotéticos

Ramifique um fluxo de trabalho em um ponto de decisão para explorar caminhos diferentes:

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

Cada ramificação segue com o mesmo estado de entrada, mas pode ser modificada para percorrer caminhos diferentes.

### Experimentação em paralelo

Quando um fluxo de trabalho chegar a um ponto em que você queira testar várias abordagens em paralelo, crie uma ramificação para cada abordagem e compare os resultados quando todas forem concluídas.

## Acompanhar ramificações

O evento de registro de cada fluxo de trabalho inclui uma referência ao outro:

- No original: `context.forked_workflow_id` aponta para o novo fluxo de trabalho
- Na ramificação: `context.forked_from_workflow_id` aponta para o original

Consulte os registros para encontrar todas as ramificações de um fluxo de trabalho:

```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
    }
}
```

## Limitações

- O fluxo de trabalho ramificado não herda o histórico do registro de eventos do original. Ele começa com um registro de eventos vazio.
- As relações de execução de fluxos de trabalho não são duplicadas. Se o fluxo de trabalho original tiver uma execução de outro fluxo em andamento, a ramificação não receberá uma cópia dela.
- A ramificação é uma captura do estado atual. Os trabalhos em andamento do fluxo de trabalho original não são duplicados.
