---
title: "المعايير والمحكات"
url: https://docs.growamal.com/ar/guides/standards-and-benchmarks/
language: ar
---

# المعايير والمحكات

تحوّل وحدة المعايير (WP-STD-BE، `modules/standards`) درجةَ القياس الخام إلى حكم `MeasureStatus` بمقارنتها بدرجات حدّية تعود ملكيتها للشريك، مفهرسةً حسب البلد وقابلة للتحديث بدون تغيير الكود. وتتولى هذه الوحدة أيضًا إدارة تلك الدرجات الحدّية دون الحاجة إلى تعديل في الكود.

> **ملاحظة:** لا يوجد في أي مكان من المنصة نتيجة إجمالية واحدة أو نسبة مئوية (V-3). كل حالة خاصة بقياس واحد أو نطاق مجال كبير واحد. لا يُعامَل `not_assessed` أبدًا كصفر.

## MeasureStatus: الحكم ذو القيم الخمس

تُحلَّل درجة القياس إلى واحدة بالضبط من خمس حالات. تُعرَض هذه الحالات كتسميات عربية وصفية، ولا تُعرَض كأرقام أو نسب مئوية قط.

| مفتاح الحالة | المعنى |
|---|---|
| `meets` | الدرجة تبلغ الحد المستهدف |
| `approaching` | الدرجة فوق الحد الأدنى لكنها دون الحد المستهدف |
| `below` | الدرجة دون الحد الأدنى |
| `severe` | الدرجة صفر، أو لم يستطع الطالب قراءة الكلمة الأولى (قاعدة الصفر التي حدّدها الشريك) |
| `not_assessed` | الدرجة فارغة، أو لا درجات حدّية رقمية مُهيّأة، أو لم يقدّم الشريك بعد الدرجات الحدّية لهذا البُعد |

يُستثنى `not_assessed` من أي تجميع. لا يُحسَب متوسطًا ولا يُعامَل كدرجة منخفضة.

## سلسلة الدقة الثلاثية الخطوات

لزوج `(country, skillId, assessmentType, gradeBand)` يجتاز المحرك ثلاثة مستويات:

1. **التطابق الدقيق**: ملف يطابق هذا البلد + هذه المهارة + نوع التقييم + الشريحة الدراسية بالضبط.
2. **الافتراضي للبلد**: إن لم يوجد تطابق دقيق، ملف لنفس البلد مع `skillId` بقيمة null.
3. **الاحتياطي العالمي**: إن لم يوجد بعد، ملف مع `country` بقيمة null (المُعرِّف الحارس `__GLOBAL__`). هذا الصف موجود دائمًا، لذا لا تعود الدقة أبدًا بقيمة null.

تكتب خطوات الاحتياط 2 و3 سجل `resolution_fallback` للتدقيق. إن فشلت الخطوات الثلاث (غير ممكن مع البيانات المُلقَّحة لكنه موقف دفاعي في المستقبل) يُسجَّل `resolution_miss` وتُعيَّن الحالة `not_assessed`.

### R12 (Q8): بُعد `assessmentWindow` لمحكات ORF ذات النوافذ

أصبحت محكات ORF للعربية الموصولة المشكولة (الأردن `ORF_CBM`، فلسطين `ORF_WITH_DIACRITICS`) **مُقسَّمة بنوافذ** عبر BOY / MOY / EOY (الـ commit `2ea532bd`). و`assessmentWindow` (`AssessmentWindow {BOY, MOY, EOY}`) هو **بُعد دقة رابع اختياري** — قيمته `null` (مستقلة عن النافذة) لكل صف غير ORF ولصفوف `__GLOBAL__`. ويضيف كلٌّ من مفتاح التفرّد النشط ومفتاح الإصدار النافذةَ، لذا يمكن أن تكون عدة محكات ذات نوافذ لنفس الصف نشطةً في آن واحد.

تستخدم الدقة **احتياطًا تمثيليًا للنافذة بأسبقية EOY** (`benchmark-reader.ts` `findWithWindowFallback`):

- المستدعي الذي يمرّر نافذةً يفضّل صف النافذة المطابقة بالضبط، ثم يحتاط إلى صف `window=null`.
- المستدعي الذي **لا** يمرّر نافذةً يفضّل صف `window=null`، ثم يحتاط إلى المحك التمثيلي ذي النافذة بأسبقية **EOY** (ترتيب حتمي `EOY > MOY > BOY`).

