mjolnir-qa 4.0.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ar.md DELETED
@@ -1,647 +0,0 @@
1
- <div align="center">
2
-
3
- <img src="assets/readme/hero.svg" alt="Mjölnir. الاختبارات تخبرك بما نجح. Mjölnir يخبرك بما يمكنك الوثوق به." width="100%" />
4
-
5
- <br />
6
-
7
- يعثر Mjölnir على الاختبارات التي لا يمكن أن تفشل وخطوط CI التي لا يمكن أن تتحول إلى الأحمر،<br />
8
- ثم يقيّم إلى أي حد يمكن الوثوق بالنتيجة، مع الدليل على كل نقطة.
9
-
10
- <br />
11
-
12
- [![npm](https://img.shields.io/npm/v/mjolnir-qa.svg?style=flat-square&color=1F6F7C&labelColor=0A1119)](https://www.npmjs.com/package/mjolnir-qa)
13
- [![downloads](https://img.shields.io/npm/dm/mjolnir-qa.svg?style=flat-square&color=1F6F7C&labelColor=0A1119)](https://www.npmjs.com/package/mjolnir-qa)
14
- [![ci](https://img.shields.io/github/actions/workflow/status/Sergey-Bar/Mjolnir/ci.yml?branch=main&style=flat-square&label=ci&labelColor=0A1119)](https://github.com/Sergey-Bar/Mjolnir/actions/workflows/ci.yml)
15
- [![coverage](https://img.shields.io/codecov/c/github/Sergey-Bar/Mjolnir?style=flat-square&color=1F6F7C&labelColor=0A1119&label=coverage)](https://codecov.io/gh/Sergey-Bar/Mjolnir)
16
- [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/Sergey-Bar/Mjolnir/badge)](https://scorecard.dev/viewer/?uri=github.com/Sergey-Bar/Mjolnir)
17
- [![license](https://img.shields.io/badge/license-MIT-1F6F7C.svg?style=flat-square&labelColor=0A1119)](LICENSE)
18
- [![node](https://img.shields.io/badge/node-%E2%89%A5%2022.18-1F6F7C.svg?style=flat-square&labelColor=0A1119)](https://nodejs.org)
19
-
20
- ```bash
21
- npx mjolnir-qa@3.0.0
22
- ```
23
-
24
- [شاهده وهو يعمل](#شاهده-وهو-يعمل) · [البدء السريع](#البدء-السريع) · [ما الذي يكتشفه](#ما-الذي-يكتشفه-mjölnir) · [الدرجة](#درجة-الجدارة) · [الأدلة](#نموذج-الأدلة) · [تحليل التشغيلات](#تحليل-تشغيلات-الاختبار) · [CI](#سلامة-ci) · [الوكلاء](#وكلاء-الذكاء-الاصطناعي) · [الأمان](#الثقة-والأمان) · [الحدود](#ما-لا-يستطيع-mjölnir-أن-يخبرك-به) · [التوثيق](#التوثيق)
25
-
26
- <details>
27
- <summary>اقرأ بلغة أخرى — 22 ترجمة</summary>
28
-
29
- [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | العربية | [Bosanski](README.bs.md)
30
-
31
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-26.
32
-
33
- <!-- Source hash: `de04dfb1677b` -->
34
-
35
- </details>
36
-
37
- </div>
38
-
39
- <br />
40
-
41
- ## Release status (English canonical)
42
-
43
- The published line is `3.0.0`; this working tree is the `4.0.0-rc.1`
44
- candidate. `3.0.0` must not be republished or retagged. The M26–M50 program is
45
- tracked in
46
- [`docs/ROADMAP.yaml`](docs/ROADMAP.yaml); provisional capability contracts
47
- are not automatically enabled or certified. Repository-owned checks pass, but
48
- Trust certification remains `NOT_CERTIFIED` until the protected holdout,
49
- real-world, platform/consumer, remote-workflow, support-matrix, and corpus
50
- evidence gates pass. Run `npm run m26:readiness` before treating any candidate
51
- as releasable. This document does not publish a tag or authorize a release.
52
-
53
- > Machine-assisted canonical text. Translate this block before treating it as localized copy.
54
-
55
- ## علامة الصح الخضراء ادعاء، وليست دليلًا
56
-
57
- علامة الصح الخضراء تعني أن خط CI لم يفشل. لا تعني أن الاختبارات عملت، ولا أنها كان يمكن أن تفشل. كل واحدة من هذه تمر باللون الأخضر:
58
-
59
- - ‏`.only` بقي في commit فشغّل 3 اختبارات بدل 900
60
- - ‏`continue-on-error: true` على الـ job الذي كان يُفترض أن يمنع الدمج
61
- - ‏`|| true` بعد أمر الاختبار
62
- - اختبار لا يتحقق من أي شيء، أو جسمه فارغ
63
- - غلاف إعادة محاولة يحوّل فشلًا حقيقيًا إلى نجاح بالحظ
64
- - تقرير يرفعه الـ workflow لكنه لم يُنشأ قط
65
- - ‏sleep ثابت يُبقي حالة تسابق متماسكة
66
-
67
- لا يحوّل أيٌّ منها خط CI إلى الأحمر، وكل واحد منها يبدو مقصودًا عند المراجعة. لهذا تبقى. هذا Mjölnir يقرأ مثالًا حقيقيًا:
68
-
69
- <p align="center">
70
- <img src="assets/readme/scan.svg" alt="‏workflow الـ CI في مستودع العرض، مقروءًا سطرًا بسطر. يعلّم Mjölnir كل نتيجة عند السطر الذي أبلغ عنه، مع قاعدتها وما الخطأ ومستوى الدليل ومعدل الإيجابيات الكاذبة المقيس لها." width="800" />
71
- </p>
72
-
73
- <sub>كل نتيجة أبلغ عنها فحص العرض لهذا الـ workflow، عند السطر الذي أبلغ عنه. مولَّد بواسطة `npm run docs:readme-brand` من [`demo-report.json`](assets/readme/demo-report.json) ومقفل ضد الانحراف في CI.</sub>
74
-
75
- **الوضع الصارم.** الكشف الأكثر عدوانية — `.only`، `continue-on-error`، الاختبارات الفارغة، إساءة إعادة المحاولة — تقع في مستوى الحجر الصحي. تعمل فقط مع `--strict` وتُ限定 بخطورة `info`: تُعلم، لكنها لا تُوقف أبدًا. الفحص الافتراضي (`npx mjolnir-qa@3.0.0` بدون `--strict`) يغطي القواعد الأساسية والموسعة فقط. أضف `--strict` عندما تريد طبقة الاستشارات أيضًا.
76
-
77
- يقرأ Mjölnir مجموعة الاختبارات وملفات workflow الخاصة بـ CI، وتقرير تشغيل حقيقي إن وُجد. لا يشغّل اختباراتك، ولا يثبّت اعتمادياتك، ولا ينفّذ الشيفرة التي يفحصها. وعندما لا يملك دليلًا، يقول ذلك بدل أن يختلق ثقة:
78
-
79
- | الحالة | ما يبلّغ عنه Mjölnir |
80
- | -------------------------------------------------------- | ---------------------------------------------------------- |
81
- | لم يُعثر على تعريفات اختبارات | الدرجة `null`، وتُعرض كـ **UNKNOWN**. لا 100 مختلقة أبدًا. |
82
- | لا يوجد خط أساس أو مراجعة قابلة للمقارنة | ‏**UNKNOWN**، مع ذكر السبب. لا 0 مفترضة أبدًا. |
83
- | توقف الفحص قبل اكتماله (ميزانية الوقت، ملفات غير مقروءة) | ‏**PARTIAL**، رمز الخروج `2`. لا يُعرض أبدًا على أنه نظيف. |
84
-
85
- <p align="center">
86
- <img src="assets/readme/how-it-works.svg" alt="كيف يعمل Mjölnir. يقرأ مجموعة الاختبارات وخط CI قراءة ساكنة، وتقرير تشغيل حقيقي عند وجوده. يزن كل نتيجة حسب مستوى دليلها ومستوى الثقة بها، حيث لا يصل إلى L3 حتى L5 إلا تشغيل حقيقي، وينتج نتائج ودرجة جدارة وبوابة CI برموز خروج مجمّدة. وفي حلقة الوكيل، يكتب الذكاء الاصطناعي الإصلاح ويعيد Mjölnir الفحص لإثباته." width="880" />
87
- </p>
88
-
89
- <sub>صُمّم لهذه الصفحة ويُعرض بمقياس 1:1. مولَّد بواسطة `npm run docs:readme-brand` ومقفل ضد الانحراف في CI؛ الدرجة والأعداد ومعرّف القاعدة تأتي من [`script.demo.json`](assets/video/script.demo.json) و[`demo-report.json`](assets/readme/demo-report.json) وسجل القواعد، ولا تُكتب يدويًا أبدًا. الصورة نفسها كملصق: [`architecture.svg`](assets/readme/architecture.svg).</sub>
90
-
91
- <br />
92
-
93
- ## شاهده وهو يعمل
94
-
95
- فحص حقيقي لـ [`examples/demo-repo`](examples/demo-repo)، وهي مجموعة Playwright صغيرة مع workflow لـ CI. هنا ذهبت نقاطها:
96
-
97
- <p align="center">
98
- <img src="assets/readme/terminal-hero.svg" alt="تفصيل الخصومات في Mjölnir: WORTHINESS 80/100 WORTHY، والدرجة حسب الفئة، ومربع الخصومات حسب الخطورة، وقائمة FIX THIS FIRST" width="520" />
99
- </p>
100
-
101
- <sub>مولَّد بواسطة `npm run docs:hero` من فحص حقيقي ومقفل ضد الانحراف في CI. تقرير `--verbose` الكامل للفحص نفسه هو [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`).</sub>
102
-
103
- <details>
104
- <summary><strong>شاهده</strong> — فحص، والإصلاح الذي يطبعه، وإعادة الفحص التي تثبته</summary>
105
-
106
- <br />
107
-
108
- <p align="center">
109
- <a href="assets/video/mjolnir-demo.mp4">
110
- <img src="assets/video/mjolnir-demo-poster.png" alt="لقطة من تسجيل العرض: npx mjolnir-qa@3.0.0 يفحص مستودع العرض في نافذة طرفية" width="900" />
111
- </a>
112
- </p>
113
-
114
- <sub>رُسم إطارًا بإطار من فحص حقيقي بواسطة `npm run docs:video`؛ ولم يُسجَّل من الشاشة قط. اختر الإطار لفتح [`mjolnir-demo.mp4`](assets/video/mjolnir-demo.mp4).</sub>
115
-
116
- </details>
117
-
118
- ### نتيجة واحدة عن قرب
119
-
120
- كل نتيجة تجيب عن أربعة أسئلة: أين هي، ومدى تأكد Mjölnir، وكم مرة تخطئ القاعدة، وكيف تُصلح.
121
-
122
- <p align="center">
123
- <img src="assets/readme/finding-anatomy.svg" alt="النتيجة الأولى من فحص العرض، تمامًا كما تطبعها الطرفية، مع تعليم أجزائها الأربعة: أين، ومدى التأكد، وكم مرة تخطئ القاعدة، والإصلاح." width="100%" />
124
- </p>
125
-
126
- يطبع `mjolnir explain QA-CI-001` سجل الثقة الكامل لقاعدة ما، بما في ذلك معدل الإيجابيات الكاذبة المقيس لها والمستوى الذي منحها إياه هذا المعدل:
127
-
128
- ```text
129
- ▍ QA-CI-001 — continue-on-error masks a failing verification gate
130
-
131
- Severity: error
132
- Confidence: high
133
- Tier: quarantine
134
- Evidence: E2
135
- QA impact: False-green risk (FALSE-GREEN)
136
- Measured FP: 11% (19 hand-classified corpus verdicts)
137
- FP risk: low (author estimate)
138
- Languages: yaml
139
- Frameworks: github-actions, azure-pipelines
140
-
141
- WHAT WAS FOUND (real detector output, not a mockup)
142
- Job `security-scan` runs a verification gate under `continue-on-error: true`.
143
-
144
- WHY IT MATTERS
145
- This job can fail every day and CI will still show green. The checkmark on
146
- this workflow cannot be trusted.
147
-
148
- HOW TO FIX
149
- Remove continue-on-error, or scope it to individual non-blocking steps only.
150
-
151
- Example from this rule's own must-fire fixture: QA-CI-001/must-fire/masked.yml
152
-
153
- WHAT WOULD CHANGE THE VERDICT
154
- - a run report next to the scan target (mjolnir.report.json or test-results/)
155
- corroborating this file lifts its findings to L3–L5
156
- - a documented suppression (mjolnir.config.json) lowers the finding count
157
- without claiming correctness
158
- - quarantine findings run only under --strict and are advisory (E0) — they can
159
- never gate CI
160
-
161
- NEXT ACTION
162
- Fix the first occurrence, then re-run: `mjolnir --scope changed`. Every
163
- occurrence of this rule is listed in the scan output.
164
-
165
- HOW TO VERIFY THE FIX
166
- Re-run `mjolnir` on the changed file(s) — this finding should no longer
167
- appear. `mjolnir --scope changed` scopes the check to just what you touched.
168
-
169
- Docs: mjolnir rules --md (full catalog, this rule included)
170
- ```
171
-
172
- هذه هي وحدة القيمة: موضع واحد يبلّغ فيه CI عن نجاح لم يستحقه.
173
-
174
- <br />
175
-
176
- ## البدء السريع
177
-
178
- ```bash
179
- npx mjolnir-qa@3.0.0
180
- ```
181
-
182
- يفحص الدليل الحالي ويطبع Trust Report: ما الذي وجده، وإلى أي حد يمكنك الوثوق به، ولماذا، وما الخطوة التالية. ويخرج بالرمز `0` عندما لا يُعثر على شيء عند مستوى البوابة أو فوقه.
183
-
184
- في CI، افحص فقط ما أدخله الفرع، حتى لا تُغرق مجموعة اختبارات قديمة أول pull request لك:
185
-
186
- ```bash
187
- npx mjolnir-qa@3.0.0 --scope changed
188
- ```
189
-
190
- يكتب `mjolnir ci install` ذلك كـ workflow لـ GitHub Actions، باستخدام [الـ action](https://github.com/Sergey-Bar/Mjolnir#readme) المثبّت على الوسم الرئيسي `v3` (أو `npx` عادي مع `--no-action`). ويبقى استشاريًا إلى أن تقرر أنه يجب أن يمنع الدمج.
191
-
192
- | الأمر | ما الذي يفعله |
193
- | --------------------------------------------- | ------------------------------------------------------------ |
194
- | `mjolnir` | ‏Trust Report: الحكم، ودرجة الثقة، والإجراء التالي |
195
- | `mjolnir --scope changed` | فقط ما أدخله فرعك (صيغة CI) |
196
- | `mjolnir ci install` | ينشئ workflow استشاريًا لطلبات الدمج (قائمًا على الـ action) |
197
- | `mjolnir business-case` | ROI estimate: projected savings per finding |
198
- | `mjolnir release-report` | Release readiness: GO, CONDITIONAL GO, or NO-GO |
199
- | `mjolnir release-trust` | 12-dimension release assurance verdict |
200
- | `mjolnir report` | Generate a Playwright-compatible report |
201
- | `mjolnir trend` | Record, show, or diff local quality snapshots |
202
- | `mjolnir policy` | Initialize, validate, or check policy gates |
203
- | `mjolnir quarantine` | Review deterministic proposals (prototype) |
204
- | `mjolnir analyze --cross-file` | Bounded cross-file analysis |
205
- | `mjolnir ci-adapter github .` | Generate CI templates for supported providers |
206
- | `mjolnir dashboard` | Generate a self-contained quality dashboard |
207
- | `mjolnir exec-report` | Executive KPIs and recommendations (advisory) |
208
- | `mjolnir enterprise` | Self-hosted templates (prototype) |
209
- | `mjolnir maturity` | Assess maturity or display maturity levels |
210
- | `mjolnir mutation tests/mutation-report.json` | Analyze mutation reports; never promotes trust |
211
- | `mjolnir mcp` | Read-only MCP tools over stdio |
212
- | `mjolnir explain QA-CI-001` | ماذا ولماذا وكيف يُصلح، مع معدل FP المقيس |
213
- | `mjolnir why src/a.spec.ts:42` | لماذا عُلّم هذا السطر بالتحديد. لا يمنع الدمج أبدًا. |
214
- | `mjolnir forensics ./test-results/` | أدلة وقت التشغيل من تشغيل حقيقي |
215
- | `mjolnir trust-report` | ‏Trust Artifact مستقل (md + json) |
216
- | `mjolnir handoff` | خطة معالجة لوكيل برمجة |
217
- | `mjolnir --json` / `--format sarif` | مخرجات قابلة للقراءة آليًا، GitHub Code Scanning |
218
- | `mjolnir --format codequality` | تقرير GitLab Code Quality (عنصر لأداة طلب الدمج) |
219
- | `mjolnir --strict` | يشغّل أيضًا قواعد مستوى quarantine (خطر FP أعلى) |
220
-
221
- <details>
222
- <summary><strong>كل الأوامر الأخرى</strong> — فرز الاختبارات غير المستقرة، والتقارير، والحوكمة</summary>
223
-
224
- <br />
225
-
226
- | الأمر | ما الذي يفعله |
227
- | ----------------------------------- | ------------------------------------------------------------------------- |
228
- | `mjolnir --classic` | لافتة الدرجة السابقة لـ Trust Report |
229
- | `mjolnir explain verdict` | لماذا جاء حكم الفحص المحفوظ على ما هو عليه |
230
- | `mjolnir triage ./test-results/` | فرز موجَّه. كل صف ينتهي بإجراء تالٍ. |
231
- | `mjolnir pw-report ./test-results/` | ملخص تشغيل Playwright: إعادات المحاولة، والاختبارات غير المستقرة، والأبطأ |
232
- | `mjolnir doctor:playwright` | فحص معمّق خاص بـ Playwright مع Selector Health Score |
233
- | `mjolnir fix --dry-run` / `fix` | إصلاحات تلقائية آمنة، يُعاد فحص كل منها لإثبات أنه نجح |
234
- | `mjolnir baseline` / `diff` | لقطة للنتائج، ثم الإبلاغ عن الجديد أو الأسوأ فقط |
235
- | `mjolnir impact --since <ref>` | ما أدخله commit وما حلّه |
236
- | `mjolnir summary` | تعليقات CI وملخص للخطوة من تقرير |
237
- | `mjolnir pr-comment` | تعليق محدد النطاق على طلب الدمج، بصيغة Markdown |
238
- | `mjolnir debt` | سجل الدَّين التقني للاختبارات مع نموذج تكلفة |
239
- | `mjolnir handover` | خريطة تعريفية بمجموعة الاختبارات لمهندس QA جديد |
240
- | `mjolnir init` | يكتشف أُطر العمل ويطبع قائمة تحقق للإعداد |
241
- | `mjolnir suppressions` | يعرض النتائج المكتومة، لأغراض الحوكمة |
242
- | `mjolnir rules --unmeasured` | القواعد التي تعمل على افتراض، لا على قياس |
243
- | `mjolnir rules --md` | فهرس القواعد الكامل (JSON أو Markdown) |
244
- | `mjolnir doctor` | تدقيق ذاتي لقاعدة قواعد Mjölnir نفسها |
245
- | `mjolnir create-rule <ID>` | ينشئ هيكلًا لقاعدة جديدة وملفات fixtures الخاصة بها |
246
- | `mjolnir stats` | عدّادات محلية لكل الإصلاحات التي رُصدت |
247
- | `mjolnir badge` | ‏JSON لنقطة نهاية shields.io ومقتطف |
248
- | `mjolnir --cache` | إعادات فحص تزايدية عبر ذاكرة تخزين مؤقت محلية للأحكام |
249
- | `mjolnir --format mermaid` | مخطط لبنية الاختبارات لتعليق على طلب الدمج |
250
-
251
- يطبع `mjolnir help <command>` طريقة الاستخدام والأمثلة والخطوة التالية لأي منها.
252
-
253
- </details>
254
-
255
- يتطلب **Node.js ≥ 22.18** على Windows أو macOS أو Linux. تفضّل التثبيت العام؟ `npm i -g mjolnir-qa`. يأتي هذا الحد الأدنى من سلسلة أدوات البناء (يستهدفه tsdown ويُجري خط الإصدار اختبارات دخان عليه)؛ ولا تحتاج اعتماديات وقت التشغيل أكثر من ذلك.
256
-
257
- <br />
258
-
259
- ## ما الذي يكتشفه Mjölnir
260
-
261
- <p align="center">
262
- <img src="assets/readme/stack.svg" alt="يعمل مع حزمة تقنياتك: اللغات وأُطر الاختبار وأنظمة CI التي تغطيها قواعده، من سجل القواعد." width="100%" />
263
- </p>
264
-
265
- **79 قاعدة** في أربع عائلات — نظافة الاختبارات، وجودة الاختبارات، وPlaywright، وسلامة CI — عبر TypeScript وJavaScript وPython وJava وC# وYAML الخاص بـ GitHub Actions. تغطي Playwright في روابطه الأربعة، إضافة إلى pytest وJUnit وTestNG وNUnit وxUnit وMSTest وJest وVitest وMocha، مع تغطية مبدئية لـ Cypress وSelenium. تسع منها، لإظهار الشكل:
266
-
267
- | ID | القاعدة | الخطورة | المستوى |
268
- | ------------ | ------------------------------------------------------------- | ------- | ---------- |
269
- | QA-CI-001 | ‏`continue-on-error` يخفي بوابة تحقق فاشلة | error | quarantine |
270
- | QA-CI-009 | رمز خروج الاختبارات لا يُمرَّر (`\|` دون pipefail، سلاسل `;`) | error | extended |
271
- | QA-TEST-001 | اختبار مركّز بقي في commit (`.only`، `fit`) | error | quarantine |
272
- | QA-TEST-003 | اختبار بلا تأكيدات | error | quarantine |
273
- | QA-TQUAL-009 | تأكيد على promise دون await | error | quarantine |
274
- | QA-PW-002 | تأكيد على locator دون await | error | core |
275
- | QA-PW-004 | محددات CSS/XPath هشة | warning | quarantine |
276
- | QA-PY-002 | اختبار متخطى (`skip`، `xfail` غير صارم) | warning | core |
277
- | QA-CS-103 | دالة اختبار بلا تأكيدات | error | core |
278
-
279
- يُولَّد الفهرس الكامل من السجل ولا يُصان يدويًا أبدًا: `mjolnir rules --md`، أو [`docs/rules/`](docs/rules/)، أو [دليل ما الذي يفحصه](https://sergey-bar.github.io/Mjolnir/guide/what-it-checks).
280
-
281
- <details>
282
- <summary><strong>كل قاعدة مذكورة في هذا الملف</strong>، في جدول واحد</summary>
283
-
284
- <br />
285
-
286
- > قواعد `quarantine` تعمل فقط مع `--strict` ولا تمنع الدمج أبدًا (إذ تُحدّ عند info). الخطورة المعروضة هي التي حددها المؤلف.
287
-
288
- | ID | العائلة | القاعدة | الخطورة | المستوى |
289
- | ------------ | ---------- | ---------------------------------------------------- | ------- | ---------- |
290
- | QA-TEST-001 | النظافة | اختبار مركّز بقي في commit (`.only`، `fit`) | error | quarantine |
291
- | QA-TEST-002 | النظافة | اختبار متخطى. يتصاعد إلى `error` دون سبب متتبَّع. | warning | quarantine |
292
- | QA-TEST-003 | النظافة | اختبار بلا تأكيدات | error | quarantine |
293
- | QA-TEST-004 | النظافة | ‏sleep ثابت (`waitForTimeout`، `sleep()`، `delay()`) | warning | extended |
294
- | QA-TEST-006 | النظافة | إساءة استخدام إعادة المحاولة لإخفاء عدم الاستقرار | warning | quarantine |
295
- | QA-TEST-010 | النظافة | جسم اختبار فارغ | error | quarantine |
296
- | QA-TQUAL-002 | الجودة | تأكيد تحصيل حاصل | error | quarantine |
297
- | QA-TQUAL-009 | الجودة | تأكيد على promise دون await | error | quarantine |
298
- | QA-TQUAL-011 | الجودة | اختبارات معلّقة كتعليقات | warning | extended |
299
- | QA-PW-002 | Playwright | تأكيد على locator دون await | error | core |
300
- | QA-PW-003 | Playwright | ‏`page.pause()` / `test.only()` بقيا في commit | error | core |
301
- | QA-PW-004 | Playwright | محددات CSS/XPath هشة | warning | quarantine |
302
- | QA-PW-123 | Playwright | عناوين URL للبيئات مثبتة في الشيفرة | warning | quarantine |
303
- | QA-PW-140 | Playwright | لقطة شاشة دون `maxDiffPixelRatio` | warning | core |
304
- | QA-CI-001 | CI | ‏`continue-on-error` يخفي بوابة فاشلة | error | quarantine |
305
- | QA-CI-002 | CI | ‏`\|\| true` يبتلع رموز الخروج | error | extended |
306
- | QA-CI-005 | CI | تقرير يُستهلك لكنه لا يُنشأ أبدًا | error | quarantine |
307
- | QA-CI-007 | CI | أغلفة إعادة المحاولة حول الاختبارات | warning | extended |
308
- | QA-CI-008 | CI | خطوة تنجح دائمًا تخفي الإخفاقات | error | quarantine |
309
- | QA-CI-009 | CI | رمز الخروج لا يُمرَّر (`\|` دون pipefail، سلاسل `;`) | error | extended |
310
- | QA-CI-010 | CI | اختبارات متخطاة حيث يجب أن تمنع الدمج | error | quarantine |
311
- | QA-PY-002 | Python | اختبار متخطى (`skip`، `xfail` غير صارم) | warning | core |
312
- | QA-PY-003 | Python | دالة اختبار بلا تأكيدات | error | quarantine |
313
- | QA-PY-005 | Python | ‏`time.sleep()` في الاختبارات | warning | extended |
314
- | QA-PY-012 | Python | تأكيد تحصيل حاصل | error | quarantine |
315
- | QA-JV-101 | Java | اختبار معطّل (`@Disabled`) | warning | core |
316
- | QA-JV-102 | Java | ‏sleep ثابت (`Thread.sleep()`) | warning | extended |
317
- | QA-JV-103 | Java | دالة اختبار بلا تأكيدات | error | extended |
318
- | QA-JV-105 | Java | ‏sleep ثابت عبر `waitForTimeout()` في Playwright | warning | core |
319
- | QA-JV-106 | Java | محدد هش بدل locator قائم على الدور | warning | quarantine |
320
- | QA-CS-101 | C# | اختبار متخطى (`[Ignore]`، `[Fact(Skip=)]`) | warning | core |
321
- | QA-CS-102 | C# | ‏sleep ثابت (`Thread.Sleep` / `Task.Delay`) | warning | core |
322
- | QA-CS-103 | C# | دالة اختبار بلا تأكيدات | error | core |
323
- | QA-CS-105 | C# | ‏sleep ثابت عبر `WaitForTimeoutAsync()` | warning | extended |
324
- | QA-CS-106 | C# | محدد هش بدل locator قائم على الدور | warning | quarantine |
325
-
326
- تتضمن Python أيضًا القواعد QA-PY-001…012 (نظافة pytest) وQA-PY-101…108 (Playwright لـ Python). ولكل من Cypress وSelenium مجموعة مبدئية من ثلاث قواعد.
327
-
328
- </details>
329
-
330
- تُطلق كل قاعدة مع ملف fixture من نوع must-fire **و**آخر من نوع must-not-fire، ولا يمكن إطلاق قاعدة تنطلق على ملف fixture السلبي الخاص بها. هذا هو جدار الحماية من الإيجابيات الكاذبة؛ ويفرضه `mjolnir doctor` في CI الخاص بهذا المستودع.
331
-
332
- ### Selector Health Score
333
-
334
- يقيّم `mjolnir doctor:playwright` كل locator حسب طريقة عثوره على العنصر: كما يفعل المستخدم (الدور، التسمية، النص)، أو عبر عقد صريح (`data-testid`)، أو بمصادفة بنيوية (سلاسل CSS، XPath). يحصل كل ملف على درجة من 0 إلى 100:
335
-
336
- ```text
337
- ▍ SELECTOR HEALTH
338
-
339
- e2e/login.spec.ts
340
- [█████████████░░░░░░░] 65 / 100
341
- role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
342
-
343
- e2e/checkout.spec.ts
344
- [██████████████████░░] 88 / 100
345
- role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
346
- ```
347
-
348
- هذا يقيس **المتانة، لا الصحة**. ينجح `.btn.btn-primary > div:nth-child(2)` اليوم ويظل ينجح إلى أن يلمس أحدٌ الترميز. الدرجة المنخفضة لا تدّعي أبدًا أن الاختبار معطوب، بل فقط أنه يعتمد على ترميز لم يعد أحد بالحفاظ عليه.
349
-
350
- <br />
351
-
352
- ## درجة الجدارة
353
-
354
- <p align="center">
355
- <img src="assets/readme/score-gauge.svg" alt="مقياس الجدارة من 0 إلى 100، مع مؤشر يمر على كل درجة: UNWORTHY تحت 50، وNEEDS WORK من 50 إلى 79، وWORTHY من 80 إلى 99، وFORGED عند 100" width="720" />
356
- </p>
357
-
358
- <sub>كل درجة من 0 إلى 100، موضوعة بواسطة `deriveScoreState` الحقيقي. مولَّد بواسطة `npm run docs:gauge` ومقفل ضد الانحراف في CI.</sub>
359
-
360
- | الدرجة | الحكم |
361
- | --------- | ------------------------------------------- |
362
- | `0 – 49` | **UNWORTHY** |
363
- | `50 – 79` | **NEEDS WORK** |
364
- | `80 – 99` | **WORTHY** |
365
- | `100` | **FORGED** |
366
- | `null` | ‏**UNKNOWN**: لم يُعثر على تعريفات اختبارات |
367
-
368
- **كيف تُحسب.** تحدد الخطورة خصمًا أساسيًا (`error −8`، `warning −3`، `info −1`) ويخفّضه مستوى الدليل: E2 يُحتسب كاملًا، وE1 نصفه (مقرّبًا للأسفل)، وE0 لا شيء. يُطبَّع المجموع حسب تعرّض مجموعة الاختبارات، أي الخصومات لكل تعريف اختبار لا لكل ملف. تطبع الطرفية الأرقام المخفّضة نفسها التي استخدمتها الدرجة؛ ولا يوجد نموذج ثانٍ مخفي. التفاصيل: [docs/SCORING.md](docs/SCORING.md) و[دليل الدرجة](https://sergey-bar.github.io/Mjolnir/guide/scoring).
369
-
370
- **ما لا تعنيه 100.** لا تعني أن البرنامج صحيح، ولا أن مجموعة الاختبارات كافية، ولا أن المنتج خالٍ من العيوب. تعني شيئًا واحدًا: **لم تُنتج أيٌّ من القواعد التي قيّمها Mjölnir خصمًا في هذا الفحص وضمن نموذج الأدلة هذا.**
371
-
372
- <br />
373
-
374
- ## نموذج الأدلة
375
-
376
- تحمل كل نتيجة وسمين: مدى تأكد Mjölnir، وإلى أي حد جرى التحقق من النتيجة. هذا هو الفرق بين أداة تبلّغ عن أنماط وأداة يمكنك أن تربط بها قرار الإصدار.
377
-
378
- **مدى التأكد — مستوى الدليل.**
379
-
380
- | المستوى | الاسم | المعنى | الخصم |
381
- | ------- | --------- | --------------------------------------------- | ----- |
382
- | **E2** | دليل حتمي | العيب موجود في الشيفرة كما هي مكتوبة | كامل |
383
- | **E1** | دليل نمطي | تطابق نمط مرتبط ارتباطًا وثيقًا بالعيب | نصف |
384
- | **E0** | ملاحظة | تستحق المعرفة. ليست ادعاءً بأن شيئًا ما خاطئ. | صفر |
385
-
386
- الثقة في الاكتشاف ليست قوة الدليل. قد تكون القاعدة متأكدة من أنها طابقت ما كانت تبحث عنه، ومع ذلك تنظر إلى استدلال تقريبي. نتائج E1 موجودة لتُقرأ ويُحكم عليها، لا لتُطبّق دون تمحيص، وهذا الحد مختوم على النتيجة في الطرفية وفي JSON وفي التسليم إلى الوكيل.
387
-
388
- **إلى أي حد جرى التحقق — مستوى الثقة.** معظم النتائج تأتي من قراءة شيفرتك. أعطِ Mjölnir تقرير تشغيل اختبارات حقيقي ويمكنه أن يؤكد أن الشيفرة عملت فعلًا.
389
-
390
- <p align="center">
391
- <img src="assets/readme/trust-ladder.svg" alt="سلّم الثقة من L0 إلى L5. تأتي L0 حتى L2 من قراءة الشيفرة؛ وتحتاج L3 حتى L5 إلى تقرير تشغيل حقيقي، ويُشار إلى ذلك بانقطاع في السلّم." width="100%" />
392
- </p>
393
-
394
- | المستوى | بكلمات بسيطة | ما الذي يتطلبه |
395
- | ------- | ---------------- | ------------------------------------------- |
396
- | **L0** | مُلاحَظ | قراءة الشيفرة |
397
- | **L1** | يبدو أنه المشكلة | قراءة الشيفرة: تطابق نمط |
398
- | **L2** | مُثبت في الشيفرة | قراءة الشيفرة: العيب بنيوي |
399
- | **L3** | الملف عمل | تقرير التشغيل يُظهر أن ملف النتيجة نُفّذ |
400
- | **L4** | الاختبار عمل | تقرير التشغيل يُظهر أن اختبار النتيجة نُفّذ |
401
- | **L5** | التشغيل يؤكد | نتيجة التشغيل نفسها تؤكد فئة العيب |
402
-
403
- يتوقف الفحص الساكن عند L2. وحده تقرير تشغيل حقيقي (Playwright JSON، أو Jest أو Vitest JSON، أو JUnit XML) يمكنه رفع نتيجة إلى L3 أو أعلى، فالنتيجة التي لم تُرَ وهي تعمل لا يمكنها أبدًا أن تدّعي أنها عملت. التعريفات: [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md).
404
-
405
- ### كم من هذا مقيس
406
-
407
- **74 من أصل 79 قاعدة لديها معدل إيجابيات كاذبة مقيس على شيفرة OSS حقيقية** (10 نتائج مصنّفة يدويًا على الأقل لكل منها؛ انظر [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). أما الـ 5 الأخرى فتُطلق بتقدير المؤلف وتقول ذلك، قاعدةً قاعدة، في `mjolnir explain`. يسردها `mjolnir rules --unmeasured`، ويبلّغ تذييل كل فحص عن عدد القواعد المقيسة من بين تلك التي _انطلقت_ فعلًا.
408
-
409
- تبقى المعدلات علنية حتى عندما تكون سيئة. نتيجة تدقيق QA-TEST-001 (‏`.only` بقي في commit) سيئة على المستودعات الحقيقية ولذلك يقبع في quarantine. الرقم الحالي لكل قاعدة، بما فيها QA-PW-141، موجود في التدقيق.
410
-
411
- ### مستويات الثقة بالقواعد
412
-
413
- تتبع المستويات معدل الإيجابيات الكاذبة المقيس، لا الرأي:
414
-
415
- | المستوى | ‏FP المقيس | السلوك |
416
- | -------------- | ------------------------- | ------------------------------------------------------ |
417
- | **core** | ≤ 10% | التقرير الافتراضي، يمنع الدمج |
418
- | **extended** | ≤ 30% | التقرير الافتراضي، ثقة أقل |
419
- | **quarantine** | > 30% أو مُعلن عنه صراحةً | مع `--strict` فقط، محدود عند info، لا يمنع الدمج أبدًا |
420
- | _غير مقيسة_ | n < 10 | لا يمكن ترقيتها إلى core قبل قياسها |
421
-
422
- يمكن لأحزمة FP أن تخفض مستوى القاعدة فقط — لا تُرقى قاعدة من `quarantine` أبدًا إذا أُعلن عنها هناك صراحةً. تبقى القاعدة المُحجرة صراحةً في quarantine بغض النظر عن معدل الإيجابيات الكاذبة المقيس.
423
-
424
- الترقية والتخفيض والنضج حسب اللغة: [دورة حياة القواعد](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle).
425
-
426
- ### لماذا هذا ليس linter
427
-
428
- أدوات linter تخبرك إن كانت الشيفرة تتبع القواعد. Mjölnir يخبرك إن كان يمكن الوثوق بعملية التحقق لديك.
429
-
430
- | | أدوات linter ‏(ESLint، SonarQube) | أدوات التغطية | مراجعة الشيفرة بالذكاء الاصطناعي | **Mjölnir** |
431
- | ------------------------------------------------------------- | :-------------------------------: | :-----------: | :------------------------------: | :--------------: |
432
- | يقيّم **نظام التحقق**، لا شيفرة المنتج | لا | لا | لا | نعم |
433
- | سلامة ملفات workflow في CI (`continue-on-error`، `\|\| true`) | لا | لا | الفرق فقط | نعم |
434
- | يقيّم متانة locators في Playwright ‏(Selector Health) | لا | لا | لا | نعم |
435
- | يقرأ بيانات تشغيل حقيقية لأحكام `TRUE-FLAKE` | لا | لا | لا | نعم |
436
- | ينشر معدل إيجابيات كاذبة مقيسًا لكل قاعدة | لا | لا | لا | نعم |
437
- | يعلّم الاختبارات التي بلا تأكيدات | نعم\* | لا | أحيانًا | نعم |
438
- | يلتقط sleep الثابت (`waitForTimeout`، `time.sleep`) | نعم\* | لا | أحيانًا | نعم |
439
- | حتمي (المدخلات نفسها، المخرجات نفسها) | نعم | نعم | لا | نعم |
440
- | التكلفة لكل فحص | مجاني | مجاني | رموز (tokens) | **صفر** (محليًا) |
441
-
442
- <sub>\*تغطيه `eslint-plugin-jest` و`eslint-plugin-playwright` (`expect-expect`، `no-wait-for-timeout`) وقواعد التأكيد الخاصة بـ SonarQube. تصف الأعمدة السلوك الافتراضي للتحقق من مجموعات الاختبار؛ والإضافات والخطط المدفوعة والقواعد المخصصة تغيّر بعض الإجابات. هذا ملخص تموضع، وليس اختبار أداء مقارنًا.</sub>
443
-
444
- استخدم مراجعة الذكاء الاصطناعي أيضًا. فهي تلتقط الفروق الدقيقة والنية وعيوب التصميم التي لا يجدها أي نمط. ويلتقط Mjölnir ما تغفله مراجعة الذكاء الاصطناعي لأنه يبدو مقصودًا: `.only` بقي في commit، ورمز خروج مبتلع، و`continue-on-error` على job اختبار. هذه تحتاج إلى فحص، لا إلى استدلال.
445
-
446
- <br />
447
-
448
- ## تحليل تشغيلات الاختبار
449
-
450
- التحليل الساكن يستدل على شيفرة لم تعمل قط. أما تحليل التشغيلات فيقرأ ما حدث فعلًا: Playwright JSON وJest JSON وVitest JSON وJUnit XML من أي أداة تشغيل.
451
-
452
- ```bash
453
- mjolnir forensics ./test-results/
454
- ```
455
-
456
- ```text
457
- ▍ FLAKINESS LEADERBOARD
458
-
459
- 3 tests · 1 failed · 1 flaky · 1 retried
460
-
461
- TRUE-FLAKE completes checkout with saved card (e2e/checkout.spec.ts)
462
- ████████████████████ 6.0s · 2 attempts
463
- FAILING declines an expired card (e2e/checkout.spec.ts)
464
- ████░░░░░░░░░░░░░░░░ 1.1s · 1 attempt
465
- ```
466
-
467
- لا يعني `TRUE-FLAKE` أن الاختبار أُعيدت محاولته. بل يعني أن الاختبار **فشل في محاولة واحدة على الأقل ثم انتهى باللون الأخضر**: نجاح بالحظ، يُعلَّم مهما قالت علامة الصح النهائية. يحوّل `mjolnir triage` هذا السجل إلى اقتراح عزل، ويلخّص `mjolnir pw-report` التشغيل. وتقارير التشغيل نفسها هي ما يرفع النتائج إلى مستويات الثقة L3 فما فوق.
468
-
469
- <br />
470
-
471
- ## سلامة CI
472
-
473
- قد ينجح اختبار بينما خط CI المحيط به لا يستطيع أن يفشل. يقرأ Mjölnir ملفات workflow أيضًا: `continue-on-error`، و`|| true`، ورموز خروج لا تُمرَّر أبدًا، وخطوات تنجح دائمًا، وتقارير تُستهلك ولا تُنشأ، وبوابات تُتخطى في الأحداث نفسها التي يجب أن تمنع الدمج. كل نتيجة تسمّي الـ job والخطوة والسطر، وتحمل مستوى دليلها الخاص.
474
-
475
- أنشئ workflow طلبات الدمج، استشاريًا افتراضيًا:
476
-
477
- ```bash
478
- mjolnir ci install
479
- ```
480
-
481
- أو أضف الـ action من Marketplace إلى workflow لديك بالفعل:
482
-
483
- ```yaml
484
- - uses: Sergey-Bar/Mjolnir@v3
485
- with:
486
- scope: changed
487
- fail-on: error
488
- ```
489
-
490
- ثبّت `@v3` لتتبع الخط الرئيسي، أو وسمًا دقيقًا (`@v0.5.32`) لبوابة قابلة لإعادة الإنتاج. يغطي [docs/DISTRIBUTION-KIT.md](docs/DISTRIBUTION-KIT.md) كلًّا من Marketplace وSmithery وسجلات MCP.
491
-
492
- لوضع النتائج في GitHub Code Scanning، ارفع SARIF (يتطلب `security-events: write` على مستوى الـ workflow أو الـ job):
493
-
494
- ```yaml
495
- - run: npx mjolnir-qa@3.0.0 --format sarif > mjolnir.sarif
496
- continue-on-error: true
497
- - uses: github/codeql-action/upload-sarif@v3
498
- if: ${{ !cancelled() }}
499
- with:
500
- sarif_file: mjolnir.sarif
501
- ```
502
-
503
- على GitLab، يكتب `--format codequality` تقرير Code Quality الذي تقرؤه أداة طلب الدمج وتعليقات الفرق ([docs/GITLAB-CI.md](docs/GITLAB-CI.md)). إعداد المحرر وخط CI: [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md).
504
-
505
- ### إسناد النتائج إلى نطاق التغييرات
506
-
507
- ```bash
508
- npx mjolnir-qa@3.0.0 --scope changed
509
- ```
510
-
511
- تُسند النتائج إلى الأسطر التي أضافها فرعك، مقيسةً مقابل **merge-base**. النطاق هو مجموعة الملفات نفسها التي يكتشفها الفحص الكامل (ملفات spec لـ TS/JS وإعدادات المحوّلات، `test_*.py`، `*Test.java`، `*Tests.cs`، `.github/workflows/*.yml`)، إضافة إلى التغييرات غير المُثبتة وغير المتتبَّعة، لذا يعمل قبل أن تُجري commit. يُحدَّد الأساس بالترتيب `main → master → origin/main → origin/master → origin/HEAD`؛ ويمكنك تجاوزه بـ `--base <ref>`.
512
-
513
- عندما يتعذر تحديد merge-base (نسخة ضحلة، أو HEAD منفصل، أو هدف خارج git)، تعود النتائج إلى الإسناد إلى الملف كاملًا **ويقول التقرير ذلك.** فالتراجع الصامت سيكون تمامًا نوع العيب الذي وُجدت هذه الأداة لالتقاطه.
514
-
515
- <br />
516
-
517
- ## وكلاء الذكاء الاصطناعي
518
-
519
- لا قيمة للنتائج إلا إذا تصرّف شيء بناءً عليها.
520
-
521
- ```text
522
- SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
523
- ```
524
-
525
- **الذكاء الاصطناعي يكتب الإصلاح. Mjölnir يتحقق منه.** يأتي الدليل من إعادة الفحص، لا من تقرير الوكيل نفسه عن نجاحه.
526
-
527
- | الأمر | ما الذي يحصل عليه الوكيل |
528
- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
529
- | `mjolnir mcp` | خادم [MCP](https://modelcontextprotocol.io) عبر stdio. تصبح `scan` و`explain` و`diff` أدوات قابلة للاستدعاء. |
530
- | `mjolnir handoff` | يتحول تقرير `--json` محفوظ إلى خطة Markdown حتمية: ما الذي اكتُشف، وحدّ الدليل لكل نتيجة، وما الذي يجب **ألا** يتغير، وكيف يُتحقق. |
531
- | `mjolnir install` | يكتب في أماكن الوكلاء الموجودة أصلًا في مستودعك (`.claude/`، `.cursor/`، `.kilo/`، `AGENTS.md`) حتى يعيد الوكيل الفحص قبل أن يدّعي أنه انتهى. |
532
-
533
- أضفه إلى عميل يأتي مع CLI خاص به:
534
-
535
- ```bash
536
- claude mcp add mjolnir -- npx -y mjolnir-qa@3.0.0 mcp
537
- ```
538
-
539
- أو إلى أي عميل يقبل كتلة `mcpServers`:
540
-
541
- ```json
542
- {
543
- "mcpServers": {
544
- "mjolnir": { "command": "npx", "args": ["-y", "mjolnir-qa@3.0.0", "mcp"] }
545
- }
546
- }
547
- ```
548
-
549
- **الحاجز الواقي أهم من الراحة.** كل نتيجة في التسليم تحمل حدّها. يقول **E2** _حتمي: تحقق من الموضع وطبّق الإصلاح_. ويقول **E1** _يتطلب تأكيدًا: الملاحظة وحدها لا تثبت العيب_. الوكيل الذي يصلح E1 دون تمحيص، أو يكتم قاعدة، أو يعدّل قاعدة لرفع الدرجة، يفعل تمامًا ما وُجدت هذه الأداة لالتقاطه، ولذلك يقول التسليم ذلك في الموجِّه، بجوار النتيجة.
550
-
551
- <br />
552
-
553
- ## الثقة والأمان
554
-
555
- **محلي أولًا، بلا أي قياس عن بُعد.** لا توجد أي واجهة برمجية قادرة على الاتصال بالشبكة (`fetch`، `http`، `https`، `net`، `dns`، `dgram`، WebSocket) في أي مكان داخل `src/`، ويُفشل [`privacy-network-isolation.spec.ts`](tests/contract/privacy-network-isolation.spec.ts) عملية البناء إذا ظهرت واحدة. ويحظر أيضًا `eval` و`new Function`. فحص شيفرة غير موثوقة لا ينفّذها أبدًا: التحليل الساكن يقرأ النص المصدري، وتحليل التشغيلات يحلّل ملفات تقارير موجودة أصلًا على القرص.
556
-
557
- تحفظان: `npx` نفسه يجلب الحزمة قبل أن يعمل أي شيء، والضمان يغطي `src/` وليس إضافات الأطراف الثالثة.
558
-
559
- **الإضافات لا تعمل في بيئة معزولة.** إضافات JS (`mjolnir-rules/*.mjs`، أو حزم npm المدرجة تحت `"plugins"`) تعمل بصلاحيات Node كاملة، بنموذج الثقة نفسه الخاص بإضافات ESLint أو Vitest. تحميلها اختيار صريح **لكل فحص**: من دون `--enable-plugins` (أو `MJOLNIR_ENABLE_PLUGINS=1`) لا تُحمَّل مصادرها أبدًا، ويسرد إشعار على stderr ما جرى تخطيه. ملفات تعريف القواعد بصيغة JSON لا تنفّذ أي شيفرة، وبادئات معرّفات قواعد core محجوزة حتى لا تنتحل إضافةٌ صفة إحداها. أبلغ عن الثغرات عبر [SECURITY.md](SECURITY.md).
560
-
561
- **يعمل على نفسه.** لا مصداقية لمحرك ثقة في التحقق ما لم يكن هو نفسه قابلًا للتحقق. كل تشغيل لـ CI يفحص هذا المستودع بالبناء الذي أنتجه التشغيل نفسه. تفشل البوابة عند أي نتيجة بخطورة error، وكذلك عند فحص **جزئي** أو **قاعدة انهارت**، لأن فحصًا ذاتيًا مبتورًا لا يبلّغ عن شيء هو بالضبط الأخضر الزائف الذي وُجد هذا المشروع لالتقاطه. يعيد `mjolnir doctor` تدقيق قاعدة القواعد في التشغيل نفسه (جدار حماية الـ fixtures، وصدق المستويات، وسقف مستوى core)، والفحص الذي نتيجته INCONCLUSIVE يفشل تمامًا كالفحص الفاشل. ويُرفع التقريران كنواتج بناء.
562
-
563
- ### رموز الخروج وعقد الآلة
564
-
565
- مجمّدة، حتى تتمكن من بناء منطق CI عليها:
566
-
567
- | رمز الخروج | المعنى |
568
- | ---------- | --------------------------------------------------------------------- |
569
- | `0` | نظيف: لا نتائج عند مستوى البوابة أو فوقه |
570
- | `1` | نتائج عند مستوى البوابة أو فوقه |
571
- | `2` | فحص جزئي (نفدت ميزانية الوقت، ملفات غير مقروءة). لا يمنع الدمج أبدًا. |
572
- | `10` | خطأ في الاستخدام (خيار غير صالح، هدف مفقود) |
573
- | `20` | خطأ داخلي |
574
-
575
- ‏`2` مختلف عن `0` عمدًا: الفحص الذي لم يكتمل لم "يجد لا شيء". هو ببساطة لم ينتهِ من البحث.
576
-
577
- كل ما تستهلكه الآلة (نتائج أدوات MCP، و`--json`، وSARIF 2.1) يأتي من نتيجة معيارية واحدة وفق مخطط ذي إصدارات **لا يتوسع إلا بالإضافة** (`schemaVersion: 1`، `contractVersion: 1`)، فلا يضطر أي مستهلك إلى إعادة بناء المعنى من نص معروض. انظر [عقد الآلة](docs/machine-contract.md). معرّفات القواعد (`QA-<FAMILY>-NNN`) لا تتغير بعد إطلاقها ولا يُعاد استخدامها أبدًا.
578
-
579
- <br />
580
-
581
- ## ما لا يستطيع Mjölnir أن يخبرك به
582
-
583
- - **لا يشغّل اختباراتك.** الفحص النظيف ليس مجموعة اختبارات ناجحة.
584
- - **لا يستطيع أن يخبرك بأن تأكيدًا ما _خاطئ_.** يبدو `expect(total).toBe(41)` سليمًا. يجد Mjölnir اختبارات _لا يمكن أن تفشل_ وخطوط CI _لا يمكن أن تتحول إلى الأحمر_، لا الاختبارات التي تتحقق من الشيء الخطأ.
585
- - **لا يثبت صحة منطق العمل.** لا شيء هنا يقول إن منتجك يفعل ما طلبته المتطلبات.
586
- - **الـ 100 ليست دليلًا على مجموعة اختبارات جيدة.** أما إن كانت مجموعتك تغطي مخاطرك الحقيقية فذلك سؤال مختلف، وهذه الأداة لا تجيب عنه.
587
- - **5 من أصل 79 قاعدة تُطلق بناءً على تقدير**، لا على معدل مقيس. وكل واحدة منها تقول ذلك في نتيجتها.
588
- - **E1 ليس E2.** النتائج الاستدلالية تستحق القراءة، لا التطبيق دون تمحيص.
589
- - **المستودع الفارغ يحصل على `null`، لا على 100 أبدًا.**
590
- - **الملف المسمى `*.spec.ts` الذي لا يحتوي تعريفات اختبارات لا يُحتسب تغطية.** المستودع الذي لا تحتوي ملفات spec الوحيدة فيه إلا على imports أو أنواع (صفر استدعاءات `it`/`test`) يحصل على `null`، لا على 100.
591
-
592
- <br />
593
-
594
- ## التوثيق
595
-
596
- موقع التوثيق الكامل متاح على <https://sergey-bar.github.io/Mjolnir/>.
597
-
598
- | المستند | ما الذي يحتويه |
599
- | ------------------------------------------------------ | ------------------------------------------------------ |
600
- | [docs/SCORING.md](docs/SCORING.md) | تطبيع الدرجة وترجيح الأدلة |
601
- | [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md) | المفردات المعيارية: كلمة واحدة لكل مفهوم |
602
- | [docs/FP-AUDIT.md](docs/FP-AUDIT.md) | معدلات الإيجابيات الكاذبة المقيسة والمنهجية |
603
- | [docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md) | حالات القواعد، والمستويات، والكتم، والإيقاف |
604
- | [docs/VERSIONING.md](docs/VERSIONING.md) | سياسة semver، والواجهات المجمّدة، ودورة الإيقاف |
605
- | [docs/machine-contract.md](docs/machine-contract.md) | النتيجة المعيارية القابلة للقراءة آليًا |
606
- | [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md) | مخرجات SARIF وإعداد المحرر أو CI |
607
- | [docs/GITLAB-CI.md](docs/GITLAB-CI.md) | ‏GitLab: تقرير Code Quality، ووصفة طلب الدمج، والبوابة |
608
- | [docs/rules/](docs/rules/) | فهرس مولَّد لكل قاعدة |
609
- | [CONTRIBUTING.md](CONTRIBUTING.md) | إعداد بيئة التطوير وسير عمل المساهمة |
610
- | [SUPPORT.md](SUPPORT.md) | أين تسأل وتبلّغ وتحصل على المساعدة |
611
- | [SECURITY.md](SECURITY.md) | الإبلاغ عن الثغرات |
612
- | [CHANGELOG.md](CHANGELOG.md) | سجل الإصدارات |
613
-
614
- ### الحالة
615
-
616
- **الإصدار 1.** مخطط JSON ورموز الخروج عقود مجمّدة. تمتلك TypeScript وPython أوسع تغطية مقيسة. أما Java وC# فأحدث؛ اقرأهما من خلال [جدول النضج](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle). ما الذي سيأتي لاحقًا، دون تواريخ مختلقة: [خارطة الطريق العامة](https://sergey-bar.github.io/Mjolnir/reference/roadmap).
617
-
618
- ### المساهمة
619
-
620
- القواعد الجديدة هي أسهل مساهمة أولى. أمر واحد ينشئ هيكل القاعدة مع ملفات fixtures من نوع must-fire **و**must-not-fire. تفشل القاعدة المولَّدة في ملفات fixtures الخاصة بها عمدًا إلى أن يُكتب اكتشاف حقيقي، لأن الهيكل الفارغ الذي يُطلق هو قاعدة لم يقسها أحد:
621
-
622
- ```bash
623
- mjolnir create-rule QA-PW-140 --title "Screenshot without diff bound"
624
- ```
625
-
626
- إعداد بيئة التطوير، وأوامر البوابات الدائمة، وقانونا anti-creep وجدار حماية الـ fixtures موجودة في [CONTRIBUTING.md](CONTRIBUTING.md).
627
-
628
- <br />
629
-
630
- <div align="center">
631
-
632
- <img src="assets/readme/closing.svg" alt="شغّله على مستودعك." width="100%" />
633
-
634
- ```bash
635
- npx mjolnir-qa@3.0.0
636
- ```
637
-
638
- [اقرأ الدليل](https://sergey-bar.github.io/Mjolnir/guide/getting-started) · [موقع التوثيق](https://sergey-bar.github.io/Mjolnir/) · [npm](https://www.npmjs.com/package/mjolnir-qa)
639
-
640
- <br />
641
-
642
- لا تسأل إن كانت الاختبارات قد نجحت.<br />
643
- اسأل إن كانت الأدلة تثبت أنها تستحق الثقة.
644
-
645
- <sub>من تطوير [Sergey Bar](https://www.linkedin.com/in/sergeybar/) · برخصة MIT</sub>
646
-
647
- </div>