mjolnir-qa 5.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.pl.md DELETED
@@ -1,647 +0,0 @@
1
- <div align="center">
2
-
3
- <img src="assets/readme/hero.svg" alt="Mjölnir. Testy mówią ci, co przeszło. Mjölnir mówi ci, czemu możesz zaufać." width="100%" />
4
-
5
- <br />
6
-
7
- Mjölnir znajduje testy, które nie mogą zawieść, i pipeline'y, które nie mogą zrobić się czerwone,<br />
8
- a potem ocenia, na ile można ufać wynikowi, podając dowód dla każdego punktu.
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
- [Zobacz w działaniu](#zobacz-w-działaniu) · [Szybki start](#szybki-start) · [Co znajduje](#co-znajduje-mjölnir) · [Wynik](#wynik-wiarygodności) · [Dowody](#model-dowodów) · [Analiza przebiegów](#analiza-przebiegów-testów) · [CI](#integralność-ci) · [Agenci](#agenci-ai) · [Bezpieczeństwo](#zaufanie-i-bezpieczeństwo) · [Ograniczenia](#czego-mjölnir-nie-może-ci-powiedzieć) · [Dokumentacja](#dokumentacja)
25
-
26
- <details>
27
- <summary>Czytaj w innym języku — 22 tłumaczenia</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.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) | [العربية](README.ar.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
- ## Zielony znacznik to deklaracja, a nie dowód
56
-
57
- Zielony znacznik oznacza, że pipeline nie zawiódł. Nie oznacza, że testy się wykonały ani że mogły zawieść. Każdy z tych przypadków przechodzi na zielono:
58
-
59
- - zacommitowane `.only`, które uruchomiło 3 testy zamiast 900
60
- - `continue-on-error: true` na jobie, który miał blokować
61
- - `|| true` po poleceniu uruchamiającym testy
62
- - test, który niczego nie sprawdza albo ma puste ciało
63
- - wrapper ponawiający, który zamienia prawdziwą porażkę w szczęśliwe przejście
64
- - raport, który workflow wysyła, choć nigdy go nie wygenerował
65
- - sztywny sleep, który podtrzymuje wyścig
66
-
67
- Żaden z nich nie zmienia koloru pipeline'u na czerwony, a każdy w review wygląda na zamierzony. Właśnie dlatego przetrwają. Oto Mjölnir czytający prawdziwy przypadek:
68
-
69
- <p align="center">
70
- <img src="assets/readme/scan.svg" alt="Workflow CI repozytorium demonstracyjnego, czytany wiersz po wierszu. Mjölnir oznacza każde znalezisko w zgłoszonym wierszu, z jego regułą, opisem problemu, poziomem dowodu i zmierzonym odsetkiem fałszywych alarmów." width="800" />
71
- </p>
72
-
73
- <sub>Każde znalezisko, które skan demonstracyjny zgłosił dla tego workflow, w zgłoszonym wierszu. Wygenerowane przez `npm run docs:readme-brand` z [`demo-report.json`](assets/readme/demo-report.json) i zabezpieczone w CI przed rozjazdem.</sub>
74
-
75
- **Tryb ścisły.** Najbardziej agresywne wykrycia — `.only`, `continue-on-error`, puste testy, nadużywanie ponownych prób — żyją w poziomie kwarantanny. Działają tylko z `--strict` i są ograniczone do ważności `info`: oznaczają, ale nigdy nie blokują. Domyślne skanowanie (`npx mjolnir-qa@3.0.0` bez `--strict`) obejmuje tylko reguły rdzeniowe i rozszerzone. Dodaj `--strict`, gdy chcesz też warstwę doradczą.
76
-
77
- Mjölnir czyta zestaw testów, workflow CI oraz, jeśli go masz, raport z prawdziwego przebiegu. Nie uruchamia twoich testów, nie instaluje zależności ani nie wykonuje skanowanego kodu. A gdy nie ma dowodów, mówi to wprost, zamiast wymyślać pewność:
78
-
79
- | Sytuacja | Co zgłasza Mjölnir |
80
- | ----------------------------------------------- | ------------------------------------------------------------------ |
81
- | Nie znaleziono deklaracji testów | Wynik `null`, wyświetlany jako **UNKNOWN**. Nigdy zmyślone 100. |
82
- | Brak baseline'u lub porównywalnej rewizji | **UNKNOWN**, z podanym powodem. Nigdy założone 0. |
83
- | Skan przerwany (limit czasu, nieczytelne pliki) | **PARTIAL**, kod wyjścia `2`. Nigdy nie przedstawiany jako czysty. |
84
-
85
- <p align="center">
86
- <img src="assets/readme/how-it-works.svg" alt="Jak działa Mjölnir. Czyta statycznie zestaw testów i pipeline CI, a także raport z prawdziwego przebiegu, jeśli istnieje. Waży każde znalezisko według poziomu dowodu i poziomu zaufania, przy czym tylko prawdziwy przebieg może osiągnąć L3–L5, i zwraca znaleziska, wynik wiarygodności oraz bramkę CI z zamrożonymi kodami wyjścia. W pętli agenta AI pisze poprawkę, a Mjölnir skanuje ponownie, aby ją udowodnić." width="880" />
87
- </p>
88
-
89
- <sub>Przygotowane dla tej strony i pokazane w skali 1:1. Wygenerowane przez `npm run docs:readme-brand` i zabezpieczone w CI przed rozjazdem; wynik, liczby i ID reguły pochodzą z [`script.demo.json`](assets/video/script.demo.json), [`demo-report.json`](assets/readme/demo-report.json) i rejestru reguł, nigdy nie są wpisywane ręcznie. Ten sam obraz jako plakat: [`architecture.svg`](assets/readme/architecture.svg).</sub>
90
-
91
- <br />
92
-
93
- ## Zobacz w działaniu
94
-
95
- Prawdziwy skan [`examples/demo-repo`](examples/demo-repo), małego zestawu Playwright z workflow CI. Oto, gdzie poszły jego punkty:
96
-
97
- <p align="center">
98
- <img src="assets/readme/terminal-hero.svg" alt="Rozbicie potrąceń Mjölnira: WORTHINESS 80/100 WORTHY, wynik według kategorii, ramka potrąceń według ważności i lista FIX THIS FIRST" width="520" />
99
- </p>
100
-
101
- <sub>Wygenerowane przez `npm run docs:hero` z prawdziwego skanu i zabezpieczone w CI przed rozjazdem. Pełny raport `--verbose` z tego samego skanu to [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`).</sub>
102
-
103
- <details>
104
- <summary><strong>Obejrzyj</strong> — skan, poprawka, którą wypisuje, i ponowny skan, który ją potwierdza</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="Klatka nagrania demonstracyjnego: npx mjolnir-qa@3.0.0 skanuje repozytorium demonstracyjne w oknie terminala" width="900" />
111
- </a>
112
- </p>
113
-
114
- <sub>Wyrenderowane klatka po klatce z prawdziwego skanu przez `npm run docs:video`; nigdy nagrywane z ekranu. Wybierz klatkę, aby otworzyć [`mjolnir-demo.mp4`](assets/video/mjolnir-demo.mp4).</sub>
115
-
116
- </details>
117
-
118
- ### Jedno znalezisko z bliska
119
-
120
- Każde znalezisko odpowiada na cztery pytania: gdzie jest, jak pewny jest Mjölnir, jak często reguła się myli i jak to naprawić.
121
-
122
- <p align="center">
123
- <img src="assets/readme/finding-anatomy.svg" alt="Pierwsze znalezisko ze skanu demonstracyjnego, dokładnie tak, jak wypisuje je terminal, z oznaczonymi czterema częściami: gdzie, jak pewne, jak często reguła się myli, oraz poprawka." width="100%" />
124
- </p>
125
-
126
- `mjolnir explain QA-CI-001` wypisuje całą kartotekę zaufania reguły, w tym zmierzony odsetek fałszywych alarmów i poziom, który ten odsetek jej zapewnił:
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
- To jest jednostka wartości: jedno miejsce, w którym CI zgłasza przejście, na które nie zasłużyło.
173
-
174
- <br />
175
-
176
- ## Szybki start
177
-
178
- ```bash
179
- npx mjolnir-qa@3.0.0
180
- ```
181
-
182
- Skanuje bieżący katalog i wypisuje Trust Report: co znalazł, na ile możesz temu ufać, dlaczego i co zrobić dalej. Kończy się kodem `0`, gdy nie znaleziono niczego na poziomie bramki lub powyżej.
183
-
184
- W CI skanuj tylko to, co wprowadziła gałąź, aby stary zestaw testów nie zatopił twojego pierwszego pull requesta:
185
-
186
- ```bash
187
- npx mjolnir-qa@3.0.0 --scope changed
188
- ```
189
-
190
- `mjolnir ci install` zapisuje to jako workflow GitHub Actions, używając [akcji](https://github.com/Sergey-Bar/Mjolnir#readme) przypiętej do głównego tagu `v3` (albo zwykłego `npx` z `--no-action`). Pozostaje doradczy, dopóki nie zdecydujesz, że ma blokować.
191
-
192
- | Polecenie | Co robi |
193
- | --------------------------------------------- | ----------------------------------------------------------- |
194
- | `mjolnir` | Trust Report: werdykt, pewność, następny krok |
195
- | `mjolnir --scope changed` | Tylko to, co wprowadziła twoja gałąź (forma dla CI) |
196
- | `mjolnir ci install` | Generuje doradczy workflow dla PR (oparty na akcji) |
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` | Co, dlaczego i jak naprawić, plus zmierzony odsetek FP |
213
- | `mjolnir why src/a.spec.ts:42` | Dlaczego oznaczono dokładnie ten wiersz. Nigdy nie blokuje. |
214
- | `mjolnir forensics ./test-results/` | Dowody z prawdziwego przebiegu |
215
- | `mjolnir trust-report` | Samodzielny Trust Artifact (md + json) |
216
- | `mjolnir handoff` | Plan naprawy dla agenta kodującego |
217
- | `mjolnir --json` / `--format sarif` | Wyjście czytelne maszynowo, GitHub Code Scanning |
218
- | `mjolnir --format codequality` | Raport GitLab Code Quality (artefakt widżetu MR) |
219
- | `mjolnir --strict` | Uruchamia też reguły poziomu quarantine (wyższe ryzyko FP) |
220
-
221
- <details>
222
- <summary><strong>Wszystkie pozostałe polecenia</strong> — triaż niestabilnych testów, raportowanie, nadzór</summary>
223
-
224
- <br />
225
-
226
- | Polecenie | Co robi |
227
- | ----------------------------------- | --------------------------------------------------------------------------------------- |
228
- | `mjolnir --classic` | Baner wyniku sprzed Trust Reportu |
229
- | `mjolnir explain verdict` | Dlaczego werdykt zapisanego skanu jest taki, a nie inny |
230
- | `mjolnir triage ./test-results/` | Prowadzony triaż. Każdy wiersz kończy się następnym krokiem. |
231
- | `mjolnir pw-report ./test-results/` | Podsumowanie przebiegu Playwright: ponowienia, niestabilne testy, najwolniejsze |
232
- | `mjolnir doctor:playwright` | Głęboki skan tylko dla Playwright plus Selector Health Score |
233
- | `mjolnir fix --dry-run` / `fix` | Bezpieczne automatyczne poprawki, każda ponownie skanowana, by udowodnić, że zadziałała |
234
- | `mjolnir baseline` / `diff` | Zapisuje stan znalezisk, a potem zgłasza tylko nowe lub gorsze |
235
- | `mjolnir impact --since <ref>` | Co commit wprowadził i rozwiązał |
236
- | `mjolnir summary` | Adnotacje CI i podsumowanie kroku na podstawie raportu |
237
- | `mjolnir pr-comment` | Komentarz do PR o ograniczonym zakresie, w Markdown |
238
- | `mjolnir debt` | Rejestr długu testowego z modelem kosztów |
239
- | `mjolnir handover` | Mapa wdrożeniowa zestawu dla nowego inżyniera QA |
240
- | `mjolnir init` | Wykrywa frameworki, wypisuje listę kontrolną konfiguracji |
241
- | `mjolnir suppressions` | Wyświetla wyciszone znaleziska, na potrzeby nadzoru |
242
- | `mjolnir rules --unmeasured` | Reguły działające na założeniu, a nie na pomiarze |
243
- | `mjolnir rules --md` | Pełny katalog reguł (JSON lub Markdown) |
244
- | `mjolnir doctor` | Autoaudyt własnej bazy reguł Mjölnira |
245
- | `mjolnir create-rule <ID>` | Tworzy szkielet nowej reguły i jej fixture'ów |
246
- | `mjolnir stats` | Lokalne liczniki wszystkich widzianych poprawek |
247
- | `mjolnir badge` | JSON endpointu shields.io i fragment kodu |
248
- | `mjolnir --cache` | Przyrostowe ponowne skany dzięki lokalnej pamięci podręcznej werdyktów |
249
- | `mjolnir --format mermaid` | Diagram architektury testów do komentarza w PR |
250
-
251
- `mjolnir help <command>` wypisuje sposób użycia, przykłady i następny krok dla każdego z nich.
252
-
253
- </details>
254
-
255
- Wymaga **Node.js ≥ 22.18** w systemie Windows, macOS lub Linux. Wolisz instalację globalną? `npm i -g mjolnir-qa`. Minimalna wersja wynika z łańcucha budowania (tsdown ją obsługuje, a pipeline wydań wykonuje na niej testy dymne); zależności uruchomieniowe nie potrzebują nic więcej.
256
-
257
- <br />
258
-
259
- ## Co znajduje Mjölnir
260
-
261
- <p align="center">
262
- <img src="assets/readme/stack.svg" alt="Działa z twoim stosem: języki, frameworki testowe i systemy CI objęte jego regułami, według rejestru reguł." width="100%" />
263
- </p>
264
-
265
- **79 reguł** w czterech rodzinach — higiena testów, jakość testów, Playwright i integralność CI — dla TypeScript i JavaScript, Pythona, Javy, C# oraz YAML GitHub Actions. Obejmują Playwright we wszystkich czterech bindingach, a także pytest, JUnit, TestNG, NUnit, xUnit, MSTest, Jest, Vitest i Mocha, z początkowym wsparciem dla Cypress i Selenium. Dziewięć z nich, aby pokazać, jak to wygląda:
266
-
267
- | ID | Reguła | Ważność | Poziom |
268
- | ------------ | ------------------------------------------------------------------ | ------- | ---------- |
269
- | QA-CI-001 | `continue-on-error` maskuje zawodzącą bramkę weryfikacji | error | quarantine |
270
- | QA-CI-009 | Kod wyjścia testów nieprzekazany (`\|` bez pipefail, łańcuchy `;`) | error | extended |
271
- | QA-TEST-001 | Zacommitowany test z fokusem (`.only`, `fit`) | error | quarantine |
272
- | QA-TEST-003 | Test bez asercji | error | quarantine |
273
- | QA-TQUAL-009 | Asercja na promise bez await | error | quarantine |
274
- | QA-PW-002 | Asercja na lokatorze bez await | error | core |
275
- | QA-PW-004 | Kruche selektory CSS/XPath | warning | quarantine |
276
- | QA-PY-002 | Pominięty test (`skip`, nieścisły `xfail`) | warning | core |
277
- | QA-CS-103 | Metoda testowa bez asercji | error | core |
278
-
279
- Pełny katalog jest generowany z rejestru, nigdy nie jest utrzymywany ręcznie: `mjolnir rules --md`, [`docs/rules/`](docs/rules/) albo [przewodnik po tym, co sprawdza](https://sergey-bar.github.io/Mjolnir/guide/what-it-checks).
280
-
281
- <details>
282
- <summary><strong>Każda reguła wymieniona w tym README</strong>, w jednej tabeli</summary>
283
-
284
- <br />
285
-
286
- > Reguły `quarantine` działają tylko z `--strict` i nigdy nie blokują (są ograniczone do info). Pokazana ważność to ważność nadana przez autora.
287
-
288
- | ID | Rodzina | Reguła | Ważność | Poziom |
289
- | ------------ | ---------- | ----------------------------------------------------------- | ------- | ---------- |
290
- | QA-TEST-001 | Higiena | Zacommitowany test z fokusem (`.only`, `fit`) | error | quarantine |
291
- | QA-TEST-002 | Higiena | Pominięty test. Bez śledzonego powodu eskaluje do `error`. | warning | quarantine |
292
- | QA-TEST-003 | Higiena | Test bez asercji | error | quarantine |
293
- | QA-TEST-004 | Higiena | Sztywny sleep (`waitForTimeout`, `sleep()`, `delay()`) | warning | extended |
294
- | QA-TEST-006 | Higiena | Nadużywanie ponowień, które ukrywa niestabilność | warning | quarantine |
295
- | QA-TEST-010 | Higiena | Puste ciało testu | error | quarantine |
296
- | QA-TQUAL-002 | Jakość | Asercja tautologiczna | error | quarantine |
297
- | QA-TQUAL-009 | Jakość | Asercja na promise bez await | error | quarantine |
298
- | QA-TQUAL-011 | Jakość | Zakomentowane testy | warning | extended |
299
- | QA-PW-002 | Playwright | Asercja na lokatorze bez await | error | core |
300
- | QA-PW-003 | Playwright | Zacommitowane `page.pause()` / `test.only()` | error | core |
301
- | QA-PW-004 | Playwright | Kruche selektory CSS/XPath | warning | quarantine |
302
- | QA-PW-123 | Playwright | Zakodowane na sztywno adresy URL środowisk | warning | quarantine |
303
- | QA-PW-140 | Playwright | Zrzut ekranu bez `maxDiffPixelRatio` | warning | core |
304
- | QA-CI-001 | CI | `continue-on-error` maskuje zawodzącą bramkę | error | quarantine |
305
- | QA-CI-002 | CI | `\|\| true` połyka kody wyjścia | error | extended |
306
- | QA-CI-005 | CI | Raport używany, ale nigdy niegenerowany | error | quarantine |
307
- | QA-CI-007 | CI | Wrappery ponawiające wokół testów | warning | extended |
308
- | QA-CI-008 | CI | Krok, który zawsze się udaje, maskuje porażki | error | quarantine |
309
- | QA-CI-009 | CI | Kod wyjścia nieprzekazany (`\|` bez pipefail, łańcuchy `;`) | error | extended |
310
- | QA-CI-010 | CI | Testy pomijane tam, gdzie muszą blokować | error | quarantine |
311
- | QA-PY-002 | Python | Pominięty test (`skip`, nieścisły `xfail`) | warning | core |
312
- | QA-PY-003 | Python | Funkcja testowa bez asercji | error | quarantine |
313
- | QA-PY-005 | Python | `time.sleep()` w testach | warning | extended |
314
- | QA-PY-012 | Python | Asercja tautologiczna | error | quarantine |
315
- | QA-JV-101 | Java | Wyłączony test (`@Disabled`) | warning | core |
316
- | QA-JV-102 | Java | Sztywny sleep (`Thread.sleep()`) | warning | extended |
317
- | QA-JV-103 | Java | Metoda testowa bez asercji | error | extended |
318
- | QA-JV-105 | Java | Sztywny sleep przez `waitForTimeout()` w Playwright | warning | core |
319
- | QA-JV-106 | Java | Kruchy selektor zamiast lokatora opartego na roli | warning | quarantine |
320
- | QA-CS-101 | C# | Pominięty test (`[Ignore]`, `[Fact(Skip=)]`) | warning | core |
321
- | QA-CS-102 | C# | Sztywny sleep (`Thread.Sleep` / `Task.Delay`) | warning | core |
322
- | QA-CS-103 | C# | Metoda testowa bez asercji | error | core |
323
- | QA-CS-105 | C# | Sztywny sleep przez `WaitForTimeoutAsync()` | warning | extended |
324
- | QA-CS-106 | C# | Kruchy selektor zamiast lokatora opartego na roli | warning | quarantine |
325
-
326
- Python ma też reguły QA-PY-001…012 (higiena pytest) i QA-PY-101…108 (Playwright dla Pythona). Cypress i Selenium mają zestawy startowe po trzy reguły.
327
-
328
- </details>
329
-
330
- Każda reguła trafia do wydania z fixture'em must-fire **i** must-not-fire, a reguła, która odpala na własnym negatywnym fixture'ze, nie może zostać wydana. To zapora przed fałszywymi alarmami; `mjolnir doctor` egzekwuje ją we własnym CI tego repozytorium.
331
-
332
- ### Selector Health Score
333
-
334
- `mjolnir doctor:playwright` ocenia każdy lokator według tego, jak znajduje element: tak jak zrobiłby to użytkownik (rola, etykieta, tekst), przez jawny kontrakt (`data-testid`) lub przez przypadek strukturalny (łańcuchy CSS, XPath). Każdy plik dostaje wynik od 0 do 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
- To mierzy **odporność, a nie poprawność**. `.btn.btn-primary > div:nth-child(2)` przechodzi dziś i będzie przechodzić, dopóki ktoś nie ruszy znaczników. Niski wynik nigdy nie twierdzi, że test jest zepsuty, tylko że zależy od znaczników, których nikt nie obiecał zachować.
349
-
350
- <br />
351
-
352
- ## Wynik wiarygodności
353
-
354
- <p align="center">
355
- <img src="assets/readme/score-gauge.svg" alt="Skala wiarygodności od 0 do 100, ze znacznikiem przechodzącym przez każdy wynik: UNWORTHY poniżej 50, NEEDS WORK od 50 do 79, WORTHY od 80 do 99, FORGED przy 100" width="720" />
356
- </p>
357
-
358
- <sub>Każdy wynik od 0 do 100, umieszczony przez prawdziwe `deriveScoreState`. Wygenerowane przez `npm run docs:gauge` i zabezpieczone w CI przed rozjazdem.</sub>
359
-
360
- | Wynik | Werdykt |
361
- | --------- | --------------------------------------------- |
362
- | `0 – 49` | **UNWORTHY** |
363
- | `50 – 79` | **NEEDS WORK** |
364
- | `80 – 99` | **WORTHY** |
365
- | `100` | **FORGED** |
366
- | `null` | **UNKNOWN**: nie znaleziono deklaracji testów |
367
-
368
- **Jak jest liczony.** Ważność ustala potrącenie bazowe (`error −8`, `warning −3`, `info −1`), a poziom dowodu je obniża: E2 liczy się w całości, E1 w połowie (zaokrąglając w dół), E0 wcale. Suma jest normalizowana względem ekspozycji zestawu, czyli potrąceń na deklarację testu, a nie na plik. Terminal wypisuje te same obniżone liczby, których użył wynik; nie ma ukrytego drugiego modelu. Szczegóły: [docs/SCORING.md](docs/SCORING.md) i [przewodnik po wyniku](https://sergey-bar.github.io/Mjolnir/guide/scoring).
369
-
370
- **Czego 100 nie oznacza.** Nie oznacza, że oprogramowanie jest poprawne, zestaw testów wystarczający, a produkt wolny od defektów. Oznacza jedno: **żadna z reguł ocenionych przez Mjölnira nie dała potrącenia w tym skanie i przy tym modelu dowodów.**
371
-
372
- <br />
373
-
374
- ## Model dowodów
375
-
376
- Każde znalezisko ma dwie etykiety: jak pewny jest Mjölnir i jak daleko znalezisko zostało sprawdzone. To różnica między narzędziem, które zgłasza wzorce, a narzędziem, od którego możesz uzależnić wydanie.
377
-
378
- **Jak pewne — poziom dowodu.**
379
-
380
- | Poziom | Nazwa | Znaczenie | Potrącenie |
381
- | ------ | ---------------------- | -------------------------------------------------- | ---------- |
382
- | **E2** | Dowód deterministyczny | Defekt jest obecny w kodzie w obecnej postaci | Pełne |
383
- | **E1** | Dowód ze wzorca | Dopasował się wzorzec silnie związany z defektem | Połowa |
384
- | **E0** | Obserwacja | Warto wiedzieć. Nie twierdzi, że coś jest nie tak. | Zero |
385
-
386
- Pewność wykrycia to nie siła dowodu. Reguła może być pewna, że dopasowała to, czego szukała, a mimo to patrzeć na heurystykę. Znaleziska E1 są po to, by je czytać i oceniać, nigdy stosować na ślepo, a ta granica jest odciśnięta na znalezisku w terminalu, w JSON i w przekazaniu dla agenta.
387
-
388
- **Jak daleko sprawdzone — poziom zaufania.** Większość znalezisk pochodzi z czytania twojego kodu. Daj Mjölnirowi raport z prawdziwego przebiegu testów, a potwierdzi, że kod naprawdę się wykonał.
389
-
390
- <p align="center">
391
- <img src="assets/readme/trust-ladder.svg" alt="Drabina zaufania od L0 do L5. L0–L2 pochodzą z czytania kodu; L3–L5 wymagają raportu z prawdziwego przebiegu, co zaznacza przerwa w drabinie." width="100%" />
392
- </p>
393
-
394
- | Poziom | Po ludzku | Czego wymaga |
395
- | ------ | -------------------- | --------------------------------------------------------------- |
396
- | **L0** | Odnotowane | Czytanie kodu |
397
- | **L1** | Wygląda na problem | Czytanie kodu: dopasował się wzorzec |
398
- | **L2** | Udowodnione w kodzie | Czytanie kodu: defekt jest strukturalny |
399
- | **L3** | Plik się wykonał | Raport z przebiegu pokazuje, że plik znaleziska został wykonany |
400
- | **L4** | Test się wykonał | Raport z przebiegu pokazuje, że test znaleziska został wykonany |
401
- | **L5** | Przebieg się zgadza | Sam wynik przebiegu potwierdza klasę defektu |
402
-
403
- Skan statyczny kończy się na L2. Tylko raport z prawdziwego przebiegu (Playwright JSON, Jest lub Vitest JSON, JUnit XML) może podnieść znalezisko do L3 lub wyżej, więc znalezisko, którego nigdy nie widziano w działaniu, nigdy nie może twierdzić, że działało. Definicje: [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md).
404
-
405
- ### Ile z tego jest zmierzone
406
-
407
- **74 z 79 reguł ma odsetek fałszywych alarmów zmierzony na prawdziwym kodzie OSS** (co najmniej 10 ręcznie sklasyfikowanych znalezisk każda; zobacz [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Pozostałe 5 opiera się na szacunku autora i mówi to, reguła po regule, w `mjolnir explain`. `mjolnir rules --unmeasured` je wypisuje, a stopka każdego skanu podaje, ile z reguł, które faktycznie _odpaliły_, jest zmierzonych.
408
-
409
- Odsetki pozostają publiczne, także gdy są złe. QA-TEST-001 (zacommitowane `.only`) wypada słabo w audycie na prawdziwych repozytoriach i dlatego siedzi w quarantine. Aktualna liczba dla każdej reguły, łącznie z QA-PW-141, jest w audycie.
410
-
411
- ### Poziomy zaufania reguł
412
-
413
- Poziomy wynikają ze zmierzonego odsetka fałszywych alarmów, nie z opinii:
414
-
415
- | Poziom | Zmierzone FP | Zachowanie |
416
- | -------------- | ------------------------------ | --------------------------------------------------------- |
417
- | **core** | ≤ 10% | Raport domyślny, blokuje |
418
- | **extended** | ≤ 30% | Raport domyślny, niższa pewność |
419
- | **quarantine** | > 30% lub jawnie zadeklarowane | Tylko `--strict`, ograniczone do info, nigdy nie blokuje |
420
- | _niezmierzona_ | n < 10 | Nie może awansować do core, dopóki nie zostanie zmierzona |
421
-
422
- Pasma FP mogą tylko obniżyć poziom — nigdy nie promują reguły z `quarantine`, jeśli została tam jawnie zadeklarowana. Jawna reguła w quarantine pozostaje w quarantine niezależnie od zmierzonego wskaźnika FP.
423
-
424
- Awans, degradacja i dojrzałość według języka: [cykl życia reguł](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle).
425
-
426
- ### Dlaczego to nie jest linter
427
-
428
- Lintery mówią ci, czy kod przestrzega reguł. Mjölnir mówi ci, czy twojej weryfikacji można ufać.
429
-
430
- | | Lintery (ESLint, SonarQube) | Narzędzia pokrycia | Code review z AI | **Mjölnir** |
431
- | ---------------------------------------------------------------- | :-------------------------: | :----------------: | :--------------: | :-----------------: |
432
- | Ocenia **system weryfikacji**, a nie kod produktu | Nie | Nie | Nie | Tak |
433
- | Integralność workflow CI (`continue-on-error`, `\|\| true`) | Nie | Nie | tylko diff | Tak |
434
- | Ocenia odporność lokatorów Playwright (Selector Health) | Nie | Nie | Nie | Tak |
435
- | Czyta prawdziwe dane z przebiegów dla werdyktów `TRUE-FLAKE` | Nie | Nie | Nie | Tak |
436
- | Publikuje zmierzony odsetek fałszywych alarmów dla każdej reguły | Nie | Nie | Nie | Tak |
437
- | Oznacza testy bez asercji | Tak\* | Nie | czasem | Tak |
438
- | Wyłapuje sztywne sleepy (`waitForTimeout`, `time.sleep`) | Tak\* | Nie | czasem | Tak |
439
- | Deterministyczny (to samo wejście, to samo wyjście) | Tak | Tak | Nie | Tak |
440
- | Koszt skanu | za darmo | za darmo | tokeny | **zero** (lokalnie) |
441
-
442
- <sub>\*Pokryte przez `eslint-plugin-jest` i `eslint-plugin-playwright` (`expect-expect`, `no-wait-for-timeout`) oraz przez własne reguły asercji SonarQube. Kolumny opisują domyślne zachowanie przy weryfikacji zestawów testów; wtyczki, płatne plany i własne reguły zmieniają niektóre odpowiedzi. To podsumowanie pozycjonowania, a nie benchmark.</sub>
443
-
444
- Korzystaj też z review z AI. Wychwytuje niuanse, intencje i wady projektowe, których żaden wzorzec nie znajdzie. Mjölnir wychwytuje to, co review z AI przeoczy, bo wygląda na zamierzone: zacommitowane `.only`, połknięty kod wyjścia, `continue-on-error` na jobie testowym. To wymaga skanowania, nie rozumowania.
445
-
446
- <br />
447
-
448
- ## Analiza przebiegów testów
449
-
450
- Analiza statyczna rozumuje o kodzie, który nigdy się nie wykonał. Analiza przebiegów czyta to, co faktycznie się stało: Playwright JSON, Jest JSON, Vitest JSON i JUnit XML z dowolnego runnera.
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` nie oznacza, że test był ponawiany. Oznacza, że test **zawiódł przynajmniej jedną próbę, a potem zakończył się na zielono**: szczęśliwe przejście, oznaczone bez względu na to, co mówi końcowy znacznik. `mjolnir triage` zamienia tę historię w propozycję kwarantanny, a `mjolnir pw-report` podsumowuje przebieg. To te same raporty z przebiegów podnoszą znaleziska do poziomów zaufania L3 i wyżej.
468
-
469
- <br />
470
-
471
- ## Integralność CI
472
-
473
- Test może przechodzić, podczas gdy pipeline wokół niego nie może zawieść. Mjölnir czyta też workflow: `continue-on-error`, `|| true`, kody wyjścia, które nigdy się nie propagują, kroki zawsze kończące się sukcesem, raporty używane, ale nigdy niegenerowane, oraz bramki pomijane przy zdarzeniach, które powinny blokować. Każde znalezisko wskazuje job, krok i wiersz oraz ma własny poziom dowodu.
474
-
475
- Wygeneruj workflow dla PR, domyślnie doradczy:
476
-
477
- ```bash
478
- mjolnir ci install
479
- ```
480
-
481
- Albo dodaj akcję z Marketplace do workflow, który już masz:
482
-
483
- ```yaml
484
- - uses: Sergey-Bar/Mjolnir@v3
485
- with:
486
- scope: changed
487
- fail-on: error
488
- ```
489
-
490
- Przypnij `@v3`, aby podążać za główną linią, albo dokładny tag (`@v0.5.32`) dla powtarzalnej bramki. [docs/DISTRIBUTION-KIT.md](docs/DISTRIBUTION-KIT.md) opisuje Marketplace, Smithery i rejestry MCP.
491
-
492
- Aby umieścić znaleziska w GitHub Code Scanning, wyślij SARIF (wymaga `security-events: write` na poziomie workflow lub 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
- W GitLab `--format codequality` zapisuje raport Code Quality, który czytają widżet MR i adnotacje diffu ([docs/GITLAB-CI.md](docs/GITLAB-CI.md)). Konfiguracja edytora i pipeline'u: [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md).
504
-
505
- ### Przypisanie w zakresie zmian
506
-
507
- ```bash
508
- npx mjolnir-qa@3.0.0 --scope changed
509
- ```
510
-
511
- Znaleziska są przypisywane do wierszy dodanych przez twoją gałąź, liczonych względem **merge-base**. Zakres to ten sam zbiór plików, który odkrywa pełny skan (specyfikacje TS/JS i konfiguracje adapterów, `test_*.py`, `*Test.java`, `*Tests.cs`, `.github/workflows/*.yml`), plus niezacommitowane i nieśledzone zmiany, więc działa jeszcze przed commitem. Baza jest rozwiązywana w kolejności `main → master → origin/main → origin/master → origin/HEAD`; możesz ją nadpisać przez `--base <ref>`.
512
-
513
- Gdy merge-base nie da się rozwiązać (płytki klon, odłączony HEAD, cel poza git), znaleziska wracają do przypisania do całego pliku **i raport to mówi.** Ciche przejście na tryb awaryjny byłoby dokładnie tym rodzajem defektu, dla którego wykrywania istnieje to narzędzie.
514
-
515
- <br />
516
-
517
- ## Agenci AI
518
-
519
- Znaleziska są coś warte tylko wtedy, gdy coś na nie reaguje.
520
-
521
- ```text
522
- SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
523
- ```
524
-
525
- **AI pisze poprawkę. Mjölnir ją weryfikuje.** Dowód pochodzi z ponownego skanu, nigdy z własnego raportu agenta o sukcesie.
526
-
527
- | Polecenie | Co dostaje agent |
528
- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
529
- | `mjolnir mcp` | Serwer [MCP](https://modelcontextprotocol.io) przez stdio. `scan`, `explain` i `diff` stają się narzędziami do wywołania. |
530
- | `mjolnir handoff` | Zapisany raport `--json` staje się deterministycznym planem w Markdown: co wykryto, granica dowodu dla każdego znaleziska, co **nie** może się zmienić, jak to zweryfikować. |
531
- | `mjolnir install` | Zapisuje w miejscach dla agentów, które twoje repo już ma (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`), aby agent skanował ponownie, zanim oświadczy, że skończył. |
532
-
533
- Dodaj go do klienta, który ma własne CLI:
534
-
535
- ```bash
536
- claude mcp add mjolnir -- npx -y mjolnir-qa@3.0.0 mcp
537
- ```
538
-
539
- Albo do dowolnego klienta, który przyjmuje blok `mcpServers`:
540
-
541
- ```json
542
- {
543
- "mcpServers": {
544
- "mjolnir": { "command": "npx", "args": ["-y", "mjolnir-qa@3.0.0", "mcp"] }
545
- }
546
- }
547
- ```
548
-
549
- **Zabezpieczenie jest ważniejsze niż wygoda.** Każde znalezisko w przekazaniu niesie swoją granicę. **E2** mówi _deterministyczne: sprawdź lokalizację i zastosuj poprawkę_. **E1** mówi _WYMAGA POTWIERDZENIA: sama obserwacja nie dowodzi defektu_. Agent, który na ślepo naprawia E1, wycisza regułę albo edytuje regułę, by podnieść wynik, robi dokładnie to, dla czego wykrywania istnieje to narzędzie, więc przekazanie mówi to w prompcie, obok znaleziska.
550
-
551
- <br />
552
-
553
- ## Zaufanie i bezpieczeństwo
554
-
555
- **Najpierw lokalnie, zero telemetrii.** W `src/` nie ma nigdzie żadnego API zdolnego do komunikacji sieciowej (`fetch`, `http`, `https`, `net`, `dns`, `dgram`, WebSocket), a [`privacy-network-isolation.spec.ts`](tests/contract/privacy-network-isolation.spec.ts) przerywa build, jeśli któreś się pojawi. Zakazuje też `eval` i `new Function`. Skanowanie niezaufanego kodu nigdy go nie wykonuje: analiza statyczna czyta tekst źródłowy, a analiza przebiegów parsuje pliki raportów, które już są na dysku.
556
-
557
- Dwa zastrzeżenia: samo `npx` pobiera pakiet, zanim cokolwiek się uruchomi, a gwarancja obejmuje `src/`, nie wtyczki firm trzecich.
558
-
559
- **Wtyczki nie działają w piaskownicy.** Wtyczki JS (`mjolnir-rules/*.mjs` lub pakiety npm wymienione w `"plugins"`) działają z pełnymi uprawnieniami Node, w tym samym modelu zaufania co wtyczki ESLint czy Vitest. Ich ładowanie wymaga świadomej zgody **dla każdego skanu**: bez `--enable-plugins` (lub `MJOLNIR_ENABLE_PLUGINS=1`) ich źródła nigdy nie są ładowane, a komunikat na stderr wymienia, co pominięto. Manifesty reguł w JSON nie wykonują kodu, a prefiksy ID reguł core są zarezerwowane, aby żadna wtyczka nie mogła się pod nie podszyć. Zgłaszaj podatności przez [SECURITY.md](SECURITY.md).
560
-
561
- **Działa na sobie samym.** Silnik zaufania do weryfikacji nie ma wiarygodności, jeśli sam nie jest weryfikowalny. Każdy przebieg CI skanuje to repozytorium buildem wytworzonym w tym samym przebiegu. Bramka zawodzi przy każdym znalezisku o ważności error, a także przy **częściowym** skanie lub **regule, która się wysypała**, bo ucięty autoskan, który niczego nie zgłasza, to właśnie fałszywa zieleń, dla której wykrywania istnieje ten projekt. `mjolnir doctor` w tym samym przebiegu ponownie audytuje bazę reguł (zapora fixture'ów, uczciwość poziomów, limit poziomu core), a kontrola z wynikiem INCONCLUSIVE zawodzi dokładnie tak jak nieudana. Oba raporty są wysyłane jako artefakty buildu.
562
-
563
- ### Kody wyjścia i kontrakt maszynowy
564
-
565
- Zamrożone, więc możesz budować na nich logikę CI:
566
-
567
- | Kod wyjścia | Znaczenie |
568
- | ----------- | -------------------------------------------------------------------------------- |
569
- | `0` | Czysto: brak znalezisk na poziomie bramki lub powyżej |
570
- | `1` | Znaleziska na poziomie bramki lub powyżej |
571
- | `2` | Częściowy skan (przekroczony limit czasu, nieczytelne pliki). Nigdy nie blokuje. |
572
- | `10` | Błąd użycia (zła flaga, brak celu) |
573
- | `20` | Błąd wewnętrzny |
574
-
575
- `2` celowo różni się od `0`: skan, który się nie zakończył, nie znalazł „niczego”. On po prostu nie skończył szukać.
576
-
577
- Wszystko, co konsumuje maszyna (wyniki narzędzi MCP, `--json`, SARIF 2.1), pochodzi z jednego kanonicznego wyniku w wersjonowanym schemacie, **rozszerzanym wyłącznie addytywnie** (`schemaVersion: 1`, `contractVersion: 1`), więc żaden konsument nie musi odtwarzać znaczenia z wyrenderowanego tekstu. Zobacz [kontrakt maszynowy](docs/machine-contract.md). ID reguł (`QA-<FAMILY>-NNN`) są niezmienne po wydaniu i nigdy nie są używane ponownie.
578
-
579
- <br />
580
-
581
- ## Czego Mjölnir nie może ci powiedzieć
582
-
583
- - **Nie uruchamia twoich testów.** Czysty skan to nie przechodzący zestaw testów.
584
- - **Nie powie ci, że asercja jest _błędna_.** `expect(total).toBe(41)` wygląda zdrowo. Mjölnir znajduje testy, które _nie mogą zawieść_, i pipeline'y, które _nie mogą zrobić się czerwone_, a nie testy, które sprawdzają niewłaściwą rzecz.
585
- - **Nie dowodzi poprawności biznesowej.** Nic tutaj nie mówi, że twój produkt robi to, czego wymagało wymaganie.
586
- - **100 nie jest dowodem dobrego zestawu testów.** To, czy twój zestaw pokrywa realne ryzyko, to inne pytanie, a to narzędzie na nie nie odpowiada.
587
- - **5 z 79 reguł opiera się na szacunku**, a nie na zmierzonym odsetku. Każda z nich mówi to na własnym znalezisku.
588
- - **E1 to nie E2.** Znaleziska heurystyczne warto czytać, ale nie warto stosować na ślepo.
589
- - **Puste repo dostaje `null`, nigdy 100.**
590
- - **Plik o nazwie `*.spec.ts` bez deklaracji testów nie liczy się jako pokrycie.** Repo, którego jedyne pliki spec zawierają importy lub typy (zero wywołań `it`/`test`), dostaje `null`, a nie 100.
591
-
592
- <br />
593
-
594
- ## Dokumentacja
595
-
596
- Pełna strona dokumentacji jest pod adresem <https://sergey-bar.github.io/Mjolnir/>.
597
-
598
- | Dokument | Co zawiera |
599
- | ------------------------------------------------------ | ----------------------------------------------------- |
600
- | [docs/SCORING.md](docs/SCORING.md) | Normalizacja wyniku i ważenie dowodów |
601
- | [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md) | Kanoniczne słownictwo: jedno słowo na pojęcie |
602
- | [docs/FP-AUDIT.md](docs/FP-AUDIT.md) | Zmierzone odsetki fałszywych alarmów i metoda |
603
- | [docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md) | Stany reguł, poziomy, wyciszanie, wycofywanie |
604
- | [docs/VERSIONING.md](docs/VERSIONING.md) | Zasady semver, zamrożone interfejsy, cykl wycofywania |
605
- | [docs/machine-contract.md](docs/machine-contract.md) | Kanoniczny wynik czytelny maszynowo |
606
- | [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md) | Wyjście SARIF i konfiguracja edytora lub CI |
607
- | [docs/GITLAB-CI.md](docs/GITLAB-CI.md) | GitLab: raport Code Quality, przepis na MR, bramka |
608
- | [docs/rules/](docs/rules/) | Generowany katalog reguł |
609
- | [CONTRIBUTING.md](CONTRIBUTING.md) | Środowisko deweloperskie i proces kontrybucji |
610
- | [SUPPORT.md](SUPPORT.md) | Gdzie pytać, zgłaszać i szukać pomocy |
611
- | [SECURITY.md](SECURITY.md) | Zgłaszanie podatności |
612
- | [CHANGELOG.md](CHANGELOG.md) | Historia wydań |
613
-
614
- ### Status
615
-
616
- **Wersja 1.** Schemat JSON i kody wyjścia są zamrożonymi kontraktami. TypeScript i Python mają najszersze zmierzone pokrycie. Java i C# są nowsze; czytaj je przez [tabelę dojrzałości](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle). Co dalej, bez wymyślonych dat: [publiczna mapa drogowa](https://sergey-bar.github.io/Mjolnir/reference/roadmap).
617
-
618
- ### Współtworzenie
619
-
620
- Nowe reguły to najłatwiejszy pierwszy wkład. Jedno polecenie tworzy szkielet reguły z jej fixture'ami must-fire **i** must-not-fire. Wygenerowana reguła celowo nie przechodzi własnych fixture'ów, dopóki nie zostanie napisane prawdziwe wykrywanie, bo wydany szkielet to reguła, której nikt nie zmierzył:
621
-
622
- ```bash
623
- mjolnir create-rule QA-PW-140 --title "Screenshot without diff bound"
624
- ```
625
-
626
- Środowisko deweloperskie, polecenia stałych bramek oraz prawa anti-creep i zapory fixture'ów są opisane w [CONTRIBUTING.md](CONTRIBUTING.md).
627
-
628
- <br />
629
-
630
- <div align="center">
631
-
632
- <img src="assets/readme/closing.svg" alt="Uruchom go na swoim repo." width="100%" />
633
-
634
- ```bash
635
- npx mjolnir-qa@3.0.0
636
- ```
637
-
638
- [Przeczytaj przewodnik](https://sergey-bar.github.io/Mjolnir/guide/getting-started) · [Strona dokumentacji](https://sergey-bar.github.io/Mjolnir/) · [npm](https://www.npmjs.com/package/mjolnir-qa)
639
-
640
- <br />
641
-
642
- Nie pytaj, czy testy przeszły.<br />
643
- Zapytaj, czy dowody potwierdzają, że zasługują na zaufanie.
644
-
645
- <sub>Stworzone przez [Sergey Bar](https://www.linkedin.com/in/sergeybar/) · Licencja MIT</sub>
646
-
647
- </div>