المشروع 08. ارسم سير عملك كرسم بياني
المحاضرة ذات الصلة: المحاضرة 14. من الحلقة الواحدة إلى هندسة الرسوم البيانية
ماذا ستفعل
هذا هو المشروع الانتقالي من "Loop" إلى "Graph". في المحاضرة السابقة بنيت حلقة maker-checker — تنفيذ، تحقق، تغذية راجعة، إعادة تنفيذ، وكل القرارات تحدث داخل نافذة سياق وكيل واحد. ما ستفعله في هذا المشروع هو رسم البنية المخفية داخل الحلقة بشكل صريح: العقد، والحواف، والحالة المشتركة، وقواعد التوجيه، مكتوبة حرفًا حرفًا بوضوح.
ستقوم بثلاث تجارب متتالية: أولًا ترسم حلقة maker-checker الخاصة بـ P07 كرسم بياني صريح، ثم تضيف عقدة fan-out/fan-in متوازية إلى الرسم، وأخيرًا تضيف حافة تراجع شرطية وعقدة موافقة بشرية. بعد الانتهاء ستشعر بنفسك بشيء واحد: الرسم البياني ليس اختراعًا جديدًا، بل هو ما يتحول إليه loop تلقائيًا عندما تتعقد حلقتك إلى درجة معينة.
الأدوات التي ستستخدمها
- Claude Code أو Codex
- Git
- حلقة maker-checker التي بنيتها في P07 (أو أي سير عمل وكيل يمكنك تشغيله بشكل متكرر)
- محرر نصوص أو أداة رسم (الرسم ليس للجمال، بل لكتابة البنية بوضوح؛
mermaidأو كتابةgraph.mdيدويًا كلاهما جيد)
الخطوات
التحضير
- ابدأ من المستودع بعد إكمال P07، أو استخدم مباشرة أي سير عمل وكيل تعمل عليه.
- أنشئ ثلاثة فروع:
p08-explicit-graph،p08-parallel،p08-human-in-the-loop. - جهّز ملف
state.mdكملف الحالة المشتركة: المتطلبات والتقدم ونتائج التحقق تُكتب جميعها هنا. هذا هو "سطح العمل المشترك" للرسم البياني.
التجربة 1: ارسم الـ Loop كرسم بياني صريح
انتقل إلى الفرع p08-explicit-graph.
- اسرد جميع العقد: اكتب كل خطوة من حلقة maker-checker الخاصة بـ P07 كعقدة. لكل عقدة وضّح: مسؤوليتها، ومدخلاتها، ومخرجاتها، وهل هي وكيل أم كود حتمي.
- ارسم جميع الحواف: اسرد كل حافة بين العقد. علّم بوضوح الحافتين الخاصتين:
- الحافة الشرطية: نجح/فشل التحقق، أي طريق تسلك
- حافة التراجع: الفشل يعود إلى أي عقدة
- اكتب الحالة المشتركة: اسرد بوضوح الحقول الموجودة في الحالة (المتطلبات، الكود، نتائج الاختبارات، استنتاج المراجعة)، ومن يقرأها ومن يكتبها.
- اكتب قواعد التوجيه: بلغة if-then الأبسط، اكتب قواعد "إلى أين تذهب الخطوة التالية"، مثل:
إذا نجح التحقق → عقدة الدمج إذا فشل التحقق → عقدة التنفيذ إذا كانت معلومات عقدة التنفيذ غير كافية → عقدة البحث - اكتبها في
graph.md: رتب ما سبق في مستند واحد. ارسم رسمًا بيانيًا بـ mermaid، وأرفق جدول العقد وقواعد التوجيه. - أجب عن هذا السؤال: بعد الرسم، ابحث عن حافة واحدة على الأقل كانت ضمنية سابقًا — مسار قرار كان مخبأً داخل سياق الوكيل، ولم تكن تعلم حتى بوجوده.
التجربة 2: أضف عقدة Fan-out / Fan-in متوازية
انتقل إلى الفرع p08-parallel.
- اختر نقطة يمكن أن تتوازى: ابحث في المهمة عن مكان يمكن تقسيمه إلى جزأين مستقلين. مثل:
- تقسيم التنفيذ إلى وحدتين مستقلتين، يكتبهما وكيلان بالتوازي
- تقسيم التحقق إلى مراجعتين مستقلتين: واحدة تشغّل الاختبارات والـ lint، وأخرى تقوم بمراجعة الكود (تعليمات مختلفة، واهتمامات مختلفة)
- تقسيم البحث إلى اتجاهين، يفحص كل وكيل مسارًا
- اكتب قاعدة fan-out: سجّل في الحالة المشتركة "تم تقسيم هذه المهمة إلى N مهام فرعية متوازية"، ولكل مهمة فرعية سياق مستقل وعقدة مستقلة.
- اكتب قاعدة fan-in: بعد اكتمال جميع المهام الفرعية، من يدمج النتائج؟ وما معيار الدمج (مثل: يدمج فقط عند نجاح المراجعتين، أم يكفي نجاح واحدة)؟
- استخدم worktree للعزل: كل مهمة فرعية متوازية تعمل في worktree git مستقل، لتجنب تصادم الملفات فعليًا (راجع أولية Worktree في المحاضرة 13).
- شغّل مرة واحدة وسجّل: سجّل زمن الحائط قبل وبعد التوازي، واستهلاك التوكنز، وجودة النتائج. هل التوازي أسرع فعلًا؟ أم أن تكلفة التنسيق أكلت الوقت الموفّر؟
التجربة 3: أضف حافة تراجع وعقدة موافقة بشرية
انتقل إلى الفرع p08-human-in-the-loop.
هذه هي الأهم من التجارب الثلاث. ستضيف نوعين من العقد إلى الرسم:
- حافة تراجع شرطية: أضف لعقدة التحقق مسار "نجاح جزئي" — ليس رفضًا كاملًا يعيدها إلى عقدة التنفيذ، بل بالعودة بملاحظات محددة إلى العقدة التي سببت المشكلة. مثل: نجحت الاختبارات كلها لكن مراجعة الكود اكتشفت فهمًا خاطئًا للمتطلبات، فارجع إلى عقدة البحث بدلًا من عقدة التنفيذ. هذا يتطلب أن تسجّل في حالتك المشتركة "في أي طبقة وقعت المشكلة".
- عقدة موافقة بشرية (Human-in-the-loop): أضف عقدة بشرية قبل عقدة الدمج. عند الوصول إليها، يتوقف الرسم البياني وينتظر حتى تكتب "موافقة" أو "رفض" في
state.md. يمكن أن يكون لعقدة الموافقة قاعدة مهلة: إذا لم تستجب بعد N ساعة، يُرفض تلقائيًا أو يُرفع تلقائيًا. - اكتب تنسيق interrupt: كيف تُكتب طلبات الموافقة بوضوح — ماذا حدث، وما الذي تغيّر، ولماذا تحتاج إنسانًا، وما عواقب كل من الموافقة والرفض.
- شغّل جولتين كاملتين على الأقل: في كل جولة تصل إلى عقدة الموافقة البشرية، وتوافق أو ترفض بنفسك مرة واحدة. سجّل: هل قرار موافقتك يتطابق مع حكم عقدة التحقق؟ هل أوقفت عقدة الموافقة شيئًا لم توقفه عقدة التحقق؟
كيف تقيس النتائج
| المقياس | التجربة 1 (الرسم الصريح) | التجربة 2 (التوازي) | التجربة 3 (التعاون البشري) |
|---|---|---|---|
| وضوح البنية | كم حافة ضمنية وجدت؟ | هل تستطيع الحالة المشتركة دعم المهام الفرعية المتوازية؟ | هل تستطيع حافة التراجع تحديد طبقة المشكلة بدقة؟ |
| تحديد الفشل | عند الفشل هل يمكنك الإشارة مباشرة إلى أي حافة أخطأت؟ | عند فشل مهمة فرعية متوازية، هل يمكن تحديد أيها؟ | عند رفض الموافقة، هل يمكنك الإشارة إلى طبقة المشكلة؟ |
| تكلفة التعاون | كم استغرق رسم الرسم البياني؟ | الوقت الموفّر بالتوازي مقابل تكلفة التنسيق | وقت انتظار الموافقة مقابل قيمة المشكلة الموقوفة |
| قابلية الملاحظة | هل أصبحت كل خطوة مرئية الآن؟ | هل حالة كل مهمة فرعية متوازية مرئية؟ | هل طلب الموافقة مكتوب بوضوح كافٍ؟ |
| الموثوقية | هل يتطابق وصف الرسم مع التشغيل الفعلي؟ | هل معيار دمج fan-in موثوق؟ | هل تتفعل قواعد المهلة/الرفع فعلًا؟ |
ما يجب تقديمه
graph.md(وصف كامل للرسم في التجربة 1: رسم mermaid + جدول العقد + جدول الحواف + حقول الحالة المشتركة + قواعد التوجيه)- قائمة الحواف الضمنية المكتشفة في التجربة 1 (واحدة على الأقل)
- قواعد fan-out/fan-in في التجربة 2 وسجل تشغيل متوازٍ واحد (مقارنة الوقت/التكلفة/الجودة)
- قواعد حافة التراجع في التجربة 3، وتنسيق عقدة الموافقة، وسجل جولتين من التعاون البشري
- المراجعة النهائية: من الـ loop إلى الـ graph، كيف تغيّرت طريقة عملك؟ أي المهام تستحق رسمًا بيانيًا، وأيها لا يستحق؟
المحاضرات ذات الصلة
- المحاضرة 14 — من الحلقة الواحدة إلى هندسة الرسوم البيانية
- المحاضرة 13 — من المطالبة اليدوية إلى الحلقات المستقلة (حلقتك هي عقدة في الرسم البياني؛ هذا المشروع يفتح البنية الداخلية للعقدة)
- المحاضرة 09 — لماذا يعلن الوكلاء النصر مبكرًا جدًا (لماذا يجب أن تكون عقدة التحقق مستقلة عن عقدة التنفيذ؛ في الرسم البياني هذه مشكلة بنيوية)
- المحاضرة 11 — لماذا تنتمي قابلية الملاحظة داخل الـ Harness (كلما زاد تعقيد الرسم البياني، زادت حاجتك إلى رؤية ما تفعله كل عقدة)