mjolnir-qa 1.0.9 → 2.0.2

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.tr.md CHANGED
@@ -1,395 +1,431 @@
1
1
  <div align="center">
2
2
 
3
- <img src="assets/readme/logo.png" alt="Mjölnir — Verification Trust Engine" width="800" />
3
+ <img src="assets/readme/hero.svg" alt="Mjölnir. Testler neyin geçtiğini söyler. Mjölnir neye güvenebileceğinizi söyler." width="100%" />
4
4
 
5
- ### Testlerin sana yalan söylüyor. Biz kanıtlıyoruz.
5
+ <br />
6
6
 
7
- **QA için Verification Trust Engine.** Mjölnir test takımlarını ve CI
8
- boru hatlarını denetler, güvenilirlik puanı bildirir ve güvenin tam
9
- olarak nerede kırıldığını gösterir.
7
+ Mjölnir başarısız olamayan testleri ve kırmızıya dönemeyen pipeline'ları bulur,<br />
8
+ ardından sonuca ne kadar güvenilebileceğini, her puanın kanıtıyla birlikte puanlar.
10
9
 
11
- [![npm](https://img.shields.io/npm/v/mjolnir-qa.svg?style=flat-square&color=C19A34&labelColor=0A1119)](https://www.npmjs.com/package/mjolnir-qa)
12
- [![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)
13
- [![license](https://img.shields.io/badge/license-MIT-C19A34.svg?style=flat-square&labelColor=0A1119)](LICENSE)
14
- [![node](https://img.shields.io/badge/node-%E2%89%A5%2022.18-37ABBD.svg?style=flat-square&labelColor=0A1119)](https://nodejs.org)
15
-
16
- [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.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
10
+ <br />
17
11
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-08.
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
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
22
22
  ```
23
23
 
24
- **Testleriniz güvenilmeye değer mi?**
24
+ [Çalışırken görün](#çalışırken-görün) · [Hızlı başlangıç](#hızlı-başlangıç) · [Neler bulur](#mjölnir-neler-bulur) · [Puan](#güvenilirlik-puanı) · [Kanıt](#kanıt-modeli) · [Çalıştırma analizi](#test-çalıştırma-analizi) · [CI](#ci-bütünlüğü) · [Ajanlar](#yapay-zekâ-ajanları) · [Güvenlik](#güven-ve-güvenlik) · [Sınırlar](#mjölnirin-size-söyleyemedikleri) · [Belgeler](#belgeler)
25
+
26
+ <details>
27
+ <summary>Başka bir dilde okuyun — 22 çeviri</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.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
25
30
 
26
- [Nasıl çalıştığını gör](#-nasıl-çalıştığını-gör) ·
27
- [Hızlı başlangıç](#-hızlı-başlangıç) ·
28
- [Neleri kontrol eder](#-mjölnir-neleri-kontrol-eder) ·
29
- [Puanlama](#puanlama-nasıl-çalışır) ·
30
- [CI](#-ci-entegrasyonu) · [Yapılandırma](#yapılandırma) ·
31
- [Belgelendirme](#-belgelendirme)
31
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-15.
32
+
33
+ <!-- Source hash: 3541b09e8d04 -->
34
+
35
+ </details>
32
36
 
33
37
  </div>
34
38
 
35
- ---
39
+ <br />
40
+
41
+ ## Yeşil onay işareti bir iddiadır, kanıt değil
42
+
43
+ Yeşil onay işareti pipeline'ın başarısız olmadığı anlamına gelir. Testlerin çalıştığı ya da başarısız olabilecekleri anlamına gelmez. Bunların her biri yeşil geçer:
44
+
45
+ - 900 yerine 3 test çalıştıran, commit edilmiş bir `.only`
46
+ - engellemesi gereken job üzerinde `continue-on-error: true`
47
+ - test komutundan sonra `|| true`
48
+ - hiçbir şeyi doğrulamayan ya da gövdesi boş olan bir test
49
+ - gerçek bir başarısızlığı şanslı bir geçişe çeviren bir retry sarmalayıcısı
50
+ - workflow'un yüklediği ama hiç üretmediği bir rapor
51
+ - bir yarış durumunu ayakta tutan sabit bir sleep
52
+
53
+ Hiçbiri pipeline'ı kırmızıya çevirmez ve her biri incelemede kasıtlı görünür. Bu yüzden hayatta kalırlar. İşte Mjölnir'in gerçek bir örneği okuması:
54
+
55
+ <p align="center">
56
+ <img src="assets/readme/scan.svg" alt="Demo deposunun CI workflow'u, satır satır okunmuş hâli. Mjölnir her bulguyu raporladığı satırda işaretler; kuralını, neyin yanlış olduğunu, kanıt düzeyini ve ölçülmüş yanlış pozitif oranını gösterir." width="800" />
57
+ </p>
58
+
59
+ <sub>Demo taramasının bu workflow için raporladığı her bulgu, raporlandığı satırda. `npm run docs:readme-brand` ile [`demo-report.json`](assets/readme/demo-report.json) kaynağından üretilir ve CI'da sapmaya karşı kilitlenir.</sub>
60
+
61
+ **Katı mod.** En agresif tespitler — `.only`, `continue-on-error`, boş testler, tekrar kötüye kullanımı — karantina katında yaşar. Yalnızca `--strict` altında çalışır ve `info` şiddetindedir: işaretlerler, asla engellemezler. Varsayılan tarama (`--strict` olmayan `npx mjolnir-qa@latest`) yalnızca çekirdek ve genişletilmiş kuralları kapsar. Danışmanlık katmanını da istediğinizde `--strict` ekleyin.
62
+
63
+ Mjölnir test paketini, CI workflow'larını ve varsa gerçek bir çalıştırmanın raporunu okur. Testlerinizi çalıştırmaz, bağımlılıklarınızı kurmaz ve taradığı kodu yürütmez. Kanıtı olmadığında da güven uydurmak yerine bunu açıkça söyler:
64
+
65
+ | Durum | Mjölnir'in raporladığı |
66
+ | ---------------------------------------------------------- | ----------------------------------------------------------------------- |
67
+ | Test bildirimi bulunamadı | Puan `null`, **UNKNOWN** olarak gösterilir. Asla uydurma bir 100 değil. |
68
+ | Baseline ya da karşılaştırılabilir revizyon yok | **UNKNOWN**, nedeni belirtilerek. Asla varsayılmış bir 0 değil. |
69
+ | Tarama yarıda kesildi (zaman bütçesi, okunamayan dosyalar) | **PARTIAL**, çıkış `2`. Asla temiz olarak sunulmaz. |
70
+
71
+ <p align="center">
72
+ <img src="assets/readme/how-it-works.svg" alt="Mjölnir nasıl çalışır. Test paketini ve CI pipeline'ını statik olarak, varsa gerçek bir çalıştırmanın raporunu da okur. Her bulguyu kanıt düzeyine ve güven düzeyine göre ağırlıklandırır; L3 ile L5 arasına yalnızca gerçek bir çalıştırma ulaşabilir. Sonuç olarak bulgular, bir güvenilirlik puanı ve donmuş çıkış kodlarıyla bir CI kapısı üretir. Ajan döngüsünde yapay zekâ düzeltmeyi yazar, Mjölnir de kanıtlamak için yeniden tarar." width="880" />
73
+ </p>
74
+
75
+ <sub>Bu sayfa için tasarlandı ve 1:1 gösteriliyor. `npm run docs:readme-brand` ile üretilir ve CI'da sapmaya karşı kilitlenir; puan, sayılar ve kural kimliği [`script.demo.json`](assets/video/script.demo.json), [`demo-report.json`](assets/readme/demo-report.json) ve kural kaydından gelir, asla elle yazılmaz. Aynı görselin poster hâli: [`architecture.svg`](assets/readme/architecture.svg).</sub>
76
+
77
+ <br />
78
+
79
+ ## Çalışırken görün
80
+
81
+ CI workflow'u olan küçük bir Playwright paketi olan [`examples/demo-repo`](examples/demo-repo) üzerinde gerçek bir tarama. Puanlarının nereye gittiği burada:
82
+
83
+ <p align="center">
84
+ <img src="assets/readme/terminal-hero.svg" alt="Mjölnir'in kesinti dökümü: WORTHINESS 80/100 WORTHY, kategoriye göre puan, önem derecesine göre kesinti kutusu ve bir FIX THIS FIRST listesi" width="520" />
85
+ </p>
86
+
87
+ <sub>`npm run docs:hero` ile gerçek bir taramadan üretilir ve CI'da sapmaya karşı kilitlenir. Aynı taramanın tam `--verbose` raporu [`demo.svg`](assets/readme/demo.svg) dosyasıdır (`npm run docs:demo`).</sub>
88
+
89
+ <details>
90
+ <summary><strong>İzleyin</strong> — bir tarama, yazdırdığı düzeltme ve bunu kanıtlayan yeniden tarama</summary>
36
91
 
37
- ## 🎬 Nasıl çalıştığını gör
92
+ <br />
38
93
 
39
94
  <p align="center">
40
- <img src="assets/readme/demo.svg" alt="Mjölnir'in demo bir repo üzerindeki eksiksiz --verbose raporu: WORTHINESS 75/100 NEEDS WORK, kategori bazında teşhis dökümü, FIX THIS FIRST listesi ve her bulgu için kural kimliği ile satır numarası — CI, Playwright, test hijyeni ve Python kuralları boyunca" width="900" />
95
+ <a href="assets/video/mjolnir-demo.mp4">
96
+ <img src="assets/video/mjolnir-demo-poster.png" alt="Demo kaydından bir kare: npx mjolnir-qa@latest bir terminal penceresinde demo deposunu tarıyor" width="900" />
97
+ </a>
41
98
  </p>
42
99
 
43
- <sub>`npx mjolnir-qa ./examples/demo-repo --verbose` çıktısının tam hali,
44
- gerçek reporterdan render edildi — hiçbir şey kırpılmadı.
45
- `npm run docs:demo` ile yeniden üretilir;
46
- [`tests/demo-asset-reproducibility.spec.ts`](tests/demo-asset-reproducibility.spec.ts)
47
- dosyası, çıktı aracın bastığından saptarsa CI'ı düşürür.</sub>
100
+ <sub>`npm run docs:video` ile gerçek bir taramadan kare kare işlendi; asla ekran kaydı alınmadı. [`mjolnir-demo.mp4`](assets/video/mjolnir-demo.mp4) dosyasını açmak için kareyi seçin.</sub>
48
101
 
49
- **Az önce olanlar:**
102
+ </details>
50
103
 
51
- 1. Mjölnir, Playwright spesifikasyonlarını, kendi yapılandırmasını, CI
52
- workflow'unu ve bir Python test dosyasını keşfetti — dört
53
- dil/format, tek geçiş.
54
- 2. Takımın güvenini zayıflatan kanıtlar buldu — bir işi maskeden
55
- geçiren `continue-on-error`, bir exit kodunu yutan `|| true`, katı
56
- sleep'ler, kırılgan bir seçici, sabitlenmiş staging URL'leri, bir
57
- `networkidle` beklemesi.
58
- 3. Her birini kural kimliği, konum ve düzeltme içeren somut bir bulguya
59
- — ve bir PR'ı gate'leyebileceğin tek bir puana dönüştürdü.
104
+ ### Tek bir bulguya yakından bakış
60
105
 
61
- ### Yakın plandan bir bulgu
106
+ Her bulgu dört soruyu yanıtlar: nerede olduğu, Mjölnir'in ne kadar emin olduğu, kuralın ne sıklıkla yanıldığı ve nasıl düzeltileceği.
62
107
 
63
- Yukarıdaki ilk bulgu için `mjolnir explain QA-CI-001` komutunu çalıştırın,
64
- elde edeceğiniz:
108
+ <p align="center">
109
+ <img src="assets/readme/finding-anatomy.svg" alt="Demo taramasının ilk bulgusu, terminalin yazdırdığı hâliyle birebir, dört bölümü işaretlenmiş olarak: nerede, ne kadar emin, kural ne sıklıkla yanılıyor ve düzeltme." width="100%" />
110
+ </p>
111
+
112
+ `mjolnir explain QA-CI-001` bir kuralın tüm güven kaydını yazdırır; ölçülmüş yanlış pozitif oranı ve bu oranın ona kazandırdığı düzey de dahil:
65
113
 
66
114
  ```text
67
- ▚ QA-CI-001 — continue-on-error masks a failing verification gate
115
+ ▍ QA-CI-001 — continue-on-error masks a failing verification gate
68
116
 
69
117
  Severity: error
70
118
  Confidence: high
119
+ Tier: quarantine
71
120
  Evidence: E2
72
- Measured FP: not yet measured — this rule ships on assumption (see docs/FP-AUDIT.md)
121
+ QA impact: False-green risk (FALSE-GREEN)
122
+ Measured FP: 11% (19 hand-classified corpus verdicts)
123
+ FP risk: low (author estimate)
124
+ Languages: yaml
125
+ Frameworks: github-actions, azure-pipelines
73
126
 
74
127
  WHAT WAS FOUND (real detector output, not a mockup)
75
128
  Job `security-scan` runs a verification gate under `continue-on-error: true`.
76
129
 
77
130
  WHY IT MATTERS
78
- This job can fail every day and CI will still show green. The checkmark
79
- on this workflow cannot be trusted.
131
+ This job can fail every day and CI will still show green. The checkmark on
132
+ this workflow cannot be trusted.
80
133
 
81
134
  HOW TO FIX
82
135
  Remove continue-on-error, or scope it to individual non-blocking steps only.
83
- ```
84
136
 
85
- İşte değer birimi: stil özürü değil, CI'ınızın bir şeyin geçtiğini
86
- söylediği — oysa geçmediği — bir yer.
137
+ Example from this rule's own must-fire fixture: QA-CI-001/must-fire/masked.yml
87
138
 
88
- ---
139
+ WHAT WOULD CHANGE THE VERDICT
140
+ - a run report next to the scan target (mjolnir.report.json or test-results/)
141
+ corroborating this file lifts its findings to L3–L5
142
+ - a documented suppression (mjolnir.config.json) lowers the finding count
143
+ without claiming correctness
144
+ - quarantine findings run only under --strict and are advisory (E0) — they can
145
+ never gate CI
89
146
 
90
- ## ⚡ Hızlı başlangıç
147
+ NEXT ACTION
148
+ Fix the first occurrence, then re-run: `mjolnir --scope changed`. Every
149
+ occurrence of this rule is listed in the scan output.
91
150
 
92
- Tam rapor ve güvenilirlik puanı için bir repoda çalıştırın:
151
+ HOW TO VERIFY THE FIX
152
+ Re-run `mjolnir` on the changed file(s) — this finding should no longer
153
+ appear. `mjolnir --scope changed` scopes the check to just what you touched.
93
154
 
94
- ```bash
95
- npx mjolnir-qa@latest
155
+ Docs: mjolnir rules --md (full catalog, this rule included)
96
156
  ```
97
157
 
98
- **CI'da ürün tek komuttur.** Yalnızca branch'in dokunduğu şeyi tarar ve
99
- yeni sorunlarda sıfır olmayan kodla çıkar:
158
+ Değer birimi budur: CI'ın hak etmediği bir geçişi raporladığı tek bir yer.
159
+
160
+ <br />
161
+
162
+ ## Hızlı başlangıç
100
163
 
101
164
  ```bash
102
- npx mjolnir-qa@latest --scope changed
165
+ npx mjolnir-qa@latest
103
166
  ```
104
167
 
105
- Bunu bir PR kontrolüne koyun — `mjolnir ci install` workflow'u yazar —
106
- ve bitti. Gerisi opsiyoneldir.
107
-
108
- | Komut | Ne yapar |
109
- | ----------------------------------- | ------------------------------------------------------------------- |
110
- | `mjolnir` | Tüm repo taraması + güvenilirlik puanı |
111
- | `mjolnir --scope changed` | Yalnızca branch'inin getirdikleri — CI biçimi |
112
- | `mjolnir ci install` | Danışmanlık PR workflow'unu üretir |
113
- | `mjolnir explain QA-CI-001` | Ne / neden / düzeltme + bir kural için ölçülmüş FP oranı |
114
- | `mjolnir rules --unmeasured` | Ölçümle değil varsayımla çalışan kurallar |
115
- | `mjolnir --json` / `--format sarif` | Makine okunur / GitHub Code Scanning |
116
- | `mjolnir --strict` | Quarantine katmanı kurallarını da çalıştırır (daha yüksek FP riski) |
168
+ Geçerli dizini tarar ve Trust Report'u yazdırır: ne bulduğunu, ne kadar güvenebileceğinizi, nedenini ve sırada ne yapmanız gerektiğini. Kapı düzeyinde ya da üstünde hiçbir şey bulunmazsa `0` ile çıkar.
117
169
 
118
- <details>
119
- <summary><strong>Bir şey flaky olduğunda</strong></summary>
170
+ CI'da yalnızca dalın getirdiklerini tarayın; böylece eski bir test paketi ilk pull request'inizi boğmaz:
120
171
 
121
- | Komut | Ne yapar |
122
- | ----------------------------------- | --------------------------------------------------------------- |
123
- | `mjolnir forensics ./test-results/` | Gerçek çalıştırma verileri → `TRUE-FLAKE` hükümleri, `FLAKY.md` |
124
- | `mjolnir triage ./test-results/` | Yürütme geçmişinden karantina önerisi |
125
- | `mjolnir pw-report ./test-results/` | Playwright çalıştırma özeti — retry / flake / en yavaşlar |
126
- | `mjolnir doctor:playwright` | Yalnızca Playwright derin tarama + Selector Health Score |
172
+ ```bash
173
+ npx mjolnir-qa@latest --scope changed
174
+ ```
127
175
 
128
- </details>
176
+ `mjolnir ci install` bunu, ana `v1` etiketine sabitlenmiş [action](https://github.com/Sergey-Bar/Mjolnir#readme) ile bir GitHub Actions workflow'u olarak yazar (ya da `--no-action` ile düz `npx`). Siz engellemesi gerektiğine karar verene kadar tavsiye niteliğinde kalır.
177
+
178
+ | Komut | Ne yapar |
179
+ | ----------------------------------- | --------------------------------------------------------------------- |
180
+ | `mjolnir` | Trust Report: karar, güven düzeyi, sonraki adım |
181
+ | `mjolnir --scope changed` | Yalnızca dalınızın getirdikleri (CI biçimi) |
182
+ | `mjolnir ci install` | Tavsiye niteliğindeki PR workflow'unu üretir (action tabanlı) |
183
+ | `mjolnir explain QA-CI-001` | Ne, neden ve düzeltme; ayrıca ölçülmüş FP oranı |
184
+ | `mjolnir why src/a.spec.ts:42` | Tam olarak bu satırın neden işaretlendiği. Asla engellemez. |
185
+ | `mjolnir forensics ./test-results/` | Gerçek bir çalıştırmadan çalışma zamanı kanıtı |
186
+ | `mjolnir trust-report` | Kendi içinde bütün Trust Artifact (md + json) |
187
+ | `mjolnir handoff` | Kodlama ajanı için iyileştirme planı |
188
+ | `mjolnir --json` / `--format sarif` | Makine tarafından okunabilir çıktı, GitHub Code Scanning |
189
+ | `mjolnir --format codequality` | GitLab Code Quality raporu (MR widget'ı artefaktı) |
190
+ | `mjolnir --strict` | quarantine düzeyindeki kuralları da çalıştırır (daha yüksek FP riski) |
129
191
 
130
192
  <details>
131
- <summary><strong>Nadiren / raporlar</strong></summary>
132
-
133
- | Komut | Ne yapar |
134
- | ------------------------------- | ---------------------------------------------------------------- |
135
- | `mjolnir fix --dry-run` / `fix` | Kanıtlı, güvenli otomatik düzeltmeler |
136
- | `mjolnir baseline` / `diff` | Bulguların anlık görüntüsü, sonra yalnızca yeni/kötüleşen raporu |
137
- | `mjolnir impact --since <ref>` | Önceki bir commit'ten bu yana ne değişti |
138
- | `mjolnir debt` | Maliyet modeliyle test borcu defteri |
139
- | `mjolnir handover` | Yeni QA için takım devralma haritası |
140
- | `mjolnir stats` | Görülen düzeltmelerin yerel, tüm-zaman sayaçları |
141
- | `mjolnir badge` | shields.io endpoint JSON'u + snippet |
142
- | `mjolnir rules --md` | Tam kural kataloğu (JSON veya Markdown) |
143
- | `mjolnir doctor` | Mjölnir'in kendi kural tabanının iç denetimi |
144
- | `mjolnir create-rule <ID>` | Yeni kural + fixture iskeleti |
145
- | `mjolnir --format mermaid` | PR yorumu için test mimarisi diyagramı |
193
+ <summary><strong>Diğer tüm komutlar</strong> — kararsız test triyajı, raporlama, yönetişim</summary>
194
+
195
+ <br />
196
+
197
+ | Komut | Ne yapar |
198
+ | ----------------------------------- | ----------------------------------------------------------------------------------- |
199
+ | `mjolnir --classic` | Trust Report öncesi puan başlığı görünümü |
200
+ | `mjolnir explain verdict` | Kaydedilmiş taramanın kararının neden öyle olduğu |
201
+ | `mjolnir triage ./test-results/` | Rehberli triyaj. Her satır bir sonraki adımla biter. |
202
+ | `mjolnir pw-report ./test-results/` | Playwright çalıştırma özeti: yeniden denemeler, kararsız testler, en yavaşlar |
203
+ | `mjolnir doctor:playwright` | Yalnızca Playwright için derin tarama ve Selector Health Score |
204
+ | `mjolnir fix --dry-run` / `fix` | Güvenli otomatik düzeltmeler; her biri tuttuğunu kanıtlamak için yeniden taranır |
205
+ | `mjolnir baseline` / `diff` | Bulguların anlık görüntüsünü alır, sonra yalnızca yeni ya da kötüleşenleri raporlar |
206
+ | `mjolnir impact --since <ref>` | Bir commit'in getirdikleri ve çözdükleri |
207
+ | `mjolnir summary` | Bir rapordan CI açıklamaları ve step özeti |
208
+ | `mjolnir pr-comment` | Kapsamı sınırlı bir PR yorumu, Markdown olarak |
209
+ | `mjolnir debt` | Maliyet modelli test borcu kaydı |
210
+ | `mjolnir handover` | Yeni bir QA mühendisi için paketin tanıtım haritası |
211
+ | `mjolnir init` | Framework'leri algılar, bir kurulum kontrol listesi yazdırır |
212
+ | `mjolnir suppressions` | Bastırılmış bulguları listeler, yönetişim için |
213
+ | `mjolnir rules --unmeasured` | Ölçüme değil varsayıma dayanarak çalışan kurallar |
214
+ | `mjolnir rules --md` | Tam kural kataloğu (JSON veya Markdown) |
215
+ | `mjolnir doctor` | Mjölnir'in kendi kural tabanının öz denetimi |
216
+ | `mjolnir create-rule <ID>` | Yeni bir kural ve fixture'ları için iskelet oluşturur |
217
+ | `mjolnir stats` | Görülen düzeltmelerin yerel, tüm zamanlar sayaçları |
218
+ | `mjolnir badge` | shields.io uç noktası JSON'u ve kod parçası |
219
+ | `mjolnir --cache` | Yerel bir karar önbelleğiyle artımlı yeniden taramalar |
220
+ | `mjolnir --format mermaid` | PR yorumu için test mimarisi diyagramı |
221
+
222
+ `mjolnir help <command>` her biri için kullanım, örnekler ve sonraki adımı yazdırır.
146
223
 
147
224
  </details>
148
225
 
149
- Tercih ediyorsanız `npx` yerine global kurun: `npm i -g mjolnir-qa`.
150
- Node.js ≥ 22.18 gerekir. Windows, macOS ve Linux'ta çalışır.
151
-
152
- ---
226
+ Windows, macOS veya Linux üzerinde **Node.js ≥ 22.18** gerektirir. Global kurulumu mu tercih edersiniz? `npm i -g mjolnir-qa`. Bu alt sınır derleme araç zincirinden gelir (tsdown onu hedefler ve sürüm pipeline'ı ona karşı duman testi yapar); çalışma zamanı bağımlılıkları bundan fazlasını gerektirmez.
153
227
 
154
- ## 👥 Kimin için?
228
+ <br />
155
229
 
156
- - **QA / SDET** — e2e veya entegrasyon takımına sahip, takımın ürettiği
157
- yeşil onayın gerçekten hak edildiğine dair kanıt gerektiren kişiler.
158
- - **Platform / DevEx ekipleri** — CI bütünlüğünden ve release
159
- kapılarından sorumlu; bir `continue-on-error`'ın kırmızı hattı sessizce
160
- yeşile boyamasını istemeyenler.
161
- - **OSS bakıcıları** — yerel ve CI'da, sıfır ağ çağrısıyla çalışan ucuz,
162
- her zaman açık bir doğrulama kapısı isteyenler.
163
-
164
- ---
165
-
166
- ## 🔨 Mjölnir neleri kontrol eder
167
-
168
- | | |
169
- | --- | ------------------------------------------------------------------------------------------------------------------------------- |
170
- | ⚖️ | **Güvenilirlik puanı** — tek sayı, şeffaf kesinti tablosu, kara kutu yok |
171
- | 🎭 | **Selector Health Score** — yalnızca geçiş oranınızı değil, Playwright locator'larınızı not eder |
172
- | 🔬 | **Çalışma zamanı adli analizi** — gerçek Playwright/JUnit verilerini okur ve `TRUE-FLAKE` yakalar, yalnızca statik tahmin değil |
173
- | 🚨 | **CI bütünlüğü kuralları** — `continue-on-error`, `\|\| true` ve diğer yanlış-yeşil hilelerini yakalar |
174
- | 🐍 | **Dört Playwright bağlamasının hepsi** — TypeScript, Python, Java, C#/.NET — artı pytest, JUnit/TestNG ve CI workflow'ları |
175
- | 🔒 | **Local-first** — tarama sırasında sıfır ağ çağrısı, sıfır telemetri, saniyeler içinde çalışır |
176
-
177
- ### Kurallar
178
-
179
- Her kural, must-fire **ve** must-not-fire fixture'larıyla gelir.
180
- Kendi negatif fixture'ında tetiklenen bir kural sevk edilemez — bu,
181
- yanlış pozitif duvarıdır.
182
-
183
- <details>
184
- <summary><strong>Test hijyeni</strong></summary>
185
-
186
- | ID | Kural | Severity |
187
- | ----------- | --------------------------------------------------- | -------- |
188
- | QA-TEST-001 | Commit edilmiş odaklı test (`.only`, `fit`) | error |
189
- | QA-TEST-002 | Gerekçesiz atlanan test | error |
190
- | QA-TEST-002 | Kayıtlı gerekçeyle atlanan test | warning |
191
- | QA-TEST-003 | Assertion içermeyen test | error |
192
- | QA-TEST-004 | Katı sleep (`waitForTimeout`, `sleep()`, `delay()`) | warning |
193
- | QA-TEST-006 | Flakiness'i gizleyen retry istismarı | warning |
194
- | QA-TEST-010 | Boş test gövdesi | error |
230
+ ## Mjölnir neler bulur
195
231
 
196
- </details>
232
+ <p align="center">
233
+ <img src="assets/readme/stack.svg" alt="Yığınınızla çalışır: kurallarının kapsadığı diller, test framework'leri ve CI sistemleri, kural kaydından." width="100%" />
234
+ </p>
197
235
 
198
- <details>
199
- <summary><strong>Test kalitesi</strong></summary>
236
+ Dört ailede **79 kural** — test hijyeni, test kalitesi, Playwright ve CI bütünlüğü — TypeScript ve JavaScript, Python, Java, C# ve GitHub Actions YAML genelinde. Playwright'ı dört bağlamasının tamamında, ayrıca pytest, JUnit, TestNG, NUnit, xUnit, MSTest, Jest, Vitest ve Mocha'yı kapsarlar; Cypress ve Selenium için başlangıç düzeyinde kapsam vardır. Biçimi göstermek için dokuzu:
200
237
 
201
- | ID | Kural | Severity |
202
- | ------------ | ----------------------------------- | -------- |
203
- | QA-TQUAL-002 | Totolojik assertion | error |
204
- | QA-TQUAL-009 | Await edilmemiş promise assertion'ı | error |
205
- | QA-TQUAL-011 | Yorum satırına çevrilmiş testler | warning |
238
+ | ID | Kural | Önem | Düzey |
239
+ | ------------ | -------------------------------------------------------------------- | ------- | ---------- |
240
+ | QA-CI-001 | `continue-on-error` başarısız bir doğrulama kapısını maskeler | error | quarantine |
241
+ | QA-CI-009 | Test çıkış kodu aktarılmıyor (pipefail olmadan `\|`, `;` zincirleri) | error | extended |
242
+ | QA-TEST-001 | Odaklanmış test commit edildi (`.only`, `fit`) | error | quarantine |
243
+ | QA-TEST-003 | Doğrulamasız test | error | quarantine |
244
+ | QA-TQUAL-009 | await edilmemiş promise doğrulaması | error | quarantine |
245
+ | QA-PW-002 | await edilmemiş locator doğrulaması | error | core |
246
+ | QA-PW-004 | Kırılgan CSS/XPath seçicileri | warning | quarantine |
247
+ | QA-PY-002 | Atlanan test (`skip`, katı olmayan `xfail`) | warning | core |
248
+ | QA-CS-103 | Doğrulamasız test metodu | error | core |
206
249
 
207
- </details>
250
+ Tam katalog kayıttan üretilir, asla elle tutulmaz: `mjolnir rules --md`, [`docs/rules/`](docs/rules/) ya da [neleri denetlediği rehberi](https://sergey-bar.github.io/Mjolnir/guide/what-it-checks).
208
251
 
209
252
  <details>
210
- <summary><strong>Playwright 🎭</strong></summary>
211
-
212
- | ID | Kural | Severity |
213
- | --------- | --------------------------------------------- | -------- |
214
- | QA-PW-002 | Await edilmemiş locator assertion'ı | error |
215
- | QA-PW-003 | Commit edilmiş `page.pause()` / `test.only()` | error |
216
- | QA-PW-004 | Kırılgan CSS/XPath seçicileri | warning |
217
- | QA-PW-123 | Sabitlenmiş ortam URL'leri | warning |
253
+ <summary><strong>Bu README'de adı geçen tüm kurallar</strong>, tek bir tabloda</summary>
254
+
255
+ <br />
256
+
257
+ > `quarantine` kuralları yalnızca `--strict` altında çalışır ve asla engellemez (info düzeyiyle sınırlıdır). Gösterilen önem, yazarın belirlediği önemdir.
258
+
259
+ | ID | Aile | Kural | Önem | Düzey |
260
+ | ------------ | ---------- | -------------------------------------------------------------------- | ------- | ---------- |
261
+ | QA-TEST-001 | Hijyen | Odaklanmış test commit edildi (`.only`, `fit`) | error | quarantine |
262
+ | QA-TEST-002 | Hijyen | Atlanan test. İzlenen bir gerekçe olmadan `error` düzeyine yükselir. | warning | quarantine |
263
+ | QA-TEST-003 | Hijyen | Doğrulamasız test | error | quarantine |
264
+ | QA-TEST-004 | Hijyen | Sabit sleep (`waitForTimeout`, `sleep()`, `delay()`) | warning | extended |
265
+ | QA-TEST-006 | Hijyen | Kararsızlığı gizleyen retry kötüye kullanımı | warning | quarantine |
266
+ | QA-TEST-010 | Hijyen | Boş test gövdesi | error | quarantine |
267
+ | QA-TQUAL-002 | Kalite | Totolojik doğrulama | error | quarantine |
268
+ | QA-TQUAL-009 | Kalite | await edilmemiş promise doğrulaması | error | quarantine |
269
+ | QA-TQUAL-011 | Kalite | Yorum satırına alınmış testler | warning | extended |
270
+ | QA-PW-002 | Playwright | await edilmemiş locator doğrulaması | error | core |
271
+ | QA-PW-003 | Playwright | `page.pause()` / `test.only()` commit edildi | error | core |
272
+ | QA-PW-004 | Playwright | Kırılgan CSS/XPath seçicileri | warning | quarantine |
273
+ | QA-PW-123 | Playwright | Koda gömülü ortam URL'leri | warning | quarantine |
274
+ | QA-PW-140 | Playwright | `maxDiffPixelRatio` olmadan ekran görüntüsü | warning | core |
275
+ | QA-CI-001 | CI | `continue-on-error` başarısız bir kapıyı maskeler | error | quarantine |
276
+ | QA-CI-002 | CI | `\|\| true` çıkış kodlarını yutar | error | extended |
277
+ | QA-CI-005 | CI | Rapor kullanılıyor ama hiç üretilmiyor | error | quarantine |
278
+ | QA-CI-007 | CI | Testlerin etrafında retry sarmalayıcıları | warning | extended |
279
+ | QA-CI-008 | CI | Her zaman başarılı olan step hataları maskeler | error | quarantine |
280
+ | QA-CI-009 | CI | Çıkış kodu aktarılmıyor (pipefail olmadan `\|`, `;` zincirleri) | error | extended |
281
+ | QA-CI-010 | CI | Engellemeleri gereken yerde atlanan testler | error | quarantine |
282
+ | QA-PY-002 | Python | Atlanan test (`skip`, katı olmayan `xfail`) | warning | core |
283
+ | QA-PY-003 | Python | Doğrulamasız test fonksiyonu | error | quarantine |
284
+ | QA-PY-005 | Python | Testlerde `time.sleep()` | warning | extended |
285
+ | QA-PY-012 | Python | Totolojik doğrulama | error | quarantine |
286
+ | QA-JV-101 | Java | Devre dışı bırakılmış test (`@Disabled`) | warning | core |
287
+ | QA-JV-102 | Java | Sabit sleep (`Thread.sleep()`) | warning | extended |
288
+ | QA-JV-103 | Java | Doğrulamasız test metodu | error | extended |
289
+ | QA-JV-105 | Java | Playwright `waitForTimeout()` ile sabit sleep | warning | core |
290
+ | QA-JV-106 | Java | Rol tabanlı locator yerine kırılgan seçici | warning | quarantine |
291
+ | QA-CS-101 | C# | Atlanan test (`[Ignore]`, `[Fact(Skip=)]`) | warning | core |
292
+ | QA-CS-102 | C# | Sabit sleep (`Thread.Sleep` / `Task.Delay`) | warning | core |
293
+ | QA-CS-103 | C# | Doğrulamasız test metodu | error | core |
294
+ | QA-CS-105 | C# | `WaitForTimeoutAsync()` ile sabit sleep | warning | extended |
295
+ | QA-CS-106 | C# | Rol tabanlı locator yerine kırılgan seçici | warning | quarantine |
296
+
297
+ Python ayrıca QA-PY-001…012 (pytest hijyeni) ve QA-PY-101…108 (Python için Playwright) ile gelir. Cypress ve Selenium'un üçer kurallık başlangıç setleri vardır.
218
298
 
219
299
  </details>
220
300
 
221
- <details>
222
- <summary><strong>CI bütünlüğü</strong></summary>
223
-
224
- | ID | Kural | Severity |
225
- | --------- | --------------------------------------------------------------------- | -------- |
226
- | QA-CI-001 | `continue-on-error` başarısızlıkları maskeler | error |
227
- | QA-CI-002 | `\|\| true` exit kodlarını yutar | error |
228
- | QA-CI-005 | Rapor tüketilir ama asla üretilmez | error |
229
- | QA-CI-007 | Testleri saran retry sarmalayıcıları | warning |
230
- | QA-CI-008 | Hepsi-başarılı adım başarısızlıkları maskeler | error |
231
- | QA-CI-009 | Test exit kodu iletilmez (`\|` pipefail'sız, `;` zincirleri) | error |
232
- | QA-CI-010 | Testler, bloklaması gereken yerlerde atlanıyor (skip-on-PR bekçileri) | error |
301
+ Her kural bir must-fire **ve** bir must-not-fire fixture'ı ile yayımlanır ve kendi negatif fixture'ında tetiklenen bir kural yayımlanamaz. Bu, yanlış pozitif güvenlik duvarıdır; `mjolnir doctor` bunu bu deponun kendi CI'ında uygular.
233
302
 
234
- </details>
303
+ ### Selector Health Score
235
304
 
236
- <details>
237
- <summary><strong>Python / pytest 🐍</strong></summary>
238
-
239
- | ID | Kural | Severity |
240
- | --------- | ------------------------------------------- | -------- |
241
- | QA-PY-002 | Atlanan test (`skip`, katı olmayan `xfail`) | warning |
242
- | QA-PY-003 | Assertion içermeyen test fonksiyonu | error |
243
- | QA-PY-005 | Testlerde `time.sleep()` | warning |
244
- | QA-PY-012 | Totolojik assertion | error |
305
+ `mjolnir doctor:playwright` her locator'ı bir öğeyi nasıl bulduğuna göre derecelendirir: bir kullanıcının yapacağı gibi (rol, etiket, metin), açık bir sözleşmeyle (`data-testid`) ya da yapısal bir tesadüfle (CSS zincirleri, XPath). Her dosya 0 ile 100 arasında bir puan alır:
245
306
 
246
- Toplam 20 Python kuralı (QA-PY-001…012 pytest hijyeni + QA-PY-101…108 Playwright-Python).
307
+ ```text
308
+ ▍ SELECTOR HEALTH
247
309
 
248
- </details>
310
+ e2e/login.spec.ts
311
+ [█████████████░░░░░░░] 65 / 100
312
+ role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
249
313
 
250
- <details>
251
- <summary><strong>Java / JUnit · TestNG ☕</strong></summary>
314
+ e2e/checkout.spec.ts
315
+ [██████████████████░░] 88 / 100
316
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
317
+ ```
252
318
 
253
- | ID | Kural | Severity |
254
- | --------- | ---------------------------------------- | -------- |
255
- | QA-JV-101 | Devre dışı test (`@Disabled`) | warning |
256
- | QA-JV-102 | Katı sleep (`Thread.sleep()`) | warning |
257
- | QA-JV-103 | Assertion içermeyen test yöntemi | error |
258
- | QA-JV-105 | Playwright katı sleep `waitForTimeout()` | warning |
259
- | QA-JV-106 | Role locator yerine kırılgan seçici | warning |
319
+ Bu, **doğruluğu değil dayanıklılığı** ölçer. `.btn.btn-primary > div:nth-child(2)` bugün geçer ve biri işaretlemeye dokunana kadar geçmeye devam eder. Düşük bir puan asla testin bozuk olduğunu iddia etmez; yalnızca kimsenin korumayı vaat etmediği işaretlemeye bağlı olduğunu söyler.
260
320
 
261
- </details>
321
+ <br />
262
322
 
263
- <details>
264
- <summary><strong>C# / .NET — NUnit · xUnit · MSTest 🟣</strong></summary>
323
+ ## Güvenilirlik puanı
265
324
 
266
- | ID | Kural | Severity |
267
- | --------- | ------------------------------------------ | -------- |
268
- | QA-CS-101 | Atlanan test (`[Ignore]`, `[Fact(Skip=)]`) | warning |
269
- | QA-CS-102 | Katı sleep (`Thread.Sleep` / `Task.Delay`) | warning |
270
- | QA-CS-103 | Assertion içermeyen test yöntemi | error |
271
- | QA-CS-105 | Katı sleep `WaitForTimeoutAsync()` | warning |
272
- | QA-CS-106 | Role locator yerine kırılgan seçici | warning |
325
+ <p align="center">
326
+ <img src="assets/readme/score-gauge.svg" alt="0'dan 100'e güvenilirlik ölçeği, her puanı dolaşan bir işaretçiyle: 50'nin altı UNWORTHY, 50–79 NEEDS WORK, 80–99 WORTHY, 100 FORGED" width="720" />
327
+ </p>
273
328
 
274
- </details>
329
+ <sub>0'dan 100'e her puan, gerçek `deriveScoreState` tarafından yerleştirildi. `npm run docs:gauge` ile üretilir ve CI'da sapmaya karşı kilitlenir.</sub>
275
330
 
276
- > Tam canlı katalog — her kuralın tier'i, güveni, yanlış pozitif riski ve
277
- > autofix kullanılabilirliğiyle — kayıt defterinden üretilir:
278
- >
279
- > ```bash
280
- > mjolnir rules --md
281
- > ```
282
- >
283
- > Kural başına sayfalar [`docs/rules/`](docs/rules/) altındadır.
331
+ | Puan | Karar |
332
+ | --------- | -------------------------------------- |
333
+ | `0 – 49` | **UNWORTHY** |
334
+ | `50 – 79` | **NEEDS WORK** |
335
+ | `80 – 99` | **WORTHY** |
336
+ | `100` | **FORGED** |
337
+ | `null` | **UNKNOWN**: test bildirimi bulunamadı |
284
338
 
285
- ### Ne kadarı ölçülmüş
339
+ **Nasıl hesaplanır.** Önem bir temel kesinti belirler (`error −8`, `warning −3`, `info −1`) ve kanıt düzeyi bunu indirir: E2 tam, E1 yarım (aşağı yuvarlanarak), E0 hiç sayılmaz. Toplam, paketin maruziyetine göre normalleştirilir; yani dosya başına değil test bildirimi başına kesinti. Terminal, puanın kullandığı indirilmiş sayıların aynısını yazdırır; gizli ikinci bir model yoktur. Ayrıntılar: [docs/SCORING.md](docs/SCORING.md) ve [puanlama rehberi](https://sergey-bar.github.io/Mjolnir/guide/scoring).
286
340
 
287
- **99 kuraldan 78'sı, gerçek OSS koduna karşı ölçülmüş bir yanlış pozitif
288
- oranı taşıyor** (her biri için ≥ 10 elle sınıflandırılmış bulgu; bkz.
289
- [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Diğer 21'i yazarın tahminine göre
290
- yayına giriyor. Her tarama alt bilgisi, _tetiklenen_ kuralların kaçının
291
- ölçüldüğünü söyler; `mjolnir rules --unmeasured` ölçülmeyenleri listeler;
292
- her kuralın `mjolnir explain` sayfası durumunu belirtir. Oranı çirkin
293
- karantinada. O sayıyı büyütmek, projenin süregelen işidir.
341
+ **100'ün anlamadığı şey.** Yazılımın doğru, paketin yeterli ya da ürünün hatasız olduğu anlamına gelmez. Tek bir anlamı vardır: **Mjölnir'in değerlendirdiği kuralların hiçbiri bu taramada ve bu kanıt modelinde kesinti üretmedi.**
294
342
 
295
- ### Kural katmanları ve dil olgunluğu
343
+ <br />
296
344
 
297
- Her kural, **ölçülmüş** yanlış pozitif oranına göre atanmış `core`,
298
- `extended` veya `quarantine` olur:
345
+ ## Kanıt modeli
299
346
 
300
- | Tier | Anlamı | Varsayılan tarama | `--strict` |
301
- | ------------ | ------------------------------------------- | :---------------: | :--------: |
302
- | `core` | ≤ %10 ölçülmüş FP | ✅ | ✅ |
303
- | `extended` | ≤ %30 ölçülmüş FP | ✅ | ✅ |
304
- | `quarantine` | %30 üzerinde veya henüz ölçülmemiş (n < 10) | ❌ | ✅ |
347
+ Her bulgu iki etiket taşır: Mjölnir'in ne kadar emin olduğu ve bulgunun ne kadar denetlendiği. Kalıp raporlayan bir araçla bir sürümü kapıya bağlayabileceğiniz bir araç arasındaki fark budur.
305
348
 
306
- | Dil | Adaptör | Bugünkü kapsam |
307
- | --------------- | ------------- | -------------------------------------------------------- |
308
- | TypeScript / JS | Derleyici AST | en geniş, en çok ölçülmüş — çoğunlukla `core`/`extended` |
309
- | Python / pytest | Regex katmanı | geniş, corpus denetimli — çoğunlukla `core`/`extended` |
310
- | Java | Regex katmanı | daha yeni — çoğunlukla `extended`/`quarantine` |
311
- | C# / .NET | Regex katmanı | daha yeni — çoğunlukla `extended`/`quarantine` |
349
+ **Ne kadar emin — kanıt düzeyi.**
312
350
 
313
- TypeScript ve Python en geniş ölçülmüş kapsama sahiptir. Java ve C#
314
- sevk edildi, belgelendi ve gerçek bir tüketici takımı (bir bağlama
315
- kütüphanesinin kendi testleri değil) denetlenene kadar başlık sayısının
316
- dışında kalır.
351
+ | Düzey | Ad | Anlamı | Kesinti |
352
+ | ------ | ------------------- | ----------------------------------------------------- | ------- |
353
+ | **E2** | Deterministik kanıt | Kusur, kodda yazıldığı hâliyle mevcut | Tam |
354
+ | **E1** | Kalıp kanıtı | Kusurla güçlü biçimde bağlantılı bir kalıp eşleşti | Yarım |
355
+ | **E0** | Gözlem | Bilmeye değer. Bir şeyin yanlış olduğu iddiası değil. | Sıfır |
317
356
 
318
- ---
357
+ Bir tespitteki güven, kanıtın gücü değildir. Bir kural aradığını bulduğundan emin olabilir ve yine de bir sezgisel yönteme bakıyor olabilir. E1 bulguları okunmak ve değerlendirilmek içindir, asla körü körüne uygulanmak için değil; bu sınır bulgunun üzerinde terminalde, JSON'da ve ajana devirde işaretlidir.
319
358
 
320
- ## Puanlama nasıl çalışır
359
+ **Ne kadar denetlendi — güven düzeyi.** Bulguların çoğu kodunuzu okumaktan gelir. Mjölnir'e gerçek bir test çalıştırmasının raporunu verin, kodun gerçekten çalıştığını doğrulayabilsin.
321
360
 
322
361
  <p align="center">
323
- <img src="assets/readme/terminal-hero.svg" alt="Mjölnir terminal çıktısı — WORTHINESS 75/100 NEEDS WORK, kategori bazında teşhis dökümü ve FIX THIS FIRST listesi" width="820" />
362
+ <img src="assets/readme/trust-ladder.svg" alt="L0'dan L5'e güven merdiveni. L0–L2 kodu okumaktan gelir; L3–L5 gerçek bir çalıştırma raporu gerektirir, bu da merdivendeki bir kırılmayla işaretlenir." width="100%" />
324
363
  </p>
325
364
 
326
- <sub>`npm run docs:hero` ile yeniden üretilir;
327
- [`tests/hero-asset-reproducibility.spec.ts`](tests/hero-asset-reproducibility.spec.ts)
328
- dosyası, çıktı reporter'ın gerçekten bastığından saptarsa CI'ı düşürür.</sub>
365
+ | Düzey | Sade bir dille | Ne gerektirir |
366
+ | ------ | --------------------- | ------------------------------------------------------------------ |
367
+ | **L0** | Not edildi | Kodu okumak |
368
+ | **L1** | Sorun gibi görünüyor | Kodu okumak: bir kalıp eşleşti |
369
+ | **L2** | Kodda kanıtlandı | Kodu okumak: kusur yapısal |
370
+ | **L3** | Dosya çalıştı | Bir çalıştırma raporu bulgunun dosyasının yürütüldüğünü gösteriyor |
371
+ | **L4** | Test çalıştı | Bir çalıştırma raporu bulgunun testinin yürütüldüğünü gösteriyor |
372
+ | **L5** | Çalıştırma doğruluyor | Çalıştırmanın kendi sonucu kusur sınıfını doğruluyor |
329
373
 
330
- Puan şeffaftır: **error −8, warning −3, info −1**, ardından takım
331
- maruziyetine göre normalizasyon (test bildirimi başına kesinti).
332
- Kanıtla ağırlıklandırılan kesintiler, zayıf sinyallerin daha az pahalı
333
- olduğu anlamına gelir. Terminal, puanın kullandığı aynı iskontolu
334
- sayıları gösterir — kara kutu yok. Tam yöntem:
335
- [docs/SCORING.md](docs/SCORING.md).
374
+ Statik bir tarama L2'de durur. Yalnızca gerçek bir çalıştırma raporu (Playwright JSON, Jest veya Vitest JSON, JUnit XML) bir bulguyu L3 ve üstüne çıkarabilir; bu yüzden hiç çalışırken görülmemiş bir bulgu asla çalıştığını iddia edemez. Tanımlar: [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md).
336
375
 
337
- **Hükümler**
376
+ ### Bunun ne kadarı ölçülmüş
338
377
 
339
- | Score | Hüküm |
340
- | ------- | ---------------- |
341
- | ≥ 80 | ✓ **WORTHY** |
342
- | 50 – 79 | ⚠ **NEEDS WORK** |
343
- | < 50 | ✖ **UNWORTHY** |
378
+ **79 kuraldan 74'ünün gerçek OSS koduna karşı ölçülmüş bir yanlış pozitif oranı var** (her biri için en az 10 elle sınıflandırılmış bulgu; bkz. [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Diğer 5'i yazarın tahminiyle yayımlanır ve bunu `mjolnir explain` içinde kural kural söyler. `mjolnir rules --unmeasured` onları listeler ve her tarama altbilgisi, gerçekten _tetiklenen_ kurallardan kaçının ölçülmüş olduğunu bildirir.
344
379
 
345
- **Kanıt düzeyleri** — her bulgu bir tane taşır; bulgunun puan içindeki
346
- ağırlığını belirler:
380
+ Oranlar kötü olduğunda da herkese açık kalır. QA-TEST-001 (commit edilmiş bir `.only`) gerçek depolardaki denetimde kötü sonuç verir ve bu yüzden quarantine'dedir. QA-PW-141 dahil her kuralın güncel sayısı denetimdedir.
347
381
 
348
- | Düzey | Anlamı | Puana etkisi | Örnek |
349
- | ----- | ----------------- | --------------------- | --------------------------------------------------------- |
350
- | E2 | Belirleyici kusur | Tam kesinti | Commit edilmiş `.only` — yapısal olarak kanıtlanabilir |
351
- | E1 | Sezgisel örüntü | Yarım kesinti | Regex ile yakalanan `sleep()` — güçlü sinyal, kanıt değil |
352
- | E0 | Gözlem | Sıfır (yalnızca info) | Bildirilir ama asla CI'ı gate'lemez ve kesinti yapmaz |
382
+ ### Kural güven düzeyleri
353
383
 
354
- Kuralların çoğu **E1**'dir. «we prove it» sloganı bu sisteme işaret
355
- eder: E2 bulguları yapısal kanıttır; E1 bulguları doğru konumlanmış
356
- uyarılarıdır, resmî kanıt değildir.
384
+ Düzeyler görüşe değil, ölçülmüş yanlış pozitif oranına göre belirlenir:
357
385
 
358
- Boş bir repo `null` puanlar — sahte 100 asla; bkz.
359
- [Güven modeli](#güven-modeli).
386
+ | Düzey | Ölçülmüş FP | Davranış |
387
+ | -------------- | ---------------------------- | ------------------------------------------------------ |
388
+ | **core** | ≤ 10% | Varsayılan rapor, engeller |
389
+ | **extended** | ≤ 30% | Varsayılan rapor, daha düşük güven |
390
+ | **quarantine** | > 30% veya açıkça bildirilen | Yalnızca `--strict`, info ile sınırlı, asla engellemez |
391
+ | _ölçülmemiş_ | n < 10 | Ölçülene kadar core düzeyine yükseltilemez |
360
392
 
361
- ---
393
+ FP bantları yalnızca bir kademe düşürebilir — açıkça orada bildirilmişse bir kuralı `quarantine` dışına çıkarmaz. Açıkça quarantine'a alınmış bir kural, ölçülen FP oranından bağımsız olarak quarantine'de kalır.
362
394
 
363
- ## 🎭 Selector Health Score
395
+ Yükseltme, düşürme ve dil bazında olgunluk: [kural yaşam döngüsü](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle).
364
396
 
365
- Playwright takımları için başlık metriği — locator'larınız ne kadar
366
- dayanıklı:
397
+ ### Bu neden bir linter değil
367
398
 
368
- ```text
369
- ▚ SELECTOR HEALTH — e2e/checkout.spec.ts
399
+ Linter'lar kodun kurallara uyup uymadığını söyler. Mjölnir doğrulamanıza güvenilip güvenilemeyeceğini söyler.
370
400
 
371
- [█████████████████░░░] 83 / 100
372
- role/text: 2 · testid: 1 · css-chains: 1 ⚠ · xpath: 0
373
- ```
401
+ | | Linter'lar (ESLint, SonarQube) | Kapsam araçları | Yapay zekâ ile kod incelemesi | **Mjölnir** |
402
+ | ------------------------------------------------------------------- | :----------------------------: | :-------------: | :---------------------------: | :---------------: |
403
+ | Ürün kodunu değil, **doğrulama sistemini** puanlar | Hayır | Hayır | Hayır | Evet |
404
+ | CI workflow bütünlüğü (`continue-on-error`, `\|\| true`) | Hayır | Hayır | yalnızca diff | Evet |
405
+ | Playwright locator dayanıklılığını derecelendirir (Selector Health) | Hayır | Hayır | Hayır | Evet |
406
+ | `TRUE-FLAKE` kararları için gerçek çalıştırma verisi okur | Hayır | Hayır | Hayır | Evet |
407
+ | Kural başına ölçülmüş bir yanlış pozitif oranı yayımlar | Hayır | Hayır | Hayır | Evet |
408
+ | Doğrulamasız testleri işaretler | Evet\* | Hayır | bazen | Evet |
409
+ | Sabit sleep'leri yakalar (`waitForTimeout`, `time.sleep`) | Evet\* | Hayır | bazen | Evet |
410
+ | Deterministik (aynı girdi, aynı çıktı) | Evet | Evet | Hayır | Evet |
411
+ | Tarama başına maliyet | ücretsiz | ücretsiz | token | **sıfır** (yerel) |
374
412
 
375
- Rol tabanlı locator'lar tam puan alır. CSS sınıf zincirleri ve XPath
376
- puanı batırır — herhangi bir DOM yeniden düzenlemesinde, hangi davranışın
377
- gerilediğini söylemeden kırılırlar.
413
+ <sub>\*`eslint-plugin-jest` ve `eslint-plugin-playwright` (`expect-expect`, `no-wait-for-timeout`) ile SonarQube'un kendi doğrulama kuralları tarafından kapsanır. Sütunlar, test paketi doğrulaması için varsayılan davranışı tanımlar; eklentiler, ücretli planlar ve özel kurallar bazı yanıtları değiştirir. Bu bir konumlandırma özetidir, kıyaslama değil.</sub>
378
414
 
379
- ---
415
+ Yapay zekâ incelemesini de kullanın. Hiçbir kalıbın bulamayacağı nüansları, niyeti ve tasarım kusurlarını yakalar. Mjölnir ise kasıtlı göründüğü için yapay zekâ incelemesinin gözden kaçırdığını yakalar: commit edilmiş bir `.only`, yutulmuş bir çıkış kodu, bir test job'undaki `continue-on-error`. Bunlar akıl yürütme değil tarama gerektirir.
380
416
 
381
- ## 🔬 Çalışma zamanı kanıtı
417
+ <br />
382
418
 
383
- Statik flakiness tespiti tahminidir. Mjölnir **gerçek yürütme
384
- verilerini** okur — herhangi bir koşucudan Playwright JSON raporları ve
385
- JUnit XML:
419
+ ## Test çalıştırma analizi
420
+
421
+ Statik analiz hiç çalışmamış kod hakkında akıl yürütür. Çalıştırma analizi ise gerçekte ne olduğunu okur: herhangi bir çalıştırıcıdan Playwright JSON, Jest JSON, Vitest JSON ve JUnit XML.
386
422
 
387
423
  ```bash
388
424
  mjolnir forensics ./test-results/
389
425
  ```
390
426
 
391
427
  ```text
392
- ▚ FLAKINESS LEADERBOARD
428
+ ▍ FLAKINESS LEADERBOARD
393
429
 
394
430
  3 tests · 1 failed · 1 flaky · 1 retried
395
431
 
@@ -399,297 +435,184 @@ FAILING declines an expired card (e2e/checkout.spec.ts)
399
435
  ████░░░░░░░░░░░░░░░░ 1.1s · 1 attempt
400
436
  ```
401
437
 
402
- 2. denemeden itibaren geçen test, geçen test değildir — şanslı bir
403
- testtir. Son yeşil onaydan bağımsız olarak `TRUE-FLAKE` olarak
404
- işaretlenir.
438
+ `TRUE-FLAKE` testin yeniden denendiği anlamına gelmez. Testin **en az bir denemede başarısız olup ardından yeşil bittiği** anlamına gelir: son onay işareti ne derse desin işaretlenen şanslı bir geçiş. `mjolnir triage` bu geçmişi bir karantina önerisine dönüştürür, `mjolnir pw-report` ise bir çalıştırmayı özetler. Bulguları L3 ve üzeri güven düzeylerine çıkaran da aynı çalıştırma raporlarıdır.
405
439
 
406
- ---
440
+ <br />
407
441
 
408
- ## ⚡ Mjölnir bir linter daha değildir
442
+ ## CI bütünlüğü
409
443
 
410
- Linter'lar kodun kurallara uyup uymadığını söyler. Mjölnir, doğrulamanıza
411
- güvenilip güvenilemeyeceğini söyler.
444
+ Bir test geçerken çevresindeki pipeline başarısız olamayabilir. Mjölnir workflow'ları da okur: `continue-on-error`, `|| true`, hiç aktarılmayan çıkış kodları, her zaman başarılı olan step'ler, kullanılan ama hiç üretilmeyen raporlar ve engellemesi gereken olaylarda atlanan kapılar. Her bulgu job'u, step'i ve satırı belirtir ve kendi kanıt düzeyini taşır.
412
445
 
413
- | | ESLint / SonarQube | Coverage araçları | Manuel inceleme | **Mjölnir** |
414
- | ------------------------------------------------------------- | :----------------: | :---------------: | :-------------: | :---------: |
415
- | CI workflow bütünlüğü (`continue-on-error`, `\|\| true`) | ❌ | ❌ | nadiren | ✅ |
416
- | Tek araçla çapraz dil (TS, Python, Java, C#) | ❌ | ❌ | ❌ | ✅ |
417
- | Playwright locator dayanıklılığını not eder (Selector Health) | ❌ | ❌ | nadiren | ✅ |
418
- | Gerçek assertion'ı olmayan testleri işaretler | ✅ (eklenti)\* | ❌ | bazen | ✅ |
419
- | Katı sleep'leri yakalar (`waitForTimeout`, `time.sleep`) | ✅ (eklenti)\* | ❌ | bazen | ✅ |
420
- | Saniyeler içinde çalışır, tarama sırasında sıfır ağ çağrısı | ✅ | ✅ | — | ✅ |
446
+ PR workflow'unu üretin, varsayılan olarak tavsiye niteliğindedir:
421
447
 
422
- \*`eslint-plugin-jest` (`expect-expect`) ve `eslint-plugin-playwright`
423
- (`expect-expect`, `no-wait-for-timeout`) bunları ilgili çerçeveler için
424
- karşılar.
448
+ ```bash
449
+ mjolnir ci install
450
+ ```
425
451
 
426
- **Çalışma zamanı analizi**, statik linting'in yanı sıra ayrı bir
427
- kategoridir:
452
+ Ya da Marketplace action'ını mevcut bir workflow'a ekleyin:
428
453
 
429
- | | Playwright retry reporter | Allure / ReportPortal | **Mjölnir forensics** |
430
- | --------------------------------------------------------- | :-----------------------: | :-------------------: | :-------------------: |
431
- | `TRUE-FLAKE` hükümleri için gerçek çalıştırma verisi okur | kısmen\* | kısmen (tag) | ✅ |
432
- | Yürütme geçmişinden flaky triyaj raporu | ❌ | ✅ | ✅ |
433
- | Statik güvenilirlik puanıyla bütünleşir | ❌ | ❌ | ✅ |
454
+ ```yaml
455
+ - uses: Sergey-Bar/Mjolnir@v1
456
+ with:
457
+ scope: changed
458
+ fail-on: error
459
+ ```
434
460
 
435
- \*Playwright retry'ları içeriden izler ama hüküm etiketli bağımsız bir
436
- flakiness raporu üretmez.
461
+ Ana sürüm hattını izlemek için `@v1`'i, tekrarlanabilir bir kapı için ise tam bir etiketi (`@v0.5.32`) sabitleyin. [docs/DISTRIBUTION-KIT.md](docs/DISTRIBUTION-KIT.md) Marketplace'i, Smithery'yi ve MCP kayıtlarını kapsar.
437
462
 
438
- ---
463
+ Bulguları GitHub Code Scanning'e aktarmak için SARIF yükleyin (workflow veya job kapsamında `security-events: write` gerekir):
439
464
 
440
- ## 🤖 Neden yalnızca AI kod incelemesi kullanmayasınız?
465
+ ```yaml
466
+ - run: npx mjolnir-qa@latest --format sarif > mjolnir.sarif
467
+ continue-on-error: true
468
+ - uses: github/codeql-action/upload-sarif@v3
469
+ if: ${{ !cancelled() }}
470
+ with:
471
+ sarif_file: mjolnir.sarif
472
+ ```
441
473
 
442
- Farklı sorun, farklı katman. AI incelemesi bir diff'teki şüpheli test
443
- değişikliğini fark edebilir; doğrulama sisteminin bütünüyle güvenilir
444
- olduğunu kanıtlamaz — ve yalnızca ona gösterdiğiniz diff'i görür.
474
+ GitLab'de `--format codequality`, MR widget'ının ve diff açıklamalarının okuduğu Code Quality raporunu yazar ([docs/GITLAB-CI.md](docs/GITLAB-CI.md)). Düzenleyici ve pipeline kurulumu: [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md).
445
475
 
446
- | | AI kod incelemesi (Copilot vb.) | **Mjölnir** |
447
- | -------------------------------------------- | :-------------------------------: | :-------------------------------------------: |
448
- | Tarama başına maliyet | Token (diff boyutuyla ölçeklenir) | **Sıfır** (yerel, kurulu) |
449
- | Tüm takımı + tüm CI yapılandırmalarını görür | Yalnızca gösterdiğiniz PR diff'i | **Her şey, her seferinde** |
450
- | Belirleyici (aynı girdi → aynı çıktı) | ❌ (belirsiz) | **✅** |
451
- | Aylardır uyuyan örüntüleri yakalar | Yalnızca bağlamdaysa | **✅** (tüm dosyaları tarar) |
452
- | Çalıştırmalar arasında bulguları hatırlar | ❌ (oturumlar arası bellek yok) | **✅** (baseline + diff) |
453
- | İnsan tetiklemesi olmadan çalışır | PR veya prompt gerekir | **✅** (CI kancası, saniyeler içinde çalışır) |
476
+ ### Değişen kapsamda atıf
454
477
 
455
- **İkisini de kullanın.** AI, hiçbir regex'in bulamayacağı nüansı, niyeti
456
- ve tasarım kusurlarını yakalar. Mjölnir, AI'nın «kasıtlı» göründükleri
457
- için gözden kaçırdığı yapısal örüntüleri yakalar — commit edilmiş bir
458
- `.only`, yutulmuş bir exit kodu, test işindeki bir `continue-on-error`.
459
- Bunlar akıl gerektiren hatalar değil; tarama gerektiren olgulardır.
478
+ ```bash
479
+ npx mjolnir-qa@latest --scope changed
480
+ ```
460
481
 
461
- ---
482
+ Bulgular, dalınızın eklediği satırlara **merge-base**'e göre ölçülerek atfedilir. Kapsam, tam bir taramanın keşfettiği dosya kümesinin aynısıdır (TS/JS spec'leri ve adaptör yapılandırmaları, `test_*.py`, `*Test.java`, `*Tests.cs`, `.github/workflows/*.yml`); buna commit edilmemiş ve izlenmeyen değişiklikler de eklenir, böylece commit etmeden önce de çalışır. Taban `main → master → origin/main → origin/master → origin/HEAD` sırasıyla çözülür; `--base <ref>` ile geçersiz kılabilirsiniz.
462
483
 
463
- ## 🤖 CI entegrasyonu
484
+ merge-base çözülemediğinde (sığ bir klon, ayrık bir HEAD, git dışında bir hedef), bulgular tüm dosyaya atfa geri döner **ve rapor bunu söyler.** Sessiz bir geri dönüş, bu aracın yakalamak için var olduğu türden bir kusur olurdu.
464
485
 
465
- Tek komut bir PR workflow'u üretir — varsayılan olarak danışmanlık,
466
- asla engellemeyen:
486
+ <br />
467
487
 
468
- ```bash
469
- mjolnir ci install
470
- ```
488
+ ## Yapay zekâ ajanları
471
489
 
472
- Ya da SARIF üzerinden GitHub Code Scanning'e yerel olarak bağlayın:
490
+ Bulgular ancak bir şey onlara göre harekete geçerse bir değer taşır.
473
491
 
474
- ```yaml
475
- - run: npx mjolnir-qa@latest --format sarif > mjolnir.sarif
476
- - uses: github/codeql-action/upload-sarif@v3
477
- with:
478
- sarif_file: mjolnir.sarif
492
+ ```text
493
+ SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
479
494
  ```
480
495
 
481
- SARIF için düzenleyici ve hattan kurulumu:
482
- [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md).
483
-
484
- ### Değişen kapsam kapsamı
496
+ **Düzeltmeyi yapay zekâ yazar. Mjölnir onu doğrular.** Kanıt yeniden taramadan gelir, asla ajanın kendi başarı raporundan değil.
485
497
 
486
- `--scope changed`, bulguları branch'inizin `main` ile birleştirme
487
- tabanına (merge-base) göre eklediği satırlara atfeder. Test dosyalarını
488
- (`*.spec.*`, `*.test.*`) ve diff'teki GitHub workflow dosyalarını ve
489
- Playwright yapılandırmalarını kapsar. Merge-base çözülemediğinde —
490
- shallow clone, detached HEAD, git dışı hedef, farklı varsayılan branch —
491
- dürüstçe geriler: bulgular tüm dosya atfına döner ve rapor bunu söyler.
492
- Taban referansını `--base <ref>` ile geçersiz kılın.
498
+ | Komut | Ajanın aldığı |
499
+ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
500
+ | `mjolnir mcp` | stdio üzerinden bir [MCP](https://modelcontextprotocol.io) sunucusu. `scan`, `explain` ve `diff` çağrılabilir araçlara dönüşür. |
501
+ | `mjolnir handoff` | Kaydedilmiş bir `--json` raporu deterministik bir Markdown planına dönüşür: neyin tespit edildiği, her bulgunun kanıt sınırı, neyin **değişmemesi** gerektiği ve nasıl doğrulanacağı. |
502
+ | `mjolnir install` | Deponuzda zaten bulunan ajan yüzeylerine yazar (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`), böylece ajan bitti demeden önce yeniden tarar. |
493
503
 
494
- ---
504
+ Kendi CLI'ı olan bir istemciye ekleyin:
495
505
 
496
- ## Yapılandırma
497
-
498
- Mjölnir sıfır-yapılandırmadır. Repo kökündeki isteğe bağlı bir
499
- `mjolnir.config.json` (veya `.mjolnir.json`) şiddeti, kapıyı ve kapsamı
500
- ayarlar — algılama anlamını asla değiştirmez.
506
+ ```bash
507
+ claude mcp add mjolnir -- npx -y mjolnir-qa@latest mcp
508
+ ```
501
509
 
502
- | Key | Tür | Etki |
503
- | ------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
504
- | `exclude` | `string[]` | Ek ignore glob'ları (gitignore alt kümesi), yerleşik varsayılanların üzerine |
505
- | `gate` | `"advisory" \| "error" \| "warning"` | Hangi şiddetlerin sıfır olmayan kodla çıkacağı (varsayılan `error`; `advisory` asla engellemez) |
506
- | `severityOverrides` | `{ "<RULE-ID>": severity }` | Bir kuralın bulgularını deponuz için yeniden sıralar |
507
- | `ignore` | `IgnoreEntry[]` | Bulguları bastırır — **`reason` zorunludur**; girdiler 90 gün sonra sona erer (açık bir `expires` tarihi, ya da tarihi olmayan girdiler için yapılandırma dosyasının son değişiklik zamanı) |
508
- | `plugins` | `string[]` | Üçüncü taraf kural paketleri (bkz. [Güven modeli](#güven-modeli)) |
510
+ Ya da `mcpServers` bloğu kabul eden herhangi bir istemciye:
509
511
 
510
512
  ```json
511
513
  {
512
- "gate": "error",
513
- "exclude": ["legacy/**"],
514
- "severityOverrides": { "QA-PW-141": "warning" },
515
- "ignore": [
516
- {
517
- "ruleId": "QA-TEST-004",
518
- "files": ["e2e/legacy-login.spec.ts"],
519
- "reason": "Third-party widget needs a settle delay; tracked in JIRA-4821",
520
- "expires": "2026-12-31"
521
- }
522
- ]
514
+ "mcpServers": {
515
+ "mjolnir": { "command": "npx", "args": ["-y", "mjolnir-qa@latest", "mcp"] }
516
+ }
523
517
  }
524
518
  ```
525
519
 
526
- - **`.mjolnirignore`** — yol dışlamaları için düz gitignore tarzı bir
527
- dosya, `exclude` ile aynı diyalekt. Makinaya özgü gürültü için onu
528
- kullanın; liste sürüm denetimine, diğer yapılandırmanın yanına
529
- girecekse `exclude` kullanın.
530
- - **CLI geçersiz kılmaları** — `--strict` (karantina kurallarını dahil
531
- et), `--width <cols>` ve `--ascii` / `--no-ascii` (terminal
532
- görüntüsü), `--tone blunt` (daha sert mesajlar),
533
- `--max-duration <sec>` (sınırlı kısmi tarama).
534
- - Kural bastırma ve kullanımdan kaldırma yaşam döngüsü:
535
- [docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md).
520
+ **Korkuluk, kolaylıktan daha önemlidir.** Bir devirdeki her bulgu kendi sınırını taşır. **E2** der ki _deterministik: konumu kontrol edin ve düzeltmeyi uygulayın_. **E1** der ki _ONAY GEREKTİRİR: gözlem tek başına kusuru kanıtlamaz_. E1'i körü körüne düzelten, bir kuralı bastıran ya da puanı yükseltmek için bir kuralı düzenleyen bir ajan, tam da bu aracın yakalamak için var olduğu şeyi yapıyordur; bu yüzden devir bunu prompt'ta, bulgunun hemen yanında söyler.
521
+
522
+ <br />
523
+
524
+ ## Güven ve güvenlik
525
+
526
+ **Önce yerel, sıfır telemetri.** `src/` içinde hiçbir yerde ağ yeteneğine sahip bir API (`fetch`, `http`, `https`, `net`, `dns`, `dgram`, WebSocket) yoktur ve [`privacy-network-isolation.spec.ts`](tests/contract/privacy-network-isolation.spec.ts) biri ortaya çıkarsa derlemeyi başarısız kılar. Ayrıca `eval` ve `new Function` kullanımını da yasaklar. Güvenilmeyen kodu taramak onu asla yürütmez: statik analiz kaynak metni okur, çalıştırma analizi ise diskte zaten bulunan rapor dosyalarını ayrıştırır.
536
527
 
537
- `ignore` girdileri ayrıca bağımsız `mjolnir suppressions` komutunu besler;
538
- bu komut şu anda bastırılanları ve her girdinin ne zaman sona ereceğini
539
- listeler.
528
+ İki çekince: `npx` herhangi bir şey çalışmadan önce paketi kendisi indirir ve bu garanti üçüncü taraf eklentileri değil, `src/`'yi kapsar.
540
529
 
541
- ---
530
+ **Eklentiler korumalı alanda çalışmaz.** JS eklentileri (`mjolnir-rules/*.mjs` ya da `"plugins"` altında listelenen npm paketleri) tam Node yetkileriyle çalışır; ESLint ya da Vitest eklentileriyle aynı güven modeli. Onları yüklemek **tarama başına** açıkça seçilmelidir: `--enable-plugins` (veya `MJOLNIR_ENABLE_PLUGINS=1`) olmadan kaynakları asla yüklenmez ve stderr'deki bir bildirim nelerin atlandığını listeler. JSON kural manifestoları kod yürütmez ve core kural kimliği önekleri ayrılmıştır, böylece bir eklenti onlardan birinin kılığına giremez. Güvenlik açıklarını [SECURITY.md](SECURITY.md) üzerinden bildirin.
542
531
 
543
- ## 📐 Çıkış kodları ve sözleşmeler
532
+ **Kendi üzerinde çalışır.** Bir doğrulama güven motoru, kendisi doğrulanabilir değilse hiçbir itibara sahip olamaz. Her CI çalıştırması bu depoyu, aynı çalıştırmanın ürettiği derlemeyle tarar. Kapı, error önem düzeyindeki herhangi bir bulguda ve ayrıca **kısmi** bir taramada ya da **çöken bir kuralda** başarısız olur; çünkü hiçbir şey raporlamayan yarım kalmış bir öz tarama, bu projenin yakalamak için var olduğu sahte yeşilin ta kendisidir. `mjolnir doctor` aynı çalıştırmada kural tabanını yeniden denetler (fixture güvenlik duvarı, düzey dürüstlüğü, core düzeyi üst sınırı) ve INCONCLUSIVE sonuçlu bir denetim, başarısız bir denetimle tamamen aynı şekilde başarısız olur. Her iki rapor da derleme artefaktı olarak yüklenir.
544
533
 
545
- Donmuş — üstüne CI mantığı kurmak güvenli:
534
+ ### Çıkış kodları ve makine sözleşmesi
535
+
536
+ Donmuştur; böylece üzerlerine CI mantığı kurabilirsiniz:
546
537
 
547
538
  | Çıkış kodu | Anlamı |
548
539
  | ---------- | ------------------------------------------------------------------------- |
549
- | `0` | Temiz — kapı düzeyinde veya üzerinde bulgu yok |
550
- | `1` | Kapı düzeyinde veya üzerinde bulgular |
551
- | `2` | Kısmi tarama (zaman bütçesi doldu, okunamayan dosyalar) — asla engellemez |
552
- | `10` | Kullanım hatası (hatalı bayrak, hedef eksik) |
553
- | `20` | İç hata |
554
-
555
- JSON/SARIF raporu `schemaVersion: 1`'dir. Kural kimlikleri
556
- (`QA-<FAMILY>-NNN`) sevk edildikten sonra değişmez ve asla yeniden
557
- kullanılmaz.
558
-
559
- ---
560
-
561
- ## Güven modeli
562
-
563
- - **Local-first** — tarama sırasında sıfır ağ çağrısı. Asla. Sıfır
564
- telemetri.
565
- - **Yanlış kanıt yok** — «doğrulandı» demek yerine «bilinmiyor» demeyi
566
- tercih ederiz. Boş repo `score: null` alır, sahte 100 asla.
567
- - **Kısmi dürüstlük** — analiz yarıda kesildiyse çıktı bunu söyler.
568
- Öyle olmadığında asla «complete» demez.
569
- - **FP duvarı** — algılama, yorumlardan/dizelerden arınmış kod
570
- görünümü üzerinde çalışır (TypeScript kuralları derleyici AST'sini
571
- kullanır): düz yazı yorumu içindeki veya doküman örnek dizesindeki bir
572
- örüntü, dokümantasyondur — bulgu değildir.
573
- - **Ölçülmüş, iddia edilmiş değil** — yalnızca gerçek OSS kodundan
574
- yanlış pozitif oranı olan kurallar başlık katmanlarına girer (bkz.
575
- [Ne kadarı ölçülmüş](#ne-kadarı-ölçülmüş)); tarama alt bilgisi ve
576
- `mjolnir rules --unmeasured` hangisinin ne olduğunu söyler.
577
- - **Eklenti güveni ve yürütme kapısı** — eklentiler `"plugins"` altında
578
- bildirilen npm paketleridir; JS modülleri `mjolnir-rules/*.mjs`
579
- içinde yaşar. **Sandbox yok**: eklenti kodu tam Node ayrıcalıklarıyla
580
- çalışır; ESLint veya Vitest eklentileriyle aynı güven modeli. Bu
581
- yüzden kod yürütme **her taramada opt-in**'dir: `--enable-plugins`
582
- geçirin (veya `MJOLNIR_ENABLE_PLUGINS=1` ayarlayın), yoksa kaynaklar
583
- YÜKLENMEZ — gürültülü bir stderr bildirimi atlananları tam olarak
584
- listeler. Güvenilmeyen kodu taramak onu asla çalıştırmaz. JSON kural
585
- bildirimleri (`mjolnir-rules/*.json`) etkilenmez: regex desenleri
586
- bildirirler ve tasarımları gereği hiçbir kod çalıştırmazlar. Çekirdek
587
- kural kimliği önekleri rezerve edilmiştir ve kimlik taklidini önlemek
588
- için eklentilerden ve dış kurallardan reddedilir.
589
- - **Workspace-yerel dış kurallar** (klasör tabanlı, sıfır ağ) — tarama
590
- hedefinin yanındaki bir `mjolnir-rules/` dizini özel kurallar yükler:
591
- JSON dosyaları regex örüntüleri bildirir (kod yürütülmez),
592
- `.mjs`/`.js` modülleri `rules` dışa aktarır (tam Node güveni,
593
- eklentiler gibi). Dış kurallar çekirdekle aynı güven üstverilerini
594
- taşır; asla çekirdek katmanına giremezler (çekirdek, corpus yan
595
- dosyasından ölçülmüş bir FP oranı gerektirir — bildirilen
596
- `tier: "core"`, `extended`'a sıkıştırılır), katman üst sınırlarına
597
- uyar ve sapma için denetlenir: `mjolnir rules --md --external`,
598
- kataloğu yüklenen dosyalardan görüntüler (kaynak `external`);
599
- matris üreteci `--external <root>` kabul eder.
600
-
601
- ---
602
-
603
- ## 🏗️ Mimari
540
+ | `0` | Temiz: kapı düzeyinde ya da üstünde bulgu yok |
541
+ | `1` | Kapı düzeyinde ya da üstünde bulgular |
542
+ | `2` | Kısmi tarama (zaman bütçesi doldu, okunamayan dosyalar). Asla engellemez. |
543
+ | `10` | Kullanım hatası (hatalı bayrak, eksik hedef) |
544
+ | `20` | Dahili hata |
604
545
 
605
- <details>
606
- <summary>Ağacı genişlet</summary>
546
+ `2` bilinçli olarak `0`'dan farklıdır: bitmeyen bir tarama "hiçbir şey bulmamış" değildir. Yalnızca aramayı bitirmemiştir.
607
547
 
608
- ```
609
- mjolnir/
610
- ├── src/
611
- │ ├── engine/ # LanguageAdapter interface + rule runner
612
- │ ├── adapters/ # typescript · python · java · csharp · github-actions
613
- │ ├── rules/ # rules across 8 families + the measured-FP table
614
- │ ├── playwright/ # Selector Health Score engine
615
- │ ├── discovery/ # workspace, frameworks, ignore resolution
616
- │ ├── scope/ # git merge-base changed-scope engine
617
- │ ├── scorer/ # transparent deduction table + prioritization
618
- │ ├── reporter/ # terminal · JSON · SARIF 2.1 · Mermaid
619
- │ ├── forensics/ # run-data ingestion · flake verdicts · triage
620
- │ ├── config/ # mjolnir.config.json + suppressions
621
- │ ├── plugins/ # third-party rule loading (no sandbox)
622
- │ └── commands/ # every subcommand
623
- └── tests/
624
- ├── fixtures/ # must-fire / must-not-fire per rule
625
- └── golden/ # frozen score regression locks
626
- ```
548
+ Bir makinenin tükettiği her şey (MCP araç sonuçları, `--json`, SARIF 2.1), sürümlü ve **yalnızca eklemeli** bir şema (`schemaVersion: 1`, `contractVersion: 1`) altındaki tek bir kanonik sonuçtan gelir; böylece hiçbir tüketici anlamı işlenmiş metinden yeniden kurmak zorunda kalmaz. Bkz. [makine sözleşmesi](docs/machine-contract.md). Kural kimlikleri (`QA-<FAMILY>-NNN`) yayımlandıktan sonra değiştirilemez ve asla yeniden kullanılmaz.
627
549
 
628
- </details>
550
+ <br />
629
551
 
630
- - **Kurallar saf fonksiyonlardır** — `(SourceFileContext) → Finding[]`,
631
- I/O yok, global yok. Yeni bir ekosistem = bir adaptör + onun
632
- kuralları.
633
- - **TypeScript/Playwright derleyici AST'sini kullanır** (ts-morph).
634
- Python, Java ve C#, maskeli yorum/dizeli paylaşılan bir regex
635
- katmanında çalışır.
636
- - Java ve C# için bir tree-sitter WASM AST katmanı mevcuttur ve bir
637
- sonraki hassasiyet adımıdır — henüz senkron tarama hattına bağlı
638
- değildir.
552
+ ## Mjölnir'in size söyleyemedikleri
639
553
 
640
- ---
554
+ - **Testlerinizi çalıştırmaz.** Temiz bir tarama, geçen bir test paketi demek değildir.
555
+ - **Bir doğrulamanın _yanlış_ olduğunu söyleyemez.** `expect(total).toBe(41)` sağlıklı görünür. Mjölnir yanlış şeyi denetleyen testleri değil, _başarısız olamayan_ testleri ve _kırmızıya dönemeyen_ pipeline'ları bulur.
556
+ - **İş doğruluğunu kanıtlamaz.** Buradaki hiçbir şey ürününüzün gereksinimin istediğini yaptığını söylemez.
557
+ - **100, iyi bir test paketinin kanıtı değildir.** Paketinizin gerçek riskinizi kapsayıp kapsamadığı ayrı bir sorudur ve bu araç onu yanıtlamaz.
558
+ - **79 kuraldan 5'i ölçülmüş bir orana değil, bir tahmine dayanır.** Her biri bunu kendi bulgusunda söyler.
559
+ - **E1, E2 değildir.** Sezgisel bulgular okunmaya değerdir, körü körüne uygulanmaya değil.
560
+ - **Boş bir depo `null` alır, asla 100 değil.**
561
+ - **Test bildirimi olmayan `*.spec.ts` adlı bir dosya kapsam sayılmaz.** Tek spec dosyaları import ya da tür içeren (sıfır `it`/`test` çağrısı) bir depo 100 değil, `null` alır.
641
562
 
642
- ## 📚 Belgelendirme
563
+ <br />
643
564
 
644
- | Belge | İçinde ne var |
645
- | ------------------------------------------------------ | ----------------------------------------------- |
646
- | [docs/SCORING.md](docs/SCORING.md) | Puan normalizasyonu + kanıt ağırlıklandırma |
647
- | [docs/FP-AUDIT.md](docs/FP-AUDIT.md) | Ölçülmüş yanlış pozitif oranları + yöntem |
648
- | [docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md) | Kural durumları, bastırma, kullanımdan kaldırma |
649
- | [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md) | SARIF çıktısı + düzenleyici/CI kurulumu |
650
- | [docs/rules/](docs/rules/) | Üretilmiş kural başına katalog |
651
- | [CONTRIBUTING.md](CONTRIBUTING.md) | Geliştirme kurulumu + katkı akışı |
652
- | [CHANGELOG.md](CHANGELOG.md) | Sürüm geçmişi |
653
- | [SECURITY.md](SECURITY.md) | Güvenlik açığı bildirimi |
565
+ ## Belgeler
654
566
 
655
- ---
567
+ Belgelerin tamamı <https://sergey-bar.github.io/Mjolnir/> adresindeki sitede.
656
568
 
657
- ## 📈 Durum
569
+ | Belge | İçeriği |
570
+ | ------------------------------------------------------ | ---------------------------------------------------------------- |
571
+ | [docs/SCORING.md](docs/SCORING.md) | Puan normalleştirme ve kanıt ağırlıklandırma |
572
+ | [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md) | Kanonik sözcük dağarcığı: kavram başına tek sözcük |
573
+ | [docs/FP-AUDIT.md](docs/FP-AUDIT.md) | Ölçülmüş yanlış pozitif oranları ve yöntem |
574
+ | [docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md) | Kural durumları, düzeyler, bastırma, kullanımdan kaldırma |
575
+ | [docs/VERSIONING.md](docs/VERSIONING.md) | Semver politikası, donmuş yüzeyler, kullanımdan kaldırma döngüsü |
576
+ | [docs/machine-contract.md](docs/machine-contract.md) | Kanonik, makine tarafından okunabilir sonuç |
577
+ | [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md) | SARIF çıktısı ve düzenleyici ya da CI kurulumu |
578
+ | [docs/GITLAB-CI.md](docs/GITLAB-CI.md) | GitLab: Code Quality raporu, MR tarifi, kapı |
579
+ | [docs/rules/](docs/rules/) | Kural başına üretilmiş katalog |
580
+ | [CONTRIBUTING.md](CONTRIBUTING.md) | Geliştirme ortamı ve katkı iş akışı |
581
+ | [SUPPORT.md](SUPPORT.md) | Nerede sorulur, bildirilir ve yardım alınır |
582
+ | [SECURITY.md](SECURITY.md) | Güvenlik açığı bildirimi |
583
+ | [CHANGELOG.md](CHANGELOG.md) | Sürüm geçmişi |
658
584
 
659
- **v0.5.x · açık beta.** JSON şeması ve çıkış kodları donmuş
660
- sözleşmelerdir. TypeScript ve Python en geniş ölçülmüş kapsama sahiptir;
661
- Java ve C# daha yenidir —
662
- [katman tablosu](#kural-katmanları-ve-dil-olgunluğu) üzerinden okuyun.
585
+ ### Durum
663
586
 
664
- ---
587
+ **Sürüm 1.** JSON şeması ve çıkış kodları donmuş sözleşmelerdir. TypeScript ve Python en geniş ölçülmüş kapsama sahiptir. Java ve C# daha yenidir; onları [olgunluk tablosu](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle) üzerinden değerlendirin. Sırada ne olduğu, uydurma tarihler olmadan: [herkese açık yol haritası](https://sergey-bar.github.io/Mjolnir/reference/roadmap).
665
588
 
666
- ## 🤝 Katkıda bulunma
589
+ ### Katkıda bulunma
667
590
 
668
- Yeni kurallar en kolay ilk katkıdır — tek komut, kuralı plus must-fire
669
- **ve** must-not-fire fixture'larıyla iskeletler (üretilen kural, gerçek
670
- algılama uygulayana dek fixture'larında kasıtlı olarak başarısız olur —
671
- bir stub sevk edilemez):
591
+ Yeni kurallar en kolay ilk katkıdır. Tek bir komut, kuralı must-fire **ve** must-not-fire fixture'larıyla birlikte iskelet olarak oluşturur. Üretilen kural, gerçek tespit yazılana kadar kendi fixture'larında bilerek başarısız olur; çünkü yayımlanan bir taslak, kimsenin ölçmediği bir kuraldır:
672
592
 
673
593
  ```bash
674
594
  mjolnir create-rule QA-PW-140 --title "Screenshot without diff bound"
675
595
  ```
676
596
 
677
- Tam geliştirme kurulumu, sürekli kapı komutları ve anti-creep /
678
- fixture duvarı yasaları [CONTRIBUTING.md](CONTRIBUTING.md) içindedir.
597
+ Geliştirme ortamı, kalıcı kapı komutları ve anti-creep ile fixture güvenlik duvarı yasaları [CONTRIBUTING.md](CONTRIBUTING.md) içindedir.
679
598
 
680
- ---
599
+ <br />
681
600
 
682
601
  <div align="center">
683
602
 
684
- **Güvenemediğiniz testleri sevk etmeyi bırakın.**
603
+ <img src="assets/readme/closing.svg" alt="Deponuzda çalıştırın." width="100%" />
685
604
 
686
605
  ```bash
687
606
  npx mjolnir-qa@latest
688
607
  ```
689
608
 
690
- **Star ⭐ · Watch 👀 · Contribute 🤝**
609
+ [Rehberi okuyun](https://sergey-bar.github.io/Mjolnir/guide/getting-started) · [Belge sitesi](https://sergey-bar.github.io/Mjolnir/) · [npm](https://www.npmjs.com/package/mjolnir-qa)
610
+
611
+ <br />
612
+
613
+ Testlerin geçip geçmediğini sormayın.<br />
614
+ Kanıtın, onların güveni hak ettiğini kanıtlayıp kanıtlamadığını sorun.
691
615
 
692
- [Sergey Bar](https://www.linkedin.com/in/sergeybar/) tarafından
693
- oluşturuldu
616
+ <sub>[Sergey Bar](https://www.linkedin.com/in/sergeybar/) tarafından geliştirildi · MIT lisanslı</sub>
694
617
 
695
618
  </div>