Skip to content

RFC: تطوير نظام الرسومات والواجهات (SadUI)#1

Merged
SalehKadah merged 3 commits into
mainfrom
rfc/تطوير-نظام-الرسومات
Jun 18, 2026

Hidden character warning

The head ref may contain hidden characters: "rfc/\u062a\u0637\u0648\u064a\u0631-\u0646\u0638\u0627\u0645-\u0627\u0644\u0631\u0633\u0648\u0645\u0627\u062a"
Merged

RFC: تطوير نظام الرسومات والواجهات (SadUI)#1
SalehKadah merged 3 commits into
mainfrom
rfc/تطوير-نظام-الرسومات

Conversation

@SalehKadah

Copy link
Copy Markdown
Contributor

ملخّص المقترح

مقترح لتطوير نظام الواجهات الرسومية SadUI: يوثّق الحالة القائمة (محقَّقة بالتشغيل الفعلي 2026-06-15) ويقترح مساراً مرحلياً لإغلاق الفجوات الحرجة.

الخلاصة: البنية التحتية للرسم ناضجة وحيّة (نافذة 800×600 فعلية، Reconciler، 4 منصّات)، لكنّ النظام محجوب بثلاث فجوات في طبقة الربط لا الرسم:

  • 🔴 P0-1: نوع(زر())=«أي» في المفسّر بدل «كائن» (المترجم صحيح — تباعد مزدوج).
  • 🔴 P0-2: مكوّنات واجهة تُحلَّل وتُسجَّل لكنها غير قابلة للإنشاء (SEM004).
  • 🔴 P0-3: sadc يفشل على أي استورد رسومات (صدّر * المجرّد).

المسار المقترح

  1. المرحلة 1 (P0): تفعيل جسر المفسّر↔UI → أول واجهة حيّة.
  2. المرحلة 2 (P1): توحيد العناصر في language-truth/ + دعم المترجم.
  3. المرحلة 3-4: تعميق أندرويد + النضج (أنيميشن، v2.0).

المصدر

يقتبس الحالة والأحكام من تقرير التحقّق الوظيفي المُشغَّل في نظام الحوكمة _bmad-output/systems/ui_system/ (2026-06-15) — تشغيل فعلي لا قياس ساكن.

رابط النقاش

يُفتح للنقاش العام وفق عملية الـ RFC.

🤖 Generated with Claude Code

