Skip to content

دليل: موجةٌ ثانيةٌ تُغلقُ الانجرافَ — وتربطُ كلَّ دعوًى حاملةٍ بمصدرٍ مبصوم - #9

Merged
SalehKadah merged 2 commits into
mainfrom
chore/lock-refresh-wave2
Sep 1, 2026
Merged

دليل: موجةٌ ثانيةٌ تُغلقُ الانجرافَ — وتربطُ كلَّ دعوًى حاملةٍ بمصدرٍ مبصوم#9
SalehKadah merged 2 commits into
mainfrom
chore/lock-refresh-wave2

Conversation

@SalehKadah

@SalehKadah SalehKadah commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

المحصّلة

الانجراف صفر. الأربعة والستّون مصدرًا كلُّها مبصومةٌ ومطابقةٌ لـdev — لأوّل مرّة.
وcovers_version صار dev@1138f5e1 بدل 1.0.0: الدليلُ يصف حالةَ dev (الخلفيّة
الأصليّة · التعداد بحمولة · لهجة التجميع)، وشيءٌ من ذلك ليس في إصدار آذار.

مبنيٌّ فوق #8 (الحارس الأصرم) — يُدمَج بعده، وحتّى ذلك يعرض إيداعَيه.

ما راجعتُه: ستّة فصول، وعشرون مفتاحًا

خمسةٌ كانت متخلّفةً عمدًا منذ الموجة الأولى، وثمانيةٌ لم تُبصَم قطُّ منذ أُدخلت في
#4/#5 — فصلاها (sadui-layout · crypto-unification) كانا خارج مظلّة الكشف تمامًا.
وسبعةٌ أخرى أضافتها المراجعة (انظر «دعاوى حاملةٌ بلا رابط» أدناه).

ما وجدتُه بالقياس

الأثقل: مخطّطٌ يدّعي بنيةً غير قائمة

ast.md كان يرسم ASTVisitor وتحته ثلاثةُ مستهلكين: المفسّر · SIRBuilder · «منسّق/LSP».
المقيس: SIRBuilder ليس زائرًاclass SIRBuilder : public SIRBuilderContext،
مدخلُه buildModule(ProgramNode*)، وتوزيعُه بـdynamic_cast عبر بُناةٍ فرعيّةٍ friend.
ولا منسّقَ ولا LSP يطبّقه اليوم.

أثرُ الكذبة عمليّ: مَن أضاف عقدةً وتبع الفصلَ ظنّ أنّ دالّة visit تكفي — والمترجمُ
لا يشكو، بل تسقط العقدةُ في dynamic_cast غيرِ مطابقٍ ⇒ سلوكٌ صامت. وُثِّقت الخطوةُ
اليدويّة صراحةً.

عَلَمٌ يوصي به الدليلُ والمحلِّلُ يرفضه

--emit-llvm لا وجود له. cli_flags.yaml صريح: «اسمٌ عربيٌّ قانونيٌّ وحيد، بلا
مرادفات ولا توافقٍ خلفيّ» — والقانونيُّ --أظهر-llvm. كان في llvm.md وفي
pipeline.md (موضعان) — أي أنّ الدليلَ يعلّم قارئَه أمرًا يُردّ عليه. نفسُ العلّة التي
أصابت جدولَ أعلام الذاكرة في الموجة الأولى، في ملفَّين آخرين.

عقدٌ معلَنٌ لا يقيسه أحد

interpreter.md كان يعدّ ClassManager مديرًا من مدراء المفسّر. المقيس: مُفرَدٌ
(singleton) في shared/types
يناديه المحلّلُ والمفسّرُ والمترجمُ جميعًا. وترويسته
تصفه بأنّه «آمنٌ للخيوط المتعدّدة»، بينما class_manager.cpp يقول: getInstance
وresetInstance وحدهما يقفلان
— أمّا registerClass/getClass/hasClass وسائرُ
الخريطة فبلا قفل. فالوصفُ يغطّي إنشاءَ المُفرَد لا محتواه، وقسمُ التزامن كان
يَعِدُ بعزلٍ يشمله وهو خارجه. وُثِّق كحدٍّ مقيسٍ للعزل، لا كحكمٍ بعطبٍ مرصود.

طورٌ كاملٌ غائبٌ عن الفصل

