
# تفريع سير العمل

يمكن لـ Queuety تفريع سير عمل قيد التشغيل إلى نسخة مستقلة تمامًا. يبدأ سير العمل المتفرع من الخطوة نفسها وبالحالة نفسها التي لدى سير العمل الأصلي، لكنهما يتابعان بشكل مستقل منذ تلك النقطة. ولا تؤثر التغييرات في أحدهما على الآخر.

## تفريع سير عمل

### PHP API

استدعِ `Queuety::fork_workflow()` باستخدام معرّف سير العمل. وسيُرجع معرّف سير العمل الجديد:

```php
use Queuety\Queuety;

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

### CLI

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

| الخيار | الوصف |
|---|---|
| `<id>` | معرّف سير العمل المراد تفريعه (مطلوب) |

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

## طريقة العمل

عند تفريع سير عمل:

1. يُقفل سجل سير العمل الأصلي وتُقرأ بياناته
2. يُدرج سجل جديد لسير العمل بالحالة نفسها وتعريفات الخطوات والخطوة الحالية
3. يكون اسم سير العمل الجديد `{original_name}_fork_{timestamp}`
4. تُدرج الخطوة الحالية في قائمة انتظار سير العمل المتفرع
5. يُسجل حدث سجل `workflow_forked` على سير العمل الأصلي والمتفرع
6. يواصل سير العمل الأصلي المعالجة كالمعتاد

سير العمل المتفرع مستقل تمامًا. له معرّف سير عمل خاص به، ونسخة خاصة من الحالة، وإدخالات خاصة به في قائمة انتظار المهام. ومن نقطة التفريع فصاعدًا، يمكن لكل سير عمل أن يسلك مسارًا مختلفًا بحرية.

## حالات الاستخدام

### اختبار معالجات الخطوات بنظام A/B

فرّع سير عمل لاختبار تطبيقين مختلفين لخطوة قادمة:

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

### تحليل الافتراضات البديلة

فرّع سير عمل عند نقطة قرار لاستكشاف فروع مختلفة:

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

يتابع كل سير عمل متفرع باستخدام حالة الإدخال نفسها، لكن يمكن تعديله ليسلك مسارًا مختلفًا.

### التجريب المتوازي

عندما يصل سير العمل إلى نقطة تريد فيها تجربة عدة أساليب بالتوازي، فرّعه لكل أسلوب، ثم قارن النتائج بعد اكتمال جميع النسخ المتفرعة.

## تتبّع عمليات التفريع

يتضمن حدث السجل في كل سير عمل إشارة إلى الآخر:

- في سير العمل الأصلي: يشير `context.forked_workflow_id` إلى سير العمل الجديد
- في سير العمل المتفرع: يشير `context.forked_from_workflow_id` إلى سير العمل الأصلي

استعلم عن السجلات للعثور على جميع النسخ المتفرعة من سير عمل:

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

## القيود

- لا يرث سير العمل المتفرع سجل الأحداث من سير العمل الأصلي، بل يبدأ بسجل أحداث فارغ.
- لا تُكرر علاقات تشغيل سير العمل. إذا كان لسير العمل الأصلي تشغيل لسير عمل آخر، فلن يحصل سير العمل المتفرع على نسخة منه.
- النسخة المتفرعة لقطة للحالة الحالية. ولا تُكرر المهام قيد التنفيذ الخاصة بسير العمل الأصلي.
