🔧 كرونات + فجوات النشرة (2026-08-26) — تقدّم + سلبية مرصودة بالاختبار الحيّ
أُنجز وأُثبت حيّاً (قفل المصداقية):- daemons keepalive: مهلة الكرون 30→120s (السكربت 31-38s). force→ok, consecutiveErrors 30→0 ✅
- SOTA Benchmark: مُنع update_goal/create_goal صراحةً في payload (كان يسقطه). force→ok 84s delivered ✅
- مجلس النخبة: اختبار حيّ route_call لكل عضو → 12/12 OK (Grok4.6/Opus4.8/Gemini3.1Pro/GPT5.6Sol/Fable5/Opus5/Qwen3.8/KimiK3-أبطأ30s/DeepSeekV4Pro/MiniMaxM3/GLM5.3/Gemini3.7) ✅
- فجوة الصور: اختبار حيّ Reve مقابل Qwen-Image-3 بنفس البرومبت → Qwen الحالي أفضل بكل معيار (نص مقروء؛ Reve مشوّه). MAI-Image-2.6 غير موصول (fal/Replicate/OpenRouter=404). القرار: لا يُضافان (لا نضيف أضعف مما نملك؛ رانك الصور يصمد). ✅
- فجوة الموسيقى: بُني wrapper موحّد أصيل
skills/music-generation/music_gen.py+ SKILL.md (Suno V5_5→Lyria3→MiniMax2.6→ElevenLabs، never-stop). اختبار حيّ: selftest 4/4 + Lyria أنتج MP3 176s/192kbps + Ultimate Case (Suno بمفتاح خاطئ→Lyria ينجح تلقائياً). يسدّ FEAT-20260522-001 ✅
- الجذر: مجلس النخبة داخل foresight.py يعطي 8/12 أعضاء يردّون لكن conclusion=[FAILED] deadline timeout → يسقط لـ single-model fallback (Gemini 3.1 Pro) بدل الخلاصة الكاملة.
- المشكلة في الـ Judge (opus-4-8): يركّب ~60K حرف (12 رد) → يتجاوز الميزانية. الأدوار البطيئة (Kimi 30s + retries) تستهلك الوقت فيبدأ الـ Judge متأخراً.
- جرّبتُ (لم يكفِ): deadline 300→480→600s · Judge floor 70→150s · حصة الأدوار 55%→45% · كرون 720→1080s. الاختبار الحيّ الأخير: 568s، 8/12، ما زال FAILED.
- الحل الجذري المتبقّي (يحتاج قراراً): تقليل حمل الـ Judge — إما (أ) تقليل أعضاء foresight من 12 إلى 5-6 (يكفي للبريف الصباحي، أسرع)، أو (ب) اختصار ردود الأعضاء قبل الـ Judge (تلخيص وسيط)، أو (ج) رفع HTTP_TIMEOUT للـ Judge خصيصاً + deadline 900s. ملاحظة: mode="quick" أصلاً — الحمل من عدد الأعضاء (12) لا العمق.
- ملفات: council.py (p1_deadline 0.45 سطر 494، judge floor 150 سطر 598) · foresight.py (deadline=600 سطر 150) · cache صُفّر (backup .bak.).
✅ الاعتماد النهائي — مجلس النخبة + البريف الصباحي (2026-08-26، أمر د. وائل الصريح)
القرار المعتمد (مطبّق في الكود + مُختبر حيّاً):- البريف الصباحي (foresight) = الـ6 نخبة النخبة: Opus 5 · Opus 4.8 · Gemini 3.1 Pro · GPT-5.6 Sol · Grok 4.6 · DeepSeek V4 Pro (deadline=420، عبر
run_council(..., roles_subset=MORNING_TOP6)). - المجلس الكامل 12 (مجلس النخبة + غرفة الحرب + كل شيء آخر): الستة أعلاه + Fable 5 · Qwen 3.8 Max · Kimi K3 · MiniMax M3 · GLM-5.3 · Gemini 3.7. deadline=600، roles_subset=None (كل الـ12).
الإصلاح البنيوي (council.py + foresight.py — سدّ [FAILED] deadline timeout):
HTTP_TIMEOUT90→180s (يسع Qwen 146s + Kimi 82s فلا يُقطعان).- Judge floor 70→150s (opus-4-8 يركّب حتى 12 رداً ~60K حرف).
- حصة الأدوار (p1_deadline) 55%→45% (وقت أكبر للـ Judge).
run_council(roles_subset=...)باراميتر اختياري جديد (افتراضي=كل الـ12؛ podcast/war_room سليمان).- foresight cron deadline داخلي 420s + مهلة كرون 600s.
🔧 إصلاح أخير — cache key يميّز roles_subset (2026-08-26)
سلبية مرصودة:_ckey(topic,mode) كان يطابق بالموضوع فقط → البريف الصباحي (6) قد يعيد نتيجة مجلس 12 قديمة (cache collision). الحل: _ckey(topic,mode,roles_subset) يضيف توقيع الأعضاء (|rs=<sorted models>) → نفس الموضوع + subset مختلف = entry مختلف. مُثبت حيّاً: cache_full != cache_6 = True + _run_council_impl subset filter → EXACTLY_6: True (Grok4.6/Opus4.8/Gemini3.1Pro/GPT5.6Sol/Opus5/DeepSeekV4Pro). الملف: council.py سطر 660 (_ckey) + run_council يمرّر roles_subset للـ key.
الحالة النهائية: كل الإصلاحات مطبّقة ومُثبتة. البريف الصباحي وصل د. وائل فعلاً (تقرير 12:28، خلاصة القاضي الكاملة، ليس نموذجاً واحداً). الكرون: ok/delivered/578s.🔐 حماية داخلية بعد الاختراق — جلسة نظيفة (2026-08-26 ~16:15)
حدود د. وائل الصريحة: الباسورد الموحّد + تدوير APIs = له (الآخر، معاً). البورتال/أي functionality حيّ = له. أنا فقط ثغرات+حماية داخلية لا تمسّ حيّاً، كل بند مُختبَر حيّاً (صفر افتراض) قبل «انتهينا».- ✅ البند 1: 18 نسخة env.sh.bak/SECBAK/hermes.env.bak (كانت تحوي مفاتيح مسروقة خام) → مشفّرة AES-256-CBC pbkdf2 بمفتاح .recovery_passphrase. صفر خام متبقٍّ. فكّ مُختبَر متطابق (bash -n صالح). env.sh الحيّ سليم 428سطر/200مفتاح لم يُمَس. تحقّق: لا سكربت/حاوية/host-cron يقرأ .bak (grep فارغ).
- ✅ البند 2: 6 ملفات مفتوحة تحت secrets (.cf_zone_id/.cf_node_tunnel_id/.cf_access_app_uid + npm backup) → chmod 600. صفر ملف مفتوح متبقٍّ. تحقّق مزدوج: لا أحد يقرأها بالاسم أو المسار الكامل (workspace+host).
- أدوات جاهزة لد. وائل: scripts/security/key_locate.sh + key_swap.sh (تدوير ذرّي يشمل hermes.env المنفصل).
- مؤجّل لد. وائل (يمسّ حيّاً/قراره): docker.sock proxy · الباسورد الموحّد · تشفير DR (مكان مفتاح الفك الخارجي) · تدوير كل APIs.
🔐 حماية داخلية — تكملة (2026-08-26 ~16:25) — كل بند مُختبَر حيّاً
- ✅ البند 3: 8 سكربتات تدوير/توكن خام في /tmp → .trash (صفر أسرار خام فيها، لا مستدعٍ حيّ). /tmp نظيف.
- ✅ البند 4: .trash أُمّن (700 مجلد + 600 محتوى). تحقّق حيّ: .trash لا يُرفع في أي backup R2 (restic=/docker+volumes فقط؛ full_recovery_snapshot=مسارات محددة لا .trash).
- ✅ البند 6: install_full.ps1 (سكربت تثبيت لابتوب، ~7 مفاتيح حيّة خام، رأسه يقول "delete after success") → .trash محمي. لا مستدعٍ حيّ. ⚠️ ما زال في تاريخ git (17 حدث) + .git يُرفع R2 → تنظيف git history = لد. وائل (يمسّ .git الحيّ + مفاتيح تُدوّر أصلاً).
- ✅ البند 13: مفاتيح SSH القديمة المُبطَلة (openclaw_host_ed25519.OLD) → .trash. اختبار حيّ: الـOLD مرفوض على السيرفر (Permission denied) + الحيّ يعمل قبل وبعد النقل (STILL_WORKS_AFTER_MOVE). صفر OLD متبقٍّ في .ssh.
- 🟡 لد. وائل (يمسّ حيّاً): 5 ملفات /docker/.env بأذونات 644 (openclaw-4x4t=8 أسرار/traefik/push/9router حيّة + blender متوقّفة) → تقييدها 600 آمن منطقياً (كل الحاويات root) لكن يمسّ الحاويات الحيّة → قراره. + تنظيف git history + مزامنة env.sh (Anthropic القديم فيه).
✅ المسح الختامي الشامل للثغرات الداخلية (2026-08-26 ~16:30) — كلها صفر متبقٍّ
مؤكّد حيّاً (صفر افتراض): أسرار خام في /tmp=0 · ملفات مفتوحة تحت secrets=0 · مفاتيح SSH OLD في .ssh=0 · install_full.ps1 في working tree=0 · نسخ env.sh.bak خام غير مشفّرة=0 · .trash محمي 700/600. البنود المُنجَزة مستقلاً (7): تشفير 18 نسخة + تقييد secrets 600 + تنظيف /tmp (8 سكربتات + oldkey) + تأمين .trash + install_full.ps1 + مفاتيح SSH OLD + المسح الختامي. المتبقّي لد. وائل حصراً (يمسّ حيّاً/مجاله): تدوير APIs · الباسورد الموحّد · /docker/*.env (644→600، حاويات حيّة) · git history cleanup · مزامنة env.sh (Anthropic القديم) · docker.sock proxy · تشفير DR · 2FA · مراجعة منافذ 22000/8891/8910.✅✅ إصلاح الجهاز المحلي (launcher v45) — اكتمل ونجح (2026-08-26 ~21:32)
البوت المحلي @WaelArsenalLocal_bot عاد يعمل (أكّده د. وائل: "yes"). السبب الجذري كان مُركّباً 3 طبقات (تشخيص خطوة-خطوة عبر PowerShell/WSL): 1. تحديث Docker Desktop 29.7.2 + WSL kernel 6.18 → Windows حجز نطاقات منافذ جديدة لـHyper-V/WinNAT (18697-18796 فيه 18780+18789 · 18097-18196 فيه 18101) + منع bind على 0.0.0.0. الحل: نقل المنافذ للفجوة الحرّة 28391-46301 → 38780(النواة)/38789(control UI)/38101-38134(البوابة) + النشر على 127.0.0.1. 2. منطق v36 (fix_reserved_ports) مقلوب (RESERVED_PORT_MIN=32768 يعتبر المنخفض آمناً) → يعيد المنفذ قسراً لـ18780 المحجوز. الحل: استُبدلت الدالة بنسخة تثبّت PORT=38780. 3. مفتاح Anthropic مُبطَل (نحن أوقفناه في حادثة الاختراق 08-24) → البوت يقلع ثم يتوقّف (auth error). الحل: وُضع المفتاح الصالح الجديد في .env المحلي. دروس دائمة:- الملف الحيّ للـ launcher =
/home/wayrk/arsenal/arsenal.sh(لا restore2/... ولا build-vX). النواة+overlay في/home/wayrk/restore2/docker/openclaw-4x4t/. .env.bak.tokenكان يعيد PORT=18780 عبر دالة v30-S6 → لازم إصلاح كل ملفات .env المصدر (env+bak.token+bak.port) لا الحيّ فقط.- PowerShell→WSL→bash يكسر: الرموز
${}/|/"المتداخلة +$var+ حلقات for + مفاتيح طويلة. الأضمن: اقتباس مزدوج خارجي + مفرد داخلي، أو ملف .sh عبر Notepad +sed 's/\r$//' file | bash(لتنظيف \r). أو printf لملف مؤقت للمفاتيح الطويلة. - جدول Windows المحجوز:
netsh interface ipv4 show excludedportrange protocol=tcp— الفجوة الحرّة المؤكّدة 28391-46301. - خطأ ارتكبته: جزمتُ أن المفتاح مُبطَل من مقارنة بصرية بالذاكرة دون اختبار حيّ — د. وائل صحّح، والاختبار الحيّ (curl→TYPE:message) أثبت أنه صالح. الدرس: صفر جزم بلا اختبار حيّ حتى للمفاتيح.
- كل الإصلاحات: صفر PATH · صفر حذف/downgrade · نسخ احتياطية لكل تعديل (.bak.port38780/.bak.loopback/.bak.v36disable/.bak.gwport/.bak.ocport/.bak.antkey).
📋 خطة v46 (جلسة قادمة مخصّصة — بأمر د. وائل)
الهدف: launcher نظيف v46 = v45 كامل (بالأيقونات + تحسينات MiroFish/Hermes) + كل إصلاحات اليوم مدمجة في المنطق → أي نسخة R2 جديدة تعمل restore بلا مشاكل، نسخة طبق الأصل من Live بكل الشروط. يجب أن يحوي (لا يُحذف): 1. الأيقونات الأربع base64 المضمّنة + install_icons: ICO_ARSENAL(Arsenal Launcher) · ICO_RUNALL(Run All) · ICO_STOPALL(Stop All) · ICO_PORTAL(Local Portal) → تُنشأ على Desktop. 2. كل منطق v45 + تحسينات MiroFish/Hermes (ensure_venvs v45). يُدمج (إصلاحات اليوم): LOCAL_SAFE_PORT=38780 + v36-fixed (دالة تثبّت 38780 لا منطق مقلوب) · OC_LOCAL_PORT=38789 + إصلاح مصدر 18789 الخفيّ في توليد nginx.conf للبوابة · LOCAL_GW_BASE=38101 · النشر على 127.0.0.1 (compose + بوابة) · .env+.env.bak.token=38780 · المفتاح الصالح. تحسين مقترح: كشف ذكي للمنافذ المحجوزة حيّاً (يقرأnetsh excludedportrange تلقائياً بدل أرقام صلبة) → يصمد لأي تحديث WSL/Docker مستقبلي. الفجوة الحرّة المؤكّدة: 28391-46301.
البند المتبقّي: arsenal-local-gw يفشل حين ينشر الـ34 منفذ+18789 دفعةً (18789 من مصدر خفيّ في دالة التوليد، ليس السطر 2183 الذي أصلحناه) → يجب تعقّبه في دالة local_gateway_up.
الشروط: تيليجرام منفصل (@WaelArsenalLocal_bot، id 8607605026) · بلا WhatsApp · البورتال local محدّث بمنافذ داخلية · primary opus-5.
طريقة الجلب (بلا بتر): الرفع في تيليجرام يبتر الملف الطويل (3102 سطر). البديل: عبر R2 أو node (لابتوب) أو تقسيم. الملف الحيّ: /home/wayrk/arsenal/arsenal.sh.
الحالة: الجهاز المحلي يعمل الآن بالكامل (البوت يردّ). v46 مؤجّل لجلسة مخصّصة بأمر د. وائل.