تخطَّ إلى المحتوى
kazma.
البحث في كاظمه والتوثيق
EN

خريطة التشخيص (الأنظمة متعددة المسارات)

خريطة التشخيص — الأنظمة متعددة المسارات

Section titled “خريطة التشخيص — الأنظمة متعددة المسارات”

الغرض: حين “يلمس” خطأٌ “ملفات كثيرة”، تجيب هذه الوثيقة عن: ما العنصر نفسه، وكم مسارًا يخدمه، وأين تنظر أولًا.

الجمهور: المشغّلون، والمساهمون، ووكلاء البرمجة.
الرفيق: السرد في البنية · فهرس الوحدات الكامل docs/ARCHITECTURE_AND_SYSTEM_MAP.md · قواعد الوكلاء AGENTS.md.

كيفية الاستخدام: اعثر على العَرَض في §1 → افتح العنصر في §2–10 → طبّق الثابت وخطوة التحقق.
إن غيّرت عنصرًا متعدد المسارات، فحدّث هذه الصفحة في نفس طلب الدمج.


0. النموذج الذهني (دماغ واحد، أفواه كثيرة)

Section titled “0. النموذج الذهني (دماغ واحد، أفواه كثيرة)”

إشارات مراجعة جودة الأجوبة

Section titled “إشارات مراجعة جودة الأجوبة”

تقرأ لوحة جودة الأجوبة في Dashboard نقطة GET /api/dashboard/answer-quality الخاصة بالمشرفين. يُكتب سجل بياناتها الوصفية خارج حلقة الأحداث عند عقدة الرد النهائي المشتركة (agent/graph_respond.py → observability/answer_quality.py) لأدوار الويب والبوابة. يحفظ العلامات وهوية الدور والمحادثة دون نص الموجّه أو الجواب أو وسائط الأدوات، لمدة 30 يومًا وبحد أقصى 10,000 دور. تربط الإشارات الحديثة بالمحادثات القائمة.

قد تكون للمسودات الفارغة وإعادة فحص وسائط الأدوات وكتل التخطيط نتائج صحيحة أو مُصلحة: افحص الدور المرتبط بدل اعتبار العداد درجة دقة. تغطي فحوص الفقرة طلبات النثر الإنجليزي والعربي الصريحة بفقرة واحدة فقط؛ وتُستثنى الشيفرة والقوائم وJSON والتنسيقات المقتبسة. تقع التوقفات والإلغاءات وأوامر الاستخدام خارج هذا السجل النهائي. تظهر أخطاء التخزين كعدم توفر ولا تمنع تسليم الرد. ولا ترسل هذه اللوحة إشعارات خارجية.

User surfaces Identity Brain Execution Safety
───────────── ──────── ───── ───────── ──────
Web SSE session_id build_supervisor_graph UnifiedToolExecutor HITL A graph interrupt
Web WS ──► ≠ thread_id ──► (LangGraph) ──► LocalToolRegistry ──► HITL B swarm bus
Telegram/Discord/Slack gw-{platform}-… checkpointer IdeService._call_tool HITL C pipeline
TUI / CLI active_thread.* agent_runner MCP + native skills YOLO / grants

القواعد الذهبية

  1. معرّفات المنصات لا تدخل حالة LangGraph أبدًا (البوابة تعيدها عند الرد).
  2. النموذج والمزوّد يتبدلان معًا (model_registry).
  3. أدوات الخطر تمر عبر واحد من ثلاثة مسارات تنفيذ HITL؛ حقيقة القرار هي hitl_gates.db. ‏FanOut في السرب ثلاثي الحالة، لا أول-صوت-يفوز.
  4. لجذر مساحة العمل حلّال واحد: workspace.binding.resolve_active_root() (وأيضًا file_write._get_workspace).
  5. مصدر حقيقة إعدادات التشغيل هو ConfigStore (get_config_store())، لا ملفات مرتجلة.
  6. تسليم الدور: close_turn هو المُغلِق الوحيد؛ العميل يعرض. لا رسّاخ ثانٍ.
  7. عرض HITL: اضمم النص + السجل قبل الرسم. resolve_gate_views هو الجواب الوحيد عن “في أي حالة هذه البوابة”. يرسم JS ‏part.view / status.gate_views. والمعلّق هو الحالة التفاعلية الوحيدة.

1. العَرَض → أول مكان تنظر إليه

