الذاكرة وRAG
مصدر الحقيقة الحي (2026-09). V2 هي مكدّس الذاكرة الوحيد للدردشة. الثوابت:
AGENTS.md§15 و§20 (الثقة بالمصدر) و§29 (سلامة السياق / الانزياح).
- الذاكرة الشخصية — معتقدات ثنائية الزمن، حلقات من 4 طبقات، PPR، FTS5 + كثيفة (sqlite-vec على عقدة واحدة؛ pgvector عند تشغيل Postgres)، طابور دائم.
- مكتبة المعرفة — مخزن منفصل؛ دمج منتجي عبر حقن موسوم + بحث فيدرالي (وليس جدولًا واحدًا).
- محوّلات التوسّع — يُختار pgvector تلقائيًا من Postgres DSN؛ Qdrant إن ضبطته؛ كتابة مزدوجة إلى Neo4j؛ مرآة حالة Postgres / دور primary.
- رباعي الطبقات RRF في V1 (Chroma / مفاهيم L1–L4) أُزيل. لا تُحيه في الوثائق أو نصوص الواجهة. الملاحظات القديمة التي تذكر
UnifiedMemoryAdapter/VectorMemoryباتت متقادمة.
قائمة فحص المشغّل: مسار الذاكرة الأمثل.
سجل أعمال التوسّع: docs/plans/MEMORY_REMAINING.md.
تدقيق النظام (2026-08-24، النتائج مغلقة): AUDIT_MEMORY_SYSTEM_2026-08-24.md.
البنية (مسار الدردشة)
Section titled “البنية (مسار الدردشة)”User turn → recall() (beliefs + episodes FTS/dense + PPR + session bias) → optional federated KB hits (if merge_knowledge_into_chat) → format_untrusted_block (<kazma:data untrusted>) → LLM → post-turn: mirror episode, heuristic beliefs, enqueue micro_consolidationقاعدتا SQLite (فصل حاسم)
Section titled “قاعدتا SQLite (فصل حاسم)”| قاعدة البيانات | الدور |
|---|---|
memory_state.db | الساخنة: المعتقدات، الحلقات، الكيانات، entity_merges (+ الأرشيف)، رسومات DAG الإجرائية |
memory_ops.db | الباردة: طابور المهام، سجل التدقيق |
لا تدمج هاتين القاعدتين — يجب ألا يتنازع التوحيد الخلفي مع قراءات الدردشة على WAL.
المخازن تبقى منفصلة (تميّز المنتج)
Section titled “المخازن تبقى منفصلة (تميّز المنتج)”| المخزن | الدور | الافتراضي |
|---|---|---|
| V2 المعرفي | من أنا / ما قلناه | SQLite مصدر الحقيقة على عقدة واحدة |
| مكتبة المعرفة | مستندات + استشهادات | فهارس KB منفصلة |
| Neo4j | كتابة مزدوجة اختيارية لثلاثيات المعتقدات | مطفأ ما لم يُضبط |
| حالة Postgres | مرآة مزدوجة أو state.role=primary | مطفأ ما لم يُضبط |
| المتجهات الكثيفة | sqlite-vec (عقدة واحدة) / pgvector (Postgres DSN) / Qdrant | pgvector تلقائيًا عند مغادرة العقدة الواحدة |
الدمج الفيزيائي بجدول واحد بين KB والمعتقدات wontfix (#79). الدردشة تتوحّد عبر الحقن؛ المخازن لا تتوحّد.
الإعدادات (أين يكمن كل شيء)
Section titled “الإعدادات (أين يكمن كل شيء)”الإعدادات → الذاكرة (/settings?tab=memory) — العزل، مفاتيح تبديل المعرفة + الدردشة، المحوّلات الخلفية (vector / state / graph)، اختبار/مزامنة Neo4j، والمُضمِّن (مدمَج في هذا التبويب).
| عنصر التحكم | الأثر |
|---|---|
| وضع المستأجر | shared / per_platform / per_user |
| حقن المعرفة في الدردشة | merge_knowledge_into_chat (مفعّل افتراضيًا؛ يُحقن نص المكتبة في الدور، ولا يُحفظ أبدًا في ذاكرة الدردشة) |
| مخزن الرسم | sqlite (افتراضي) أو كتابة مزدوجة neo4j |
| المتجهات / المُضمِّن | sqlite-vec على عقدة واحدة؛ pgvector عند ضبط KAZMA_DATABASE_URL / عنوان الحالة (KAZMA_PGVECTOR=0 للإبقاء محليًا) |
الروابط العميقة القديمة: ?tab=embedder → الذاكرة (مرِّر إلى المُضمِّن)؛ ?tab=connectors → مزوّدو LLM → موصّلات المنصات.
حاجز تنزيل المُضمِّن (2026-08-19): المُضمِّن
localالمضبوط عمدًا قد ينزّل نموذجه عند أول استخدام، لكن المُضمِّنات الاحتياطية (fallback) (مزوّد غير معروف / إعداد بعيد معطوب) لا تفعل ذلك أبدًا — فهي تفحص خبيئة HuggingFace المحلية وتتراجع إلى لا تضمينات مع تحذير قابل للتنفيذ بدلًا من تعليق العملية على تنزيلbge-m3حيّ بحجم ~2GB. اسمح قسرًا بـKAZMA_EMBED_ALLOW_DOWNLOAD=1.
الاستدعاء وما بعد الدور
Section titled “الاستدعاء وما بعد الدور”recall()
Section titled “recall()”يحقن الاستدعاء ما يتعلق به السؤال، ولا شيئًا حين لا يوجد شيء (منذ 2026-09-26). اعتاد أن يدمج قنواته حسب الترتيب وأن يعيد أفضل خمسة دائمًا: كان كل دور يحصل على خمس حقائق وخمس ذكريات محادثة، ذات صلة كانت أم لا.
- المرشّحون. ذكريات المحادثة: مطابقات كلمات المحتوى في السؤال (FTS5) وأقرب 40 ذاكرة إليه بالمعنى، عبر كل طبقة، بما فيها المؤرشفة. الحقائق: مطابقات كلمات المحتوى، وأقرب الحقائق الحالية بالمعنى، والحقائق المستخرجة من الأدوار التي وُجدت للتو، ومسار المشي في رسم المعتقدات.
- الدليل. يُقيَّم كل مرشّح بمدى ارتفاع تشابه معناه فوق ما تبلغه ذكريات لا صلة لها بهذا السؤال نفسه، زائد حصته من كلمات محتوى السؤال. تحت الأرضية لا يُحقن شيء؛ والبعيد خلف الأفضل لا شيء كذلك؛ والمطابقة الهزيلة تُعرض على النموذج كـ”(ربما ذات صلة)”. لذكريات المحادثة والحقائق عتباتها الخاصة، مقيسة على مرجع الاسترجاع. حين لا يملك أي مرشّح متجهًا يُحكم به (لا مُضمِّن)، يجب أن تحمل الذاكرة نصف كلمات محتوى السؤال على الأقل.
- فواصل التعادل. بين المرشّحين المتقاربين يأتي الأحدث أولًا (وبالنسبة لحقيقةٍ، الأهم منها)؛ الذاكرة المؤرشفة تأتي خلف النشطة المطابقة لها بالتساوي مباشرة؛ ذاكرة من الجلسة الحالية تأتي أولًا؛ النص نفسه يُعرض مرة واحدة.
- كلمات المحتوى (
memory/query_terms.py): تُحذف كلمات الوقف الإنجليزية والخليجية/الفصحى، ويُطوى العربي مع أل التعريف وتُعالَج سوابق الحرف الواحد، وجموع خفيفة، وكلمات كاملة فقط (“out” ليست في “about”). - السياج:
format_untrusted_block(..., source="memory_v2_recall").
حين لا تملك الذاكرة شيئًا لسؤالٍ ما، يبحث تراجع المحادثات السابقة في الدردشات الأسبق؛ يجب أن تحمل الدردشة أكثر من نصف كلمات محتوى السؤال.
الجودة مُقاسة. يقيّم python scripts/memory_bench.py run الاستدعاء على حياة شخصية — 1,120 دور دردشة و69 حقيقة داخل دردشة لا صلة لها، و89 سؤالًا (حقائق مفردة، إعادة صياغة، أشياء قالها المساعد وحده، تحديثات، أكواد، عربي، نظرات عامة، أسئلة بلا جواب) — و40 سؤالًا آخر محجوزة: كُتبت بعد آخر ضبط ولم تُستخدم قط لاختيار عتبة، فتقول نتائجها إلى أي مدى يصمد الضبط. يعيد CI تشغيل متجهات النموذج الحقيقي المسجّلة ويلزم كل نتيجة بسقّاطة لا تتراجع (tests/test_memory_benchmark.py)؛ يرفعها lock. ولا يمكن أن تنخفض نتيجة إلا في مقايضة مُراجَعة (lock --trade "why": لا تنخفض أي نتيجة بأكثر من 0.05، وترتفع واحدة بـ 0.05 أو أكثر، ولا ينخفض الامتناع أبدًا)، تُكتب في ملف العتبات مع سببها. تقرير مجموعة البيانات هذه تحت “تقرير المرجع” أدناه.
بحث المعنى دقيق عبر كل ذاكرة (vector_engine.py، منذ 2026-09-26): كل حلقة وكل حقيقة حالية متجهها من النموذج الحالي تُقيَّم في SQL (vec_distance_cosine؛ نحو 1 ms لكل 1,000 صف)، مع تراجع NumPy. اعتاد مقارنة شريحة غير مرتبة من الحلقات (أحدث 60 من 300 لم تُبحث أبدًا) و400 حقيقة “الأهم”، وبحث معنى الحقائق لم يكن يعمل إلا حين تقصّر الكلمات المفتاحية.
محرك المتجهات الكثيفة: sqlite-vec ما دمت على عقدة SQLite واحدة. حين تكون للعملية Postgres DSN بالفعل، يستخدم الاستدعاء pgvector (كتابة مزدوجة هجينة، أو البعيد أولًا إن كان KAZMA_MEMORY_STATE_ROLE=primary) — إن كان ذلك Postgres يأتي بالامتداد. postgres:16-alpine لا يأتي به؛ فتبقى كاظمه عندئذ على sqlite-vec، وتقول ذلك مرة عند الإقلاع، وتُظهر الإعدادات → الذاكرة السبب (Postgres وSaaS فيهما الحالات والإصلاح). يرتّب Postgres الأساسي مطابقات الكلمات المفتاحية في المرآة وأقرب الذكريات في الفهرس على الدليل نفسه (معنى مطابقة الكلمات المفتاحية يأتي من الفهرس) — وليس الكلمات المفتاحية وحدها. على مرجع الاسترجاع (مجموعة البيانات v5) يجد تقريبًا الأجوبة نفسها التي يجدها الاستدعاء المحلي: معدل الإصابة 0.895 مقابل 0.925، وMRR 0.83 مقابل 0.84، والدقة 0.62 مقابل 0.64؛ والفارق سؤال واحد كثير كلمات الوقف يفوته بحثه بالكلمات المفتاحية. لا يقرأ إلا الذكريات التي يجوز للاستدعاء عرضها، ويرتّب مطابقات الكلمات المفتاحية في المرآة بعدد ما تحمله كلٌّ منها من كلماتك، ويستبعد كل ما نسيه هذا التثبيت، حتى حين لا تزال النسخة المشتركة تحمله؛ ثم تُصلح مزامنة المرآة كل 15 دقيقة تلك النسخة. لا يُتجاوز Qdrant الصريح في الإعدادات أبدًا.
ينتظر الاستدعاء متجه معنى السؤال مدةً أقصاها memory.v2.recall_deadline_s (الافتراضي 5 ثوانٍ)، ويسأل المُضمِّن مرة واحدة لكل سؤال. حين يكون المُضمِّن بطيئًا أو متعطلًا، يجيب الاستدعاء من الكلمات المفتاحية، وتقول أداة بحث الذاكرة إن بحثها كان ناقصًا (لا “لا شيء متذكَّر” أبدًا)، ويستريح المُضمِّن 30 ثانية، ثم مدة أطول، قبل أن يُسأل مجددًا؛ وتُظهره صحة الذاكرة متدهورًا في أثناء ذلك.
مفتاح الإيقاف: KAZMA_PGVECTOR=0.
ما بعد الدور
Section titled “ما بعد الدور”يُسلَّم كل دور مكتمل إلى الذاكرة مرة واحدة، عبر المُغلِق الذي يشغّله كل ناقل (kazma_ui.turn_runtime.close_turn → consolidator.remember_turn) — الويب وتيليجرام وسلاك وديسكورد سواء. حتى 2026-09-26 كان معالج البوابة وحده يفعل ذلك، فلم يُتذكَّر أي دور دردشة ويب منذ 2026-08-08؛ تسوية الأدوار كل 15 دقيقة تكتب الآن حلقة لكل دور في مخزن الدردشة بلا حلقة، بوقت الدور نفسه، وهو ما استعاد تلك الأدوار ويلتقط أي فجوة قادمة. ثم تحصل الأدوار التي يكتبها على حقائقها مثل الدور الحيّ (المرور الاستدلالي فورًا، ومرور LLM في الطابور، 60 دورًا في المرور).
الحقائق تتبع الترتيب الذي قيلت فيه (2026-09-27). تحمل الحقيقة وقت قولها (valid_from)، غير وقت كتابتها (ingested_at). العبارة أحادية القيمة الأقدم من الحقيقة الحالية — دور مُسوّى، أو دور انتظر في الطابور، أو مرور LLM وصل بعد دور لاحق — تُحفظ كتاريخ في مكانها على الخط الزمني ولا تستبدل الحقيقة الحالية أبدًا. سابقًا، أي عبارة كُتبت أخيرًا كانت تفوز.
القائمة تبقى قائمة (2026-10-19). حين تحتفظ بعدة ملاحظات من نوع واحد (“user noted …”)، تُضاف الملاحظة الجديدة إليها، حتى حين يصنّفها مرور الحقائق حقيقةً ذات قيمة واحدة. سابقًا، كان يمكن لملاحظة واحدة كهذه أن تنهي كل الأخريات: على النسخة المثبتة الحيّة استبدلت ملاحظة واحدة ملاحظةً وأغلقت 57. ويمكن إعادة فتح الملاحظات التي أُغلقت بهذه الطريقة. قِس حجم ذلك أولًا (هذا يقرأ فقط، ويسرد المدخلات بمعرّفاتها):
python scripts/memory_reopen_lists.py sizeثم، حين تكون كاظمه خاملة، شغّل apply --db <path to memory_state.db> --yes. يُنسخ الملف أولًا إلى memory_state.db.pre_reopen، ويُكتب كل مدخل أُعيد فتحه في سجل تدقيق الذاكرة.
- عكس حلقة العمل/الاستدعاء (السؤال وجوابه؛ رقم دور الحلقة هو فهرس دور المحادثة). يعرض الاستدعاء على النموذج الجانبين (“User: … / Assistant: …”،
memory/episode_text.py، 2026-09-27) — اعتاد عرض السؤال وحده، فكان السؤال المستعاد “ماذا اقترحت؟” يعود بلا الاقتراح. يُصنع متجه المعنى من السؤال (الجواب جُرِّب وقِيس: كلّف الدقة ولم يجد شيئًا إضافيًا)؛ وبحث الكلمات المفتاحية وتغطية الكلمات يقرآن الجواب أيضًا. - “تذكّر هذا” (أو تذكّر، لا تنسَ، احفظ، سجّل عندك …) يضع الدور مباشرة في طبقة الاستدعاء، بالإنجليزية أو العربية. الدردشة الصغيرة — تحية أو شكر بجواب قصير — تُحفظ لكن لا تُعرض أبدًا كتاريخ، والتحية لا تبحث عن شيء.
- مسار المشي في الرسم الذي يربط الحقائق (“يعمل في Acme” + “Acme في لشبونة”) يقرأ الحقائق المحيطة بكيانات السؤال، مهما بلغ عدد الحقائق الأخرى؛ بحث المتجهات الهجين يدمج الفهرس البعيد بالمخزن المحلي، فالذاكرة التي لم تُنسخ بعد إلى الفهرس البعيد يُعثر عليها رغم ذلك.
- استخراج المعتقدات الاستدلالي (+ طابور LLM اختياري) →
mutate_belief، مثبتًا بوقت الدور. المعتقد الوظيفيuser_explicitلا يمكن أن يستبدلهllm_inferred/system_tool(بوابة الثقة بالمصدر للالتزام في_mutate_functional؛ مستقلة عنauthorize_effect)، ولا أن تقطعه عبارة أسبق أوثقية أقل. - النظافة ترفض موضوعات المكدّس/الإصدار (مثل
kazma_v2_4_0المغلوط كإصدار للمنتج) - الكتابة المزدوجة: مرآة حالة Postgres اختيارية + upsert حواف Neo4j
- مرساة رسم الإيغو — كل موضوع غير مركزي لا يصل إلى
userبالفعل يحصل علىuser → related_to → <subject>عند وقت الكتابة (أوراق الحمولة و عناقيد الكيانات الطافية). كائنات الحمولة (fully_clean، المسارات) لا تُسكّ ككيانات مفاهيم (تلك السكّة كانت تتخطى حافة المركز). تعبئة راجعة idempotent على مسح الـ 6 ساعات. - الإبطال / الاستبدال / مسح الرسم يضع شواهد قبور على مرآة Postgres ويحذف حواف Neo4j بأقصى جهد (المسح الشامل يستخدم
clear_tenant_edges).
الدور الذي تعذّرت كتابة ذاكرته، أو الذي وجد مرورُ حقائقه النموذجَ غير متاح، لا يُحسب متذكَّرًا: يعود إلى طابور الذاكرة ويُعاد تجريبه لاحقًا، منتظرًا مدة أطول في كل مرة (30 ثانية، ثم 2 و8 و32 دقيقة، ساعة على الأكثر). المهمة التي تفشل في كل محاولة تبقى في طابور مهام صفحة الذاكرة، وتعلّم صحة الذاكرة متدهورة، وترسل تنبيه عمليات حتى تعيد تجربتها أو تمسحها. لكتابات الذاكرة خانات طابور خاصة بها، فلا تؤخر نسخةٌ احتياطية دورًا أبدًا.
المجدوِلات (worker_bootstrap)
Section titled “المجدوِلات (worker_bootstrap)”كل الحلقات تبدأ من start_memory_worker() — أضف الجديدة هناك وإلا فلن تعمل أبدًا (الفجوة التي تركت النسخ الاحتياطية خاملة ذات مرة). قائمة الإقلاع الحالية ثماني حلقات.
| الإيقاع | العمل |
|---|---|
| ~6 س | macro_sleep (نقلات طبقات قاعدية + الأرشفة، أدناه) + تعبئة مرساة الإيغو + COUNT انزياح FTS (*_docsize مقابل الأساس؛ إعادة بناء عند عدم التطابق) |
| ~6 س (لا 24 س) | native_backup + تصدير JSONL/GraphML/الحلقات/الدمج/التدقيق + native_pg_backup + تحذير انزياح المرآة. النسخ الاحتياطي الشامل يفحص حداثة تفريغ PG؛ لا يفرّغ مرتين. |
| ~24 س | global_reconsolidation (إزالة تكرار + إعادة تضمين؛ مقسّم للمجموعات الكبيرة؛ يعيد حساب أعداد الكيانات) |
| ~15 د | GC الالتزامات (TTL + soul-pending)، مسح TTL بوابة HITL، إصلاح متجهات الذاكرة (المتجهات المفقودة أو الخاطئة الحجم أو القديمة النموذج تُعاد ترميزًا في مكانها، ~20 ث للمرور، بلا تحميل نموذج حين لا شيء ليفعل)، استعادة الذاكرة (أدناه)، تسوية الأدوار (أدوار مخزن الدردشة بلا حلقة، ثم حقائقها) وإصلاح متجهات المعرفة (أجزاء مكتبة المعرفة بلا متجه معنى، الأقصر أولًا، حتى 5 دقائق للمرور، الأخير في الدورة) — عدّاء مسح واحد، بلا حلقة إضافية |
| (أيضًا من هذا الإقلاع) | تطهير الجلسات، الملخص اليومي، سجل الإطلاق الأسبوعي، تمرين الاستعادة |
المجموعات الضخمة: أقسام بتجزئة الموضوع + مهام طابور متسلسلة (انظر global_reconsolidation.py).
دورة حياة الحلقات والأرشفة (macro_sleep.py)
Section titled “دورة حياة الحلقات والأرشفة (macro_sleep.py)”كل نقلة قاعدة على TTLs والأهمية والاستخدام — لا وجود لدرجة تلاشٍ (compute_retention أُزيل في 2026-09-23: لا شيء كان يقرأه، ومعدلات تلاشيه كانت بالثانية).
| النقلة | القاعدة |
|---|---|
| working → episodic | بعد working_ttl_hours (24) |
| episodic → recall | أهمية ≥ promote_to_recall_min_importance (3) و وصول ≥ promote_to_recall_min_access (2) |
| recall → episodic | لم تُستدعَ لمدة recall_demote_idle_days (30) |
| → archived | متقادمة على الساعتين كلتيهما — أُنشئت قبل أكثر من TTL ولم تُستدعَ خلاله — وتحت أرضية الترقية. الذاكرة التي ما تزال تُستدعى لا تُؤرشف أبدًا. |
الأرشفة تخزين بارد، لا حذف (منذ 2026-09-26). تتغير الطبقة ويحصل الملخص الفارغ على بذرة من سطر واحد (بداية السؤال — الجواب)؛ يبقى السؤال والجواب والمتجه كلها، وبوابة ساكنة تفشل البناء إن ضبط أي استعلام نص الحلقة إلى NULL. لا يزال الاستدعاء يبلغ الذاكرة المؤرشفة (memory.v2.archived_recall_weight، الافتراضي 0.98 — خلف ذاكرة نشطة تطابقها بالقدر نفسه مباشرة)، والذاكرة المُستدعاة مجددًا تعود إلى الطبقة الحلقية في المسح التالي. تبلغ نقلات الطبقات مرآة حالة Postgres الاختيارية؛ ويحتفظ فهرس المتجهات البعيد بالمتجه المؤرشف معادًا وسمُه.
استعادة ما محته القاعدة القديمة. حتى 2026-09-26 كانت الأرشفة تصفّر النص فعلًا (كان التثبيت الحي قد فقد 76 ذاكرة). مرور الاستعادة كل 15 دقيقة (memory/rehydrate.py) يستعيدها من أي شيء لا يزال يحمل النص: نسخة احتياطية أسبق من memory_state.db، ومخزن الدردشة وسلسلة حفظه، وتاريخ نقاط تفتيش LangGraph، ومعتقد noted أو استدعاء أداة memory_store تركته ملاحظة محفوظة، ومكتبة المعرفة. لا يُستعاد نص إلا إذا ثبت أنه الممحوّ: يجب أن تكون النسخة الاحتياطية نسخةً من الصف نفسه الذي يُعيد نصُه إنتاجَ البذرة؛ وأي مصدر آخر يجب أن يعيد إنتاج معرّف الحلقة (SHA-256 للجلسة والدور والنص) والبذرة. يجب أن تتفق المصادر، والنص القائم لا يُستبدل أبدًا، والمصدر الذي لا يمكن قراءته يترك الصف للمرور التالي. صحة الذاكرة على لوحة التحكم تعرض ما استُعيد، أو هو معلّق، أو احتُفظ به كبذرته فقط (“كل ذاكرة قابلة للعثور عليها”).
لماذا هذا مهم: كل دور دردشة عادي يُكتب بأهمية 1، فلا يمكن ترقيته أبدًا. حتى 2026-09-23 كانت الأرشفة تختبر عمر الإنشاء فقط وكان تراجع البذرة يستخدم COALESCE على سلسلة فارغة، فأصبحت كل ذاكرة دردشة قوقعة فارغة في اليوم 30 مهما كثر استدعاؤها. كان لدى التثبيت الحي 341 من هذه القواقع؛ استُعيدت كلها من النسخ الاحتياطية.
يكتب التصدير kazma_beliefs_latest.jsonl وGraphML، زائد الحلقات وbeliefs_archive وentity_merges (+ الأرشيف) وmemory_audit_log (أسماء ملفات لكل مستأجر حين لا تكون default)، كل جدول كاملًا وبنص عادي: تُستبعد المتجهات (فهي تُعاد بناءً)، والقيم الثنائية الأخرى بترميز base64. الجزء الذي تتعذر كتابته يُفشل مهمة التصدير، فيعيد طابور الذاكرة تجربتها. تبقى النسخ الاحتياطية الأصلية .db مصدر الحقيقة للاستعادة: كلٌّ منها نسخة متسقة واحدة، تُؤخذ في خطوة واحدة بينما تواصل كاظمه الكتابة.
تُظهر صحة الذاكرة كم انتظرت أقدم مهمة في الطابور، وكم عملت أقدم مهمة قيد التشغيل، ومتى نجح كل نوع من المهام آخر مرة، والنتيجة الأخيرة لكل مسح صيانة. المسح الذي يفشل في ثلاثة مرورات متتالية، والمهمة التي يرفضها الطابور، والمهمة التي تفشل في كل محاولة، يُبلَّغ عنها، ولا تُسجَّل فحسب.
تُبقى مرآة Postgres كاملةً مرورُ مزامنة على إيقاع الصيانة كل 15 دقيقة. كل ذاكرة أو حقيقة تُكتب هنا، أو يتغيّر فيها شيء تحمله المرآة (نقلة طبقة، ذاكرة منسية، حقيقة منتهية)، توضع في الطابور في المعاملة نفسها التي فيها التغيير، ويدفع المرور الصفوف الموضوعة في الطابور كما هي الآن، على دفعات عبر مجمّع اتصالات. ومرة في اليوم (memory.v2.mirror_verify_hours، 1-168) يقارن أيضًا كل صف بالمرآة ويدفع كل ما يختلف، الأحدث أولًا، حتى 5,000 صف في المرور؛ وما دام لا يزال يدفع وخلفه المزيد، يقارن المرور التالي مجددًا بدل الانتظار يومًا. ويسأل المرور المرآةَ أيضًا عن أحدث الصفوف التي سبق أن أُرسلت إليها، ويقارن مقارنة كاملة فورًا حين يكون أحدها مفقودًا: استعادة قاعدة البيانات المشتركة تُرجع إلى الوراء صفوفًا لن يدفعها أي مرور مجددًا (مرة في الساعة على الأكثر). الدفع الذي يظل يفشل يُعاد خمس مرات ثم يُترك لتلك المقارنة. الصف الذي تحمله المرآة وحدها يُحسب في صحة الذاكرة ويُترك وشأنه. يكمّل الاستدعاء جوابًا هزيلًا بذكريات كتبها تثبيت آخر فقط؛ الذاكرة التي أزالها هذا التثبيت لا تعود أبدًا عبر المرآة.
ما يخزّنه الوكيل بأدوات ذاكرته (memory_store، ربط كيانين) يسجّل الدردشة والدور الذي قيل فيه: نسيان ذلك الدور أو تلك الدردشة ينسى تلك الملاحظات والحقائق أيضًا، وفي دردشة تُبقى خارج الذاكرة لا تخزّن الأدوات شيئًا. ضغط محادثة طويلة لم يعد يخزّن ملخصها كذاكرة؛ الأدوار نفسها هي ما يُتذكَّر.
انزياح مرآة Postgres (حقائق ميتة لا تزال حية في kazma_beliefs): معالج النسخ الاحتياطي يسجّل تحذيرًا. سوِّ عبر:
python scripts/reconcile_memory_mirror.py --dry-runpython scripts/reconcile_memory_mirror.pyلا تضبط KAZMA_MEMORY_STATE_ROLE=primary حتى يكون ذلك الفحص نظيفًا — وإلا فسيبعث التحويل حقائق وُضعت عليها شواهد القبور.
مكتبة المعرفة + الدردشة (الدمج المنتجي)
Section titled “مكتبة المعرفة + الدردشة (الدمج المنتجي)”- الحقن — يستطيع المشرف إضافة كتل ملاحظات KB موسومة بجانب ذاكرة V2.
- البحث الفيدرالي —
POST /api/memory/v2/federated-searchو”ابحث في كل المعرفة” في لوحة التحكم (رقائقMEM/KB). - لا يُكتب في الذاكرة أبدًا — يُعرض نص مكتبة المعرفة على النموذج خلال الدور، ولا يُخزَّن أبدًا ذاكرةً للمحادثة. والنسخ التي صنعتها إصدارات سابقة يفرّغها مرور الصيانة (وتحتفظ المكتبة بالنص).
تعمّق أكثر: مكتبة المعرفة.
Neo4j (كتابة مزدوجة اختيارية)
Section titled “Neo4j (كتابة مزدوجة اختيارية)”- مصدر الحقيقة للمعتقدات يبقى SQLite (ثنائي الزمن، التنقية، مرشحات لوحة التحكم).
- طوبولوجيا لوحة التحكم ترسم من SQLite حين يكون Neo4j مضبوطًا (الأنواع + ثنائي الزمن).
- يتلقى Neo4j الكتابة المزدوجة عند التغيير؛ مزامنة المعتقدات → Neo4j تعبّئ الصفوف القائمة رجوعًا.
- الإبطال الناعم / الاستبدال / مسح الرسم يحذف حواف Neo4j بأقصى جهد (بنطاق المستأجر). لا ينبغي أن تحتاج إلى مزامنة يدوية بعد مسح الرسم.
إعداد المشغّل
Section titled “إعداد المشغّل”- شغّل Neo4j (مثل
docker compose -f deploy/docker-compose.neo4j.yml up -d). - ثبّت المشغّل في Python الخاص بكاظمه: الإضافة
neo4j(uv pip install -e ".[neo4j]"، أو الإعدادات → الحزم). من دونه يبقى الرسم في SQLite، وتقول كاظمه ذلك مرة واحدة عند الإقلاع وتعرض الإعداداتdriver_missing. - الإعدادات → الذاكرة → مخزن الرسم Neo4j، وURL
bolt://localhost:7687، وكلمة السر، ثم حفظ. - اختبر Neo4j (كلمات السر المقنّعة
***لا تستبدل سر الخزنة). - مزامنة المعتقدات → Neo4j.
افتراض التثبيت عبر البيئة (fail-open)
Section titled “افتراض التثبيت عبر البيئة (fail-open)”export KAZMA_NEO4J_DEFAULT=1export KAZMA_NEO4J_PASSWORD=...# optional: KAZMA_NEO4J_URL=bolt://localhost:7687إن لم تُضبط، يبقى مزوّد الرسم الافتراضي sqlite. الخادم متوقف → تتراجع الطوبولوجيا إلى SQLite.
لوحة التحكم
Section titled “لوحة التحكم”| اللوحة | الدور |
|---|---|
| الذاكرة والحوكمة | صحة المكونات (مكدّس V2، Neo4j، حقن KB، الحزم) |
| محرك V2 المعرفي | مؤشرات KPI، الفحص/الفيدرالي، الطابور، لوحة الطوبولوجيا |
| الطوبولوجيا | رسم SQLite؛ واجهة التمييز؛ المسار من الاستعلام؛ تراكب الحلقات؛ PNG/SVG |
النسيان، والدردشات المُبقاة خارج الذاكرة
Section titled “النسيان، والدردشات المُبقاة خارج الذاكرة”أنت تقرر ما تحتفظ به كاظمه:
- انسَ ذاكرة واحدة. تعرض صفحة الذاكرة ما تتذكره كاظمه من محادثاتك (“ذكريات المحادثات”)، الأحدث أولًا، صفحةً صفحة (“1–30 من 412”، الأقدم والأحدث)، مع صندوق بحث يجد الذكريات التي تحمل كل كلمة تكتبها. انسَ تزيل واحدة، من تلك القائمة أو من نتيجة بحث في الصفحة نفسها (بحث الذاكرة و”ابحث في المخزنين كليهما”)؛ والملخصات الأسبوعية تُتصفَّح صفحةً صفحة وتُنسى بالطريقة نفسها. لا تحتفظ كاظمه بشيء مما قالته — السؤال، الجواب، متجه البحث — والحقائق التي تعلمتها من ذلك الجزء من المحادثة تفقد قيمتها ومتجهها وتاريخ تحريرها، أينما حُفظت نسخة منها: أرشيف الحقائق، وسجل التغييرات على الحقائق، ودور لا يزال ينتظر المعالجة، وفهرس البحث. الدردشة نفسها تبقى كما هي.
- اطلب ذلك في الدردشة. “انسَ كلمة السر الخاصة بي” تنهي الحقيقة وتنسى جزء المحادثة الذي جاءت منه، كما تفعل انسَ في صفحة الذاكرة — وإلا لوجد الاستدعاء ذلك الدور ولتعلّم الدور التالي الحقيقة من جديد. وحين تسمّي قيمة الحقيقة شيئًا واحدًا (كلمة واحدة من ستة أحرف أو أكثر فيها رقم أو
-أو_: كلمة سر، أو رقم طلب أو هاتف)، تُنسى أيضًا كل ذاكرة تكررها، بما فيها أجوبة كاظمه السابقة التي تقتبسها؛ أما الكلمة العادية كاسم مدينة فلا تُكنس. و”انسَ كل ما يذكر BLUE-HERON-42” تنسى كل ذاكرة لمحادثة وكل حقيقة حالية تحمل ذلك النص (أربعة أحرف على الأقل؛ والحروف اللاتينية بأي حالة)، لا القليل الذي يعرضه بحث الذاكرة وحده، وتزيل كل درس كتبته كاظمه لنفسها يحمله. كل واحد من هذه يطلب موافقتك أولًا، والرسالة التي تطلب فيها النسيان لا تُتذكَّر أيضًا. والحقيقة التي انتهت سابقًا تحتفظ بقيمتها في تاريخ الحقائق. - لا تتذكر دردشة. في قائمة الدردشات، تحوي قائمة الدردشة الذاكرة…: أطفئها فلا تتذكر كاظمه شيئًا جديدًا من تلك الدردشة وتنسى ما تذكّرته منها بالفعل. في تيليجرام أو ديسكورد أو سلاك، أرسل
/memory off(و/memory onللبدء مجددًا). يقول/memoryما إذا كانت الدردشة متذكَّرة. - حذف الدردشة يحتفظ بما تعلمته كاظمه منها، إلا إن مؤشرت انسَ أيضًا ما تعلمته كاظمه من هذه الدردشة في حوار الحذف: عندها تُنسى ذكريات الدردشة وحقائقها قبل حذفها.
- الملاحظات التي تحفظها كاظمه بأدوات ذاكرتها تخص الدردشة التي حُفظت فيها: نسيان تلك الدردشة (أو ذلك الدور) ينساها أيضًا، وفي دردشة تُبقيها خارج الذاكرة لا تحفظ كاظمه شيئًا.
- خذها معك. التصدير في صفحة الذاكرة ينزّل ما تتذكره كاظمه بصيغة JSON: نبذتك “من أنا”، والحقائق (الحالية والماضية والمؤرشفة، مع الدردشة التي جاءت منها)، وكل تغيير طرأ على حقيقة، وذكريات المحادثات، والملخصات الأسبوعية، والكيانات ودمجها، والتجميعات التي أجريتها على الرسم، وإجراءات الأدوات التي تعلمتها كاظمه، وأوقات نسيان الأشياء (لا ما نُسي أبدًا). يسمّي الجزء
not_includedمن الملف ما يستبعده ولماذا: العمل الذي لا يزال في الطابور، وسجلات موافقات طبقة الأمان، وفهارس البحث التي تُعاد بناءً من البقية.
الذاكرة المنسية تبقى منسية: لا شيء يعيد بناء الذاكرة من سجل دردشاتك يعيدها.
إرجاع دردشة إلى الوراء يُرجع ما تتذكره كاظمه منها. /undo و/edit واستعادة نقطة أسبق في السفر عبر الزمن وإلغاء دور، كلها تُخرج الأدوار المُرجَعة من الذاكرة أيضًا — ذاكرة كل منها والحقائق التي علّمها — فلا يمكن أن يعود الجواب القديم كشيء “تتذكره” كاظمه. التفريع يبدأ دردشة جديدة ويترك ذاكرة الدردشة الأصلية كما هي.
ما لا يبلغه النسيان. النسخ التي صُنعت قبل أن تنسى تحتفظ بما نسيته حتى تُستبدل: النسخ الاحتياطية للذاكرة (عشر، واحدة كل ست ساعات)، والنسخ الاحتياطية الكاملة لكاظمه (سبع)، والنسخ الاحتياطية خارج الموقع (حتى اثنتي عشرة شهرية)، وتصدير الذاكرة الذي يُكتب كل ست ساعات، والنسخة المحفوظة قبل إعادة بناء التضمينات، والنسخ التي تحفظها سكربتات الإصلاح الخاصة بالمشغّل قبل أن تغيّر قاعدة البيانات (memory_state.db.pre_entity_key، memory_state.db.pre_relabel، memory_state.db.pre_reopen، حتى تُزال)، والمساحة التي حرّرتها قاعدة البيانات ولم تُعِد استخدامها بعد. ولا تُبلغ دروس كاظمه لنفسها إلا عبر “انسَ كل ما يذكر …”؛ والدروس المكتوبة قبل 2026-10-19 قد تقتبس الرسالة التي جاءت منها. ويقول حوار النسيان ذلك أيضًا.
من أنا
Section titled “من أنا”الإعدادات → الذاكرة → من أنا نص قصير (حتى 2,000 حرف) تكتبه أنت: اسمك، وعملك، ومكانك، وكيف تحب أن يُجاب عنك. تقرؤه كاظمه في بداية كل رد، في كل دردشة. لا تملؤه كاظمه أبدًا، وما تقوله لاحقًا في المحادثة يتغلب عليه. امسح النص لإزالته. على تثبيت بعدة مستخدمين، لا يغيّره إلا مسؤول: فكاظمه تأخذه في الحسبان لكل من يستخدم ذلك المستأجر.
حقيقة واحدة، اسم واحد
Section titled “حقيقة واحدة، اسم واحد”حين تتعلم كاظمه حقيقةً تسمّيها (timezone، works_at …). كانت الحقيقة نفسها قد تعود باسم آخر — timezone وtimezone_is، وdaily_tweet_cap وtweet_daily_cap — فتكون قيمة قديمة وأخرى جديدة كلتاهما حاليتان. الآن تُكتب الحقيقة بالاسم الذي تستخدمه كاظمه لها بالفعل حين تكون الكلمات نفسها، فتستبدل القيمة الجديدة القديمة؛ والصيانة اليومية للذاكرة تُقاعد الحقائق المخزنة مرتين (محتفظة بالأحدث). حيث تختلف كلماتك أنت وما استنتجته كاظمه، تُحفظ كلتاهما لتفيصل أنت.
ما تقوله عن نفسك يتقدّم على ما تستنتجه كاظمه أو تخزّنه من تلقاء نفسها. الحقيقة التي حفظتها كاظمه بأدوات ذاكرتها دون أن تطلب — من صفحة قرأتها، أو بريد إلكتروني، أو قراءتها هي للدردشة — لا تقف أبدًا في طريق تصحيحك لها: قل “أسكن في لشبونة الآن” فيكون ذلك ما تتذكره كاظمه. حين تطلب من كاظمه أن تتذكر شيئًا (“remember that …”، “تذكر أن …”)، فما تخزّنه بكلماتك يُحسب لك. النص الذي يُقرأ كتعليمات لكاظمه يُرفض؛ وما تمرّره صفحة أو بريد إلكتروني متجاوزًا ذلك الفحص لا يُعامَل مع ذلك أبدًا على أنه كلماتك أنت.
الحقائق التي خزّنتها أدوات ذاكرة كاظمه قبل 2026-10-13 وُسمت كلها بأنها لك. ويمكن إعادة وسمها بأنها لكاظمه نفسها. قِس حجمها أولًا (هذا يقرأ فقط، ويسرد الحقائق بمعرّفاتها، لا بما تقوله أبدًا):
python scripts/memory_relabel_provenance.py sizeثم، حين تكون كاظمه خاملة، apply --db <path to memory_state.db> --yes: يُنسخ الملف أولًا إلى memory_state.db.pre_relabel. لا تتغيّر حقيقة إلا حين يُظهر ما سجّلته الذاكرة أن أداة ذاكرة كتبتها — ملاحظة حفظتها الأداة تسمّيها، أو تسمّي الحقيقةُ دورَ الدردشة الذي عملت فيه الأداة — وتحتفظ بوسمك حين حرّرتها في صفحة الذاكرة، أو تصرّفت فيها هناك، أو طلب الدور من كاظمه أن تتذكر تلك الكلمات. الحقائق التي لا يُظهر شيء أصلها (روابط صفحة الذاكرة نفسها، والاستيراد لمرة واحدة من نظام الذاكرة السابق) تُترك كما هي. يُكتب كل تغيير في سجل تدقيق الذاكرة؛ وتشغيله مجددًا لا يغيّر شيئًا.
أسماء بأي لغة
Section titled “أسماء بأي لغة”الشخص أو الشركة أو المكان الذي تتعلّم عنه كاظمه يحتفظ باسمه باللغة التي استخدمتها: “شركة الخليج” و”東京タワー” و”Gulf Company” ثلاثة أشياء مختلفة بالنسبة إليها. حتى 2026-10-13 كان الاسم الذي لا حروف لاتينية فيه يُحفظ تحت معرّف واحد مشترك، فكان يمكن أن تستبدل حقيقتان عربيتان عن شيئين مختلفين إحداهما الأخرى، وأن يُخزَّن اسم عربي لاحق على أنه الكلمة “entity”. الأسماء التي لا تختلف إلا بالتشكيل أو بصورة حرف (“أحمد”، “أَحْمَد”، “احمد”) تُعرَف على أنها اسم واحد.
الحقائق التي حفظتها القاعدة القديمة تحت “entity” يمكن إصلاحها. قِس حجمها أولًا (هذا يقرأ فقط):
python scripts/memory_entity_repair.py sizeثم أصلح نسخةً من memory_state.db (apply --db <copy> --yes --no-queue) لترى النتيجة، ثم، حين تكون كاظمه خاملة، قاعدة بيانات التثبيت نفسها (apply --db <path> --yes). كل حقيقة انطوت تحت ذلك المعرّف تُنحّى جانبًا — تُحفظ، ولا تُستخدم بعد ذلك — ويقرأ عاملُ ذاكرة كاظمه الدورَ الذي جاءت منه مجددًا، فيحفظ حقائقه تحت أسمائها الحقيقية. الحقيقة التي زال دورها تبقى منحّاة؛ لا يُخمَّن شيء.
على تثبيت بعدة مستخدمين، أشخاص كل مستخدم وأماكنه وأشياؤه خاصة به: يمكن أن يكون لكلٍّ من مستخدمَين “كاظمه” أو “نور” خاص به، ولكلٍّ منهما “أنت” خاص به في مركز رسمه. حتى 2026-10-15 كان الاسم مدخلًا واحدًا للتثبيت كله، يملكه من استخدمه أولًا. قاعدة بيانات الذاكرة التي صُنعت قبل ذلك تحتفظ بذلك المدخل المشترك حتى تُحوَّل؛ قِس حجمها أولًا (هذا يقرأ فقط)، ثم، حين تكون كاظمه خاملة، طبّق التحويل:
python scripts/memory_entity_key.py sizepython scripts/memory_entity_key.py apply --db <path to memory_state.db> --yesيُنسخ الملف أولًا إلى memory_state.db.pre_entity_key؛ ويحتفظ كل مدخل باسمه، وتشغيله مجددًا لا يغيّر شيئًا. تُظهر صحة الذاكرة أيّ الشكلين لدى قاعدة البيانات (entity_key). التثبيت ذو المستخدم الواحد لا يخسر شيئًا بالانتظار: فله مستخدم واحد.
الملخصات الأسبوعية
Section titled “الملخصات الأسبوعية”الموضوع الذي تعمل عليه أسابيع قد يملأ مئة دور محادثة في الأسبوع، والسؤال عنه لا يعيد إلا الأدوار القليلة الأفضل مطابقة. لذا متى انتهى أسبوع (بعد يوم)، تكتب كاظمه ملخصًا قصيرًا لكل موضوع من ذلك الأسبوع: عما كان، وما قُرر أو أُنجز، وما تُرك مفتوحًا.
- الموضوع دردشة بأربعة أدوار على الأقل في ذلك الأسبوع. الأدوار من الدردشات القصيرة، والملاحظات التي حفظتها كاظمه لك، تُجمَّع بحسب موضوعها.
- أين تراها: صفحة الذاكرة، “الملخصات الأسبوعية”. انسَ واحدًا فلن تكتبه كاظمه أبدًا مجددًا؛ المحادثات التي كُتب منها تبقى.
- نسيان دور محادثة يزيله أيضًا من كل ملخص: يُفرَّغ الملخص فورًا ويُكتب مجددًا بدونه — وكذلك حين تنساه بينما يُكتب ذلك الملخص.
- الإعدادات (
memory.v2):summaries_enabled(مفعّل)،summaries_min_turns(4)،summaries_max_per_week(24 موضوعًا، الأكبر أولًا). استدعاء نموذج واحد لكل موضوع. - متى تُستخدم: السؤال عن موضوع يعيد ملخص أسبوعه (اثنان على الأكثر)، يُعرض على النموذج بعد أدوار المحادثة المطابقة. يجب أن يكون الملخص عن السؤال بوضوح: على تثبيت المؤلف وجد كل سؤال “أين نحن من …” موضوعه، ولم يُدخل أي سؤال غير ذي صلة ملخصًا.
- الملخصات مشمولة في تصدير الذاكرة. تُحفظ في قاعدة بيانات الذاكرة على هذا التثبيت وتُعاد بناءً من المحادثات؛ ولا تُنسخ إلى مرآة الذاكرة في Postgres.
واجهة إدارة الذاكرة (/memory)
Section titled “واجهة إدارة الذاكرة (/memory)”سطح واحد للمشغّل لـ الطوبولوجيا + الكيانات + المعتقدات + النظافة (memory.html + memory_console.js + memory.js + memory_api.py).
كل تغيير يُجرى هنا يترك أثرًا: سطر سجل وصف تدقيق يسمّيان الإجراء، ومن أجراه، والمستأجر، والمعرّفات، ولا يسمّيان قيمة أبدًا. يعدّ الملخص اليومي الذكريات المنسية من هذه الصفحة، ويعدّ /metrics التغييرات المطلوبة لكل إجراء (kazma_memory_operator_actions_total).
التخطيط
Section titled “التخطيط”- الرسم والصحة (الأعلى) — لوحة معتقدات V2، ومؤشرات KPI، والفحص، والنسخ الاحتياطية.
- تبويبات العمليات — الكيانات، المعتقدات، الدمج المعلّق، النظافة.
قدرات المشغّل (تجديد 2026-08)
Section titled “قدرات المشغّل (تجديد 2026-08)”| القدرة | أين | ملاحظات |
|---|---|---|
| ترقيم الصفحات + أعداد حقيقية | كل تبويب قائمة | “عرض 1–150 من 3,412” + تحميل المزيد. يُبلّغ الرسم عن total_nodes/truncated ويعرض لافتة كهرمانية عند الاقتطاع — بما فيها الاتصالات المخفية بالتقطيع. لا مزيد من سقف 200 صف الصامت. |
| بحث غير حساس للتشكيل | صندوقا البحث في الكيانات والمعتقدات | يمر عبر beliefs_fts / entities_fts (FTS5) — francais تطابق Français، والكنى قابلة للبحث. يتراجع إلى LIKE إن لم يتوفر FTS. |
| “لماذا استُدعي” | درج المعتقد | انقر معتقدًا → ترى recalled N× · last <date> · via <method> · from <episode>، زائد زر فحص من هذا المعتقد →. النقطة الطرفية: GET /beliefs/{id}/recall-trail. |
| التراجع | تنبيه الإجراء | الإبطال الدفعي والربط والتحرير وحذف الكيان تعيد إيصالًا + رمز تراجع أحادي الاستخدام لمدة 60 ث؛ ويحمل التنبيه زر [تراجع]. الدمج يعرض إيصال “أُعيد توصيل N معتقدًا” (غير قابل للتراجع — استعده من نسخة احتياطية). |
| تحرير معتقد مفرد | تحرير في صف المعتقد | استمارة نافذة واحدة (الموضوع/المحمول/المفعول)، لا توجيه متعدد الخطوات. |
| شريط عمليات واحد | شريط عمليات الرسم | أُزيلت بطاقة خانات الربط/الدمج المكررة — شريط عمليات الرسم هو مصدر الحقيقة الوحيد؛ زرا Src/Tgt في الصف + نقرة-Shift تزامنان إليه. |
| متعدد المستأجرين | علم بيئة + وضعية | يُفرض المستأجرون بـ KAZMA_MEMORY_ENFORCE_TENANT=1، في الإنتاج (KAZMA_PRODUCTION=1) ومع تفعيل تعدد المستخدمين. عندها يقرأ كل مسار /api/memory ويعدّ ويغيّر صفوف مستأجر الطلب فقط — معرّف مستأجر آخر يُقرأ غيرَ موجود — بما فيها الصحة والجودة والنظافة ورموز التراجع ومسح الرسم؛ وطابور مهام المحرك وإعادة التوحيد والتقييم الذهبي للمسؤول فقط. المستخدم المرتبط بلا مستأجر يرى التثبيت (default أحادي المستأجر). لا وجود لمسحٍ لكل المستأجرين. مفتاح الكيانات هو المستأجر والمعرّف معًا (2026-10-15): لكل مستأجر صفه الخاص لاسمٍ ما ومركزه الخاص؛ وقاعدة البيانات التي صُنعت قبل ذلك تحتفظ بمفتاح مشترك واحد حتى يحوّلها scripts/memory_entity_key.py apply (الصحة: entity_key). |
| تجميع / نقل / مستوى / فك التجميع | فحص الرسم | عنقدة عرض فقط (POST/DELETE /api/memory/v2/graph/groups*). لا تغيّر المعتقدات. جمّع تحت← على عقدة لها أمٌّ أصلًا ينقلها (…/member/{id}/move: تزول الأم القديمة وتنتقل العقد التي تحتها معها)؛ والمستوى… يحدد مستوى عقدة مُجمّعة من 0 إلى 4 (…/node/{id}/tier). استطلاع اللوحة كل 30 ث يستخدم المجموعات الموجودة أصلًا على GET /api/memory/v2/graph (بلا جلب إضافي). |
الأداء: belief_count / graph_degree للكيان عمودان مجسّدان (يُصانان عند كل كتابة، ذاتا الشفاء من حارس -1)، فتقرأ الصفحة أعدادًا محسوبة سلفًا بدل تشغيل استعلامات فرعية مترابطة O(كيانات×معتقدات) عند كل تحميل — تسريعٌ لفتح الصفحة بنحو 10× عند التوسع.
ثوابت الرسم (اللوحة مصدر الحقيقة)
Section titled “ثوابت الرسم (اللوحة مصدر الحقيقة)”| القاعدة | لماذا |
|---|---|
| معرّفات عقد فريدة في الحمولة | _v2gIds[id] في اللوحة آخر-كتابة-يفوز؛ المعرّفات المكررة تيتم عقدةً (علة “shipx الاثنين” القديمة). |
| الكيان يتغلب على الحقيقة الافتراضية | حين يساوي نص مفعول المعتقد معرّف كيان (user → has_project → shipx)، أصدِر عقدة كيان حقيقية واحدة — لا توأم isVirtual ثانيًا بالمعرّف نفسه أبدًا. |
| لا وصلات معلقة | يجب أن تنجو بداية الوصلة وهدفها كلاهما من المرشحات (entity_type، الحد). |
المركز دائمًا id=user | تنسيق “أنت” المركزي؛ اسم العرض يأتي من entities.user.name (مثل Mubder). |
| موضوعات الحمولة تتصل بالمركز | الحقيقة التي مفعولها قيمة حرفية (لا كيان آخر) تحصل رغم ذلك على user → related_to → <subject> كي لا يكون المفهوم مكوّنًا طافيًا. |
إعادة تسمية العرض (لا إعادة كتابة المعرّف)
Section titled “إعادة تسمية العرض (لا إعادة كتابة المعرّف)”- API:
POST /api/memory/v2/entities/{id}/renameبجسم{ "name": "ShipX" }. - يبقى المعرّف القانوني مستقرًا فتستمر موضوعات/مفعولات المعتقد في الربط.
- التسميات السابقة تذهب إلى
aliases_json(التحليل لا يزال يجد الكنى القديمة). - الواجهة: إعادة تسمية في فحص الرسم، إعادة تسمية في جدول الكيانات.
- تحدّث اللوحة التسميات ناعمًا حين تتغير الأسماء فقط (لا تصفّر التخطيط).
هوية الذات / المركز (User → Mubder)
Section titled “هوية الذات / المركز (User → Mubder)”كثيرًا ما تنشئ التعبئة الراجعة والمستخرجات قوقعة شخص (ent_<hash> مسماة User) منفصلة عن المركز الاصطناعي user. كلتاهما هوية المشغّل نفسها بالنسبة للواجهة:
| المفهوم | السلوك |
|---|---|
memory/self_hub.py | يكشف تسميات الذات (user / you / الكنى) وقواقع الأشخاص |
| إعادة تسمية قوقعة الذات → العلامة | أيضًا upsert لـ entities.id=user بذلك الاسم المعروض |
| صف القائمة | is_self: true، graph_id: "user" — النقر يركّز المركز |
| طلاء الرسم | يطوي معرّفات الذات على عقدة مركز واحدة؛ التسمية = اسم عرض المركز |
لذا فإن إعادة تسمية User → Mubder على ent_… تجعل مركز اللوحة يعرض Mubder، لا “أنت” مثبتةً في الكود.
جسر القائمة ↔ الرسم
Section titled “جسر القائمة ↔ الرسم”| من | إلى |
|---|---|
| انقر صف كيان / معتقد | تحديد + تقريب على اللوحة (_v2gSelectEntity / _v2gSelectBelief) |
| نقرة مزدوجة على عقدة الرسم | تمييز صف القائمة المطابق + تمرير العمليات (kazma:memory-graph-select) |
| نقرة واحدة / سحب عقدة | تحديد + فحص فقط — لا يقفز بالصفحة (استكشاف حر) |
| اسحب العقدة ثم أفلتها | العقدة مثبّتة في ذلك الموضع (تنجو من التحديث / إعادة ضبط المرشحات) |
| فحص في القائمة | قفز صريح إلى القائمة (مثل النقرة المزدوجة) |
| دمج / ربط / إبطال / إعادة تسمية | تحديث حمولة الرسم؛ الموضع المثبّت يُستعاد من خبيئة العميل |
تحرير المعتقد للمشغّل
Section titled “تحرير المعتقد للمشغّل”- API:
PATCH /api/memory/v2/beliefs/{id}بأي منsubject/predicate/object/predicate_type. - المعتقدات النشطة فقط (غير المبطلة/المستبدلة).
- يضبط
extraction_method=user_explicit؛ ويمسح التضمين عند تغير نص المفعول (مشغلات FTS تُبقي البحث متزامنًا). - الواجهة: تبويب المعتقدات → تحرير (توجيهات موجّهة للمفعول → المحمول → الموضوع).
عمليات الكيانات الأخرى (عقد بلا تغيير)
Section titled “عمليات الكيانات الأخرى (عقد بلا تغيير)”| الإجراء | المسار |
|---|---|
| قائمة / تصفية | GET /api/memory/v2/entities |
| دمج القواقع | POST /api/memory/v2/entities/merge |
| ربط كيانين | POST /api/memory/v2/entities/link |
| حذف قوقعة فارغة | DELETE /api/memory/v2/entities/{id} (ليست الكيانات المحمية). ينسخ صفوف entity_merges إلى entity_merges_archive أولًا (المفتاح الأجنبي ما يزال يُسقط صفوف السجل الحية). |
| تطهير الكيانات الفارغة | تبويب التنظيف، POST /api/memory/v2/hygiene/run مع purge_empty_entities: يزيل فقط القواقع التي لا حقيقة حية فيها ولا شيء غير اسمها، وهي القاعدة نفسها التي تزيلها تلقائيًا. تبقى إعادات توجيه الدمج: فهي ترسل الاسم المدموج إلى هدفه، وتعرضها قائمة الكيانات بعبارة «مدمج في». وعدّاد الفارغة في الصفحة هو هذه القائمة. |
| إبطال معتقد | POST /api/memory/v2/beliefs/{id}/invalidate (+ دفعي) |
لا تُحذف الكيانات المحمية ولا تُطهَّر ولا تُدمج في غيرها: المركز (user)، والوكيل (assistant، kazma)، وأسماء المركز نفسه (كيان تذكره الأسماء البديلة للمركز، مثل كيان الشخص الذي كنتَه قبل أن يأخذ المركز اسمك)، وأي كيان تضع عليه حماية. ويبقى ممكنًا دمج أحد أسماء المركز في المركز نفسه. يعرف Kazma أسماء مالكه من المركز، لا من شيفرته (memory/entity_protection.py).
الوحدات الأساسية
Section titled “الوحدات الأساسية”| الوحدة | الغرض |
|---|---|
memory/recall.py | استدعاء موحد |
memory/belief_mutation.py / belief_extractor.py | مسار الكتابة + السياج/النظافة؛ عدد صفوف INSERT OR IGNORE + تراجع |
memory/hygiene.py | الموضوعات المحجوبة، الشفاء الذاتي لـ FTS، الإبطال + حذف الرسم |
memory/ego_anchor.py | حواف المركز لموضوعات أوراق كائنات الحمولة |
memory/fts_health.py | عدّ *_docsize الدوري لـ FTS مقابل الأساس + إعادة البناء |
memory/entity_counts.py | مصدر حقيقة واحد لـ SQL الخاص بـ belief_count / graph_degree |
memory/self_hub.py | اسم عرض المركز + طي قواقع أشخاص الذات |
memory/graph_backend.py | SQLite الافتراضي + كتابة مزدوجة Neo4j + مسح حواف المستأجر |
memory/backends.py | مصنع المتجه / الحالة / الرسم؛ اختيار pgvector تلقائيًا؛ افتراضات Neo4j البيئية |
memory/federated_search.py | بحث موسوم للذاكرة + KB |
memory/vector_engine.py | بحث معنى دقيق عبر كل حلقة وحقيقة؛ RECALLABLE_TIERS |
memory/reembed.py | إعادة البناء + إصلاح المتجهات كل 15 دقيقة |
memory/rehydrate.py | استعادة الذكريات التي محتها قاعدة الأرشفة ما قبل 2026-09-26 |
memory/chat_history.py | القارئ الوحيد لسجل الدردشة (مخزن الدردشة + السلسلة، نقاط التفتيش) |
memory/turn_reconcile.py | كل دور في مخزن الدردشة يحصل على حلقته |
memory/global_reconsolidation.py | إزالة التكرار + إعادة التضمين (مقسّم؛ الإصلاح عبر reembed) |
memory/worker_bootstrap.py | معالجات الطابور + ثمانية مجدوِلات (مدخل إقلاع واحد) |
memory/v2_health.py / health.py | واجهات برمجة الصحة للوحة التحكم / الحزم |
kazma_ui/memory_api.py | مسارات إدارة /memory (إعادة تسمية، تحرير، دمج، نظافة) |
kazma_ui/static/js/memory_console.js | لوحة V2 + إعادة تسمية الفحص |
kazma_ui/static/js/memory.js | قائمتا الكيانات/المعتقدات + جسر القائمة↔الرسم |
التوسع (عند الطلب فقط)
Section titled “التوسع (عند الطلب فقط)”| الحاجة | التتبع |
|---|---|
| استدعاء Postgres-الأساسي الكامل | #76 — المحوّل شُحن؛ فعّله فقط بعد أن يصبح reconcile_memory_mirror.py نظيفًا |
| مناطق متعددة + تعارضات | #77 |
| أسطول استضافة تضمين فقط | #78 |
المرآة المزدوجة لـ Postgres ومساعدة ILIKE المتناثرة موجودتان بالفعل أساسين اختياريين. شواهد القبور تنتشر، ومزامنة المرآة كل 15 دقيقة تدفع ما تغيّر (ومرة في اليوم، كل ما تنقصه المرآة أو تحمله متقادمًا؛ الصف الذي تحمله المرآة وحدها يُحسب، ولا يُحذف أبدًا).
تقرير المرجع (مجموعة البيانات v5، 2026-10-14)
Section titled “تقرير المرجع (مجموعة البيانات v5، 2026-10-14)”الاستدعاء على مرجع الاسترجاع، بأسئلة الضبط والأسئلة المحجوزة، على المسارين كليهما (متجهات مُعاد تشغيلها من bge-m3):
| المحلي (SQLite) ضبط | المحلي محجوزة | Postgres الأساسي ضبط | Postgres الأساسي محجوزة | |
|---|---|---|---|---|
| الأسئلة | 89 | 40 | 89 | 40 |
| معدل الإصابة (عُرضت كل قطعة من الجواب) | 0.925 | 0.891 | 0.895 | 0.891 |
| MRR (مدى علوّ ترتيب أول جواب) | 0.844 | 0.845 | 0.830 | 0.845 |
| الدقة (حصة ما يجيب مما يُعرض) | 0.644 | 0.646 | 0.621 | 0.630 |
| الامتناع (لا يُعرض شيء حين لا يجيب شيء) | 0.28 (5 من 18) | 0.00 (0 من 8) | 0.28 | 0.00 |
الأسئلة عبر اللغات (محجوزة، mixed) | إصابة 1.0، MRR 0.90 | إصابة 1.0، MRR 0.90 |
- الترتيب يصمد: معدل الإصابة وMRR والدقة للأسئلة المحجوزة على بُعد نقاط قليلة من نظيراتها في مجموعة الضبط، على المسارين كليهما، والسؤال بالعربية عن شيء قيل بالإنجليزية (أو العكس، أو كلتاهما في جملة واحدة) يُجاب عنه كأي سؤال آخر.
- الامتناع لا يصمد. يعرض الاستدعاء شيئًا لمعظم الأسئلة التي لا يجيب عنها شيء: 13 من 18 سؤال ضبط، وكل واحد من الأسئلة المحجوزة الثمانية، التي كُتبت لتقترب من ذاكرة حقيقية (طبيب أسنان شخص آخر، لون سيارة). الهدف 0.6 على المجموعتين كلتيهما (
TARGETSفيscripts/memory_bench.py)؛ وهو غاية مسجّلة بجانب الأرضيات، لا بوابة، والامتناع هو النتيجة الوحيدة التي لا يجوز لأي مقايضة أن تخفضها. - العتبات لا تشتريه (مُسحت في 2026-10-14: أرضية الذكريات من 0.04 إلى 0.10 مقابل أرضية الحقائق من 0.06 إلى 0.12، 16 إعدادًا). كل إعداد لا يعرض شيئًا لسؤال محجوز يخسر أجوبة في مواضع أخرى بما يتجاوز حدّ 0.05 في قاعدة المقايضة — معدل إصابة العربي 0.25، و”الضجيج” 0.33، والنظرات العامة 0.5 — والإعداد الوحيد داخل القاعدة يرفع امتناع الضبط وحده (من 0.28 إلى 0.39) ويترك المجموعة المحجوزة عند 0: اختيار مفصّل على مقاس أسئلة الضبط. ما تشترك فيه هذه الأسئلة مع ذكرياتها القريبة من الإصابة هو الشخص أو الشيء (نور، مايا، السيارة)؛ والتمييز بين “طبيب أسنان نور” و”مدرسة نور” يحتاج إلى إشارة إلى ما يُسأل عنه، لا إلى أرضية أعلى. ومعظم ما يُعرض لها يُعلَّم للنموذج بـ”(ربما ذات صلة)”.
- إشارة إلى ما يُسأل عنه، قيست ولم تُعتمد (2026-10-15): السؤال الذي يسمّي كلمة لا تحملها أي ذاكرة (“colour”، “salary”، “cholesterol”، “anniversary”) يسأل عن شيء غير متذكَّر، فلا تُعرض له إلا المطابقات القوية. تبلغ الهدف — الامتناع من 0.28 إلى 0.67 على مجموعة الضبط، ومن 0 إلى 0.50 (4 من 8) على المحجوزة — لكن الأجوبة الصحيحة التي تزيلها تبدو مثلها: مطابقات ضعيفة لإعادة صياغة (“who looks after my teeth”)، وسؤال عربي تحمل كلمته لاحقةً لا تحملها الذاكرة (“قهوتي”)، وسؤال يسمّي فئةً جوابُه مثالٌ منها (“which company is it at”)، بالدليل نفسه الذي للقريبة من الإصابة (ارتفاع المعنى 0.01-0.09 مقابل 0.04-0.09). ينخفض معدل إصابة إعادة الصياغة من 1.0 إلى 0.88، والعربي من 1.0 إلى 0.75، و”الضجيج” من 1.0 إلى 0.67، والتحديثات من 1.0 إلى 0.86، وMRR الإجمالي من 0.84 إلى 0.77: بما يتجاوز قاعدة المقايضة، في كل صيغة جُرّبت على مجموعة الضبط (مع استبعاد الملخصات؛ وفقط حين لا يُعرض شيء قوي). وحين لا تُطرح إلا إذا كانت معظم كلمات السؤال معروفة، تظل تخسر تحديثًا (“which company is it at now”: لا ذاكرة تقول “company”؛ عند ثلاثة أخماس معروفة، المحجوزة 1 من 8) أو أجوبةً عربية (عند النصف)؛ والإعداد الوحيد داخل القاعدة (ثلثان معروفان) يترك امتناع المحجوزة عند 0.
الاستخراج (python scripts/memory_bench.py extraction): 30 دورًا مفردًا بالإنجليزية والعربية وبكلتيهما، تُقيَّم على ما سيحتفظ به قارئ من كل منها.
| المرور الاستدلالي | الاستدعاء (recall) | الدقة | أدوار ليس فيها ما يُحتفظ به ولم يُحتفظ منها بشيء |
|---|---|---|---|
| الإنجليزية (12 دورًا) | 0.46 | 1.0 | 3 من 3 |
| العربية (10 أدوار) | 0.64 | 1.0 | 2 من 2 |
| المختلطة (8 أدوار) | 0.60 | 1.0 | 1 من 1 |
المرور الاستدلالي هو النظرة الأولى السريعة على كل دور. حتى 2026-10-14 لم تكن لديه إلا أنماط إنجليزية ولم يحتفظ بشيء من العربية (0.00، والمختلطة 0.20)؛ وهو الآن يقرأ أنواع الحقائق نفسها بالعربية وبالعربية الممزوجة بالإنجليزية — الاسم، وأين تسكن (أو إلى أين انتقلت)، وأين تعمل، وشيئًا مفضَّلًا، وتفضيلًا، وحساسية (memory/arabic_facts.py). قواعده مأخوذة من النحو، فلا يحتفظ بشيء من نفي (“ما أحب”)، أو تعليمة لكاظمه (“استخدم البحث”)، أو سؤال، أو شخص آخر (“أخوي ساكن في دبي”)، أو مجال عمل (“أشتغل في المبيعات”، مثل “I work in sales”). وما يفوته — الأقارب، والوظائف، والتواريخ — يعود إلى المرور العميق للنموذج ليجده. يُقيَّم ذلك المرور من الردود المسجّلة للنموذج المضبوط (scripts/memory_extraction_record.py --out <fixture>، يُشغَّل ببايثون التثبيت نفسه، استدعاء نموذج واحد لكل دور)؛ والدور الذي لا رد مسجّلًا له خطأ، لا تخمين. سُجّلت الردود في 2026-10-15 بنموذج deepseek-flash من DeepSeek:
| مرور النموذج | الاستدعاء (recall) | الدقة | أدوار ليس فيها ما يُحتفظ به ولم يُحتفظ منها بشيء |
|---|---|---|---|
| الإنجليزية (12 دورًا) | 0.77 | 0.79 | 3 من 3 |
| العربية (10 أدوار) | 0.91 | 0.91 | 2 من 2 |
| المختلطة (8 أدوار) | 0.70 | 0.58 | 1 من 1 |
وجد التسجيل الأول أن المرور العميق يترجم ما قاله المتحدثون بالعربية إلى معرّفات إنجليزية (“ليلى” حُفظت layla، و”دبي” حُفظت dubai): كانت الحقائق موجودة، أما كلمات المستخدم نفسه فلا (الاستدعاء العربي 0.09). صار موجّه المرور يُبقي كل موضوع وكل قيمة باللغة والكتابة اللتين كتبهما المستخدم بهما، وتبقى المحمولات بالإنجليزية. وتُقارَن القيمة المحوَّلة إلى معرّف بالكلمات التي تمثّلها (kuwait_city هي “Kuwait City”)، كما يقرؤها البحث.
الحدود المقيسة
Section titled “الحدود المقيسة”قيست في 2026-10-14 بالحجم الحي (نحو 1,700 ذاكرة؛ وافتُرض عدد مماثل من الحقائق، إذ لم يؤخذ العدد الحي) وبـ 10 و100 ضعف منه. يتبع النص توزيعًا طبيعيًا للكلمات، ولكل ذاكرة وحقيقة متجه من 1024 بُعدًا، وكانت مرآة Postgres قاعدة PostgreSQL 16.15 مؤقتة في Docker، محدودة بـ 1 CPU و1 GB. الجهاز: Intel Core (العائلة 6، الطراز 183)، 32 CPU منطقيًا، 64 GB RAM، Windows 11، Python 3.12.9، SQLite 3.47.1، sqlite-vec 0.1.9، NumPy 2.5.0، وعملية الاختبار بأولوية أدنى من العادية. بالثواني:
| 1x (1,700) | 10x (17,000) | 100x (170,000) | |
|---|---|---|---|
| استدعاء كامل (سؤال واحد) | 0.08 | 0.67 | 8.2 |
| بحث المعنى الدقيق، كل ذاكرة (sqlite-vec) | 0.007 | 0.20 | 1.8 |
| الشيء نفسه بلا sqlite-vec (NumPy) | 0.012 | 0.27 | 2.7 |
| بحث الكلمات المفتاحية | 0.0002 | 0.003 | 0.03 |
| أول مرور لـ macro-sleep، والمرآة مفعّلة (ينقل معظم الصفوف) | 0.40 | 7.0 | 53 |
| المرآة: مرور لم يتغيّر فيه شيء | 0.0001 | 0.0001 | 0.0001 |
| المرآة: مرور فيه 100 ذاكرة متغيّرة | 0.014 | 0.016 | 0.024 |
| المرآة: المقارنة الكاملة اليومية، بلا شيء لدفعه | 0.06 | 0.35 | 4.9 |
| المرآة: 100 دفعة مفردة، عبر المجمّع / باتصال لكل منها | 0.24 / 2.0 | 0.26 / 2.1 | 0.46 / 2.3 |
ما تعنيه الأرقام:
- الاستدعاء هو الحدّ. يقارن بحث المعنى السؤال بكل ذاكرة وكل حقيقة (لا فهرس تقريبي)، فتنمو كلفته مع المخزن: نحو 0.7 ث عند 17,000 ذاكرة، و8 ث عند 170,000. أبقِ المخزن تحت نحو 40,000 ذاكرة وعدد مماثل من الحقائق ليبقى الاستدعاء تحت ثانيتين على جهاز كهذا. وبعد ذلك، فهرس متجهات تقريبي هو التغيير الواجب.
- المرآة لم تعد تنمو مع المخزن. يدفع المرور ما تغيّر فقط؛ والمقارنة اليومية وحدها تقرأ كل شيء (5 ث عند 100x). قبل هذا، كان كل مرور كل 15 دقيقة يقرأ كل نص والبصمتين كلتيهما، ويدفع كل صف على اتصال جديد: استغرق أول مرور لـ macro-sleep عند 10x 336 ث وهو يدفع 16,000 نقلة واحدة تلو الأخرى، و7 ث على دفعات.
- macro-sleep خطي: يقرأ المرور الواحد كل ذاكرة لمستأجر مرة واحدة.
التشغيل اختياري (tests/test_memory_scale_bench.py، KAZMA_TEST_MEMORY_SCALE=1,10,100، مع KAZMA_DATABASE_URL وKAZMA_TEST_ALLOW_REAL_DB=1 لنصف المرآة على قاعدة بيانات مؤقتة). ويفشل حين يتجاوز حجمٌ الحدود التي يسمّيها.
تمارين الاستعادة (RPO وRTO)
Section titled “تمارين الاستعادة (RPO وRTO)”شُغّلت في 2026-10-14 على الجهاز نفسه، بالحجم الحي (1,700 دور دردشة، نصفها قبل النسخة الاحتياطية). يستخدم كل تمرين خطوات المنتج نفسها على مخازن خاصة:
| الذاكرة المحلية (SQLite) | ذاكرة Postgres الأساسية | |
|---|---|---|
| النسخة الاحتياطية | النسخة الاحتياطية الأصلية للذاكرة (كل 6 ساعات) | تفريغ Postgres لجداول المرآة (كل 6 ساعات) |
| الكارثة | قاعدة بيانات الذاكرة مُستعادة منها | قاعدة البيانات المشتركة مُستعادة من التفريغ |
| المفقود (RPO) | لا شيء مما يحمله دور دردشة: أُعيد بناء الأدوار الـ 850 منذ النسخة الاحتياطية من مخزن الدردشة؛ وتضيع ملاحظة وكيل حُفظت منذ النسخة الاحتياطية | لا شيء: دُفعت الذكريات الـ 850 منذ التفريغ مجددًا من المخزن المحلي |
| نسيان أُجري بعد النسخة الاحتياطية | يبقى منسيًا (يومية النسيان) | يبقى منسيًا، في المرآة وفي الاستدعاء |
| زمن الاكتمال (RTO) | 0.95 ث، عند الاستعادة | 0.11 ث، مرور الصيانة التالي (15 دقيقة على الأكثر) |
يلحق بحثُ المعنى للأدوار المعاد بناؤها حين يضمّنها مرور إصلاح المتجهات (نحو 20 ثانية للمرور، كل 15 دقيقة). تعمل التمارين في CI (tests/test_memory_restore_drill.py؛ وtests/test_memory_restore_drill_pg.py على Postgres مؤقت مع pg_dump)، ولكلٍّ منها الإعداد الذي أضاع البيانات ضابطًا سلبيًا: قبل التمارين، كانت قاعدة بيانات الذاكرة المستعادة تفقد كل دور من دردشة تغيّرت منذ النسخة الاحتياطية (مؤشر تسوية الأدوار كان يعيش في مخزن الإعدادات، متجاوزًا تلك الأدوار)، وكانت حالات النسيان التي أُجريت منذئذ تعود لمدة تصل إلى 15 دقيقة، وكانت المرآة المستعادة تنتظر حتى يوم. يضبط KAZMA_TEST_MEMORY_RESTORE_DRILL_TURNS الحجم.
اختبار التحمّل (soak)
Section titled “اختبار التحمّل (soak)”يشغّل scripts/memory_soak.py دورة حياة الذاكرة على مخازن خاصة، عملية لكل دورة (كل دورة إعادة تشغيل)، قاتلًا بعض الدورات في منتصفها: أدوار حيّة وأخرى فائتة، وحالات نسيان ودردشات مُبقاة خارج الذاكرة، ومرورات الصيانة، ونسخ احتياطية واستعادات من نسخ أقدم. بعد كل دورة يتحقق من أن كل دور دردشة صار ذاكرةً ما لم يُنسَ، وأن النسيان لا يترك شيئًا وراءه، وأن قاعدتي البيانات كلتيهما سليمتان، وأن الاستدعاء يجد ما يُسأل عنه. كانت تجربة تمهيدية من 60 دورة (10 قُتلت، 13 استعادة) نظيفة. ونجح تشغيل مدته 72 ساعة في 2026-10-20 (الالتزام de461eae): 7,050 دورة، قُتلت 811 منها، و405 استعادات، و1,008 نسخ احتياطية، و26,389 دورًا، و0 مخالفات.
تراجع استدعاء النصوص السابقة (2026-08)
Section titled “تراجع استدعاء النصوص السابقة (2026-08)”الحقائق التي لا تعيش إلا في نصوص الدردشات السابقة (قائمة أسماء مختصرة، جدول قرارات) خفية عن استدعاء V2 — الاستدعاء يقرأ المعتقدات/الحلقات، لا نص الجلسة الخام. حتى 2026-08-27 كان الوكيل يعوّض بكتابة SQL يدويًا ضد chat_sessions.db (مهمة واحدة أحرقت 21 تكرارًا وبوابة YOLO للإجابة عن “ماذا قررنا سابقًا؟”).
الآن، متى أعاد استدعاء V2 لا شيء لاستعلام، يبحث المشرف تلقائيًا في جلسات دردشة الويب السابقة (العنوان + نص الرسالة؛ المصطلحات الأطول/الأكثر تخصيصًا تفوز، ومطابقات العنوان تتصدر، والعربية مدعومة) ويحقن أفضل النتائج كتلة غير موثوقة مسيّجة بالتوجيه (مصدر chat_history) بجوار كتلة الذاكرة — صفر تكرارات إضافية، ولا أدوات خطر، ولا أذونات. أدوار الاستدعاء المكبوت تتخطاه أيضًا.
- قراءة فقط، عبر
memory/chat_history.py: مخزن الدردشة الذي تكتبه واجهة الويب (Postgreskazma_chat_sessionsأو SQLitechat_sessions.db) زائد سلسلة حفظه، المستأجر الحالي فقط، وكل جلسة مرتبة في SQL. حتى 2026-09-26 كان يفتح ملف SQLite فقط — بقايا من يوليو على تثبيت Postgres — ويرتب أحدث 400 مطابقة لأي مستأجر. المخزن المفقود لا-عملية صامتة. - مفتاح الإيقاف:
KAZMA_TRANSCRIPT_RECALL=0في البيئة أو ConfigStore memory.transcript_fallback=false(قراءة حية، مفعّل افتراضيًا). - الوحدة:
kazma_core/memory/transcript_recall.py؛ موصولة فيgraph_supervisor.py(سطر السجل:[Supervisor] transcript fallback: N past-session hit(s)). - نصيحة للحقائق الدائمة: بعد أن يجد الوكيل مثل هذه البيانات، قل له تذكّرها دائمًا — التخزين الصريح من المستخدم يصير معتقدًا عالي الثقة يُبرزه الاستدعاء أولًا، بلا حاجة إلى أي تراجع.
ذات الصلة
Section titled “ذات الصلة”- مسار الذاكرة الأمثل — قائمة فحص المشغّل
- البنية · مكتبة المعرفة · طبقة الالتزام
- خريطة التشخيص
- الخطة:
docs/plans/MEMORY_REMAINING.md - التدقيق:
docs/audits/AUDIT_MEMORY_SYSTEM_2026-08-24.md(M-01..M-17 مغلقة) - الثوابت:
AGENTS.md§15 (المجدوِلات)، §20 (الثقة بالمصدر)، §29 (التشذيب / الانزياح / السبورة)