يُبقي هذا كل مستهلِك ORF/CBM مستقل عن النافذة يعمل دون تغيير (مثلًا مجسّ ORF للأردن صف 2 بلا نافذة يُحلّ إلى محك EOY للصف 2، أي 40 WCPM). ولا يقبل مسار HTTP `…/resolve` بعدُ مُعامل نافذة (متابعة من المرحلة B)؛ ولا يستطيع تمرير نافذة اليوم سوى مستدعي تثبيت الجلسة الداخليين.

### حارسات قابلية انطباق ORF (Q8)

تحمل محكات ORF قيمة `orfApplicability` (`required | not_applicable | optional_baseline_no_cut`). وحيث لا تنطبق ORF بعد، تُعيد الدقة **حارسًا مُنمَّطًا — وليس أبدًا** خطأ `BenchmarkUnresolvable` **ولا** حكم `meets` / `below`:

- **الصف 1 (كل النوافذ) والصف 2 BOY** ← `not_applicable` (حارس مُنمَّط).
- **الصف 2 MOY** ← `optional_baseline_no_cut`: تُسجَّل قيمة المجسّ لكن لا يُصدَر حكم.

## تثبيت الجلسة (V-6)

حين تبدأ جلسة، يكتب `freezeBenchmarkResolution` الخريطة `{ profileId, version }` المحلولة مرةً واحدة لزوج `(org, session)` — متضمّنةً النافذة المحلولة لمحكات ORF ذات النوافذ. تستخدم جميع تقييمات الدرجات داخل الجلسة تلك الإصدارة المثبّتة. التبديل الإداري لمحك في منتصف الجلسة لا يؤثر على الجلسات الجارية. يختم كل سجل مجسّ بصمة `benchmarkProfileId` و`benchmarkProfileVersion` الدائمة لإعادة التشغيل.

## الإصدار والتبديل الذري

ملفات المحك مؤرشفة بإصدارات. تنفّذ نقطة نهاية التفعيل الإدارية تبديلًا ذريًا تحت قفل مُستشار من Postgres: في معاملة واحدة تُوقِف الملف النشط الحالي وتُفعِّل الجديد وتُلحِق سجل سجل التغيير. يوفر قيد التفرّد الجزئي على مستوى قاعدة البيانات حزامًا أمانًا ثانيًا.

يسجّل سجل التغيير كل حدث من `create` و`activate` و`deactivate` و`resolution_fallback` و`resolution_miss`، مع معرف المستخدم المسؤول وانتقال الإصدار.

## الدرجات الحدّية المُلقَّحة مسبقًا

تُلقَّح الدرجات الحدّية الحقيقية للشريك للأردن (`JO`) وفلسطين (`PS`) عند إعداد المنصة. تأتي هذه الأرقام من ملف عمل الشريك ولا تُحرَّر يدويًا في التوثيق أو الكود. حين يُحدِّث الشريك ملف العمل تُستخرج الأرقام منه من جديد ويُنشَأ ملف محك جديد ويُفعَّل عبر admin API دون الحاجة إلى تغيير الكود.

تحمل صفوف `__GLOBAL__` قيمًا افتراضية مؤقتة (`valuesPending: true`) حتى يُقدّم الشريك الأرقام النهائية لذلك البُعد.

## لا تسميات أطر أو سريرية على أي سطح

تستخدم طبقة الحساب الداخلية معرّفات مصدر (مثل `JOR_RAMP`، إضافةً إلى نظير فلسطيني) مأخوذة من ملف عمل الشريك. تحذف حارسة طبقة التسلسل (`strip-yardstick.ts`) هذه المعرّفات قبل أن تغادر أي استجابة المخدّم باتجاه المعلم أو المسؤول. تحذف نقطة نهاية `resolve` حقل `source` كليًا. لا تظهر هذه التسميات على أي سطح موجَّه للمستخدم.

## نظرة عامة على مدرسة المدير

تقرأ لوحة مدير المدرسة من وحدة المعايير لثلاثة أسطح:

- **نظرة عامة على صحة المدرسة في القراءة**: مؤشرات Curriculum-KPI معروضة بتسميات عربية وفئات حالة. يُستثنى `not_assessed` من مؤشر صحة المدرسة؛ يُعرَض بشكل منفصل ولا يُدمَج في توزيع الحالة.
- **خريطة الحرارة الفصل × KPI**: لكل فصل ولكل مؤشر Curriculum-KPI، تُعرض الحالة السائدة (الأسوأ) بين طلاب ذلك الفصل. خلية واحدة لكل زوج (فصل، KPI)؛ لا أعداد خام ولا نسب مئوية.
- **عرض النمو عبر الزمن**: لكل نطاق مجال كبير، أعداد الحالة لكل نافذة تقييم (BOY/MOY/EOY) توجد فيها لقطات مُقيَّمة للطلاب، إضافةً إلى أعداد التحركات من نافذة إلى أخرى (نحو Meets / بعيدًا عن Meets / ثابت) للطلاب المُقيَّمين في النافذتَين. إجمالي فقط، قائم على الأعداد — لا نسب مئوية قط.