execute() لا يبدأ بالتنفيذ: يمسح البرنامجَ كلَّه أوّلًا — قاعدةُ الدالّة الرئيسيّة ·
فحصُ الأنواع · تحليلُ أمان العدم — ويشمل ذلك الدوالَّ غيرَ المُنادَاة والفروعَ الميّتة.
وأهمُّ ما فيه: enableTypeCheck = false افتراضيًّا، فالمفسّرُ يعمل بفاحصِ الأنواع
مُطفأً. ومَن رأى برنامجًا يجري على sad-run ويسقط على sad-build فقد يظنّها تباعُدَ
محرّكين وهي طورٌ ساكنٌ شغّله أحدُهما دون الآخر. والأطوارُ الثلاثة محجوبةٌ على wasm
وأندرويد — فلا تُقاس دلالةُ اللغة على أيٍّ منهما. أُضيف القسمُ كاملًا بمخطّطه.

أعدادٌ تباعدت عن مصادرها

الفصل كان المقيس
sadui-layout.md ٨٢ مفتاح خاصّيّة ١٠٤ (وتكافؤٌ مع ١٠٤ ثابتٍ في prop_keys.h)
crypto-unification.md «أربعة ملفّات» اختبار ٢٠ (١٥٠–١٦٨؛ أربعةٌ من هذا التوحيد والبقيّةُ من حملة التوسيع)
interpreter.md قائمةُ ملفّاتٍ ناقصة ٣٠ ملفًّا في visitors/
llvm.md «مولّدات لكل بنية» ثمانية مجلّدات مسمّاة
ast.md «أمثلة» بلا عدد ٩٥ دالّة زيارة = إحصاءُ أنواع العقد نفسِه

الاسم القانونيّ بلا شدّة

assertions.yaml يسجّل canonical: شفر، والفصلُ يكتب شفّر في سبعة مواضع. وتعمل
الشدّةُ في الاختبارات لأنّ المعجميّ يتخطّى علامات التشكيل (U+064B–U+065F) داخل
المعرِّفات — فالشدّةُ زينةُ كتابةٍ لا فرقُ اسم، والقانونيُّ للتوثيق والأدوات هو المجرَّد.

أداةٌ متقاعدةٌ ما تزال في الخريطة

sadinfo تقاعدت في تمّوز، وsot/codegen.md وثّق تقاعدَها في الموجة الأولى — وبقيت
حيّةً في أربعةِ فصولٍ أخرى (overview · repo-map · philosophy · status).
واستُبدلت بقائمة tools/ المقيسة. ومثلها sad.exe: هو موزِّعُ الأوامر (Hub) لا
المفسّر — والمفسّرُ sad-run.exe.

زيادةٌ لا تصحيح

grammar-sot.md كان يعدّ ثمانيةَ ملفّاتٍ في language-truth/grammar/ — وفيه ثلاثةٌ
أخرى، أهمُّها lowers_to.yaml:
ربطُ كلّ قاعدةٍ بأوپكودات SIR مُشتقًّا بالتشغيل لا بالتحليل (تُترجَم اختباراتُ
القاعدة بـ--أظهر-sir وتُجمَع أوپكوداتُها). إحصاؤه: ١٠٧ قواعد · ١٠٥ مشتقّة · ٢
not_derived
، والتغطية الأصليّة ١٠٢ x86-64 · ١٠٢ arm64 · ٢٦ riscv64. فهذا هو
المكانُ الذي تُقرأ فيه فجوةُ RISC-V كمًّا لا انطباعًا — وقاعدةٌ لم تُترجَم تُوسَم
صراحةً
بدل أن تسقط من الإحصاء.

البوّابات

