الأدلة
يمكن لأي أحد أن يدّعي أن خللًا قد أُصلح. تعرض هذه الصفحة الإصلاح، والاختبار الذي يحرسه، والدليل على أن الاختبار يفشل عندما يعود الخلل.
أُنشئ في 2026-10-03 من tools/prove_regressions.py · ثبت أن 4 من 4 اختبارات انحدار غير فارغة (non-vacuous).
كيف يُنتَج كل إثبات
- شغّل اختبار الانحدار على الكود المُصلَح: يجب أن ينجح.
- عدّل الشيفرة المصدرية لإعادة الخلل الأصلي.
- شغّل الاختبار نفسه مرة أخرى: يجب أن يفشل، بفشل تأكيد (assertion) حقيقي. خطأ التجميع (collection error) لا يُحتسب: فهو يعني أن الاختبار لم يُشغَّل أصلًا.
- أعد الملف، وتحقّق من أن SHA-256 الخاص به يطابق الأصل، ثم أعد التشغيل: يجب أن ينجح مجددًا.
أخبر المساعدُ الزوارَ أن الـ webhook ينقل محادثتهم. وهو لا ينقل منها شيئًا.
الإيداع e027e6b · محمي بواسطة apps/gateway/tests/test_webhook_content_claim.py
تحمل حمولات Webhook عمدًا شكل الدورة فقط، أي اسم الحدث والطابع الزمني وعدد الخطوات والأرصدة، ولا تحمل محتواها أبدًا. عندما سُئل المساعد عمّا إذا كانت الـ webhooks تتضمن المحادثة، أجاب: 'نعم، كل حمولة webhook تتضمن سجل المحادثة الكامل لتلك الدورة.' وهذا هو النقيض التام للضمان الذي تُختبر قائمة السماح على أساسه. بلغ القياس 2 اختلاق في 6 تشغيلات قبل الإصلاح.
| شيفرة مُصلَحة، تشغيلات اختبار |
ناجح |
21 passed in 1.15s |
| أُعيد الخلل، والاختبار نفسه |
رُصِد |
8 failed, 13 passed in 1.20s |
| استُعيد الملف، والاختبار يعمل |
ناجح |
sha256 a8d4cb0b10787eff… |
الاختبار ليس شكليًا: يفشل عندما يعود الخلل.
طلبنا من المالكين النقر على بطاقة في لوحة التحكم غير موجودة.
الإيداع b4a203a · محمي بواسطة apps/gateway/tests/test_card_names.py
قاعدة المعرفة والوثائق وإحدى بطاقات البداية كلها أرشدت المالكين إلى البحث عن بطاقة تسمى 'Send turns to a webhook'. البطاقة الفعلية في لوحة التحكم عنوانها 'Send events to your own system'. اختُرع الاسم عند كتابة قسم المعرفة وانتشر إلى ثلاثة مواضع دون تحقق. القياس: 2 من 2 من إجابات الإعداد ذكرت عنصر تحكم لم يوجد قط.
| شيفرة مُصلَحة، تشغيلات اختبار |
ناجح |
5 passed in 1.12s |
| أُعيد الخلل، والاختبار نفسه |
رُصِد |
3 failed, 2 passed in 1.23s |
| استُعيد الملف، والاختبار يعمل |
ناجح |
sha256 f6348e1a5bbae209… |
الاختبار ليس شكليًا: يفشل عندما يعود الخلل.
ظهرت رسالة الترحيب في الوضع الداكن بنسبة تباين 1.73:1، أي غير مرئية فعليًا، ولم يكن بوسع آلية الحماية أن تكتشف ذلك.
الإيداع ca47f41 · محميّ بواسطة apps/studio/test/themeContrast.test.mjs
اكتُشف من لقطة شاشة التُقطت على iPhone حقيقي، لا من أي اختبار. كانت تحية الترحيب مثبّتة على اللون #3a3a3c، الذي يبلغ تباينه 1.73:1 مقابل لوحة الوضع الداكن، أي أقل بكثير من الحد الأدنى 4.5:1 وبالكاد مقروء. رآها كل زائر لأول مرة في الوضع الداكن. يوجّه الإصلاح اللون عبر متغير السمة --pw-mist ليتبع اللوحة؛ ويحسب الحارس الآن نسبة التباين الفعلية لكل زوج مرتبط بالسمة بدلًا من الاكتفاء بأن لونًا ما قد عُيّن.
| شيفرة مُصلَحة، تشغيلات اختبار |
ناجح |
pass 5, fail 0 |
| أُعيد الخلل، والاختبار نفسه |
رُصِد |
pass 3, fail 2 |
| استُعيد الملف، والاختبار يعمل |
ناجح |
sha256 54f8802b444b6194… |
الاختبار ليس شكليًا: يفشل عندما يعود الخلل.
دورة فاشلة تركت الزائر ينتظر إلى الأبد على بثّ ميت.
الإيداع 4bcc691 · محميّ بواسطة apps/studio/test/streamError.test.mjs
عندما فشل استدعاء النموذج، أرسل الخادم إطار خطأ بشكل صحيح، لكن الأداة كتبت الرسالة في عنصر كان فرع تتبّع الحوكمة قد أخفاه مسبقًا، ولم تطوِ التتبّع أبدًا. رأى الزائر عبارة 'Reading your message' تنبض بلا نهاية في دورة كانت قد فشلت بالفعل: لا خطأ، ولا تعافٍ، ولا سبيل لمعرفة ذلك. نُسب نص الخطأ بشكل صحيح ولم يُعرض في أي مكان. اكتُشف ذلك أثناء انقطاع حقيقي عندما نفد رصيد حساب الـ API.
| شيفرة مُصلَحة، تشغيلات اختبار |
ناجح |
pass 4, fail 0 |
| أُعيد الخلل، والاختبار نفسه |
رُصِد |
pass 2, fail 2 |
| استُعيد الملف، والاختبار يعمل |
ناجح |
sha256 54f8802b444b6194… |
الاختبار ليس شكليًا: يفشل عندما يعود الخلل.
السجل التشغيلي
ما الموجود خلف المنصة، وما الذي لم يُختبر. فقط ما يمكن أن يُظهره سكربت أو سجل.
- النسخ الاحتياطية: ليليًا عند 03:17 UTC، pg_dump --clean --if-exists، وgzip؛ تُدفع إلى مستودع git بعيد خاص بعد كل تشغيل؛ الأحدث
20261003T031701Z؛ يُحتفظ بـ 29 نسخة.
- تمرين الاستعادة 2026-10-03: استُعيدت النسخة
20261003T031701Z في 2 ث داخل حاوية مؤقتة pgvector/pgvector:pg16 على المضيف نفسه: 34 مستأجرًا، و270 صفًا من بيانات المعرفة، و47 جدولًا. النسخة من 03:17 UTC؛ وعند 13:26 UTC أزالت عملية التنظيف المجدولة للعروض التجريبية مستأجرًا تجريبيًا واحدًا مهجورًا أقدم من 30 يومًا (سجل البوابة)، لذا تُظهر الاستعادة مستأجرًا واحدًا أكثر مما كان قائمًا وقت التمرين.
- التراجع: الموقع: tools/deploy-site.sh --rollback (قلب ثانٍ للرابط الرمزي إلى الإصدار السابق)؛ Studio: tools/deploy-studio.sh --rollback (الصورة السابقة، مع فحص السلامة).
- أهداف الاستعادة: لا شيء موعود به. النسخة الليلية تحدّ فقدان البيانات بيوم واحد؛ لا يوجد وقت معلن للاستعادة.
- لم يُختبر: الحمل بما يتجاوز نسخة واحدة؛ التحويل عند الفشل بين مناطق متعددة؛ الاستعادة على مضيف مختلف.
من docs/ops-record.json، الذي يكتبه تمرين الاستعادة (docs/runbooks/db-backup.md).
اسأل عن أي عيب هنا وكيف يثبت اختباره الإصلاح.
- أرني خطأً برمجيًا حقيقيًا وجده وأصلحه
- كيف تعرف أن الاختبار قادر على الفشل؟
- ما الذي لا يزال مفتوحًا؟