Section titled “1. العَرَض → أول مكان تنظر إليه”
العَرَضافحص أولًاثمالعنصر ذو الصلة
واجهة الويب عالقة على إيقاف / Enter ميتآلة أدوار chat.js + حالة idle/stream_end في agentStoreتفضيل مسار WS مقابل SSE؛ حدث نهاية مفقود§2 ناقلات الدردشة
YOLO “مفعّل” لكنه ما يزال يطلب الموافقةthread_id في ContextVar مقابل session_idاستئناف WS يستخدم ainvoke + enable_yolo(thread)§2، §4 HITL أ
أدوات الخطر تعمل بلا توجيهأي رسم هو الحي (هل أُعيد تجميع _graph_holder؟)hitl_config محذوف في موقع بناء§3 بناء الرسم
زر الموافقة لا يفعل شيئًاهل يطابق thread_id الاستئنافُ المقاطعةَ؛ مطالبة السجل 409؟وجود Checkpointer؛ Command(resume=…)؛ حالة صف hitl_gates.db§4 HITL أ، سجل البوابات
بطاقة شبح / مختومة مسبقًا بـموافق / سؤال ثانٍ على لوحة التحكم فقطresolve_gate_views + gate_views؛ pending هي الحالة التفاعلية الوحيدةاضمم /messages + /status قبل الرسم؛ لا تستنتج أبدًا “موافق” من صف مفقود§4 عرض HITL، سجل البوابات
موافقة مزدوجة / تعليق بعد الموافقة_graph_hitl_gate_ctx / _hitl_approved_ctxعلى الناقل التخطي حين يكون الرسم موافقًا بالفعل؛ H-8 لا بوابة ثانية من execute()§4 البوابة المزدوجة
كتابة IDE مرفوضة بواسطة HITLيستخدم IDE الناقل (HITL ب)، لا مقاطعة الرسمNullBus يفشل مغلقًا بلا ناقل منصة§4 ب، §7 الأدوات
الدردشات تتجمد 15–70 ث؛ الحارس يعيد التشغيل بـ unhealthy (probe error: timed out).kazma/stall-*.txt — إطار كاظمه الأعلى في خيط حلقة الأحداث يسمّي مساعدًا متزامنًا يقوم بـ I/O من كود غير متزامنأضفه إلى _LOOP_STALL_HELPERS (tests/test_static_gates.py)؛ غلّف كل موقع استدعاء غير متزامن في asyncio.to_threadAGENTS §35؛ التقرير الأسبوعي “توقف حلقة الأحداث”
مجسات الصحة تفشل بـ WinError 10048 / 10055الآلة نفدت منافذها، لا كاظمه: guard.log ‏health.probe_unrunnable + health.port_exhaustion (مالكو المقابس)سجل Windows للنظام، Tcpip 4231 / 4227 / 4266؛ وسّع النطاق (netsh int ipv4 set dynamicport tcp start=10000 num=55535)الحارس — هذه المجسات لا تُحتسب أبدًا نحو إعادة تشغيل
تقرير المرونة الأسبوعي يقول إن آلية “صامتة”هل سجّل الكود سطر نجاح؟ هل تطابقه التوقيعات (test_every_ledger_signature_matches_a_line_the_code_emits)؟يقرأ التقرير السجلات المتدوّرة؛ ابحث أنت عن السطر في kazma.log.*AGENTS §27C
التقرير الأسبوعي: “Needs a look”عَرَض ظهر (إعادات تشغيل بأسبابها، تجمدات حلقة الأحداث) أو مهمة مجدولة دون جدولها (“daily digest (2 of 7 scheduled)”)عبارة “The event loop was blocked in: …” تسمّي الدالة؛ وهي المُدخل التالي في _LOOP_STALL_HELPERSAGENTS §27C، §35
تنبيه الحارس “Kazma is up, but not ready”التبعية التي يسمّيها التنبيه — عادةً قاعدة البيانات: docker logs kazma-db-win (“was interrupted”، “not properly shut down”)، وتحديثات Docker Desktopيتجاوزه الحارس ولا يعيد التشغيل إلا بعد KAZMA_GUARD_DEPENDENCY_OUTAGE_S (10 دقائق)AGENTS §44
تنبيه الحارس “Kazma stopped: process exited (code N)”أسطرها الأخيرة في التنبيه؛ وكاملها في .kazma/server.stderr.logالانهيار الأصلي يكتب هناك مكدّس كل خيط (faulthandler)AGENTS §39
الوكيل “نسي” محادثة قديمةepisodes.tier = 'archived' — لا يبقى إلا بذرة summary_textتحتاج الأرشفة إنشاءً وعدم استدعاء يتجاوز episodic_ttl_days؛ استعد النص من نسخة احتياطية أُخذت قبل تاريخ الأرشفة§9 الذاكرة؛ “دورة حياة الحلقات” في memory-and-rag
مستودع النسخ الاحتياطية ينمو باستمرارتجميع restic forget — يجب أن يكون --group-by host,tagsهل [restic] maintenance ok في السجل؟الاحتفاظ في ops/disaster-recovery
مفتاح تبديل في الإعدادات بلا أثرأسماء المفاتيح: YAML متداخل مقابل ConfigStore مسطّحدالة المستهلك تقرأ المفتاح فعلًا§6 طبقات الإعداد
نموذج خاطئ / 401 بعد التبديلنقاط الدخول الثلاث في model_registry كلهافرع صنف المزوّد (لا Bearer العام)§5 المزوّدون
أدوات الملفات “خارج مساحة العمل”أسبقية _get_workspace() فقطلا تعد التنفيذ في IdeService§8 مساحة العمل
الذاكرة تنسى / البحث ≠ استدعاء الدردشةrecall() فارغ / انزياح FTS / المُضمِّن متوقفصحة V2 في لوحة التحكم؛ fts_health؛ ليست محوّل V1§9 الذاكرة
web_search فارغعنوان SearXNG + صيغة JSONملاحظات سلسلة الخلفيات في مخرجات الأداة§10 البحث
read_url ضعيف أو حاجز روبوتاتHTTP ثم Chromium محلي ثم استرداد مستضاف مسموح صراحةوضع الجلب وقائمة السماح؛ المفتاح وحده لا يمنح إذنًا؛ وتثبيت IP عند المسار المباشر§10 البحث
نتائج معرفة قديمة بعد تقلص الوثائقتتخطى الفهرسة الذكية الصفحات غير المتغيرة وتستبدل المحتوى المتغير؛ ويُحفظ المحتوى عند غياب الاكتشاف وحدهKnowledgeIndex.index / purge_source؛ افحص أخطاء الاكتشاف والتغطية§10 المعرفة
حقن KB فارغ / مستأجر خاطئlist_auto_inject_libraries + ‏RRF الفيدرالي بـ kb_mode=injectKAZMA_KB_AUTO_INJECT، والبحث الذكي، وراية الأرشفة§10 المعرفة
مهمة سرب عالقة “متوقفة مؤقتًا”مدير نقاط تفتيش HITL جليست أ ولا ب§4 ج
الوكيل يستأنف مهمة قديمة بعد تغيّر الموضوعshift_explicit مقابل shift_inferred؛ هل task_status استُبدل؟الانعطاف الصريح وحده يوقف الاستدعاء؛ والمستنتَج يعيد الترتيب§9 تركيز الدور، AGENTS.md §29
الوكيل يتخلى عن مهمة مشروعة متعددة الخطوات في منتصف التدفقshift_inferred على استفسار تفقدٍ استفهاميالتفقدات (EN + AR شنو/وش/…) يجب ألا تُصنَّف انحرافًا أبدًا§9 تركيز الدور
/replay فارغ على قناة واحدةsnapshot_recorder في كل مواقع بناء الرسمالالتقاط في عقدة المشرف§3 السفر عبر الزمن
الجلسة في الشريط الجانبي بعد F5 فقطعلى WS تحديث/إدراج الجلسات صعودًا مثل SSEهل SessionManager مشترك؟§2 الجلسات
تيليجرام: الموافقة منتهية بعد الجواب النهائياستدعاء راجع approve_task مكرر/متأخر بعد الاستئنافرسالة ناعمة / إزالة ارتداد في hitl.py — العمل غالبًا يكون قد جرى بالفعل§4 HITL أ
حلقة أدوات / حد تكرار (بطاقة توقف ثنائية اللغة)recursion_limit مقابل agent.max_iterations غير متحاذيين/long on أو إعدادات المهمة الطويلة؛ resolve_turn_budgets()§11 المهمة الطويلة
المتابعة تعيد العمل نفسه بعد بلوغ الميزانيةسياق المتابعة غير مخزّن/مستهلكlong_task.continue.{thread} + حقن في الدور التالي§11 المهمة الطويلة
تدقيق طويل يموت مع تفعيل YOLOYOLO يتخطى HITL فقط؛ ما يزال يحتاج سعةفعّل كلا /long on و/yolo§4، §11
البوت يُقرّ بـ**“حُفظ. جاهز…”** بدل تنفيذ الأوامرمهمة متقادمة بعد Partial: سياق متابعة محقون قبل أمر جديد + المهمة تُركت نشطةمنذ 2026-08-19: الحقن مقيد بـ is_continuation_reply، وPartial يوقف المهمة الطويلة مؤقتًا. البُنى الأقدم: /long off يمسحه§11 المهمة الطويلة
تذكير / بطاقة HITL لا تُسلَّم أبدًا بعد ~5 دقائقTTL لـ SessionStore هو 300s — لا تبحث عن chat_id وقت الإطلاقيستخدم Cron ‏delivery_target الملتقط عند الجدولة. المساعد: kazma_core.sessions.ttl.refuse_session_lookup_for_durable_job§2 الجلسات، AGENTS.md §16
توجيه يحوي “barcode” يوجَّه إلى نموذج البرمجةكان ModelRouter.classify يطابق code كسلسلة جزئيةتصنيف بحدود الكلمات؛ models.defaults.<kind> يتغلب على كلمات YAML المفتاحية§5 المزوّدون
نص مورد MCP يُتَّبع كتعليماتيجب تسوير جسم الموردmcp_read_resource → format_untrusted_block(source=mcp_resource:…)§12 الحقن
خادم MCP طلب من كاظمه أخذ عيّنة (استدعاء LLM الخاص بنا)يجب ألا يعمل sampling/createMessage تلقائيًامرفوض بلا HITL؛ KAZMA_MCP_SAMPLING مطفأ افتراضيًا§4 HITL
خطة مرسومة، لا ردّ (حفظ الذاكرة / الأدوات)plan_fence.py فصل/تسوية؛ متابعة المشرف بالخطة فقطdone.content في SSE/WS مصدر الحقيقة؛ strip في chat.js + applyFinal دائمًا§2 ناقلات الدردشة
أفكار مرئية حيّة، تختفي بعد الدوركانت بطاقة المهمة الحية سلسلة تفكير ثانية تُفكّ؛ وسرق _answerFromDoc التفكير كجوابطيّة عمل واحدة في الفقاعة؛ بطاقة المهمة شريط؛ الأفكار أجزاء reasoningdocs/plans/COT_AND_THOUGHTS.md