SalehKadah and others added 3 commits June 17, 2026 12:27
يوثّق الحالة القائمة (محقَّقة بالتشغيل 2026-06-15) ويقترح مساراً مرحلياً:
- المرحلة 1 (P0): تفعيل جسر المفسّر↔UI (وسم الكائن، إنشاء واجهة، توصيل الحالة)
- المرحلة 2 (P1): توحيد العناصر في YAML + دعم المترجم sadc
- المرحلة 3-4: تعميق المنصّات + النضج (أنيميشن، v2.0)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- جدول الـ15 عنصراً الأولي بالفئة وحالة الحاوية
- الأحداث الـ7 المدعومة
- خريطة الـ44 عنصراً المُهملاً ← بديلها الأولي
- تنبيه نص/نص_عنصر و قائمة_كسولة بلا مصنع (14/15 تُنشأ)
- تصحيح 55→44 وإعادة ترقيم أقسام الشرح المرجعي

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@SalehKadah
SalehKadah merged commit 65e12b7 into main Jun 18, 2026
2 checks passed
@SalehKadah
SalehKadah deleted the rfc/تطوير-نظام-الرسومات branch June 18, 2026 02:02
SalehKadah added a commit to sadlang/s-programming-language that referenced this pull request Jun 18, 2026
- إضافة CODE_PATH_REPORT_2026-06-17.md (مسار الكود + 5 مخططات + كتالوج العناصر 15/44)
- ربط ROADMAP وimplementation_status بـRFC-0001 (sadlang/rfcs#1) وتتبُّع Issue#2
- توثيقي فقط بلا ادعاء إنجاز (GR-01)؛ الجذور السطرية للفجوات موثّقة

Co-authored-by: Sad Lang Dev <admin@sad-lang.dev>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
SalehKadah added a commit to sadlang/s-programming-language that referenced this pull request Jun 20, 2026
…) — تعارضات محلولة (#70)

* @
feat(types): S-TS-P0.5 — توليد SadTypeKind من types.yaml (إنهاء خرق SoT)

- gen_types.py + _lib/context.py + test_gen_types.py: يولّد
  shared/types/generated/sad_type_kind_generated.h من language-truth/types.yaml
- types.yaml: حقل kind لكل نوع (50 قيمة) + مخطّط type.schema.json محدّث
- cmake/codegen.cmake: تفعيل هدف sad_types_codegen ضمن sad_all_codegen
- keywords_generated.cpp: إعادة توليد (نسخة المعجم 5.0)
- العدد الآن من YAML آليًّا — يمنع انحراف 34/46/49 بنيويًّا
- اختبار المولّد: test_gen_types.py EXIT 0

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P0+P1 — اتّساق العدد (50) + نوع «عدم» (Null) متمايز عن «فراغ» (Void)

P0 (اتّساق): تعليق ترويسة sad_type_system.h → «50 قيمة»؛ وثيقتا المعمارية
  (_bmad + docs) متطابقتان وتذكران 50 (لا 34/46).

P1 (Null في المفسّر):
- SadTypeKind::Null في السجلّ (null_ + getNull) + Value::makeNull()
- LITERAL_NULL يبني عدمًا متمايزًا (لا Value() فارغ)
- type_of → «عدم»؛ toString(io) → لاشيء؛ التأكيدات: عدم/لاشيء → NULL
- مقارنة: عدم==عدم=صحيح، عدم==رقم/نص=خطأ (فرع Null في evaluateComparisonOp + operator==)
- عوامل ?.//?? تفحص isNull() لا isVoid()
- الجسر: قسم ValueType case Null→getNull (أقسام DataType سليمة)
- اختبار 049_null_distinct_from_void.ص: مفسّر PASS؛ المترجم @skip_compiler موثّق
  (codegen-null مؤجَّل: نوع(لاشيء)→مجهول، لاشيء==نص يُسقِط — BF-08)
- status/ محدّث بدليل (GR-01)؛ انحراف «عدم» عن نصّ الخطة مبرَّر بـSoT-First

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(semantic): S-TS-P2 — توحيد المدقّق الدلالي على SadTypeKind

- dataTypeToTypePtr(DataType) → sadKindToTypePtr(SadTypeKind): المحور الآن SadTypeKind
- dataTypeArabicName(DataType) → sadKindArabicName(SadTypeKind) (سلاسل مطابقة تمامًا)
- مقارنات decl.returnType تمحورت على SadTypeKind عبر Types::fromDataType
- إزالة كل enum-literals: grep -c "Data::DataType::" = 0 (كان 28)
- غلافا dataType* الرفيعان يبقيان كحدود جسر موثّقة (تُحذف في P2.5a)
- سلوك محايد: P0=5/5، P1=98/108 (+1)، لا تراجع (إخفاقات OOP/errors سابقة وغير متعلقة)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(ast): S-TS-P2.5a دفعة 1/8 — getTypeKind() + ترحيل expressions.cpp

- إضافة ASTNode::getTypeKind()→SadTypeKind (محور موحَّد، بجانب getDataType الموروث)
- ترحيل BinaryExpr/TernaryExpr/IndexExpr::getType() إلى getTypeKind + SadTypeKind
- expressions.cpp: grep DataType = 0
- بناء sad-run أخضر (ast_node.h ترويسة واسعة الاستهلاك — التغيير إضافي آمن)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(ast): S-TS-P2.5a دفعة 2/8 — حقل kind متوازٍ في SimpleTypeNode

- إضافة SimpleTypeNode::kind (SadTypeKind) بجانب dataType الموروث، يُملأ في البُناة عبر fromDataType
- isCompatibleWith يتمحور على kind (سلوك مطابق: kind=fromDataType(dataType))
- dataType + dataTypeToString/stringToDataType تبقى للمستهلكين الـ168 (تُرحَّل لاحقًا، تُحذف دفعة 6/8)
- بناء sad-run أخضر + P0 5/5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(ast): S-TS-P2.5a دفعة 3/8 — ترحيل مقارنات الحقول في declarations.cpp/statements.cpp

- مقارنات .type/.returnType تتمحور على SadTypeKind عبر Types::fromDataType (تُبسَّط في دفعة 6)
- typeToString/dataTypeName المحليّان يبقيان كجسر (يُحذفان دفعة 6)
- ملاحظة: Parameter وVarDeclStmt تحملان أصلًا sadType متوازيًا — القلب = ترحيل المستهلكين
- بناء sad-run أخضر + P0 5/5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(interp): S-TS-P2.5a — ترحيل قرّاء المفسّر (مقارنات النوع) إلى SadTypeKind

- 11 موضع مقارنة (VarDeclStmt.type، CatchClause.exceptionType) تتمحور على
  Types::fromDataType(field) == SadTypeKind::X (AC4: المستهلك يقرأ SadTypeKind)
- صيغة الجسر تُبسَّط إلى مقارنة مباشرة عند قلب الحقول (نهاية P2.5a)
- lambdas العرض المحلّية تبقى (حدود عرض، لا مقارنة)
- بناء sad-run أخضر + P0 5/5 + errors 24/25 (لا تراجع)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(types): S-TS-P2.5a — قلب DataType→SadTypeKind في الـAST/المحلّل (grep=0)

القلب المقترن الكامل دفعةً واحدة (نمط flip + إصلاح موجَّه بالبناء):
- حذف ASTNode::getDataType()؛ القرّاء → getTypeKind() → SadTypeKind
- قلب حقول النوع: SimpleTypeNode.kind، OperatorOverload.returnType،
  TraitMethodInfo.{returnType,paramTypes}، وحقول declarations/statements/expressions
- المحلّل يُنتج SadTypeKind: parseType/mapTokenTypeToKind/stringToKind
- ترحيل كل القرّاء (مفسّر/مترجم/ملكية/LSP/دلالات) إلى مقارنات SadTypeKind
- grep -c DataType في shared/ast+shared/parser = 0 (كان 223) — AC3 محقّق
- بناء sad-run أخضر؛ P0 5/5؛ P1 لا تراجع جديد (نفس FAIL_INTERP السابقين)

اكتشاف (مستقلّ عن هذا العمل): المترجم (sad-build) لا يُنتج تنفيذيًّا —
كسرٌ سابقٌ لهذا القلب (مُعزَّل بـgit stash: الحالة المُلتزَمة تفشل بنفسه)،
مُقنَّع بـsadc.exe بائت. يلزم تحقيق مستقلّ. القلب لا يُدخِل تراجعًا.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
fix(compiler): إصلاح تضارب علم -o بين سياسة الذاكرة وإخراج sadc

البق (سابق، من عمل أعلام الذاكرة E-3، مستقلّ عن نظام الأنواع):
- memory_mode_flag سجّل "-o" اسمًا مختصرًا لمستوى الملكية (--ownership)
- محلّل أعلام الذاكرة يعمل قبل CLI، فيبتلع "-o" وقيمته (مسار الإخراج)
  ويعدّها مستوى ملكية → يختفي -o من CLI → output_file فارغ →
  يُكتب التنفيذيّ باسم المصدر في cwd، فالـrunner يراه «لم يُنتَج»

الإصلاح:
- إزالة معالج flagHandlers_["-o"] للملكية + shortName "o" من تعريفها
- تصحيح نصوص المساعدة (الملكية عبر --ownership/--ملكية فقط)

الأثر: -o يكتب في المسار الصحيح. runner --level P0 = 5/5 مزدوج حقيقي،
P1 = 105/108 (104 تكافؤ مزدوج) — كان المترجم يُنتج 0 تنفيذيّ قبل الإصلاح
(مُقنَّعًا بـsadc.exe بائت 9 مايو طوال الجلسة).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(types): S-TS-P2.5b — حذف دوال DataType من الجسر + حذف data_types.h

إنهاء التخلّص من النظام الأفقر (DataType) بعد ترحيل P2.5a/P2 (grep=0):
- حذف toDataType/fromDataType/sadTypeToDataType/sadTypeFromDataType من type_bridge.{h,cpp}
- حذف عضوَي SadType::toDataType/fromDataType من sad_type_system.{h,cpp}
- إزالة #include "data_types.h" من كل المُضمِّنين (ast headers)
- حذف shared/types/include/data_types.h (صفر مستهلك)
- الإبقاء على ValueType/runtime: toValueType/fromValueType/sadType*ValueType/inferSadType/isValueCompatible
- grep "Data::DataType|DataType::" في كل الكود (عدا الأرشيف) = 0
- بناء sad-run + sadc نظيف؛ P0 5/5 مزدوج

المحور الوحيد الآن SadTypeKind (50، مُولَّد من YAML). «الاستبدال الكامل» تحقّق.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P3 — Result<T,E> نوع جبري مطبَّق (لا enum ميت)

- SadResultType (على نسق SadOptionalType، بنوعين: okType T + errType E)
- SadTypeRegistry::makeResult(ok, err) + تصريح مسبق
- isAssignableTo: تغايُر Result<T,E> (نجاح/خطأ متوافقان) + المساواة البنيوية
- اختبار وحدة في test_type_bridge: البناء، استخراج الأنواع، المساواة، الإسناد (يمرّ)
- تنظيف P2.5b: إزالة قسم اختبار DataType المحذوف من test_type_bridge (كان يكسر البناء)
- test_type_bridge: 28/28 ✓؛ runner P0 = 5/5 مزدوج

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P4 (AC7) — isAssignableTo: عدم (Null) <: T?‎ + T <: T?‎

- فرع Optional في SadType::isAssignableTo يقبل الآن Null (وVoid مؤقتًا) كقابل
  للإسناد إلى T?‎ — تمهيد لأمان null (P9) والاختياري.
- بناء sad-run أخضر؛ test_type_bridge 28/28؛ runner P0 5/5 مزدوج.

ملاحظة نطاق: بقية P4 (سطح `رقم?` end-to-end + Future/Generator runtime) تتطلّب
تمثيل نوع أغنى في حقول الـAST (التي صارت SadTypeKind مسطّحة بعد P2.5a، فلا تحمل
النوع الداخلي لـOptional) + فضّ غموض الثلاثي — جهد معماري أعمق موثّق في status.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P4 (AC5) — سطح النوع الاختياري `رقم?` (مستوى الـkind)

- parseType: غلاف يستهلك لاحقة `?` بعد النوع الأساس → Optional (parseTypeCore = النواة)
  parseType في مواضع الأنواع فقط ⇒ لا غموض مع الثلاثي (AC6 محسوم بالسياق)
- sadKindToTypePtr + SadType::fromValueType: الأنواع المتقدّمة (Optional/Result/Future/
  Generator) → Any بدل الانهيار إلى Void (يمنع تحذيرات إسناد كاذبة لـ`رقم?`)
- اختبار 050_optional_type_suffix.ص: `رقم?`/`نص?` متغير+معامل + ?? — مفسّر PASS
  المترجم @skip_compiler موثّق (يُحلّل `?` لكن codegen يعامل Optional=I64، لا يميّز null)
- runner: قسم الأنواع 16/18 (الفشلان سابقان)؛ P0 5/5 مزدوج؛ test_type_bridge 28/28

ملاحظة: النوع الداخلي الغنيّ لـOptional<T> (عبر sadType) + Future/Generator runtime
+ سطح `؟` العربي — تبقى عملًا لاحقًا موثّقًا في status.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P9 — فرض أمان null في طبقة المفسّر (عدم ⊀ نوع غير اختياري)

اكتشاف الطبقة: الإنفاذ المرئي في المفسّر (statement_executor) لا المدقّق الدلالي
(الأخير لا يُفعَّل في sad-run). null يهرب من isAssignableTo، فالإشارة الموثوقة
value.isNull() (من P1).

- statement_executor: داخل فحص النوع (المحروس بـnode.type != Unknown)، إضافة فرع
  value.isNull() → تحذير أمان null لنوع مُصرَّح غير اختياري + اقتراح `نوع؟`
- الحارس الخارجي يحفظ النمط السائد `متغير = لاشيء` (مُستنتَج) — لا انحدار على الـ48
- Optional/Any/Void/Null مستثناة (لا إنذار كاذب)
- إرجاع تعديلات المدقّق الدلالي (طبقة خطأ) إلى أصلها
- اختبار 051_null_safety_enforcement.ص (مفسّر PASS)؛ P0 5/5 مزدوج؛ P1 106/108 (لا انحدار)

انحراف موثّق: الخطّة وضعت الإنفاذ في المدقّق؛ نُفِّذ في الطبقة الفعّالة (المفسّر).
AC3 (وصول غير آمن) + AC5 (كتالوج) يعتمدان P10/Optional الغنيّ — مؤجَّلان.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(types): نقد وتطوير (أميليا) — النوع الساكن لـliteral null = عدم + تنظيف بقايا DataType

تطوير 1 (ثغرة #4 من مراجعة أميليا): LiteralExpr لـLITERAL_NULL كان يُرجع
getVoid() — صُحِّح إلى getNull()، فالنوع الساكن للحرفية `لاشيء` = عدم (Null)
متمايز عن فراغ، متّسق مع Value::makeNull() وقت التشغيل.

تطوير 2: تنظيف 3 بقايا تعليقات تذكر DataType::UNKNOWN (المفهوم المحذوف) في
sir_builder.h + template_lambda_inference.cpp → الآن grep "DataType" في كامل
الشيفرة (عدا الأرشيف) = 0.

تحقّق: اختبارات null الثلاثة (049/050/051) تمرّ؛ P0 5/5 مزدوج؛ P1 107/108
(الـ3 سابقة) — لا انحدار.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P7 — interning للأنواع المركّبة (مقارنة مؤشر صحيحة)

- SadTypeRegistry::intern(t): cache بنيوي مفتاحه التوقيع البنيوي (arabicName)
  تحت قفل mutex_ (متّسق مع classTypes_)
- makeArray/makeMap/makeTuple/makeOptional/makeResult تمرّ عبر intern
  ⇒ المركّبات المتماثلة بنيويًّا تتشارك المؤشر، فمقارنة `==` المؤشرية صحيحة
- AC3 لا تسرّب: الـcache محدود بعدد التواقيع المتمايزة (مقصود، عمر السجلّ)
- اختبار test_composite_interning (مصفوفة/خريطة/اختياري) — test_type_bridge 47/0
- P0 5/5 مزدوج — لا انحدار

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(types): S-TS-P6 — تدقيق وتصنيف قيم enum (لا قيمة ميتة)

تدقيق grep لكل الـ50 قيمة في SadTypeKind عبر interpreter/compiler/shared/vm/tools:
- النتيجة: كل قيمة مُستهلَكة (الحدّ الأدنى 4 مواضع) — صفر قيمة ميتة، فلا إزالة (AC2)
- جدول تصنيف بالأرقام الفعلية في ARCHITECTURE_TYPE_SYSTEM.md (مُطبَّق/SIMD/بنيوي/واجهات)
- Vector(24) SIMD ليس ميتًا؛ Future/Generator مستهلَكان (runtime جزئي — P4)
- تصحيح: Null مُضاف (P1) لا «غير موجود»؛ النسختان (docs + _bmad) متطابقتان (P0-AC2)
- لا تغيير كود (لا وسم «ميت» مطلوب)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(grammar): مصدر حقيقة قواعد لغة ص + منظومة مطابقة مزدوجة (طبقة gr.program)

(AR) إضافة مصدر الحقيقة المعياري لقواعد اللغة (production rules) المنقوص من
language-truth/. مواصفة + تتبُّع للمُحلِّل اليدوي عبر maps_to، لا توليد للمُحلِّل.

- language-truth/grammar/: _notation.yaml + 00_program.yaml (4 قواعد نموذجية)
- _schemas/grammar_production.schema.json: مخطط قاعدة الإنتاج + conformance.test_budget
- scripts/codegen/check_grammar_conformance.py: فاحص بثلاث بوّابات
  (تغطية الميزانيات + تماسك الوسوم + تنفيذ مزدوج عبر runner.py)
- tests/behavior/rules_matrix/: بنية منطقة/قاعدة/فئة قابلة للتوسّع + 70 اختباراً
  لطبقة gr.program (basic/edge/negative/interaction) — كلها dual_ok 100%
- دمج في config.yaml (أقسام/مستويات) + _meta/_index.yaml
- الأدلة أثر بناء في build/_grammar_conformance.json (غير متتبَّع)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P11 — تسجيل أنواع الرسومات في SoT + إثبات التوسّع (Point/Rect)

- أنواع الرسومات (Color/Widget/Window/Event) مُسجَّلة أصلًا في types.yaml (AC1/2/3 ✓)
- AC4 إثبات التوسّع الحيّ: إضافة Point/Rect من types.yaml فقط → gen_types يولّدهما
  في SadTypeKind (52 قيمة) **دون لمس C++ يدويًّا**؛ بناء sad-run أخضر (default يعالجهما)
- إصلاح gen_types.py: إعادة ضبط ترميز stdout/stderr إلى UTF-8 (كان ✓ ينهار على
  cp1252 ويُفشِل خطوة codegen في cmake بـFATAL) — الآن «✓ 52 نوعًا» exit 0
- تحديث sad_type_system.h (50→52) + تحديث ARCHITECTURE شاملًا ليطابق الواقع
  (تصحيح ادّعاءات قديمة: Null موجود، Result مطبَّق، المدقّق موحَّد، الجسر بلا DataType)
- test_gen_types 6/6؛ P0 5/5 مزدوج — لا انحدار

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
test(types): S-TS-P5 — إحياء suite الأمان النوعي بتأكيدات حقيقية + بوّابات الجودة

- بدل الملف المؤرشف الضعيف (يطبع «pass» بلا تأكيد)، suite حقيقي بتأكيدات نوع():
  052_type_safety_regression.ص — مصفوفة البدائيات (رقم/عشري/نص/منطقي/مصفوفة/خريطة)
  + عدم (P1) + حفظ النوع + مساواة عدم + ترقية القسمة. 10 تأكيدات، مفسّر PASS.
- @skip_compiler موثّق (codegen لا يميّز null — فجوة P1/P4)
- status/05_quality_gates.md: أرقام حقيقية (test_type_bridge 47/47، gen 6/6،
  P0 5/5 مزدوج، P1 107/108) — لا أرقام وهمية (GR-01)
- runner قسم الأنواع: 052 PASS

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P8 — تسجيل ?./?? في SoT + علامة الاستفهام العربية ؟

- AC1: تسجيل op.null_coalesce (??) و op.optional_chain (?.) في operators.yaml
  (SoT-First — توثيق عوامل منفّذة أصلًا عبر كل الطبقات) + فضّ الغموض موثّق
- AC3: ؟ (U+061F) → QUESTION في المعجم (lexer_core scanToken) كمرادف `?`:
  • لاحقة اختياري `رقم؟`  • ثلاثي `أ ؟ ب : ج`  • اندماج `؟؟`  • وصول آمن `؟.`
  + إصلاح ماسح المعرّفات ليكسر على 0x9F (؟) فلا يبتلعها داخل `رقم؟`
- AC4: قاعدة فضّ الغموض (`T؟` موضع نوع مقابل `؟ :` تعبير) موثّقة في operators.yaml
- اختبار 053_arabic_question_operators.ص (مفسّر PASS)؛ @skip_compiler (codegen null)
- لا انحدار: P0 5/5 مزدوج، P1 (الـ3 سابقة)؛ معرّفات عربية + عوامل ASCII سليمة
- AC2 (`!!` مؤكَّد) مؤجَّل: عامل جديد كامل الطبقات + خطأ كتالوج (موثّق)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P4 — ربط نوع Future بالـruntime (نوع(مستقبل())=«مستقبل»)

- future_func (مستقبل()): يَسِم القيمة بـmakeFuture() عبر setSadType
- setSadType: Future/Generator → type_=OBJECT (يُبقي isObject()/فحص الطرق سليمًا
  لأن الـruntime يمثّلهما ككائن)؛ getKind()=Future عبر sadType_ → نوع() صحيح.
  Null → type_=Null (حفظ تمايز P1 بدل الإسقاط إلى Void)
- type_of: حالتا Future→«مستقبل»، Generator→«مولّد»
- اختبار 060_future_type_wiring.ص: نوع=مستقبل + .عيّن/.احصل=42 (مفسّر PASS)؛ @skip_compiler
- لا تراجع (مُثبَت بـgit stash): قسم التزامن 13/8 متطابق قبل/بعد؛ P0 5/5 مزدوج؛ P1 (الـ3 سابقة)
- Generator: يُجمَّع مصفوفةً (تقييم فوري) — وسمه يحتاج مولّدات كسولة (مؤجَّل)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(compiler): S-TS-P4/P8/P9 codegen-null — رفع @skip_compiler عن 4 اختبارات null

يجعل المترجم يطابق المفسّر في دلالة عدم (Null)، فترفع التكافؤ المزدوج:

- القيمة الحرفية «لاشيء» تُوسَم SadTypeKind::Null (لا Integer) مع إبقاء
  التمثيل i64 (الحارس kSadNullSentinel): حالة Null في مفتاح MOVE
  (expression_basic) + mapSIRType(Null)→i64. ⇒ نوع(لاشيء)=«عدم».
- type_of: حالة Null→«عدم» + وعي زمن-التشغيل بالحارس: قيمة i64 قد تحمل
  الحارس حتى لو كان نوعها الساكن «عدد_صحيح» (اختياري رقم؟ = لاشيء) →
  select(val==الحارس ? «عدم» : الاسم الساكن).
- حارس segfault في emitCmpEq: «لاشيء == نص» كان IntToPtr(الحارس)+strcmp
  ⇒ إسقاط؛ الآن يُرجع «خطأ» مباشرة (عدم لا يساوي نصًّا فعليًّا).

رُفِع @skip_compiler عن 049/050/051/053 (صارت تكافؤًا مزدوجًا).
052 يبقى متخطّى: فجوات منفصلة عن null (أسماء نوع() رقم/عدد_صحيح، خريطة، T8).

لا انحدار: التغيير مترجم-فقط (sad-run غير معاد البناء ⇒ كل FAIL_INTERP
غير متأثّر)؛ الاختباران ذوا سطح-null (X04/P09) يُظهران المفسّر=المترجم؛
المجموعة الكاملة 461: 420 نجاح (الإخفاقات سابقة: شبكة/تزامن متقطّعة + 039).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(types): توحيد أسماء نوع() عبر SoT — مصدر واحد للمحرّكين (يرفع 052)

كان كل محرّك يكتب أسماء الأنواع العربية كنصوص يدويّة مكرّرة، فتباينت:
المفسّر «رقم/عشري» مقابل المترجم «عدد_صحيح/عدد_عشري»، والمترجم لا يعرف
«خريطة» (→«مجهول»). الآن المصدر الوحيد هو types.yaml.

- types.yaml: حقل اختياري typeof_ar (اسم نوع() زمن التشغيل عند اختلافه عن
  word). أُضيف لـClass/Struct→«كائن» (word=صنف/بنية كلمتا التعريف) و
  Generator→«مولّد» (word=مولد). + المخطّط يسمح بالحقل.
- gen_types.py: يولّد inline sadTypeKindArabicName(SadTypeKind) من
  typeof_ar||word||«مجهول»، مُرمَّزة \xHH (UTF-8) لسلامة MSVC. + اختبار.
- المفسّر (builtins type_of) والمترجم (emitBuiltinTypeOf) يستدعيان الدالة
  المولَّدة بدل النصوص اليدوية — تطابق مضمون بين المحرّكين.

رُفِع @skip_compiler عن 052 (صار تكافؤًا مزدوجًا: T1..T10 متطابقة).

لا انحدار: الرغرسيون الكامل (461) — الفرق الوحيد عن التشغيل السابق هو
036_exception_concurrency_cross (لا يستخدم نوع()/مجهول، ينجح 5/5 منفردًا —
رفرفة تزامن تحت workers=8). تسمية الأنواع التي كانت «مجهول» لم تكسر أي
اختبار (الـ12 ملفًا التي تذكر «مجهول» تستخدمه كبيانات نصّية لا تأكيد نوع()).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(compiler): S-TS-P4 — وسم نتيجة مستقبل() بـFuture (نوع(مستقبل())=«مستقبل»)

create_future في المترجم كان يَسِم النتيجة Integer ⇒ نوع()=«رقم» بخلاف
المفسّر. الآن يَسِمها SadTypeKind::Future (التمثيل يبقى i64: معرّف المستقبل
عدد، mapSIRType(Future)→i64)، وإرسال الطرق (.عيّن/.احصل) يبقى عبر
className="__future__" مستقلًّا. ⇒ نوع() يطابق المفسّر.

رُفِع @skip_compiler عن 060_future_type_wiring (تكافؤ مزدوج).

لا انحدار: قسم التزامن — مستقبل() (060 + 093) ينجحان؛ الإخفاقات السبعة
كلّها goroutine/channel/mutex/waitgroup/stress (لا علاقة لها بـFuture،
متقطّعة timing تتراوح 7–8 بين التشغيلات).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
fix(grammar): الفاحص يمرّر --interp لا --interpreter إلى runner.py

(AR) runner.py يعرّف الوسم باسم --interp؛ تمرير --interpreter كان يُفشل
التنفيذ المزدوج بـexit=2. يتيح هذا تشغيل الفاحص من worktree على graphic
موجَّهاً لثنائيات مجلد آخر عبر --interpreter/--compiler.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(grammar): استخراج طبقة الجمل 10_statements + 114 اختبار مطابقة (dual_ok 100%)

(AR) قواعد الجمل التنفيذية العشر من parser_statements.cpp مع تتبُّع maps_to:
إذا/بينما/لكل/طابق/حاول/ارمي/ارجع/توقف/استمر/تعبير.

- language-truth/grammar/10_statements.yaml: 10 قواعد إنتاج (مطابِقة للمخطط)
- tests/behavior/rules_matrix/10_statements/: 111 اختباراً (basic/edge/negative)
- 3 اختبارات تداخل شاملة تَمَسّ كل قواعد الجمل
- الفاحص: 14 قاعدة كلها dual_ok، 184/184 تمرّ في المفسر والمترجم 100%

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
fix(grammar): تصحيح تتبُّع gr.stmt.match + توثيق حدّ نطاق طبقة الجمل

(AR) مراجعة (Amelia) كشفت عيبين في 10_statements.yaml:
- gr.stmt.match: maps_to كان parseSwitchStmt/SwitchStmt خطأً؛ «طابق» يوزَّع فعلاً
  إلى parseMatchStmt (parser_advanced.cpp:553) ويُنتج AST::MatchStmt. صُحِّح
  maps_to + ast_node. (parseSwitchStmt هو لكلمة «حالة» — بناء شقيق منفصل.)
- توثيق حدّ النطاق: جمل أنتج/باستخدام/أجّل/أطلق/اختر يوزّعها parseStatement أيضاً
  لكنها تقع في 60_advanced.yaml لا هنا — أُضيفت ملاحظة صريحة في الترويسة.

اختبارات gr.stmt.match: 13/13 تمرّ مزدوجاً (الإصلاح بيانات-وصفية لا يمسّ التنفيذ).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
fix(grammar): تصحيح تتبُّع gr.program.block (maps_to + ast_node)

(AR) مراجعة (Amelia) لـ00_program.yaml:
- maps_to كان parser_main.cpp خطأً؛ parseBlockStmt في parser_statements.cpp:767.
- ast_node كان BlockStmtNode؛ العقدة الفعلية BlockStmt (statements.h:780).
الثلاث الأخرى صحيحة. اختبارات الكتلة 17/17 تمرّ مزدوجاً (إصلاح بيانات-وصفية).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
test(grammar): توسيع gr.stmt.if إلى 100 اختبار (حالات شاملة + تداخلات) — dual_ok

(AR) كنموذج مرجعي للتغطية الشاملة لكل قاعدة:
- 40 basic: كل عوامل الشرط (مقارنة/منطقي/حسابي/متغير/نص/دالة) فرعَي صحيح وخطأ
- 35 edge: تعشيش 2-4، سياقات (بينما/لكل/دالة/طابق/حاول)، سلاسل وإلا إذا 2-5،
  شروط مركّبة، فروع then/else، حلقات/توقف/استمر داخل إذا
- 10 negative: كتل بلا نهاية بمواضع مختلفة، وإلا/وإلا إذا في غير محلّها
- 15 interaction: إذا × (بينما/لكل/طابق/حاول/ارمي/ارجع/توقف/استمر/تعبير) في _interactions
رُفعت ميزانية test_budget لـgr.stmt.if. 100/100 تمرّ مزدوجاً (المفسر + المترجم).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
fix(types): إصلاح انحدار مطابقة `عندما لاشيء:` + تحذير معامل كاذب (مراجعة أميليا)

تصحيح: ادّعى commit 129a507 أن X04/P09 «يُظهران المفسّر=المترجم» — وهذا
غير دقيق؛ كانا يتباينان فعلًا (المفسّر يُخطئ نمط null). رصدته مراجعة أميليا.
السبب الجذري انحداران أدخلهما نظام الأنواع هذه الجلسة (لا codegen-null):

1) **نمط `عندما لاشيء:` كان يُبنى Void لا Null** —
   `parser_advanced.cpp:944` بنى النمط بـ`Data::Value()` (Void الافتراضي).
   بعد S-TS-P1 صار «عدم» متمايزًا عن «فراغ»، فلم يَعُد النمط يطابق المُسنَد
   «لاشيء» (Null) ⇒ `طابق(لاشيء) عندما لاشيء:` يسقط للافتراضي.
   الإصلاح: `Data::Value::makeNull()`. والمترجم: `sir_builder_match_patterns`
   يقبل الآن `Null || Void` (كان `Void` فقط) فلا ينكسر بالتغيير.

2) **تحذير نوع كاذب على معامل غير مُصرَّح** —
   `expression_evaluator_calls_user_func.cpp`: المعامل بلا تعليق نوع نوعُه
   القديم Unknown لكن sadType يُشتقّ منه = Void، فأُطلق تحذير على كل وسيط
   غير-فراغ. الإصلاح: لا تحذير إلا لمعامل مُصرَّح صراحةً (type != Unknown،
   والنوع ليس Void/Any).