لا يعرض أي من هذه الأسطح رقمًا أو نسبة مئوية تمثّل المحو الأمي الإجمالي. انظر [المديرون ومديرو المدارس](https://docs.growamal.com/ar/guides/managers-and-principals/) لمعرفة كيفية قراءة هذه الآراء.

### R12 (Q9): قاموس Curriculum-KPI لكل صف (للمواءمة فقط)

أضافت R12 طبقةً **منفصلة** عن صفوف المؤشرات الـ 15 للمجال/النطاق الكلي أعلاه (الـ commit `5df45c3b`): قاموس Curriculum-KPI لكل صف يضم **51 مؤشرًا** (الصف 1: 12، الصف 2: 13، الصف 3: 13، الصف 4: 13) عبر 3 جداول عالمية (GLOBAL) جديدة — `curriculum_kpi_dictionary` و`curriculum_kpi_to_skill_map` و`curriculum_kpi_country_map`.

> **تنبيه:** **للمواءمة / إعداد التقارير فقط — وليست مدخلًا للقرار أبدًا.** يحمل كل صف في القاموس `decisionWeight = 0` (قيد CHECK في قاعدة البيانات) و`runtimeRole = ALIGNMENT_ONLY` كعمودين مخزّنين. هذه المؤشرات لا تؤثّر أبدًا في `skill_status` / `domain_status` / `profile` / `bundle` / `rti_tier` / `severity` / `benchmark`. ويُفشل حارس رسم الاستيراد `lint:kpi-alignment-only` عملية CI إذا قرأت أي وحدة من محرك القرار (`modules/{sse,profile,bundle,cluster,monitoring,rti,standards/engine}`) جداول الـ KPI الثلاثة — ويُسمح فقط لوحدات التقارير / لوحة المدير / واجهة API بقراءتها.

## مرجع API

| الأسلوب | المسار | الإذن | ملاحظات |
|---|---|---|---|
| `GET` | `/api/standards/benchmark-profiles/resolve` | معلم / مسؤول | دقة الملف النشط لسياق محدد |
| `GET` | `/api/admin/benchmark-profiles` | `SUPER_ADMIN` | قائمة جميع الملفات بالإصدار وحالة التفعيل |
| `POST` | `/api/admin/benchmark-profiles` | `SUPER_ADMIN` | إنشاء ملف جديد (مع التفعيل الفوري اختياريًا) |
| `POST` | `/api/admin/benchmark-profiles/:id/activate` | `SUPER_ADMIN` | تبديل ذري لتفعيل الملف |
| `GET` | `/api/admin/benchmark-profile-changelog` | `SUPER_ADMIN` | سجل تدقيق كامل لجميع أحداث الملفات |
| `GET` | `/api/principal/schools/:id/overview` | `VIEW_SCHOOL` | مؤشرات صحة المدرسة |
| `GET` | `/api/principal/schools/:id/heatmap` | `VIEW_SCHOOL` | خريطة حرارة الحالة السائدة لكل فصل × KPI |
| `GET` | `/api/principal/schools/:id/growth` | `VIEW_SCHOOL` | النمو الزمني من نافذة إلى أخرى حسب نطاق المجال الكبير |
| `POST` | `/api/principal/schools/:id/ministry-report` | `VIEW_SCHOOL` | رُكيزة Wave 1 (تعيد 501، ميزة Wave 2) |

لا تمنح أي نقطة نهاية إذنًا للطالب. لا تُقدَّم بيانات المحك مباشرةً للطلاب أو الأولياء.

## ذو صلة

- [محرك حالة المهارة](https://docs.growamal.com/ar/guides/skill-status-engine/): يستهلك `MeasureStatus` لاشتقاق حالة المهارة والمجال
- [التقارير وملف ولي الأمر](https://docs.growamal.com/ar/guides/reporting-and-parent-pdf/): يعرض فئات الحالة للمعلمين والأولياء
- [المديرون ومديرو المدارس](https://docs.growamal.com/ar/guides/managers-and-principals/): كيف تقرأ لوحة المدير النظرة العامة للمدرسة وخريطة الحرارة
- [المسرد](https://docs.growamal.com/ar/glossary/): `MeasureStatus`، `delta_prior`، المعايرة