2. ناقلات الدردشة (SSE ↔ WebSocket)

Section titled “2. ناقلات الدردشة (SSE ↔ WebSocket)”
الشأنمتصل بـ
دردشة المتصفحرسم SSE (حزمة sse_chat/ + عارض static/js/chat.js) + قياسات WS البعدية (routes/ws_chat.py)
الناقل المفضلSSE للأدوار وHITL. ‏WS لاستئناف المؤشر / الإطارات الحية.
التحكم في الأدوار عبر WSلا شيء: تُرفض send_prompt / approve_tool / stop / steer / abort مع ذكر مسار HTTP (ws_chat._HTTP_ROUTE_FOR). أُزيل منفذ الخروج KAZMA_WS_GRAPH في 2026-09-30 (AUD-026).
مخزن الجلساتواحد SessionManager / chat_sessions.db لكليهما
خيط LangGraphChatSession.thread_id (قد ≠ session_id لمعرّفات UUID الويب العادية)
جلسات الويب المرتبطة بالمنصاتsession_id == thread_id حين تكون gw-*
الشأنSSE (الرسم مصدر الحقيقة)WebSocket (القياسات)
النقطة الطرفيةPOST /api/chat/stream/ws/chat/{session_id}
مصدر الرسم_graph_holder (بعد إعادة التجميع)الحامل نفسه؛ للقراءة فقط (بطاقة HITL عند الاتصال)
recursion_limitميزانيات المهام الطويلةالمساعد نفسه (مسح HITL عند الاتصال)
نهاية الدورSSE ‏event: doneidle + stream_end (مسجَّل)
إصدار HITLإطار hitl في SSE يحمل viewhitl_approval القياسي (مسح)
استئناف HITLPOST /api/approve/{thread_id} (‏200/409 يحملان view + gate_id)لا شيء — يُرفض approve_tool
YOLOأمر /yolo في التدفقلا شيء (لا أدوار)
سياق البيئةbuild_env_context() لكل دورلا شيء (لا أدوار)
حقن الروحكتلة تحسين ذاتي مسيَّجة(انظر البوابة لمسار تيليجرام)
سياج الخطة / النص النهائيplan_fence.pick_user_facing_text على done.content + حفظ الجلسةلا شيء (المقبس لا يحفظ شيئًا)
  • إضافة حدث قياسي جديد على SSE وحدها أو WS وحدها يكسر الواجهة من جديد.
  • أدوار الرسم مكانها SSE. لا تضف عميل رسم ثالثًا.
  • session_id للواجهة/التخزين؛ thread_id لـ LangGraph + YOLO + HITL.
  • نص المساعد المواجه للمستخدم ليس أبدًا غالق plan ملصوقًا (` Saved.). ‏plan_fence.py` هو مصدر الحقيقة.
  • استئناف HITL للنماذج المخصصة: استخدم ainvoke(Command)، لا astream_events المعلِّق.
  • kazma-ui/kazma_ui/sse_chat/ (الحزمة)
  • kazma-ui/kazma_ui/turn_runtime.py (close_turn)
  • kazma-ui/kazma_ui/routes/ws_chat.py
  • kazma-ui/kazma_ui/static/js/chat.js (renderTurn، _serverGateViews، TurnView)
  • kazma-ui/kazma_ui/static/js/modules/turn_document.js
  • kazma-ui/kazma_ui/static/js/stores/agentStore.js
  • kazma-ui/kazma_ui/session_manager.py
  • kazma-ui/kazma_ui/app.py (يركّب كلا الموجِّهين + _graph_holder)

3. مواقع بناء الرسم (فشل صامت إن حُذف شيء)

Section titled “3. مواقع بناء الرسم (فشل صامت إن حُذف شيء)”

يُستدعى build_supervisor_graph(...) من مواقع متعددة. حذف الوسائط المفتاحية يُفشل ذلك المسار وحده.

الموقعhitl_configcheckpointersnapshot_recorderيُستخدم بواسطة
agent_runner.get_streaming_graphنعم + auto_denyلا (متزامن، بلا checkpointer)نعمالصوت / نافذة الإقلاع فقط — لا يمكنه استئناف interrupt()
agent_runner._ensure_graphنعمنعمنعمCLI / ‏run() الوكيل
إعادة تجميع إقلاع app.pyنعم (أو None إن كان معطلًا)نعم (checkpoints.db)يعيد استخدام ملك الوكيلويب SSE/WS الحي
build_child_graph / وكيل فرعيرفض-تلقائي للخطرلانعمالوكلاء الأبناء
معالج البوابةرسم معدّ مسبقًا محقونعبر الرسممسجّل الأوامرTG/Discord/Slack
  • بعد الإقلاع، يجب أن يستخدم مرور الويب الرسم المعاد تجميعه في _graph_holder.
  • السفر عبر الزمن فارغ ⇒ مسجّل مفقود في موقع بناء أو المشرف لا يستدعي capture.
  • ما قبل الإقلاع / فشل إعادة التجميع ⇒ قد لا تُحفظ حالة HITL/الحالة.
  • kazma-core/kazma_core/agent/graph_builder.py (التوصيلات)
  • kazma-core/kazma_core/agent/graph_supervisor.py / graph_tool_worker.py / graph_respond.py
  • kazma-core/kazma_core/agent_runner.py
  • kazma-ui/kazma_ui/app.py
  • kazma-core/kazma_core/time_travel.py

4. HITL — ثلاثة مسارات تنفيذ + سجل واحد (لا تخلط بينها)

Section titled “4. HITL — ثلاثة مسارات تنفيذ + سجل واحد (لا تخلط بينها)”
الآليةمتىموقع البوابةالاستئناف
أ. مقاطعة الرسمأدوات الخطر في دردشة الوكيل المفردgraph_tool_worker.tool_worker_nodeموافقة HTTP / أمر البوابة (ليس عبر WebSocket أبدًا)
ب. ناقل السربأدوات السرب + IDE ‏LocalToolRegistry.executetool_registry.execute → SafetyMiddlewareأزرار المنصة / استدعاءات راجعة للناقل
ج. نقطة تفتيش الخطمهام PIPELINE في السربcheckpoint_manager (+ _gate_register_pipeline)approve_checkpoint + settle_gate
السجلكل ما سبقhitl_gates.db ‏CASحقيقة القرار؛ نقطة التفتيش حقيقة التنفيذ

البوابة المزدوجة (أ ثم ب)

Section titled “البوابة المزدوجة (أ ثم ب)”

بعد موافقة الرسم، تمنع ContextVars توجيه ناقل ثانٍ. كسر هذا = تعليق أو واجهة مزدوجة.

المصدرالدور
CANONICAL_DANGER_TOOLSمصدر الحقيقة في الكود
kazma.yaml safety.hitl.require_approval_forافتراضات الملف (مختبَرة للتطابق)
ConfigStore safety.require_approval_forتجاوز واجهة الإعدادات → get_hitl_config()
_EXTENDED_DANGERكنية لـ CANONICAL (ليست قائمة أطول)
MCP classify_mcp_toolاستدلالات الأسماء → UnifiedToolExecutor
  • 0 منصات → NullBusAdapter (الخطر يفشل مغلقًا إلا بلا واجهة).
  • منصة واحدة → ذلك المحوّل.
  • منصتان أو أكثر → FanOutBusAdapter (ثلاثي الحالة: True يحسم؛ False صوت حتى expected_voters أو الموعد النهائي — ليس أول-قيمة-منطقية-تفوز؛ وليس claim_gate الخاص بالويب).

العرض — اضمم قبل الرسم، حلّال واحد، إرسال واحد

Section titled “العرض — اضمم قبل الرسم، حلّال واحد، إرسال واحد”

يشغّل kazma_ui/gate_view.py ‏resolve_gate_views(parts, live_rows, *, authoritative) عند السلك (يختم GET /messages القيمةَ part.view، ويعيد GET …/status القيمة gate_views، وتحمل إطارات hitl في اليوم القيمة view، وتحمل الموافقة 200/409 القيمتين view + gate_id). يبحث JS عن live_gate_views[id] ?? part.view ويحذف الهيكل حين لا وجود له. لا يعيد الاشتقاق.

ينفّذ loadSession ‏Promise.all لـ /messages?stats=1 و/status ويستوعب العروض قبل مرور TurnView الأول. الهوية هي gate_id (زائد الكنية)، لا thread_id.

الفمكيف يرى المعلّقكيف يُرسل
فقاعة الويبgate_views / part.view → TurnViewPOST /api/approve/{thread_id}
لوحة التحكم/api/pending-approvals، إزالة تكرار بـ gate_id / الكنيةنفس POST
TUIالقائمة نفسها؛ مجموعة العرض مفتاحها معرّف البوابةنفس POST
تيليجرام / ديسكورد / سلاكلوحة مفاتيح أصليةhitl approve {thread_id} (للرسم مقاطعة مفتوحة واحدة)
FanOut السربأحداث في الذاكرةثلاثي الحالة — لا تعيد توجيه claim_gate الخاص بالويب
نقاط تفتيش الخطلوحة السربapprove_checkpoint + settle_gate

لا تسطّح أفواهًا صادقة أصلًا. الموافقة التسلسلية بالخيط في البوابة صحيحة. كان “أول-يفوز” في FanOut حادثًا مسمّى (H-12).

  • safety/hitl.py، safety/yolo.py، safety/hitl_grants.py
  • agent/tool_registry.py، agent/graph_tool_worker.py
  • swarm/safety.py، swarm/bus.py، swarm/checkpoint_manager.py
  • safety/hitl_gates.py، kazma_ui/gate_view.py، kazma_ui/turn_runtime.py، _serverGateViews في chat.js
  • محوّلات *_bus.py في البوابة
  • tests/test_gate_view.py (المدوّنة) · tests/e2e/test_hitl_view_model.py (‏Playwright 2 و3 — بوابة CI)

5. تحليل المزوّد / النموذج

Section titled “5. تحليل المزوّد / النموذج”
الشأنمتصل بـ
النموذج النشطيجب تحديث المزوّد عبر find_provider_for_model / set_active_model
الإرسالأربعة أصناف خاصة: Google وAnthropic وAzure وBedrock
المسار العامLLMProvider → Bearer ‏/chat/completions فقط
نقاط الدخولget_client، get_model، get_client_by_provider — الثلاثة كلها تحتاج الفروع نفسها

عَرَض عدم التزامن: اسم النموذج يشير إلى API متوافق مع OpenAI لكن المزوّد Anthropic (أو العكس).

الملف: kazma-core/kazma_core/model_registry.py (+ وحدات المزوّدين).


6. طبقات الإعداد (YAML مقابل ConfigStore مقابل البيئة)

Section titled “6. طبقات الإعداد (YAML مقابل ConfigStore مقابل البيئة)”
الطبقةأمثلةيُحمَّل بواسطة
YAML المنتجkazma.yaml / kazma.local.yamlconfig_loader عند الإقلاع
ConfigStoreمفاتيح مسطّحة في settings.db (safety.hitl_enabled)واجهة زمن التشغيل + get_config_store()
البيئةKAZMA_*بيئة العملية (غالبًا تجاوزات / ميزات)
المفهومYAMLConfigStore / الإعدادات
تشغيل/إطفاء HITLsafety.hitl.enabledsafety.hitl_enabled
قائمة الموافقةsafety.hitl.require_approval_forsafety.require_approval_for
المهلةsafety.hitl.approval_timeout_seconds (الافتراضي 300)safety.approval_timeout
SearXNG(البيئة KAZMA_SEARXNG_URL)search.searxng_url

المستهلك: يدمج get_hitl_config() ‏YAML ثم ConfigStore (ويمكن لـ YOLO الإجبار على الإطفاء).

لا تُنشئ قط ConfigStore() في كود التطبيق — فقط get_config_store().


المسارالمنفّذMCP؟HITL
الدردشة / الرسمUnifiedToolExecutor (agent.tools)نعمأ (مقاطعة) + بوابة مزدوجة
عمليات IDE المغيِّرةget_tool_registry() → LocalToolRegistryلاب (ناقل)
مساعدو عامل السربغالبًا LocalToolRegistryيعتمدب
المهارات الأصليةمسجَّلة على LocalToolRegistryلا ينطبقكأدوات
زمن تشغيل python_execE2B (إن وُجد مفتاح) → سجن Docker → قائمة حظر محليةلا ينطبقأ أو ب قبل التشغيل
بحث قاعدة الكودرموز code_index في SQLite + rg الحي (تراجع grep في Python)لا ينطبققراءة

الثوابت

  • يجب ألا يستدعي IDE قط دوال file_write / file_apply_patch / الصدفة الخام — دائمًا _call_tool → السجل.
  • “الأداة موجودة في الدردشة لا في IDE” غالبًا لأنها خاصة بـ MCP فقط على UnifiedToolExecutor.
  • ملف registry.py في حزمة السرب هو سجل العمّال — لا تخلطه مع tool_registry.py الخاص بالوكيل.

8. تحليل مساحة العمل (سُلّم واحد)

Section titled “8. تحليل مساحة العمل (سُلّم واحد)”

دالة واحدة: kazma_core.workspace.binding.resolve_active_root()
(يعاد تصديرها أيضًا كـ file_write._get_workspace / configure_workspace).

الأسبقية (من الأعلى إلى الأدنى):

  1. workspace_scope لكل مهمة في ContextVar (SwarmTask.workspace_id)
  2. صف WorkspaceStore النشط (تبديل المستودع / الاستنساخ — نية المستخدم)
  3. تثبيت العملية في configure_workspace()
  4. متغير البيئة KAZMA_WORKSPACE
  5. الافتراضي {data_dir}/workspace (صندوق رمل المشروع، لا cwd للمستودع الموحد)

ناقل الربط: WorkspaceStore.set_active_workspace → notify_root_changed
→ تثبيت العملية + إعادة ربط MCP لخوادم workspace_bound
(يستخدم @modelcontextprotocol/server-filesystem المتغير ${KAZMA_ACTIVE_WORKSPACE}).

الوحدة ذات الصلةيجب
IdeService._resolve_workspace_rootفوّض القواعد نفسها
workspace_apiفوّض resolve_active_root (لا سُلّم ثانٍ)
env_context.build_env_contextالإدراك نفسه للجذر
worker_dispatchغلّف بـ workspace_scope حين تكون للمهمة معرّف
كل أدوات file_*استخدم _get_workspace / resolve_active_root فقط
نظام ملفات MCPworkspace_bound: true + إعادة ربط عند التبديل

V2 هي مكدّس الذاكرة الوحيد للدردشة (recall() في memory/recall.py). محوّل RRF رباعي الطبقات في V1 (UnifiedMemoryAdapter / VectorMemory) أُزيل.

الطبقةالدور
الاستدعاءمرشّحو FTS5 بكلمات المحتوى + كثيف (sqlite-vec، أو pgvector عند ضبط Postgres DSN)، مرتّبون على الدليل (recall._rank_by_evidence: لا يُحقن شيء تحت الأرضية؛ وscripts/memory_bench.py يقيسه) + انحياز الجلسة
الكتابةmutate_belief (خنقة INSERT واحدة) + مرآة PG اختيارية + كتابة مزدوجة Neo4j
لكل دورحقن المشرف عند memory.per_turn_retrieval (ConfigStore ← yaml)
بعد الدورturn_runtime.close_turn → consolidator.remember_turn → المستخرِج → mutate_belief + مرساة الإيغو؛ الأدوار الفائتة: turn_reconcile
الصحةbuild_memory_health() / build_v2_health() على لوحة التحكم
واجهة الرسمGET /api/memory/v2/graph · /memory · memory_console.js
إعادة تسمية الكيان / المركزPOST …/entities/{id}/rename · memory/self_hub.py (قواقع User → المركز user)
تحرير المعتقدPATCH /api/memory/v2/beliefs/{id}

مفهوم مفصول على اللوحة (موضوع بمفعول حرفي، بلا حافة مركز): معتقدات كائن-الحمولة كانت تسكّ ورقة بلا user → related_to → subject. مرساة الإيغو عند الكتابة + التعبئة الراجعة كل 6 ساعات تصلانهما (memory/ego_anchor.py). أعد التشغيل بعد تدقيق 2026-08-24 إن كنت لا تزال ترى أيتامًا من قبل التعبئة.

عقدة مكررة يتيمة (التسمية نفسها مرتين): نص مفعول المعتقد ساوى معرّف كيان → كيان مزدوج + عقدة افتراضية. أُصلح بإزالة التكرار في الخادم؛ المعرّفات الفريدة مطلوبة.

المركز ما يزال يقول “أنت” بعد إعادة تسمية الشخص User: يجب أن تزامن إعادة التسمية entities.user (‏self_hub)؛ وgraph_id في القائمة يركّز المركز.

لافتة الاقتطاع تعرض حواف مفقودة: يحتفظ الرسّاخ بأعلى N عقدة ثم يُسقط الوصلات التي اقتُطعت أطرافها. تُبلغ اللافتة عن اتصالات مخفية بالتقطيع — رشّح أو ارفع limit، ليست هذه بيانات مفقودة.

استدعاء الدردشة يفوته حقيقة موجودة في SQLite: جداول FTS ‏content= لا تكشف عدم تزامن جزئي عبر COUNT(*) على الجدول الافتراضي. يقارن مسح الـ 6 ساعات *_docsize بالأساس ويعيد البناء (fts_health.fts_drift_check).

مرآة Postgres ستبعث حقائق ميتة عند role=primary: الإبطال / الاستبدال / الأرشفة / مسح الرسم تضع الآن شواهد قبور على المرآة، ومزامنة المرآة كل 15 دقيقة تدفع ما يختلف (صحة الذاكرة: mirror). مصالحة كاملة لمرة واحدة: python scripts/reconcile_memory_mirror.py.

“تعذّر تسليم رسالتك بعد عدة محاولات” (الويب، مؤشر V2): ليست علة ذاكرة — استيراد get_active_turn محليٌّ داخل دالة حجب ربط الوحدة على مقابس ?last_seq= (ws_chat.py، التدقيق M-01). أُصلحت؛ أعد التشغيل.

إن كان استدعاء الدردشة فارغًا: ثبّت .[rag]، وافحص صحة لوحة التحكم (المُضمِّن / V2)، وتأكد من memory.enabled.
إن كانت الدردشة ≠ نتائج الأدوات: كلاهما يجب أن يبلغ recall()؛ ابحث عن مخزن فارغ يفشل مغلقًا أو وضع DEMO.
التدقيق: AUDIT_MEMORY_SYSTEM_2026-08-24.md.


10. البحث المعمّق / الجلب / البحث

Section titled “10. البحث المعمّق / الجلب / البحث”
العنصرالسلسلة / الترتيبالإعداد
web_searchSearXNG → DDG → Bing → WikipediaKAZMA_SEARXNG_URL، ConfigStore ‏search.searxng_url، ملف compose باسم search على :8088
read_url / استيعاب المعرفةتحقق SSRF ثم httpx محلي (تثبيت IP) ثم Chromium محلي ثم بديل مستضاف مسموحKAZMA_ACQUISITION_MODE وKAZMA_ACQUISITION_REMOTE_PROVIDERS؛ الاعتماد منفصل؛ لا تثبّت عبر proxy= مسموح

يستخدم استيعاب KB والبحث المعمّق kazma_core.web_acquire (ملفات fetch_text / search / crawl) فوق سُلّم الاستعادة المشترك في read_url — مكدّس I/O واحد، ومصارف المنتج تبقى منفصلة.

مكتبة المعرفة (الاستدعاء / الحقن — مكدّس هجين واحد)

Section titled “مكتبة المعرفة (الاستدعاء / الحقن — مكدّس هجين واحد)”
المسارالدور
KnowledgeIndex.search_all_syncاسترجاع مصدر الحقيقة — دلالي Chroma + FTS5 BM25 → RRF
federated_search(..., kb_mode=inject|all_active)دمج الدردشة + الأدوات؛ يوسم store=knowledge (لا دمج مخطط مع V2)
build_knowledge_injectRRF نفسه عبر kb_mode=inject؛ يسيّجه المشرف ويحقنه مرة واحدة في كل دور (graph_supervisor)
إعادة الفهرسةصفحة غير متغيرة → تخطٍّ؛ صفحة متغيرة → تُستبدل في معاملة واحدة؛ وعنوان URL غائب عن الاكتشاف يُحتفظ به
العزلملف knowledge.db خاص؛ Chroma لكل مكتبة kazma_kb_*؛ أرشفة عند العرض/الحقن؛ لتثبيتات المشغّل الواحد فقط

اختبار دخاني حيّ: scripts/smoke_research_stack.py.


11. الهوية وقواعد البيانات

Section titled “11. الهوية وقواعد البيانات”
المعرّف / القاعدةالغرضذو صلة
session_idمفتاح جلسة دردشة واجهة الويبSessionManager
thread_idنقطة تفتيش LangGraph + YOLO + HITLيجب أن يطابق الاستئناف
gw-{platform}-{sender}سكّ البوابة؛ غالبًا session_id == thread_id على مرايا الويبSessionStore
chat_sessions.dbرسائل/جلسات الويبSSE + WS
sessions.dbجلسات منصات البوابةالمحوّلات
checkpoints.dbحالة LangGraph الدائمةإيقاف/استئناف HITL
snapshots.dbالسفر عبر الزمنالمسجّل
settings.dbConfigStoreواجهة الإعدادات
swarm_tasks.dbمخزن مهام السربالمحرك

حذف “جلسة” قد يحتاج كلاً من SessionManager وتنظيف خيط نقاط التفتيش.


12. مواقع الحقن (حافظ على التزامن)

Section titled “12. مواقع الحقن (حافظ على التزامن)”
المحتوى المحقونالمواقعالسياج / الحارس
كتلة البيئة / مساحة العملتهيئة الوكيل، وSSE/WS لكل دور، وعامل السرب، وإرسال سرب IDEصدقٌ عن المضيف
الروح / التحسين الذاتيagent_runner، وsse_chat، ورسم البوابةformat_untrusted_block + is_override_delta؛ مفتاح إيقاف KAZMA_SELF_IMPROVEMENT=0
سياق المعرفةالبوابة (+ مسارات دردشة أخرى عند إضافتها)سياج غير موثوق

إضافة موقع رابع بلا السياج تراجعٌ أمني.


الحزمةتملكلا تملك
kazma-coreالرسم، والأدوات، والسرب، وConfigStore، وخدمة IDE، والسلامةواجهة HTTP، وواجهات منصات API
kazma-uiدردشة FastAPI وSSE/WS، والإعدادات، وصفحة IDE، وJS الساكنمحوّلات المنصات
kazma-gatewayمحوّلات TG/Discord/Slack، والأوامر، وعزل الجلساتSessionManager للويب
kazma-tuiواجهة Textual فوق API النواةدماغ وكيل منفصل
kazma-cliأوامر kazmaبوابة طويلة التشغيل
kazma-skillsحزم المهارات الأصليةسياسة HITL في زمن التشغيل
ذاكرة kazma-coreمعتقدات V2 / FTS / MSATokenizerسياسة RAG الكاملة

14. اختبارات التحقق / الانحراف

Section titled “14. اختبارات التحقق / الانحراف”
الشأنكيفية التحقق
تطابق قائمة الخطرtests/test_agent_skills.py / scripts/check_docs_sync.py
توصيل HITL في مواقع البناءkazma_core_tests/test_hitl_gates_wired.py
مكدّس البحثpython scripts/smoke_research_stack.py
وحدة SearXNG / الاستعادةtests/test_searxng_discovery.py، tests/test_hard_page_recovery.py
الإعدادات → قائمة HITLConfigStore ‏safety.require_approval_for → get_hitl_config
عرض HITL (الضم / الرسم / الإرسال)tests/test_gate_view.py؛ وPlaywright 2+3 في tests/e2e/test_hitl_view_model.py (بوابة CI)
التجميعpy_compile على الوحدات الملموسة

حين تدمج مسارين في واحد، أضف اختبارًا كان سيفشل تحت علة المسار المزدوج القديمة.


15. سجل تغييرات دمج المسارات المتعددة (حيّ)

Section titled “15. سجل تغييرات دمج المسارات المتعددة (حيّ)”
التاريخالدمج / الإصلاحما لا يُعاد تقسيمه
2026-07SessionManager مشترك بين SSE+WSلا تضف قواميس جلسات لكل ناقل
2026-07ناقل FanOut متعدد المنصاتيجب ألا تدّعي الوثائق حصرية TG>Discord>Slack فقط
2026-07مصدر حقيقة مساحة العمل + النطاقلا تشعّب أسبقية IdeService
2026-07WS ‏recursion_limit=100أبقه متحاذيًا مع SSE/البوابة
2026-07الإعدادات require_approval_for → get_hitl_configلا تُمِت مستوى تحكم الإعدادات من جديد
2026-07استعادة الصفحات الصعبة مشتركة مع KBأبقِ الجلب في read_url._fetch_full_text
2026-09سجل بوابات HITLالقرار = hitl_gates.db؛ التنفيذ = نقطة التفتيش. لا “موافق” مستنتَج
2026-09FanOut ثلاثي الحالةلا تعد أول-قيمة-منطقية-تفوز؛ claim_gate للويب يبقى 200/409
2026-09تسليم الدور V2close_turn المُغلِق الوحيد؛ لا رسّاخ ثانٍ في chat.js
2026-09نموذج عرض HITLاضمم قبل الرسم؛ resolve_gate_views فقط؛ الإرسال عبر POST /api/approve/{thread_id} (أمر البوابة يبقى بمعرّف الخيط)

11. وضع المهمة الطويلة وميزانيات الرسم

Section titled “11. وضع المهمة الطويلة وميزانيات الرسم”
الشأنمصدر الحقيقة
الميزانية لكل دردشةConfigStore ‏long_task.{thread_id} عبر /long on (بحث ناعم ~40 — قد يصدر PARTIAL)
المهمة لكل دردشة/long mission أو /mission on — جدار صلب افتراضي 500 جولة / ~2500 خطوة
جولات الأدوات الأساسيةagent.max_iterations (الإعدادات → الوكيل)
سقف خطوات LangGraphمشتق resolve_turn_budgets() → recursion_limit (المهمة تستخدم mission_recursion_limit())
مقابض بيئة المهمةKAZMA_MISSION_MAX_ROUNDS، KAZMA_MISSION_RECURSION
المتابعة بعد الميزانيةlong_task.continue.{thread_id} يُخزَّن عند النفاد؛ يُحقن في الدور التالي فقط للردود ذات شكل الاستمرار (متابعة/استمر/نعم بـ ≤8 كلمات/… — الأمر الجديد لا يحصل على التوجيه أبدًا؛ والسياق المخزَّن يُمسح في الحالتين)
سلوك Partial‏Partial التكرار يوقف المهمة الطويلة مؤقتًا (pause_long_task): ميزانيات أساسية، بلا تأطير مهمة، ولا تُستهلك أدوار المتابعة؛ السجل يبقى لـ /long status حتى TTL
المقاييسPrometheus ‏kazma_long_task_events_total{kind=…}
HITL مقابل السعة/yolo = تجاوز الخطر؛ /long = ميزانيات فقط؛ المهمة ≠ لانهائية

ثابت: رفع جولات الأدوات القصوى دون اشتقاق recursion_limit يعيد إدخال GraphRecursionError في المهام بعمق البحث. اذهب دائمًا عبر kazma_core.agent.long_task. وضع الميزانية ليس “بلا حدود”؛ استخدم المهمة للتشغيل-حتى-الإنجاز مع جدار أمان.

تحقق: حالة /long؛ يعرض /long mission جدارًا صلبًا ≥100؛ رد وكيل الإعدادات يتضمن recursion_limit؛ وسجّل أحداث long_task + budget_recursion / mission_*.


16. فهرس سريع “X يرتبط بـ Y”

Section titled “16. فهرس سريع “X يرتبط بـ Y””
إن لمست…افحص أيضًا…
sse_chat/ws_chat.py، عارض chat.js، turn_runtime.close_turn
long_task.py / التكرارالبوابة، وSSE، وWS، ومواقع recursion_limit في agent_runner
رسالة موافقة HITL متقادمةإزالة الارتداد + النسخة الناعمة في hitl.py؛ ليست “لم ينفَّذ شيء” بعد نجاح
ws_chat.pyنفسه + ربط خيط ContextVar لـ YOLO
HITL في graph_tool_worker.pyكل مواقع البناء، وContextVars البوابة المزدوجة، وhitl_gates.py
tool_registry.executeخدمة IDE، وسلامة السرب، ومنفّذ MCP
طريقة واحدة في model_registryالطريقتان الأخريان + أصناف المزوّدين
file_write._get_workspaceIdeService، وenv_context، وworkspace_scope
CANONICAL_DANGER_TOOLSkazma.yaml، وافتراضي الإعدادات، وكنية السرب، وأنماط MCP
مفاتيح السلامة في ConfigStoreget_hitl_config، والمفاتيح المسطّحة في SettingsManager
build_env_contextagent_runner، وSSE، وWS، وإرسال العامل
الروح / self_improvementكل مواقع الحقن + prompt_fence
محوّل ناقل السربثلاثية حالة FanOut مقابل Null، وتجربة IDE الفاشلة المغلقة
استعادة read_urlknowledge_ingest، وcrawl، وweb_research
مسار المستندات الدائمواجهة الويب API، والأدوات، و/documents في البوابة، وTUI — كلها → DocumentIngestionService فقط
تنفيذ تحليل المستنداتDocumentService (العاملون + المرفقات العابرة في الدردشة) — لا تستورد قط documents.parsers من البوابة/الواجهة
عزل عامل المستنداتملف التعريف process: عملية فرعية من sandbox.py؛ ملف التعريف container: موقعا استدعاء العامل كلاهما → worker_container.run_container_worker → worker_broker.py، الحائز الوحيد لمقبس Docker — ولا رجوع من أحدهما إلى الآخر
مهام المستندات مقابل البيانات الوصفيةjobs_pg متعدد النسخ؛ repository_pg حين تكون البيانات الوصفية على Postgres (auto يتبع خلفية المهام)؛ وقبول الاستلام يعيش مع المهام (admission.py)؛ وGC محايد للخلفية (repository.gc_mark)
النسخ الاحتياطي للمستنداتbackup.py (بيانات SQLite الوصفية + المهام) أو backup_pg.py ‏(Postgres) — يُختار بحسب مكان مخازن الخدمة المثبَّتة؛ ويُعاد نشر فهرس المعرفة عند بدء العامل (reconcile_index)
تنقيح المستندات شبه الخطرةkazmaConfirm في الواجهة فقط؛ ACL ‏API/الأدوات ما يزال ينطبق
العَرَضالمسارات ذات الصلةالثابت
رفض الرفع 429/503/507/413documents_api.py (precheck_upload قبل جسم الطلب)، وcapacity.py، وadmission.py، ومستندات الإعداداتحالة صادقة؛ وحالات الرفض لأسباب السعة تحمل Retry-After
الرفع 409 intake_in_progress / intake_taken_overحجوزات admission.py وعقدها الإيجاريالمفتاح نفسه ما زال محجوزًا؛ أو أن عقدًا إيجاريًا منقضيًا أُخذ وسُيِّج — أعد المحاولة
الجاهزية document_intake_reservations_strandedadmission.py، وadmission.stranded في ops/capacityحجز قديم أو منقضٍ لا تستطيع أي عملية إثبات موت صاحبه؛ لا ينتهي بالعمر وحده أبدًا
الجاهزية document_worker_isolation_unavailable / document_worker_image_outdatedworker_container.isolation_report، وسجل الوسيطالوسيط غير موثَّق أو يتعذّر الوصول إليه؛ أو الصورة مبنية من شيفرة أخرى — أعد بناءها، وأعد تشغيل الوسيط
مهمة عالقةمجموعة العاملين، والحيازات، وrecover_expired_leasesاستعادة إعادة التشغيل + نبض
مهمة أُعيدت محاولتها ثم ذهبت إلى الرسائل الميتة (malware_scanner_unavailable، storage_full، metadata_unavailable، worker_isolation_*)errors.py، و_classify_failure في worker.pyالأعطال تُعاد محاولتها ضمن الميزانية المحدودة؛ ولا يُرفض إلا المحتوى
مهمة “غير موجودة” وهي موجودةفحص الفاعل في ingestion.job_statusالمهمة غير المقروءة تُقرأ تمامًا كالمهمة غير المعروفة (لا كاشف للوجود)
وصول عابر للمستأجرينACL المستودعمستأجر + فاعل عند كل قراءة
التحويل/التنقيح غير متاحالمحوّلات/المغيّرات في GET /api/documents/health (تقرير صورة العامل في ملف تعريف الحاوية)422/503، لا نجاح زائف صامت
عدم اتساق النسخ المتعددةجهوزية خلفيات البيانات الوصفية/المهام + وحدة blob المشتركةافحص ops/readiness قبل التوسع
استيراد المحلّل من البوابةاختبارات مطابقة البنيةقائمة الوحدات المحظورة

الدليل: الذكاء المستندي · التشغيل: معالجة المستندات.


أبقِ هذه الوثيقة أقصر من تفريغ وحدات كامل — أشر إلى الملفات، واذكر الثوابت والعلاقات. الفهارس الكاملة تبقى في ARCHITECTURE_AND_SYSTEM_MAP.md.

تاريخ تذكير خاطئ / استبدال ذاكرة

Section titled “تاريخ تذكير خاطئ / استبدال ذاكرة”

العَرَض: يجدول الوكيل تذكيرًا بتاريخ خاطئ، أو يستبدل معتقد ذاكرة أكّده المستخدم بتاريخ مختلَق.

السبب الجذري: عامل النموذج عبارةً نسبية (“بعد يومين”) كتاريخ حدث مطلق بدل تثبيتها بحدث في الذاكرة؛ وكتب مستخرِج ما بعد الدور التاريخ المختلَق كمعتقد مستنتَج.

طبقات الإصلاح (كلها في مكانها):

  1. بوابة الالتزام (safety/commitment/authorize.py): تثبّت resolve_remind العبارات النسبية بأحداث الذاكرة وتعيد كتابة وسائط الأداة إلى fire_at الصحيح قبل التنفيذ.
  2. بوابة الثقة بالمصدر (memory/belief_mutation.py:_mutate_functional): المعتقد الوظيفي user_explicit لا يمكن أن يستبدله مصدر أوثقية أدنى (llm_inferred).
  3. الحفظ التلقائي المحافظ (memory/belief_extractor._apply_beliefs_to_v2): المعتقدات المستنتَجة منخفضة الثقة تُهمل بعد الدور.

مفتاح الإيقاف: يعطّل KAZMA_COMMITMENT_ENABLED=0 البوابة. افحص تدقيق الالتزامات: SELECT * FROM commitments WHERE act='remind' ORDER BY created_at DESC LIMIT 10.

العنصر: kazma_core/agent/intent/ — classify_turn → execute/constrain/loop

الأعراض:

  • إطلاق خط معالجة خاطئ (مثل “ابنِ محلّل PDF” → تنفيذ مستندي)
  • تخطي بطاقة HITL عند توليد مستند
  • تشويه موضوع البحث أو توجيهه إلى مسار خاطئ
  • النموذج يتجاهل إرشاد الأدوات في توجيه النظام

التشخيص:

  1. افحص سجل المشرف عن [Supervisor] Intent Engine: focus=X route=Y acts=Z reason=W
  2. تحقق من مفاتيح الإيقاف: KAZMA_INTENT_ENGINE، KAZMA_INTENT_EXECUTE، KAZMA_INTENT_TIER2 ليست 0
  3. اختبر التصنيف: python -c "from kazma_core.agent.intent.classify import classify_turn_sync; d = classify_turn_sync('reproduce this PDF'); print(d.route, [a.kind for a in d.acts], d.reason)"
  4. إن كان المسار غير متوقع → افحص أنماط regex في heuristics.py
  5. إن نُفِّذ بلا نتيجة → افحص تسجيل المعالجات في registry.py

الملفات الأساسية:

  • agent/intent/heuristics.py — كشف الأفعال (متعدد التسميات)
  • agent/intent/policy.py — قرار المسار (قائمة السماح للتنفيذ)
  • agent/intent/entities.py — تحليل الملفات
  • agent/intent/classify.py — نقطة الدخول الوحيدة
  • agent/intent/handlers/ — معالجات التنفيذ (المستندات، البحث، المؤلِّف)

العَرَض → أول مكان تنظر إليه. بطاقات موافقة أشباح/مكررة، أو بطاقة مختومة مسبقًا “موافق — يعمل” بلا نقرة، أو سؤال خطر ثانٍ لا يُرى إلا على لوحة التحكم، أو “الموافقة لم تفعل شيئًا”، أو دور مُعلن اكتماله وسؤال معلّق → kazma_core/safety/hitl_gates.py (مصدر الحقيقة الوحيد لدورة الحياة، kazma-data/hitl_gates.db).

  • pending هي الحالة الوحيدة التي تعرض أزرارًا حية؛ القرّاء يستخدمون السجل (hitl_thread_status، close_turn، /api/pending-approvals، status.gate_views). ترسم الدردشة part.view / gate_views؛ ولا تعيد الاشتقاق. تستطلع لوحة التحكم وTUI قائمة المعلّق مفتاحها gate_id، لا thread_id.
  • صف معلّق + نقطة تفتيش موقفة مؤقتًا ⇒ يبقى الدور مفتوحًا (قاعدة الصمت). موقفة مؤقتًا + لا صف يغطي ⇒ تعبئة من اللقطة والبقاء مفتوحًا. صف معلّق + غير موقف ⇒ يتيم، يُحسم في close_turn.
  • سباقات المطالبة: CAS — فائز واحد، و409 يحمل الحالة/القرار الفعليين؛ القرار نفسه مرتين هو 200.
  • راقب kazma_hitl_gate_reconciled_total. مفتاح الإيقاف KAZMA_GATE_REGISTRY=0 تراجع تنفيذ رفيع (مقاطعة حية ⇒ بطاقة معلّقة)، لا مُقرِّر ثانٍ.
  • المواصفة الكاملة: docs/plans/HITL_GATE_REGISTRY_PLAN.md + AGENTS.md §30.