3) تنظيف: `arabic_string_pool.cpp` كان يُمهّد «عدد_صحيح/عدد_عشري» الميتة —
   بُدّلت إلى «رقم/عشري» (أسماء نوع() الموحَّدة).

التحقّق (مفسّر Debug مُعاد بناؤه — الrunner يقرأ Debug لا Release):
X04/P09 صارا تكافؤًا مزدوجًا؛ المجموعة 461 → 422 نجاح/39 فشل (كان 420/41)؛
الفرق = هذان الاختباران فقط، لا انحدار آخر.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
test(grammar): توسيع gr.stmt.while إلى 100 اختبار شامل + تداخلات — dual_ok

40 basic (عدّ/تنازل/خطوات/تراكم/شروط منطقية/لا-تكرار) + 35 edge (تعشيش/توقف/
استمر/طابق/حاول/دوال/إرجاع) + 10 negative (كتل بلا نهاية) + 15 interaction
(بينما × بقية قواعد الجمل). 100/100 تمرّ مزدوجاً.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
test(grammar): توسيع gr.stmt.for إلى 100 اختبار شامل + تداخلات — dual_ok

40 basic (طباعة/تراكم/تحويلات/مصفوفات متنوّعة) + 35 edge (تعشيش/توقف/استمر/
طابق/حاول/دوال/إرجاع/بينما-داخلية) + 10 negative + 15 interaction. 100/100 مزدوج.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
test(grammar): توسيع gr.stmt.match إلى 100 اختبار شامل + تداخلات — dual_ok

40 basic (اختيار حالات/افتراضي/نصوص/تعابير محسوبة/حالات كثيرة) + 35 edge
(تعشيش/حلقات/دوال/إذا داخل حالة/إرجاع) + 10 negative + 15 interaction.
أنماط حرفية + افتراضي (الأنماط المتقدمة في gr.pattern). 100/100 مزدوج.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* test(grammar): توسيع gr.stmt.expression إلى 100 اختبار + تداخلات — dual_ok

40 basic + 35 edge + 10 negative + 15 interaction.
اكتشافات موثَّقة أثناء التأليف:
- المُحلِّل يتعافى من قوس إغلاق مفقود (ليست حالة خطأ) فاستُبدل السلبيّ بوسيط ناقص حقيقي.
- 9 من 10 سلبيات تُخطئ فعلاً (فحص فردي). 100/100 تمرّ مزدوجاً.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(grammar): تقرير Markdown مقروء لمقارنة المفسر/المترجم + قسم التباعدات

(AR) إضافة --report-md للفاحص: يكتب تقريراً بشريّاً دائماً يُظهر لكل قاعدة نتيجة
المقارنة المزدوجة (مفسر≡مترجم)، وقسماً صريحاً للتباعدات/الإخفاقات مع مخرجَي
المحرّكين جنباً إلى جنب — هكذا «نعرف الاختلافات لنصحّحها».
أُرفقت لقطة CONFORMANCE_REPORT.md: 614 اختباراً، 0 تباعد، 14 قاعدة مطلقة.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(grammar): سجل المشاكل المكتشفة + تطوير التقرير (أزمنة + تفصيل كل اختبار)

(AR) استجابةً لطلب التتبّع الكامل:
- DISCOVERED_ISSUES.md: سجل يدوي للثغرات/السلوكيات المكتشفة أثناء التأليف
  (طريقة .اضف تفشل، مدى تحتاج استيراد، تساهل أسماء، تعافي الأقواس...).
- تطوير الفاحص: التقرير الملخّص يضيف زمن المفسر/المترجم الكلي والمتوسط؛
  وتقرير تفصيلي CONFORMANCE_REPORT_detail.md يسرد كل اختبار (رقم/اسم/قاعدة/
  فئة/حالة المقارنة/زمن المفسر/زمن المترجم) — كل معلومة عن كل اختبار.
لقطة: 614 اختباراً، 0 تباعد، مفسر 24.6s ومترجم 489.9s.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(grammar): اختبارات كاشفة للثغرات (grammar_gaps) + قسم ثغرات في التقرير

(AR) منطقة tests/behavior/grammar_gaps منفصلة عن البوّابات (لا تُفشِل البناء)
تتعمّد اختبار ميزات مشكوكة وتُظهر الفاشل صراحةً. 8 كاشفات: 5 تكشف ثغرة، 3 تعمل.
- يكشف ثغرة: .اضف (ISSUE-001)، مدى بلا استيراد (ISSUE-002)، تساهل اسم محجوز
  (ISSUE-005)، ارجع بالأعلى (ISSUE-004)، .تقسيم نص (ISSUE-007 جديد).
- يعمل (تحقّق): .الطول() مصفوفة، .يحتوي() نص، مدى مع استيراد.
- الفاحص يشغّلها منفصلاً ويضيف قسم «اختبارات كاشفة للثغرات» للتقرير.
- تحديث DISCOVERED_ISSUES (ISSUE-007 + حصر ISSUE-001 في .اضف).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test(grammar): توسيع الكاشفات إلى 23 + كشف تباعد مفسر/مترجم (ISSUE-013)

(AR) 23 اختباراً كاشفاً (كان 8) عبر طرق المصفوفات/النصوص/الخرائط/تعابير متقدمة.
النتيجة: 10 تكشف ثغرة، 13 تؤكّد عمل ميزة.
- ثغرات جديدة: .اول (008)، .قص_أطراف (009)، طرق الخريطة .عيّن/.احصل (010)،
  النشر ... (012)، و**ISSUE-013**: .احذف_اخير تعمل في المفسر (طول=2) لكنها
  عملية فارغة في المترجم (طول=3) — تباعد كشفته المقارنة المزدوجة وحدها.
- عاملة مؤكَّدة: .عكس/.رتب/.خريطة/.رشح/.فهرس/.آخر، .يبدأ_بـ/.استبدل/.تحويل_كبير،
  خريطة حرفية+فهرسة+إسناد+.مفاتيح، فهرسة متداخلة، مدى مع استيراد.
البوّابات المُبوَّبة تبقى خضراء (614/614)؛ الكاشفات غير مُبوَّبة.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test(grammar): توسيع الكاشفات إلى 40 + 5 ثغرات جديدة (3 فجوات مترجم)

(AR) إضافة كاشفات للميزات المتقدمة. النتيجة: 40 كاشفة — 16 تكشف ثغرة، 24 تعمل.
فجوات مترجم جديدة (تعمل في المفسر، تفشل ترجمتها) — كشفتها المقارنة المزدوجة:
- ISSUE-016 استيعاب القائمة · ISSUE-017 استيعاب الخريطة · ISSUE-018 .مسطح()
ثغرات مفسِّر جديدة: ISSUE-014 تفكيك التصريح · ISSUE-015 .استخراج().
عاملة مزدوجاً مؤكَّدة: لامدا/إغلاق/أنبوب/اختزل/لكل/tuple/شريحة/فهرسة سالبة/
نمط نطاق 1..10/تحويل_صغير/خريطة قيم وحجم. البوّابات تبقى 614/614 خضراء.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test(grammar): توسيع الكاشفات إلى 62 (OOP/تزامن/متقدمات) + 3 ثغرات جديدة

(AR) 62 كاشفة — 19 تكشف ثغرة، 43 تؤكّد عمل ميزة.
ثغرات جديدة: ISSUE-019 الأساس(super) · ISSUE-020 الجنيسات <ت> · ISSUE-021 async/await.
عاملة مؤكَّدة مزدوجاً (جديد): صنف كامل/وراثة/بنية/تعداد/سمة+نفّذ/ساكن/عامل+/خاصية،
قناة/اختر/مجموعة_انتظار، أجّل/ماكرو/امتداد/يتطلب/يضمن/@حجم.
تصحيح أوراكل: defer (سطرا @expected بدل \n مكسور). البوّابات 614/614 خضراء.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(grammar): استخراج طبقة التصريحات 20_declarations (~300 اختبار) + 8 ثغرات

(AR) 7 قواعد: متغير/إشارة-نوع/دالة/معاملات/استيراد/تصدير/خارجي — متتبَّعة maps_to.
~300 اختبار مزدوج (variable/function 85 لكل + parameters 40 + import 24 + export 12
+ extern 9 + تداخلات 41) — 100%. الإجمالي المُبوَّب 912 اختباراً، 21 قاعدة مطلقة.

ثغرات جديدة (السجل=25): ISSUE-022 معامل متغير ... · 023 نوع إرجاع -> · 024 من...استورد ·
025 فجوة مترجم: دالة تُرجع خريطة (مفسر 1/مترجم فراغ) · 026 فجوة مترجم: صدّر بنية ·
027 الاسم حساب · 028 تظليل الكتلة لا يعزل · 029 تساهل دالة بلا أقواس.
المنهج: التباعدات/الفجوات نُقلت إلى grammar_gaps (67 كاشفة، 23 تكشف ثغرة) لا أُخفيت.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(grammar): قاعدة «الصفة بعد الموصوف» في تصريح المتغير + 4 ثغرات

(AR) تصحيح إغفال (ملاحظة المستخدم): المتغير يقبل مُعدِّلات بعد الكلمة المفتاحية:
«متغير ثابت ص = 10»، «متغير عام/خاص/ساكن س». حُدِّثت gr.decl.variable
(EBNF + alternatives + وصف + مراجع عام/خاص/محمي) وأُضيفت اختبارات عاملة
(متغير ثابت رقم، متغير ساكن عام، متغير محمي داخل صنف).

ثغرات مكتشَفة (نُقلت إلى grammar_gaps، لم تُخفَ):
- ISSUE-032 فجوة مترجم: «متغير <صفة> ص» بلا نوع بالمستوى الأعلى → مفسر يُرجع القيمة،
  مترجم فراغ (يعمل مع نوع/داخل صنف).
- ISSUE-030 «متغير ثابت» لا يمنع إعادة الإسناد.
- ISSUE-031 «متغير ثابت عام» يفشل (بينما «متغير ساكن عام» يعمل).
الإجمالي: 915 مُبوَّب 100% مزدوج، 73 كاشفة (29 تكشف ثغرة)، السجل 28 قضية.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* @
docs(type-system): تطوير مهارة sad-lang-dev + توثيق نهائيّ + تتبّع _bmad-output في git

ثلاث مهامّ:

1) مهارة sad-lang-dev — تحديث نظام الأنواع للحالة النهائية:
   - references/types-and-sir.md: حذف إشارات DataType (محذوف كليّاً)، توضيح
     SadTypeKind مُولَّد من types.yaml (52 قيمة)، علاقة type_/sadType_/getKind/
     setSadType/makeNull، Null متمايز، Future/Generator، أنواع الرسوميات،
     توحيد نوع() عبر typeof_ar، codegen-null.
   - references/architecture.md: تصحيح فقرة Value/DataType البائدة.

2) توثيق نظام الأنواع (_bmad-output/systems/type-system):
   - README.md: إعادة كتابة كاملة (كان خطّة UTM v3 ديسمبر 2024 بائدة لا تصف النظام) →
     فهرس + نظرة عامة دقيقة (P0–P11، الدمج، نقاط التكامل، الأنظمة ذات الصلة).
   - docs/ARCHITECTURE_TYPE_SYSTEM.md: تحديث رأس التحقّق (Future مربوط + codegen-null + الدمج).
   - status/FINAL_REPORT_2026-06-15.md: تقرير نهائيّ جديد (الفجوات المُغلقة + التحقّق المدموج).
   - docs/تقرير_تكامل_SadUI_مع_نظام_الأنواع_الموحد.md: تقرير تكامل SadUI (عناصر = كائنات).

3) git: جعل _bmad-output كله متتبَّعًا (استثناء !/_bmad-output/ بعد قاعدة /_* الجامعة في
   .gitignore) — 423 ملف حوكمة BMAD صار محفوظًا في المستودع.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(type-system): خرائط بصرية غنيّة لتدفّق نظام الأنواع ومساره (Mermaid)

وثيقة جديدة خرائط_نظام_الأنواع_البصرية.md — 9 مخططات Mermaid تصف الواقع الحاليّ:
- الصورة الكبرى: types.yaml → التوليد → المحرّكين
- مسار الكود: نصّ .ص → معجمي → نحوي → AST → {مفسّر | مترجم SIR→LLVM}
- Value: تمثيلا type_/sadType_ وgetKind()
- عائلة SadTypeKind (52) مُصنَّفة (mindmap)
- هرمية أصناف SadType (classDiagram)
- SadTypeRegistry: التجميع والمصانع
- تدفّق نوع() عبر typeof_ar (sequence)
- تدفّق null/الاختياريّ (P9 + ?./??)
- خريطة الملفات (أين أعدّل ماذا)

وصفٌ للواقع الموجود فقط (لا تاريخ تغييرات) ليفهم المطوّر النظام كاملًا. مربوطة من README.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): فحص عميق لنظام الرسومات SadUI (تقرير أميليا — قياس ساكن GR-01)

DEEP_DIVE_2026-06-15.md — فحص أميليا القائم على الأدلّة (ملف+سطر) للواقع الحاليّ
استعدادًا لبدء تطوير SadUI. أبرز ما يُصحّح ادّعاءات status 06-08:
- W15-01 (نوع العنصر=«كائن») معالَج كوديًّا عبر توحيد الأنواع (استنتاج ساكن)
- جديد <واجهة_تصريحية> يعمل في الكود (لا SEM001) — visitUIDeclaration + UIStateManager
- المترجم له مسار UI كامل (SIR + 504 سطر LLVM + 539 سطر runtime) — يناقض EPIC-UI-W15
- تباين: المحلّل يفرض 15 عنصرًا بينما UINodeType ~90 والمولّدات تنتج خارج الـ15
- خانات SoT الرسوميّة معرّفة لكن غير مستعملة (العنصر يبقى Class)
- تقادم أرقام: المُهمل 44 لا 55+؛ ستّ منصّات لا أربع؛ أندرويد 3618 لا 903

كل «سلوك» مُميَّز عن «وجود الكود»؛ التوصية P0: تحقّق وظيفيّ (بناء + test_event_system.ص).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): تحقّق وظيفيّ P0 لـSadUI — يُصحّح استنتاجات التقرير الساكن

FUNCTIONAL_VERIFICATION_2026-06-15.md — بناء + تشغيل فعليّ (لا قياس ساكن).
البوّابة الوظيفية كشفت أنّ نقطتين في تقرير أميليا الساكن لا تصمدان للتشغيل:

- W15-01 غير محقَّق: نوع(زر()) = «أي» (Any) لا «كائن» — قيمة العنصر getKind()=Any
  لأن sadType_ لا يُضبط إلى Class (الاستنتاج الساكن WidgetBuilder:ObjectInstance⇒Class خطأ عمليًّا).
- جديد <واجهة> + الأحداث: test_event_system.ص يفشل — SEM001 «هذا» غير معرَّف
  داخل طرق الواجهة (الجسر المفسّر↔واجهة ما زال ناقصًا وظيفيًّا).

ثبت إيجابًا: تسجيل العناصر كسولًا عند «استورد رسومات» يعمل؛ النحو يقبل واجهة/@حالة/دالة بناء().
فجوتان P0 موثّقتان بالدليل المُشغَّل. الدرس: «وجود الكود» ≠ «سلوك مُثبَت».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): توسيع التحقّق الوظيفيّ لـSadUI — خريطة 8 نقاط مُشغَّلة + تصحيح

تشغيل حقيقيّ متعدّد النقاط (طلب المستخدم: تشغيل رسومات فعليّة لقياس الفجوة):
- 🎨 إيجابيّ: تشغيل_تطبيق() ينشئ نافذة فعليّة 800×600 (SDL2) — محرّك الرسم حيّ
- الأحداث (لامدا في معدّل) + تداخل الأبناء + 14/15 عنصرًا: تعمل
- 🔴 P0: نوع() = «أي» لكل كائن (نقطة(5) و زر() معًا) لا «كائن» — وسم قيمة الكائن
  (أعمّ من العناصر؛ W15-01 فرعٌ منه)
- 🔴 P0: واجهة تصريحية غير قابلة للإنشاء (عدّاد() → SEM004)
- 🟠 P1: قائمة_كسولة غير مُسجَّلة · نص() يُرجع سلسلة لا عنصرًا · لا تحذير إهمال

تصحيح ذاتيّ: بعض إخفاقات الصيغة الأولى (جديد/=>) كانت أخطاء صياغة منّي لا فجوات نظام
(جديد ليس كلمة مفتاحية؛ الإنشاء بنداء الاسم؛ لامدا() ... نهاية) — صُحِّحت بعد التحقّق من
اختبارات OOP/لامدا الناجحة. الدرس: وجود الكود ≠ سلوك مُثبَت.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): نقطتان إضافيتان في التحقّق الوظيفيّ (المترجم + المُهملة)

- 🔴 P0 جديدة: sadc لا يترجم برامج «استورد رسومات» — رسومات.ص:66 فيه «صدّر *»
  المجرّد (تصدير كل الوحدة بلا «من») يرفضه محلّل المترجم (يدعم «صدّر * من X» فقط).
  برامج عاديّة + «استورد رياضيات» تُترجَم بنجاح ⇒ الفجوة رسومات-خاصّة (فجوة محلّل عامّة).
  الأثر: SadUI يعمل في المفسّر فقط، لا يُترجَم — مولّدات UI في المترجم غير قابلة للوصول.
- ✅ 8/8 عناصر مُهملة تعمل (شريط_تطبيق/حوار/خانة_اختيار/زر_عائم/هيكل/بطاقة/سطح/صندوق).

المجموع: 3 فجوات P0 (وسم الكائن · إنشاء الواجهة · ترجمة UI) + 3 فجوات P1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): تصحيح صيغة OOP (باني لا __تهيئة__) + حسم ثقة فجوات P0

بعد قراءة الكود + مثال 034_complex_oop الناجح (طلب المستخدم: اقرأ الكود/القواعد):
- المُنشئ = باني(...) لا __تهيئة__؛ الحقول متغير عام؛ جديد لاحقة اختيارية
  (البادئة لا تعمل رغم docs/قواعد:780 — تعارض وثيقة↔كود).
- شفافيّة: عدّة إخفاقات أولى كانت صياغتي الخاطئة لا فجوات نظام؛ أُعيد التحقّق بالصيغة الصحيحة.

حسم الثقة:
- 🔴 P0 #1 (نوع(كائن)=«أي» لا «كائن») **مؤكَّدة قطعيًّا**: نقطة بباني صحيح يعمل (ن.س=5)
  ومع ذلك نوع(ن)=«أي» — مستقلّ عن جديد. أوثق فجوة.
- 🔴 P0 #3 (sadc يفشل على استورد رسومات بسبب صدّر * المجرّد) صلبة مستقلّة عن الصيغة.
- 🟡 P0 #2 (واجهة غير قابلة للإنشاء) خُفِّضت إلى «مُرجَّحة لا قطعيّة» — لا مثال واجهة عامل
  للقياس؛ قد تكون صيغة الإنشاء مختلفة. تحتاج صيغة قانونيّة للحسم.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): حسم فجوة الواجهة P0 — مؤكَّدة بالتحقيق العميق (قراءة كود + عزل)

سلسلة أدلّة قاطعة لفجوة «واجهة غير قابلة للإنشاء»:
- واجهة عداد → parseUIDeclaration (parser_main.cpp:762) → UIDeclarationNode
- accept يستدعي visitUIDeclaration (ui_nodes.h:609) والمفسّر يطبّقها وتسجّل المكوّن
  كصنف isUIComponent (statement_executor_oop_struct_test.cpp:503-580)
- ومع ذلك: عداد()→SEM004، عداد() جديد→getClass=null (oop_new.cpp:127,143)
- عزل حاسم: صنف سيارة عاديّ بنفس الملف يُنشأ (سيارة:تويوتا) بينما عداد لا —
  مع/بدون استيراد، أبسط واجهة صحيحة ⇒ ليست صياغتي
- اعرض عداد أيضًا لا يعمل (اعرض غير معرّف)

الحكم: فجوة نظام مؤكَّدة — المكوّن غائب عن ClassManager وقت الإنشاء رغم مُسجِّل موصول.
السبب الدقيق (ترتيب الرفع/المعالجة) يحتاج بناءً مُجهَّزًا بآثار طباعة للحسم.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): فحص المترجم (sadc) — تباعد تكافؤ في وسم الكائن يُحدّد الإصلاح

فحص المترجم (طلب المستخدم: ماذا عن المترجم بعد المفسّر):
- البدائيّات: نوع() مطابق تمامًا بين المحرّكين (رقم/نص/منطقي/مصفوفة)
- 🔑 الكائن: نوع(نقطة(5)) = المفسّر «أي» (خطأ) مقابل المترجم «كائن» (صحيح) ⇒ تباعد
  تكافؤ مزدوج. فجوة P0 #1 خاصّة بالمفسّر — المترجم يَسِم الكائن Class (المرجع الصحيح).
  يُحدّد الإصلاح بدقّة: وسم قيمة الكائن في المفسّر (getKind=Any بدل Class).
- واجهة: التحليل يُقبَل في المترجم؛ الإنشاء يفشل في الاثنين
- استورد رسومات: يفشل في المترجم (صدّر * المجرّد) — UI غير قابل للترجمة

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* fix(ci): توجيه codegen-check إلى مصدر V5 + وسائط مُسمّاة

(AR) سير عمل codegen-check كان يستدعي gen_keywords.py بوسائط موضعية بينما
السكربت يتطلب --yaml/--schema/--header/--source، ويولّد من data/language
(نسخة 4.1 قديمة) بدل language-truth (V5/5.0 — مصدر الحقيقة الفعلي). صُحِّح
ليطابق الملف المولَّد المُودَع (5.0) فلا انجراف، وأُضيف graphic لفروع الـPR.
انجراف سابق غير متعلّق بعمل القواعد؛ كان يمنع الدمج.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* @
docs(ui-system): مخططات Mermaid في STRATEGY + وثيقة معمارية موحّدة بصرية لـSadUI

- STRATEGY.md: أُضيفت مخططات Mermaid (طبقات L0–L5 + مسار البيانات + التكامل)
  بدل/إضافةً إلى صناديق ASCII الصعبة القراءة؛ وتحديث سطر التكامل لتباعد نوع() المُثبَت.
- جديد: docs/المعمارية_الموحدة_لنظام_الرسومات.md — 9 مخططات Mermaid غنيّة:
  الطبقات الستّ · مسار البيانات (.ص→شاشة) · الباطن متعدّد المنصّات · تمثيل العنصر
  (WidgetBuilder/UINodeType + تباعد getKind) · كتالوج 15+المُهمَل · الحالة التفاعلية
  (sequence) · التكامل · خريطة الجاهزية (مُثبَت بالتشغيل) · خريطة الملفات.

وصفٌ للواقع الموجود، سهل الفهم بالمخططات المرئية. مربوط بتقارير التحقّق.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): فهرسة README — ربط المعمارية الموحّدة + تقارير التحقّق + تصحيح

- «ابدأ هنا» (ترتيب قراءة): المعمارية الموحّدة بالمخططات → STRATEGY → التحقّق الوظيفيّ → الفحص العميق
- ربط الوثائق الجديدة: المعمارية_الموحدة · FUNCTIONAL_VERIFICATION · DEEP_DIVE
- إضافة docs/ إلى بنية المجلد
- تصحيح: test_event_system.ص ليس مثالًا عاملًا (يفشل — جديد بادئة + نوع=="object" + فجوة الواجهة)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* feat(grammar): توحيد مصدر قواعد المحلل + مولّد توثيق (104 قاعدة، 8 طبقات)

استخراج قواعد لغة ص من المحلل (الكود هو الحقيقة) إلى مصدر موحَّد في
language-truth/grammar/، مدموجًا مع نسخة dev للطبقات 00/10/20 دون مسّها.

- طبقات جديدة: 30_oop, 40_expressions, 50_patterns, 60_advanced, 70_lexical
- إضافات لـdev: gr.decl.arg_list (في 20)، gr.stmt.switch (في 10)
- مولّد scripts/codegen/gen_parser_grammar_docs.py (YAML→Markdown):
  BNF + تفصيل بدائل + مسار maps_to ⇒ AST + مخطّط مسار الدوال + مخطّط بنية + روابط يستدعي/مُستدعى
- التوثيق المُولَّد في docs/parser_rule/_generated/ (مُولَّد — لا يُحرَّر يدويًّا)

تحقّق: المخطّط VALID للـ104 قاعدة، المراجع محلولة، maps_to 110/110،
215 مخطّط Mermaid يُصيَّر، conformance بوّابة التماسك ② سليمة.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* chore(skill+protection): توجيه فرع dev في مهارة sad-lang-dev + توثيق حماية dev

- sad-lang-dev SKILL.md + references/workflow.md: قسم سير عمل الفروع §5
  (worktree من dev + إيداع موقّع GPG + دمج عبر PR) + قاعدة صارمة.
- BRANCH_PROTECTION_POLICY.md: توثيق Ruleset حماية dev (17779574، مثل graphic).
- ruleset-dev-protection.json: تكوين حماية dev.

ملاحظة: أُودِع مباشرةً على dev — هذه التعديلات سبقت إرساء مسار الـPR.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs(ui_system): تقرير مسار الكود + ربط الحوكمة بـRFC-0001/Issue#2 (#61)

- إضافة CODE_PATH_REPORT_2026-06-17.md (مسار الكود + 5 مخططات + كتالوج العناصر 15/44)
- ربط ROADMAP وimplementation_status بـRFC-0001 (sadlang/rfcs#1) وتتبُّع Issue#2
- توثيقي فقط بلا ادعاء إنجاز (GR-01)؛ الجذور السطرية للفجوات موثّقة

Co-authored-by: Sad Lang Dev <admin@sad-lang.dev>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* build: توحيد أسماء أهداف البناء (sad-run/sad-build) وإصلاح بناء المترجم في Debug (#63)

تنفيذ RFC «توحيد أسماء أهداف البناء»: يوحّد اسم هدف CMake مع اسم مخرجه لكلتا
الأداتين، ويُصلح جذريًا بناء المترجم في وضع Debug، ويحدّث أدوات الاختبار.

## إعادة التسمية (هدف = مخرج)
- المفسّر: الهدف `sad` → `sad-run` (المخرج sad-run.exe)
- المترجم: الهدف `sadc` → `sad-build` (المخرج sad-build.exe)
- تحديث كل المستهلكين: cmake (executables/dual_tests/doc_gen/tests/
  tests_comprehensive/install)، CI، التوزيع، الوثائق، والسكربتات.
- إزالة اسم `sadc.exe` البائت (لا يُنتجه أيّ هدف) من runner.py وconfig.yaml
  ومسارات اختبار CI — هذا يُزيل عثرة «الثنائي البائت» الموثّقة.

## إصلاح بناء المترجم في Debug (cmake/llvm.cmake)
السبب الجذري كان متعدد الطبقات؛ حُلّ بالكامل:
1. ABI: مسار بحث الرابط لـLLVM صار مُدرِكًا للتهيئة (Debug→LLVM-Debug،
   غير ذلك→Release) عبر link_directories بـgenerator expression — يمنع
   تعارض _ITERATOR_DEBUG_LEVEL/RuntimeLibrary.
2. تسرّب Release: sad_llvm_backend كان يربط LLVM Release بمسارات كاملة
   PUBLIC؛ صار يستعمل ${LLVM_LIBS} الموحَّد (مصدر حقيقة واحد، DRY).
3. الاكتمال + مضاد التسرّب: تُسرَد كل مكتبات LLVM في مجلد Debug بالأسماء
   المجرّدة (تُحَلّ عبر مجلد بحث واحد لكل تهيئة) بدل إغلاق llvm_map الذي
   يُسقط حواف التوكيدات الخاصة بـDebug.
4. استثناء LLVM-C.lib (مكتبة استيراد ديناميكية) لتفادي اعتماد DLL وقت
   التشغيل (0xC0000135).
5. إضافة مكتبات نظام Windows (ws2_32 وغيرها) التي تعتمدها LLVM.
+ مجموعة إعادة سرد (مكافئ --start-group) للإشارات العكسية الدائرية.

## التحقق
- sad-run (Debug) + sad-build (Debug 117MB، Release 89MB): بناء بصفر أخطاء.
- مترجم Debug يترجم ويشغّل .ص فعليًا (3+5=8) بلا اعتماد LLVM-C.dll.
- runner P0: 5/5، تكافؤ مزدوج 100% (مفسّر+مترجم) بالأسماء الجديدة.
- توحيد تهيئة runner على Debug — يُزيل عثرة «مفسّر Debug + مترجم Release».

Co-authored-by: Sad Lang Dev <admin@sad-lang.dev>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* ci: تفعيل CI على dev + إصلاح بناء Windows/Linux عبر المنصّات (#64)

* ci: تفعيل CI على فرعَي التكامل dev/graphic (وagent/** للتحقق)

كانت محفّزات pull_request في ci.yml تستهدف develop/main فقط، فلم يُجرِ CI أيّ
فحص على PRs إلى dev (فرع التكامل المحميّ الفعلي). إضافة dev وgraphic لمحفّزات
PR والpush، وagent/** للpush ليُختبَر CI على فروع الوكلاء قبل الدمج.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* ci+fix: إزالة macOS، تثبيت Windows على VS2022، وإصلاح بناء Linux (GCC)

تفعيل CI على فرع dev كشف إخفاقات سابقة على المنصّات (لم يكن CI يعمل على dev).
عولجت بالكامل، مع اختبار بناء Linux محليًا في WSL (g++ 13.3) قبل الدفع:

## CI
- إزالة وظيفة/مدخلات macOS من ci.yml + build-all-platforms.yml + release.yml
  (المشروع لا يُبنى لـmacOS) مع تنظيف كل مراجع needs/الملخّص/الحزم.
- تثبيت runner ويندوز على windows-2022 (يضمن مولّد «Visual Studio 17 2022»؛
  windows-latest انتقل لصورة بلا VS2022 ⇒ "could not find any instance of VS").

## إصلاحات بناء Linux/GCC (كانت تعمل على MSVC فقط)
- network/sadnet/crypto/sha256.cpp: سمة __attribute__((target("sha,sse4.1,
  ssse3"))) لدالة SHA-NI — GCC يتطلبها لترجمة intrinsics دون -msha عام.
- network/sadnet/crypto/aes_gcm.cpp: #pragma GCC target("aes,pclmul,sse4.1,
  ssse3") لكامل وحدة الترجمة لتعليمات AES-NI/PCLMUL.
- sad_ui/reactive/binding_compiler.cpp: cast صريح لـint64_t حول std::stoll
  (غموض بناة على Linux LP64 حيث int64_t=long).
- interpreter/.../builtin_module_math.cpp: إضافة #include <thread> لـ
  std::this_thread (لا يُضمَّن ضمنيًا على GCC).
- shared/builtins/runtime/{builtins,other_functions}.cpp: إخراج
  #include "builtin_error.h" من كتلة _WIN32 (Sad::Errors يُستعمل دون شرط منصّة).

التحقق: بناء sad-run في WSL يكتمل بصفر أخطاء ويعمل («42»). إصلاحات GCC مؤكَّدة
بترجمة g++ 13.3 (نفس CI). لا أثر على سلوك Windows (المسارات نفسها).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(linux): إصلاحات بناء GCC إضافية كشفها بناء all في WSL

- network/sadnet/dht/dht_engine.cpp: #include <condition_variable> لـ resp_cv.
- tools/hub/help_renderer.cpp: #include <cstdint> لـ SIZE_MAX.
- tools/apk_builder/apk_builder.cpp: إخراج #include <algorithm> من كتلة _WIN32
  (std::replace يُستعمل دون شرط منصّة).

كلها «تعمل على MSVC، تفشل على GCC» (تضمين ضمنيّ/عابر لا يوفّره GCC). تحقّق ببناء
كل الأهداف في WSL (g++ 13.3) بصفر أخطاء عدا ملفات مسار LLVM (LLVM OFF محليًا —
يُغطّيها CI بـLLVM ON).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): إصلاح اختبار Linux وحارس الملفات اليتيمة على Windows Debug (LLVM off)

- tests/.../test_compiler_comprehensive.cpp: #include <cstring> لـ strlen (GCC).
- cmake/orphan_sources_guard.cmake: استثناء compiler/src/backend/ من فحص اليتامى
  عند ENABLE_LLVM_BACKEND=OFF — مصادر مولّد LLVM لا تُضاف لأيّ هدف شرعًا حينها
  (كان الحارس يفشل تكوين Windows Debug حيث لا يتوفّر LLVM Debug).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): حزم Python للتوليد + إصلاحات GCC إضافية + تعطيل اختبار UI ميّت

## CI: حزم Python للتوليد (sad_check_codegen_env)
- ci.yml: تثبيت pyyaml + jsonschema في وظيفتَي Windows و Linux قبل البناء —
  هدف sad_check_codegen_env يستوردهما، وفشلهما كان يُسقط البناء (MSB8066).

## إصلاحات بناء Linux/GCC إضافية
- tools/check/src/main.cpp: تأهيل ::isatty/::fileno الصريح (POSIX).
- stdlib/نص/arabic_string_pool.hpp: حصر عامل الحرفية المُعرَّفة بلاحقة عربية
  (operator""_مُدار) بـ MSVC — GCC/Clang لا يدعمان UDL بلاحقة غير ASCII. العامل
  غير مستعمَل (0 استدعاء) فالحصر آمن.

## تعطيل اختبار ميّت
- cmake/tests_comprehensive.cmake: تعطيل test_ui_comprehensive — يضمّ مجلدًا/رأسًا
  محذوفين (compiler/src/sir، sir_opcodes.h) ويستعمل أوبكودات UI أُزيلت
  (Opcode::UICreateWidget…). كود غير قابل للترجمة يختبر وظائف محذوفة.

تحقّق Linux ببناء WSL (LLVM ON + TESTS ON، llvm-18، g++ 13.3) المطابق لـCI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(linux): إعلان isatty نطاقيًّا + تصحيح تضمين exception.h المحذوف في profiler

- tools/check/src/main.cpp: إعلان extern "C" int isatty(int) في نطاق الملف —
  سلسلة تضمينات الوحدة تكبت تصريح <unistd.h> تحت -std=c++17 الصارم. (extern "C"
  يجب أن يكون نطاق ملف لا داخل دالة.)
- tools/profiler/src/main.cpp: تصحيح تضمين exception.h المحذوف ⇒ user_thrown.h
  (حيث نُقلت ExitException؛ interpreter/include ضمن مسارات التضمين).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): إجبار CMake على مفسّر Python نفسه الذي ثُبّتت فيه حزم التوليد

كان sad_check_codegen_env يفشل وقت البناء على Windows (MSB8066) رغم تثبيت pip،
لأنّ CMake قد يختار مفسّر Python3 مختلفًا عبر find_package فلا يجد pyyaml/jsonschema.
الآن تُصدّر خطوة pip مسار python إلى PYTHON3_EXECUTABLE وتُمرّره خطوة التكوين عبر
-DPython3_EXECUTABLE فيتطابق مفسّر pip ومفسّر البناء.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(linux): إضافة <unistd.h> لـ ::getpid في compiler_driver_linker

الملف يستعمل ::getpid() على فرع POSIX دون تضمين <unistd.h> (MSVC يستعمل
GetCurrentProcessId فلا يحتاجه). نقص التضمين …
SalehKadah added a commit to sadlang/s-programming-language that referenced this pull request Jun 23, 2026
…Manager (#82) + إصلاحات CI (#84)

* @
feat(types): S-TS-P0.5 — توليد SadTypeKind من types.yaml (إنهاء خرق SoT)

- gen_types.py + _lib/context.py + test_gen_types.py: يولّد
  shared/types/generated/sad_type_kind_generated.h من language-truth/types.yaml
- types.yaml: حقل kind لكل نوع (50 قيمة) + مخطّط type.schema.json محدّث
- cmake/codegen.cmake: تفعيل هدف sad_types_codegen ضمن sad_all_codegen
- keywords_generated.cpp: إعادة توليد (نسخة المعجم 5.0)
- العدد الآن من YAML آليًّا — يمنع انحراف 34/46/49 بنيويًّا
- اختبار المولّد: test_gen_types.py EXIT 0

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P0+P1 — اتّساق العدد (50) + نوع «عدم» (Null) متمايز عن «فراغ» (Void)

P0 (اتّساق): تعليق ترويسة sad_type_system.h → «50 قيمة»؛ وثيقتا المعمارية
  (_bmad + docs) متطابقتان وتذكران 50 (لا 34/46).

P1 (Null في المفسّر):
- SadTypeKind::Null في السجلّ (null_ + getNull) + Value::makeNull()
- LITERAL_NULL يبني عدمًا متمايزًا (لا Value() فارغ)
- type_of → «عدم»؛ toString(io) → لاشيء؛ التأكيدات: عدم/لاشيء → NULL
- مقارنة: عدم==عدم=صحيح، عدم==رقم/نص=خطأ (فرع Null في evaluateComparisonOp + operator==)
- عوامل ?.//?? تفحص isNull() لا isVoid()
- الجسر: قسم ValueType case Null→getNull (أقسام DataType سليمة)
- اختبار 049_null_distinct_from_void.ص: مفسّر PASS؛ المترجم @skip_compiler موثّق
  (codegen-null مؤجَّل: نوع(لاشيء)→مجهول، لاشيء==نص يُسقِط — BF-08)
- status/ محدّث بدليل (GR-01)؛ انحراف «عدم» عن نصّ الخطة مبرَّر بـSoT-First

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(semantic): S-TS-P2 — توحيد المدقّق الدلالي على SadTypeKind

- dataTypeToTypePtr(DataType) → sadKindToTypePtr(SadTypeKind): المحور الآن SadTypeKind
- dataTypeArabicName(DataType) → sadKindArabicName(SadTypeKind) (سلاسل مطابقة تمامًا)
- مقارنات decl.returnType تمحورت على SadTypeKind عبر Types::fromDataType
- إزالة كل enum-literals: grep -c "Data::DataType::" = 0 (كان 28)
- غلافا dataType* الرفيعان يبقيان كحدود جسر موثّقة (تُحذف في P2.5a)
- سلوك محايد: P0=5/5، P1=98/108 (+1)، لا تراجع (إخفاقات OOP/errors سابقة وغير متعلقة)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(ast): S-TS-P2.5a دفعة 1/8 — getTypeKind() + ترحيل expressions.cpp

- إضافة ASTNode::getTypeKind()→SadTypeKind (محور موحَّد، بجانب getDataType الموروث)
- ترحيل BinaryExpr/TernaryExpr/IndexExpr::getType() إلى getTypeKind + SadTypeKind
- expressions.cpp: grep DataType = 0
- بناء sad-run أخضر (ast_node.h ترويسة واسعة الاستهلاك — التغيير إضافي آمن)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(ast): S-TS-P2.5a دفعة 2/8 — حقل kind متوازٍ في SimpleTypeNode

- إضافة SimpleTypeNode::kind (SadTypeKind) بجانب dataType الموروث، يُملأ في البُناة عبر fromDataType
- isCompatibleWith يتمحور على kind (سلوك مطابق: kind=fromDataType(dataType))
- dataType + dataTypeToString/stringToDataType تبقى للمستهلكين الـ168 (تُرحَّل لاحقًا، تُحذف دفعة 6/8)
- بناء sad-run أخضر + P0 5/5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(ast): S-TS-P2.5a دفعة 3/8 — ترحيل مقارنات الحقول في declarations.cpp/statements.cpp

- مقارنات .type/.returnType تتمحور على SadTypeKind عبر Types::fromDataType (تُبسَّط في دفعة 6)
- typeToString/dataTypeName المحليّان يبقيان كجسر (يُحذفان دفعة 6)
- ملاحظة: Parameter وVarDeclStmt تحملان أصلًا sadType متوازيًا — القلب = ترحيل المستهلكين
- بناء sad-run أخضر + P0 5/5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(interp): S-TS-P2.5a — ترحيل قرّاء المفسّر (مقارنات النوع) إلى SadTypeKind

- 11 موضع مقارنة (VarDeclStmt.type، CatchClause.exceptionType) تتمحور على
  Types::fromDataType(field) == SadTypeKind::X (AC4: المستهلك يقرأ SadTypeKind)
- صيغة الجسر تُبسَّط إلى مقارنة مباشرة عند قلب الحقول (نهاية P2.5a)
- lambdas العرض المحلّية تبقى (حدود عرض، لا مقارنة)
- بناء sad-run أخضر + P0 5/5 + errors 24/25 (لا تراجع)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(types): S-TS-P2.5a — قلب DataType→SadTypeKind في الـAST/المحلّل (grep=0)

القلب المقترن الكامل دفعةً واحدة (نمط flip + إصلاح موجَّه بالبناء):
- حذف ASTNode::getDataType()؛ القرّاء → getTypeKind() → SadTypeKind
- قلب حقول النوع: SimpleTypeNode.kind، OperatorOverload.returnType،
  TraitMethodInfo.{returnType,paramTypes}، وحقول declarations/statements/expressions
- المحلّل يُنتج SadTypeKind: parseType/mapTokenTypeToKind/stringToKind
- ترحيل كل القرّاء (مفسّر/مترجم/ملكية/LSP/دلالات) إلى مقارنات SadTypeKind
- grep -c DataType في shared/ast+shared/parser = 0 (كان 223) — AC3 محقّق
- بناء sad-run أخضر؛ P0 5/5؛ P1 لا تراجع جديد (نفس FAIL_INTERP السابقين)

اكتشاف (مستقلّ عن هذا العمل): المترجم (sad-build) لا يُنتج تنفيذيًّا —
كسرٌ سابقٌ لهذا القلب (مُعزَّل بـgit stash: الحالة المُلتزَمة تفشل بنفسه)،
مُقنَّع بـsadc.exe بائت. يلزم تحقيق مستقلّ. القلب لا يُدخِل تراجعًا.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
fix(compiler): إصلاح تضارب علم -o بين سياسة الذاكرة وإخراج sadc

البق (سابق، من عمل أعلام الذاكرة E-3، مستقلّ عن نظام الأنواع):
- memory_mode_flag سجّل "-o" اسمًا مختصرًا لمستوى الملكية (--ownership)
- محلّل أعلام الذاكرة يعمل قبل CLI، فيبتلع "-o" وقيمته (مسار الإخراج)
  ويعدّها مستوى ملكية → يختفي -o من CLI → output_file فارغ →
  يُكتب التنفيذيّ باسم المصدر في cwd، فالـrunner يراه «لم يُنتَج»

الإصلاح:
- إزالة معالج flagHandlers_["-o"] للملكية + shortName "o" من تعريفها
- تصحيح نصوص المساعدة (الملكية عبر --ownership/--ملكية فقط)

الأثر: -o يكتب في المسار الصحيح. runner --level P0 = 5/5 مزدوج حقيقي،
P1 = 105/108 (104 تكافؤ مزدوج) — كان المترجم يُنتج 0 تنفيذيّ قبل الإصلاح
(مُقنَّعًا بـsadc.exe بائت 9 مايو طوال الجلسة).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(types): S-TS-P2.5b — حذف دوال DataType من الجسر + حذف data_types.h

إنهاء التخلّص من النظام الأفقر (DataType) بعد ترحيل P2.5a/P2 (grep=0):
- حذف toDataType/fromDataType/sadTypeToDataType/sadTypeFromDataType من type_bridge.{h,cpp}
- حذف عضوَي SadType::toDataType/fromDataType من sad_type_system.{h,cpp}
- إزالة #include "data_types.h" من كل المُضمِّنين (ast headers)
- حذف shared/types/include/data_types.h (صفر مستهلك)
- الإبقاء على ValueType/runtime: toValueType/fromValueType/sadType*ValueType/inferSadType/isValueCompatible
- grep "Data::DataType|DataType::" في كل الكود (عدا الأرشيف) = 0
- بناء sad-run + sadc نظيف؛ P0 5/5 مزدوج

المحور الوحيد الآن SadTypeKind (50، مُولَّد من YAML). «الاستبدال الكامل» تحقّق.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P3 — Result<T,E> نوع جبري مطبَّق (لا enum ميت)

- SadResultType (على نسق SadOptionalType، بنوعين: okType T + errType E)
- SadTypeRegistry::makeResult(ok, err) + تصريح مسبق
- isAssignableTo: تغايُر Result<T,E> (نجاح/خطأ متوافقان) + المساواة البنيوية
- اختبار وحدة في test_type_bridge: البناء، استخراج الأنواع، المساواة، الإسناد (يمرّ)
- تنظيف P2.5b: إزالة قسم اختبار DataType المحذوف من test_type_bridge (كان يكسر البناء)
- test_type_bridge: 28/28 ✓؛ runner P0 = 5/5 مزدوج

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P4 (AC7) — isAssignableTo: عدم (Null) <: T?‎ + T <: T?‎

- فرع Optional في SadType::isAssignableTo يقبل الآن Null (وVoid مؤقتًا) كقابل
  للإسناد إلى T?‎ — تمهيد لأمان null (P9) والاختياري.
- بناء sad-run أخضر؛ test_type_bridge 28/28؛ runner P0 5/5 مزدوج.

ملاحظة نطاق: بقية P4 (سطح `رقم?` end-to-end + Future/Generator runtime) تتطلّب
تمثيل نوع أغنى في حقول الـAST (التي صارت SadTypeKind مسطّحة بعد P2.5a، فلا تحمل
النوع الداخلي لـOptional) + فضّ غموض الثلاثي — جهد معماري أعمق موثّق في status.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P4 (AC5) — سطح النوع الاختياري `رقم?` (مستوى الـkind)

- parseType: غلاف يستهلك لاحقة `?` بعد النوع الأساس → Optional (parseTypeCore = النواة)
  parseType في مواضع الأنواع فقط ⇒ لا غموض مع الثلاثي (AC6 محسوم بالسياق)
- sadKindToTypePtr + SadType::fromValueType: الأنواع المتقدّمة (Optional/Result/Future/
  Generator) → Any بدل الانهيار إلى Void (يمنع تحذيرات إسناد كاذبة لـ`رقم?`)
- اختبار 050_optional_type_suffix.ص: `رقم?`/`نص?` متغير+معامل + ?? — مفسّر PASS
  المترجم @skip_compiler موثّق (يُحلّل `?` لكن codegen يعامل Optional=I64، لا يميّز null)
- runner: قسم الأنواع 16/18 (الفشلان سابقان)؛ P0 5/5 مزدوج؛ test_type_bridge 28/28

ملاحظة: النوع الداخلي الغنيّ لـOptional<T> (عبر sadType) + Future/Generator runtime
+ سطح `؟` العربي — تبقى عملًا لاحقًا موثّقًا في status.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P9 — فرض أمان null في طبقة المفسّر (عدم ⊀ نوع غير اختياري)

اكتشاف الطبقة: الإنفاذ المرئي في المفسّر (statement_executor) لا المدقّق الدلالي
(الأخير لا يُفعَّل في sad-run). null يهرب من isAssignableTo، فالإشارة الموثوقة
value.isNull() (من P1).

- statement_executor: داخل فحص النوع (المحروس بـnode.type != Unknown)، إضافة فرع
  value.isNull() → تحذير أمان null لنوع مُصرَّح غير اختياري + اقتراح `نوع؟`
- الحارس الخارجي يحفظ النمط السائد `متغير = لاشيء` (مُستنتَج) — لا انحدار على الـ48
- Optional/Any/Void/Null مستثناة (لا إنذار كاذب)
- إرجاع تعديلات المدقّق الدلالي (طبقة خطأ) إلى أصلها
- اختبار 051_null_safety_enforcement.ص (مفسّر PASS)؛ P0 5/5 مزدوج؛ P1 106/108 (لا انحدار)

انحراف موثّق: الخطّة وضعت الإنفاذ في المدقّق؛ نُفِّذ في الطبقة الفعّالة (المفسّر).
AC3 (وصول غير آمن) + AC5 (كتالوج) يعتمدان P10/Optional الغنيّ — مؤجَّلان.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(types): نقد وتطوير (أميليا) — النوع الساكن لـliteral null = عدم + تنظيف بقايا DataType

تطوير 1 (ثغرة #4 من مراجعة أميليا): LiteralExpr لـLITERAL_NULL كان يُرجع
getVoid() — صُحِّح إلى getNull()، فالنوع الساكن للحرفية `لاشيء` = عدم (Null)
متمايز عن فراغ، متّسق مع Value::makeNull() وقت التشغيل.

تطوير 2: تنظيف 3 بقايا تعليقات تذكر DataType::UNKNOWN (المفهوم المحذوف) في
sir_builder.h + template_lambda_inference.cpp → الآن grep "DataType" في كامل
الشيفرة (عدا الأرشيف) = 0.

تحقّق: اختبارات null الثلاثة (049/050/051) تمرّ؛ P0 5/5 مزدوج؛ P1 107/108
(الـ3 سابقة) — لا انحدار.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P7 — interning للأنواع المركّبة (مقارنة مؤشر صحيحة)

- SadTypeRegistry::intern(t): cache بنيوي مفتاحه التوقيع البنيوي (arabicName)
  تحت قفل mutex_ (متّسق مع classTypes_)
- makeArray/makeMap/makeTuple/makeOptional/makeResult تمرّ عبر intern
  ⇒ المركّبات المتماثلة بنيويًّا تتشارك المؤشر، فمقارنة `==` المؤشرية صحيحة
- AC3 لا تسرّب: الـcache محدود بعدد التواقيع المتمايزة (مقصود، عمر السجلّ)
- اختبار test_composite_interning (مصفوفة/خريطة/اختياري) — test_type_bridge 47/0
- P0 5/5 مزدوج — لا انحدار

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(types): S-TS-P6 — تدقيق وتصنيف قيم enum (لا قيمة ميتة)

تدقيق grep لكل الـ50 قيمة في SadTypeKind عبر interpreter/compiler/shared/vm/tools:
- النتيجة: كل قيمة مُستهلَكة (الحدّ الأدنى 4 مواضع) — صفر قيمة ميتة، فلا إزالة (AC2)
- جدول تصنيف بالأرقام الفعلية في ARCHITECTURE_TYPE_SYSTEM.md (مُطبَّق/SIMD/بنيوي/واجهات)
- Vector(24) SIMD ليس ميتًا؛ Future/Generator مستهلَكان (runtime جزئي — P4)
- تصحيح: Null مُضاف (P1) لا «غير موجود»؛ النسختان (docs + _bmad) متطابقتان (P0-AC2)
- لا تغيير كود (لا وسم «ميت» مطلوب)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(grammar): مصدر حقيقة قواعد لغة ص + منظومة مطابقة مزدوجة (طبقة gr.program)

(AR) إضافة مصدر الحقيقة المعياري لقواعد اللغة (production rules) المنقوص من
language-truth/. مواصفة + تتبُّع للمُحلِّل اليدوي عبر maps_to، لا توليد للمُحلِّل.

- language-truth/grammar/: _notation.yaml + 00_program.yaml (4 قواعد نموذجية)
- _schemas/grammar_production.schema.json: مخطط قاعدة الإنتاج + conformance.test_budget
- scripts/codegen/check_grammar_conformance.py: فاحص بثلاث بوّابات
  (تغطية الميزانيات + تماسك الوسوم + تنفيذ مزدوج عبر runner.py)
- tests/behavior/rules_matrix/: بنية منطقة/قاعدة/فئة قابلة للتوسّع + 70 اختباراً
  لطبقة gr.program (basic/edge/negative/interaction) — كلها dual_ok 100%
- دمج في config.yaml (أقسام/مستويات) + _meta/_index.yaml
- الأدلة أثر بناء في build/_grammar_conformance.json (غير متتبَّع)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P11 — تسجيل أنواع الرسومات في SoT + إثبات التوسّع (Point/Rect)

- أنواع الرسومات (Color/Widget/Window/Event) مُسجَّلة أصلًا في types.yaml (AC1/2/3 ✓)
- AC4 إثبات التوسّع الحيّ: إضافة Point/Rect من types.yaml فقط → gen_types يولّدهما
  في SadTypeKind (52 قيمة) **دون لمس C++ يدويًّا**؛ بناء sad-run أخضر (default يعالجهما)
- إصلاح gen_types.py: إعادة ضبط ترميز stdout/stderr إلى UTF-8 (كان ✓ ينهار على
  cp1252 ويُفشِل خطوة codegen في cmake بـFATAL) — الآن «✓ 52 نوعًا» exit 0
- تحديث sad_type_system.h (50→52) + تحديث ARCHITECTURE شاملًا ليطابق الواقع
  (تصحيح ادّعاءات قديمة: Null موجود، Result مطبَّق، المدقّق موحَّد، الجسر بلا DataType)
- test_gen_types 6/6؛ P0 5/5 مزدوج — لا انحدار

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
test(types): S-TS-P5 — إحياء suite الأمان النوعي بتأكيدات حقيقية + بوّابات الجودة

- بدل الملف المؤرشف الضعيف (يطبع «pass» بلا تأكيد)، suite حقيقي بتأكيدات نوع():
  052_type_safety_regression.ص — مصفوفة البدائيات (رقم/عشري/نص/منطقي/مصفوفة/خريطة)
  + عدم (P1) + حفظ النوع + مساواة عدم + ترقية القسمة. 10 تأكيدات، مفسّر PASS.
- @skip_compiler موثّق (codegen لا يميّز null — فجوة P1/P4)
- status/05_quality_gates.md: أرقام حقيقية (test_type_bridge 47/47، gen 6/6،
  P0 5/5 مزدوج، P1 107/108) — لا أرقام وهمية (GR-01)
- runner قسم الأنواع: 052 PASS

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P8 — تسجيل ?./?? في SoT + علامة الاستفهام العربية ؟

- AC1: تسجيل op.null_coalesce (??) و op.optional_chain (?.) في operators.yaml
  (SoT-First — توثيق عوامل منفّذة أصلًا عبر كل الطبقات) + فضّ الغموض موثّق
- AC3: ؟ (U+061F) → QUESTION في المعجم (lexer_core scanToken) كمرادف `?`:
  • لاحقة اختياري `رقم؟`  • ثلاثي `أ ؟ ب : ج`  • اندماج `؟؟`  • وصول آمن `؟.`
  + إصلاح ماسح المعرّفات ليكسر على 0x9F (؟) فلا يبتلعها داخل `رقم؟`
- AC4: قاعدة فضّ الغموض (`T؟` موضع نوع مقابل `؟ :` تعبير) موثّقة في operators.yaml
- اختبار 053_arabic_question_operators.ص (مفسّر PASS)؛ @skip_compiler (codegen null)
- لا انحدار: P0 5/5 مزدوج، P1 (الـ3 سابقة)؛ معرّفات عربية + عوامل ASCII سليمة
- AC2 (`!!` مؤكَّد) مؤجَّل: عامل جديد كامل الطبقات + خطأ كتالوج (موثّق)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(types): S-TS-P4 — ربط نوع Future بالـruntime (نوع(مستقبل())=«مستقبل»)

- future_func (مستقبل()): يَسِم القيمة بـmakeFuture() عبر setSadType
- setSadType: Future/Generator → type_=OBJECT (يُبقي isObject()/فحص الطرق سليمًا
  لأن الـruntime يمثّلهما ككائن)؛ getKind()=Future عبر sadType_ → نوع() صحيح.
  Null → type_=Null (حفظ تمايز P1 بدل الإسقاط إلى Void)
- type_of: حالتا Future→«مستقبل»، Generator→«مولّد»
- اختبار 060_future_type_wiring.ص: نوع=مستقبل + .عيّن/.احصل=42 (مفسّر PASS)؛ @skip_compiler
- لا تراجع (مُثبَت بـgit stash): قسم التزامن 13/8 متطابق قبل/بعد؛ P0 5/5 مزدوج؛ P1 (الـ3 سابقة)
- Generator: يُجمَّع مصفوفةً (تقييم فوري) — وسمه يحتاج مولّدات كسولة (مؤجَّل)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(compiler): S-TS-P4/P8/P9 codegen-null — رفع @skip_compiler عن 4 اختبارات null

يجعل المترجم يطابق المفسّر في دلالة عدم (Null)، فترفع التكافؤ المزدوج:

- القيمة الحرفية «لاشيء» تُوسَم SadTypeKind::Null (لا Integer) مع إبقاء
  التمثيل i64 (الحارس kSadNullSentinel): حالة Null في مفتاح MOVE
  (expression_basic) + mapSIRType(Null)→i64. ⇒ نوع(لاشيء)=«عدم».
- type_of: حالة Null→«عدم» + وعي زمن-التشغيل بالحارس: قيمة i64 قد تحمل
  الحارس حتى لو كان نوعها الساكن «عدد_صحيح» (اختياري رقم؟ = لاشيء) →
  select(val==الحارس ? «عدم» : الاسم الساكن).
- حارس segfault في emitCmpEq: «لاشيء == نص» كان IntToPtr(الحارس)+strcmp
  ⇒ إسقاط؛ الآن يُرجع «خطأ» مباشرة (عدم لا يساوي نصًّا فعليًّا).

رُفِع @skip_compiler عن 049/050/051/053 (صارت تكافؤًا مزدوجًا).
052 يبقى متخطّى: فجوات منفصلة عن null (أسماء نوع() رقم/عدد_صحيح، خريطة، T8).

لا انحدار: التغيير مترجم-فقط (sad-run غير معاد البناء ⇒ كل FAIL_INTERP
غير متأثّر)؛ الاختباران ذوا سطح-null (X04/P09) يُظهران المفسّر=المترجم؛
المجموعة الكاملة 461: 420 نجاح (الإخفاقات سابقة: شبكة/تزامن متقطّعة + 039).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
refactor(types): توحيد أسماء نوع() عبر SoT — مصدر واحد للمحرّكين (يرفع 052)

كان كل محرّك يكتب أسماء الأنواع العربية كنصوص يدويّة مكرّرة، فتباينت:
المفسّر «رقم/عشري» مقابل المترجم «عدد_صحيح/عدد_عشري»، والمترجم لا يعرف
«خريطة» (→«مجهول»). الآن المصدر الوحيد هو types.yaml.

- types.yaml: حقل اختياري typeof_ar (اسم نوع() زمن التشغيل عند اختلافه عن
  word). أُضيف لـClass/Struct→«كائن» (word=صنف/بنية كلمتا التعريف) و
  Generator→«مولّد» (word=مولد). + المخطّط يسمح بالحقل.
- gen_types.py: يولّد inline sadTypeKindArabicName(SadTypeKind) من
  typeof_ar||word||«مجهول»، مُرمَّزة \xHH (UTF-8) لسلامة MSVC. + اختبار.
- المفسّر (builtins type_of) والمترجم (emitBuiltinTypeOf) يستدعيان الدالة
  المولَّدة بدل النصوص اليدوية — تطابق مضمون بين المحرّكين.

رُفِع @skip_compiler عن 052 (صار تكافؤًا مزدوجًا: T1..T10 متطابقة).

لا انحدار: الرغرسيون الكامل (461) — الفرق الوحيد عن التشغيل السابق هو
036_exception_concurrency_cross (لا يستخدم نوع()/مجهول، ينجح 5/5 منفردًا —
رفرفة تزامن تحت workers=8). تسمية الأنواع التي كانت «مجهول» لم تكسر أي
اختبار (الـ12 ملفًا التي تذكر «مجهول» تستخدمه كبيانات نصّية لا تأكيد نوع()).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(compiler): S-TS-P4 — وسم نتيجة مستقبل() بـFuture (نوع(مستقبل())=«مستقبل»)

create_future في المترجم كان يَسِم النتيجة Integer ⇒ نوع()=«رقم» بخلاف
المفسّر. الآن يَسِمها SadTypeKind::Future (التمثيل يبقى i64: معرّف المستقبل
عدد، mapSIRType(Future)→i64)، وإرسال الطرق (.عيّن/.احصل) يبقى عبر
className="__future__" مستقلًّا. ⇒ نوع() يطابق المفسّر.

رُفِع @skip_compiler عن 060_future_type_wiring (تكافؤ مزدوج).

لا انحدار: قسم التزامن — مستقبل() (060 + 093) ينجحان؛ الإخفاقات السبعة
كلّها goroutine/channel/mutex/waitgroup/stress (لا علاقة لها بـFuture،
متقطّعة timing تتراوح 7–8 بين التشغيلات).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
fix(grammar): الفاحص يمرّر --interp لا --interpreter إلى runner.py

(AR) runner.py يعرّف الوسم باسم --interp؛ تمرير --interpreter كان يُفشل
التنفيذ المزدوج بـexit=2. يتيح هذا تشغيل الفاحص من worktree على graphic
موجَّهاً لثنائيات مجلد آخر عبر --interpreter/--compiler.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
feat(grammar): استخراج طبقة الجمل 10_statements + 114 اختبار مطابقة (dual_ok 100%)

(AR) قواعد الجمل التنفيذية العشر من parser_statements.cpp مع تتبُّع maps_to:
إذا/بينما/لكل/طابق/حاول/ارمي/ارجع/توقف/استمر/تعبير.

- language-truth/grammar/10_statements.yaml: 10 قواعد إنتاج (مطابِقة للمخطط)
- tests/behavior/rules_matrix/10_statements/: 111 اختباراً (basic/edge/negative)
- 3 اختبارات تداخل شاملة تَمَسّ كل قواعد الجمل
- الفاحص: 14 قاعدة كلها dual_ok، 184/184 تمرّ في المفسر والمترجم 100%

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
fix(grammar): تصحيح تتبُّع gr.stmt.match + توثيق حدّ نطاق طبقة الجمل

(AR) مراجعة (Amelia) كشفت عيبين في 10_statements.yaml:
- gr.stmt.match: maps_to كان parseSwitchStmt/SwitchStmt خطأً؛ «طابق» يوزَّع فعلاً
  إلى parseMatchStmt (parser_advanced.cpp:553) ويُنتج AST::MatchStmt. صُحِّح
  maps_to + ast_node. (parseSwitchStmt هو لكلمة «حالة» — بناء شقيق منفصل.)
- توثيق حدّ النطاق: جمل أنتج/باستخدام/أجّل/أطلق/اختر يوزّعها parseStatement أيضاً
  لكنها تقع في 60_advanced.yaml لا هنا — أُضيفت ملاحظة صريحة في الترويسة.

اختبارات gr.stmt.match: 13/13 تمرّ مزدوجاً (الإصلاح بيانات-وصفية لا يمسّ التنفيذ).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
fix(grammar): تصحيح تتبُّع gr.program.block (maps_to + ast_node)

(AR) مراجعة (Amelia) لـ00_program.yaml:
- maps_to كان parser_main.cpp خطأً؛ parseBlockStmt في parser_statements.cpp:767.
- ast_node كان BlockStmtNode؛ العقدة الفعلية BlockStmt (statements.h:780).
الثلاث الأخرى صحيحة. اختبارات الكتلة 17/17 تمرّ مزدوجاً (إصلاح بيانات-وصفية).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
test(grammar): توسيع gr.stmt.if إلى 100 اختبار (حالات شاملة + تداخلات) — dual_ok

(AR) كنموذج مرجعي للتغطية الشاملة لكل قاعدة:
- 40 basic: كل عوامل الشرط (مقارنة/منطقي/حسابي/متغير/نص/دالة) فرعَي صحيح وخطأ
- 35 edge: تعشيش 2-4، سياقات (بينما/لكل/دالة/طابق/حاول)، سلاسل وإلا إذا 2-5،
  شروط مركّبة، فروع then/else، حلقات/توقف/استمر داخل إذا
- 10 negative: كتل بلا نهاية بمواضع مختلفة، وإلا/وإلا إذا في غير محلّها
- 15 interaction: إذا × (بينما/لكل/طابق/حاول/ارمي/ارجع/توقف/استمر/تعبير) في _interactions
رُفعت ميزانية test_budget لـgr.stmt.if. 100/100 تمرّ مزدوجاً (المفسر + المترجم).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
fix(types): إصلاح انحدار مطابقة `عندما لاشيء:` + تحذير معامل كاذب (مراجعة أميليا)

تصحيح: ادّعى commit 129a507 أن X04/P09 «يُظهران المفسّر=المترجم» — وهذا
غير دقيق؛ كانا يتباينان فعلًا (المفسّر يُخطئ نمط null). رصدته مراجعة أميليا.
السبب الجذري انحداران أدخلهما نظام الأنواع هذه الجلسة (لا codegen-null):

1) **نمط `عندما لاشيء:` كان يُبنى Void لا Null** —
   `parser_advanced.cpp:944` بنى النمط بـ`Data::Value()` (Void الافتراضي).
   بعد S-TS-P1 صار «عدم» متمايزًا عن «فراغ»، فلم يَعُد النمط يطابق المُسنَد
   «لاشيء» (Null) ⇒ `طابق(لاشيء) عندما لاشيء:` يسقط للافتراضي.
   الإصلاح: `Data::Value::makeNull()`. والمترجم: `sir_builder_match_patterns`
   يقبل الآن `Null || Void` (كان `Void` فقط) فلا ينكسر بالتغيير.

2) **تحذير نوع كاذب على معامل غير مُصرَّح** —
   `expression_evaluator_calls_user_func.cpp`: المعامل بلا تعليق نوع نوعُه
   القديم Unknown لكن sadType يُشتقّ منه = Void، فأُطلق تحذير على كل وسيط
   غير-فراغ. الإصلاح: لا تحذير إلا لمعامل مُصرَّح صراحةً (type != Unknown،
   والنوع ليس Void/Any).

3) تنظيف: `arabic_string_pool.cpp` كان يُمهّد «عدد_صحيح/عدد_عشري» الميتة —
   بُدّلت إلى «رقم/عشري» (أسماء نوع() الموحَّدة).

التحقّق (مفسّر Debug مُعاد بناؤه — الrunner يقرأ Debug لا Release):
X04/P09 صارا تكافؤًا مزدوجًا؛ المجموعة 461 → 422 نجاح/39 فشل (كان 420/41)؛
الفرق = هذان الاختباران فقط، لا انحدار آخر.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
test(grammar): توسيع gr.stmt.while إلى 100 اختبار شامل + تداخلات — dual_ok

40 basic (عدّ/تنازل/خطوات/تراكم/شروط منطقية/لا-تكرار) + 35 edge (تعشيش/توقف/
استمر/طابق/حاول/دوال/إرجاع) + 10 negative (كتل بلا نهاية) + 15 interaction
(بينما × بقية قواعد الجمل). 100/100 تمرّ مزدوجاً.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
test(grammar): توسيع gr.stmt.for إلى 100 اختبار شامل + تداخلات — dual_ok

40 basic (طباعة/تراكم/تحويلات/مصفوفات متنوّعة) + 35 edge (تعشيش/توقف/استمر/
طابق/حاول/دوال/إرجاع/بينما-داخلية) + 10 negative + 15 interaction. 100/100 مزدوج.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
test(grammar): توسيع gr.stmt.match إلى 100 اختبار شامل + تداخلات — dual_ok

40 basic (اختيار حالات/افتراضي/نصوص/تعابير محسوبة/حالات كثيرة) + 35 edge
(تعشيش/حلقات/دوال/إذا داخل حالة/إرجاع) + 10 negative + 15 interaction.
أنماط حرفية + افتراضي (الأنماط المتقدمة في gr.pattern). 100/100 مزدوج.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* test(grammar): توسيع gr.stmt.expression إلى 100 اختبار + تداخلات — dual_ok

40 basic + 35 edge + 10 negative + 15 interaction.
اكتشافات موثَّقة أثناء التأليف:
- المُحلِّل يتعافى من قوس إغلاق مفقود (ليست حالة خطأ) فاستُبدل السلبيّ بوسيط ناقص حقيقي.
- 9 من 10 سلبيات تُخطئ فعلاً (فحص فردي). 100/100 تمرّ مزدوجاً.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(grammar): تقرير Markdown مقروء لمقارنة المفسر/المترجم + قسم التباعدات

(AR) إضافة --report-md للفاحص: يكتب تقريراً بشريّاً دائماً يُظهر لكل قاعدة نتيجة
المقارنة المزدوجة (مفسر≡مترجم)، وقسماً صريحاً للتباعدات/الإخفاقات مع مخرجَي
المحرّكين جنباً إلى جنب — هكذا «نعرف الاختلافات لنصحّحها».
أُرفقت لقطة CONFORMANCE_REPORT.md: 614 اختباراً، 0 تباعد، 14 قاعدة مطلقة.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(grammar): سجل المشاكل المكتشفة + تطوير التقرير (أزمنة + تفصيل كل اختبار)

(AR) استجابةً لطلب التتبّع الكامل:
- DISCOVERED_ISSUES.md: سجل يدوي للثغرات/السلوكيات المكتشفة أثناء التأليف
  (طريقة .اضف تفشل، مدى تحتاج استيراد، تساهل أسماء، تعافي الأقواس...).
- تطوير الفاحص: التقرير الملخّص يضيف زمن المفسر/المترجم الكلي والمتوسط؛
  وتقرير تفصيلي CONFORMANCE_REPORT_detail.md يسرد كل اختبار (رقم/اسم/قاعدة/
  فئة/حالة المقارنة/زمن المفسر/زمن المترجم) — كل معلومة عن كل اختبار.
لقطة: 614 اختباراً، 0 تباعد، مفسر 24.6s ومترجم 489.9s.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(grammar): اختبارات كاشفة للثغرات (grammar_gaps) + قسم ثغرات في التقرير

(AR) منطقة tests/behavior/grammar_gaps منفصلة عن البوّابات (لا تُفشِل البناء)
تتعمّد اختبار ميزات مشكوكة وتُظهر الفاشل صراحةً. 8 كاشفات: 5 تكشف ثغرة، 3 تعمل.
- يكشف ثغرة: .اضف (ISSUE-001)، مدى بلا استيراد (ISSUE-002)، تساهل اسم محجوز
  (ISSUE-005)، ارجع بالأعلى (ISSUE-004)، .تقسيم نص (ISSUE-007 جديد).
- يعمل (تحقّق): .الطول() مصفوفة، .يحتوي() نص، مدى مع استيراد.
- الفاحص يشغّلها منفصلاً ويضيف قسم «اختبارات كاشفة للثغرات» للتقرير.
- تحديث DISCOVERED_ISSUES (ISSUE-007 + حصر ISSUE-001 في .اضف).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test(grammar): توسيع الكاشفات إلى 23 + كشف تباعد مفسر/مترجم (ISSUE-013)

(AR) 23 اختباراً كاشفاً (كان 8) عبر طرق المصفوفات/النصوص/الخرائط/تعابير متقدمة.
النتيجة: 10 تكشف ثغرة، 13 تؤكّد عمل ميزة.
- ثغرات جديدة: .اول (008)، .قص_أطراف (009)، طرق الخريطة .عيّن/.احصل (010)،
  النشر ... (012)، و**ISSUE-013**: .احذف_اخير تعمل في المفسر (طول=2) لكنها
  عملية فارغة في المترجم (طول=3) — تباعد كشفته المقارنة المزدوجة وحدها.
- عاملة مؤكَّدة: .عكس/.رتب/.خريطة/.رشح/.فهرس/.آخر، .يبدأ_بـ/.استبدل/.تحويل_كبير،
  خريطة حرفية+فهرسة+إسناد+.مفاتيح، فهرسة متداخلة، مدى مع استيراد.
البوّابات المُبوَّبة تبقى خضراء (614/614)؛ الكاشفات غير مُبوَّبة.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test(grammar): توسيع الكاشفات إلى 40 + 5 ثغرات جديدة (3 فجوات مترجم)

(AR) إضافة كاشفات للميزات المتقدمة. النتيجة: 40 كاشفة — 16 تكشف ثغرة، 24 تعمل.
فجوات مترجم جديدة (تعمل في المفسر، تفشل ترجمتها) — كشفتها المقارنة المزدوجة:
- ISSUE-016 استيعاب القائمة · ISSUE-017 استيعاب الخريطة · ISSUE-018 .مسطح()
ثغرات مفسِّر جديدة: ISSUE-014 تفكيك التصريح · ISSUE-015 .استخراج().
عاملة مزدوجاً مؤكَّدة: لامدا/إغلاق/أنبوب/اختزل/لكل/tuple/شريحة/فهرسة سالبة/
نمط نطاق 1..10/تحويل_صغير/خريطة قيم وحجم. البوّابات تبقى 614/614 خضراء.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* test(grammar): توسيع الكاشفات إلى 62 (OOP/تزامن/متقدمات) + 3 ثغرات جديدة

(AR) 62 كاشفة — 19 تكشف ثغرة، 43 تؤكّد عمل ميزة.
ثغرات جديدة: ISSUE-019 الأساس(super) · ISSUE-020 الجنيسات <ت> · ISSUE-021 async/await.
عاملة مؤكَّدة مزدوجاً (جديد): صنف كامل/وراثة/بنية/تعداد/سمة+نفّذ/ساكن/عامل+/خاصية،
قناة/اختر/مجموعة_انتظار، أجّل/ماكرو/امتداد/يتطلب/يضمن/@حجم.
تصحيح أوراكل: defer (سطرا @expected بدل \n مكسور). البوّابات 614/614 خضراء.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(grammar): استخراج طبقة التصريحات 20_declarations (~300 اختبار) + 8 ثغرات

(AR) 7 قواعد: متغير/إشارة-نوع/دالة/معاملات/استيراد/تصدير/خارجي — متتبَّعة maps_to.
~300 اختبار مزدوج (variable/function 85 لكل + parameters 40 + import 24 + export 12
+ extern 9 + تداخلات 41) — 100%. الإجمالي المُبوَّب 912 اختباراً، 21 قاعدة مطلقة.

ثغرات جديدة (السجل=25): ISSUE-022 معامل متغير ... · 023 نوع إرجاع -> · 024 من...استورد ·
025 فجوة مترجم: دالة تُرجع خريطة (مفسر 1/مترجم فراغ) · 026 فجوة مترجم: صدّر بنية ·
027 الاسم حساب · 028 تظليل الكتلة لا يعزل · 029 تساهل دالة بلا أقواس.
المنهج: التباعدات/الفجوات نُقلت إلى grammar_gaps (67 كاشفة، 23 تكشف ثغرة) لا أُخفيت.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(grammar): قاعدة «الصفة بعد الموصوف» في تصريح المتغير + 4 ثغرات

(AR) تصحيح إغفال (ملاحظة المستخدم): المتغير يقبل مُعدِّلات بعد الكلمة المفتاحية:
«متغير ثابت ص = 10»، «متغير عام/خاص/ساكن س». حُدِّثت gr.decl.variable
(EBNF + alternatives + وصف + مراجع عام/خاص/محمي) وأُضيفت اختبارات عاملة
(متغير ثابت رقم، متغير ساكن عام، متغير محمي داخل صنف).

ثغرات مكتشَفة (نُقلت إلى grammar_gaps، لم تُخفَ):
- ISSUE-032 فجوة مترجم: «متغير <صفة> ص» بلا نوع بالمستوى الأعلى → مفسر يُرجع القيمة،
  مترجم فراغ (يعمل مع نوع/داخل صنف).
- ISSUE-030 «متغير ثابت» لا يمنع إعادة الإسناد.
- ISSUE-031 «متغير ثابت عام» يفشل (بينما «متغير ساكن عام» يعمل).
الإجمالي: 915 مُبوَّب 100% مزدوج، 73 كاشفة (29 تكشف ثغرة)، السجل 28 قضية.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* @
docs(type-system): تطوير مهارة sad-lang-dev + توثيق نهائيّ + تتبّع _bmad-output في git

ثلاث مهامّ:

1) مهارة sad-lang-dev — تحديث نظام الأنواع للحالة النهائية:
   - references/types-and-sir.md: حذف إشارات DataType (محذوف كليّاً)، توضيح
     SadTypeKind مُولَّد من types.yaml (52 قيمة)، علاقة type_/sadType_/getKind/
     setSadType/makeNull، Null متمايز، Future/Generator، أنواع الرسوميات،
     توحيد نوع() عبر typeof_ar، codegen-null.
   - references/architecture.md: تصحيح فقرة Value/DataType البائدة.

2) توثيق نظام الأنواع (_bmad-output/systems/type-system):
   - README.md: إعادة كتابة كاملة (كان خطّة UTM v3 ديسمبر 2024 بائدة لا تصف النظام) →
     فهرس + نظرة عامة دقيقة (P0–P11، الدمج، نقاط التكامل، الأنظمة ذات الصلة).
   - docs/ARCHITECTURE_TYPE_SYSTEM.md: تحديث رأس التحقّق (Future مربوط + codegen-null + الدمج).
   - status/FINAL_REPORT_2026-06-15.md: تقرير نهائيّ جديد (الفجوات المُغلقة + التحقّق المدموج).
   - docs/تقرير_تكامل_SadUI_مع_نظام_الأنواع_الموحد.md: تقرير تكامل SadUI (عناصر = كائنات).

3) git: جعل _bmad-output كله متتبَّعًا (استثناء !/_bmad-output/ بعد قاعدة /_* الجامعة في
   .gitignore) — 423 ملف حوكمة BMAD صار محفوظًا في المستودع.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(type-system): خرائط بصرية غنيّة لتدفّق نظام الأنواع ومساره (Mermaid)

وثيقة جديدة خرائط_نظام_الأنواع_البصرية.md — 9 مخططات Mermaid تصف الواقع الحاليّ:
- الصورة الكبرى: types.yaml → التوليد → المحرّكين
- مسار الكود: نصّ .ص → معجمي → نحوي → AST → {مفسّر | مترجم SIR→LLVM}
- Value: تمثيلا type_/sadType_ وgetKind()
- عائلة SadTypeKind (52) مُصنَّفة (mindmap)
- هرمية أصناف SadType (classDiagram)
- SadTypeRegistry: التجميع والمصانع
- تدفّق نوع() عبر typeof_ar (sequence)
- تدفّق null/الاختياريّ (P9 + ?./??)
- خريطة الملفات (أين أعدّل ماذا)

وصفٌ للواقع الموجود فقط (لا تاريخ تغييرات) ليفهم المطوّر النظام كاملًا. مربوطة من README.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): فحص عميق لنظام الرسومات SadUI (تقرير أميليا — قياس ساكن GR-01)

DEEP_DIVE_2026-06-15.md — فحص أميليا القائم على الأدلّة (ملف+سطر) للواقع الحاليّ
استعدادًا لبدء تطوير SadUI. أبرز ما يُصحّح ادّعاءات status 06-08:
- W15-01 (نوع العنصر=«كائن») معالَج كوديًّا عبر توحيد الأنواع (استنتاج ساكن)
- جديد <واجهة_تصريحية> يعمل في الكود (لا SEM001) — visitUIDeclaration + UIStateManager
- المترجم له مسار UI كامل (SIR + 504 سطر LLVM + 539 سطر runtime) — يناقض EPIC-UI-W15
- تباين: المحلّل يفرض 15 عنصرًا بينما UINodeType ~90 والمولّدات تنتج خارج الـ15
- خانات SoT الرسوميّة معرّفة لكن غير مستعملة (العنصر يبقى Class)
- تقادم أرقام: المُهمل 44 لا 55+؛ ستّ منصّات لا أربع؛ أندرويد 3618 لا 903

كل «سلوك» مُميَّز عن «وجود الكود»؛ التوصية P0: تحقّق وظيفيّ (بناء + test_event_system.ص).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): تحقّق وظيفيّ P0 لـSadUI — يُصحّح استنتاجات التقرير الساكن

FUNCTIONAL_VERIFICATION_2026-06-15.md — بناء + تشغيل فعليّ (لا قياس ساكن).
البوّابة الوظيفية كشفت أنّ نقطتين في تقرير أميليا الساكن لا تصمدان للتشغيل:

- W15-01 غير محقَّق: نوع(زر()) = «أي» (Any) لا «كائن» — قيمة العنصر getKind()=Any
  لأن sadType_ لا يُضبط إلى Class (الاستنتاج الساكن WidgetBuilder:ObjectInstance⇒Class خطأ عمليًّا).
- جديد <واجهة> + الأحداث: test_event_system.ص يفشل — SEM001 «هذا» غير معرَّف
  داخل طرق الواجهة (الجسر المفسّر↔واجهة ما زال ناقصًا وظيفيًّا).

ثبت إيجابًا: تسجيل العناصر كسولًا عند «استورد رسومات» يعمل؛ النحو يقبل واجهة/@حالة/دالة بناء().
فجوتان P0 موثّقتان بالدليل المُشغَّل. الدرس: «وجود الكود» ≠ «سلوك مُثبَت».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): توسيع التحقّق الوظيفيّ لـSadUI — خريطة 8 نقاط مُشغَّلة + تصحيح

تشغيل حقيقيّ متعدّد النقاط (طلب المستخدم: تشغيل رسومات فعليّة لقياس الفجوة):
- 🎨 إيجابيّ: تشغيل_تطبيق() ينشئ نافذة فعليّة 800×600 (SDL2) — محرّك الرسم حيّ
- الأحداث (لامدا في معدّل) + تداخل الأبناء + 14/15 عنصرًا: تعمل
- 🔴 P0: نوع() = «أي» لكل كائن (نقطة(5) و زر() معًا) لا «كائن» — وسم قيمة الكائن
  (أعمّ من العناصر؛ W15-01 فرعٌ منه)
- 🔴 P0: واجهة تصريحية غير قابلة للإنشاء (عدّاد() → SEM004)
- 🟠 P1: قائمة_كسولة غير مُسجَّلة · نص() يُرجع سلسلة لا عنصرًا · لا تحذير إهمال

تصحيح ذاتيّ: بعض إخفاقات الصيغة الأولى (جديد/=>) كانت أخطاء صياغة منّي لا فجوات نظام
(جديد ليس كلمة مفتاحية؛ الإنشاء بنداء الاسم؛ لامدا() ... نهاية) — صُحِّحت بعد التحقّق من
اختبارات OOP/لامدا الناجحة. الدرس: وجود الكود ≠ سلوك مُثبَت.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): نقطتان إضافيتان في التحقّق الوظيفيّ (المترجم + المُهملة)

- 🔴 P0 جديدة: sadc لا يترجم برامج «استورد رسومات» — رسومات.ص:66 فيه «صدّر *»
  المجرّد (تصدير كل الوحدة بلا «من») يرفضه محلّل المترجم (يدعم «صدّر * من X» فقط).
  برامج عاديّة + «استورد رياضيات» تُترجَم بنجاح ⇒ الفجوة رسومات-خاصّة (فجوة محلّل عامّة).
  الأثر: SadUI يعمل في المفسّر فقط، لا يُترجَم — مولّدات UI في المترجم غير قابلة للوصول.
- ✅ 8/8 عناصر مُهملة تعمل (شريط_تطبيق/حوار/خانة_اختيار/زر_عائم/هيكل/بطاقة/سطح/صندوق).

المجموع: 3 فجوات P0 (وسم الكائن · إنشاء الواجهة · ترجمة UI) + 3 فجوات P1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): تصحيح صيغة OOP (باني لا __تهيئة__) + حسم ثقة فجوات P0

بعد قراءة الكود + مثال 034_complex_oop الناجح (طلب المستخدم: اقرأ الكود/القواعد):
- المُنشئ = باني(...) لا __تهيئة__؛ الحقول متغير عام؛ جديد لاحقة اختيارية
  (البادئة لا تعمل رغم docs/قواعد:780 — تعارض وثيقة↔كود).
- شفافيّة: عدّة إخفاقات أولى كانت صياغتي الخاطئة لا فجوات نظام؛ أُعيد التحقّق بالصيغة الصحيحة.

حسم الثقة:
- 🔴 P0 #1 (نوع(كائن)=«أي» لا «كائن») **مؤكَّدة قطعيًّا**: نقطة بباني صحيح يعمل (ن.س=5)
  ومع ذلك نوع(ن)=«أي» — مستقلّ عن جديد. أوثق فجوة.
- 🔴 P0 #3 (sadc يفشل على استورد رسومات بسبب صدّر * المجرّد) صلبة مستقلّة عن الصيغة.
- 🟡 P0 #2 (واجهة غير قابلة للإنشاء) خُفِّضت إلى «مُرجَّحة لا قطعيّة» — لا مثال واجهة عامل
  للقياس؛ قد تكون صيغة الإنشاء مختلفة. تحتاج صيغة قانونيّة للحسم.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): حسم فجوة الواجهة P0 — مؤكَّدة بالتحقيق العميق (قراءة كود + عزل)

سلسلة أدلّة قاطعة لفجوة «واجهة غير قابلة للإنشاء»:
- واجهة عداد → parseUIDeclaration (parser_main.cpp:762) → UIDeclarationNode
- accept يستدعي visitUIDeclaration (ui_nodes.h:609) والمفسّر يطبّقها وتسجّل المكوّن
  كصنف isUIComponent (statement_executor_oop_struct_test.cpp:503-580)
- ومع ذلك: عداد()→SEM004، عداد() جديد→getClass=null (oop_new.cpp:127,143)
- عزل حاسم: صنف سيارة عاديّ بنفس الملف يُنشأ (سيارة:تويوتا) بينما عداد لا —
  مع/بدون استيراد، أبسط واجهة صحيحة ⇒ ليست صياغتي
- اعرض عداد أيضًا لا يعمل (اعرض غير معرّف)

الحكم: فجوة نظام مؤكَّدة — المكوّن غائب عن ClassManager وقت الإنشاء رغم مُسجِّل موصول.
السبب الدقيق (ترتيب الرفع/المعالجة) يحتاج بناءً مُجهَّزًا بآثار طباعة للحسم.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): فحص المترجم (sadc) — تباعد تكافؤ في وسم الكائن يُحدّد الإصلاح

فحص المترجم (طلب المستخدم: ماذا عن المترجم بعد المفسّر):
- البدائيّات: نوع() مطابق تمامًا بين المحرّكين (رقم/نص/منطقي/مصفوفة)
- 🔑 الكائن: نوع(نقطة(5)) = المفسّر «أي» (خطأ) مقابل المترجم «كائن» (صحيح) ⇒ تباعد
  تكافؤ مزدوج. فجوة P0 #1 خاصّة بالمفسّر — المترجم يَسِم الكائن Class (المرجع الصحيح).
  يُحدّد الإصلاح بدقّة: وسم قيمة الكائن في المفسّر (getKind=Any بدل Class).
- واجهة: التحليل يُقبَل في المترجم؛ الإنشاء يفشل في الاثنين
- استورد رسومات: يفشل في المترجم (صدّر * المجرّد) — UI غير قابل للترجمة

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* fix(ci): توجيه codegen-check إلى مصدر V5 + وسائط مُسمّاة

(AR) سير عمل codegen-check كان يستدعي gen_keywords.py بوسائط موضعية بينما
السكربت يتطلب --yaml/--schema/--header/--source، ويولّد من data/language
(نسخة 4.1 قديمة) بدل language-truth (V5/5.0 — مصدر الحقيقة الفعلي). صُحِّح
ليطابق الملف المولَّد المُودَع (5.0) فلا انجراف، وأُضيف graphic لفروع الـPR.
انجراف سابق غير متعلّق بعمل القواعد؛ كان يمنع الدمج.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* @
docs(ui-system): مخططات Mermaid في STRATEGY + وثيقة معمارية موحّدة بصرية لـSadUI

- STRATEGY.md: أُضيفت مخططات Mermaid (طبقات L0–L5 + مسار البيانات + التكامل)
  بدل/إضافةً إلى صناديق ASCII الصعبة القراءة؛ وتحديث سطر التكامل لتباعد نوع() المُثبَت.
- جديد: docs/المعمارية_الموحدة_لنظام_الرسومات.md — 9 مخططات Mermaid غنيّة:
  الطبقات الستّ · مسار البيانات (.ص→شاشة) · الباطن متعدّد المنصّات · تمثيل العنصر
  (WidgetBuilder/UINodeType + تباعد getKind) · كتالوج 15+المُهمَل · الحالة التفاعلية
  (sequence) · التكامل · خريطة الجاهزية (مُثبَت بالتشغيل) · خريطة الملفات.

وصفٌ للواقع الموجود، سهل الفهم بالمخططات المرئية. مربوط بتقارير التحقّق.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* @
docs(ui-system): فهرسة README — ربط المعمارية الموحّدة + تقارير التحقّق + تصحيح

- «ابدأ هنا» (ترتيب قراءة): المعمارية الموحّدة بالمخططات → STRATEGY → التحقّق الوظيفيّ → الفحص العميق
- ربط الوثائق الجديدة: المعمارية_الموحدة · FUNCTIONAL_VERIFICATION · DEEP_DIVE
- إضافة docs/ إلى بنية المجلد
- تصحيح: test_event_system.ص ليس مثالًا عاملًا (يفشل — جديد بادئة + نوع=="object" + فجوة الواجهة)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@

* feat(grammar): توحيد مصدر قواعد المحلل + مولّد توثيق (104 قاعدة، 8 طبقات)

استخراج قواعد لغة ص من المحلل (الكود هو الحقيقة) إلى مصدر موحَّد في
language-truth/grammar/، مدموجًا مع نسخة dev للطبقات 00/10/20 دون مسّها.

- طبقات جديدة: 30_oop, 40_expressions, 50_patterns, 60_advanced, 70_lexical
- إضافات لـdev: gr.decl.arg_list (في 20)، gr.stmt.switch (في 10)
- مولّد scripts/codegen/gen_parser_grammar_docs.py (YAML→Markdown):
  BNF + تفصيل بدائل + مسار maps_to ⇒ AST + مخطّط مسار الدوال + مخطّط بنية + روابط يستدعي/مُستدعى
- التوثيق المُولَّد في docs/parser_rule/_generated/ (مُولَّد — لا يُحرَّر يدويًّا)

تحقّق: المخطّط VALID للـ104 قاعدة، المراجع محلولة، maps_to 110/110،
215 مخطّط Mermaid يُصيَّر، conformance بوّابة التماسك ② سليمة.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* chore(skill+protection): توجيه فرع dev في مهارة sad-lang-dev + توثيق حماية dev

- sad-lang-dev SKILL.md + references/workflow.md: قسم سير عمل الفروع §5
  (worktree من dev + إيداع موقّع GPG + دمج عبر PR) + قاعدة صارمة.
- BRANCH_PROTECTION_POLICY.md: توثيق Ruleset حماية dev (17779574، مثل graphic).
- ruleset-dev-protection.json: تكوين حماية dev.

ملاحظة: أُودِع مباشرةً على dev — هذه التعديلات سبقت إرساء مسار الـPR.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* docs(ui_system): تقرير مسار الكود + ربط الحوكمة بـRFC-0001/Issue#2 (#61)

- إضافة CODE_PATH_REPORT_2026-06-17.md (مسار الكود + 5 مخططات + كتالوج العناصر 15/44)
- ربط ROADMAP وimplementation_status بـRFC-0001 (sadlang/rfcs#1) وتتبُّع Issue#2
- توثيقي فقط بلا ادعاء إنجاز (GR-01)؛ الجذور السطرية للفجوات موثّقة

Co-authored-by: Sad Lang Dev <admin@sad-lang.dev>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* build: توحيد أسماء أهداف البناء (sad-run/sad-build) وإصلاح بناء المترجم في Debug (#63)

تنفيذ RFC «توحيد أسماء أهداف البناء»: يوحّد اسم هدف CMake مع اسم مخرجه لكلتا
الأداتين، ويُصلح جذريًا بناء المترجم في وضع Debug، ويحدّث أدوات الاختبار.

## إعادة التسمية (هدف = مخرج)
- المفسّر: الهدف `sad` → `sad-run` (المخرج sad-run.exe)
- المترجم: الهدف `sadc` → `sad-build` (المخرج sad-build.exe)
- تحديث كل المستهلكين: cmake (executables/dual_tests/doc_gen/tests/
  tests_comprehensive/install)، CI، التوزيع، الوثائق، والسكربتات.
- إزالة اسم `sadc.exe` البائت (لا يُنتجه أيّ هدف) من runner.py وconfig.yaml
  ومسارات اختبار CI — هذا يُزيل عثرة «الثنائي البائت» الموثّقة.

## إصلاح بناء المترجم في Debug (cmake/llvm.cmake)
السبب الجذري كان متعدد الطبقات؛ حُلّ بالكامل:
1. ABI: مسار بحث الرابط لـLLVM صار مُدرِكًا للتهيئة (Debug→LLVM-Debug،
   غير ذلك→Release) عبر link_directories بـgenerator expression — يمنع
   تعارض _ITERATOR_DEBUG_LEVEL/RuntimeLibrary.
2. تسرّب Release: sad_llvm_backend كان يربط LLVM Release بمسارات كاملة
   PUBLIC؛ صار يستعمل ${LLVM_LIBS} الموحَّد (مصدر حقيقة واحد، DRY).
3. الاكتمال + مضاد التسرّب: تُسرَد كل مكتبات LLVM في مجلد Debug بالأسماء
   المجرّدة (تُحَلّ عبر مجلد بحث واحد لكل تهيئة) بدل إغلاق llvm_map الذي
   يُسقط حواف التوكيدات الخاصة بـDebug.
4. استثناء LLVM-C.lib (مكتبة استيراد ديناميكية) لتفادي اعتماد DLL وقت
   التشغيل (0xC0000135).
5. إضافة مكتبات نظام Windows (ws2_32 وغيرها) التي تعتمدها LLVM.
+ مجموعة إعادة سرد (مكافئ --start-group) للإشارات العكسية الدائرية.

## التحقق
- sad-run (Debug) + sad-build (Debug 117MB، Release 89MB): بناء بصفر أخطاء.
- مترجم Debug يترجم ويشغّل .ص فعليًا (3+5=8) بلا اعتماد LLVM-C.dll.
- runner P0: 5/5، تكافؤ مزدوج 100% (مفسّر+مترجم) بالأسماء الجديدة.
- توحيد تهيئة runner على Debug — يُزيل عثرة «مفسّر Debug + مترجم Release».

Co-authored-by: Sad Lang Dev <admin@sad-lang.dev>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* ci: تفعيل CI على dev + إصلاح بناء Windows/Linux عبر المنصّات (#64)

* ci: تفعيل CI على فرعَي التكامل dev/graphic (وagent/** للتحقق)

كانت محفّزات pull_request في ci.yml تستهدف develop/main فقط، فلم يُجرِ CI أيّ
فحص على PRs إلى dev (فرع التكامل المحميّ الفعلي). إضافة dev وgraphic لمحفّزات
PR والpush، وagent/** للpush ليُختبَر CI على فروع الوكلاء قبل الدمج.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* ci+fix: إزالة macOS، تثبيت Windows على VS2022، وإصلاح بناء Linux (GCC)

تفعيل CI على فرع dev كشف إخفاقات سابقة على المنصّات (لم يكن CI يعمل على dev).
عولجت بالكامل، مع اختبار بناء Linux محليًا في WSL (g++ 13.3) قبل الدفع:

## CI
- إزالة وظيفة/مدخلات macOS من ci.yml + build-all-platforms.yml + release.yml
  (المشروع لا يُبنى لـmacOS) مع تنظيف كل مراجع needs/الملخّص/الحزم.
- تثبيت runner ويندوز على windows-2022 (يضمن مولّد «Visual Studio 17 2022»؛
  windows-latest انتقل لصورة بلا VS2022 ⇒ "could not find any instance of VS").

## إصلاحات بناء Linux/GCC (كانت تعمل على MSVC فقط)
- network/sadnet/crypto/sha256.cpp: سمة __attribute__((target("sha,sse4.1,
  ssse3"))) لدالة SHA-NI — GCC يتطلبها لترجمة intrinsics دون -msha عام.
- network/sadnet/crypto/aes_gcm.cpp: #pragma GCC target("aes,pclmul,sse4.1,
  ssse3") لكامل وحدة الترجمة لتعليمات AES-NI/PCLMUL.
- sad_ui/reactive/binding_compiler.cpp: cast صريح لـint64_t حول std::stoll
  (غموض بناة على Linux LP64 حيث int64_t=long).
- interpreter/.../builtin_module_math.cpp: إضافة #include <thread> لـ
  std::this_thread (لا يُضمَّن ضمنيًا على GCC).
- shared/builtins/runtime/{builtins,other_functions}.cpp: إخراج
  #include "builtin_error.h" من كتلة _WIN32 (Sad::Errors يُستعمل دون شرط منصّة).

التحقق: بناء sad-run في WSL يكتمل بصفر أخطاء ويعمل («42»). إصلاحات GCC مؤكَّدة
بترجمة g++ 13.3 (نفس CI). لا أثر على سلوك Windows (المسارات نفسها).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(linux): إصلاحات بناء GCC إضافية كشفها بناء all في WSL

- network/sadnet/dht/dht_engine.cpp: #include <condition_variable> لـ resp_cv.
- tools/hub/help_renderer.cpp: #include <cstdint> لـ SIZE_MAX.
- tools/apk_builder/apk_builder.cpp: إخراج #include <algorithm> من كتلة _WIN32
  (std::replace يُستعمل دون شرط منصّة).

كلها «تعمل على MSVC، تفشل على GCC» (تضمين ضمنيّ/عابر لا يوفّره GCC). تحقّق ببناء
كل الأهداف في WSL (g++ 13.3) بصفر أخطاء عدا ملفات مسار LLVM (LLVM OFF محليًا —
يُغطّيها CI بـLLVM ON).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): إصلاح اختبار Linux وحارس الملفات اليتيمة على Windows Debug (LLVM off)

- tests/.../test_compiler_comprehensive.cpp: #include <cstring> لـ strlen (GCC).
- cmake/orphan_sources_guard.cmake: استثناء compiler/src/backend/ من فحص اليتامى
  عند ENABLE_LLVM_BACKEND=OFF — مصادر مولّد LLVM لا تُضاف لأيّ هدف شرعًا حينها
  (كان الحارس يفشل تكوين Windows Debug حيث لا يتوفّر LLVM Debug).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): حزم Python للتوليد + إصلاحات GCC إضافية + تعطيل اختبار UI ميّت

## CI: حزم Python للتوليد (sad_check_codegen_env)
- ci.yml: تثبيت pyyaml + jsonschema في وظيفتَي Windows و Linux قبل البناء —
  هدف sad_check_codegen_env يستوردهما، وفشلهما كان يُسقط البناء (MSB8066).

## إصلاحات بناء Linux/GCC إضافية
- tools/check/src/main.cpp: تأهيل ::isatty/::fileno الصريح (POSIX).
- stdlib/نص/arabic_string_pool.hpp: حصر عامل الحرفية المُعرَّفة بلاحقة عربية
  (operator""_مُدار) بـ MSVC — GCC/Clang لا يدعمان UDL بلاحقة غير ASCII. العامل
  غير مستعمَل (0 استدعاء) فالحصر آمن.

## تعطيل اختبار ميّت
- cmake/tests_comprehensive.cmake: تعطيل test_ui_comprehensive — يضمّ مجلدًا/رأسًا
  محذوفين (compiler/src/sir، sir_opcodes.h) ويستعمل أوبكودات UI أُزيلت
  (Opcode::UICreateWidget…). كود غير قابل للترجمة يختبر وظائف محذوفة.

تحقّق Linux ببناء WSL (LLVM ON + TESTS ON، llvm-18، g++ 13.3) المطابق لـCI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(linux): إعلان isatty نطاقيًّا + تصحيح تضمين exception.h المحذوف في profiler

- tools/check/src/main.cpp: إعلان extern "C" int isatty(int) في نطاق الملف —
  سلسلة تضمينات الوحدة تكبت تصريح <unistd.h> تحت -std=c++17 الصارم. (extern "C"
  يجب أن يكون نطاق ملف لا داخل دالة.)
- tools/profiler/src/main.cpp: تصحيح تضمين exception.h المحذوف ⇒ user_thrown.h
  (حيث نُقلت ExitException؛ interpreter/include ضمن مسارات التضمين).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(ci): إجبار CMake على مفسّر Python نفسه الذي ثُبّتت فيه حزم التوليد

كان sad_check_codegen_env يفشل وقت البناء على Windows (MSB8066) رغم تثبيت pip،
لأنّ CMake قد يختار مفسّر Python3 مختلفًا عبر find_package فلا يجد pyyaml/jsonschema.
الآن تُصدّر خطوة pip مسار python إلى PYTHON3_EXECUTABLE وتُمرّره خطوة التكوين عبر
-DPython3_EXECUTABLE فيتطابق مفسّر pip ومفسّر البناء.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(linux): إضافة <unistd.h> لـ ::getpid في compiler_driver_linker

الملف يستعمل ::getpid() على فرع POSIX دون تضمين <unistd.h> (MSVC يستعمل
GetCurrentProcessId فلا يحتاجه). نقص التضمين…
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