البوّابة النتيجة
check_sync.py --validate rc=0٢٢ فصلًا مسجَّلًا
محاكاة --guard-lock (الأصرم من #8) ٢٠ بصمةً تقدّمت، رافقها تعديلُ كلّ فصلٍ يستشهد بها
check_sync.py (انجراف) drift: false — صفرُ تغيّرٍ وصفرُ إضافةٍ وصفرُ حذفٍ وصفرُ تعذّر
mdbook build نظيف
الروابط الداخليّة في HTML المبنيّ ٧٣٢ رابطًا · صفرٌ مكسور

ما أضافته المراجعة المستقلّة (أميليا)

ثمانيةُ أعطابٍ في عملي، أثقلُها ثلاثة:

دعوًى تنقضُ نفسَها. كتبتُ «٩٥ دالّةَ زيارةٍ كلُّها = 0». المقيس: ٩٠ صرفةً
و٥ بجسمٍ فارغ
(visitEnumVariantExpr · visitAsmBlockStmt · و٣ من عقد الواجهة)
— وهنّ بعينهنّ بابُ السلوك الصامت الذي يحرسه = 0 في الباقي، فصار التحذيرُ في متن
الفصل. و«يمسحُ البرنامجَ ثلاثَ مرّات» ناقضت «فحصُ الأنواع مطفأٌ افتراضيًّا» بعدها
بسطور: المسحُ مرّتان افتراضيًّا. وdynamic_cast: كتبتُ ٦٦، والمقيسُ ٦٨٠ سطرًا
في ٣٧ ملفًّا
.

دليلٌ يوصي بعطب. setup.md كان يقول: انسخ الثنائيَّ إلى sadc.exe قبل تشغيل
runner.py. وsadc.exe اسمٌ متقاعدٌ لا يُنتجه أيُّ هدف — نصُّ tests/config.yaml
صريح، والـrunner يقرأ المسارَين منه منذ توحيد الأسماء. أصلحتُ sad.exe في السطر
السابق وتركتُ هذا في السطر التالي. تُعقّب في ١٣ ملفًّا وأُصلح (--target sadc
sad-build)، وبقي في المسرد مشطوبًا بسبب تقاعده لا محذوفًا.

دعاوى حاملةٌ بلا رابط — وهو أخطرُ من أيّ رقم. «صفرُ انجراف» كان يقيس مصادرَ
غيرَ التي تتكلّم عنها الفصول: سبعةُ مصادرَ تحمل الدعاوى المركزيّة لم تكن مسجَّلةً
في البيان أصلًا.

الفصل الدعوى الحاملة المصدر غيرُ المبصوم
ast.md «SIRBuilder ليس زائرًا» sir_builder.h
interpreter.md §③ كلُّه + قفلُ ClassManager interpreter_core.cpp · class_manager.h/.cpp · channel.h
llvm.md «لا مرادف لاتينيّ» + مسارُ الغياب cli_flags.yaml · compiler_driver_backend_llvm_absent.cpp
grammar-sot.md الاشتقاق التجريبيّ gen_grammar_lowers_to.py
crypto-unification.md تخطّي التشكيل lexer_core.cpp
pipeline.md عُدِّل بدعوى عَلَم الفصلُ نفسُه غيرُ مسجَّل

سُجّلت كلُّها وبُصمت. وpipeline.md صار فصلًا مسجَّلًا (٢٢ لا ٢١).

وأصلحت أيضًا: شفّر بقيت في أربعةِ ملفّاتٍ أخرى · قائمةُ tools/ كانت ١٣ من ١٥ ·
AstAnalysisVisitor لا ASTAnalysisVisitor · مصدرُ الرفض عند غياب LLVM ليس
#ifdef بل هدفٌ ثانٍ sad-build-native يُبنى دائمًا (ورمزُه INT_LLVM_PATH_ABSENT) ·
«ثلاثةُ ملفّات» في language-truth/grammar/ والفعليُّ ستّة · freshness.md كان
يصف covers_version بالشكل القديم.

ما يبقى مكشوفًا — في مستودع اللغة لا هنا

  1. .github/skills/sad-lang-dev/references/build-test.md:53 ما يزال يوصي بـ--emit-llvm،
    وهو عَلَمٌ ترفضه cli_flags.yaml. يستحقّ رقعةً في dev.
  2. ملفّان يحملان البادئة 161_ في مجموعة التشفير (argon2id وx25519) — العدُّ ٢٠
    صحيح، لكنّ المدى 154–168 يخفي التصادم.
  3. cli_flags.yaml صار مشتركًا بين ثلاثة فصول، فأيُّ تقدُّمٍ له يلزمه تعديلُها
    الثلاثة (سلوكُ الحارس المقصود من دليل: حارسٌ يقيسُ كلَّ فصلٍ، وفحصٌ يقيسُ مرجعَ القفلِ لا وسمًا سواه #8). البديلُ إن ثقُل: بصمُ نطاقِ عائلةِ الأعلام
    وحدَها بدل الملفّ كاملًا.

Sad Lang Dev and others added 2 commits September 1, 2026 10:12
عطبان في أداةِ المزامنةِ نفسِها — لا في الفصول:

١) `cmd_guard_lock` كان يمرّرُ بصمةً تقدّمت إن عُدِّل **أيُّ** فصلٍ يستشهدُ
   بمصدرها. فمفتاحٌ مشتركٌ (أربعةٌ اليوم: `scripts/codegen` · `_schemas` ·
   `language-truth/grammar` · `ast_visitor.h`) كان يَسِمُ الفصلَ الثانيَ
   طازجًا وما قرأه أحد — أي أنّ الحارسَ يكتمُ ما بُنيَ لِيَكشِفَه.
   صار يشترطُ **كلَّ** الفصول، ويسمّي المتروكَ منها والمشتركَ معه.

٢) `sync-check` الأسبوعيُّ كان يقيسُ الانجرافَ عند «آخرِ وسمِ إصدار»
   بينما القفلُ مبصومٌ عند `dev`. وv1.0.0 وسمُ ٢٠٢٦-٠٣-٠٩، سابقٌ
   لـ`language-truth/` و`scripts/codegen`، فأعلنَ التقريرُ حذفَ ٣٠ مسارًا
   وتعذُّرَ ٤٧ (القضيّة #1) وكلُّها قائمةٌ سليمةٌ على dev — إنذارٌ دائمٌ
   لا يُقرأ، وتحته تعفّنَت أحدَ عشرَ فصلًا بلا كاشف.
   صار الافتراضيُّ مرجعَ القفلِ نفسَه، ويُرفَعُ تحفّظٌ صريحٌ — على المعيار
   وفي جسمِ القضيّة — كلّما اختلفَ المرجعان.

برهانان (خارج المستودع): مفتاحٌ مشتركٌ بفصلٍ واحدٍ يُرَدُّ وبفصلَيه يمرّ ·
لافتةُ المرجعِ تظهرُ عند الاختلافِ وتغيبُ عند التطابق. `--validate` سليم.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… مبصوم

ستّةُ فصولٍ رُوجعت (llvm · interpreter · ast · grammar-sot · crypto-unification ·
sadui-layout)، وعشرون بصمةً تقدّمت أو أُضيفت، فبلغ الانجرافُ **صفرًا**: أربعةٌ
وستّون مصدرًا كلُّها مبصومةٌ ومطابقةٌ لـdev لأوّل مرّة. و`covers_version` صار
`dev@1138f5e1` لا `1.0.0` — الدليلُ يصفُ dev لا إصدارَ آذار.

ما كان يكذبُ في الفصول:
• `SIRBuilder` ليس زائرًا — يرثُ SIRBuilderContext ويوزّعُ بـdynamic_cast،
  والمخطّطُ كان يرسمُه فرعًا من ASTVisitor. أثرُه عمليّ: دالّةُ visit وحدَها
  لا تصلُ المترجم، فتسقطُ العقدةُ صامتةً.
• `--emit-llvm` علمٌ لا وجودَ له — القانونيُّ `--أظهر-llvm` (لا مرادفات).
• `ClassManager` مُفرَدٌ عابرٌ للمحرّكين، يقفلُ إنشاءَه لا خريطتَه — فوعدُ
  عزلِ الـgoroutines لا يشملُه.
• `execute` لا يبدأُ بالتنفيذ: طورٌ ساكنٌ يمسحُ البرنامجَ كلَّه، وفاحصُ
  الأنواعِ فيه **مطفأٌ افتراضيًّا**، والثلاثةُ محجوبةٌ على wasm وأندرويد.
• `sadc.exe` اسمٌ متقاعدٌ لا يُنتجه هدف — وsetup.md كان يوصي بنسخِ الثنائيّ
  إليه، أي يوصي بعطب. الهدفُ `sad-build`، والمفسّرُ `sad-run`.
• أعدادٌ تباعدت: ٨٢←١٠٤ مفتاحَ خاصّيّة · «أربعةُ ملفّات»←٢٠ · ٩٥ دالّةَ زيارة
  منها ٥ بجسمٍ فارغ لا صرفة · ثمانيةُ مجلّداتِ بُناة.
• `sadinfo` أداةٌ متقاعدةٌ بقيت في أربعةِ فصول.

والأهمُّ بنيويًّا: سبعةُ مصادرَ تحملُ الدعاوى المركزيّةَ لهذه الفصول لم تكن
مسجَّلةً في البيان أصلًا (sir_builder.h · interpreter_core.cpp · class_manager ·
cli_flags.yaml · …)، فانجرافُها لا يُرصَد. سُجّلت وبُصمت، و`pipeline.md`
سُجّل فصلًا (٢٢ فصلًا لا ٢١).

البوّابات: --validate ٠ · الحارسُ الأصرمُ مرّ بعشرين بصمةً كلٌّ بكلّ فصولها ·
الانجراف صفر · mdbook نظيف · ٧٣٢ رابطًا محلّيًّا بلا كسر.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@SalehKadah
SalehKadah merged commit 1dbfe2a into main Sep 1, 2026
2 checks passed
@SalehKadah
SalehKadah deleted the chore/lock-refresh-wave2 branch September 1, 2026 08:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant