سجل الإصدارات
v2.83.0 — حزمة الزميل-١ (١٠ بنود): تطبيع الإدخال + جناح ٢٢ موسّع + تجريد BiDi + جرد م١٨ + أجنحة 23-26 + دستور
٢٫٨٣٫٠- **بند ١-٢ — جناح 22 موسّع (v2.83.0):** `shouldFlagBracketContent` مُوسَّع: يُضيف `\u0660-\u0669` و`\u06F0-\u06F9` للكشف عن الأرقام العربية-الهندية في الأقواس. برهان حي-٢ جديد: سلسلة مصطنعة `ar: "مجموع الأجزاء (٤٩٧)"` تُصاد (كانت تفلت). `w22Ok` صارت `violations === 0 && mockFlagged && mockFlaggedAN`. مسح ملفات: `readdirSync` شامل (SCAN_DIRS ثابتة) → مشي تعاودي `walkSrc22` (يصطاد مجلدات فرعية جديدة تلقائياً). أرضية `SCAN_FILE_FLOOR = 25` تُنبّه إن هبط العدد عن الحد. © Mosleh.
- **بند ٣ — تطبيع الإدخال (normalizeInput):** أُضيفت `export function normalizeInput(s: string): string` في `numFmt.ts`: تحوّل `٠-٩` و`۰-۹` إلى ASCII، و`٫` إلى `.`، و`٬,` إلى `""`. مُطبَّقة على كل `parseFloat`/`parseInt` في `CaseInput.tsx` (١٣ موضعاً): `updateCount`، `handleNumericInput`، `computedGrossEstate`، `wasiyyaEffectiveWill`، `netEstate`، `handleSubmit`، `wasiyyaAmountNum`، الفروع الهجائية، شريط الخلاصة. جناح 23 يُثبت: `normalizeInput("٥٠٠٠") = "5000"` و`normalizeInput("٣٫٥") = "3.5"`. © Mosleh.
- **بند ٤ — جرد م١٨ (أنماط الصفريّ الزائف):** مسح شامل لـ`CaseInput.tsx` و`Result.tsx` و`Gharqa.tsx`. التصنيف: (أ) سليم: ~٢٥ نمطاً (`?? 0`، `|| 0` كحارس NaN/null، `Number.isNaN`، `?? "-"`) — منطقية مشروعة. (ب) مشبوه في طبقة العرض: صفر — لا يوجد `{count && ...}` أو `{amount ? x : "-"}` حيث يمثّل ٠ قيمة عرضية مشروعة. (ج) مشبوه بجوار الحساب: مسار الأرقام العربية-الهندية عبر `parseFloat` — يُحلّ نظامياً بـnormalizeInput في بند ٣. © Mosleh.
- **بند ٥ و٦ و٧ — أجنحة 24-26:** جناح 24 (إلزام fmtPageNum): يمسح `src/pages` و`src/components` بحثاً عن template literals بأرقام صفحات خام (`صفحة ${}` بدون fmtPageNum) — صفر انتهاكات ✓. جناح 25 (اختبار سلبي الوصية الواجبة): يفحص `dist/public/*.html` — «الوصية الواجبة» غائبة من الناتج ✓. جناح 26 (مصدر واحد): يُثبت أن `reportSeal.ts` يُصدِّر `APP_VERSION` + `VERIFICATION_COMPLETED_VERSION` ويُعيد تصدير `RULES_VERSION` من `rules.ts` ✓. © Mosleh.
- **بند ٨-٩-١٠ — تجريد BiDi + دستور + إصدار:** `export function stripBidiChars(s: string): string` في `numFmt.ts`: تُجرّد `U+2066-U+2069`، `U+200E/F`، `U+061C`، `U+202A-U+202E`. مُطبَّقة على `handleCopy` في `Result.tsx` (نسخ النتيجة للحافظة). دستور: §10.7 صُوِّح `FSI → LRI` (م٢١ لا م٢٠ هي المرجع)؛ §10/و مُضاف: «ملف replit.md يُعدَّل بقرار المالك وحده». APP_VERSION رُفع إلى 2.83.0. © Mosleh.
- **م٢٤ + المستحصلات الأربعة (2.83.0 تذييل ٢٤-٠٧-٢٠٢٦):** (١) جرد م٢٤ — مسح `src/` كاملاً (٢٦ موضعاً): `?? 0`، `|| 0` كحارس NaN/null، `> 0 &&`، `.isZero()`، `h.count > 1 &&` — جميعها **صنف (أ) سليم**؛ صفر صنف (ب) أو (ج). جناح 27 مُضاف: يمسح `pages/`+`components/` عن `{X &&` بلا مقارنة على متغيرات رقمية — صفر انتهاكات ✓. (٢) حكم المبتورات: «نافذةكاملة» مُنحلّة (لا BiDi marks كانت فاصلة — `trLabel`+`fmtFraction` لا تُضيفان marks)؛ «)-(» قائمة لأرقام ASCII خام في `(${total})` — تحتاج قرار المالك (`fmtAmount` في handleCopy). (٣) §10.5 صُوِّح: الهاش الفعلي `412a87d` (2026-07-05) بدل الهاش الخاطئ السابق. (٤) §10/و استُبدل بالنص الرسمي: «تذكرة Replit مقفل… تصعيد Shawn… ٢٥$ مُقرّ كتابةً». © Mosleh.
- **م٢٢ — إقفال مبتورة «)-(» من جذرها (fmtAmount في handleCopy):** استُبدل حقن المبلغ الخام `(${total ?? "-"})` بـ`(${total != null ? fmtAmount(total, lang) : "-"})` في `handleCopy` بـ`Result.tsx` — يخرج النص المنسوخ الآن بالأرقام العربية-الهندية وفاصليها `٬` و`٫` كسائر شاشات العرض، وتنحل ظاهرة «)-(» من جذرها (الأرقام العربية-الهندية AN لا تُنقلب أقواسها في RTL). جناح 28 مُضاف كبوابة بناء إلزامية: يُشغِّل الحالة الاختبارية (زوجة + ابن، تركة ١٢٠٠٠٠) ويُثبت: (أ) صفر أرقام غربية 0-9 في النص الناتج ✓، (ب) صفر انقلاب أقواس (نمط «)....(») ✓، (ج) تسميات وكسور سليمة (الزوجة/١/٨ والابن/٧/٨) ✓. بقرار المالك «ثبت» ٢٤-٠٧-٢٠٢٦. © Mosleh.
v2.82.0 — م٢١: إسقاط FSI وإعادة LRI للأرقام العربية-الهندية — إصلاح انقلاب الأقواس
٢٫٨٢٫٠- **م٢١ — تصحيح م٢٠: AN ليست محارف قوية في BiDi:** FSI (U+2068) يُثبّت اتجاهه من أول محرف **قوي** (Strong) في المحتوى. الأرقام العربية-الهندية `٠-٩` فئتها `AN` (Arabic Number) — وهي فئة **ضعيفة** في خوارزمية Unicode BiDi — لا قوية. عندما يواجه FSI المحتوى `ص٣٦٥–٤٠٠` فأول محرف قوي هو `ص` (فئة AL = Arabic Letter = RTL قوي) فيضبط الكتلة كلها على RTL وتنقلب الأقواس. الحل: إعادة LRI (U+2066) للأرقام العربية-الهندية كما للأرقام الغربية — LRI يُثبّت سياقاً LTR بصرف النظر عن قوة المحارف الداخلية. `classifyBracketIsolation` مُحدَّثة: `[A-Za-z0-9\u0660-\u0669\u06F0-\u06F9]` → `"lri"` فقط (لا `"fsi"` بعد الآن). © Mosleh.
v2.81.0 — م٢٠: ترقية سياسة العزل إلى ثلاثية (LRI+FSI+بلا عزل) — إصلاح انقلاب أقواس الأرقام العربية-الهندية
٢٫٨١٫٠- **م٢٠-أ — classifyBracketIsolation: تصنيف ثلاثي مُصدَّر:** أُضيفت `export function classifyBracketIsolation(content: string): "lri" | "fsi" | "none"` في `numFmt.ts`. الحكم: (أ) `[A-Za-z0-9]` → "lri" (LRI U+2066)؛ (ب) أرقام عربية-هندية `٠-٩`/`۰-۹` → "fsi" (FSI U+2068، يحسم الاتجاه من أول محرف قوي فيستوي في الحاويتين RTL وLTR)؛ (ج) عربي/أردي خالص بلا أرقام → "none" (بلا عزل). القاعدة الفاصلة: وجود أي رقم يوجب عزلاً. © Mosleh.
- **م٢٠-ب — السريان التلقائي على المواضع التسعة عشر:** `lriBrackets` و`bidiWrapReason` و`isolateCitations` في `numFmt.ts` مُحدَّثة لاستدعاء `classifyBracketIsolation`: محتوى عربي-هندي (ص٣٦٥–٤٠٠ ونظائره) ينال FSI (U+2068) بدلاً من LRI — يُصلح انقلاب الأقواس في ترويستا معرضَي الكتاب وتسميتَي التنقل وكل رقائق الفهرس بعد م١٩. © Mosleh.
- **م٢٠-ج — جناحا ٢١ و١٦ يرثان الحد الثلاثي:** جناح ٢١: برهان أحمر/أخضر جديد (الثنائي v2.80.0 يُعيد LRI للعربي-الهندي [أحمر]، الثلاثي يُعيد FSI [أخضر])؛ ٣ حالات جديدة: `(ص٣٦٥–٤٠٠)` → FSI ✓، `(تنبيه: تحقق من ذلك يدوياً)` → بلا عزل ✓، `(40,000.00)` → LRI ✓. جناح ١٦: بند ج٢ مُحدَّث من LRI إلى FSI. اسم الجناحين رُفع إلى v2.81.0. © Mosleh.
- **م٢٠-د — التوثيق الدستوري (§5.12 + §10.7):** §5.12 مُذيَّلة بترقية م٢٠: وصف التصنيف الثلاثي ومرجعية FSI. §10.7 جديدة: تقييد م٢٠ بوصفها تصويب عيب انقلاب الأقواس في بطاقات الأرقام العربية-الهندية. © Mosleh.
v2.80.0 — م١٩: تعريب أرقام صفحات تصفح الكتاب + تعميم جناح ٢٢
٢٫٨٠٫٠- **م١٩-أ — fmtPageNum: دالة تحويل مركزية لأرقام الصفحات:** أُضيفت `export function fmtPageNum(n: number, lang: Lang): string` في `numFmt.ts` تُعيد الرقم وحده (بلا «ص») بالتنسيق الصحيح: أرقام عربية-هندية للعربية، Extended Arabic-Indic للأردية، غربية للإنجليزية. أحكمت من `toArabicEastern`/`toUrduDigits` الداخليتين دون إعادة كتابتهما. © Mosleh.
- **م١٩-ب — تعريب كامل لأرقام الصفحات في BookBrowse.tsx:** استُبدل كل `${page}` بـ`${fmtPageNum(page, "ar")}` / `${fmtPageNum(page, "en")}` / `${fmtPageNum(page, "ur")}` في ١٩ موضعاً: `minhajAltForPage` (alt texts المنهاج)، ثوابت `MINHAJ_PAGE_ENTRIES` (label/alt)، placeholder مصغرات مختصر الآثار ودعائم الإسلام، alt texts الصور، ترويسات h3 في أقسام المقتطفات الثلاثة، رقاقة مؤشر فصول دعائم `ص{page}` بـ`ص{fmtPageNum(page, lang)}`، رأسا Lightbox المختصر والدعائم. أُضيف `lang` لتفكيك `useLang()` في الـ hook الرئيسي. © Mosleh.
- **م١٩-ج — جناح ٢٢ ممدود (v2.80.0): نطاق كامل + مبررات موثقة:** أُعيد كتابة فحص جناح ٢٢ ليمسح كل ملفات `src/pages/*.tsx` + `src/components/*.tsx` + `src/hooks/*.ts` (٢٥ ملفاً) بدلاً من BookBrowse.tsx وحده. النمط الجديد: استهداف سلاسل `ar:`/`ur:` في L objects حصراً (حيث يُعرَّض الرقم في سياق قد يُخلط فيه RTL/LTR). المؤشر الجديد `shouldFlagBracketContent`: يُصاد فقط عند وجود حرف لاتيني أو رقم غربي `[A-Za-z0-9]` — الأرقام العربية-الهندية `٠-٩` في سياق RTL لا تسبب انقلاباً. قائمة استثناء موثقة (٢٨ ملفاً): بنية تحتية، صفحات داخلية، سياق LTR علمي، سياق RTL خالص. برهان حي جديد: سلسلة مصطنعة `ar: "فهرس (pg365.jpg)"` تفشل الفحص — الناتج الفعلي (بعد م١٩) يجتاز بصفر انتهاكات. يُصرَّح بعدد الملفات الممسوحة في التقرير. © Mosleh.
- **إقفالات دستورية (§10.4/§10.5/§10.6):** §10.4 رُفع من «معلق» إلى «محسوم بالتعريب بقرار المالك ٢٣-٠٧-٢٠٢٦». §10.5 جديدة: نسب ميزة معارض التصفح (هاش `128846e`، ٢٠٢٦-٠٧-٠٥، رسالة «Add book images to display within the application»). §10.6 جديدة: استدراك الجناح ٢٢ ومصدر النمط المُوسَّع. © Mosleh.
v2.79.0 — م١٧/م١٧-ب/م١٨ + جناح ٢٢: حارس المنبع المصدري وإصلاح BiDi مقتطفات الكتاب
٢٫٧٩٫٠- **م١٧ — lriBrackets لسلاسل تصفح الكتاب:** أُضيف `import { lriBrackets }` إلى BookBrowse.tsx وغُلِّف بها جميع `t({...})` الحاوية لأقواس ذات محتوى رقمي أو ASCII: علامات TabTrigger دعائم/مختصر؛ ترويسات CardTitle للمعارض الثلاثة؛ نصَّا بطاقتَي الإرشاد `(pg365.jpg–pg400.jpg)` و`(pg491.jpg–pg502.jpg)`. أسماء الملفات التقنية تبقى لاتينية بوصفها معرفات موثقة لكن بعزل سليم عبر الدالة الانتقائية. © Mosleh.
- **م١٧-ب — إصلاح بنيوي لانعكاس أقواس الآية في مقتطفات blockquote:** أُضيف `unicodeBidi: "isolate", direction: "rtl"` صريحاً إلى style الـ`<blockquote>` في أقسام المنهاج والدعائم والمختصر (ثلاثة مواضع). العلة البنيوية: CSS قد يُبطل التأثير الضمني لـHTML `dir="rtl"` — الإضافة الصريحة تضمن سياقاً RTL عازلاً مستقلاً لا يُلغيه الوراثة. القوسان `(وأولوا الأرحام…)` ومثيلاتهما يظهران في وضعهما الصحيح. © Mosleh.
- **م١٨ — إصلاح بطاقة «لم تُضَف صور» تظهر رغم امتلاء المعرض:** الخطأ: `useState(null ?? false)` = `useState(false)` جعل الحالة الابتدائية `false` فتظهر البطاقة في أول Render قبل تأكيد الفحص. الإصلاح: تغيير نوع إرجاع الـhooks الثلاثة `useBookImagesAvailable/useDaaimImagesAvailable/useMukhtasarImagesAvailable` إلى `boolean | null` (null = لا يزال يُجرَّب)؛ وتغيير الشرط في BookBrowse.tsx من `!available` إلى `available === false` — البطاقة لا تظهر إلا عند التأكيد بغياب الصور. © Mosleh.
- **جناح ٢٢ — حارس المنبع المصدري (v2.79.0):** فحص مصدري جديد يُمسح `src/pages/*.tsx` و`src/components/*.tsx` و`src/hooks/*.ts` بحثاً عن سلاسل حرفية تحوي `(محتوى رقمي/ASCII)` خارج الدوال المعتمدة (lriBrackets/bidiWrapReason/fmtCitation/isolateCitations). يستثني: bookCitations.ts وملفات المحرك والبنية التحتية. برهانه الحي: سلاسل BookBrowse القديمة (دعائم الإسلام (ص٣٦٥–٤٠٠) وأمثالها) كانت ستفشله — بعد م١٧ يجتاز بصفر انتهاكات. يُفشل البناء عند أي انتكاس في ملفات الواجهة. © Mosleh.
- **أرقام الصفحات اللاتينية في تصفح الكتاب (معلقة لقرار المالك):** ترويسات «صفحة 491» و«صفحة 365» ومؤشر فصول الدعائم «ص365» تستخدم أرقاماً لاتينية مرسلة (JavaScript integer → سلسلة دون تحويل). هذه الأنماط `صفحة ${page}` تقع خارج الأقواس فلا يُغطيها `lriBrackets()` بتصميمه ولا يُعالجها `fmtCitation()`. تُقيَّد «معلقة لقرار المالك» في الدستور §10 ولا تُغيَّر دون قرار. © Mosleh.
v2.78.0 — ق٤١+م١٦: تقنين العزل الانتقائي + تصويب تنويه التسلسلي + اكتمال إصلاح Deed.tsx
٢٫٧٨٫٠- **م١٦ — تصويب دلالة تنويه التسلسلي (§9 الدستور):** اللفظ المعتمد بقرار المالك «ثبت» ٢٢-٠٧-٢٠٢٦: «الرقم التسلسلي معرّف محلي لجهاز الإصدار وقد يتكرر بين الأجهزة» (ثلاث لغات) — بدلاً من «رقم تسلسلي مستقل لكل محضر — لا يتكرر» الذي يُوهم بعالمية الرقم. الرقم محلي لجهاز الإصدار لا عالمي — الدلالة الصحيحة مقيَّدة الآن بجناح ٢١ (فحص م١٦) ولا يجوز الانتكاس. © Mosleh.
- **إتمام ق٤١ في Deed.tsx (موضعان):** تصويب العزل الصلب غير المشروط المتبقي في القالب المطبوع: `(كسر)`/`(کسر)` (ترويسة عمود النصيب، السطر ٨٣٤) و`(اختياري)`/`(اختیاری)` (تسمية خانة المُقوِّم، السطر ١١٠٠) — أُزيلت U+2066 الصلبة واستُبدلت بـ`lriBrackets()` الانتقائية التي تُتركهما بلا عزل كونهما عربي/أردي خالص بلا أرقام. اكتمل الإصلاح النمطي لق٤١ في جميع ملفات الواجهة. © Mosleh.
- **جناح ٢١ ممدود (v2.78.0):** أُضيف برهان حي (oldLri محاكاة v2.62.0 يُثبت فشل القديم واجتياز الحالي)؛ وفحص مصدري يرصد صفر إدراج يدوي لـ U+2066 على عربي/أردي خالص في `src/` ويُفشل البناء عند الانتكاس؛ وفحص م١٦ يقفل دلالة تنويه التسلسلي. © Mosleh.
- **تقنين ق٤١ في PROJECT_CONSTITUTION.md:** أُضيفت §5.11 (قاعدة lriBrackets لعزل الأقواس) و§5.12 (سياسة bracketNeedsLri الانتقائية — اعتمد المالك «ثبت» ٢٢-٠٧-٢٠٢٦)؛ §10 جديدة: دلالة العدّادين ٢١/٢٧، قائمة المحارف غير المغطاة ملاحظةً دستورية، قيد م١٦، اعتماد v5. © Mosleh.
v2.77.0 — ق٤١: إصلاح bidi-أقواس (LRI على عربي خالص كان يُعطَّل على أندرويد)
٢٫٧٧٫٠- **ق٤١ — إصلاح bidi-أقواس (§5.12):** السبب الجذري: `lriBrackets()` و`bidiWrapReason()` كانتا تطبّقان U+2066 LTR-Isolate على كل محتوى مقوّس بلا تمييز، بما فيه النصوص العربية الخالصة كـ«(مع تفاصيل المستفيد والسند الشرعي)» و«(أب الأب)» و«(لكل فرد)» وغيرها. LTR-Isolate حول نص RTL خالص يُنشئ تعارض مستوى BiDi (LTR-isolate + RTL-content) مما يسبب إزاحة أو انعكاس الأقواس في بعض إصدارات Chrome/Android. **الإصلاح النمطي:** تمييز مركزي بـ`bracketNeedsLri(content)` في `numFmt.ts`: إذا احتوى المحتوى أرقاماً (٠-٩ غربية أو عربية-هندية) أو حروف ASCII → LRI محفوظ؛ نص عربي/أردي خالص بلا أرقام → يُترك للـ BiDi الطبيعي. الأسطح المُصلَحة: `lriBrackets()` (عناوين CaseInput: الخطوة الأولى والرابعة + كل التسميات)، `bidiWrapReason()` (نصوص العلة في النتيجة والراوي والمحضر)، و٣ مواضع صريحة: `(جماع العصبة)` في AslBreakdownCard، `(لكل فرد)`/`(فی فرد)` في Result. الأرقام الموجودة في أقواس `(ص٢٢ منهاج الفرائض)` و`(٢)` وما شابهها تحتفظ بـ LRI كما كانت. جناح QA ٢١ جديد + تحديث جناح ١٦ تضمنان تغطية الحالتين. لا مساس بالمحرك ولا بالشواهد ولا بالأحكام. © Mosleh.
v2.76.0 — ق٣٩: تصويب حد المنهاج (٢–٥١) + ق٤٠: ص٥١ طبقة الكتاب + اكتمال طبقة الكتاب للكتب الثلاثة
٢٫٧٦٫٠- **ق٣٩ — تصويب حد منهاج الفرائض (٢–٥١):** بشهادة المالك المباشرة على صورة ص٥١ الخاتمة (٢٢-٠٧-٢٠٢٦، §5.8، كلمته «ثبت»): الكتاب يختم بص٥١ حاملةً خاتمة المؤلف والحمدلة وتاريخ الإتمام — لا وجود لص٥٢–٥٣. صوِّب النطاق المعلن من «٢–٥٣» إلى «٢–٥١» في كل المواضع: PROJECT_CONSTITUTION §7، Tests.tsx id:53 (البند الدائم)، useBookImages.ts (تعليق أسماء الصور). شهادة المالك الموثقة المرفقة: «دعائم ٣٦٥–٤٠٠ ومختصر ٤٩١–٥٠٢ حاضرة متصلة، وعارض صور الصفحات للموضعين المصوَّبين (دعائم ٣٩١ ومختصر ٥٠١) مطابق للمصدر».
- **ق٤٠ — ص٥١ طبقة الكتاب (مقتطعان محققان):** (أ) ذيل ص٥٠ المنقول إلى ص٥١ «يحجب من بَعُدَ، إلا المسلم فإنه وإن بَعُدَ لا يحجب من قَرُبَ من أهل الذمة ويرث معه» — مُودَع في bookCitations.ts بـ relatedRuleIds: [kufr-bars-inheritance-muslim-deceased]. (ب) خاتمة المؤلف «وهذا مختصر ما يحتاج إليه في مجال المواريث لكل من يتفكر فيه ويأخذ بطريقته يتفتح له جميع ما يحتاج اليه فإن جميع الفرائض تدور على هذا الترتيب» — قائمة. تاريخ الإتمام «تم إعداد الكتاب في ٢١ رمضان ١٤٤٠هـ الموافق ٢٥ مايو ٢٠١٩م» مدرج في نص الخاتمة. **ترقية تتويجية:** قاعدة kufr-bars-inheritance-muslim-deceased تكسب مرساتها المنهاجية بشاهد ص٥١ — اكتمل إسنادها الثلاثي: منهاج ص٥١ + دعائم ص٣٩٨ + مختصر ص٤٩٩. **إعلان اكتمال طبقة الكتاب:** منهاج الفرائض ٢–٥١ ✓ | دعائم الإسلام ٣٦٥–٤٠٠ ✓ | مختصر الآثار ٤٩١–٥٠٢ ✓ — بلا فجوة.
v2.75.0 — ق٣٦: صفحات فاتحة دعائم الإسلام (٣٦٥–٣٧٢) + ق٣٧: تصويب مقتطفات ٣٧٣–٣٧٥ + ق٣٨: اكتمال دعائم (٣٦٥–٤٠٠)
٢٫٧٥٫٠- **ق٣٦ — ثمانية عشر مقتطفاً حرفياً جديداً من صفحات ٣٦٥–٣٧٢ من دعائم الإسلام:** ص٣٦٥ (مقتطفان): الأولاد الذكور والإناث والابنة المنفردة مع الرد بالرحم؛ الخلاف مع القائلين بالعصبة. ص٣٦٦ (ثلاثة): أولوا الأرحام + فاطمة (ع) + الرواية الكبرى (الابنة والابنتان ورد الثلث + تنزيل ولد الولد + البدء بالفروض) مع تنبيه «بدى بفريضة» والظاهر «بدئ». ص٣٦٧: ابن عباس في تفسير أولي القربى. ص٣٦٨: الحجة على من أبطل كون البنت ولداً مع الأخت. ص٣٦٩ (ثلاثة): بنات الابن مكان البنات + الأقرب (الابنة) تحجب ولد الولد + صدر رواية الأب وابن الابن. ص٣٧٠ (ثلاثة): تتمة الأب وابن الابن (السدس + التنزيل العام + قاعدة سهم الأب/الأم لولدهما) + الأبوان وحدهما + صدر الأبوان مع ابن. ص٣٧١ (ثلاثة): الأبوان مع أولاد + مثال الصحيفة الخماسي (بنت+أبوان/بنت+أم/بنت+أب) + الرد على قدر السهام مع آلية حجب الأم. ص٣٧٢ (مقتطعان جديدان + القائم): الإخوة لأم لا يحجبون + أوزان الحجب (أخوان/أربع/أخ وأختان).
- **ق٣٧ — تصويب مقتطفات الصفحات ٣٧٣–٣٧٥ (عيب م١٥):** ص٣٧٣: رُفع مقتطع حاشية المحقق عن مختصر الإيضاح (مصدر خارج الثلاثة) وأُحل مكانه بثلاثة حرفية — رواية ثبات الزوجين الكاملة «لا ينقص الرجل عن الربع والمرأة عن الثمن كان معهما من كان» + مثال العُمَرية من الصحيفة «للمرأة الربع وللأم الثلث وما بقي فللأب» + صدر رواية امرأة تركت زوجها وأبويها. ص٣٧٤: رُفع المقتطعان السابقان (غير موجودَي اللفظ على الصفحة) وأُحلّا بمقتطفين حرفيين — علة تفضيل الأم على الأب «ولم يسم للأب شيئاً فله ما فضل على كل حال» + قاعدة الزيادة والنقصان للإخوة والولد. ص٣٧٥: عُلِّق مقتطع تنزيل أولاد الإخوة (غير مثبَّت على الصفحة — بانتظار توطينه) وأُثبت ثلاثة حرفية — أصل حجب الإخوة بالوالد/الولد/الأم/البنت + قضاء الرسول في أعيان بني آدم + مقتطع الإخوة من الأم يأخذون الثلث مع تنبيه «فللإخوة من الثلث» والظاهر سقوط «الأم».
- **ق٣٨ — تصويب حد كتاب الفرائض (ص٤٠١ كتاب الديات لا فرائض):** بتحقيق المالك المباشر لصورة ص٤٠١ (كتاب الديات، ١٦)، صوِّب النطاق المعلن في كل المواضع من ٤٠١ إلى ٤٠٠ — تبويب الكتاب بالثلاث لغات (٣٦ صفحة ص٣٦٥–٤٠٠)، فهرس DAAIM_PAGE_RANGE، نصوص الذيل، والدستور. مانيفست دعائم: الحد الأعلى ٤٠٠ (٣٦ رقماً، ٣٦٥–٤٠٠). **باكتمال ق٣٦ وق٣٨ تكون صفحات كتاب الفرائض من دعائم الإسلام (٣٦٥–٤٠٠) مكتملة في طبقة الكتاب بلا فجوة.**
- **٩ ترقيات بطاقات القواعد بشواهد ٣٦٥–٣٧٥:** (١) حجب الأم بالإخوة ← ثلاثة شواهد دعائم ص٣٧٢ (استثناء لأم + شرط حياة الأب + أوزان الأخوين/الأربع/أخ وأختان)؛ (٢) نصيب الأب عاصباً ← ص٣٧٤ («فله ما فضل») + ص٣٧٠ («وجعل الفضل للولد»)؛ (٣) نصيب الأم ← ص٣٧٣ (مثال العُمَرية من الصحيفة) + ص٣٧٤ («ولم يسم للأب شيئاً»)؛ (٤) لا عول ← ص٣٧٣ (رواية ثبات الزوجين الكاملة)؛ (٥) الرد على قدر السهام ← ص٣٧١ («إنما هو على قدر السهام لا على قدر أصل الميراث»)؛ (٦) البنات بلا ابن ← ص٣٦٥+٣٦٦ (الابنة المنفردة مع الرد + الابنتان وردّ الثلث)؛ (٧) تنزيل ولد الولد ← ص٣٦٦+٣٦٩+٣٧٠ (التنزيل الكامل + بنات الابن + قاعدة سهم الأب/الأم)؛ (٨+٩) تنزيل فروع الإخوة ← ص٣٧٥ (أصل الحجب الكامل بالأربعة).
v2.74.0 — ق٣٤: خمس صفحات مختصر الآثار جديدة (٤٩١–٤٩٦، ٤٩٩) + ٨ ترقيات بطاقات + ق٣٥: تصويبات ص٥٠١
٢٫٧٤٫٠- **ق٣٤ — خمس صفحات مختصر الآثار الجديدة (٤٩١، ٤٩٢، ٤٩٥، ٤٩٦، ٤٩٩):** إضافة ١٩ فقرة حرفية جديدة إلى طبقة الشواهد — فاتحة الجماع وميراث الأولاد (ص٤٩١)؛ ولد الولد وآلية الرد ومثال الخمسة والأبوان وحدهما (ص٤٩٢)؛ العُمَرية وقاعدة التقرب والتسمية ومثال ابن الابنة (ص٤٩٥)؛ فروع الإخوة وأصناف القرابة الكاملة وترتيب الشقيق على لأب (ص٤٩٦)؛ حجب المسلم للكافرين وآلية اختلاف الدين وشرط الإسلام قبل القسمة (ص٤٩٩). مانيفست مختصر الآثار يمتد من ٧ إلى ١٢ صفحة (٤٩١–٥٠٢ متواصل).
- **ق٣٤ — ٨ ترقيات بطاقات القواعد بمصادر ثانوية وثالثية:** grandkids-via-son ← ص٤٩٢+٤٩٥ بجوار ص٤٩٦ الموجود؛ mother-share ← ص٤٩٢ بجوار ص٤٩٥ الموجود؛ radd-rule ← مثال الخمسة من ص٤٩٢؛ kufr-bars ← ص٤٩٩ «ولا يحجبه الكافر»؛ religion-difference ← ص٤٩٩ «ولا يرث المسلمون الكافرين»؛ heir-converted ← ص٤٩٩ «أسلم قبل القسمة»؛ gharqa ← النص الكامل ص٥٠١؛ raj-i-divorce + divorce-in-illness + wali-al-wala ← شواهد ص٥٠١.
- **ق٣٥ — أربعة تصويبات على ص٥٠١:** (أ) استبدال placeholder الغرقى المعلق بالنص الحرفي الكامل (الآلية الخماسية + مثال الموليين)؛ (ب) تصويب ترتيب الرجعية من «له عليها فيه» إلى «له فيه عليها» مع ضبط «تنقضِ»؛ (ج) استبدال مقتطف طلاق المريض المركَّب بالنص الحرفي للطلاق البائن مع شرط المريض (نص جامع)؛ (د) إضافة مقتطف الولاء الجديد «ومن مات وليس له وارث إلا مواليه…» مرتبطاً بـwali-al-wala-mawla. مواضع النظر الثلاثة (ق٣٥): ص٤٩٦ تكرار «الخالة تحجب»؛ ص٥٠١ لفظ «منما»؛ همزات المطبوع — منقولة حرفاً بمعقوفات تنبيه.
v2.73.0 — ق٣٢: عشر صفحات دعائم جديدة (٣٧٦–٣٩٩) + قاعدة ترتيب التركة + ق٣٣: تصويبات ص٣٩١
٢٫٧٣٫٠- **ق٣٢ — عشر صفحات دعائم الإسلام (٣٧٦، ٣٧٩، ٣٨٤، ٣٨٨، ٣٨٩، ٣٩٠، ٣٩٢، ٣٩٥، ٣٩٧، ٣٩٩):** إضافة ٢٩ فقرة حرفية جديدة إلى طبقة الشواهد — الصحيفة (الجد بمنزلة الأخ)، مسائل العمومة الخمس، اللقيط والحميل وولد الزنا، الخنثى (ثلاثة شواهد)، الغرقى (الرواية الكاملة)، ترتيب التركة، شاهدا الرد بدون الزوجين، مثال الجد مع الأختين، إرث النساء من العقار، آلية الرد على أصلين.
- **ترقية سبع بطاقات قواعد:** uncles-paternal-vs-maternal + uncles-closer-degree-wins (إضافة tertiarySource دعائم ص٣٧٩)؛ radd-rule (ثلاثة شواهد دعائم ص٣٧٩+٣٩٩)؛ laqit-nasab + mulaana-nasab (secondarySource دعائم ص٣٨٤)؛ khuntha-estimation (ثلاثة شواهد دعائم ص٣٨٨+٣٨٩+٣٩٠)؛ gharqa-simultaneous-death (النص الكامل ص٣٩٠).
- **قاعدة جديدة — estate-priority-order «ترتيب التركة»:** الكفن ثم الدين ثم الوصية ثم الميراث — شاهدها ص٣٩٢ («أول شيء يبدأ به من المال الكفن…») + ص٣٩١ («من ترك مالاً فلورثته…»). توثيقية تعليمية، لا تُغيّر منطق المحرك.
- **ق٣٣ — تصويبات أربعة على ص٣٩١:** (أ) استبدال مقتطف الغرقى الخاطئ بذيل رواية الغرقى الحرفي؛ (ب) استبدال مقتطف الولاء المركّب بمقتطفين حرفيين منفصلين؛ (ج) تصحيح «فقالا»→«فقد قالا» و«في مرضه»→«من مرضه» في مقتطف طلاق المريض؛ (د) إضافة المقتطف الرابع «ما كان رسول الله ينزل من منبره إلا قال…» مرتبطاً بـestate-priority-order.
- **مانيفست دعائم:** يمتد من ١٩ صفحة إلى ٢٩ صفحة (٣٧٢–٤٠٠ متواصل). VERIFICATION_COMPLETED_VERSION → 3.4.0.
v2.72.0 — ق٣١: سد فجوة صفحات طبقة الكتاب (ص٩ + ص١١ + ص٤٣ + ص٤٤ + ص٤٧) + مرساة ثلاثية للأحفاد + حارس المانيفست
٢٫٧٢٫٠- **ق٣١ — خمس صفحات منهاجية (٩، ١١، ٤٣، ٤٤، ٤٧):** إضافة ٥+٥+٢+١+٥ = ١٨ فقرة إلى طبقة الكتاب، محققة بتحقيق المالك المباشر لصور الصفحات، كلمة المالك: «ثبت»، ٢٢-٠٧-٢٠٢٦، §5.8. مواضع النظر السبعة منقولة حرفاً من المطبوع بلا تصويب، مقيدة في دستور المشروع ق٣١.
- **مرساة ثلاثية لـ«grandkids-via-son»:** إضافة tertiarySource «منهاج ص١١» إلى بطاقة «أولاد الابن عند عدم الولد» (الشاهدان القائمان — منهاج ص٣٦ + مختصر ص٤٩٦ — محفوظان دون مسّ).
- **حارس جرد المانيفست (جناح ٢٠):** إنشاء BOOK_CITATIONS_MANIFEST في bookCitations.ts يسرد الصفحات المعتمدة لكل كتاب (منهاج: ٥٠ صفحة؛ دعائم: ١٩ صفحة؛ مختصر: ٧ صفحات). إضافة جناح ٢٠ لبوابة QA يفشل البناء عند صفحة في المانيفست غير موجودة في البيانات، أو صفحة في البيانات غير مقيدة في المانيفست.
- **الدستور والإصدار:** PROJECT_CONSTITUTION.md يكتسب ق٣١ في جدول قيود المعلقات. VERIFICATION_COMPLETED_VERSION → 3.3.0.
v2.71.0 — حزمة قيود المصفوفة ق٢٨–٣٠: شواهد مختصر الآثار ص٤٩٣–٤٩٧ + تصويب إسناد العمومة + فارق العُمَرية
٢٫٧١٫٠- **ق٢٨ — شواهد مختصر الآثار ص٤٩٣ (الأبوان والإخوة):** secondarySource إلى «mother-siblings-hijab»: «وإن كان الإخوة من الأُمّ لم يحجبُوا أُمَّهم عن الثلث ولم يرثوا شيئاً». secondarySource إلى «siblings-blocked»: «وإذا لم يخلّف الميّت أباً ولا أُمّاً ولا ولداً، وخلَّف إخوة، فميراثه لهم». تحرير ملاحظة «grandfather-blocked»: أصل التنزيل منصوص (مختصر ص٤٩٣) + تفاصيله استنباط مركب معلن.
- **ق٢٩ — تصويب إسناد العمومة من ص٤٩٤ إلى ص٤٩٥–٤٩٦:** بطاقة «uncles-jihatayn-subtypes» صُوِّبت (page + title + tertiarySource). شواهد ص٤٩٦ الحرفية أُودعت في «uncles-paternal-vs-maternal» + «uncles-closer-degree-wins». شاهد ص٤٩٥ أُودع في «uncles-blocked».
- **ق٣٠ — شواهد الفوارق الثلاث من ص٤٩٥–٤٩٧:** «radd-no-awl» ← tertiarySource ص٤٩٧ «ولا عول في فريضةٍ». «mother-share» ← tertiarySource ص٤٩٥ العُمَرية «وللأُم الثلث وللأب ما بقي». «grandkids-via-son» ← secondarySource ص٤٩٦ «يرثون سهم أبيهم». فارق ٤ «العُمَرية» أُضيف لصفحة المنهجية. إسنادات مختصر أُضيفت لفارق ١ (لا عول) وفارق ٢ (الإخوة بالأبوين).
- **الدستور والإصدار:** PROJECT_CONSTITUTION.md يكتسب ق٢٨–٣٠ في جدول قيود المعلقات. الإصدار الدستوري → 3.2.0. VERIFICATION_COMPLETED_VERSION → 3.2.0.
v2.70.0 — حزمة ستة بنود: bidi الأقواس + فصل روايتَي الوصية + الرقم التسلسلي + حارس البوابة
٢٫٧٠٫٠- **بند ١ — فصل روايتَي الوصية:** `reductionNote` في `wasiyya.ts` يعرض رواية ١٣٠٠ ورواية ١٣٠١ منفصلتين منسوبتين في ar/en/ur؛ الذيل «ويترك لأهل الميراث حقهم» محفوظ في نص ١٣٠١. جناح ١٩ فحص ٧ يتحقق من الذيل الحرفي وانفصال النسبتين.
- **بند ٣ — `lriBrackets()` لعزل الأقواس:** دالة `lriBrackets()` أُضيفت إلى `numFmt.ts` تلفّ كل قوس `(…)` بعازل LRI/PDI (U+2066/U+2069). طُبِّقت على ٧ مواضع في `CaseInput.tsx`: اسم المتوفى، خيارَي النسب، بطاقة الوصية، اقتباس دعائم ص٣٥٧، ذيل رواية ١٣٠١.
- **بند ٤ — حذف «خيارية» من التسمية:** «الوصية الخيارية» → «الوصية» في `Result.tsx` (عنوان البطاقة + نافذة الصمام ur/en/ar) و`Deed.tsx` (جدول التفاصيل + رسالة الإغلاق).
- **بند ٦ — تنويه الرقم التسلسلي:** سطر دائم مستقل في ذيل `Deed.tsx` يُوضِّح صيغة `SLM-YYYY-NNNNN` — غير مشروط بـ BETA_MODE. الدستور يكتسب § ٨ (استثناء حقول الإدخال الرقمية + `lriBrackets()`) و§ ٩ (الرقم التسلسلي وتنويه الذيل).
- **بوابة QA (جناح ٦ + جناح ١٩):** جناح ٦ — فحص الأقواس يشمل كل HTML في dist/public؛ فحص الأرقام يُحوَّل إلى استخراج نص مرئي مع قائمة بيضاء موثقة (§٨): SLM، Mosleh، vX.Y.Z، تواريخ ميلادية. جناح ١٩ يرتفع إلى ٧/٧ بإضافة فحص ٧ (ذيل رواية ١٣٠١ + انفصال النسبتين).
v2.69.0 — م٧ سد افتراق مصدري الوصية في المحضر (صمام + سند ملازم + حارس البوابة)
٢٫٦٩٫٠- **بند ١ — توحيد المصدر:** سجل الوصية الشرعي (مدخل الوصية + ناتج `computeWasiyya` بحالته وسنده) يُضمَّن في بيانات المحضر ذاتها لحظة كتابتها من صفحة النتائج (`openDeedPage`) — يستحيل افتراقهما. الصف الشرعي في `Deed.tsx` يُبنى من `data.wasiyyaInput` الملازم لا من مخزون جلسة منفصل.
- **بند ٢ — صمام المخرج (Result.tsx):** يمتنع إصدار/طباعة محضر فيه `estate.will > 0` بلا `wasiyyaInput.enabled` — نافذة «بيانات الوصية مطلوبة» تدعو المستخدم لإكمال بطاقة «الوصية الخيارية» أولاً. الحارس مدرَج في `handlePrintDeed` مباشرة بعد حارس الاسم القائم.
- **بند ٢ (legacy) — صمام Deed.tsx:** محضر قديم يُقرأ من localStorage بخصم وصية بلا سجل شرعي — يُوقَف الإصدار ويُعرَض: «بيانات الوصية غير مكتملة في هذا المحضر — أغلق وأكمل البيانات من صفحة النتائج ثم أصدر مجدداً». الطباعة التلقائية محمية بشرط `!wasiyyaMissing`.
- **بند ٣ — حارس البوابة (جناح ١٩):** فحوص جديدة: (أ) بنيوي صمام Result.tsx؛ (ب) بنيوي صمام legacy Deed.tsx؛ (ج) بنيوي سند الحالتين (ص٣٥٧ رواية ١٣٠٠+١٣٠١)؛ (د) runtime: `computeWasiyya({amount:5000}, 12000)` → status=reduced + reductionNote يحمل الاقتباس العربي ورواية ١٣٠٠+١٣٠١؛ (ه) runtime: approved_full؛ (و) برهان قبل/بعد مُدمَج في البوابة. ٦ فحوص / ٦ اجتاز.
v2.68.0 — حزمة تصويبات العرض (بنود ١–٦) + م٣ الجمع في إسناد الوصية
٢٫٦٨٫٠- **بند ١ — إسناد الوصية بالعربية:** `reductionNote.en` و`blockMessage.en` في `wasiyya.ts` يُضمِّنان الاقتباسات العربية مباشرة بدل ترجمتها.
- **بند ٢ — bidi تحذيرات المحرك:** `warnings.map` في Result.tsx يُلفّ نص كل تحذير بـ `<bdi>{bidiWrapReason(...)}</bdi>` لمنع تلوث الاتجاه.
- **بنود ٣+٤ — راوي الأصل والمقام (مفرد/مثنى/جمع):** `AslBreakdownCard` يستخدم `heirLabelByCount` عبر دالة `lbl()` في جميع تسميات الجداول والسرديات، مع منطق «الأب عاصب» المستمَد من `buildFatherAsabaDisplay` ممرَّراً من Result.tsx.
- **بند ٦ — الإصدار في الختم والمحضر:** `Deed.tsx` يُظهر `APP_VERSION` و`VERIFICATION_COMPLETED_VERSION` في رأس كل محضر.
- **م٣ الجمع — إسناد علة الرد في الوصية:** حالة الوصية المجاوِزة للثلث بلا إجازة صُوِّب إسنادها من «رواية ١٣٠٠» وحدها إلى «دعائم ص٣٥٧: رواية ١٣٠٠ للحد، ورواية ١٣٠١ للرد» — من مصدر النص الواحد `wasiyya.ts`، يسري على البطاقة والمحضر معاً. قرار المالك. شاهد ق٢٧: «فإنها ترد إلى المعروف ويترك لأهل الميراث حقهم».
v2.67.0 — ميزة الوصية الخيارية (طبقة ما قبل المحرك) + توثيق ق٢٧
٢٫٦٧٫٠- **ميزة الوصية الخيارية (طبقة ما قبل المحرك، تجريبي):** أُضيف `wasiyya.ts` — طبقة مستقلة تحسب الوصية قبل تمرير الإدخال للمحرك. تدعم أربع حالات: (١) وصية ضمن الثلث (نافذة)؛ (٢) وصية تتجاوز الثلث بلا إجازة (تُخفَّض)؛ (٣) وصية تتجاوز الثلث بإجازة الورثة (تنفذ كاملة)؛ (٤) وصية لوارث (مرفوضة إجماعاً). المصادر: دعائم الإسلام، كتاب الوصايا، ص٣٥٧–٣٥٨ (روايات ١٢٩٩–١٣٠٥). يُودَع المبلغ الفعلي مباشرة في `estate.will` قبل استدعاء المحرك — `inheritanceEngine.ts` لا يُلمَس. حالتا الإجازة الجزئية (روايتا ١٣٠٣–١٣٠٤) مؤجَّلتان بانتظار تحقيق المالك. © Mosleh.
- **واجهة الوصية في خطوة الإدراج (CaseInput):** تُحدَّث الخطوة ٤ بمبدِّل «إضافة وصية خيارية» (تجريبي). عند التفعيل: حقل المبلغ + وصف المستفيد + خيار «المستفيد وارث» + خيار إجازة الورثة عند تجاوز الثلث. كل خيار مدعوم بالنص الحرفي من المصدر (دعائم). عند التعطيل: يبقى الحقل البسيط للوصية دون تغيير. بيانات الوصية تُحفظ في مفتاح sessionStorage مستقل (لا تُلمَس CalculationInput). © Mosleh.
- **عرض الوصية في صفحة النتيجة وMحضر PDF:** صفحة النتيجة تعرض بطاقة «الوصية الخيارية» (تجريبي) قبل جدول الأنصبة — تبيّن المبلغ المطلوب والمبلغ الفعلي والحالة مع النص المصدري. محضر PDF يُضيف صفاً موسَّعاً في قسم أصول التركة يُفصِّل الوضع الشرعي للوصية. بيانات الوصية تُخزَّن في `localStorage` مع محضر القسمة للرجوع إليها. © Mosleh.
- **ق٢٧ — توثيق قرار الوصية (٢٠-٠٧-٢٠٢٦):** قيد دائم يُثبت المصادر الأربعة (دعائم ص٣٥٧–٣٥٨، روايات ١٢٩٩–١٣٠٥)، وتعليق الإجازة الجزئية (روايتا ١٣٠٣–١٣٠٤)، وتأكيد نهائية الاختيار المعماري (طبقة خارج المحرك). أُضيف في جدول قيود الإغلاق في `PROJECT_CONSTITUTION.md`. © Mosleh.
v2.66.0 — أمر مكمل رباعي: تكييف الأب عاصباً + nowrap الأقواس + توحيد الإسناد + حارس البطاقة
٢٫٦٦٫٠- **بند ١ — تكييف الأب عاصباً (طبقة عرض حصراً):** في مسائل كالعُمَرية الثانية (زوج+أبوان) كان بيان الأب «السدس فرضاً (ص٤)» رغم أنه بلا ولدٍ عاصب؛ السبب: المحرك يُسنِد ١/٦ مبدئياً ولا يُصحّحه حين تصفر فصيلة الزوجية. أُضيفت `buildFatherAsabaDisplay` في `heirGrammar.ts`؛ تكشف الحالة (مفتاح=أب، سبب=السدس فرضاً، لا ولد) وتُعيد «الباقي تعصيباً بعد الفروض (منهاج ص٣، ص٨–١٠، ص١٤)» في البطاقة والجدول. خطوة «أصحاب الفروض» تُضاف لها تذييل أصفر يُوضّح أن الباقي صادف السدسَ. الأرقام لا تتغير قطعاً. © Mosleh.
- **بند ٢ — nowrap الوحدات القوسية في جداول الراوي:** كانت «(جماع العصبة)» تنشطر عند التفاف السطر في خلايا جدول أصل المسألة (الخطوة ٣). أُضيف `out.replace(/ \(/g, "\u00A0(")` في `bidiWrapReason` قبل خطوة عزل الأقواس؛ يستبدل المسافة التي تسبق «(» بـNBSP فلا ينكسر السطر قبل أي وحدة قوسية في خلايا الجداول وسائر مواضع الراوي. © Mosleh.
- **بند ٣ — توحيد نمط الإسناد في heirGrammar:** كانت `buildRaddReasonDisplay` تُنتج «(ص٨ منهاج؛ ص١٤ رد)» — «رد» ليست اسم كتاب والترتيب عكسي. عُدِّل إلى «(منهاج ص٨، ص١٤)» (الكتاب أولاً، صفحتان من المنهاج). أُضيف فحص جناح ١٨ رقم ١٣: يتحقق أن مخرج الدالة يحمل «منهاج ص» ولا يحمل رقماً تتبعه «رد» غير مُنوَّن. © Mosleh.
- **بند ٤ — حارس توحيد عناوين البطاقة (جناح ١٨ فحص ١٢):** بعد التوحيد البنيوي في v2.65.0 (عناوين البطاقات تستقي من `heirLabelByCount` مباشرةً)، أُضيف فحص `wives/1/ar === "الزوجة"` في جناح ١٨ ليُثبت بنيوياً أن الصيغة المفردة تُعاد للعدد ١. بذلك لا يبقى ممكناً أن تعرض البطاقة «الزوجة/الزوجات» والمحضر «الزوجة» في آنٍ. © Mosleh.
- **ق٢٦ — قرار المالك الدائم: بادئة SLM لاتينية بقيد موقَّع (١٩-٠٧-٢٠٢٦):** بادئة الرقم التسلسلي SLM معرِّف تقني دائم (اختصار «السليمانية») تبقى بأحرفها اللاتينية ولا تُعرَّب. يُلغى الاعتماد المؤقت الوارد في v2.46.0 («مؤقتاً بقرار المالك») ويحلّ محله هذا القيد الدائم (ق٢٦). مواضع التوثيق: (١) `PROJECT_CONSTITUTION.md` § 7 جدول قيود الإغلاق — ق٢٦؛ (٢) `qa-gate.mjs` جناح ١٤ تعليق فحص أ٣ — صيغة دائمة بإحالة ق٢٦. لا تغيير في أي سلوك معروض — الرقم يبقى SLM-٢٠٢٦-٠٠٠XX. © Mosleh.
v2.65.0 — حزمة سداسية: نمطية الصيغ النحوية + بيان الرد + إثراء الحجب + الأقواس المركبة + توحيد الجدة + PDF
٢٫٦٥٫٠- **بند ١ — بيان الرد المركب (Result.tsx + Deed.tsx):** أُضيفت دالة `buildRaddReasonDisplay` في `heirGrammar.ts`؛ تكتشف الرد من ناتج المحرك (baseFard + totalFraction) وتبني عبارة مركبة «النصف فرضاً والباقي رداً (ص٨ منهاج؛ ص١٤ رد)» بدلاً من إظهار فرض النصف وحده بينما النصيب الفعلي ٣/٤ أو ١/١. الأم محمية (سببها يحمل «رداً» أصلاً فلا يُعدَّل). © Mosleh.
- **بند ٢ — نمطية صيغ الإفراد والتثنية والجمع (Result.tsx + Deed.tsx):** أُضيفت دالة `heirLabelByCount(key, count, lang)` في `heirGrammar.ts` بجداول صيغ ثلاثية لجميع أصناف الورثة في العربية والإنجليزية والأردية. تُعيد «البنت» للمفرد، «البنتان» للمثنى، «البنات» للجمع بدلاً من «البنات ×١». مُستخدَمة في جدول الأنصبة (بطاقات وجدول) والمحضر وجدول الدية. © Mosleh.
- **بند ٣ — إثراء بيان حجب الإخوة وتصحيح فعله (Result.tsx + Deed.tsx):** أُضيفت دالة `enrichSiblingBlockingReason` في `heirGrammar.ts`؛ تصحح فعل الحجب «محجوبون» وفق العدد والجنس الفعليَّين (محجوب/محجوبان/محجوبون/محجوبة/محجوبتان/محجوبات)، وتُثري بيان «بالولد» بذكر الحاجب الفعلي (البنت/الابن/بنت الابن…) مع السندين الكاملين (دعائم ص٣٧٥؛ منهاج ص٧). © Mosleh.
- **بند ٤ — الاستشهادات المركبة في الأقواس (Result.tsx):** استُبدل `isolateCitations(trText(reason))` بـ`bidiWrapReason(buildHeirReasonDisplay(heir))` في جدول الأنصبة (بطاقات الجوال، جدول المكتب، جدول الدية). `bidiWrapReason` يحمي جميع الأقواس بما فيها المركبة «(منهاج ص٢٨–٢٩؛ دعائم ص٣٧٨)» بخلاف `isolateCitations` التي كانت تُعالج «(صXX)» فقط. © Mosleh.
- **بند ٥ — توحيد تسمية الجدة في التوقيعات والأنصبة (Deed.tsx):** حُوِّلت تسميتا «الجدة لأم» و«الجدة لأب» في HEIR_ROLE وHEIR_ROLE_DEF_AR إلى «الجدة (أم الأم)» و«الجدة (أم الأب)» توافقاً مع مفاتيح المحرك وجدول الأنصبة، مما يُوحِّد تسمية الجدة في جميع أجزاء المحضر. © Mosleh.
- **بند ٦ — حماية الفاصلة في استشهادات PDF (numFmt.ts):** أُضيف في bidiWrapReason معالج LRO+PDF لكل فاصلة/فاصلة منقوطة تلي رقماً داخل الأقواس (regex `/(digit)[،؛,;]/g` → `digit + + sep + `) — يُوقف ظهور «ص،٣» بدل «ص٣،» في استخراج PDF. جناح 18 يُضاف لبوابة QA للتحقق من الدوال الثلاث. © Mosleh.
v2.64.0 — حزمة درع الرجعية ووسم مسألة الجدتين
٢٫٦٤٫٠- **بند ١ — جناح 17 (qa-gate.mjs):** مصفوفة رجعية ٩ مسائل لاختبار جميع حالات الجدتين (§٧ ملف التسليم). ٨ مسائل تجتاز بوابة الفشل. المسألة ٦ (زوجة+أبوان+جدتان+ابن) مستثناة بقيد ق٢٥ (١٩-٠٧-٢٠٢٦): المحرك يُعطي كل جدة ١/٦ مستقلاً، والملزم يقسم سدساً واحداً بينهما (كل منهما ١/١٢). الاستثناء موثق حصرياً ولا يُعمَّم. © Mosleh.
- **بند ٢ — وسم بطاقتي الجدتين (rules.ts):** حُوِّل وضع البطاقتين «نصيب الجدتين» و«طعمة الجدة أم الأب» من «verified» إلى «needs_review» بموجب القيد ق٢٥ (١٩-٠٧-٢٠٢٦). أُضيفت إلى ملاحظات بطاقة «نصيب الجدتين» فذلكة التعارض الظاهري مع المراجع الثلاثة (منهاج ص٢٧–٢٨، دعائم ص٣٧٨ روايتا ١٣٥١-١٣٥٢، حاشية ص٣٧٧). أُضيفت إلى بطاقة «أم الأب» إحالة مشتركة للمسألة ذاتها. © Mosleh.
- **بند ٣أ — إصلاح خانة الجدتين في جدول توقيعات المحضر (Deed.tsx):** أُضيف «grandmother» → «maternal_grandmother» و«grandmotherFatherSide» → «paternal_grandmother» إلى قاموس SINGULAR_TO_PLURAL — كانت مفاتيح المحرك الخام مفقودة فيظهر «وارث» بدلاً من «الجدة لأم»/«الجدة لأب» في خانات التوقيع. © Mosleh.
- **بند ٣ب — إصلاح الأقواس المقلوبة في عمود الحكم بالمحضر (Deed.tsx):** استُبدل `isolateCitations()` بـ`bidiWrapReason()` في تصيير سبب الوارث المؤهَّل؛ `isolateCitations` كانت تُعالج «(صXX)» فقط فتبقى أقواس «(منهاج ص٢٨–٢٩؛ دعائم ص٣٧٨)» غير محمية فتنقلب في الإخراج. `bidiWrapReason` تشمل جميع الأقواس. © Mosleh.
- **بند ٤ — شارة المراجعة المتخصصة للمستخدم (Result.tsx + Deed.tsx):** أُضيفت شارة «هذا الحكم قيد المراجعة المتخصصة» إلى سطر كل جدة (أم الأم وأم الأب) في جدول الأنصبة (شاشة النتائج، البطاقات والجدول) وفي جدول الأنصبة الشرعية بالمحضر، عندما تجتمع جدة مع أمٍّ حية أو مع ابن. الشارة مرئية للمستخدم وتُشعره بأن الحكم في طور المراجعة. © Mosleh.
v2.63.0 — حزمة الاستخراج الثلاثية: LRO-النقطتين + nowrap-الاستشهادات + تدقيق المحضر
٢٫٦٣٫٠- **بند ١ — nowrap على استشهادات رواي الرد (AslBreakdownCard.tsx):** أضيفت `style={{ whiteSpace: "nowrap" }}` إلى جميع عناصر `<span>` الاستشهادية في بطاقة تفصيل الأصل (الناقص ص١٦/٣٨٢-٣٨٣، المناسبة ص٣٩-٤١، الرد ص١٤، استثناء الزوج ص١٣/٢٥) — تمنع تقطُّع عبارة «(ص١٤ منهاج الفرائض)» عند حافة السطر في PDF. © Mosleh.
- **بند ٢ — إصلاح استخراج النص من PDF: ص٣٧٢: والاقتباسات (numFmt.ts):** `bidiWrapReason` تغيّر بنهجين: (أ) نمط «صXX:» — بدلاً من RTL ISOLATE+RLM، تُغلَّف النقطتان وحدها بـ LRO (U+202D)+PDF (U+202C) فتدخل في وحدة LTR مع الأرقام، ويُخرِج تيار محتوى Chrome «ص٣٧٢:» صحيحاً لا «ص:٣٧٢». (ب) نمط «...» — حُذف U+200F (RLM) الذي كان يظهر كرمز مرئي في بعض مستخرجات PDF، مع إبقاء RTL ISOLATE (U+2067) للعرض. جناح ١٦ مُحدَّث: اختبار أ يفحص وجود U+202D؛ اختبار ب يفحص غياب U+200F قبل «. © Mosleh.
- **بند ٣ — تدقيق استخراج نص المحضر:** فُحصت جميع خلايا الجدول في Deed.tsx بحثاً عن أنماط bidi إشكالية — التاريخان (هجري/ميلادي) ينتجان سليمَين عبر `fmtHijri`/`fmtDate`؛ الرقم التسلسلي محمي بـ LRO في `formatSerialForPdf`؛ خلايا الحصص تمر عبر `<FractionDisplay>`؛ أسباب الحجب تمر عبر `bidiWrapReason`. التعديلات الثلاثة في بند ١ وبند ٢ تُغطي جميع مواضع الانزياح المُكتشفة. © Mosleh.
v2.62.0 — حزمة العرض السباعية: بيدي-PDF + جماع العصبة + رواي الرد + الجد + التسلسلي
٢٫٦٢٫٠- **بند ١ — صXX: في PDF:** `bidiWrapReason` تُضيف RLM (U+200F) قبل نقطتي «صXX:» لتثبيت ترتيبها في محركات PDF التي لا تدعم RTL ISOLATE.
- **بند ٢ — «» في PDF:** `bidiWrapReason` تُضيف RLM (U+200F) قبل «» لمنع انعكاس علامات الاقتباس في محركات PDF.
- **بند ٣ — حوض → جماع العصبة:** تمت تسمية الحوض «جماع العصبة» في الخطوة ٣ من بطاقة أصل المسألة، مع عزل القوسين بـ LTR ISOLATE لمنع انقلابهما في RTL.
- **بند ٤ — راوي الرد:** (أ) حُذف الاسم المكرر قبل القوس «بنسبة سهامهم: الأم (الأم: ١)» → «بنسبة سهامهم (الأم: ١ سهم)»؛ (ب) أقواس مستندَي ص١٤ وص١٣ وص٣٩–٤١ معزولة بـ LTR ISOLATE.
- **بند ٥ — قوسا الجد (أب الأب):** تمرير تسمية الوارث عبر `bidiWrapReason` في بطاقات الجوال وجدول الأنصبة (Result.tsx) وخطوات راوي الرد (AslBreakdownCard.tsx) وجدول التوقيعات (Deed.tsx) — فيُعزل «(أب الأب)» بـ LTR ISOLATE.
- **بند ٦ — الرقم التسلسلي على الشاشة:** تحويل طبقة العزل من `unicodeBidi: isolate` إلى `unicodeBidi: embed` + LRO/PDF (U+202D/U+202C) داخل النص — يطابق معالجة المحضر ويصحح ترتيب «SLM-٢٠٢٦-٠٠٠٥١».
- **بند ٧ — الجناح ١٦ في QA:** جناح جديد يختبر `bidiWrapReason` مباشرةً بثلاثة نماذج (صXX-RLM / guillemet-RLM / paren-ISOLATE) مع برهان مرحلي على أن النسخة القديمة كانت ستُخفق.
v2.61.0 — حزمة العرض الجراحية الخماسية: أصل المسألة + محضر + تصنيف العصبة
٢٫٦١٫٠- **بند ١ — تصنيف مسائل المقاسمة (heirClassification.ts + AslBreakdownCard.tsx):** `getHeirType` كان يُصنِّف الأخ الشقيق في مسائل المقاسمة (جد+أخ+أخت) ضمن «فرض» لأن نمطَي الكشف لم يتطابقا مع أسباب المحرك. الإصلاح: توسيع أنماط `TASIB_BINAFSIHI` بـ «عصبة، يقاسم» و«بمنزلة الأخ يقاسم» و«ينفرد بكل التركة»، وأنماط `TASIB_BIGHAYR` بـ «تعصيب مع الأخ:» — فيصبح `isAllTaskib = true` وتتوافق بنية الخطوات. © Mosleh.
- **بند ٢ — خطوة ١+٢ لمسائل المقاسمة (AslBreakdownCard.tsx):** الخطوة ١ كانت تعلن «جميع الورثة عصبة» بدون ذكر الأصل. الإصلاح: (أ) الخطوة ١ تقول «لا صاحب فرض — الأصل من عدد رؤوس المقاسمة: [أصل]»؛ (ب) الخطوة ٢ لم تكن تظهر أصلاً لمسائل all-tasib — أُضيف فرع «٢) العصبة والمقاسمون» يسرد كل وارث بسهمه من الأصل «الاسم: س / [أصل]». © Mosleh.
- **بند ٣ — خطوة ٣ لمسائل تجمع العصبة المختلطة (AslBreakdownCard.tsx):** جدول الخطوة ٣ في مسائل مثل (زوجة+أم+ابن+بنت) كان يعرض سهام الأصل المصحح (٧٢) لا الأصل الفرضي (٢٤)، وعمود «منكسر؟» يُظهر «لا» لفريق العصبة رغم أن ١٧ لا تنقسم على ٣ رؤوس. الإصلاح: حين `poolFactor ≠ null`، يُعرض للفروض `sahmAtAsl ÷ poolFactor` وللعصبة `canonicalResidualAtFardAsl` مع ملاحظة «حوض العصبة» و«منكسر: نعم»؛ العنوان يُشير إلى «أصل الفروض ([٢٤])». © Mosleh.
- **بند ٤ — مرجع نقصان الأم (Deed.tsx):** `detectHaibNaqsan` كانت تُسنِد نقصان الأم بالفرع الوارث إلى «ص٤–٥» (موضع أحكام الزوجين) عوضاً عن «ص٤» (موضع حكم الأم). الإصلاح: تغيير `citation: byDesc ? "ص٤–٥" : "ص٨"` إلى `"ص٤"`. © Mosleh.
- **بند ٥ — توحيد تسمية الجد (Deed.tsx):** `HEIR_ROLE["paternal_grandfather"].ar` و`HEIR_ROLE_DEF_AR["paternal_grandfather"]` كانتا «الجد لأب» بينما المحرك يستخدم «الجد (أب الأب)». الإصلاح: توحيد كلا الحقلين إلى «الجد (أب الأب)» في Deed.tsx. © Mosleh.
v2.60.0 — حزمة العرض الجراحية السداسية: محضر + نتيجة + أصل المسألة
٢٫٦٠٫٠- **بند ١ — SINGULAR_TO_PLURAL (Deed.tsx):** توسيع خريطة تطبيع المفاتيح بخمسة عشر مدخلاً camelCase جديداً (grandfather/fullBrother/fullSister/paternalBrother/paternalSister/maternalBrother/maternalSister/sonsOfFullBrother/sonsOfPaternalHalfBrother/fullUncle/halfUncle/sonsOfFullUncle/sonsOfHalfUncle/paternalGrandmother/maternalGrandmother) — تُحوَّل إلى مفاتيح underscore HEIR_ROLE_DEF_AR المقابلة؛ بدلاً من عرض المفتاح الخام «fullBrother الأول» يصبح «الأخ الشقيق الأول». وتصحيح الـ fallback من المفتاح الخام إلى «وارث»/«Heir». © Mosleh.
- **بند ٢ — جناح ١٠ (qa-gate.mjs):** توسيع اختبارات ssrLoadModule بثمانية حالات جديدة تشمل مفاتيح v2.60.0 (grandfather/fullBrother/fullSister/paternalBrother/maternalSister/sonsOfFullBrother/fullUncle/paternalGrandmother) + محاكاة pre-fix تثبت أن «grandfather» كان يُنتج المفتاح الخام قبل الإصلاح. تحديث اسم الجناح إلى v2.60.0. © Mosleh.
- **بند ٣ — عازل bidi خانة الوارث (Deed.tsx):** خلية «الوارث» في جدول الأنصبة غُلِّفت بـ `<bdi>` و`bidiWrapReason` — تمنع انعكاس الأقواس في أسماء مثل «الجد (أب الأب)» في بيئات PDF/RTL. © Mosleh.
- **بند ٤ — خطوة التصحيح لمسائل ابن+بنت (AslBreakdownCard.tsx):** الخطوة ٤ كانت تعلن «لا يوجد انكسار» في مسائل مثل (زوج+أم+ابن+بنت) مع أن الأصل صُحِّح من ١٢ إلى ٣٦. الإصلاح: حساب `poolFactor = finalAsl ÷ canonicalFardAsl` حين يكون `finalAsl > canonicalFardAsl` وليس كل التسبيب بالعصبة — ويُعرض: «يُضرب أصل الفروض (١٢) في مصحح تجمع العصبة (٣) لتصبح المسألة من: ٣٦». © Mosleh.
- **بند ٥ — حجب نقصان الأم بالفرع الوارث (Deed.tsx):** `detectHaibNaqsan` للأم كانت تعتمد فقط على `reason.includes("نقصاناً")` فلا تكتشف الحالة حين يكون الحجب بالفرع الوارث (لا يحتوي النص هذه الكلمة). الإصلاح: الشرط يصبح `(hasDesc || reason.includes("نقصاناً"))` — حين `hasDesc`: سبب «وجود الفرع الوارث» ومرجع «ص٤–٥»؛ وإلا: «وجود الأب» ومرجع «ص٨». © Mosleh.
- **بند ٦ — إصلاحان في طبقة العرض:** (أ) `buildPerPersonDisplay` (Deed.tsx): حذف سطر «٠ × المبلغ» حين يكون `lowerCnt = 0` (جميع الأسهم متساوية). (ب) `shareDisplay` (Result.tsx): للعصبة المختلطة (ابن+بنت)، إظهار كسر الفرد الفعلي (`h.fraction`) بدل كسر الفريق كله — يُصحح «النصيب (لكل فرد)» ليعكس حصة الفرد فعلاً لا حصة الفريق (ابن: ٧/١٨، بنت: ٧/٣٦ في المثال). © Mosleh.
v2.59.0 — ثلاث ضربات جراحية bidi في قسم الورثة المحجوبين (شاشة + PDF)
٢٫٥٩٫٠- **بند ١ — PDF: إصلاح انزياح «ص:٣٧٢» (numFmt.ts):** `bidiWrapReason` تُضيف regex جديداً يُغلِّف النمط `ص[أرقام]+:` في U+2067 RTL ISOLATE — يُثبِّت النقطتين بعد رقم الصفحة في محركات PDF التي كانت تُزيحها قبل الرقم فتُعطي «ص:٣٧٢» بدل «ص٣٧٢:». © Mosleh.
- **بند ٢ — PDF: إصلاح تشتت علامات الاقتباس عند التفاف السطر (numFmt.ts):** تغيير تغليف `«[^»]*»` من U+2066 LTR ISOLATE إلى U+2067 RTL ISOLATE — الاقتباسات العربية في RTL context لا تحتاج LTR isolation؛ الـLTR كان يُبعثر `«»` عند كسر السطر في PDF. © Mosleh.
- **بند ٣ — الشاشة: إصلاح «(منهاج ص٢٢)» المنشطر (numFmt.ts):** معالج `(...)` في `bidiWrapReason` يستبدل الآن المسافات الداخلية بـNBSP (U+00A0) قبل التغليف — يمنع الخوارزمية البيدية من اتخاذ الفراغ حداً لمستوى الاتجاه فتُشطر وحدة المرجع؛ الآن «(منهاج ص٢٢)» وحدة متماسكة على الشاشة. © Mosleh.
حزمة التصويب الجراحي v2.58.0 — عزل ثنائي الاتجاه + تفصيل المحجوبين + إصلاح النسبة المئوية
٢٫٥٨٫٠- **بند ١ — bidiWrapReason (numFmt.ts):** دالة جديدة تُعزل كل نص سبب حجب أو استحقاق بمُعزِّلَي LTR الضمني U+2066/U+2069 حول كل قوس `(...)` واقتباس `«»` — تمنع انعكاس الأقواس العربية في المستعرضات ذات تصيير RTL/LTR مختلط. تُستخدَم في Result.tsx وDeed.tsx لعمود «البيان» في جداول المحجوبين. © Mosleh.
- **بند ٢ — تفصيل «allSiblings»/«paternalSiblings» في Result.tsx:** المحرك يُنشئ صفاً مجمَّعاً للإخوة المحجوبين؛ الآن يُفكَّك تلقائياً إلى صفوف فردية (أخ شقيق / أخت شقيقة / أخ لأب …) بحسب المدخلات — مع مفرد/مثنى/جمع صحيح (ثلاثية العربية والإنجليزية والأردية) والإبقاء على السبب والاستشهاد المشتركَين. © Mosleh.
- **بند ٣ — نفس التفصيل في Deed.tsx (المحضر):** قسم «ثالثاً: ورثة محجوبون عن الميراث» في المحضر يعتمد الآن `expandDeedBlockedHeirs` بنفس منطق التفصيل؛ عمود «البيان» يعرض `bidiWrapReason` بدل `isolateCitations`. © Mosleh.
- **بند ٤ — إصلاح رأس عمود Deed.tsx + حذف الاستشهاد المكرر:** رأس عمود «البيان» يعرض الآن الأقواس المعكوسة المناسبة للـ RTL: «البيان )نوع الحجب والمرجع(». حُذف `{fmtCitation(h.citationPage, lang)}` المكرر من خلية البيان (كان مكرراً لأن السبب نفسه يتضمن الصفحة). © Mosleh.
- **بند ٥ — إصلاح fmtPercent (numFmt.ts) + جناح 9 (qa-gate.mjs):** `fmtPercent` تُعيِّن الآن `minimumFractionDigits: 2` — مجموع النسب يعرض «١٠٠٫٠٠٪» لا «١٠٠٪». جناح 9 يضيف فحصاً ج (ح١/١٤ب): نمط `minimumFractionDigits:2,maximumFractionDigits:4` يجب أن يوجد في حزم .js كدليل تصريفي على التنفيذ. © Mosleh.
حزمة إظهار حجب الحرمان — عمودا العدد والنصيب صفر في شاشة النتيجة + قسم المحجوبين في المحضر + جناح 15
٢٫٥٧٫٠- **بند ١ — شاشة النتيجة (Result.tsx):** قسم «ورثة محجوبون حرماناً» الموجود أُعيد هيكلته — أُضيف عمود «العدد» يعرض `h.count` بالصيغة العربية، وعمود «النصيب» يعرض كلمة «صفر» (أحمر/data-testid: zero-share-{key}). الشارة الحمراء «حجب حرمان» (badge-hijb-hirman) ونص السبب وزر «لماذا؟» (WhyExplanationButton) محافظٌ عليها. © Mosleh.
- **بند ٢ — المحضر (Deed.tsx):** أُضيف قسم «ثالثاً: ورثة محجوبون عن الميراث» بعد جدول الأنصبة مباشرةً، يظهر فقط عند وجود محجوبين. يعرض جدولاً بثلاثة أعمدة: الوارث + العدد + البيان (شارة «محجوب حجب حرمان» + نص السبب المُترجَم + رقم المصدر). المحجوبون لا يظهرون في جدول التوقيعات (سلوك محفوظ). القسم الرابع السابق (جدول الأصول) يُرقَّم «رابعاً» عند وجود محجوبين. © Mosleh.
- **بند ٣ — جناح 15 الجديد (qa-gate.mjs):** ثلاثة مستويات من الفحص: (أ) اختبار القبول الملزم عبر المحرك — زوج + أم + أخ شقيق (١) + أختان شقيقتان (٢)، تركة ١٢٬٠٠٠ — المتوقع: زوج=٦٠٠٠، أم=٦٠٠٠ (رد)، إخوة ثلاثة محجوبون بالأم وحدها (دعائم ص٣٧٢). (ب) حزمة Result تحتوي «table-blocked-heirs» + «badge-hijb-hirman» + «zero-share-». (ج) حزمة Deed تحتوي «ورثة محجوبون عن الميراث» + «محجوب حجب حرمان» (برهان فشل قبل v2.57.0). © Mosleh.
تحقق مبكر من اسم المتوفى — حارس الخطوة الأولى + نافذة إدخال مضمَّنة + قاعدة §5.9 في الدستور
٢٫٥٦٫٠- **بند ١ — الحارس المبكر (الخطوة الأولى):** CaseInput.tsx: حقل «اسم المتوفى» يُعلَّم بنجمة حمراء وعبارة «(مطلوب لمحضر القسمة)». الانتقال من الخطوة ١ إلى الخطوة ٢ محجوب ما لم يُعبَّأ الحقل — يُعرض toast.error «أدخل اسم المتوفى للمتابعة» + حد أحمر على الحقل + رسالة خطأ تحتهُ. يُصفَّر الخطأ فور بدء الكتابة. © Mosleh.
- **بند ٢ — صمام الأمان الثاني مع زر «أدخل الاسم الآن»:** Result.tsx: عند محاولة إصدار المحضر بلا اسم (مسار قديم أو حالة محفوظة) — تُعرض نافذة مضمَّنة (Dialog) بدلاً من toast فقط: تحتوي رسالة «أدخل اسم المتوفى قبل إصدار المحضر» + حقل إدخال الاسم + زر «أدخل الاسم الآن وأصدر المحضر». بعد التأكيد: يُحدَّث caseInput في sessionStorage ويُفتح المحضر فوراً — لا إرجاع للمعالج ولا خسارة مدخلات. © Mosleh.
- **بند ٣ — قاعدة §5.9 في الدستور:** PROJECT_CONSTITUTION.md: أُضيف إلى § 5 (قواعد العمل للوكيل) البند التاسع: «كل شرط استحقاق للتصدير يُفحص في أقرب نقطة إدخال له، ويبقى فحص المخرج صمام أمان لا واجهة أولى» مع توثيق التطبيق على اسم المتوفى والإصدار والتاريخ. © Mosleh.
- **بند ٤ — جناح 14 المحدَّث:** qa-gate.mjs: أُضيف فحص دائم: حزمة CaseInput تحتوي نص الحارس المبكر «أدخل اسم المتوفى للمتابعة»، وحزمة Result تحتوي نص صمام الأمان «أدخل اسم المتوفى قبل إصدار المحضر» وزر النافذة «أدخل الاسم الآن». © Mosleh.
إصلاح جراحي: «أُنشئ» → «صدر» — إزالة محرف تشكيل U+064F من ذيل المحضر + جناح 14 محدَّث
٢٫٥٥٫٠- **العلة المشخَّصة:** كلمة «أُنشئ» = [U+0623 (أ) + U+064F (ضمة — combining diacritic) + U+0646 + U+0634 + U+0626]. محركات PDF تُعزل محرف التقييد U+064F عند كسر السطر المختلط RTL/LTR — ينفصل «ُأ» وحده في سطر مستقل بين سطر الإصدار وسطر إشعار التجريبية، كما وقع فعلياً في المحضر SLM-٢٠٢٦-٠٠٠٢٧. © Mosleh.
- **الإصلاح:** Deed.tsx: استبدال «أُنشئ هذا المحضر بتاريخ» بـ«صدر هذا المحضر بتاريخ» في متن الذيل العربي. «صدر» = [U+0635 + U+062F + U+0631] — ثلاثة حروف أساسية بلا أي محرف في نطاق U+064B..U+065F — مستحيل انفصال أي محرف تقييد. ترتيب الذيل المؤكَّد: (١) سطر الحقوق [Mosleh]، (٢) «صدر هذا المحضر بتاريخ ... (... هـ)»، (٣) «— صادر من نسخة تجريبية». © Mosleh.
- **جناح 14 المحدَّث:** qa-gate.mjs: (أ) فحص «صدر هذا المحضر» موجود في حزمة Deed؛ (ب) فحص «أُنشئ هذا المحضر» غائب من الحزمة (إثبات غياب النمط القديم المتيم)؛ (ج) برهان Unicode محاسَبي أن «صدر» خالٍ تماماً من نطاق U+064B..U+065F — يطبع codepoints الثلاثة في الإخراج عند كل بناء. © Mosleh.
حزمة إصلاح PDF المحضر — أربعة بنود: bidi التسلسلي + انكسار «أُنشئ» + حارس اسم المتوفى + جناح 14
٢٫٥٤٫٠- **بند ١ — إصلاح انعكاس الرقم التسلسلي بـ bidi:** Deed.tsx: دالة FmtSerial تُحاط الرقم (SLM-٢٠٢٦-٠٠٠٢٤) بعزلَين مزدوجَين — (أ) CSS: dir="ltr" + unicodeBidi:"embed" + display:"inline-block"؛ (ب) Unicode LRO (U+202D) قبل النص وPDF (U+202C) بعده — فيُلغى أي تأثير لخوارزمية bidi ويظهر الرقم يساراً-يميناً على الشاشة وفي ملف PDF. © Mosleh.
- **بند ٢ — إصلاح انكسار «أُنشئ» في ذيل PDF:** Deed.tsx: ذيل المحضر كان div واحداً يحتوي «Mosleh | أُنشئ هذا المحضر بتاريخ...» — وكان مُحرِّك PDF يُفكِّك «أُ» عن بقية الكلمة عند نهاية السطر المختلط LTR/RTL. الإصلاح: سطران div منفصلان — الأول للحقوق («Mosleh»)، الثاني لبدء الإنشاء («أُنشئ...»). «أُنشئ» تبدأ دائماً من أقصى اليمين فلا انكسار ممكن. © Mosleh.
- **بند ٣ — حارس اسم المتوفى:** Result.tsx: زر «إصدار المحضر» يتحقق أن caseInput.estate.deceasedName غير فارغ قبل فتح نافذة المحضر. إذا كان فارغاً يُظهر toast.error «أدخل اسم المتوفى قبل إصدار المحضر» ويمنع فتح الصفحة — فلا يُصدَر محضر باسم «غير محدد». © Mosleh.
- **بند ٤ — جناح حارس 14:** qa-gate.mjs: فحوصات دائمة على حزمة Deed وreportSeal — (أ) وجود LRO (U+202D) + PDF (U+202C) في Deed bundle؛ (ب) وجود نمط «SLM» في reportSeal bundle؛ (ج) برهان نصي: السنة تسبق الرقم بعد LRO؛ (د) «أُنشئ هذا المحضر» + «Mosleh» كلاهما في Deed bundle والنمط القديم الأنبوبي غائب؛ (هـ) رسالة حارس الاسم في Result bundle. © Mosleh.
حزمة إصلاح نافذة «لماذا؟» — أربعة بنود: undefined + bidi + استشهاد مكرر + جناحا حارس 12 و13
٢٫٥٣٫٠- **بند ١ — إصلاح «undefined/undefined» في فرع حجب النقصان:** دالة amountRationaleFor في whyExplanation.ts كانت تقرأ maxShare.numerator وmaxShare.denominator؛ الحقلان غير موجودَين في كلاس Fraction (حقوله .n و.d). أُصلح إلى maxShare.n/maxShare.d ؛ الأسماء العربية (النصف/الربع/الثمن/الثلث/السدس) تظهر الآن صحيحة مع أرقام عربية شرقية معرَّبة بـ arabize(). © Mosleh.
- **بند ٢ — bidi النافذة المنبثقة «لماذا؟»:** WhyExplanationDialog.tsx: كل نصوص النافذة (العنوان، الشرط، فقرة التفسير، قوائم الحجب، ذيل الشاهد) لُفَّت بـ <bdi> واستُدعيت isolateCitations() على النصوص التي تحتوي مراجع صفحات — فاعتدلت الأقواس التي كانت مقلوبة «)ص٤–٥ ).». © Mosleh.
- **بند ٣ — تنقية الاستشهاد المشوه والمكرر:** النص القديم كان يدرج heir.reason (الذي يحمل استشهاداً داخلياً بصيغة «صص٤-٥») ثم يُلحق (ص٤–٥) مرةً أخرى. النص الجديد يحذف heir.reason من فقرة amountRationale (يُعرض مستقلاً في قسم «الشرط») ويُبقي استشهاداً واحداً نظيفاً (ص...) في الذيل. © Mosleh.
- **بند ٤ — جناحا حارس 12 و13:** جناح 12: (أ) يمسح HTML المُعتمَد مسبقاً بحثاً عن «undefined»/«null»/«NaN»/«[object Object]» في النص المرئي؛ (ب) يتحقق أن .numerator/.denominator غائبان من الحزم (بُرهان «فشل قبل الإصلاح، نجاح بعده»). جناح 13: (أ) يختبر Intl.NumberFormat(«ar-EG») ينتج ٫ (U+066B) لا . ؛ (ب) يتحقق أن حزمة numFmt تحتوي locale عربي. © Mosleh.
حزمة تصويب v2.52.0 — ثمانية بنود: bidi + ٪ + خانتان عشريتان + لماذا-نقصان + جناح 11
٢٫٥٢٫٠- **بند ١ — عزل bidi لأقواس شاشة النتائج:** عازل LTR (U+2066/U+2069) يُطبَّق على: رأسَي عمود «النصيب (لكل فرد)» في البطاقة والجدول، قالب «الباقي تعصيباً (٧ من ٨)» في shareDisplay، ووسم <bdi> مع isolateCitations على حقل «الحكم» لكل صف (صفوف الورثة وصفوف المحجوبين في الجدولَين). © Mosleh.
- **بند ٢ — خانتان عشريتان مضمونتان في المبالغ:** fmtAmount في numFmt.ts: أُضيفت minimumFractionDigits: 2 إلى جانب maximumFractionDigits: 2، فبات المبلغ ١١٬٣٤٢٫٦٠ لا ١١٬٣٤٢٫٦ في جميع صفحات التطبيق. © Mosleh.
- **بند ٣ — علامة النسبة العربية ٪:** fmtPercentSign(lang) يُضاف إلى numFmt.ts (٪ U+066A للعربية والأردية، % لإلإنجليزية)؛ جميع مواضع % اللاتينية في شاشة النتائج والملكية المشتركة (٦ مواضع) صارت تستدعيها. رأسا عمود «النسبة %» في جدول الورثة والملكية المشتركة صارا «النسبة ٪». © Mosleh.
- **بند ٤ — عزل الرقم التسلسلي (النتيجة والمحضر):** Result.tsx: span[dir=ltr style=unicodeBidi:isolate] لـ serialNumber. Deed.tsx FmtSerial: U+2066/U+2069 استُبدلا بـ dir="ltr" style=unicodeBidi:isolate على العنصر؛ ترتيب SLM-YYYY-NNNNN مضمون في أي سياق bidi. © Mosleh.
- **بند ٥ — إصلاح انكسار «أُنشئ» في ذيل المحضر:** ذيل Deed.tsx أُعيد هيكلته: حُذفت <bdi> من النصوص العربية (ترث dir="rtl" من العنصر الأم مباشرةً)، وأُضيف whiteSpace:nowrap على span يلفّ جملة «أُنشئ هذا المحضر بتاريخ» لمنع قطع الكلمة عند حدود السطر. © Mosleh.
- **بند ٦ — تفسير زر «لماذا؟» لحالة حجب النقصان:** amountRationaleFor في whyExplanation.ts: فرع حجب النقصان أُضيف قبل العودة العامة — يعرض الفرض الأصلي الأعلى (النصف/الربع/الثلث) والفرض الآيل (الربع/الثمن/السدس) ونص الحكم من المحرك مباشرةً مع الاستشهاد. © Mosleh.
- **بند ٧ — الجناح 11 في qa-gate: تغطية Result.tsx الديناميكية:** الجناح 6 فحص HTML المُعتمَد مسبقاً؛ /result يُرسم بهيكل «لا بيانات» لا بجدول ورثة فعلي. الجناح 11 يفحص Result-*.js مباشرةً: U+2066 (عزل bidi)، U+066A (٪)، minimumFractionDigits (خانتان عشريتان). © Mosleh.
- **بند ٨ — isolateCitations وfmtPercentSign مُصدَّرتان من numFmt:** الدالتان أُضيفتا بشكل رسمي إلى صادرات numFmt.ts ليُعيد استخدامهما Result.tsx والمكونات المستقبلية دون تكرار الشيفرة. © Mosleh.
حزمة تصويب محضر قسمة التركة — ستة بنود (الجناح 10 المُحدَّث)
٢٫٥١٫٠- **إصلاح ١ — تطبيع مفتاح المُفرَد إلى الجمع (بند ١):** المحرك يُعيد مفتاح «son»/«daughter» (مفرد) في بعض التوليفات، بينما HEIR_ROLE_DEF_AR مُفهرَس على «sons»/«daughters»؛ أُضيفت دالة normalizeHeirKey وبُنيت SINGULAR_TO_PLURAL تُصحِّح المفتاح في buildSigLabel فلم يعد يظهر «son الأول» في جدول التوقيعات. © Mosleh.
- **إصلاح ٢ — عزل bidi للأقواس (بند ٢):** عازل LTR (U+2066/U+2069) يُطبَّق على: رأس عمود «النصيب (كسر)»، مراجع «(صXX)» في عمود الحكم عبر isolateCitations، «(اختياري)» في خانة المقوِّم، والتاريخ الهجري في الذيل. الذيل أُعيد هيكلته بوحدات bdi وspan dir=ltr منفصلة لمنع انفصال «أُنشئ» عن بقية الجملة. © Mosleh.
- **إصلاح ٣ — عزل الرقم التسلسلي (بند ٣):** FmtSerial استُبدلت span dir=ltr بعازلَي Unicode U+2066 وU+2069 لضمان ترتيب المقاطع (SLM ثم السنة ثم الرقم) في أي سياق bidi بصرف النظر عن المتصفح أو وضع الطباعة. © Mosleh.
- **إصلاح ٤ — تسوية الهللة في النصيب الفردي (بند ٤):** buildPerPersonDisplay يُحلُّ تناقض الهللة بعرض سطرين عند وجود بقية: «R × مبلغ_أعلى» + «(N-R) × مبلغ_أساس»؛ مجموعهما يساوي إجمالي الفئة بالضبط فلا تناقض حسابي في محضر قسمة مُوقَّع. © Mosleh.
- **إصلاح ٥ — بيان حجب النقصان الصريح (بند ٥):** detectHaibNaqsan يكتشف حجب النقصان الفعلي (الزوجة: ربع→ثمن، الزوج: نصف→ربع، الأم: ثلث→سدس بحسب نص المحرك) ويُضاف في عمود الحكم والمرجع بيان مستقى من ناتج المحرك بصيغة «حُجبت نقصاناً من X إلى Y — السبب: ... (صXX)». © Mosleh.
- **إصلاح ٦ — الجناح 10 المُحدَّث بالخرج الفعلي لا النص الحرفي (بند ٦):** الجناح القديم كان يفحص النص الحرفي في الحزمة (لا الخرج الديناميكي) فأخفق في كشف «son الأول». الجناح المُحدَّث يُحمِّل buildSigLabel عبر ssrLoadModule ويختبره بمفاتيح إشكالية مباشرة (son/1/ar→«الابن الأول»)، ويتحقق من عازل LTR (U+2066) في الحزمة، ويُثبت «كان سيخفق قبل الإصلاح» بمحاكاة. © Mosleh.
حزمة إصلاح بيئة النشر — فصل بوابة الجودة عن سكربت النشر
٢٫٥٠٫٠- **فصل بوابة الجودة عن بيئة النشر (بند ١):** كشف تشخيص سجلات النشر أن قاطع أمن Replit أنهى البناء في مرحلة تحويل Vite («Security scan skipped: connection lost») قبل وصول التنفيذ لـ qa-gate.mjs أصلاً. الحل المعتمَد (بأمر المالك): أُضيف سكربت `build:ci` في package.json يضم خطوات `vite build + prerender + SW` فقط بلا qa-gate، وحُدِّث artifact.toml لاستخدامه في النشر. بوابة الجودة تبقى إلزامية كاملة في `build` المحلي — لا جناح يُعطَّل ولا فحص يُخفَّف. © Mosleh.
حزمة إصلاح قالب المحضر وجناح الحارس العاشر — ثمانية بنود
٢٫٤٩٫٠- **إصلاح قالب المحضر (بند ١–٨):** أُعيدت كتابة Deed.tsx بالكامل لإصلاح ثمانية أخطاء: (١) تسمية الوارث — buildSigLabel بدل دمج الاسم اللاتيني؛ (٢) ترتيبات أدوات العدد العربية (أحد عشر لا ١١)؛ (٣) إزالة ازدواج شارة الاستشهاد [{h.citationPage}]؛ (٤) إصلاح نص document.title (محضر قسمة تركة)؛ (٥) إضافة toArabicEasternDigits في hijri.ts؛ (٦) تشفير الأرقام بالعربية الشرقية في الطباعة؛ (٧) إصلاح وضع الشارات؛ (٨) تحديث qa-gate.mjs بجناح ١٠ يحرس هذه الإصلاحات. © Mosleh.
حزمة إغلاق ق١٧ واستكمال التوثيق — ثلاثة بنود بأمر المالك
٢٫٤٨٫٠- **اعتماد ق١٧ نهائياً (بند ١):** المالك حقق صورة منهاج ص٧ بنظره المباشر بتاريخ ١٧-٠٧-٢٠٢٦ وأثبت العبارة حرفياً: «لا يرث مع الولد إلا الأبوان والزوجان والجدة تغير ذلك.» — رُفع وسم «معلَّق» من display_text وtransfer_note في bookCitations.ts، واستُبدل بنص اعتماد صريح. إعمالاً للقاعدة الدستورية §5.8. © Mosleh.
- **ترابط ق١٧ مع ق١٨ (بند ٢):** أُضيف في transfer_note شاهد ق١٧ وفي ملاحظة بطاقة ق١٨ تصريحٌ بأن شاهد منهاج ص٧ (المعتمَد بق١٧) سند نصي مباشر من متن المنهاج لإضافة الجدات إلى استثناء بطاقة «الابن عصبة بنفسه» (ق١٨)، يتقوى به إلى جانب حاشية دعائم ص٣٧٣. © Mosleh.
- **تصويب رواية ق٢٣ (بند ٣):** صُحِّح نص ق٢٣ في rules.ts والسجل والChangelog ليذكر ثلاثة مواضع لا موضعاً واحداً: (١) ملاحظة بطاقة «حجب الجد» وسجل الإصدارات (الحزمة الموثقة رجعياً)؛ (٢) ملاحظة بطاقة «نصيب الجدتين»؛ (٣) ملاحظة بطاقة «طُعمة أم الأب» — الموضعان (٢) و(٣) صُوِّبا ضمن حزمة ح١ في ١٧-٠٧-٢٠٢٦. حُذفت لفظة «ابتداءً» التي أوهمت بغياب الخطأ. © Mosleh.
حزمة تصويب ترقيم السجل — أربعة بنود بأمر المالك
٢٫٤٧٫٠- **تصويب ترقيم ق٢٤ (بند ١):** نُقل قيد «حذف الاستنباط من تعريف العول» من الرقم ق٢٠ إلى الرقم ق٢٤ بنفس نصه وتعليله وتاريخه في كل المواضع (rules.ts والسجل) — الرقم ق٢٠ كان خطأً مزدوجاً: قفزٌ فوق ق١٩ المحجوز، وإعادةُ استخدامٍ لرقمٍ أُخلي للتو بإعادة ترميز الحزمة. © Mosleh.
- **ق٢٠ — خلوٌ محجوب بقيد إداري (بند ٢):** ق٢٠ أُخلي بإعادة ترميز حزمة التنفيذ إلى ح١ بتاريخ ١٧-٠٧-٢٠٢٦، ولا يُعاد استخدامه لأي قيد جديد. التسلسل المستقيم النهائي: ق١٧ معلَّق | ق١٨ الابن عصبة | ق١٩ تصويب إسناد الجدة | ق٢٠ خلوٌ محجوب | ق٢١ الأوزان الثلاثة | ق٢٢ حواجب الجد | ق٢٣ تصويب الملك | ق٢٤ حذف الاستنباط. © Mosleh.
- **تحقق نطاق ق٢٣ (بند ٣):** ⟵ صُحِّحت رواية هذا البند في الإصدار ٢.٤٨.٠: ق٢٣ يغطي ثلاثة مواضع لا موضعاً واحداً — بطاقتا «نصيب الجدتين» و«طُعمة أم الأب» صُوِّب فيهما «الملك» إلى «المالك» ضمن حزمة ح١ في ١٧-٠٧-٢٠٢٦، والموضع الثالث بطاقة «حجب الجد» ضمن الحزمة الموثقة رجعياً. © Mosleh.
- **إصدار القواعد — ثابت مسمى (بند ٤):** أُضيف تعليق JSDoc صريح لـ RULES_VERSION في reportSeal.ts: «إصدار القواعد — منظومة الفرائض الإسماعيلية وقيود التحقيق النصي». الطبقات الثلاث المسماة في رأس التقرير: إصدار القواعد ٣٫٢٫٠ | إصدار التطبيق ٢٫٤٧٫٠ | إصدار التحقيق ٣٫١٫٠. © Mosleh.
حزمة منظومة التوثيق والسجل — ستة بنود بأمر المالك
٢٫٤٦٫٠- **ق١٧ معلَّق + قاعدة §5.8 (بند ١):** يُعلَّق قيد ق١٧ (شاهد منهاج ص٧ — «والجدة تغير ذلك») صراحةً بانتظار تحقيق المالك للصورة؛ display_text وtransfer_note في bookCitations.ts حُدِّثا للتصريح بالتعليق. أُضيف إلى PROJECT_CONSTITUTION.md §5 البند ٨: «قيود التحقيق النصي (ق-رقم) لا تصدر إلا عن تحقيق المالك للصور مباشرةً». [أُغلق واعتُمد في الإصدار ٢.٤٨.٠ بتحقيق المالك المباشر بتاريخ ١٧-٠٧-٢٠٢٦]. © Mosleh.
- **توثيق رجعي ق١٨ (بند ٢+٣):** بطاقة «الابن عصبة بنفسه» — أُضيف «والجدات» صريحاً إلى قائمة الباقين معه (منهاج ص٧ + مختصر ص٤٩٣). نُفِّذ ١٧-٠٧-٢٠٢٦؛ وثَّقه المالك رجعياً بأمره. © Mosleh.
- **توثيق رجعي ق٢٤ (بند ٢+٣):** بطاقة «لا عول» — حُذف لفظ «الاستنباط» لنسب الحكم نصاً مباشراً (دعائم ص٣٨١ + منهاج ص١٦). نُفِّذ ١٧-٠٧-٢٠٢٦؛ وثَّقه المالك رجعياً. كان مُرقَّماً خطأً ق٢٠ في النسخة الأولى من هذا الإصدار — صُوِّب إلى ق٢٤ في الإصدار ٢.٤٧.٠. © Mosleh.
- **توثيق رجعي ق٢١ (بند ٢+٣):** بطاقة «نصيب الأم» — أُوضحت الأوزان الثلاثة: ١/٦ مع الولد، ١/٦ مع الأب والحاجبين، ١/٣ في غير ذلك (منهاج ص٤، دعائم ص٣٧٤). نُفِّذ ١٧-٠٧-٢٠٢٦. © Mosleh.
- **توثيق رجعي ق٢٢ (بند ٢+٣):** بطاقة «حجب الجد» — أُكملت قائمة الحاجبين الخمسة (الوالد والولد وولد الابن والأم والبنت)؛ كانت «الأم والبنت» ساقطتين من الإصدار السابق (مختصر ص٤٩٣، دعائم ص٣٧٥). نُفِّذ ١٧-٠٧-٢٠٢٦. © Mosleh.
- **توثيق رجعي ق٢٣ (بند ٢+٣):** تصويب لفظ «الملك» إلى «المالك» في ثلاثة مواضع من قسم الجدات والأجداد — خطأ تحريري لا شرعي: (١) ملاحظة بطاقة «حجب الجد» وسجل الإصدارات (هذه الحزمة)؛ (٢) ملاحظة بطاقة «نصيب الجدتين»؛ (٣) ملاحظة بطاقة «طُعمة أم الأب» — الموضعان (٢) و(٣) صُوِّبا ضمن حزمة ح١ بتاريخ ١٧-٠٧-٢٠٢٦ (مُصحَّح في الإصدار ٢.٤٨.٠). © Mosleh.
- **فك ازدواج الرمز ق→ح (بند ٤):** الرمز «ق» يبقى حصراً لقيود التحقيق النصي المفردة — حزم التنفيذ تُرمَز بـ«ح»؛ أُعيد ترميز ما كان «ق٢٠» وفروعه في جميع المواضع إلى «ح١» وفروعها؛ وأُعيدت تسمية «حارس ق٢٠» إلى «حارس ح١» في بوابة الجودة. © Mosleh.
- **إثبات الحارس وتغطية PDF (بند ٥):** حارس ح١ يُضمِّن الآن كائن شواهد منظم (`evidence: [{بند, سلسلة, وُجد}]`) في qa-report.json؛ تغطية PDF مُثبتة: نفس الحزمة المبنية تخدم الشاشة وطباعة المتصفح — فحص واحد يُثبت كليهما. © Mosleh.
- **طبقات الإصدارات — تسمية صريحة (بند ٦):** ثلاث ثوابت مسماة في reportSeal.ts: APP_VERSION (إصدار التطبيق = 2.46.0)، RULES_VERSION (إصدار القواعد = 3.2.0)، VERIFICATION_COMPLETED_VERSION (إصدار التحقيق الكامل = 3.1.0)؛ يُعرَض «إصدار التطبيق» في رأس التقرير بجانب «إصدار القواعد». © Mosleh.
حزمة التصويبات ح١ — خمسة عشر بنداً: أحكام وعرض وبوابة جودة موسَّعة
٢٫٤٥٫٠- **الرد — قيد «من غير الزوجين» (ح١/٤):** أُضيف القيد الصريح «من غير الزوجين» إلى تعريف الرد في مسرد المصطلحات اتساقاً مع النص المباشر من منهاج الفرائض ص٥ ومختصر الآثار ص٤٩٢. © Mosleh.
- **الخنثى المشكل — «بحاجة لمراجعة خبير» (ح١/٥):** وُسِمت بطاقة الخنثى بـ«بحاجة لمراجعة خبير» لأن طريقة أخذ المتوسط لم يثبت لها شاهد حرفي مباشر من الكتب الثلاثة المعتمدة — المصادر تذكر مبدأ التقدير دون نص صريح يُقرِّر الحساب بهذه الطريقة. © Mosleh.
- **الجدة أم الأب — تصويب العنوان (ح١/٨):** حُذف «— مختصر الآثار» من عنوان البطاقة لأن المصدر المعتمد هو حاشية دعائم ص٣٧٧ ناقلةً عن المختصر، لا متنه مباشرةً — تطبيقاً للقيد ق١١. © Mosleh.
- **أرقام عربية في رأس التقرير (ح١/١٣):** الرقم التسلسلي وإصدار القواعد يُعرَضان بالأرقام العربية الشرقية (مثل ٢٠٢٦-٠٠٠١٤ و٣٫٢٫٠) في وضع اللغة العربية — بادئة SLM تبقى لاتينية مؤقتاً بقرار المالك. © Mosleh.
- **سطر مجموع النسب (ح١/١٤):** أُضيف سطر «مجموع النسب: ١٠٠٫٠٠٪» (data-testid="text-total-percent") أسفل جدول الأنصبة ليُؤكِّد للمستخدم صحة التوزيع الكلي. © Mosleh.
- **أرقام الإصدارات بالعربية في سجل الإصدارات (ح١/١١):** شارات أرقام الإصدارات في صفحة سجل الإصدارات تُعرَض بالأرقام العربية الشرقية (مثل ٢٫٤٥٫٠) في وضع اللغة العربية. © Mosleh.
- **الجناح ٩ — حارس ح١ (ح١/١٥):** أُضيف جناح تاسع إلى بوابة الجودة يتحقق من وجود «مجموع النسب» وجدول تحويل الأرقام العربية في حزمة Result-*.js، وكُسِّعت تغطية فحص «needs_review» لتشمل صفحة /textual. © Mosleh.
تخليد ميثاق المالك ديباجةً حاكمة — بأمر المالك المباشر
٢٫٤٤٫٠- **ديباجة PROJECT_CONSTITUTION.md:** أُدرجت الديباجة الحاكمة «ميثاق المالك» في صدر دستور الثوابت قبل كل بند — نصها: «كل عملنا يجب أن يكون وفق المصادر لا الجمهور، وهو ما ذكره القاضي النعمان — فالمصادر الثلاثة (منهاج الفرائض، دعائم الإسلام، مختصر الآثار) هي الحاكم الوحيد، وما لا نص فيه يُوقَف، وأي حكم أو صياغة أو اقتراح على مذهب الجمهور مردودٌ مهما كان مصدره» — هي المرجع الأعلى عند أي تعارض تفسيري بين بنود الدستور. © Mosleh.
- **صدر replit.md:** أُدرج سطر الميثاق «ميثاق المالك — يُقرأ قبل كل مهمة» بنصه الحرفي في صدر replit.md ليُقرأ قبل كل مهمة من أي وكيل. © Mosleh.
- **صفحة المنهجية:** أُضيف صندوق «ميثاق صاحب التطبيق» (data-testid="charter-owner") قبل قسم المصادر الثلاثة — ينقل نص الميثاق الكامل بالعربية أصلاً مع توضيح بالمعنى بالإنجليزية والأردية. © Mosleh.
- **حارس الديباجة (الجناح ٨):** أُضيف جناح ثامن إلى بوابة الجودة يتحقق من حضور عبارتَي الميثاق الحاكمتين في ثلاثة مواضع: PROJECT_CONSTITUTION.md وreplit.md وdist/public/methodology/index.html — أي مساس بالديباجة في أي موضع يُحمِّر البوابة فوراً. © Mosleh.
تصويبات المسرد الاصطلاحي — خمسة بنود بموافقة المالك على المصادر المحققة + حاكمية العول/الخنثى + شارات الشاهد
٢٫٤٣٫٠- **الفرض:** ذُيِّل التعريف بـ«أو نقصِ تزاحمٍ (لا عول)» اتساقاً مع شارة نقص التزاحم وحارس المسار — لا عول غير معمول به في هذا المذهب نصاً لا استنباطاً. © Mosleh.
- **ذوو الفروض:** «الجدة» استُبدلت بـ«الجدات» جمعاً اتساقاً مع القراءة الجمعية المعتمدة وبطاقة الجدة المصوَّبة. © Mosleh.
- **التعصيب:** ذُيِّل التعريف بالضابط الرباعي المنصوص: «وأربعةٌ من الرجال يعصبون أربعاً من النساء...» (منهاج ص٦)؛ أُضيف شاهد BookWitnessButton لص٦؛ أُدرجت بطاقة مصدر جديدة (ص٦ منهاج، pending_comparison) في bookCitations.ts. © Mosleh.
- **الحجب:** ذُيِّل التعريف بسطر التمييز: «ويُفرَّق عن حجب النقصان نقصُ التزاحم: نقصٌ يقع على البنات والأخوات عند ضيق التركة عن الفروض لا بوجود حاجب (لا عول)». © Mosleh.
- **الرد:** أُدرج لفظ النص «على قدر سهامهم» بين الشرطتين إلى جانب «بنسبة أنصبتهم» تدقيقاً للصياغة. **اللقيط:** أُضيفت إحالة المصدر (منهاج ص٣١–٣٢؛ مختصر ص٤٩٨) وزر الشاهد ص٣١. **ابن الملاعنة:** أُضيفت إحالة المصدر (منهاج ص٣٢–٣٣؛ مختصر ص٤٩٨) وزر الشاهد ص٣٢. © Mosleh.
- **حاكمية العول والخنثى:** استُخرج تعريفا العول والخنثى المشكل إلى ثابتَين مسمَّيَين (AWL_GLOSSARY_DEF / KHUNTHA_GLOSSARY_DEF) فوق مصفوفة GLOSSARY — مصدر واحد لكل منهما مع تعليق يربطه ببطاقة rules.ts، يضمن عدم الافتراق مستقبلاً. **البنية:** GLOSSARY type أُضيف إليها حقل witnessPage? اختياري، ويعرض BookWitnessButton عند وجوده في خلية المسرد. © Mosleh.
إغلاق واقعة البلاغ الظاهري + الجناح ٧ (حارس تفرد مصادر البيانات) + لمسة UX بصفحة القواعد
٢٫٤٢٫٠- **لوحة الجودة — واقعة البلاغ الظاهري:** بلاغ تكرار بطاقتي الغرقى والهدمى وحول التطبيق حُقِّق فيه قبل أي تنفيذ (إعمالاً للبرومنت الدائم) فثبت: لا تكرار في مصدر البيانات (٤٨ معرفاً فريداً، صفر مكررات في h2/h3/testId)، والظهور المتعدد للفظ «الغرقى والهدمى» مشروع: رابط تنقل + عنوان فئة + عنوان بطاقة + ذكر في المتن — لم يُحذف شيء والمحتوى المحقَّق سليم. كشف التحقيق ثغرة غياب حارس التفرد على مستوى مصدر البيانات فأُضيف في هذا الإصدار. © Mosleh.
- **الجناح ٧ — حارس تفرد مصادر البيانات (qa-gate.mjs):** فحص جديد دائم يُحمِّل عبر ssrLoadModule: (أ) معرفات BUILT_IN_RULES فريدة — لا id مكرر في مصفوفة القواعد؛ (ب) عناوين BUILT_IN_RULES فريدة داخل كل فئة؛ (ج) شواهد BOOK_CITATIONS فريدة بمفتاح (page+source+rawText80) — لا إدراج مزدوج؛ (د) أرقام صفحات DAAIM_CHAPTER_INDEX في BookBrowse.tsx فريدة (قراءة نص مباشر). أي تكرار يُحمِّر البوابة قبل وصوله للواجهة. © Mosleh.
- **لمسة UX — صفحة القواعد:** حين تحتوي فئة على بطاقة واحدة فقط يُطبَّق على عنوانها تنسيق فرعي وصفي (نص أصغر ولون ثانوي) بدلاً من التنسيق العريض نفسه الذي يُستخدم عنوانَ الفئة h2 — يُزال الالتباس البصري «العنوان المتجاور» دون أي تعديل في البيانات أو المعرفات أو النصوص المحقَّقة. © Mosleh.
تصويبات تحريرية في بطاقات الجدات والأجداد — خمسة بنود بموافقة المالك ١٧-٠٧-٢٠٢٦
٢٫٤١٫٠- **حجب الجد (تصويب ١): إضافة الولد والبنت إلى خماسي الحاجبين.** كانت الصياغة «بالولد أو ولد الابن، وبالأب، وبالأم» — الصحيح المنصوص: «بالوالد وبالولد وولد الابن وبالأم وبالبنت» (دعائم ص٣٧٥). المحرك على الصواب طوال الوقت؛ الخلل تحريري في نص البطاقة فقط. © Mosleh.
- **نصيب الجدتين (تصويب ٢): تصحيح إحالة ص٤٩٧ → ص٤٩٣ في المتن والمصادر الثانوية.** كانت «مختصر الآثار ص٤٩٧» مخلَّفةً من خريطة إزاحة قديمة — الصحيح ص٤٩٣ («الجدة ترث مع الأبوين ومع أحدهما السدس»)؛ وأُضيف شاهد حاشية دعائم ص٣٧٧ («للجدة مع الأب من قِبَله السدس»). تبقى حاشية ص٣٧٣ في موضعها لمثال المزاحمة العددي. © Mosleh.
- **الجدة أم الأب في طبقة فروع الإخوة (تصويب ٣): حذف «ص٤٩٤» من الإسناد.** النص لا يرد في متن المختصر مباشرةً بل في حاشية دعائم ص٣٧٧ الناقلة عنه — تحذف الإحالة الزائدة ويبقى الإسناد: «حاشية دعائم ص٣٧٧ عن مختصر الآثار». © Mosleh.
- **شاهد ص٢٧ «العلو بدرجة» (تصويب ٤): إضافة raw_text وdisplay_text للشاهد الحرفي.** «وكذلك إن علوا بعد أن يكونوا على درجة واحدة لا يتغير أحد» — مُثبَت بالحقلَين المعياريَّين وفق بروتوكول التحقيق. © Mosleh.
- **تقويل الملاحظات عربياً (تصويب ٥):** رموز needs_review/verified/incomplete في حقول الملاحظات استُبدلت بمقابلاتها العربية (قيد المراجعة/موثّقة/موقوفة)؛ أرقام الإصدارات v3.1.0/v2.23.0 → الإصدار ٣.١.٠/الإصدار ٢.٢٣.٠؛ التواريخ اللاتينية → أرقام هندية. فحص الجناح ٦ يُضيف اكتشاف needs_review في HTML المُعتمَد. تواريخ bookCitations.ts موثَّقة بالأرقام الهندية. © Mosleh.
رفع إيقاف الغرقى — الآلية الخماسية المنصوصة مُفعَّلة (قرار المالك الثاني ٢٠٢٦/٠٧/١٦)
٢٫٤٠٫٠- **قرار المالك الثاني ٢٠٢٦/٠٧/١٦:** رفع الإيقاف وتنفيذ القراءة النصية الحرفية للآلية الخماسية لتوارث الغرقى بعد الوقوف على النصَّين الكاملين (مختصر ص٥٠١ ودعائم ح١٣٨٢). وسم الاستيثاق: «موثقة — قراءة نصية اعتمدها المالك، ويبقى عرضها على مختص للاستيثاق مستحباً». © Mosleh.
- **غرقاEngine.ts — الآلية الخماسية:** (١) تُقسَّم تركة كل غريق على ورثته الأحياء مع الغرقى الآخرين كأحياء، (٢) وعاء انتقالي يجمع ما ورثه كل غريق ثم يُقسَّم على ورثته الأحياء، (٣) لا توارث فيما جرَّه الميراث (لا دور)، (٤) الباقي لبيت المال، (٥) بيان المسار لكل مستفيد. المدخل الرئيسي: `coVictimHeirType` — صفة الغريق الوراثية بين الغرقى. الاختبارات الثلاثة الملزمة اجتازت المحرك. © Mosleh.
- **الاختبارات الثلاثة الحرفية الملزمة (فحص ٤٦/٤٧/٦٠):** مختصر ص٥٠١ (الموليان: مولى الألف يرث مائة ومولى المائة يرث ألفاً) + دعائم ح١٣٨٢ (ابن الفقير يرث مائة ألف الغني) + مثال الشركاء (زوجة الأول ٨٢٥٠/زوجة الثاني ٧٥٠٠/بيت المال ٢٠٢٥٠). نجحت الثلاثة في المحرك. © Mosleh.
- **صفحة الغرقى (/gharqa) — إعادة كتابة:** من صفحة إيقاف إلى واجهة حساب تفاعلية كاملة: نموذج إدخال لكل غريق (الورثة + حجم التركة + صفته الوراثية بين الغرقى)، جدول نتائج لكل غريق يبيّن (من التركة الأصلية | من الوعاء الانتقالي | المجموع)، مع شارة «قراءة نصية — استيثاق مختص مستحب» وعرض الشواهد الثلاثة. © Mosleh.
- **قاعدة `gharqa-simultaneous-death` — تحديث الحالة:** `suspended_by_owner` → `verified` مع نص قاعدة محدَّث يصف الآلية الخماسية الكاملة والمصادر الثلاثة. الاختبارات ٤٦/٤٧/٦٠ محدَّثة من `gharqa_suspended` إلى `gharqa_result` بقيم مبالغ حرفية. الدستور محدَّث: البند المعلق → مُغلَق. © Mosleh.
المرحلة ج: منهاج الفرائض الدفعة الرابعة الختامية ص٣٩–٥٣ — ٩ شواهد جديدة + ١ استدراك نقل + ٤ مطابَقة + ختمة توثيقية + إعلان الإتمام (QA53)
٢٫٣٩٫٠- **ص٣٩–٤٤ (فصل ميراث الزوجين — قواعد أصول المسائل):** ستة شواهد جديدة مطابَقة بلفظ صورها: ص٣٩×٣ (النصف→سهمان/الثلث/الثلثان→ثلاثة/الربع/النصف→أربعة؛ الثلثان+السدس→ستة «ثم على هذا الترتيب»؛ الثمن→ثمانية) + ص٤٠ (توافق: ربع+سدس → نصف الستة في الأربعة=اثنا عشر) + ص٤١ (امرأة+أب+زوج+ابن من اثني عشر) + ص٤٢ (تباين: ابنتان+زوجة — الثلثان والثمن والرد بالرحم لا بالفرض). ص٤٣–٤٤: قُرئتا حرفياً (أمثلة تطبيقية). © Mosleh.
- **استدراك نقل ص٤٥ (فصل أهل الذمة — المثال الافتتاحي):** النص السابق «وإذا مات كافر وترك ابناً كافراً وأخاً مسلماً فالمال بينهما نصفان» غير موجود حرفياً على ص٤٥ — تلك المسألة على ص٤٦. أُثبت المثال الافتتاحي الحقيقي «نصرانيٌّ مات وترك ابناً نصرانياً وابناً مسلماً وبنتاً مسلمة فالمال بينهم للذكر مثل حظ الأنثيين» + قاعدة الفصل الافتتاحية «المسلم يرث من النصراني ولا يرث النصراني» — كلاهما مطابَق بصرياً من صورة ص٤٥. لا أثر على أي حكم محسوب. © Mosleh.
- **ص٤٦–٤٩:** تحديث `verification_status → matched` لأربع بطاقات. **ص٥٠ (القاعدة الجامعة الخاتمة):** إضافة `raw_text`/`display_text` بلفظ الصورة الحرفي وتحديث → `matched`. حُسم البند المعلق: «مثال ص٤٥ تطبيقٌ من أفراد قاعدة ص٥٠ الجامعة ولا تعارض بينهما». © Mosleh.
- **ص٥١ (خاتمة المصنف — شاهد توثيقي):** «تم بحمد الله الانتهاء من إعداد الكتاب في يوم السبت الواحد والعشرون من شهر رمضان المبارك لسنة ألف وأربع مائة وأربعين هجرية الموافق ٢٥ مايو سنة ٢٠١٩ ميلادية» — يُثبت هوية النسخة المعتمدة وتاريخ إعدادها. ص٥٢–٥٣: فهرس الكتاب قُرئ ويُثبت أن التغطية من ص٢ إلى ص٥١ مكتملة. © Mosleh.
- **إعلان الإتمام الجامع:** تحقيق «منهاج الفرائض» ص٢–٥٣ بالمطابقة البصرية الحرفية على صور المطبوعة — مكتمل بتمامه. المرحلة ج (د١+د٢+د٣+د٤): القيد ١٦ + ٦ استدراكات نقل + ٢٧ شاهداً جديداً + ٢٨ مطابَقاً. المجموع الكلي للقيود: ستة عشر (ق١–ق١٦). © Mosleh.
المرحلة ج: منهاج الفرائض الدفعة الثالثة ص٢٨–٣٨ — القيد ١٦ + ٣ استدراكات نقل + ٩ شواهد جديدة + ٨ مطابَقة (QA52)
٢٫٣٨٫٠- **القيد ١٦ — ضبط الضمائر ص٣١–٣٢ (اللقيط):** النص الأصلي دمج الحالة الأولى الحرفية من صدر الفقرة ص٣١ («إن مات اللقيط وترك زوجة فللزوجة الربع، وما بقي فلبيت المال») مع تعليل خاص باللقيطة (مؤنث) من ختام الفقرة («لأنها مجهولة النسب لا يقدر اللقيط أن يتقرب بأب ولا أم») — الضمير «لأنها/مجهولة» يعود على اللقيطة لا اللقيط، فبدا المعنى مضطرباً. الإصلاح: `raw_text` أُثبت بالحالة الأولى وحدها حرفاً بحرف من ص٣١؛ تعليل اللقيطة مُستخرَج شاهداً منفصلاً `verification_status: "matched"`. لا أثر على الحكم المحسوب. © Mosleh.
- **استدراك نقل ص٢٩ (الجدات — كتاب الاقتصار):** النص الأصلي «والجدة من قبل الأم وابنتها الأم باقية، فللجدة السدس طُعمة تُعطاه الاقتصار» غير موجود حرفياً على ص٢٩ — ص٢٩ تحمل مسائل كتاب الاقتصار المنقولة عن الإمام جعفر الصادق عليه السلام. النص المُثبَت: «رجل ترك أبوين وجدة فللجدة السدس وللأم الثلث، وما بقي للأب... هذه المسائل من كتاب الاقتصار» — حرفياً من ص٢٩. © Mosleh.
- **استدراك نقل ص٣٤ (الغرقاء — تنبيه فقهي للمالك):** النص الأصلي «لم يرث بعضهم من بعض» يعاكس ما تنص عليه ص٣٤ صراحةً: «فيرث كل واحد منهما من أخيه» بمنهج التقدير — المذهب الإسماعيلي يُورِّث الغرقاء بعضهم من بعض افتراضاً أن أحدهم عاش لحظةً (خلافاً للمذهب السني). النص المُثبَت: الفقرة الأولى من ص٣٤ حرفياً. **تنبيه للمالك:** يستلزم مراجعة قاعدة `gharqa-simultaneous-death` في المحرك بقرار شرعي. © Mosleh.
- **استدراك نقل ص٣٥ (ميراث المكاتب):** النص الأصلي «والمكاتَب لا يرث ولا يورث بقدر ما فيه من الرق» غير موجود حرفياً على ص٣٥ — ص٣٥ تُدير مسألة عددية عن مكاتب توفي مع ابن. النص المُثبَت: الجملة الحكمية الختامية من ص٣٥: «يقسم بينهم على فرائض الله وحكمهم بحكم الأحرار» حرفياً. © Mosleh.
- **تسعة شواهد جديدة مطابَقة:** ص٢٨ (جدين وجدتين — الثلثان من جهة الأب والثلث من جهة الأم بالسوية) + ص٢٩ (قال جعفر الصادق من الاقتصار: ثلاث جدات من قبل الأب كل منهن السدس) + ص٣١ (وكذلك في اللقيطة؛ لأنها مجهولة النسب لا يقدر اللقيط أن يتقرب بأب ولا أم) + ص٣٣×٢ (ابن الملاعنة مع زوجة+أم+أخ / مع زوج+ابن+بنت) + ص٣٤ (الردمى: فإنه يرث بعضهم بعضاً) + ص٣٨×٣ (طلاق الرجعة / طلاق في المرض: يُعطى إذا مات في العلة لا بعد البرء / فصل السهام المعروفة التي يصح منها الميراث). © Mosleh.
- **ثمانية شواهد موجودة حُوِّلت إلى `matched`:** ص٢٨×٢ (خال+خالة+عم+عمة؛ الجدة لا تسقط) + ص٣٠×٢ (ابن+خنثى — ويُمسك السدس [raw لتنبيه الخنثى]؛ نصف نصيب الرجل ونصف نصيب المرأة) + ص٣٢ (ملاعنة إخوة+أم) + ص٣٣ (أم+زوج+بنت مع رد) + ص٣٦ (الحمل يوقف الميراث) + ص٣٧ (تنفس ساعة واحدة). المجموع الكلي للقيود: ستة عشر قيداً (ق١–ق١٦). © Mosleh.
المرحلة ج: منهاج الفرائض الدفعة الثانية ص١٥–٢٧ — القيد ١٤ + القيد ١٥ + تذييل ق١ + ١١ شاهد جديد + ١٢ مطابَق (QA51)
٢٫٣٧٫٠- **القيد ١٤ — استدراك نقل ص١٦ (لا عول):** نصّ شاهد «وإن تركت زوجاً وأبوين وابنتين» كان يُسقط «للزوج» قبل «الربع» — ثبتت الكلمة بمطابقة صورة ص١٦ والبنية التوازية مع كل فقرات الصفحة (كلها «فللزوج/للزوجة + الفريضة»). `verification_status: "transfer_corrected"` مع `raw_text` و`transfer_note`. لا أثر على الحكم المحسوب. © Mosleh.
- **القيد ١٥ — تصحيف مطبعة ص٢٢ (الجد بمنزلة الأخ):** المطبوعة تقرأ «أو من الأم» في خاتمة شرط المقاسمة، والصواب «أو من الأ[ب]» — تصحيف حرف «م» بدل «ب». سنده المزدوج: موازاة مختصر الآثار ص٤٩٣ (الجد للأب بمنزلة الإخوة الأشقاء والإخوة من الأب) + اقتضاء الحساب (الأخ من الأم سهمه السدس أو الثلث بالفرض لا النصف مقاسمةً — نص ص٢٢–٢٣ نفسه يُبطله). `verification_status: "corrected"`. لا أثر على المحرك. كما استُرجع الشرط المُسقَط كاملاً: «إن كان الأخ من الأب والأم أو من الأ[ب]». © Mosleh.
- **تذييل القيد الأول الافتتاحي [أباً]:** تبيَّن بالمطابقة البصرية أن نصّه موجود على ص١٥ لا ص٢٠ — صُوِّبت قيمة `page` من 20→15 في `bookCitations.ts`. أُضيف إلى سند التصحيح: «ثُبّت بالمطابقة البصرية على صورة ص١٥ ضمن الدفعة الثانية (2026-07-16)». © Mosleh.
- **أحد عشر شاهداً جديداً:** ص١٥×٢ (ابن الابن مع زوجة ← تنزيل ولد الابن منزلة الصلب؛ زوجة+ابن+أم) + ص١٨×٢ (رد الأخت الشقيقة ونظيرتها من الأب؛ الثلاث المتفرقات) + ص١٩×٢ (سهم الثلث للاثنين فأكثر مع حكم الرد؛ قاعدة الرد التجارية بلفظها) + ص٢٣ (الجد+ابن الأخ نصفان) + ص٢٤ (الجد مع أخ وأم: «ولا يأخذ الجد مع الأم شيئاً») + ص٢٥×٢ (أولوية عم الأب والأم على عم الأم؛ «كل من قَرُبَ يحجب من بَعُدَ») + ص٢٦×٢ (ابن عم+ابن خال ثلثان+ثلث؛ ابنة عم+ابن خال ثلثان+ثلث). جميعها `verification_status: "matched"`. © Mosleh.
- **اثنا عشر شاهداً موجوداً → مطابَق:** ص١٧×٢ + ص١٨ (ثلاث أخوات) + ص١٩ (الثلث) + ص٢٠ (الأختان المتفرقات) + ص٢١ (الأخان يحجبان الأم) + ص٢٣×٢ (إخواناً وجداً أثلاثاً؛ أخ من الأم وجد) + ص٢٦×٣ (عم وخال؛ عمة وخالة؛ ابن عم وخال) + ص٢٧×٤ (الجد والعم؛ جدان؛ أم الأب وأب الأم؛ حكم العلو). كلها `verification_status: "matched"`. © Mosleh.
- **تسجيل التغطية + QA51:** ثلاث عشرة صفحة مقروءة حرفياً (ص١٥–ص٢٧). المجموع الكلي للقيود: ق١–ق٨ (دعائم ص٣٦٥–٤٠١) + ق٩–ق١٢ (مختصر ص٤٩١–٥٠٢) + ق١٣–ق١٥ (منهاج ص٤–ص٢٢) = خمسة عشر قيداً. بوابة النشر: `pnpm --filter @workspace/inheritance-calculator run build` → `qa-report.json: overallPassed: true`. © Mosleh.
المرحلة ج: منهاج الفرائض الدفعة الأولى ص٢–١٤ — ١٠ مطابَقات + القيد ١٣ + ٥ شواهد جديدة (QA50)
٢٫٣٦٫٠- **المطابَقة الحرفية:** فتح وقراءة صور ص٢ وص٣ وص٤ وص٥ وص٧ وص١١ وص١٢ وص١٣. عشرة شواهد موجودة حُوِّلت إلى `verification_status: "matched"`: ص٢ (مطابَق جديد)، ص٣ (النصف والثلثان)، ص٤ (الثلث وسهم أولاد الأم والربع والثمن)، ص٥ (قاعدة القرب والرد)، ص٧ (لا يرث مع الولد إلا الأبوان والزوجان)، ص١٢ (زوجة+ابن)، ص١٣ (بيت المال الأول). © Mosleh.
- **القيد ١٣ — استدراك نقل ص٤ (السدس):** شاهد «وأما السدس» كان يُسقط عبارتَين من المطبوعة: (أ) «وما بقي لأولادهما» في وسط النص؛ (ب) «، فإنه يأخذ كل واحد منهما السدس» في الختام — ثبتتا بمطابقة صورة ص٤ حرفياً. `verification_status: "transfer_corrected"` مع `raw_text` و`display_text` و`transfer_note`. لا أثر على الحكم المحسوب. © Mosleh.
- **خمسة شواهد جديدة:** (١) ص٢ — أسباب الإرث الثلاثة (نسب/سبب/شبه النسب) الافتتاح التعريفي للمنهاج؛ (٢) ص١٢ — زوج+ابن (الربع للزوج وما بقي للابن)؛ (٣) ص١٢ — زوج+بنت بالفرض مع الرد على البنت دون الزوج؛ (٤) ص١٣ — بيت المال عند انعدام أقرباء الزوجة (لا يُزاد الزوج على النصف)؛ (٥) ص١٣ — بيت المال عند انعدام أقرباء الزوج (لا يُرد على الزوجة). جميعها `verification_status: "matched"`. © Mosleh.
- **تسجيل التغطية + QA50:** ص٦ وص٩ وص١٠ وص١١ وص١٢ مقروءة حرفياً ومسجَّلة في البند الدائم QA50. المجموع الكلي للقيود: ق١–ق٨ (دعائم ص٣٦٥–٤٠١) + ق٩–ق١٢ (مختصر ص٤٩١–٥٠٢) + ق١٣ (منهاج ص٤) = ثلاثة عشر قيداً. بوابة النشر: `pnpm --filter @workspace/inheritance-calculator run build` → `qa-report.json: overallPassed: true`. © Mosleh.
استرداد وسم البيتا + سد ثغرة الحراسة + حارس DOM إلزامي (QA49)
٢٫٣٥٫٠- **التشخيص:** وسم البيتا اختفى من المنشور بسببين مزدوجين: (أ) شارة Navbar كانت `hidden sm:inline-block` فتختفي على شاشات xs (<640px)؛ (ب) BetaBanner يستخدم `localStorage` بمفتاح ثابت `mawarith:beta-dismissed` يُخفيه إلى الأبد بعد أول إغلاق حتى في المنشورات الجديدة. الجذر: الدستور القديم نصّ «لا يعترض عليه الحارس» فأُعفي من أي حراسة DOM. © Mosleh.
- **الإصلاح (Navbar):** شارة البيتا `hidden sm:inline-block` → `inline-block` دائمة على كل الأحجام؛ إضافة `data-testid="beta-badge"` لتمكين حارس DOM؛ تعريب الأردية: `تجریبی` → `آزمائشی`. © Mosleh.
- **الإصلاح (BetaBanner):** مفتاح التخزين `mawarith:beta-dismissed` → `mawarith:beta-dismissed:v2.35` ليُعاد العرض لكل زائر عند كل إصدار رئيسي جديد، مع الاحتفاظ بالإغلاق على الجهاز داخل النسخة الواحدة. © Mosleh.
- **سد الثغرة في الدستور:** تحديث `PROJECT_CONSTITUTION.md` من «عنصر مؤقت لا يعترض عليه الحارس» إلى «عنصر مؤقت محروس — إلزامي حتى قرار مالك صريح». إضافة حكم الإلزام وقيد الإطفاء: لا يُطفأ `BETA_MODE` إلا بقرار مالك مُقيَّد في سجل الإصدارات. © Mosleh.
- **QA49 — حارس DOM إلزامي:** إضافة فحص دائم في `Tests.tsx`: إن كان `BETA_MODE=true` يجب وجود `[data-testid="beta-badge"]` في DOM؛ إن كان `false` يجب غيابه مع قيد إطفاء في سجل الإصدارات. أي تعارض بين المفتاح والمعروض يُحمِّر البوابة. © Mosleh.
- مفتاح تحكم مركزي `BETA_MODE` في `src/lib/siteConfig.ts` — تغيير قيمته إلى `false` يُطفئ كل عناصر الإشعار دفعة واحدة، لكنه يستلزم قيداً صريحاً في سجل الإصدارات.
المرحلة ب: تحقيق مختصر الآثار (491–502) — أربعة قيود + ستة شواهد جديدة + اكتمال التحقيق الكلي (12 قيداً)
٢٫٣٤٫٠- **قيد ٩ (استدراك نقل ص493):** شاهد الجدة المنفردة كانت ساقطة عنده عبارة «ولم يخلف غيرها» — النص الكامل: «فإذا لم يكن معها أحد ولم يخلف غيرها كان لها السدس بالتسمية والباقي بالرد فتحوز الميراث كله». لا أثر على الحكم. © Mosleh.
- **قيد ١٠ (استدراك نقل ص493):** شاهد الجدتين بالجهتين كانت ساقطة منه «منهن» في خاتمته — النص الكامل: «ومن سبقت من الجدات حجبت من بعدت منهن». لا أثر على الحكم. © Mosleh.
- **قيد ١١ (تصويب إسناد ص494):** نصّا «للجدة مع الأب من قِبَله السدس» و«إذا مات رجل وخلف ابن أخ وجدتين...» لا يردان في متن طبعة المختصر — مصدرهما الموثق: حاشية دعائم الإسلام ص377 ناقلةً عن مختصر الآثار. صُوِّبت البطاقتان (grandmother-father-side-branches-tuama + grandmotherFatherSide-blocked-with-parents) والشاهدان إلى «حاشية دعائم ص377 عن مختصر الآثار». الأحكام ثابتة بأسانيدها الأخرى (حديث الطعمة دعائم ص378، ومتن مختصر ص493، وقرار المالك المعتمد). © Mosleh.
- **قيد ١٢ (تصويب إحالة الدية ص497→ص500):** إحالة بطاقة الدية كانت تشير إلى مختصر ص497 — موضعها الصحيح ص500 (فصل القاتل والدية والخنثى). صُوِّبت الإحالة وأُضيف الشاهد الحرفي الكامل: «من قتل قتيلاً عمداً أو خطأً لم يرث منه ولا من ديته. والدية تورث على فرائض الله: يرث الرجل من دية امرأته وترث المرأة من دية زوجها، خلا الإخوة من الأم فإنهم لا يرثون من الدية شيئاً». مطابَق. © Mosleh.
- **ستة شواهد جديدة بحقلَيها:** ص493 «ولا يرث مع الولد والوالدين إلا الزوج والزوجة والجدة» · ص497 «ولا عول في فريضة» (نص النقص والزيادة كاملاً) · ص498 «واللقيط إذا وُجد...» (لا يرث ولا يورث) · ص500 القاتل والدية الحرفي · ص501 الرجعية والطلاق المريض · ص502 «فمن لم يُعرف له وارث فميراثه لبيت مال المسلمين». مطابَقة مع المطبوعة. © Mosleh.
- **اكتمال تحقيق مختصر الآثار ص491–502 + فهرس الفصول:** تحويل جميع شواهد المختصر إلى مطابَق. فهرس الفصول الاثني عشر (ص491–502) مُدرَج تعليقاً في bookCitations. بند دائم لوحة الجودة QA48: «التحقيق الحرفي — مختصر الآثار (491–502): مكتمل 100%». **المجموع الكلي: اثنا عشر قيداً** (دعائم ق1–ق8 + مختصر ق9–ق12). © Mosleh.
دفعة التحقيق الثالثة الختامية — دعائم الإسلام ص390–401 + ختام تحقيق الدعائم (ثماني قيود، ثلاث دفعات)
٢٫٣٣٫٠- **قيد ٧ — تصويب إحالة (ص392→ص391):** شاهدا الرجعية وطلاق المريض موضعهما الصحيح دعائم ص391 لا ص392. صُوِّبت بطاقتا القاعدتين + الشاهدان في bookCitations. بيانات الولاء تبقى ص391–392. لا أثر على الحكم. © Mosleh.
- **قيد ٨ — استدراك ذاتي معلن (اختلاف الدين ص398-400→ص385):** عزو المبدأين «لا يتوارث أهل ملتين» و«المسلم يرث الكافر» إلى ص398–400 كان خطأً تقديرياً قديماً — هذا النطاق فصل الحساب لا الأصول. صُوِّبت بطاقتا القاعدتين (kufr-bars + religion-difference) إلى ص385؛ ص398–400 تبقى لتفصيل الصور العشر. مكتشَفه: التحقيق الحرفي للمرحلة أ. © Mosleh.
- **إضافة توثيقية ص393 — شاهد مزدوج انفراد الزوجين:** تأويل المصنف بنصه «فلا يخلو أن يكون الزوج والمرأة ها هنا كان كل واحد منهما ذا قرابة لصاحبه أو مولى لا وارث له معه فورث المال بذلك» — الظاهر مؤوَّل؛ المعمول به: فرض الزوجية والباقي لبيت المال (منهاج ص١٣–١٤). مطابَق. © Mosleh.
- **تحديث ص394–397 (إرث النساء من العقار):** raw_text روايات الأعيان وليس للنساء من العقار. display_text يضم تأويل المصنف (ص٣٩٥–٣٩٧): «فأما ما كان مملوكاً للمورث فللنساء منه نصيب كما قال الله عز وجل». نطاق البطاقة موسَّع ص394–397. ملاحظة الحبوة (ص396): أعيانٌ واردة في روايات لا تُخصم حسابياً بغير تراضٍ. © Mosleh.
- **تحويل شامل ص390–401 → مطابَق:** الغرقى (ص391) + الولاء (ص391) + الرجعية وطلاق المريض (ص391) + شاهد مزدوج (ص393) + إرث العقار (ص394) + لا حبوة (ص396) + الحساب الديني (ص398 + ص400) — جميعها verification_status: matched. بند دائم في لوحة الجودة: ختام التحقيق الحرفي — دعائم الإسلام ص365–401: مكتمل 100%. © Mosleh.
دفعة التحقيق الثانية — دعائم الإسلام ص378–389 + سياسة الحذف المعلَّم
٢٫٣٢٫٠- **سياسة الحذف المعلَّم:** كل حذف من وسط شاهد حرفي يُعلَّم بـ[…] وجوباً في display_text مع قيد في corrections[] يذكر المحذوف وسببه. الحذف بنقاط مجردة (... أو …) خارج معقوفين محظور. الأصل إثبات النص كاملاً. أُضيفت السياسة في صفحة المنهجية § 7. حارس التحقيق QA45 يكشف المخالفات. © Mosleh.
- **استدراك نقل ص378 ح1351 (دعائم):** نصنا أسقط كلمة «منهم» من «ويُرَدُّ على الواحد منهم بالرحم». كلا الحقلين مُصحَّحان. لا أثر على الحكم. © Mosleh.
- **استدراك نقل ص386 ح1370 (دعائم) — إكمال حذف غير معلَّم:** نص «في العبد يُعتق والمشرك يُسلم على الميراث قبل أن يُقسم...» أُثبت كاملاً بدل صيغة النقاط المجردة السابقة. بُطاقة «وريث أسلم أو أُعتق بعد الوفاة وقبل القسمة» محدَّثة بالشاهد الكامل. لا أثر على الحكم. © Mosleh.
- **ضبط لفظ حاشية ص380 (دعائم) — مثال العمّتين:** raw_text وdisplay_text أُثبتا بلفظ المطبوعة: «وإذا مات رجل وخلف عمةً لأبيه وأمه وعمةً لأمه، كان للعمة التي للأب والأم خمسة أسداس، والسدس للعمة التي للأم». القيم الحسابية لم تتغير. © Mosleh.
- **أربعة شواهد مطابَقة جديدة:** ص382 «إن أول من أعال الفرائض عمر» (بطاقة العول)؛ ص385 «لا يتوارث أهل ملتين» و«المسلم يرث الكافر ولا يرثه الكافر» (بطاقة الموانع)؛ ص387 نص الدية كاملاً بخلا ولد الأم (بطاقة الدية). © Mosleh.
- **تحويل جميع شواهد النطاق ص378–389 → مطابَق:** الإدخالات الموجودة لص378 (الجدة؛ الأجداد)، ص380 (أولاد الإخوة)، ص381 (رمل عالج)، ص382 (لا عول)، ص383 (رد فاضل)، ص387 (الدية) — جميعها مُحدَّثة verification_status: matched. © Mosleh.
دفعة التحقيق الأولى — دعائم الإسلام ص365–377
٢٫٣١٫٠- **تصنيف جديد «استدراك نقل» (transfer_corrected):** يُستعمل حين يتبين أن نصنا المنقول أسقط أو غيَّر شيئاً من المطبوعة (الخلل عندنا لا فيها)؛ يُصحَّح raw_text وdisplay_text معاً للنص الكامل بلا معقوفات، مع بيان صريح في transfer_note أن السهو من النقل الأول — شفافيةً. © Mosleh.
- **استدراك نقل ص372 (دعائم):** نصنا السابق أسقط «وإخوة وأخوات لأم» — النص الكامل: «وإن مات رجل وترك أمه وإخوة وأخوات لأب وأم وإخوة وأخوات لأم وليس الأب حياً فإنهم لا يرثون ولا يحجبونها». لا أثر على الحكم: الحكم يعم الصنفين وكان مبرمجاً كذلك. مكتشَف: التحقيق الآلي للمرحلة أ. © Mosleh.
- **شاهد مُصوَّب ص373 (دعائم) — معقوفة شارحة:** raw_text: نص المطبوعة حرفياً «...وللأبوين الثلث وللجدة السدس...». display_text: «...وللأبوين الثلث [أي: السدسان] وللجدة السدس...». سند المعقوفة: اقتضاء الحساب المنصوص — من أربعة وعشرين للزوجة ثلاثة ولكل أب وأم أربعة (ثمانية = السدسان). لا أثر على الحكم. © Mosleh.
- **شاهدان مطابَقان ص374 (دعائم):** «وللواحد من ولد الأم السدس ذكراً كان أو أنثى، وللاثنين فصاعداً الثلث بينهم بالسواء، ذكرهم وأنثاهم فيه سواء» (حصص ولد الأم) + نص حصص الزوجين مع الولد وعدمه — مطابَقان مع صورة المطبوعة. © Mosleh.
- **تحويل ص375 وص377 (دعائم) → مطابَق:** شاهد «أولاد الإخوة يقومون مقام آبائهم» (ص375) وشاهد «الجد أقرب درجةً من ابن الأخ» (ص377) تحولا إلى verification_status="matched" بالمطابقة الحرفية مع صورة المطبوعة. © Mosleh.
- **توثيق تغطية ص365/367/369/371 (دعائم):** قُرئت الصفحات الأربع حرفياً من صور المطبوعة — محتواها احتجاجي (استدلالات مقارَنة، لا أحكام حسابية) — لا شواهد مخزنة منها؛ موثَّق في تعليق bookCitations.ts وعدّاد حارس التحقيق QA45. © Mosleh.
- **QA45 محدَّث:** عداد «استدراك نقل (transfer_corrected)» مستقل؛ تطبيع المسافات بعد نزع المعقوفات لاستيعاب الفراغ المتبقي حول [نص]؛ ذكر تغطية الصفحات الاحتجاجية في التفصيل. بوابة البناء: 27/27 ✓. © Mosleh.
عمود النسبة % + تعليقات فقهية للمحرك + دستور § 7
٢٫٣٠٫٠- **عمود النسبة المئوية في جدول الورثة:** أُضيف عمود «النسبة %» بين «المبلغ الإجمالي» و«الحكم والمرجع» في الجدول والبطاقات المحمولة وصف بيت المال. الخوارزمية: أكبر الباقي على أساس 10000 نقطة — مجموع العمود 100.00 مضمون رياضياً. يشمل بيت المال في الوعاء. لا أرقام لاتينية في العربية (يمر عبر `fmtPercent` من `numFmt.ts`). اختبار QA35 يُثبت صحة الخوارزمية في ست حالات اختبار. © Mosleh.
- **تعليقات فقهية شاملة للمحرك:** أُضيفت كتل توثيق فقهي معياري لجميع الدوال الرئيسية في `inheritanceEngine.ts` بصيغة: العنوان الفقهي + المصادر (منهاج/دعائم/مختصر + أرقام الصفحات) + بنود الشرح. المدوَّنة: `applyNasabAdjustments`، `checkGrandmotherConflicts`، `computeCore`، `computeSiblingPoolShares`، `computeSiblingBranchesResult`، `computeFourGrandparentsResult`، `calculateInheritance`، `computeDiyaPool`، `buildHeirList`، `mergeKhunthaResults`، `buildSteps`. تعليقات داخلية للزوجية والأبوين في computeCore. لا تعديل في أي منطق حسابي. © Mosleh.
- **PROJECT_CONSTITUTION.md § 7:** أُضيف قسم جديد «بروتوكول الوكيل الدائم» (سبع نقاط مُفصَّلة) بموافقة المالك: القانون الأعلى، المصادر والمحظورات الفقهية، ملفات الحقيقة، المحرك الذهبي + QA gate، بوابة النشر الإلزامية، حارس الشواهد النصية، هوية المشروع وصلاحية القرار الشرعي. سجل التعديلات § 6 مُحدَّث. `replit.md` مُحدَّث بالسبع نقاط موجزةً في قسم «دستور الثوابت الدائمة». © Mosleh.
إثبات الأوامر الثلاثة — حزمة الحراس الدائمة
٢٫٢٩٫٠- **الحادثة ١٥ — QA38 دبوس البنات لم يثبت في Tests.tsx:** الإصلاح طُبِّق على `qa-gate.mjs` (الحادثة ١٤) ولم يُطبَّق على `Tests.tsx` QA38 الذي يحتوي نسخة مطابقة من نفس الخطأ. **سبب عدم الثبات:** الإصلاح نُفِّذ ضيقاً في الملف الذي أظهر الفشل الأول (بوابة البناء) دون مسح جميع الملفات بحثاً عن النمط ذاته. **القاعدة الملزمة الجديدة:** أي إصلاح لنمط خطأ يجب أن يُطبَّق في كل مكان في الكودبيس يحمل نفس النمط — لا في الملف الفاشل وحده. **الإصلاح:** `find((h) => h.key === "daughter" || h.key === "daughters")` في كلا الموقعين (detail وpassed) في Tests.tsx وفي qa-gate.mjs. © Mosleh.
- **الحادثة ١٦ — ثغرة فحص السكربتات الخارجية (badge ↔ pill):** الفحص المبني كان يبحث حرفياً عن نص "replit-badge" فقط — فلو احتوى الناتج على سكربت باسم "replit-pill" أو أي اسم آخر من نفس النطاق لمرّ الفحص دون إنذار. **الإصلاح من المنبع:** `scripts/qa-gate.mjs` Suite 3 الجديدة تقرأ جميع ملفات HTML في `dist/public` وترفض أي `<script src="...">` من نطاق خارجي — قائمة السماح فارغة حالياً (لا نطاق خارجي مسموح بأي اسم). **إضافة QA46 في Tests.tsx:** يعدّ عناصر `<script src=...>` في الصفحة الحالية ويفشل عند وجود أي منها من نطاق خارجي. **القاعدة الملزمة الجديدة:** لا يجوز لأي فحص جودة أن يتخذ DOM صفحة الاختبارات مصدر بيانات حسابية أو قواعد فقهية.
- **الحادثة ١٧ — الترويسات بإثبات حرفي (includes ↔ مطابقة تامة):** QA43 في `Tests.tsx` كان يستخدم `cc.includes("max-age=31536000") || cc.includes("immutable")` — يمرِّر أي قيمة جزئية. في وضع التطوير (Vite dev) لا توجد أصول مُجزَّأة فيمرّ القيد دائماً بلا اختبار فعلي. **الإصلاحان:** (1) QA43 في Tests.tsx: مطابقة حرفية `cc === "public, max-age=31536000, immutable"` + يطلب ملف index أيضاً (`fetch origin + "/"`) ويقارن `indexCC === "no-cache"` ويُظهر كلا القيمتين في لوحة الجودة. (2) qa-gate.mjs Suite 4: يُشغِّل خادم الإنتاج المبني (`node server.mjs`) على منفذ عشوائي، يطلب أصلاً مُجزَّأً حقيقياً من `manifest.json` وملف index، ويقارن كلاً من `Cache-Control` حرفياً — يفشل البناء كله عند أي فرق. النتيجة المُثبَتة: `"public, max-age=31536000, immutable"` للأصول، `"no-cache"` للـ index. © Mosleh.
- **حادثة الهاش الخفية — رجكس server.mjs (hex ↔ Base62):** أثناء تشغيل qa-gate.mjs Suite 4 اكتُشف أن `server.mjs` كان يستخدم `[0-9a-f]{8,}` لتمييز الأصول المُجزَّأة — ولأن Vite يُنتج هاشاً Base62 (مثال: `Dgevxt3K` يحتوي أحرفاً كبيرة) فإن الرجكس لم يطابق أي أصل مُجزَّأ منذ نشأة المشروع — أي أصل JS/CSS كان يُخدَم بـ`max-age=3600` لا `immutable`. **الإصلاح:** الرجكس صار `/[-][A-Za-z0-9_]{6,}\.\.w+$/` في `server.mjs`، وتطابق منه كل فحوصات الجودة في `qa-gate.mjs` و`Tests.tsx`. **الدرس:** فحص الترويسات بالخادم المبني هو وحده يكشف هذا النوع من الثغرات — الفحص ببيانات الأداء (performance entries) في المتصفح لا يُظهر قيمة `Cache-Control`. © Mosleh.
- **بوابة الجودة 27/27:** إعادة هيكلة `qa-gate.mjs` لأربعة أجنحة: الجناح 1 (المحلل 20/20) + الجناح 2 (أمثلة+دبوس 7/7) = 27/27 بنداً معدوداً + الجناح 3 (سكربتات خارجية: صفر) + الجناح 4 (ترويسات: مطابقة حرفية). تقرير `qa-report.json` يسجِّل نتائج الأجنحة الأربعة. © Mosleh.
حزمة طوارئ المسارات — تدقيق الزميل
٢٫٢٨٫٠- **الحادثة ١١ — حلقة إعادة توجيه لا نهائية:** كان الخادم يُعيد التوجيه من `/مسار/` إلى `/مسار` (301)، بينما طبقة الاستضافة تُضيف الشرطة دائماً (`/مسار` → `/مسار/`) فتنشأ حلقة مفرغة. **الإصلاح:** حُذف وسيط شرطة النهاية بالكامل؛ اعتُمدت المسارات المنتهية بشرطة لأنها المتوافقة مع بنية `route/index.html` التي ينتجها prerender. كل من `/case` → `/case/` (إعادة واحدة فقط، ثم 200).
- **الحادثة ١٢ — ثغرة بوابة النشر:** كانت فحوصات الجودة (اختبار المحلل، اختبار الأمثلة) تعمل فقط في المتصفح على صفحة `/tests`، ولم تكن مربوطة بعملية البناء — فمرّ بناء فاشل إلى النشر دون علم. **الإصلاح:** أُنشئ `scripts/qa-gate.mjs` يُشغِّل 20 حالة caseParser وفحص اتساق الأمثلة عبر ssrLoadModule، يكتب `dist/public/qa-report.json`، ويُنهي العملية بكود 1 عند الفشل. أُضيف إلى نهاية سكريبت البناء في package.json.
- **إصلاح المحلل — 20/20 (كان 15/20):** خلل في دالة `normalise()` في caseParser — النمط `/و([^\s])/g` كان يُقسِّم كل واو تقع وسط كلمة: «توفيت» → «تو فيت»، «زوجة» → «ز وجه» — فتفشل 5 اختبارات (كشف الجنس وتعرُّف الزوجة). **الإصلاح:** نمط lookbehind: `/(?<![^\s])و([^\s])/g` يُقسِّم الواو فقط حين تبدأ كلمة (مسبوقة بمسافة أو بداية النص).
- **إزالة سكريبت replit-pill الخارجي من الإنتاج:** إضافة `runtimeErrorOverlay` من `@replit/vite-plugin-runtime-error-modal` كانت تُدرَج دون قيد في بناء الإنتاج وتحقن سكريبتاً خارجياً في HTML. **الإصلاح:** نُقلت الإضافة إلى الكتلة المشروطة `NODE_ENV !== "production"` لتبقى أداة تطوير خالصة، وبناء الإنتاج نظيف من أي سكريبت خارجي.
- **توحيد المسارات بشرطة نهائية:** حُدِّثت `sitemap.xml` (كل الروابط غير الجذرية)، `manifest.webmanifest` (اختصارات PWA: `/case/`، `/case/?lang=en`، `/case/?lang=ur`)، و`prerender.mjs` (رابط canonical) لاستخدام صيغة الشرطة النهائية المتوافقة مع بنية `route/index.html`. © Mosleh.
- **الحادثة ١٣ — خطأ Node.js في بوابة الجودة (navigator read-only):** أول محاولة نشر لـ v2.28.0 فشلت فوراً عند خطوة البناء بالخطأ الحرفي: `TypeError: Cannot set property navigator of #<Object> which has only a getter` في `setupBrowserGlobals()` سطر 37 من `qa-gate.mjs`. الجذر: `globalThis.navigator` في Node.js 18+ خاصية getter-only للقراءة فقط، لا يمكن تعيينها بـ `=`. **الإصلاح (سطر واحد):** حذف `globalThis.navigator = { userAgent: "node" }` وكذلك مجموعة `document` الوهمية — وحدات `caseParser` و`inheritanceEngine` لا تحتاج هذه المتغيرات المحلية مطلقاً.
- **الحادثة ١٤ — مفتاح مورث البنات في بيئة SSR (daughter ↔ daughters):** بعد إصلاح الحادثة ١٣، فشل دبوس م[3] في بوابة الجودة: `البنات=undefined amt=undefined أب=6000 أم=6000`. الجذر: الإنجين يستخدم المفتاح `"daughters"` (جمع) حين تكون البنات هن الورثة المرنون بلا ابن حقيقي (موثَّق في buildHeirList سطر ~٢١٨١ و~٢٢٢٠)، بينما كان الدبوس يبحث عن `"daughter"` (مفرد) فقط — وهو يعمل في المتصفح لسبب مختلف في مسار تحميل الوحدات. **الإصلاح (سطر واحد):** `find((h) => h.key === "daughter" || h.key === "daughters")` — نفس النمط الدفاعي الذي يستخدمه الإنجين نفسه. النتيجة النهائية: بناء نظيف من أوله لآخره، `qa-report.json` أخضر (محلل 20/20، أمثلة 6/6).
افتتاح سجل التحقيق — القيد الأول بقلم المالك
٢٫٢٧٫١- **القيد رقم ١ — ص٢٠ منهاج الفرائض (تصحيف: ابناً ← [أباً]):** في مسألة «زوجة وبنت وأب»، وقع في المطبوعة تصحيف «ابناً» عوضاً عن «أباً». السند ثلاثي: (أ) اقتضاء الجواب نفسه — الأب مذكور مرتين في حكم السهام؛ (ب) الحساب لا يستقيم إلا بالأب لا بالابن (زوجة ثمن + أب سدس + بنت نصف = ١٩/٢٤، الرد ٥/٢٤ بنسبة ١٢:٤ = ٣:١ فتصح من ٩٦)؛ (ج) الفقرة التالية سليمة وتُؤكد منهج الرد خلا الزوجين. لا أثر على الحكم المحسوب — القاعدة ثابتة بمجموع النصوص.
- **اختبار القبول ١٠٩:** مسألة الزوجة والبنت والأب بتركة ٩٦٠٠٠ مُقيَّدة رسمياً في حزمة فحص الدقة: الزوجة ١٢٠٠٠ (١/٨)، والبنت ٦٣٠٠٠ (٢١/٣٢)، والأب ٢١٠٠٠ (٧/٣٢).
- **شاهد مصوَّب في مخزن الشواهد:** الشاهد الأول بحالة «مصوَّب بمعقوفين» — يعرض المعقوف [أباً] بذهبي-كهرماني في نافذة الشاهد مع تلميح: النوع تصحيف مصوَّب، والسند الثلاثي، ونص المطبوعة «ابناً».
اعتماد منهجية تحقيق النصوص — بقرار المالك
٢٫٢٧٫٠- **السبب:** اكتشف المالك مواضع سقط وأخطاء إملائية في مطبوعة «منهاج الفرائض» — كان النص المعروض في التطبيق مستقيماً بينما في المطبوعة خلل — مما يدل على أن تطبيعاً صامتاً وقع أثناء النقل. صدر قرار بمنهجية رسمية لاعتماد النص وتصويبه بصدق وشفافية.
- **١ — ازدواج حقول الشاهد:** أُضيف للواجهة `BookCitation` حقلا `raw_text` (نص المطبوعة حرفياً) و`display_text` (النص المعروض، قد يحتوي [معقوفات]) مع `verification_status` (بانتظار المطابقة | مطابَق | مصوَّب) و`corrections[]` لكل معقوف بسنده. جميع الشواهد الحالية تبدأ بحالة «بانتظار المطابقة» و`raw_text = display_text = text` (الحقل الأصلي المحفوظ للتوافق). دوال مساعدة: `getRawText`, `getDisplayText`, `getVerificationStatus`.
- **٢ — عرض المعقوفات:** نافذة «الشاهد من الكتاب» وكل مواضع عرض النصوص تُميِّز المحتوى داخل `[...]` بلون ذهبي-كهرماني هادئ. عند لمسه: تلميح يُظهر نوع التصويب (سقط مثبت | تصحيف مصوَّب | زيادة مقحمة)، سنده، ونص المطبوعة الأصلي. يعمل بدون تصويبات محددة (يُظهر المعقوفات بلون فقط) وبتصويبات محددة (يُضيف Tooltip كاملاً).
- **٣ — صفحة «تصويبات النص — التحقيق» (`/textual`):** جدول التصويبات يبدأ فارغاً مع سطر تمهيدي «نثبت نصوص المطبوعات كما هي، ونصوّب بين معقوفين مسندين، ولا نطبّع نصاً بصمت». أعمدة الجدول: المصدر/الصفحة، نص المطبوعة، النص المصوَّب، النوع والسند، الأثر على الحكم (افتراضي: لا أثر)، تاريخ القيد والمكتشف. مفتوحة من «المزيد» في شريط التنقل ومن صفحة المنهجية.
- **٤ — حارس التحقيق QA45:** فحص آلي جديد في لوحة فحص الدقة يُقارن `display_text` بـ`raw_text` لكل شاهد: أي فرق خارج معقوفات موثَّقة يُسجَّل كـ«تطبيع صامت» ويُفشَّل الفحص. الحالة الراهنة: جميع الشواهد بانتظار المطابقة، الفحص خضر (لا فارق صريح بعد). يُدرج تقرير: مطابَق + مصوَّب + بانتظار = إجمالي.
- **٥ — قسم في صفحة المنهجية (٧):** «منهج تحقيق النصوص» — القاعدة الذهبية، عدة التصويب الثلاثية بالترتيب (الموازاة بين الكتب، اقتضاء الحساب، اقتضاء اللغة)، وأن التصويب النصي لا يُغيِّر حكماً محسوباً من تلقاء نفسه. رابط مباشر إلى سجل التصويبات.
- **© Mosleh:** سطور الحقوق في المصادر الثلاثة (منهاج / دعائم / مختصر) موجودة ومحفوظة: `© Mosleh — جميع الحقوق محفوظة`.
إصلاح فشل النشر — الحادثة الحادية عشرة: regex الهاش
٢٫٢٦٫١- **النوع (ب): خطأ في سكريبت البناء.** `buildSw.mjs` كان يستخرج هاش البناء بتعبير `/[0-9a-f]{8}/` (hex صغير فقط). Vite يُولّد هاشاً بصيغة base62 — أحرف كبيرة + صغيرة + أرقام (مثال: `QI8yXY-_`) — فلا يُطابق الـ regex فبقي `buildHash = "dev"` → `CACHE_NAME = "mawarith-3.2.0-dev"`. **المحتجِز:** بوابة `verifySw.mjs` الجديدة اشتغلت صح واحتجزت البناء (exit 1) قبل وصوله إلى الإنتاج — شهادة نجاح للمنظومة. **الإصلاح:** استبدال الـ regex بمقاطعة string: `indexOf("-")` (أول شرطة، لالتقاط الهاش الكامل بما فيه شرطاته) → `"QI8yXY-_"` صحيح. الـ fallback الاحتياطي مُصلَح بنفس المنطق. البناء الإنتاجي الكامل مجتاز الآن: 14 مساراً مُسبَق التقديم، عامل خدمة بهاش حقيقي، بوابة verifySw خضراء.
حزمة إغلاق فحص القبول الخارجي — 7 بنود
٢٫٢٦٫٠- **١ — محلل النصوص 20/20:** إصلاح 7 أنماط فاشلة في `caseParser.ts`: (أ) `\b` لا يعمل مع الحروف العربية في تعبيرات JS النمطية (العربية تُعدّ `\W`) — استُبدل بكل الأنماط العربية بـ`(?<!\S)`/`(?!\S)`؛ (ب) ألف التنوين الاتهامي «أباً»→«ابا» يمنع مطابقة الكلمة — أُضيفت خطوة `.replace(/ا(?=\s|$)/g, '')` في `normalise()`؛ (ج) واو العطف المتصل «وأم» تمنع بداية الكلمة — أُضيفت خطوة `.replace(/و([^\s])/g, 'و $1')` في `normalise()`؛ (د) جنس الأردو: «فوت ہوئی»→أنثى و«فوت ہوا»→ذكر لم يكن يُعيَّن — أُصلحا؛ (هـ) الضمير الإنجليزي: «He died» → ذكر أُضيف؛ (و) «مليون ريال» بلا رقم سابق → مليون — أُضيفت معالجة المضاعف المستقل؛ (ز) استنتاج الجنس من نوع الزوج: زوجة→ذكر، زوج→أنثى.
- **٢ — إصلاح حارس الأمثلة QA38:** الفاحص كان يتحقق من أن `مجموع المبالغ = التركة`، لكن مثال «عم وخال» ينتهي بباقٍ لبيت المال (كسر مجموعي < 1)، فيفشل الفحص بالخطأ. الإصلاح: يُحسب `baytalmalAmt = (1 - fracTotal) × estate` ويُدرج في المجموع. تمييز نصي في تقرير النجاح: «الخلل كان في الفاحص لا في الأمثلة».
- **٣ — الحادثة العاشرة: إصلاح SW كاش name في الإنتاج:** `buildSw.mjs` كان يفحص مجلد `assets/` بالقرص بدلاً من قراءة Vite manifest → في بعض بيئات النشر ينتهي الأمر بـ `CACHE_NAME = "mawarith-X.X.X-dev"`. الإصلاح: أُضيف `build.manifest: true` في `vite.config.ts` → يُولَّد `dist/public/.vite/manifest.json`؛ `buildSw.mjs` يقرأ منه الاسم الدقيق لملفات JS/CSS المُجزَّأة بدلاً من مسح القرص.
- **٤ — سكريبت `scripts/verifySw.mjs` الجديد:** يُضاف كآخر خطوة في أمر البناء. يفشل البناء (exit 1) إذا: لم يُستبدَل العنصر النائب `__SW_CACHE_NAME__`؛ أو انتهى اسم الكاش بـ`-dev`؛ أو لم يشتمل APP_SHELL على ملف JS الرئيسي المُجزَّأ أو ملف CSS. يمنع نشر SW معطوب صامتاً.
- **٥ — حذف شارة Replit نهائياً:** أُزيل `@replit/vite-plugin-dev-banner` من الكتلة الشرطية في `vite.config.ts` — الإضافة كانت مقيَّدة بـ`NODE_ENV !== production` لكنها كانت تظهر في وضع التطوير؛ الحذف نهائي من المصدر.
- **٦ — تطبيع الشرطة المائلة الزائدة:** `server.mjs` يُعيد توجيه `/مسار/` → `/مسار` (باستثناء الجذر `/`) بـ301 دائم — يضمن أن URL الكنوني لكل صفحة (`/rules` لا `/rules/`) هو ما يُقدِّمه الخادم فعلاً دون تحويل مزدوج.
- **٧ — فحص إعادة توجيه www (معلق):** البنية التحتية جاهزة (`server.mjs` يُعيد التوجيه منذ v2.25.0)؛ الفحص يُقرأ «معلق» ريثما يُربط `www.mawarith.app` بـDNS ويُضاف إلى منصة النشر — لا يلزم تغيير كودي إضافي.
حزمة التدعيم التقني ١٢ بنداً — SEO وأمان وأداء وجودة
٢٫٢٥٫٠- **١ — عامل الخدمة:** اسم الكاش مشتق آلياً من RULES_VERSION وهاش بناء Vite عبر سكريبت `scripts/buildSw.mjs` يُشغَّل بعد كل `vite build`؛ أُضيف `self.skipWaiting()` فور الثبيت لتسريع التحكم؛ الـ APP_SHELL يُوسَّع بملفات JS/CSS المُجزَّأة تلقائياً؛ `public/sw.js` يحمل الآن `__SW_CACHE_NAME__` كعنصر نائب يُستبدَل عند البناء.
- **٢ — تصحيح النطاق:** `public/sitemap.xml` و`public/robots.txt` و`public/llms.txt` — استُبدل `inheritance-calculator.replit.app` بـ`mawarith.app` في جميع الروابط؛ Sitemap والـ robots.txt كلاهما يشيران الآن إلى النطاق الرسمي.
- **٣ — إعادة توجيه www→apex:** `server.mjs` يُعيد توجيه `www.mawarith.app` إلى `mawarith.app` بـ301 دائم؛ يلزم لاكتمال التشغيل إضافة www.mawarith.app في إعدادات Domains بمنصة النشر وسجل CNAME عند مزود الدومين.
- **٤ — SPA fallback:** المسارات غير الملفية التي لا يوجد لها ملف مُسبَق التقديم (مثل `/deed` و`/tests/comprehensive`) تُقدَّم الآن بـindex.html الجذري (200) بدلاً من 404؛ المسارات ذات اللاحقة الملفية التي لا توجد فعلاً لا تزال تُعطي 404 حقيقياً.
- **٥ — إصلاح اختبار التخطيط QA 12:** نُقل قياس `scrollWidth`/`innerWidth` من داخل `useMemo` إلى `useLayoutEffect`؛ الجذر: داخل `prerender.mjs` كان `globalThis.window = globalThis` لكن `innerWidth` غير محدد → `window.innerWidth = undefined` → `"undefinedpx"` و`"NaNpx"` في الـ HTML المُسبَق التقديم؛ `useLayoutEffect` لا يُشغَّل في سياق Node مطلقاً.
- **٦ — manifest.webmanifest:** أُزيلت عبارة «المذهب الإسماعيلي» و«حصرياً» من حقل description؛ صياغة جديدة: «مستندةً إلى المصادر الثلاثة المعتمدة للقاضي النعمان: منهاج الفرائض والدعائم والمختصر».
- **٧ — رؤوس الأمان:** `server.mjs` يُضيف الآن: Content-Security-Policy · X-Frame-Options: DENY · X-Content-Type-Options: nosniff · Referrer-Policy: strict-origin-when-cross-origin · Permissions-Policy (camera/mic/geolocation/payment=none) · تعطيل X-Powered-By.
- **٨ — شارة Replit:** مُعطَّلة بالفعل في الإنتاج منذ v1.9.0 — `@replit/vite-plugin-dev-banner` مُقيَّد بـ`process.env.NODE_ENV !== "production"` في `vite.config.ts`؛ لا ملف يُضيفها في مجلد `public/` — البند مُغلَق بلا تغيير.
- **٩ — Privacy.tsx:** الفقرة الأولى تميّز الآن بوضوح بين: (أ) بيانات الميراث تُعالَج محلياً لا تُرسَل لأي خادم، (ب) تحميل أصول الموقع من خادم الاستضافة سلوك طبيعي لأي موقع، (ج) ملفات تقنية لازمة للتشغيل (كعامل الخدمة).
- **١٠ — viewport:** أُزيل `user-scalable=no` من `<meta name="viewport">` في `index.html`؛ `maximum-scale=5.0` بديلاً — يُتيح للمستخدمين ذوي الاحتياجات البصرية التكبير؛ شرط إمكانية الوصول (WCAG 1.4.4).
- **١١ — أداء الخادم:** أُضيف `compression` (gzip) من حزمة npm؛ رؤوس `Cache-Control` ذكية: الأصول المُجزَّأة بـVite (هاش في الاسم) تحصل على `max-age=31536000, immutable`؛ صفحات HTML تحصل على `no-cache`؛ باقي الموارد (SW، manifest، أيقونات) تحصل على `max-age=3600`.
- **١٢ — حراس جودة جديدة:** QA 39 (اسم كاش SW مشتق تلقائياً) · QA 40 (نطاق Sitemap صحيح) · QA 41 (manifest بصياغة المصادر الثلاثة لا المذهب) — جميعها فحوص حية تُشغَّل من المتصفح بجلب الملفات الفعلية؛ **اجتياز البوابة:** typecheck نظيف.
الحادثة التاسعة — تناقض عرض الأمثلة المحلولة: كسر الفرد بجانب مبلغ الفئة
٢٫٢٤٫٠- **الحادثة التاسعة — الوصف والجذر:** في صفحة الأمثلة المحلولة، مثال «بنتان وأبوان» كان يعرض للبنتين كسر ١/٣ (نصيب كل بنت منفردة) بجانب مبلغ ٢٤٬٠٠٠ (إجمالي الفئة)، فيما يقول الشرح «فرض الثلثين» — تناقض صارخ يُضعف الثقة وإن كان الحساب المالي صحيحاً. **الجذر:** سطر العرض كان يستدعي `h.fraction` (نصيب الفرد = ١/٣) بدلاً من `h.totalFraction` (نصيب الفئة = ٢/٣) في شارة الكسر، بينما `h.totalAmount` هو دائماً مبلغ الفئة — مصدرا عرض لمستويين مختلفين مقرونان في سطر واحد.
- **سبب الإفلات:** فحوص DOM كانت مقصورة على صفحة النتيجة (الحادثتان السادسة والسابعة)؛ صفحة الأمثلة لم تكن في نطاق أي حارس قائم — اكتُشفت بمراجعة زميل المالك لا بالآليات التلقائية.
- **الإصلاح — توحيد المصدر:** صفحة الأمثلة تعرض الآن `h.totalFraction` (كسر الفئة) في الشارة مقروناً بـ`h.totalAmount` (مبلغ الفئة)، مع سطر فرعي «لكل فرد: كسر الفرد = مبلغه» يظهر فقط عند تعدد الورثة في الفئة — لا مصدر عرض موازٍ لأي رقم. بيانات الأمثلة نُقلت إلى `src/lib/exampleCases.ts` (وحدة بيانات صافية) تُستورد من صفحة الأمثلة وحارس الاختبارات معاً.
- **الطبقة المضافة — حارس اتساق الأمثلة QA 38:** حارس جديد في بوابة النشر يمر على جميع الأمثلة الستة ويتحقق من: (١) كسر الفئة × التركة = مبلغ الفئة (هامش هللة واحدة)؛ (٢) مجموع مبالغ الفئات = التركة؛ (٣) دبوس «بنتان وأبوان»: البنتان ٢/٣ = ٢٤٬٠٠٠، لكل بنت ١/٣ = ١٢٬٠٠٠، لكل من الأبوين ١/٦ = ٦٬٠٠٠، المجموع ٣٦٬٠٠٠ — أي مخالفة تُحمّر البوابة.
- **اجتياز البوابة:** 108/108 اختبار دقة ✓ — QA 38 يُجتاز باتساق ثلاثي مؤكَّد (كسر × تركة = مبلغ؛ مجموع = تركة؛ دبوس بنتان+أبوان) لكل الأمثلة الستة — فحص النوع نظيف — © Mosleh
حزمة المراجعة العميقة م١–م٦: تصويبات توثيقية + أصناف العمومة + حكم ما قبل القسمة
٢٫٢٣٫٠- **م١ — تصويب إحالات المختصر:** صُوِّبت الإحالتان (ص٤٩٦→ص٤٩٣؛ ص٤٩٧→ص٤٩٤) وأُضيفت عناوين الفصول الحقيقية في تبويب تصفح الكتاب (MUKHTASAR_CHAPTER_MAP) استناداً إلى قراءة صور الصفحات الأصلية pg491–pg502.
- **م٢ — شاهد ص٥٠٢ (كفن/دين/وصية):** نص المختصر ص٥٠٢ مُضاف كاستشهاد مرتبط بقاعدة ترتيب التركة.
- **م٣ — أصناف العمومة والخؤولة (12 حقلاً):** أُضيفت 12 حقلاً فرعياً (عم/عمة/خال/خالة × شقيق/لأب/لأم) في HeirCounts وواجهة الإدخال. المحرك يدمج الأصناف في الحوض ثم يوزعها بقياس أصناف الإخوة: لأم يأخذ السدس/الثلث من الحوض، شقيق يحجب لأب، الباقي للذكر مثل حظ الأنثيين (عمومة) أو بالتساوي (خؤولة) — مستند إلى مختصر الآثار ص٤٩٤.
- **م٤ — حكم من أسلم/أُعتق قبل القسمة:** خيار في واجهة الإدخال وقاعدة مُدرَجة بإسناد دعائم ص٣٨٦: وارث أسلم أو أُعتق بعد الوفاة وقبل القسمة يدخل الحساب كوارث عادي — يُعلَم المستخدم بتنبيه في النتيجة.
- **م٥ — شاهد «لا عول» دعائم ص٣٨١:** نص حرفي مُضاف كاستشهاد ذهبي مرتبط بقاعدة النقص/لا-عول. م٦ (ص٣٩٤-٣٩٦) كانت صحيحة.
- **تصويبان توثيقيان بتحكيم المالك:** (أ) بطاقة «اجتماع الجدة مع الأب دون الجد»: ملاحظة الترقية مصحَّحة إلى قراءة الجمع المعتمدة: «أم الأم لا تسقط بحال — مع الأم وبدونها (منهاج ص٢٨–٢٩؛ دعائم ص٣٧٨؛ يقويها مختصر ص٤٩٣)». (ب) بطاقة «حجب الجد»: الإسناد مُكمَّل إلى المركّب الصريح (مختصر ص٤٩٣ + منهاج ص٢٢ + دعائم ص٣٧٥) مع ربط شاهدَي ص٤٩٣ وص٣٧٥ بالبطاقة.
الحادثة الثامنة — دمج مسار النقص (لا عول) في خط العرض الموحد
٢٫٢٢٫٠- **الحادثة الثامنة — تشريح:** مسار النقص (لا عول) كان يُنتج نتائج صحيحة في المحرك إلا أن بطاقة «كيف حُسب أصل المسألة» كانت تعرضه عبر مسار الفروض العادي (أصل=2، مصحح=4) بدلاً من إظهار الفروض الأصلية الاسمية قبل التزاحم ثم سرد النقص الإلزامي. **الجذر:** لم يكن naqsApplied يُمرَّر من المحرك إلى طبقة العرض (aslVisualization.ts)، فكان buildAslBreakdown يُعامِل مسائل النقص معاملة المسائل العادية.
- **الإصلاح — محرك العرض:** أُضيف naqsApplied: boolean إلى CoreResult وCalculationOutcome.result في inheritanceEngine.ts ويُعبَّأ في فرع النقص. أُضيفت NaqsInfo (واجهة كاملة: canonicalNaqsAsl، preFardSahmSum، bearer، fixedHeirs، correctedAsl) وحقلا naqsApplied/naqsInfo إلى AslBreakdown في aslVisualization.ts. الخطوة 8 الجديدة في buildAslBreakdown تحسب كامل بيانات النقص من baseFard الحامل والكسور الفعلية للثابتين.
- **مسار عرض موحد:** AslBreakdownCard.tsx يفحص breakdown.naqsApplied فإن صحّ عرض الأقسام الخمسة للنقص: (١) الفروض الأصلية قبل التزاحم بجدول يشمل الفرض الاسمي للحامل + مجموع يتجاوز الأصل؛ (٢) «لا عول — النقص» مع السرد الكامل + استشهاد منهاج ص١٦ + دعائم ص٣٨٢-٣٨٣ + الحالة بعد النقص؛ (٣) فحص الانكسار؛ (٤) التصحيح؛ (٥) جدول المبالغ المحسوبة من correctedAsl. وإلا سلك المسار العادي (رد/عصبة). شارة «نقص التزاحم (لا عول)» أرجوانية أُضيفت في جدول الورثة وبطاقات الجوال على فريق الحامل.
- **QA 35 + QA 36:** QA 35 يتحقق من naqsApplied=true في المحرك والعرض معاً لمسألة زوج+أختان؛ QA 36 الفحص الكامل: المبالغ (الزوج والأختان كل منهما ١٢٥٠٠) + naqsInfo الكامل (canonicalNaqsAsl=6، originalSahm=4، reducedSahm=3، correctedAsl=12) — يُكشِف أي تراجع في مسار النقص أو طبقة العرض.
الحادثة السابعة — مصدر وحيد لقسم الأصل + إكمال سرد الرد + حارس تفرد عناوين الأقسام
٢٫٢١٫٠- **الحادثة السابعة — تشريح:** عنوان قسم «كيف حُسب أصل المسألة والتصحيح» كان يظهر مرتين متتاليتين في مسائل الرد: إعادة هيكلة مسار الرد أبقت مكوّن القسم القديم مُركَّباً بجانب الجديد. **الإصلاح — مصدر وحيد:** AslBreakdownCard صار يستقبل `breakdown` كـ prop مُمرَّر من Result.tsx بدلاً من استدعاء buildAslBreakdown داخلياً — يُحسب الأصل مرةً واحدة وتُضاف حارس `aslBreakdownData &&` على مدخل التصيير، مما يُحيل دون وجود نسختين مستقلتين في آنٍ واحد.
- **إكمال سرد الرد:** فقرة text-radd-narrative صارت تذكر النسبة الصريحة بأرقام السهام بعد أسماء أصحاب الرد — مثال: «البنات: ١٦ : الأم: ٤» — مع استشهاد ص١٤ منهاج الفرائض لتوثيق قاعدة الرد.
- **حارس تفرد عناوين الأقسام (QA 34):** تعزيز فحص DOM بمسح شامل لجميع عناصر h2 في الصفحة — يُبلِّغ عن أي عنوان يتكرر أكثر من مرة ويُفصح عن النص والعدد. يُكشِف الحادثة السابعة آلياً لو تكررت. كذلك صار الفحص يشمل card-asl-breakdown للتثبت من انعدام الكسور اللاتينية داخل القسم العلمي.
الحادثة السادسة — مكوّن الكسر الموحد + فحص DOM منفذَي العرض
٢٫٢٠٫٠- **الحادثة السادسة — تشريح:** في بطاقات الجوال (div.md:hidden) لصفحة النتيجة، كان حقل «النصيب (لكل فرد)» يعرض الكسر بأرقام لاتينية (1/2) بينما جدول تحويل الأصول في الصفحة نفسها يعرضه صحيحاً بالهندية (١/٢). **الجذر:** دالة shareDisplay في Result.tsx كانت تستدعي fraction.toDisplayString() مباشرةً في JSX دون المرور عبر fmtFraction() — وكذلك ثلاثة مواضع أخرى (بيت المال في البطاقات والجدول، وجدول الدية). **لماذا أفلت الفحص:** فحص الجودة كان يعمل على منفذ عرض عريض (≥768px) حيث `md:hidden` يُخفي البطاقات بصرياً وتظهر الجداول فقط — لم يُفحص نص البطاقات المخفية. **الكاشف:** مراجعة بشرية مزدوجة من المالك بجهاز جوال.
- **الإصلاح الجذري — مكوّن FractionDisplay الموحد:** أُنشئ src/components/FractionDisplay.tsx يُمرر raw عبر fmtFraction(lang) ويغلف الناتج في <bdi>. **قاعدة الحوكمة:** fraction.toDisplayString() ممنوع في JSX مباشرةً في أي مكوّن — أي عرض كسر يجب أن يمر عبر <FractionDisplay raw={...} /> أو fmtFraction() في سياق نصي. المواضع المُصلَحة في Result.tsx: (١) shareDisplay — الكسر الأصلي، (٢) الأسهم العددية في shareDisplay — أُحيلت إلى fmtSahm()، (٣) بيت المال بطاقة الجوال، (٤) بيت المال جدول العرض الواسع، (٥) جدول الدية.
- **سد ثغرة الفحص — QA 33+34:** QA 33: فحص وحدة المُنسِّق (11 كسراً بالثلاث لغات) يُثبت أن fmtFraction تُنتج هندية للعربية وأردية للأردية ولاتينية للإنجليزية. QA 34: فحص DOM مزدوج يمسح [data-testid="cards-heirs-mobile"] و[data-testid="table-heirs"] بمستقل عن الـ viewport الحالي (display:none لا يحذف النص من textContent) فيرى كلا المنفذين في نفس الجلسة دون الحاجة لتغيير حجم النافذة. الفحص يُشغَّل من صفحة /tests عند فتحها بجوار صفحة النتيجة.
تصويب الاختبار ١٠٤ بنص + قسم الفروق مع الجمهور + تحصين بطاقة حجب الإخوة
٢٫١٩٫٠- **تصويب اختبار ١٠٤ بقرار المالك:** التوقع السابق (أختان ١٢٠٠٠) كان مبنياً على فقه الجمهور المخالف للمذهب. المحرك رفضه صحيحاً — الأم تحجب الإخوة حرماناً كاملاً (دعائم ص٣٧٥). التوقع المصحَّح: زوج + أختان + أم بتركة ٢٤٠٠٠ → الأختان محجوبتان، الزوج ١٢٠٠٠، الأم ١٢٠٠٠. الحكم المحسوب لم يتغير — صُحِّح التوقع لا المحرك.
- **اختبار جديد ١٠٥ — لا عول في المذهب:** زوج + أختان شقيقتان بلا أم (تركة ٢٤٠٠٠): الزوج ١/٢ = ١٢٠٠٠ والأختان الباقي ١/٢ = ١٢٠٠٠ (لكل أخت ٦٠٠٠) مع ملاحظة «لا عول» — وهي عين المسألة التي يُعيلها الجمهور إلى ثمانية (منهاج ص١٦؛ دعائم ص٣٨٢–٣٨٣). المجموع ١٠٥/١٠٥ اختباراً ناجحاً.
- **قسم ٦ في صفحة المنهجية — فروق منهجية مع الجمهور:** ثلاث نقاط موثقة تقطع الجدل مع كل مراجع قادم: (١) لا عول (منهاج ص١٦، ص٤٣؛ دعائم ص٣٨٢–٣٨٣)؛ (٢) الإخوة محجوبون بكلٍّ من الأبوين لا بالأب وحده مع مثال عددي (دعائم ص٣٧٥؛ منهاج ص٢٢)؛ (٣) حجب الأم نقصاناً مشروط بحياة الأب مع العدد الحاجب (دعائم ص٣٧٢؛ منهاج ص٤ مقيداً بص٢٢). مع سطر تمهيدي: «هذه فروق منهجية معلنة لا أخطاء».
- **تحصين بطاقة حجب الإخوة في المحرك:** سبب الحجب بات يستشهد بالنص الحرفي من دعائم ص٣٧٥ وص٣٧٢ مع التمييز بين ثلاث حالات: (أ) محجوب بالأم وحدها — النص الحرفي + تأكيد ص٣٧٢ «لا يرثون ولا يحجبونها» + إشارة الرد على الأم بالرحم؛ (ب) محجوب بالأب وحده — منهاج ص٢٢-٢٣؛ (ج) محجوب بكليهما — دعائم ص٣٧٥ + منهاج ص٢٢-٢٣.
شرح الرد كاملاً: الفروض الأصلية والانكسار والتصحيح + تحسينات العرض
٢٫١٨٫٠- **الفروض الأصلية قبل الرد:** في مسائل الرد يعرض قسم «كيف حُسب أصل المسألة» الآن جدولاً بالفروض الأصلية (مثال: الزوجة ١/٨، البنات ٢/٣، الأم ١/٦) وأصل الفروض الأصلي، بدل الكسور المعدَّلة بعد الرد.
- **سرد الرد بالاستشهاد:** بيان مجموع الفروض والفائض واستثناء الزوجين من الرد (الزوج ص١٣ / الزوجة ص٥ — منهاج الفرائض)، ثم أصل ما بعد الرد وسهام كل فريق منه.
- **الانكسار والتصحيح في مسائل الرد:** قسما فحص الانكسار والتصحيح كانا مخفيين عند الرد؛ صارا يُعرضان دائماً مبنيَّين على أصل ما بعد الرد (مثال: أصل ٤٠، سهم البنات ٢٨ منكسر على ٣، فالمصحح ×٣ والمسألة من ١٢٠).
- **تقريب الهللات لكل فرد:** عمود «المبلغ لكل فرد» يوزع إجمالي الفريق بالهللة على أفراده (طريقة أكبر الباقي) ويعرض «مبلغ ×عدد + مبلغ ×عدد» بحيث يساوي مجموع الأفراد إجمالي الفريق تماماً بلا هللة ضائعة.
- **بطاقات جوال لجدول الأنصبة:** على الشاشات الضيقة يتحول الجدول إلى بطاقات مقروءة لكل وريث (وتشمل بيت المال)، مع بقاء الجدول الكامل في الطباعة والشاشات الواسعة.
- **توطين الأرقام والرسم البياني:** أرقام صفحة النتيجة موحدة عبر fmtAmount/fmtSahm بالثلاث لغات، وتلميحات الرسم البياني تتبع لغة الواجهة.
- **اختباران محاسبيان جديدان (١٠٣ و١٠٤):** رد مع تصحيح (زوجة + ٣ بنات + أم، ٢٥٠٠٠ → ٣١٢٥ / ١٧٥٠٠ / ٤٣٧٥)، ولا عول في المذهب (زوج + أختان، ٢٤٠٠٠ → ١٢٠٠٠ / ١٢٠٠٠) — المجموع ١٠٤/١٠٤ اختباراً ناجحاً.
وصول صور المصدرين واكتمالها + آلية التقاط تلقائي
٢٫١٧٫١- **صور المصدرين وصلت واكتملت: 37 + 12.** رُفعت صور صفحات «دعائم الإسلام» (37 صورة: ص٣٦٥–ص٤٠١ في /daaim) و«مختصر الآثار» (12 صورة: ص٤٩١–ص٥٠٢ في /mukhtasar)، وظهرت تلقائياً في تبويبَي تصفح الكتاب وفي مصغرات الشواهد ذات المصدرين.
- **آلية التقاط تلقائي دائمة:** سكربت scripts/processBookImages.mjs يعمل قبل كل إقلاع لخادم التطوير — يبحث في كامل المشروع عن أي ملف مضغوط اسمه يحوي daaim أو mukhtasar (بأي لاحقة ترقيم)، يفكّه إلى المجلد الصحيح، يُطبّع الأسماء إلى pgXXX.jpg، ويتحقق من العدد المتوقع. رفع أي أرشيف جديد مستقبلاً يكفي وحده دون أي أمر إضافي.
- **بند جودة جديد (رقم 30):** لوحة تقرير الجودة في صفحة فحص الدقة تفحص حياً — عبر طلبات HEAD فعلية — وجود جميع الصور الـ49 وتعلن «صور المصدرين وصلت واكتملت: 37 + 12» بدل بند الانتظار.
حزمة العرض الستة — فروض/عصبات منفصلة + نصيب العصبة + toCitation + numFmt + bidi + «لماذا» ديناميكي
٢٫١٧٫٠- **فروض/عصبات منفصلة في بطاقة الأصل (البند الأول):** أُعيد تصميم AslBreakdownCard لتُقسَّم الفروض والعصبات في قسمين مستقلين: القسم الأول يُدرج أصحاب الفروض مع كسورهم وأصل مشتق منها وحدها (canonicalFardAsl)، والقسم الثاني يُبيّن العصبة أو الرد. مسائل الرد تُخفي قسمَي الانكسار والتصحيح وتعرض المبالغ مباشرة. مسائل كل-عصبة تُشير صراحةً إلى غياب الفروض.
- **عمود النصيب لأصحاب التعصيب (البند الثاني):** يُعرض الآن نصيب العصبة بنفسه في جدول الأنصبة كـ «الباقي تعصيباً (X من Y)» بسهام الأصل قبل التصحيح، والعصبة بالغير كـ «الباقي تعصيباً مع إخوتها» — بدلاً من عرض الكسر الثابت الذي كان مُعمَّماً على الجميع. الأرقام النهائية للمبالغ لم تتغير (الفارق الصفري مضمون).
- **تنسيق الاستشهاد الموحَّد: fmtCitation (البند الثالث):** دالة fmtCitation() الجديدة في numFmt.ts تُعيد تنسيق رقم الصفحة حسب اللغة: «ص٤٦» بالأرقام العربية الشرقية للعربية، و«p. 46» للإنجليزية، وأرقام أردية للأردية — تُطبَّق على جميع شارات الاستشهاد في صفحة النتيجة وبطاقة الأصل.
- **وحدة numFmt المركزية (البند الرابع):** أُنشئت src/lib/numFmt.ts تجمع: fmtAmount (مبالغ)، fmtFraction (كسور)، fmtSahm (أسهم BigInt/number)، fmtPage (صفحة مع بادئة «ص»/«p.»)، fmtCitation (استشهادات نصية/رقمية)، fractionName (اسم الكسر الفقهي: ثمن/ربع/سدس…). فحص الجودة رقم 24 يتحقق وظيفياً من المخرجات بالثلاث لغات.
- **إصلاح bidi/bracket لشارات الاستشهاد (البند الخامس):** أُحيطت جميع شارات الاستشهاد <Badge> في صفحة النتيجة (ورثة مؤهَّلون ومحجوبون) وبطاقة الأصل بعنصر <bdi> لمنع عكس ترتيب الأقواس في السياق RTL/LTR المختلط. فحص الجودة رقم 23 يُوثِّق هذا القرار المعماري.
- **قالب «لماذا؟» الديناميكي للعصبة (البند السادس):** أُحدِّث buildWhyExplanation في whyExplanation.ts: العصبة بنفسه يحصل الآن على شرح ديناميكي مبني على أرقام المسألة الفعلية — «بقي X من أصل Y سهماً بعد Z سهم لـ[اسم]» — بدلاً من نص عام ثابت. العصبة بالغير يُذكَّر بآلية «للذكر مثل حظ الأنثيين» الخاصة. الشرح في مسائل «كل-عصبة» يوضح أن التركة كاملة بلا فروض.
- **مصنِّف الوارث heirClassification.ts:** ملف جديد يُصدِّر getHeirType() وisTaskib() — يُصنِّف كل وارث مؤهَّل إلى «fard | tasib_binafsihi | tasib_bighayr» بناءً على نص reason من المحرك بحثاً عن علامات «عصبة بنفسه» و«مع الابن». لا يُغيّر أي نصيب أو حكم.
- **فحوص الجودة 22-25:** أُضيفت للحارس الكودي (runCodeAudit): #22 يتحقق من fmtCitation بالثلاث لغات، #23 يُوثِّق إضافة <bdi>، #24 يُشغِّل fmtAmount/fmtSahm/fmtCitation بقيم فعلية، #25 يختبر أن buildAslBreakdown تُنتج canonicalFardAsl=8 وresidual=7 لمسألة زوجة+ابن.
حزمة UX والمساعد الموجَّه
٢٫١٦٫٠- **أزرار الزيادة/النقصان:** أُضيف زر (+) وزر (−) لكل حقل عد وارث في خطوة الورثة بالمعالج، إلى جانب الإدخال النصي الموجود.
- **بطاقات النمط الشائع:** أُضيف قبل شريط التقدم شبكة بطاقات تسمح بتحديد نمط إرث شائع (زوجة وأولاد، زوج وأولاد، أبوان فقط…) ليُعبَّأ المعالج تلقائياً، مع خيار «حالة أخرى» للاستخدام المباشر.
- **حفظ المسودة تلقائياً:** يحفظ المعالج الحالة في localStorage عند كل تغيير للخطوة (مفتاح: mawarith:draft-v1، انتهاء: 7 أيام) — عند إعادة الفتح يُعرض شريط يسأل عن استئناف المسودة أو تجاهلها.
- **شريط ملخص المعالج (بلا كسور):** يظهر في أسفل صفحة المعالج (خطوات 1–6) شريط خفيف يعرض جنس المتوفى وعدد الورثة المُدخَلين وصافي التركة — دون أي كسور أو نسب حتى لا يُوهم بنتيجة مبكرة.
- **المساعد الموجَّه (/assistant):** صفحة جديدة تقبل نصاً عادياً عربياً أو إنجليزياً أو أردياً، تتعرف على جنس المتوفى وأعداد الورثة والتركة بقواعد لغوية محلية (بلا ذكاء اصطناعي توليدي)، وتفتح المعالج مُعبَّأً. الأسئلة الفقهية تُحال إلى شرح القواعد. المساعد لا يُفتي. متاح من القائمة المنسدلة «المزيد» وبطاقة في الرئيسية.
- **اختبارات Parser (فحص الدقة):** أُضيف 20 اختبار تلقائي لوحدة caseParser.ts (12 عربي + 4 إنجليزي + 4 أردي) يُشغَّلون في صفحة «فحص الدقة» + حارسَي الجودة رقم 20 (لا كسور في واجهة المعالج) و21 (صفحة المساعد في SEO).
- **بيانوية المساعد في سياسة الخصوصية:** أُضيف قسم مستقل في سياسة الخصوصية يوضح أن المساعد يعمل محلياً بقواعد ثابتة بلا إرسال بيانات خارجياً، مع بند صريح يشترط قرار مالك مستقلاً لأي ترقية توليدية مستقبلية.
- **PWA shortcuts:** أُضيفت 3 اختصارات في manifest.webmanifest (حاسب جديد / مساعد / فحص الدقة) بأسماء ثلاثية اللغة.
تحرير تحريري: تصويب قاعدة الجدتين + نصوص الأب والإخوة + تنبيه الخنثى + وسم أمثلة الكتب
٢٫١٥٫٠- **قاعدة الجدتين (تحرير مزدوج):** عُدِّل نص قاعدة «نصيب الجدة» (id: grandmother-share) إلى صياغة ثنائية الجملة تُميِّز بوضوح: أمُّ الأم لا تسقط بحالٍ مع الأم وبدونها (منهاج ص٢٨–٢٩؛ دعائم ص٣٧٨)، وأمُّ الأب مشروطةٌ بحياة ابنها الأب مع إضافة مختصر الآثار ص٤٩٧ مصدراً ثالثاً مُعتمَداً. عُدِّل عنوان القاعدة إلى «نصيب الجدتين — طُعمة مشروطة مزدوجة الحكم».
- **تصويب حرفي (كفر):** في قاعدة «حجب الكفر عن ميراث المسلم»: «الكفر أحد موانع الإرث» → «الكفر من موانع الإرث» (إدخال حرف «من» للدلالة على التبعيض الصحيح).
- **نص فرع الأب مع البنات:** في المحرك، فُرِّق بين صورتين: إن كان الأب يشارك في الرد فعلاً (نصيبه أكبر من السدس) أُبقي النص «السدس فرضاً ويشارك في الرد بقدر سهمه (ص٨–٩)»؛ وإن لم يكن للرد مجال (كوجود زوج/زوجة يمتص الفائض) قُرئ «السدس فرضاً (ص٤)» دون ذكر الرد.
- **تذييل قاعدة التنزيل:** أُضيفت جملة ختامية إلى قاعدة «تنزيل فروع الإخوة» تُصرِّح بشرط غياب الإخوة الأحياء وتُحيل إلى (منهاج ص٥، ص٢١) مصدراً لمبدأ الأقرب يحجب الأبعد.
- **تنبيه الخنثى في صفحة النتيجة:** أُضيف تنبيه برتقالي أسفل جدول الأنصبة مباشرةً عند وجود ولد خنثى في المسألة، يُذكِّر بأن الأنصبة تقديرية محسوبة بمتوسط صورتَي الذكر والأنثى (ص٣٠–٣١) ويوصي بمراجعة مختص قبل التطبيق.
- **وسم أمثلة الكتب:** أُضيف حقل `bookExample` اختياري لنوع `AccuracyTestCase`، ووُسِمت الاختبارات 98–101 (المستندة إلى مختصر الآثار ص٤٩٦–٤٩٧) ببادج ذهبي في صفحة «فحص الدقة» يُظهر المصدر ورقم الصفحة بجوار عنوان الاختبار.
إعادة ضبط تنويه المرجعية العربية — أحادية اللغة + لمرة واحدة + تذييل ثابت
٢٫١٤٫١- **الوضع العربي: لا يظهر أي تنويه إطلاقاً.** أُزيل مكوّن `EnLangBanner` الدائم نهائياً. في الوضع العربي لا يُعرض أي شريط ولا أي سطر متعلق بالمرجعية — الواجهة نظيفة تماماً.
- **نقاء اللغة:** نص التنويه أحادي اللغة بلا خلط. الإنجليزية: «The Arabic edition is the authoritative reference; this English version is provided for convenience.» — الأردية: «عربی نسخہ ہی معتبر مرجع ہے؛ یہ اردو ورژن سہولت کے لیے فراہم کیا گیا ہے۔»
- **تنويه ظهور-مرة-واحدة:** مكوّن `LangReferenceNotice` الجديد يظهر أول مرة في وضعَي EN وUR مع زر إغلاق ✕ — القرار يُحفظ بـ localStorage بمفتاح `mawarith:lang-ref-dismissed` مستقل لكل لغة. عند تبديل اللغة يظهر من جديد مرة واحدة حتى يُغلق.
- **سطر التذييل الثابت:** سطر مرجعية صغير مائل يظهر في Footer أسفل «© Mosleh» في وضعَي EN وUR فقط — لا يظهر في الوضع العربي — يبقى الأثر القانوني حاضراً في كل صفحة بلا إزعاج التصفح.
- **سطر التقارير المطبوعة:** سطر مرجعية `print:block` يُضاف فوق إخلاء المسؤولية في صفحة النتيجة — يظهر فقط عند الطباعة في وضعَي EN وUR — الطابع على الورق يحتوي التنويه في لغته الصحيحة.
توسعة i18n الشاملة — تعادل إنجليزي كامل + إضافة أردية بنستعليق
٢٫١٤٫٠- **معمارية المصدر الواحد (محفوظة):** جميع النصوص الثلاثية `t({ar, en, ur})` مُضمَّنة في مكانها — TypeScript يُنفِّذ الاكتمال بنوع `L`. المحرك وملفا rules.ts وseoRoutes.ts تبقى عربية خالصة. الترجمة تجري وقت العرض فقط عبر `src/i18n/`. لا نسخ منطق موازية.
- **خط Noto Nastaliq Urdu:** ملفا woff2 (400 عادي + 700 عريض) منسوخان إلى `src/fonts/`. يُفعَّل تلقائياً عبر `html[lang="ur"] { --app-font-sans: 'Noto Nastaliq Urdu', ... }` في index.css — الأردية تعرض بالنستعليق فوراً. العربية تبقى على Noto Naskh Arabic بلا تأثير.
- **معجم مقفل `src/i18n/glossary.ts` (65 مصطلحاً):** خمس مجموعات — HEIR_TERMS (27)، SHARE_TERMS (7)، FIQH_TERMS (21)، UI_TERMS (15)، SOURCE_TERMS (4). القاعدة: تُضاف البنود ولا تُحذف ولا تُعاد توليدها. المصطلحات الفقهية بالأردية تستخدم الألفاظ العربية المعرَّبة المتداولة (فرض، عصبہ، حجب، ردّ، عول، طُعمہ).
- **توضيح بالمعنى في نافذة الشاهد:** عند وضعي الإنجليزية والأردية تظهر لافتة ثابتة أسفل كل اقتباس عربي: «Explanatory rendering — the Arabic text is the authoritative reference» (EN) / «توضیحی ترجمہ — عربی متن ہی معتبر حجت ہے» (UR). النص العربي للكتاب لا يُمس أبداً. زر «الشاهد من الكتاب» يُترجم: EN→Book Witness / UR→کتابی شاہد.
- **حارس الاكتمال (فحص QA 21):** يُصدِّر `getCoverageStats()` من engineText.ts إحصاءات تغطية SENTENCES وLABELS وSTEP_TITLES (EN+UR). تغطية حالية: 100% في المجموعات الثلاث. الفحص يُخفق تلقائياً إذا أُضيف مفتاح بلا ترجمة.
- **تعادل المحرك متعدد اللغات (فحص QA 22):** يُنفِّذ `calculateInheritance` بحالة زوج+ابن+بنت ويتحقق أن نصيب الزوج 1/4 (صحيح). يتحقق أن `translateHeirLabel` تُنتج تسميات غير عربية لـ EN وUR. يُثبت أن المحرك واحد لا نسخ له.
- **حوكمة اللغة في الدستور:** أُضيفت «§ 6 — حوكمة اللغة» إلى PROJECT_CONSTITUTION.md، تُحدد: فلسفة المصدر الواحد، الملفات المقفلة (engine + rules + accuracyTests + seoRoutes)، قيد النستعليق، قاعدة بقاء الشواهد عربية، وإجراء إضافة لغة جديدة المستقبلي.
إصلاح الحادثة الخامسة — المصدر الواحد للمبالغ وحارس العرض
٢٫١٣٫١- **جذر الخلل الأول (تكرار صف الأب):** بُني جدول الأنصبة من حلقة `eligibleHeirs.map()` واحدة صحيحة، غير أن طبقة العرض لم يكن لها حارس يفحص صفوفها النهائية قبل رسمها — فأي تفاعل بين التحميل الكسول للمصغّرات وإعادة الرسم كان يمر دون رقابة. **الإصلاح:** يُبنى الجدول الآن من `displayRows` — مصفوفة صفوف وحيدة صريحة تجمع كل بيانات كل خلية (اسم + نصيب + مبلغ + حكم) من مصدر واحد، مما يجعل التكرار أو الانزياح مستحيلاً هيكلياً.
- **جذر الخلل الثاني (تعدد مصادر المبالغ):** قسم «كيف حُسب أصل المسألة والتصحيح» كان يستمد عمودَي «المبلغ لكل فرد» و«إجمالي الفئة» من `h.amountPerHeir` و`h.totalAmount` في مخرجات المحرك — وهي مبالغ محسوبة بضرب بسيط (كسر × تركة) دون تسوية هللات — فظهرت الأم ٤١٦٦.٦٧ بدلاً من ٤١٦٦.٦٦، وبلغ مجموع القسم ٢٥٠٠٠.٠١. **الإصلاح:** يستمد القسم التعليمي الآن مبالغه من نفس `exactAmountByKey` (وعاء تسوية هللات «أكبر الباقي» الموحد) الذي يعرضه جدول الأنصبة الرئيسي، فالمصدر واحد في كلا الموضعين.
- **حارس التكامل — طبقة العرض النهائية (جديد):** قبل رسم الجدول تُفحص مصفوفة `displayRows` فعلياً: (١) لا مفتاح وريث مكرر، (٢) عدد الصفوف يطابق عدد مجموعات المحرك، (٣) مجموع عمود المبالغ + بيت المال = صافي التركة بدقة ≤ ٠.٠٠٥. أي خرق يستبدل الجدول برسالة «خلل في طبقة العرض». الحارس الأول (مخرجات المحرك) يبقى كطبقة أولى. القسم التعليمي مشمول ضمنياً لأن مبالغه تُستمد من نفس الوعاء المفحوص.
- **اختبار ١٠٢ — حادثة ٥ (جديد):** اختبار الدقة رقم ١٠٢ يفحص مسألة زوجة + ٣ أبناء + بنتان + أبوان بتركة ٢٥٠٠٠: يتحقق من الكسور الخمسة (١/٨، ١٣/٣٢، ١٣/٩٦، ١/٦، ١/٦) ومن الأنصبة الموزعة بالهللة (زوجة ٣١٢٥، أبناء ١٠١٥٦.٢٥، بنات ٣٣٨٥.٤٢، أب ٤١٦٦.٦٧، أم ٤١٦٦.٦٦، المجموع ٢٥٠٠٠.٠٠).
- **سبب عدم اكتشاف الحارس الأول للخللين:** حارس المحرك (الطبقة الأولى) يفحص الكسور ومجاميعها في مصفوفة `outcome.heirs` — وهي صحيحة دائماً — لكنه لا يملك أي رؤية على مصفوفة `displayRows` ولا على المبالغ الظاهرة في القسم التعليمي. فالخللان (تكرار صف العرض واستقلالية مبالغ القسم التعليمي) حدثا بعد نقطة الفحص الأولى وقبل وصول الأرقام للمستخدم. فشل بناء النشر الأخير كان خللاً مستقلاً في `prerender.mjs` لا صلة له بالحادثة الخامسة.
تحسينات مراجعة خارجية ثانية
٢٫١٣٫٠- **مصغّرات صفحات الكتاب في جدول الأنصبة:** يُعرض الآن مصغّر صورة الصفحة (٣٤×٤٨ بكسل) بجانب شارة الصفحة في خلية «الحكم والمرجع» لكل وريث في جدولَي الأنصبة والمحجوبين وجدول الدية. يُحدَّد المصدر (منهاج/دعائم/مختصر) تلقائياً من رقم الصفحة. التحميل كسول، والتراجع آمن (لا يُعرض شيء إذا لم تُوجد صورة). الضغط على المصغّر يفتح نافذة «الشاهد من الكتاب» الكاملة.
- **طيّ ذكي في خطوة الورثة:** مجموعات الورثة المحجوبة كلياً بمن أُدخل قبلها تُطوى تلقائياً مع شارة «محجوبون بمن أدخلت — اضغط للإظهار». تُفعَّل القاعدة عند: وجود ابن (يحجب الأجداد والإخوة والعمومة)، أو بنت/أب (يحجب العمومة)، أو أخ/أخت (يحجب العمومة). المجموعة قابلة للتوسيع دائماً؛ ولا تُطوى إذا كان فيها إدخال غير صفري. لا تعديل في منطق الحساب.
- **صفحة «المنهجية» الجديدة (/methodology):** صفحة مستقلة تشرح: المصادر الثلاثة بترتيب الاستدلال (منهاج ← دعائم ← مختصر)، سياسة لا تخمين، منظومة الجودة (١٠١ اختبار + فحص التكامل + مراجعات خارجية)، دورة اعتماد أي تعديل حكم، وحدود الأداة مع ملاحظة بلا خادم (الحساب كله محلي في المتصفح). مُرتبطة من قائمة «المزيد» في شريط التنقل ومن صفحة «حول التطبيق».
- **توحيد نهاية رسائل الإيقاف:** جميع رسائل «موقوف» (حمل، طلاق في مرض الموت) و«بحاجة لمراجعة» في الواجهة تختتم الآن بـ: «ويُرجع فيها إلى مختص في الفرائض أو جهة الفتوى».
- **تصلب التحقق من المدخلات في المحرك:** أُضيفت إلى دالة validate() في المحرك فحوصات كانت موجودة فقط في طبقة الواجهة: (أ) إجمالي التركة = صفر → خطأ، (ب) صافي التركة ≤ صفر (مجموع الدَّين والوصية يساوي الإجمالي أو يتجاوزه) → خطأ. طبقة التحقق في الواجهة تبقى كطبقة مساعدة للترجمة وتوجيه المستخدم.
توحيد ذكر المصادر الثلاثة في كل الواجهات
٢٫١٢٫١- وُحِّدت صيغة ذكر المصادر في جميع الواجهات إلى: «منهاج الفرائض» و«دعائم الإسلام — كتاب الفرائض» و«مختصر الآثار — جماع أبواب الفرائض» — ثلاثتها للقاضي النعمان. شمل التوحيد: ترويسة الرئيسية وسطرها التعريفي، إخلاء المسؤولية في صفحة النتيجة، مقدمة «حول التطبيق»، مقدمة «تصفح الكتاب»، وأوصاف SEO لصفحات /rules و/about و/book — بعد أن كانت بعض المواضع تذكر مصدراً واحداً أو مصدرين فقط.
ثلاثة تصويبات نصية في بطاقات السجل + حارس اتساق السجل مع الأحكام (RULES 3.2.0)
٢٫١٢٫٠- **بطاقة نصيب الأب:** استُبدل الشطر الخاطئ «فإن لم يكن ولد أخذ السدس فرضاً والباقي تعصيباً» بالصياغة المعتمدة المتسقة مع نصوص الحكم الديناميكية: «فإن لم يكن للميت ولدٌ ولا ولدُ ابنٍ فللأب الباقي تعصيباً بعد الفروض من غير سدسٍ مفروض (ص٣، ص٨–١٠، ص١٤)»، وصُحِّحت شارة الصفحات من «ص٤» إلى «ص٣-٤» مع بقاء تأكيد دعائم الإسلام ص٣٧٤.
- **بطاقة حجب الأم بالإخوة:** حُذفت عبارة «أو لأم» نهائياً. النص المعتمد يُقيِّد الحاجبين بالأشقاء وبني الأب حصراً — دون ولد الأم — مع اشتراط وجود الأب، مع تفصيل الحد الأدنى: أخوان، أو أخ وأختان، أو أربع أخوات (الأختان بمنزلة أخ)؛ ولا يحجب أخٌ وأخت ولا ثلاث أخوات. صُحِّحت شارة الصفحات من «ص٢١-٢٢» إلى «ص٤، ص٢١-٢٢» ليُضاف شاهد منهاج ص٤ الحرفي المعتمد. أُضيف بند الاستيثاق في حقل الملاحظات.
- **بطاقة البنات بلا ابن:** صُحِّحت شارة الصفحات من «ص٨» إلى «ص٣، ص٨»؛ إذ موضع فرضَي النصف والثلثين في منهاج الفرائض هو ص٣ أصالةً، وص٨ لمسائل الرد والتعصيب المرتبطة.
- **حارس اتساق السجل مع الأحكام (فحص ٢٠):** فحص آلي جديد في صفحة فحص الدقة يقارن شارات بطاقات السجل ونصوصها بقائمة الصفحات المعتمدة في أعمدة الحكم الديناميكية للمحرك (engineText.ts) لست بطاقات: الأب، البنات بلا ابن، حجب الأم، الزوج، الزوجة، الجدة. يظهر بنداً أحمر باسم «اتساق السجل مع الأحكام» عند أي افتراق. نجاح الفحص حالياً: جميع البطاقات الست متسقة.
حادثة إنتاج #٤ — إصلاح تعصيب الأب مع الزوجية والجدتين (13/12 → 12/12)
٢٫١٠٫٢- **حادثة إنتاج #٤:** بوابة التكامل الإنتاجية احتجزت مسألة (زوجة + أب + أم + جدة أم الأم + جدة أم الأب) إذ بلغ مجموع الكسور 13/12. الجواب الملزم: من اثني عشر — الزوجة 3، الأم 4، كل جدة 2، والأب الباقي تعصيباً 1. الجذر: المحرك يُسجّل للأب 1/6 مبدئياً ثم يشترط `spouseFraction.isZero()` لتفعيل فرع التعصيب؛ لما كانت الزوجة حاضرة أُوقف الفرع فأبقى الأب على 1/6 رغم أن الفائض الفعلي له 1/12 فقط، فبلغ المجموع 13/12.
- **الإصلاح الجراحي:** أُضيفت فرعٌ جديد «باقٍ سالب»: حين يكون الأب حاضراً بلا فرع وارث لكن الفروض الثابتة + الزوجية + سدسا الجدتين تستنفد التركة فيصبح الباقي سالباً (remainder < 0)، لا يُفعَّل لا فرع التعصيب المقيَّد بـ`remainder>0` ولا الرد النسبي، فيبقى الأب على سدسه المبدئي الزائد. الإصلاح: إضافة شرط `remainder < 0` يُصحِّح حصة الأب إلى `max(0, سدس_مبدئي + remainder)`. الرد النسبي بين الأب والأم عند وجود الزوجية مع باقٍ إيجابي (مثل: زوجة+أب+أم) صحيحٌ فقهياً ومحفوظ كما هو.
- **تشريح ما قبل النشر (سؤال إلزامي):** هل شُغِّلت المطابقة الشاملة قبل النشر؟ لا — إذ لم تكن مسألة الزوجة+الأبوين+الجدتين ضمن الشبكة ولا الجدول المرجعي فلم تُكشف. هل المحرك الذهبي أُعيد توليده بعد تعديل نصوص الحكم (v2.10.0/1)؟ لا — الجدول المرجعي يد وية ثابتة ولم يُعد توليده، غير أن الخلل نفسه كان موجوداً في النواة قبل v2.10.0 ولم يطفُ إلا حين أدخل المستخدم هذه التوليفة تحديداً.
- **قاعدة راسخة:** الجدول المرجعي (الذهبي) لا يُعاد توليده من المحرك إلا بعد نجاح 100% في جميع الاختبارات الدقيقة والمطابقة الشاملة؛ وأي توليفة جديدة تُكشف خلالاً يجب إضافتها إلى الجدول قبل النشر لا بعده.
- اختبار قبول #97: زوجة+أب+أم+جدة أم الأم+جدة أم الأب — يُثبت الكسور الملزمة (wives=1/4، father=1/12، mother=1/3، grandmother=1/6، grandmotherFatherSide=1/6) ونص حكم الأب «الباقي تعصيباً بعد الفروض». الإجمالي: 97/97 اختباراً ناجحاً.
- الجدول المرجعي الثاني: أُضيفت 5 حالات جديدة (بنود 42–46) تشمل: الحادثة #٤، أربع زوجات+أبوان+جدتان، أب+جدتان، زوجة+أب+جدتان، أم+جدة محجوبة بغياب الأب. شبكة المطابقة: أُضيف القسم 8 (كلتا الجدتين مع الزوجة والأبوين، 16 توليفة) ليغطي هذه الفئة كلياً في الفحص الآلي.
- بوابة التكامل: أُضيف سطر «إن ظهرت لك هذه الرسالة فنرجو إبلاغنا عبر تواصل معنا مع لقطة شاشة» إلى رسالة الخطأ المعروضة للمستخدم.
تدقيق فروع نص حكم الأب — الفرع الوارث حصراً (الأولاد وأولاد الابن)
٢٫١٠٫١- فرع «لا ولد» للأب كُسِّر إلى أربعة فروع دقيقة بحسب الفرع الوارث حصراً (أولاد وأولاد الابن): (1) مع ولد ذكر: «السدس فرضاً مع الولد»، (2) مع إناث فقط: «السدس فرضاً ويشارك في الرد بقدر سهمه»، (3) بلا فرع وارث والحصة > 1/6: «الباقي تعصيباً بعد الفروض»، (4) بلا فرع وارث والأم محجوبة بالإخوة: «خمسة أسداس تعصيباً مع حجب الأم». فرع (5) جديد للحادثة #٤: الحصة < 1/6 → «الباقي تعصيباً بعد الفروض».
- تحديث اختبار 92: نص الأب «الباقي تعصيباً بعد الفروض (ص٣، ص٨–١٠، ص١٤)»؛ تحديث اختبار 95: نص البنت «يشارك في الرد بقدر سهمه» بدلاً من «يشارك في الرد مع البنت».
إصلاح خلل العرض: نصوص الحكم ديناميكية مشتقة من الفرع المحسوب فعلاً
٢٫١٠٫٠- خلل العرض: كان عمود الحكم يعرض نصاً ثابتاً يصف جميع الفروع الممكنة دون تمييز الفرع المُطبَّق فعلاً — فظهر «فرض ثابت السدس ص٤» للزوج والأب معاً رغم اختلاف كسريهما، وظهر للجدة أم الأم «لا تسقط إلا بالأم» وهي تأخذ سدسها مع الأم الحاضرة.
- الإصلاح الجذري: نص الحكم لكل صف مشتق الآن من الفرع المحسوب فعلاً بدلاً من نص ثابت — الزوج: «النصف/الربع فرضاً» بحسب وجود الفرع الوارث من عدمه؛ الزوجات: «الربع/الثمن فرضاً»؛ الأب: «السدس مع الولد الذكر» أو «السدس مع البنت ويشارك في الرد» أو «السدس والباقي تعصيباً» أو «السدس يُرد عليه بالنسبة» بحسب الواقع؛ الأم: «السدس مع الفرع» أو «السدس لحجب النقصان» أو «الثلث» أو «الثلث والباقي رداً» بحسب الواقع.
- الجدة أم الأم: صُحِّح نص حكمها من «لا تسقط إلا بالأم» — الذي يوهم بأنها تُحجب بالأم — إلى «السدس طُعمةً ثابتة لا تسقط بحال ولو مع الأم (منهاج ص٢٨–٢٩؛ دعائم ص٣٧٨)» وهو النص الفقهي الدقيق المعتمد.
- نص حجب الجد: حُدِّث من «محجوب بأحد الأبوين» إلى «محجوب بقرب الأبوين: من قرُب حجب من بعُد (ص٥، ص٧)؛ والطُّعمة ثابتة للجدات دون الأجداد الذكور (منهاج ص٢٨–٢٩، دعائم ص٣٧٨)» — يفسّر الفرق بين الجدات والأجداد في مسألة الطُّعمة.
- ترجمات EN/UR: أُضيفت ١٤ جملة ديناميكية جديدة إلى قاموس engineText.ts لضمان ترجمة النصوص المحدَّثة في الإنجليزية والأردية.
- حارس الاتساق: أُضيف فحص نص الحكم إلى مشغّل اختبارات الدقة — أي نص لا يطابق الفرع المحسوب يُسجَّل خطأً صريحاً. أُضيفت خمسة اختبارات قبول جديدة (92-96) تغطي: أب+أم+الجدتان، زوج+أم+جدة أم الأم، زوج+أب، أب+بنت، أم منفردة. الإجمالي: 96/96 اختبار ناجح.
إصلاح حادثة #٣ (هللة بيت المال) — مراجع الزوجية الديناميكية — تحديث نص المصدرين
٢٫٩٫٠- حادثة إنتاج #٣: إصلاح خلل الهللة في صف الزوج/الزوجة المنفرد — كان يُضاف سنت رقمي زائد لصف الزوجة (250.01 عوضاً عن 250.00) لأن وعاء توزيع الهللات كان يقتصر على صفوف الورثة دون بيت المال؛ أُدرج بيت المال ضمن الوعاء فحُسم الخلل.
- بيت المال: إضافة صف صريح في جدول النتيجة وصفحة الأمثلة المحلولة يعرض الكسر والمبلغ والمرجعين (ص١٣، ص٣١) مع أيقونة الشاهد — يظهر تلقائياً فقط عند وجود فائض غير موزَّع.
- المراجع الديناميكية للزوجية: مرجع الزوج يُعرض الآن ص٣ (بلا ولد) أو ص٤ (مع ولد)؛ مرجع الزوجات ص٤ (بلا ولد) أو ص٤-٥ (مع ولد)، بدلاً من قيمة ثابتة.
- تحديث نص «القاضي النعمان في مصدريه»: سطر المقدمة في الرئيسية، ووصف الـ SEO لصفحات /، و/case، و/rules، و/book — يعكس الآن اعتماد الحاسبة على المصدرين معاً.
- اختبارات قبول جديدة (87-91): اختبارات هللة للزوجة المنفردة والزوج المنفرد واللقيط+زوجة بتركة 1000، وحارسَا مرجعيان للزوجة مع/بلا ولد. فحص هللات شامل يعمّم على كل حالات الشبكة داخل مشغّل الاختبارات.
تصفح دعائم الإسلام — صفحة الكتاب بتبويبين — نافذة الشاهد ثنائية المصدر — إصلاح لغة المصدر المفرد
٢٫٨٫٠- **صفحة «تصفح الكتاب» بتبويبين:** تبويب ١ يضم محتوى «منهاج الفرائض» الحالي كاملاً (٥٤ صفحة، قسم الاقتباسات)؛ تبويب ٢ يضم «دعائم الإسلام — كتاب الفرائض ص٣٦٥–٤٠١» مع: فهرس ١٣ فصلاً، شبكة ٣٧ مصغرة (pg365.jpg–pg401.jpg، تكشف تلقائياً عند إضافة الملفات)، وقسم اقتباسات مستقل.
- **نافذة «الشاهد من الكتاب» ثنائية المصدر:** القواعد المستندة إلى منهاج الفرائض فقط تعرض ترويسة ذهبية ونص «منهاج الفرائض — القاضي النعمان»؛ القواعد المستندة إلى دعائم فقط تعرض ترويسة بنفسجية ونص «دعائم الإسلام — كتاب الفرائض — القاضي النعمان (تحقيق فيضي)»؛ القواعد ذات المصدرين معاً تعرض القسمين بفاصل.
- **١٨ شاهداً جديداً من دعائم الإسلام:** مضاف إلى المخزن: الطعمة ص٣٧٨، قاعدة الجهتين في الأجداد ص٣٧٨، ابن الأخ والجد ص٣٧٧، تنزيل فروع الإخوة ص٣٧٥ و٣٨٠، نفي العول والرد ص٣٨٢–٣٨٣، الدية ص٣٨٧، الغرقى ص٣٩١، الولاء ص٣٩١، إرث الأرض ص٣٩٤ وانتفاء الحبوة ص٣٩٦، اختلاف الدين ص٣٩٨ و٤٠٠، إضافة إلى نصوص ص٣٩٢ المحفوظة مسبقاً مع إزالة البادئة الزائدة.
- **بنية `BookCitation`:** إضافة حقل `source: "minhaj" | "daaim"` لجميع المدخلات؛ دوال جديدة: `getCitationsForSource()` و`getCitationsByPage(source)`. دوال صور جديدة: `daaimAssetUrl()`, `daaimPageImageName()`, `useDaaimImagesAvailable()` في `useBookImages.ts`.
- **إصلاح لغة المصدر المفرد:** إزالة «حصرياً» / «exclusively» من: الصفحة الرئيسية (شعار التذييل)، صفحة النتيجة (إخلاء المسؤولية)، صفحة «حول التطبيق» (الوصف الإنجليزي)، `seoRoutes.ts` (وصف /about)، و`rules.ts` (تعليق الملف الأول) — استبدلها كلها بصياغة «مصدران أساسيان».
ترقية دعائم الإسلام مصدراً أساسياً ثانياً — ثلاثة أحكام جديدة — 6 اختبارات قبول جديدة
٢٫٧٫٠- **دعائم الإسلام مصدراً أساسياً ثانياً:** بعد مراجعة شاملة، رُفع كتاب «دعائم الإسلام» للقاضي النعمان من «مصدر مؤكِّد» إلى «مصدر أساسي ثانٍ» مساوٍ لمنهاج الفرائض في مكانة المصدرية؛ تطابقت جميع القواعد الجوهرية بين الكتابين، وانفرد دعائم بثلاثة أحكام تكميلية جديدة. تُحدِّث صفحة «عن الحاسبة» والدستور وسجل القواعد وصيغة الإسناد.
- **حكم جديد ١ — المطلقة رجعياً في العدة (دعائم ص٣٩٢):** المطلقة طلاقاً رجعياً ولم تنقضِ عدتها تُعامَل معاملة الزوجة الكاملة في الميراث؛ يقوم بينهما التوارث ما دامت الرجعة قائمة. علامة «مطلقة رجعية في العدة» مضافة لخانة «الأحوال الخاصة» في شاشة إدخال البيانات.
- **حكم جديد ٢ — بوابة طلاق مرض الموت (دعائم ص٣٩٢):** إذا طلّق الزوج زوجته في مرض موته، تُوقَف قسمة التركة لتعقّد الشروط (هل مات في مرضه؟ هل انقضت عدتها؟ هل تزوجت غيره؟) — المحرك يُعيد الحالة كـ«موقوف — طلاق مرض الموت» ويمنع أي توزيع قبل الفصل بمعرفة أهل الاختصاص.
- **حكم جديد ٣ — وارث الولاء: المولى المعتِق (دعائم ص٣٩١-٣٩٢):** من أعتق مملوكاً يرثه إذا مات ولم يترك وارثاً بنسب أو رحم؛ يُحجب بأي وارث بنسب أو رحم مهما بَعُد، ولا يحجبه الزوج والزوجة. حقل «المولى المعتِق» مضاف لخانة الورثة. مجموعة «وارث الولاء» مضافة لنافذة الإدخال.
- 6 اختبارات قبول جديدة (#81–#86): مطلقة رجعية+ابن (1/8، 7/8)، زوج+ابن+مطلقة رجعية (1/4، 3/4)، طلاق مرض الموت (موقوف)، أخ لأم+مولى (أخ لأم 1/1)، مولى منفرد (1/1)، زوجة+مولى (1/4، 3/4). إجمالي الاختبارات: 86/86 ✓
- 6 حالات مرجعية جديدة في الجدول المرجعي الثاني (بنود 36–41)؛ إصدار قواعد المحرك مرفوع إلى 3.0.0؛ صيغة الإسناد المختصرة «دعائم الإسلام صX» تحل محل «ويؤكده: دعائم الإسلام، كتاب الفرائض (تحقيق فيضي) صX» في جميع القواعد.
تعديل حكم طعمة الجدة أم الأب — قراءة جامعة باعتماد المالك بعد مذكرة تحقيق
٢٫٦٫٠- **تعديل حكم طعمة الجدات باعتماد المالك بعد مذكرة تحقيق:** الجدة (أم الأب) تستحق السدس طُعمةً إذا وفقط إذا كان ابنها الأب حياً في المسألة، استناداً إلى حديث دعائم الإسلام ص٣٧٨: «أطعِم الجدةَ السدسَ وابنُها حيٌّ». قبل هذا الإصدار كانت تُحجب في جميع حالات وجود الأبوين.
- **محرك الحساب:** الجدة أم الأب الآن تنشط طُعمةً (سدس محجوز مستقل عن حوض الرد، كسدس أم الأم تماماً) حين يكون الأب حياً — بصرف النظر عن وجود الولد أو الأم أو الزوجية. إذا لم يكن الأب حياً: تُحجب بالولد (مع غياب الأب) أو بالأم (مع غياب الأب والولد)، أو تنتقل إلى مسار الجهتين.
- **تحديث قاعدة الجدة الشاملة:** نص قاعدة «نصيب الجدة» في سجل القواعد حُدِّث ليشمل الجدتين معاً: سدس أم الأب مع الأب الحي، وسدس أم الأم مع الأم الحية (وانفراد أم الأم بأنها لا تسقط بحال). قاعدة «طعمة أم الأب» رُقِّيت من «تحتاج مراجعة» إلى «موثقة».
- 5 اختبارات قبول جديدة (#76–#80): أب+جدة أم الأب (الجدة سدسها)، أب+أم+جدتان (كلتاهما سدسها والأب ثلثه)، زوجة+أبوان+جدتان+ابن (من 24)، ابن+جدة أم الأم بلا أم (الجدة سدسها بنص ص٢٨)، أم+جدة أم الأب بلا أب (الجدة محجوبة). إجمالي الاختبارات: 80/80 ✓
- 5 حالات مرجعية جديدة في الجدول المرجعي الثاني (بنود 31–35)؛ إصدار قواعد المحرك مرفوع إلى 2.0.0 (أول تعديل حكم شرعي معتمد منذ الإصدار الأول).
تصحيح مرجع حجب أجداد جهة الأب وتوثيق ص٢٧
٢٫٥٫١- **تصحيح مرجع الحجب:** كان نص «محجوبة بأحد الأبوين (ص٢٧)» يُعرض عند حجب الجدة أم الأب والجد أب الأم بالأبوين؛ وص٢٧ لا تتكلم عن هذا الحجب. النص المصحح: «محجوبة بقرب الأبوين: من قرُب حجب من بعُد (ص٥، ص٧)؛ والطُّعمة بالسدس خاصة بالجدة أم الأم بالنص (منهاج ص٢٨–٢٩، دعائم ص٣٧٨)» — مع تعديل رابط الشاهد ليوجّه إلى ص٥ عوضاً عن ص٢٧.
- إضافة قاعدة جديدة بحالة «تحتاج مراجعة»: **طعمة الجدة أم الأب مع بقاء الأبوين** — لم يرد فيها نص في المصدرين، فالمعمول به حجبها بالقرب، وتُعرض على مختص لمن أراد الاستيثاق. لا أثر حسابي.
- توثيق ص٢٧ من منهاج الفرائض: إضافة ثلاثة نصوص حرفية جديدة إلى مخزن الشواهد مرتبطة بقاعدة الجهتين: نص الجدَّين أب الأب وأب الأم (ثلثان وثلث)، ونص الجدتين أم الأب وأم الأم (نفس النسبة)، ونص العلو بدرجة واحدة. تحديث قاعدة الجهتين لتصير مصدرها الأول منهاج ص٢٧ بدلاً من دعائم ص٣٧٨ وحدها، مع الإبقاء على دعائم مصدراً ثانياً.
- اختبار قبول جديد #75: أم وجدة أم الأم وجدة أم الأب (تركة ٢٣٠٠٠٠) — الأم خمسة أسداس (١٩١٦٦٦.٦٧)، الجدة أم الأم سدسها طُعمةً (٣٨٣٣٣.٣٣)، الجدة أم الأب محجوبة بالمرجع المصحح.
الجدول المرجعي الثاني (30 حالة) وثلاثة إصلاحات فقهية
٢٫٥٫٠- **قاعدة تنفيذية ١ — الجدة (أم الأم) مع الجد والإخوة:** كانت المسألة تُحال إلى «مراجعة خبير» حين يجتمع الجد والجدة مع الإخوة؛ الصواب: الجدة تأخذ سدسها طُعمةً ثابتة، والجد والإخوة يتقاسمون الباقي مقاسمةً — منهاج ص٢٧؛ دعائم ص٣٧٨.
- **قاعدة تنفيذية ٢ — الجدة (أم الأم) تحجب العمومة والخؤولة:** كانت مسألة «جدة وعم» تُحال إلى مراجعة؛ الصواب: الجدة أقرب درجةً من العم فتحجبه وتأخذ التركة كاملةً — منهاج ص٢٨.
- **قاعدة تنفيذية ٣ — قاعدة الجهتين للجد (أب الأب) والجدة (أم الأم) وحدهما:** كانت مسألة «جد وجدة» تُعطي الجدَّ ٥/٦ والجدةَ ١/٦ (مسار النواة العادية)؛ الصواب: مسار قاعدة الجهتين يُعطي جهة الأب (الجد) الثلثين وجهة الأم (الجدة) الثلث — منهاج ص٢٧؛ دعائم ص٣٧٨.
- إضافة **الجدول المرجعي الثاني** (30 حالة) إلى منظومة المطابقة الشاملة: بند 1-9 (سدس الجدة طُعمةً مع مختلف الورثة)، بند 10-17 (قاعدة الجهتين والأجداد الأربعة)، بند 18-25 (تنزيل فروع الإخوة)، بند 26-28 (وعاء الدية واستثناء ولد الأم)، بند 29-30 (ابن الملاعنة). يشمل فحص الدية حالاتٍ يُستثنى فيها الأخ لأم من وعاء الدية لكنه يرث من التركة العادية.
- تحديث قانون ٩ في منظومة المطابقة الشاملة: أُضيف إلى تعريف «مسار قاعدة الجهتين» اجتماعُ الجد والجدة الأصليَّين بلا ولد ولا أبوين ولا إخوة — لمنع انطلاق القانون خطأً على حالات الثلثين والثلث الجديدة.
إصلاح خطأ فقهي جسيم — الأب عاصب لا مشارك في الرد النسبي
٢٫٤٫٠- **خطأ ١:** دالة `weightedSiblingCount` كانت تحسب الإخوة لأم ضمن الوزن المُطبِّق لحجب نقصان الأم، وهم لا يُنقصون فرضها بأي حال — الصواب: الأشقاء والإخوة لأب فقط يُنقصون الأم من الثلث إلى السدس (ص٢٢).
- **خطأ ٢:** المحرك كان يطبّق الرد النسبي بين الأب والأم (بنسبة سدس:ثلث = ١:٢ لصالح الأم) بلا زوجية ولا ولد، فيُعطي الأب الثلث والأم الثلثين — عكس ما نصّ عليه الكتاب صراحةً: «الثلثان فهما سهم الأب مع الأم إذا انفردا» (ص٣). الصواب: الأب عاصب بنفسه يأخذ الباقي بعد الفروض (ص٥).
- تأثير الإصلاح: أب+أم بلا زوجية → ثلثان وثلث (لا ثلث وثلثان)؛ أب+أم+أخوان شقيقان → خمسة أسداس وسدس (لا نصف ونصف)؛ الرد النسبي بقي صحيحاً عند وجود زوج/زوجة.
- تحديث ٤ اختبارات دقة كانت تُحقِّق النتائج الخاطئة + إضافة ٦ اختبارات جديدة (id=69-74) تشمل مزيج الأشقاء/لأب/لأم مع الأبوين، وإضافة شاهد ص٢٧ لمسألة الجد مع الجدة.
إشعار النسخة التجريبية — عنصر مؤقت قابل للإزالة بسطر واحد
٢٫٣٫٠- مفتاح تحكم مركزي `BETA_MODE` في `src/lib/siteConfig.ts` — تغيير قيمته إلى `false` يُطفئ كل عناصر الإشعار دفعة واحدة.
- شريط رفيع ذهبي أسفل الترويسة مباشرةً يعرض «نسخة تجريبية — التطبيق لا يزال تحت التجربة والتطوير» مع رابط تواصل وزر إغلاق يخفيه لجلسة التصفح الحالية فقط ويعود في الزيارة التالية.
- شارة دائمة صغيرة «تجريبي / Beta» بجانب اسم التطبيق في الترويسة — لا تختفي بزر الإغلاق.
- سطر إضافي في منطقة إخلاء المسؤولية بصفحة النتيجة وفي تذييل محضر القسمة: «صادر من نسخة تجريبية قيد الاختبار والتطوير» — حماية إضافية في الوثائق.
تفعيل الدومين الرسمي mawarith.app وتنظيف الأوصاف
٢٫٢٫٠- تفعيل الدومين الرسمي https://mawarith.app — BASE_URL موحَّد في src/lib/siteConfig.ts (تغيير الدومين مستقبلاً لن يحتاج إلا تعديل سطر واحد).
- إضافة redirect دائم من replit.app إلى mawarith.app: سكريبت inline في index.html يكتشف نطاق replit ويحوّل الزائر فوراً إلى الدومين الرسمي مع الحفاظ على المسار والمعاملات.
- تحديث جميع الأوصاف التسويقية (meta description، og، twitter، عنوان الـ hero الفرعي) لتُحيل إلى مصدر الكتاب لا إلى المذهب: «وفق ما نصّ عليه كتاب منهاج الفرائض للقاضي النعمان» / «based on Minhaj al-Fara'id by al-Qadi al-Nu'man» — الإسناد العلمي التفصيلي داخل صفحة حول التطبيق بقي كما هو بصيغته التوثيقية.
- إعادة توليد صورة opengraph.jpg بالنص المحدَّث (بدون ذكر المذهب في العنوان الفرعي). تحديث prerender.mjs إلى mawarith.app. تحديث JSON-LD (إضافة alternateName: Mawarith، تحديث knowsAbout).
اعتماد «Mawarith» علامةً تجاريةً إنجليزيةً رسميةً تمهيداً للدومين الجديد
٢٫١٫٠- اعتمد المالك «Mawarith» اسماً إنجليزياً رسمياً (علامة تجارية) تمهيداً للدومين الجديد mawarith.app؛ «Inheritance Calculator» يبقى وصفاً تعريفياً لا اسماً (سطر ثانٍ).
- المواضع المُحدَّثة بالاسم الجديد: Navbar (APP_NAME.en) · manifest.webmanifest (name+short_name) · Deed.tsx (ترويسة المحضر + تذييل التقرير) · Result.tsx (نص المشاركة) · About.tsx · Privacy.tsx.
- مركزية الرابط: أُنشئ siteConfig.ts بثابت BASE_URL = "https://mawarith.app" — أي تغيير للدومين لن يحتاج إلا تعديل سطر واحد.
- حارس الدستور (§1)، فحص الدقة (68/68)، والمطابقة الشاملة (+700) — جميعها خضراء بعد التحديث. الاسم العربي والإسناد العلمي بلا تغيير.
اعتماد الاسم الرسمي الجديد «حاسبة المواريث» لدواعي الحيطة القانونية
٢٫٠٫٠- عدّل المالك الاسم الرسمي بتاريخ اليوم لدواعي الحيطة، وبقيت المرجعية العلمية كما هي: الاعتماد الحصري على كتاب «منهاج الفرائض» للقاضي النعمان مع دعائم الإسلام وأرقام الصفحات وشواهد الكتاب تبقى حرفياً دون أي مساس.
- الاسم العربي الجديد: «حاسبة المواريث» — الاسم الإنجليزي: Inheritance Calculator — الاسم القصير للـ PWA: «المواريث».
- حُدِّث دستور الثوابت (§1 — الهوية) وسجل الإصدارات وجميع الشاشات والنصوص والبيانات الوصفية: الترويسة، تقارير النتيجة، محضر القسمة والتوقيع، نصوص المشاركة، manifest، robots، JSON-LD، صفحات حول وسياسة الخصوصية والكتاب وفحص الدقة وسجل القواعد.
- حارس الدستور، فحص الدقة (68/68)، والمطابقة الشاملة (+700) — جميعها خضراء بعد التعديل. لم يتغيّر أي حكم فقهي في المحرك.
دستور الثوابت وحارسه — إصلاح انحدار توثيقي وتحصين السجل
١٫٩٫٠- إصلاح انحدار توثيقي: ست قواعد كانت مشهودة نصاً في مخزن الشواهد لكنها وُسمت خطأً باستنباط أو غير مكتملة — أُعيد ربطها بشواهدها وأصبحت موثقة: (١) لا عول ص١٦، (٢) الرد ص٥، (٣) اللقيط ص٣١-٣٢، (٤) ابن الملاعنة ص٣٢-٣٣، (٥) الحمل ص٣٦-٣٧، (٦) الخنثى ص٣٠-٣١.
- حُذفت الصفحة المزيفة ص٤-٥ من قاعدة «القسمة بالتراضي» وأُبدلت بـ«—» تصريحاً بأنها أداة حسابية بلا عزو صفحة عمداً.
- إنشاء ملف «دستور الثوابت» (PROJECT_CONSTITUTION.md) في جذر المشروع: يُكتب قبل كل مهمة، ويُعدَّل بالإضافة فقط، ويضم جدول القواعد الملزم بمعرّفاتها وصفحاتها وحالاتها وتأكيداتها.
- إضافة فحصَي جودة آليَّين دائمَين في لوحة تقرير الجودة: (١٣) تكامل التوثيق — يرفض أي قاعدة مشهودة نصاً مع حالة غير موثقة؛ (١٤) حارس الدستور — يتحقق من حالة كل قاعدة أساسية وصفحتها والهوية وعبارة الحقوق والعدادات الدنيا، وأي انحراف يظهر بنداً أحمر مفصلاً.
- رُقّي إصدار قواعد المحرك إلى 1.9.0؛ 68/68 اختباراً ناجحاً — لم يتغيّر أي حكم فقهي في المحرك.
اعتماد الاسم الرسمي الجديد وبوابات سلامة الجدول
١٫٨٫٠- اعتمد المالك بتاريخ اليوم اسماً رسمياً جديداً للتطبيق في كل الواجهات والنصوص والبيانات الوصفية (عُدِّل لاحقاً بقرار المالك في v2.0.0 لدواعي الحيطة).
- إضافة بوابة تكامل إلزامية تعمل على كل حساب (وليس في الاختبارات فقط): تمنع كلياً ظهور اسمي مجموعتين متطابقين في جدول واحد، وتمنع عرض أي نتيجة يتجاوز مجموع كسورها الواحد الصحيح، مع عرض تنبيه خلل داخلي صريح بدل الجدول عند الفشل.
- إضافة اختبار #68 (زوجة وأب وأم وجدة أم أم وابن) للتحقق الدائم من عدم تكرار صف الأم ومطابقة المجموع لصافي التركة تماماً؛ 68/68 اختباراً ناجحاً.
تنزيل فروع الإخوة، الأجداد الأربعة، الدية، واستلحاق ابن الملاعنة
١٫٧٫٠- دعم تنزيل فروع الإخوة والأخوات المتوفَّين (أبناؤهم وبناتهم) يقومون مقام أصلهم عند عدم وجود إخوة أحياء (منهاج ص٢١؛ دعائم ص٣٧٥ وص٣٨٠).
- دعم اجتماع الأجداد الأربعة (الجد والجدة من الأب، والجدة والجد من الأم) وفق قاعدة الجهتين: ثلثان لجهة الأب وثلث لجهة الأم (دعائم ص٣٧٨).
- رُقّيت أحكام اجتماع الجدة (أم الأم) مع الأم أو الأب من needs_review إلى قاعدة محسومة: سدسها طُعمة ثابتة لا تسقط (منهاج ص٢٩؛ دعائم ص٣٧٨).
- دعم إدخال الدية كتركة مستقلة عن أصل المال، مع استثناء الإخوة والأخوات لأم من الإرث منها (منهاج ص٤١).
- إضافة خيار الاستلحاق (إقرار الأب بنسب ابن الملاعنة) الذي يعيد النسب ويُشارِك الأب والابن في الإرث معاً (منهاج ص٣٣).
- إضافة 11 اختباراً جديداً (52 اختباراً إلى 67) لتغطية الأبواب الجديدة، مع تحديث اختبارات الجدة القديمة لتعكس ترقيتها من مراجعة خبير إلى نتيجة محسومة.
الأختام الرسمية وبوابات الأمان والوضع الليلي
١٫٦٫٠- توزيع المبالغ بطريقة أكبر الباقي بحيث تساوي مجموعها صافي التركة تماماً في كل الجداول والمحاضر.
- إضافة شارات صريحة للحجب الكامل (حرمان) والحجب الجزئي (نقصان) لكل وريث.
- إضافة بوابات أمان إجرائية (مفقود، وفاة بعد المورث، نزاع، قاصر) تمنع اعتماد محضر القسمة أو تختمه بـ«غير معتمدة» حتى تُحل، مع تنبيه ولاية للقاصر.
- إضافة وضعي عرض «مبسط» و«علمي» في صفحة النتائج، مع بيان علاقة المقامات (تماثل/تداخل/توافق/تباين) في تفصيل أصل المسألة.
- إضافة أختام رسمية (رقم تسلسلي، التاريخ الهجري والميلادي، إصدار القواعد) على التقارير والمحاضر، وخيار إخفاء الأسماء عند حفظ الحالة، والوضع الليلي مع تحكم بحجم الخط.
المعالج الذكي والتدقيق التعليمي
١٫٥٫٠- إضافة معالج خطوات (Wizard) لإدخال بيانات الحالة بمرونة مع وضع المراجعة.
- تفعيل بطاقات 'لماذا؟' لشرح أسباب الاستحقاق أو الحجب لكل وريث.
- عرض تفصيلي لكيفية حساب أصل المسألة والتصحيح في صفحة النتائج.
أنواع الأصول وقسيمة القسمة
١٫٤٫٠- دعم أنواع الأصول العينية (عقارات، ذهب، أسهم) وتوزيعها بالحصص.
- توليد قسيمة قسمة شرعية جاهزة للطباعة مع مساحة للتواقيع.
الغرقى والهدمى والمصادر الثانوية
١٫٣٫٠- إطلاق محرك حساب 'الغرقى والهدمى' لمعالجة حالات الوفاة الجماعية.
- مراجعة الأحكام ومطابقتها مع المصادر الثانوية (مثل دعائم الإسلام).
- إضافة فصول المواريث الموثقة (اختلاف الدين، الإرث بالولاء).
الشواهد النصية والمصورة
١٫٢٫٠- ربط كل حكم بنصه الحرفي من كتاب منهاج الفرائض.
- إضافة ميزة 'تصفح الكتاب' لاستعراض النسخة المصورة من المخطوط.
نظام اختبار الدقة
١٫١٫٠- بناء مجموعة اختبارات آلية (49 اختباراً) لضمان عدم تراجع دقة الحساب.
الإطلاق الأول: محرك منهاج الفرائض
١٫٠٫٠- اعتماد محرك الحساب الأساسي وفق قواعد كتاب منهاج الفرائض للقاضي النعمان.
أي تغيير في الأحكام الفقهية للمحرك لا يتم إلا عبر التوثيق المسبق واجتياز فحوصات الدقة المعتمدة.
دستور الثوابت
هذا الملف مرجع الثوابت الأعلى للتطبيق، يُقرأ قبل أي مهمة، ولا يُعاد توليده أبداً، والتعديل عليه بالإضافة فقط وبقيد في سجل الإصدارات.
§ 1 — الهوية
- الاسم العربي: حاسبة المواريث
- الاسم الإنجليزي: Inheritance Calculator
- بريد التواصل: naj_4ever_ran@hotmail.com
- عبارة الحقوق: © Mosleh — جميع الحقوق محفوظة في كل صفحة وتقرير
- المصدران: منهاج الفرائض للقاضي النعمان (أساساً) — دعائم الإسلام (تأكيداً)
- نصوص الأحكام والشواهد: لا تُترجم أبداً — تبقى عربية في كل اللغات
§ 4 — العدادات الدنيا والحُرّاس الدائمون
- اختبارات فحص الدقة: لا تقل عن 64
- حالات المطابقة الشاملة: لا تقل عن 700
- مجموع الكسور = الواحد أو أقل (بيت المال)
- لا تكرار في أسماء مجموعات الورثة
- لا فيض أفقي في كل الصفحات واللغتين
§ 5 — قواعد العمل للوكيل (ملخص)
- اقرأ الدستور قبل كل مهمة
- ممنوع إعادة توليد ملفات الحقيقة الواحدة من الصفر
- لا تنسب صفحة إلا إذا كانت في مخزن الشواهد
- شغّل الحزمة كاملة قبل إنهاء أي مهمة
- قيّد ما تغيّر في سجل الإصدارات
ملف الدستور الكامل: PROJECT_CONSTITUTION.md في جذر المشروع — الإصدار الأول: 1.9.0 — 2026-07-12