سجل التغييرات: سياسة عمارة SaaS وAnnex A
يوثّق هذا السجل ما تغيّر كنتيجة مباشرة لكل مراجعة، ومن يُنسب إليه الفضل في ذلك. تُدرَج هنا فقط التغييرات المفيدة والمعتمدة — أما النقاط المُثارة وغير المعتمدة فلا تُوثَّق هنا. التفاصيل التقنية الكاملة موجودة في السياسة وفي Annex A نفسيهما؛ هذه الصفحة هي الفهرس المُختصر.
:::tip إضافة إدخال جديد أضِف كتلة إصدار جديدة أعلى الصفحة (الأحدث أولاً) مع تعبئة اسم المراجع. إذا جاء التغيير من مراجعة وثيقة/أداة بدلاً من شخص محدد بالاسم، انسبه بـ "المصدر:" بدلاً من "المراجع:". :::
v1.11 — 2026-10-17
المصدر: طلب مباشر — تصحيح أخطاء في ملف بنود العمل
| # | التغيير | الموضع |
|---|---|---|
| 1 | تصحيح: كان ACT-001 يشير إلى withTenantScope()، وصار withTenant() ليطابق الواجهة الفعلية والملحق A.10 | actions.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) ودُمجت في dev | rarit-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 Free | code-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-cycle | A.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.md | A.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).