memory/2026-10-08.md — يوم تحقيق code 78 القاتل + علاج جذري (جلسة طويلة مع د. وائل)
🔴🔴🔴 الإنجاز الأكبر: علاج code 78 القاتل عند upgrade OpenClaw (مُثبَت حيّاً في lab على 9.9)
المشكلة: منذ نهاية أغسطس، كل أحد Hostinger يعمل upgrade قسري (71-2 → 9.x) → config schema يتغيّر →exit 78 (EX_CONFIG) → حلقة موت → استعادة snapshot. فقدنا يوماً كل أسبوع.الجرح الحقيقي (مُصطاد حيّاً في lab — الإقلاع الحيّ لا validate):
- config الإنتاج الأصلي (schema 7.x) على 9.7/9.9 →
GATEWAY_EXIT=78+ موت (أُثبت حيّاً). - config المُهاجَر →
GATEWAY_ALIVE+ validate=0 على 9.9 نفسها (ترقية npm فعلية داخل صورة Hostinger).
الجذر المزدوج: (أ) 17 مفتاحاً مخصّصاً مرفوض في schema 9.x. (ب) server.mjs X() (PID 1) يعيد كتابة بعضها كل respawn → حلقة موت.
❌ doctor --fix ليس الحل: يُصلح code 78 لكن يحذف mediaModels/voiceModel (إعداداتنا الإعلامية) = يدمّر الترسانة. الحل = migrate ذكي ينقل لا يحذف (migrate_full2.py، مُثبَت حيّاً).
الحقن الخفي (تحذير د. وائل — كان يقتلني بعد 5-6 دقائق): مصدره = Nexos (server.mjs X() يحقن nexos:default كل إقلاع). مقطوع الجذر: lab-persist (entrypoint كامل) عملت >20 دقيقة RestartCount=0 + nexos=0 + lastTouchedAt=0 → لأن NEXOS_API_KEY محذوف من env (M-127) فلا يُحقن. التطهير يعمل فعلاً.
الملفات الدائمة (جاهز للأحد):
memory/UPGRADE_CODE78_MASTER_PLAN.md(الـ17 إصلاح + الجذر + الخطة 6 نقاط).memory/UPGRADE_VERSION_COMPARISON_7to9.md(مقارنة شاملة 7.1→9.9: مزايا/كسور/مكاسب)./tmp/migrate_full2.py(سكربت الهجرة المُثبَت حيّاً — يُثبَّت في scripts/ بعد النقد).
📌 الترتيب المحدّد من د. وائل (الحالة):
- ✅ نقطة 4 (مقارنة + إثبات 9.9): مكتملة موثّقة.
- ⏸️ نقطة 1+2 (توثيق نهائي + الحل البنيوي migrate في boot-guard، منفصلان، بعد نقد مليون بالمئة): جاهزة للبناء.
- ⏸️ علاج billing/refusal fallback (محاولتان ثم fallback فوري، الجذر errors.js:200 يصنّف billing/auth/refusal "لا fallback"): مُحدّد.
- ⏸️ نقطة 5 (تنظيف lab): أخيراً.
M-157 — كرون بلا fallback = خرق "لا نتوقّف أبداً" (ثُبّت اليوم)
15 كرون من 17 كانت بلا fallback → النشرة التقنية فشلت 4 أيام بـLLM request failed عند عثرة Google لحظية. العلاج: حقن السلسلة الذهبية (44 fb) في كل الكرونات + حارسان host-cron (cron_fallback_enforcer يومي 6:00 يبني fallback لأي كرون ناقصه + cron_llm_failure_resume كل 8 ساعات يُعيد تشغيل الفاشل). القاعدة: أي كرون يُنشأ يحمل fallback؛ تثبيت موديل ≠ إلغاء fallback.🔴 جرح billing/refusal fallback (توقّفي خلال الجلسة — خرق "لا نتوقّف أبداً")
توقّفتُ مرة بـbilling error. الجذر: نواة OpenClaw (errors.js:200isBillingErrorMessage → return false) تصنّف billing/auth/refusal كأخطاء لا تُطلق fallback → الدور يتوقّف بدل الانتقال للموديل التالي. أمر د. وائل: محاولتان (مع انتظار بينهما، قد يكون عابراً) ثم fallback فوري للموديل التالي بلا توقّف أبداً. يُعالَج في نقطة 3.دروس اليوم المتعلّمة
- validate الساكن يكذب — الإقلاع الحيّ وحده يحسم: FINAL_RC=0 (validate) ادّعى النجاح، لكن الإقلاع الحيّ كشف 4 مفاتيح إضافية (voiceModel بنية + discord legacy + systemAgent + ownership). هذا بالضبط لماذا lab السابق فشل (اختبر validate لا الإقلاع الحيّ). القاعدة الدائمة: أي اختبار upgrade = إقلاع حيّ فعلي حتى GATEWAY_ALIVE، لا validate وحده.
- لا إصلاحات جزئية متتابعة مع إعادة نسخ config (داست على إصلاحاتي). الصحيح = سكربت migrate واحد شامل idempotent دفعة واحدة.
- lab يجب أن يحاكي الإنتاج بدقة: صورة Hostinger الكاملة (server.mjs) لا node نظيفة؛ ترقية npm فعلية داخلها = محاكاة upgrade الحقيقي.
- M-153 متكرّر: أوامر exec معقّدة عبر ssh = ملفات .py منفصلة، لا inline. اقتباس أحادي. dash لا bash.
- التزمتُ طوال الجلسة بأداة واحدة صامتة/دور = صفر تكديس صفر انهيار (رغم طول التحقيق).
🤖 موجز آلي (محدّث 23:00 الكويت — يكتبه daily_note_gen.sh)
- حالة النظام: لوحة صحة النظام — 🟡 WARN
- التكلفة التراكمية: $41704.99
- أبرز التغييرات اليوم (git):
- (لا commits جوهرية مسجّلة اليوم بعد)