
# Bifurcación de flujos de trabajo

Queuety puede bifurcar un flujo de trabajo en ejecución para crear una copia totalmente independiente. El flujo bifurcado comienza en el mismo paso y con el mismo estado que el original, pero ambos avanzan por separado desde ese punto. Los cambios en uno no afectan al otro.

## Bifurcar un flujo de trabajo

### PHP API

Llama a `Queuety::fork_workflow()` con el ID del flujo de trabajo. Devuelve el ID del nuevo flujo:

```php
use Queuety\Queuety;

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

### CLI

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

| Opción | Descripción |
|---|---|
| `<id>` | ID del flujo de trabajo que se bifurcará (obligatorio) |

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

## Cómo funciona

Al bifurcar un flujo de trabajo:

1. Se bloquea y se lee la fila del flujo de trabajo original
2. Se inserta una nueva fila con el mismo estado, las mismas definiciones de pasos y el paso actual
3. El nuevo flujo de trabajo recibe el nombre `{original_name}_fork_{timestamp}`
4. Se pone en cola el paso actual para el flujo bifurcado
5. Se registra un evento de registro `workflow_forked` en ambos flujos de trabajo
6. El flujo de trabajo original continúa procesándose con normalidad

El flujo bifurcado es completamente independiente. Tiene su propio ID, su propia copia del estado y sus propias entradas en la cola de trabajos. A partir de la bifurcación, cada flujo puede seguir un rumbo distinto sin restricciones.

## Casos de uso

### Pruebas A/B de controladores de pasos

Bifurca un flujo de trabajo para probar dos implementaciones distintas de un próximo paso:

```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álisis de escenarios hipotéticos

Bifurca un flujo de trabajo en un punto de decisión para explorar distintas ramas:

```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 bifurcación parte del mismo estado de entrada, pero puede modificarse para seguir una ruta distinta.

### Experimentación en paralelo

Cuando un flujo de trabajo llegue a un punto en el que quieras probar varios enfoques en paralelo, bifúrcalo para cada enfoque y compara los resultados cuando todas las bifurcaciones hayan terminado.

## Seguimiento de bifurcaciones

El evento de registro de cada flujo incluye una referencia al otro:

- En el original: `context.forked_workflow_id` apunta al nuevo flujo de trabajo
- En la bifurcación: `context.forked_from_workflow_id` apunta al original

Consulta los registros para encontrar todas las bifurcaciones de un flujo de trabajo:

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

## Limitaciones

- El flujo bifurcado no hereda el historial del registro de eventos del original. Empieza con un registro de eventos limpio.
- Las relaciones entre ejecuciones de flujos de trabajo no se duplican. Si el flujo original tenía una ejecución de flujo de trabajo en curso, la bifurcación no obtiene una copia.
- La bifurcación es una instantánea del estado actual. Los trabajos en curso del flujo original no se duplican.
