M-072 — Real self-heal for replay_invalid (built + tested 2026-07-07)
- المشكلة: كتلة thinking بتوقيع فاسد (دور مقطوع، M-048) تسمّم الجلسة → Anthropic 400 → كل دور تالٍ يسقط. الحل الوحيد كان /new يدوياً. الحرّاس القديمة كانت تنبّه لا تشفي، وبعضها كذب («تعافت تلقائياً»).
- الحل (طبقتان + إثبات):
1.
replay_selfheal_daemon.sh (جديد): lock-safe — ينتظر تحرّر قفل الجلسة (لا يلمس الحيّة، M-069)، يجرّد السمّ عبر replay_invalid_repair.py --mode tail-keep (atomic+backup+JSON-valid، نص/أدوار محفوظة 1:1 — مُختبَر synthetic)، ثم auto-regen عبر
openclaw cron add --at +8s --system-event --session main --delete-after-run (يستخرج آخر رسالة مستخدم حقيقية، يتجاهل heartbeat) → إجابة تلقائية بلا /new.
2.
replay_selfheal_loop.sh (جديد): حلقة bash دائمة كل 20s، single-instance عبر flock (⚠️ لا تحذف lockfile أبداً — حذفه يخلق inode جديد ويكسر flock)، يحرسها daemons_keepalive (respawn إن ماتت). صفر LLM (رفضنا cron كل دقيقة لأنه يحرق 1440 LLM/يوم).
- إصلاح كذب الحرّاس: M-064 + M-068 advisory — لا ادعاء تعافٍ إلا بعد تحقّق فعلي.
- حارس: verify_agreements §63 يحمي الطبقة.
- الوقاية الجذرية = انضباطي: دور واحد = أدوات قليلة، لا تكديس side-effect (M-048). thinking يبقى ON دائماً (خط أحمر — الدقة لا تُمَس).
- ملاحظة صدق: أُثبتت الآلية synthetic + الأمان live-defer؛ الإثبات الإنتاجي النهائي عند أول replay_invalid حقيقي بعد النشر.
🎓 EduLab — المختبر التعليمي الهجومي (بُني 2026-07-07)
- الموقع:
/docker/edulab (host) + skills/edulab/ (workspace). رفيق لـ /docker/seclab الدفاعي.
- edulab-t3mp3st: T3MP3ST معزول، العقل=venice-uncensored (تحرّري، صفر Anthropic)، non-root uid10001، loopback، no-new-privileges. entrypoint يثبّت venice كل إقلاع. مُختبَر: test=Connection successful.
- edulab-redtools: garak 0.15.1 (230 probes) + Slither 0.11.5 + promptfoo. CPU-only torch (لا CUDA — بعد إلغاء بناء ضخم استهلك القرص). 2.28GB content/8.5GB disk. non-root uid10002.
- edulab_coordinator.py + GOVERNANCE.md + README.md: منسّق متوازٍ (T3MP3ST + liberation_router --code-max) + حَكَم + بوابة
--authorized (RoE) + سجل تدقيق logs/edulab_runs.jsonl.
- حدود صادقة: صيد T3MP3ST الآلي الكامل (cli-hunt) يحتاج backend ترميز (codex/claude) غير مثبّت عمداً؛ المتاح=War Room تفاعلي + MCP security_recon + العقل. PyRIT/Mythril/Echidna on-demand (حماية القرص). promptfoo يحتاج node 20.20+.
- درس: garak/pyrit يجرّان torch+CUDA (عدة GB) — استخدم
--index-url .../whl/cpu دائماً على VPS بلا GPU. راقب القرص أثناء بناء ML.
🎓 EduLab — إضافة backend الصيد التحرّري (2026-07-08، قرار د. وائل توصية أ)
- الحل الأمثل (لا bloat، لا حذف مفيد): أُضيف
OPENROUTER_API_KEY لـ env_file الحاوية فقط (متغيّر بيئة، صفر install). wild-hunt يعمل على GLM-5.2 مفتوح/تحرّري.
- مُثبَت end-to-end حيّاً: wild-hunt استنسخ we45/Vulnerable-Flask-App (19 ملف) → صيد على GLM-5.2 → «clean · 0 findings · 8s» + بوابة anti-fabrication فعّالة. + GLM-5.2 connectivity من الحاوية = OK.
- المنسّق حُدّث:
edulab_coordinator.py --repo owner/name يشغّل الصيد الآلي التحرّري (HUNT_MODEL=z-ai/glm-5.2، max-iters 26). مُختبَر عبر الواجهة الموحّدة.
- العقول: War Room=venice-uncensored · wild-hunt=GLM-5.2 · cve-zero-hunt=venice. صفر Anthropic في كل المسارات.
- درس T3MP3ST: wild-hunt يستخدم LLMBackbone provider=openrouter (hardcoded) → مرّر --model z-ai/glm-5.2 (مفتوح). cve-zero-hunt يدعم venice/ مباشرة لكن يحتاج توليد corpus. cli-swarm وحده يحتاج codex CLI (لم يُثبّت).
docker exec -e VAR بلا قيمة يطمس قيمة env_file — لا تمرّرها.
- لم يُلغَ أي شيء: seclab الدفاعي سليم، كل الخدمات حيّة، صفر حذف لأي مفيد.