لماذا يُعايَرُ الحارسُ أصلًا
١ · الصورةُ المتكرّرة
سجلُّ دروسِ هذا المستودعِ يعيدُ عطبًا واحدًا بأشكالٍ كثيرة:
أخضرُ لأنّه لا يستطيعُ أن يحمرّ.
اختبارٌ يجمعُ صفرَ حالاتٍ فيمرّ. حارسٌ يقرأُ نصفَ الهجاءاتِ التي يزعمُ حراستَها. عَلَمٌ يُغلِقُ فحصًا كاملًا وهو مُطفَأٌ منذ سنتَين. حارسٌ في CMake مربوطٌ بهدفٍ مُحذوفٍ فيسقطُ صامتًا. في كلِّ هذه الحالاتِ لوحةُ النتائجِ خضراءُ تمامًا — والخضرةُ لا تعني شيئًا، لأنّ الشرطَ الذي تُعبِّرُ عنه ليس له عالَمٌ ممكنٌ يكونُ فيه كاذبًا.
وهذه الصورةُ أخطرُ من العطبِ الذي يُخفيه: العطبُ يُكتشَفُ يومًا، أمّا أداةُ القياسِ المعطوبةُ فتُخفي أعطابًا لا تُحصى وتُقنِعُ قارئَها بأنّه لا شيءَ ليُكتشَف.
٢ · العلاج: يُحقَنُ العطبُ ويُثبَتُ الاحمرار
المِحقنة (calibrate_*.py) برنامجٌ يفعلُ هذا لكلِّ مجسٍّ:
- يقرأُ بايتاتِ ملفٍّ حقيقيٍّ في الشجرةِ ويُسجّلُ بصمتَه.
- يكتبُ فيه عطبًا معلومًا (مرساةً تُسمّي قاعدةً مخترَعة، أوپكودًا يُحذَف، مفتاحًا يُعادُ تسميتُه…).
- يُشغِّلُ الحارسَ ويتحقّقُ من رمزِ الخروجِ ومن نصٍّ بعينِه في مخرَجِه — لا من الاحمرارِ وحدَه، بل من أن يحمرَّ للسببِ الصحيح.
- يُعيدُ البايتاتِ ويتحقّقُ من الاستعادةِ بـ
sha256.
وأثمنُ ما في هذا: أنّ المجسَّ يقولُ لِمَ حمِرَ. مِحقنةٌ تتحقّقُ من returncode != 0 وحدَه تُصادِقُ على حارسٍ يحمرُّ من انهيارٍ داخليّ.
٣ · السَّبراتُ السالبةُ نصفُ العيار
مِحقنةٌ كلُّ مجسّاتِها «يجبُ أن يحمرّ» تُصادِقُ على حارسٍ يحمرُّ دائمًا. ولذلك تحملُ السجلّاتُ أدوارًا ثلاثة:
| الدور | المعنى |
|---|---|
يجبُ أن يحمرّ | عطبٌ حقيقيٌّ حُقِن، والحارسُ التقطَه بنصِّه |
انحدار — يجبُ أن يبقى أخضر | تغييرٌ مشروعٌ حُقِن، والحارسُ لم يحمرّ |
عطبُ آلة | مسبارٌ أُعميَ، والحارسُ يخرجُ بالرمز ٢ لا ١ |
مثالانِ حيّانِ من check_anchor_integrity.yaml:
- name: "⑦ الأرشيفُ متروكٌ — مرساةٌ يتيمةٌ فيه لا تُحمِّر"
target: tests/_archive/zz_anchor_probe.ص
expect_exit: 0
role: "انحدار — يجبُ أن يبقى أخضر"
- name: "⑧ نصٌّ في الجسمِ ليس مرساةً — لا شهادةَ بالذِّكر"
expect_exit: 0
role: "انحدار — يجبُ أن يبقى أخضر"والتمييزُ بين الرمزَينِ ١ و٢ ليس زخرفًا: ١ حكمٌ صدرَ عن قياسٍ تمّ، و٢ أداةٌ لم تقِسْ شيئًا. وخلطُهما يجعلُ أداةً عمياءَ تُقرَأُ «وجدَت عطبًا». وx.py يفصلُهما بتشخيصَينِ مختلفَين.
٤ · العيارُ نفسُه يُحرَس
سجلُّ عيارٍ يبلى في أوّلِ تعديلٍ على الحارسِ الذي يشهدُ له. ولذلك ثمّةَ حارسٌ فوقيّ: check_calibration_fresh.py، يقيسُ أربعةَ لامتغيّرات:
① انجرافُ البصمة
السجلُّ يحملُ guard_sha256 وharness_sha256. تغيَّرَ أحدُهما ⇒ أحمر. والبصمةُ تُقاسُ بعدَ تطبيعِ نهاياتِ الأسطر إلى ما يُودِعُه git، وإلّا حمِرَ كلُّ استنساخٍ نظيفٍ بحمرةٍ لا علاقةَ لها بالمحتوى. والاتّفاقُ بين الطرفَينِ على التطبيعِ يُقاسُ بمجسٍّ (⑩) لا يُوعَدُ به في تعليق.
② سجلٌّ ناقصُ النتيجة — وبابُ 0/0
probes_passed != probes_total ⇒ أحمر. وهذا وحدَه لا يكفي: تُقلَّصُ المِحقنةُ إلى مجسٍّ واحدٍ فيصيرُ 1/1 «كاملًا»، أو يُكتَبُ سجلٌّ باليدِ ببصمةٍ صحيحةٍ وresult: 0/0 فيُقرأُ الحارسُ «مُعايَرًا» ولم يُنفَّذْ مجسٌّ واحد. بُرهنَ بالحقنِ في مراجعةٍ خصميّة، فأُضيفت أرضيّةُ عمقٍ (CEILING_MIN_PROBES = 10) على الطرفَين. كاملٌ من واحدٍ ليس كاملًا.
③ سجلٌّ يتيمٌ أو مفكوكُ الرباط
سجلٌّ يشيرُ إلى حارسٍ أو مِحقنةٍ غيرِ موجودة ⇒ أحمر — شاهدةٌ لميّتٍ تُوهِمُ بتغطية. وأدقُّ منه: سجلٌّ يُنسَخُ لحارسٍ جديدٍ وتُحدَّثُ بصمتُه وتُنسى مِحقنتُه، فيصيرُ «مُعايَرًا» بمِحقنةِ غيرِه. فالحارسُ يطلبُ أن تذكرَ المِحقنةُ اسمَ حارسِها في بايتاتِها. وهويّةُ الحارسِ مسارُه لا اسمُه القاعديّ: بالاسمِ كان تصادمُ أسماءٍ بين مجلَّدَينِ يُزوِّرُ عيارًا.
④ سقفٌ نازلٌ للحرّاسِ بلا عيار
عددُ الحرّاسِ غيرِ المُعايَرينَ له سقفٌ مُودَعٌ ينزلُ ولا يُرفَع. ولم يُجعَلْ صفرًا لأنّ الصفرَ اليومَ كذبٌ يُسكَّنُ ولا يُصلَح: العددُ يُسمّى ثمّ ينزلُ بالعمل.
٥ · المقيسُ اليوم
python scripts/codegen/check_calibration_fresh.pyحارس «عيارٌ قديمٌ لحارسٍ جديدٍ ليس عيارًا»:
حرّاسُ الشجرة: 30 · سجلّاتُ عيار: 5
✓ scripts/codegen/check_anchor_integrity.py — 17/17 · عُويِرَ في 2026-09-06
✓ scripts/codegen/check_builtin_engine_coverage.py — 10/10 · عُويِرَ في 2026-09-06
✓ scripts/codegen/check_seed_contract.py — 14/14 · عُويِرَ في 2026-09-06
✓ scripts/codegen/check_seed_tag_readers.py — 12/12 · عُويِرَ في 2026-09-06
✓ scripts/codegen/check_ui_render_completeness.py — 18/18 · عُويِرَ في 2026-09-06
بلا سجلِّ عيار: 25 (السقف 26 — نازلٌ لا يُرفَع)
✓ كلُّ سجلٍّ يطابقُ بصمتَي حارسِه ومِحقنتِه ونتيجتُه كاملة.خمسةُ سجلّاتٍ تحملُ ٧١ مجسًّا، منها ١٣ سبرًا سالبًا يجبُ أن يبقى أخضرَ و٥ مجسّاتِ «عطبِ آلة». يُعادُ العدُّ بأمر:
python - <<'EOF'
import yaml, glob, collections
tot = collections.Counter()
for f in sorted(glob.glob("scripts/codegen/calibration/*.yaml")):
d = yaml.safe_load(open(f, encoding="utf-8"))
tot += collections.Counter(p["role"] for p in d["probes"])
print(f.split("/")[-1], d["result"])
print(dict(tot))
EOFوفوقَ ذلك مجموعةُ اختباراتٍ فوقيّةٍ تحاكمُ المِحقناتِ نفسَها:
python -m pytest scripts/codegen/test_calibration_harness.py -q
# 90 passedمن بنودِها: كلُّ مجسٍّ يُصرِّحُ بأثرِه؛ ومجسٌّ أخضرُ لا يزعمُ أنّ البوّابةَ تلتقطُه؛ وشجرةٌ نظيفةٌ لا تُرفَض؛ وأرضيّةُ العمقِ متّفقٌ عليها في الطرفَين.
٦ · حدودٌ مقيسة
- خمسةٌ من ثلاثين حارسًا مُعايَرون. الخمسةُ والعشرونَ الباقونَ دَينٌ مُعلَنٌ بسقفٍ نازل، لا تغطيةٌ مُدَّعاة.
- الحارسُ الفوقيُّ لا يُعايِرُ نفسَه. يستثني ملفَّه من العدِّ عمدًا، فهو الوحيدُ الذي لا يُثبِتُ النظامُ احمرارَه — وعيارُه من خارجِه بحقنٍ يدويٍّ مُدوَّنٍ في مراجعة.
- العيارُ لقطةُ لحظةٍ لا خاصّيّةٌ دائمة. يشهدُ أنّ هذا الحارسِ بهذه البصمةِ حمِرَ على هذه العيوب. لا يشهدُ لعيوبٍ لم تُحقَنْ، ولا يزعمُ أنّ المجسّاتِ تستوعبُ فضاءَ الأعطاب.
- الحمرةُ المشروطةُ بالشدّ. مجسٌّ يحقنُ بندًا واحدًا لا يعضُّ إلّا والعدَّادُ على سقفِه بالضبط، ولذلك ترفضُ المِحقنةُ القياسَ على سقفٍ فيه فجوةٌ وتخرجُ بالرمز ٢ بمخرجٍ مُسمًّى، بدلَ أن تُسجِّلَ عيارًا كاذبًا.