الدرس 07 · ذاكرة

احفظ الحالة على القرص لتنجو من الضغط

«حالة تنجو من الضغط — لأنها خارج المحادثة.»

⏱ ~10 د · 📝 3 مكونات تفاعلية · 🧑‍💻 مبني على shareAI-lab · s07_task_system.py

ما الفرق بين TodoWrite و Task؟

يستطيع TodoManager في s03 إدراج المهام أيضاً — لكنه يخزنها في الذاكرة. حين تُطلق auto_compact من s06، تُستبدل messages[] بملخص، وتُفقد حالة TodoManager معها (لأنها في الذاكرة).

الـ Task في s07 مختلف: كل مهمة ملف .tasks/task_42.json. سواء ضُغط السياق، أو أُعيد تشغيل العملية، أو استُبدل الوكيل — طالما الملفات على القرص، المهام باقية.

# .tasks/task_12.json
{
  "id": 12,
  "subject": "Refactor auth middleware",
  "description": "Extract JWT logic to shared module",
  "status": "pending",
  "blockedBy": [8, 11],   # 必须先完成 #8 和 #11
  "owner": ""
}
قاعدة الاختيار: للمهام المؤقتة (تنتهي وتُنسى) استخدم todo؛ للمهام الدائمة (تتجاوز الجلسات، لها تبعيات) استخدم task.

blockedBy · سلوك رسم التبعيات

blockedBy قائمة بمعرّفات المهام — يجب إكمالها جميعاً قبل أن تصبح المهمة الحالية «قابلة للتنفيذ».

في تطبيق s07 تفصيل أنيق: حين تكتمل مهمة، تُحذف تلقائياً من قوائم blockedBy في جميع المهام الأخرى.

def _clear_dependency(self, completed_id: int):
    # Scan every task, remove completed_id from their blockedBy
    for f in self.dir.glob("task_*.json"):
        task = json.loads(f.read_text())
        if completed_id in task.get("blockedBy", []):
            task["blockedBy"].remove(completed_id)
            self._save(task)

لا يحتاج الوكيل جدولاً منفصلاً لـ «ما تم فتحه». يكفي فحص .tasks/ والبحث عن status=="pending" and not blockedBy لمعرفة ما يمكن تنفيذه الآن.

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

المكوّن التالي يمنحك رسم تبعيات لـ 5 مهام. اضغط «complete» وشاهد blockedBy يُحدَّث تلقائياً وأي المهام تتحول إلى «قابلة للتنفيذ» (مُظللة بالأخضر).

هل تنجو من الضغط؟

s06 شرح أن auto_compact تستبدل messages[] بملخص واحد. لكن المهام لا تتأثر لأنها على القرص. اختبر ذلك: دع الوكيل يُنشئ 5 مهام، اضغط السياق، ثم افحص .tasks/ وستجد كل شيء في مكانه.

تفاعلي

Widget 1 · Dependency Graph · اضغط complete وشاهد التبعيات تتحدث

رسم توبولوجي لـ 5 مهام. اضغط زر على أي مهمة pending لتغيير حالتها، وراقب تحديث مصفوفة blockedBy وقائمة «المهام القابلة للتنفيذ الآن».

قائمة المهام (دليل .tasks/)
قابلة للتنفيذ الآن (status=pending, blockedBy=[])
رسم التبعيات
تفاعلي

Widget 2 · Compression Survival · المهام تنجو من auto_compact

دع الوكيل يُنشئ 3 مهام، ثم أطلق auto_compact (يُمسح messages)، ثم استعد — وشاهد هل المهام لا تزال موجودة.

دليل .tasks/
messages[]
تفاعلي

Widget 3 · Dependency Chain · أي المهام يمكن تنفيذها الآن

رسم تبعيات لـ 5 مهام. أجب: في الحالة المعطاة، ما المهام القابلة للبدء الآن (قد تكون أكثر من واحدة).

أصبت في 0 / 4