إنتقل إلى المحتوى الرئيسي

سجل التغييرات: سياسة عمارة SaaS وAnnex A

يوثّق هذا السجل ما تغيّر كنتيجة مباشرة لكل مراجعة، ومن يُنسب إليه الفضل في ذلك. تُدرَج هنا فقط التغييرات المفيدة والمعتمدة — أما النقاط المُثارة وغير المعتمدة فلا تُوثَّق هنا. التفاصيل التقنية الكاملة موجودة في السياسة وفي Annex A نفسيهما؛ هذه الصفحة هي الفهرس المُختصر.

:::tip إضافة إدخال جديد أضِف كتلة إصدار جديدة أعلى الصفحة (الأحدث أولاً) مع تعبئة اسم المراجع. إذا جاء التغيير من مراجعة وثيقة/أداة بدلاً من شخص محدد بالاسم، انسبه بـ "المصدر:" بدلاً من "المراجع:". :::

v1.11 — 2026-10-17​

المصدر: طلب مباشر — تصحيح أخطاء في ملف بنود العمل

#التغييرالموضع
1تصحيح: كان ACT-001 يشير إلى withTenantScope()، وصار withTenant() ليطابق الواجهة الفعلية والملحق A.10actions.md (ACT-001)
2تصحيح: حالة ACT-004 «مُحسوم — انعكاس» ليست حالة معرَّفة؛ أصبحت مُغلَقactions.md (ACT-004، جدول التتبّع)
3تصحيح: رابط ACT-004 إلى الملحق A.10 كان يستخدم مرساة العنوان قبل إعادة التسمية؛ حُدِّث إلى الحاليةactions.md (ACT-004)

v1.10 — 2026-10-17​

المصدر: طلب مباشر — توثيق قرارات دمج محرك البحث (طلبا الدمج ‎#375 و‎#376 في rarit-saas-kernel)

#التغييرالموضع
1أُضيف: حزمة محرك البحث (@raritllc/search) ودُمجت في devrarit-saas-kernel، packages/search
2تقرر: اكتشاف المستأجرين على مستوى المنصة عبر دوال SECURITY DEFINER ودور قارئ لكل جدول (A)ADR platform-enumeration-under-rls
3تقرر: خطّاف المحلِّل يزوّد قيم نطاق الصفوف فقط، والصلاحيات تُسأل لكل مفتاح لكل طلب دون تخزين مؤقت (B)packages/search/src/v1/access.ts
4تقرر: يقبل rowScope الصيغة النصية والكائنية (C)packages/search/src/core/manifest/schema.ts
5تقرر: SearchError يرث AppError (D)، والفهارس في locales/ (E)packages/search
6تقرر: إدراج search في npm-packages.mjs (F)، ولا سبب ولا إجراءات حساسة لـsearch.* (G)scripts/npm-packages.mjs
7تقرر: الاستحقاق search.enabled منطقي ولا يُحتسب، وتدقيق الاستعلامات دون نصّهاpackages/search
8أُضيف: ACT-012 إلى ACT-016 (عيوب في IAM وplatform-core) وACT-017 (سجل القرارات)actions.md (جديد)

v1.9 — 2026-08-28​

المصدر: طلب مباشر — إضفاء الطابع الرسمي على عملية مراجعة الكود كسياسة مستقلة، منفصلة عن سياسة عمارة SaaS (نطاق أوسع: يشمل التطبيقات المحمولة المستقلة أيضًا، لا النواة والقطاعات الرأسية فقط)

#التغييرالموضع
1أُضيفت: سياسة شقيقة جديدة، "سياسة RaR-IT لمراجعة الكود وطلبات السحب" الإصدار 1.0 — متطلبات PR، تهيئة Claude Code Review، حوكمة REVIEW.md، حدود إنفاذ الدمج في ظل GitHub Freecode-review-policy.md (جديد)
2أُغلِق: البند ACT-005، والنتيجة هي السياسة الجديدةactions.md
3أُضيف: البند ACT-006 — منع تباعد REVIEW.md عبر المستودعات، لم يُختَر تصميم بعدactions.md (جديد)
4أُضيف: البند ACT-007 — نشر قالب PR واتفاقية تسمية الفروع على مستوى المنصة، بما فيها التطبيقات المحمولة التي لا توجد لها خطة نشر سابقةactions.md (جديد)

v1.8 — 2026-08-28​

المصدر: طلب مباشر — تهيئة Claude Code Review الآن بعد تفعيل خطة Team

#التغييرالموضع
1أُضيف: البند ACT-005 — تهيئة Claude Code Review على rarit-saas-kernel وجميع مستودعات القطاعات الرأسية الخمسة؛ ضُبط المُشغِّل (trigger) على "Once after PR creation"actions.md (إدخال جديد)
2أُضيف: REVIEW.md — ملف خاص بكل مستودع يترجم القسم 4، والقسم 5/A.10، وA.7، وA.11.3 من السياسة إلى قواعد صريحة لـ Code Review، متمايز عن سياق CLAUDE.md العام للمشروعREVIEW.md (جديد، لكل مستودع)

v1.7 — 2026-08-27​

المصدر: طلب مباشر — إعادة إنتاج ومطابقة (mirror) وثيقتي ADR أقدم كانتا مُشار إليهما لكن لم تُنشرا من قبل في هذه المجموعة

#التغييرالموضع
1أُضيفت: وثيقة ADR "Fastify for Shared Engines (Not NestJS)" أُعيد بناؤها بالكامل (9 أقسام، مصفوفة تقييم من 12 معيارًا) من المحتوى الفعلي للمحادثة الأصلية، ونُشرت كصفحة ذات إصدار (versioned)adr/fastify-vs-nestjs-decision.md (جديد، EN + AR)
2أُضيفت: دراسة المقارنة الموزونة "Node.js vs. PHP Laravel" أُعيد بناؤها (استُرجعت 7 من أصل 9 معايير بالكامل؛ معياران ثانويان بوزن مجمّع 10٪، أُشير إليهما بأمانة كغير مُسترجَعَين بدلًا من التخمين)adr/nodejs-vs-laravel-study.md (جديد، EN فقط — AR قيد الإنجاز)
3أُضيفت: نسخ PDF ذات إصدار لكلتيهما، وُضعتا في signed-records/adr/ إلى جانب ADR نمط الوصول لقاعدة البيانات الموجود مسبقًاsigned-records/adr/
4أُعيدت الهيكلة: وثائق ADR الثلاث أصبحت الآن ضمن فئة فرعية متداخلة بعنوان "Architecture Decision Records (ADRs)" في الشريط الجانبي، مرتّبة زمنيًا (Fastify-vs-NestJS ← نمط الوصول لقاعدة البيانات ← Node-vs-Laravel)sidebars.ts

v1.6 — 2026-08-27​

المصدر: طلب مباشر — أصبح مصدر ADR الخارجي غير متاح؛ يُطابَق (mirror) محليًا بدلًا من ذلك

#التغييرالموضع
1أُضيف: db-access-pattern-decision.md أُعيد إنتاجه حرفيًا كصفحة ذات إصدار (v1.0)adr/db-access-pattern-decision.md (جديد)
2تقرّر: حُلّ البند ACT-004 — المطابقة (mirror) بدلًا من التثبيت والربط (pin-and-link)، نظرًا لأن المصدر أصبح غير متاحactions.md
3أُصلِح: استُبدلت الإشارات الأربع كلها إلى رابط github.com/rarit/rarit-saas-kernel الخارجي برابط النسخة المحلية المطابقةالقسم 5 والقسم 6 من السياسة؛ A.1، A.10

v1.5 — 2026-08-27​

المصدر: طلب مباشر — تجميع البنود المفتوحة في متتبِّع مخصص

#التغييرالموضع
1أُضيف: متتبِّع بنود عمل (Action Items) جديد، بأربعة بنود مفتوحة (ACT-001–ACT-004) مع النوع والحالة وخانة المسؤول (فارغة)actions.md (جديد)
2أُضيف: اقتراح كامل لدالة withPlatformAdminScope() — دالة منفصلة، للقراءة فقط افتراضيًا، بالاختيار لكل جدول (opt-in per table)، مع سبب تدقيق إلزامي — مع العائق الفعلي TEN-DASH-01 الذي تحلهA.11.2 (توسّع من سؤال مفتوح إلى تصميم مقترح)
3أُضيف: إشارة إلى ACT-003 (ضمان ديمومة ناقل الأحداث event bus) — المحتوى دون تغيير، يُتابَع الآن مركزيًاA.7
4أُضيف: إشارة إلى ACT-002 (مصفوفة ملكية البيانات) — المحتوى دون تغيير، يُتابَع الآن مركزيًاالقسم 9 من السياسة
5أُضيف: ACT-004 — توصية بعدم مطابقة (mirror) وثائق ADR الخاصة بـ rarit-saas-kernel في هذا المستودع؛ بل تثبيت روابط GitHub على commit محددactions.md (جديد)

v1.4 — 2026-08-27​

المراجع: _____________ النوع: مراجعة رسمية مكتوبة (13 ملاحظة، بأولويات عالية/متوسطة/منخفضة)

#التغييرالموضع
1أُصلِح: "Clinical Templates Engine" ← "Clinical Templates Module" (كانت تتعارض مع حد الخمسة محركات في القسم 4)A.4، الجدول الملخِّص
2أُصلِح: نص برمجي معطوب lint:cycles — أعلام ESLint قديمة غير متوافقة مع الإعداد المسطّح (flat config) المحدَّد في خطوة سابقةA.9 الخطوة 3
3أُضيفت: قاعدة eslint-plugin-boundaries للاستيراد أحادي الاتجاه بين القطاعات الرأسية — ثغرة حقيقية لا تغطيها no-cycleA.9 الخطوة 9 (جديدة)
4أُضيف: النص على أن RLS هو الحد الأساسي غير القابل للتجاوز؛ وأن التصفية على مستوى التطبيق ثانوية وليست مكافئة لهA.10
5أُضيف: أن set_config(..., true) تعني SET LOCAL، ولماذا هذا ما يجعل النمط آمنًا مع تجمّع الاتصالات (connection pool)A.10
6أُضيف: سجلات التدقيق (Audit) تُخزَّن لكل قطاع رأسي على حدة، لا مركزيًا — نتيجة مباشرة للقسم 3.2، مذكورة الآن صراحةًA.10
7أُضيف: الإشارة إلى أن ضمان تسليم ناقل الأحداث (event bus) غير محسوم؛ يُوصى بنمط outbox معاملاتي (transactional outbox) إن كان within-process فقطA.7
8أُضيفت: معايير محددة لمتى يجوز لقطاع رأسي تبنّي NestJS، مرتبطة بأمثلة فعليةالقسم 6.1 من السياسة
9أُضيفت: دورة حياة الطلب كاملة — Auth ← Tenant Resolution ← RBAC ← Entitlement ← RLS ← منطق الأعمالالقسم 4 من السياسة
10أُضيف: تسجيل مصفوفة ملكية البيانات كبند عمل دائم للجنة مراجعة العمارة (ARB)القسم 9 من السياسة
11أُضيف: تحديد proxy-hop كالحل المعياري بدلًا من ضابط (guard) مكرَّر، إن اعتُمد هذا النمط يومًاA.6
12أُضيف: توضيح ملكية إعداد نسبة العمولة (تقع في Payment/Entitlements، وليس Transport)A.2
—حُذِف: A.11.5 (ملاحظة دور PostgREST) — اعتُبرت ذات قيمة منخفضة، ولا تمثّل خطرًا فعليًا على كود RaR-ITطُلِب مباشرة، وليس جزءًا من هذه المراجعة

v1.3 — 2026-08-27​

المصدر: تقييم أعمال سابقة — sascdb.sql (إعداد RLS لنظام PostgreSQL قديم غير ذي صلة، قُدِّم للمراجعة)

#التغييرالموضع
1أُضيف: نمط RLS لجدول فرعي بلا عمود tenant_id مباشر (سياسة محدَّدة النطاق عبر subquery)A.11.1 (جديد)
2أُضيف: شكل قراءة المسؤول عبر المستأجرين (cross-tenant admin-read) أُشير إليه كاقتراح مفتوح لـ platform-core — ليس نمطًا معتمدًا بعدA.11.2 (جديد)
3أُضيف: مثال مضاد حقيقي — ENABLE ROW LEVEL SECURITY بدون FORCE، وُجد في النظام القديم كما هوA.11.3 (جديد)
4أُضيف: مثال مضاد حقيقي — منطق الإشعارات/التدقيق مُضمَّن داخل DB trigger بدلًا من طبقة الخدمة (service layer)A.11.4 (جديد)

v1.2 — 2026-08-27​

المراجع: _____________ النوع: ملاحظة مراجعة غير رسمية، قبل الاعتماد النهائي (pre-sign-off)

#التغييرالموضع
1أُصلِح: كانت A.1 وA.3 وA.4 وA.5 تستدعي fastify.db مباشرةً داخل معالِجات المسارات (route handlers)، بما يتعارض مع db-access-pattern-decision.mdA.1، A.3، A.4، A.5
2أُضيف: اعتُمد تقسيم ثلاثي الطبقات repository ← service ← route كالشكل المرجعي في كل مثالA.1، A.3، A.4، A.5
3أُضيف: تم توثيق getDb() / withTenantScope() كنمط الوصول الإلزامي المحدَّد النطاق حسب المستأجر (tenant-scoped)A.10 (جديد)، القسم 5 من السياسة
4أُضيف: رُفض رسميًا كل من fastify.decorate('db', ...) ومعامل معاملة (transaction) صريح، مع ذكر الأسبابالقسم 6 من السياسة
5أُضيف: عرض كتابة سجل التدقيق (audit) بوضوح ضمن نفس معاملة (transaction) التعديل المُحفِّز لهاA.1، A.10

v1.1 — 2026-08-27​

المصدر: Circular_Dependency_Problems.pdf (مرجع حول التبعيات الدائرية في npm/Node.js، قُدِّم للتقييم)

#التغييرالموضع
1أُضيف: يجب أن تكون التبعيات بين المحركات (engine-to-engine) غير دائرية (acyclic) — حُدِّد خطر حقيقي بين IAM↔Notifications وEntitlements↔Notificationsالقسم 4 من السياسة
2أُضيف: طُبِّقت نفس قاعدة اللادورية صراحةً على الاستيراد بين القطاعات الرأسية (vertical-to-vertical)القسم 4 من السياسة
3أُضيف: فُرضت قاعدة no-cycle من eslint-plugin-import في CI عبر مساحة العمل (workspace) بأكملهاالقسم 5 من السياسة
4أُضيف: مثال عملي — أُصلحت دورة IAM↔Notifications عبر أحداث منشورة (published events) بدلًا من استيراد عكسيA.7 (جديد)
5أُضيف: مثال عملي — أُصلحت دورة القطاعين الرأسيين AMAAR↔Tourism عبر ترقية المنطق المشترك إلى حزمة ضمن النواة (kernel package)A.8 (جديد)
6أُضيف: شرح تفصيلي كامل من 8 خطوات لتنفيذ CI (تثبيت ← إعداد ← مهمة CI ← حماية الفروع ← pre-commit ← نشر آمن ← تحقق)A.9 (جديد)

v1.0 — 2026-08-25​

السياسة الأولية وAnnex A. الحالة: مقترحة، بانتظار اعتماد لجنة مراجعة العمارة (ARB).