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.da.md DELETED
@@ -1,647 +0,0 @@
1
- <div align="center">
2
-
3
- <img src="assets/readme/hero.svg" alt="Mjölnir. Tests fortæller dig, hvad der bestod. Mjölnir fortæller dig, hvad du kan stole på." width="100%" />
4
-
5
- <br />
6
-
7
- Mjölnir finder tests, der ikke kan fejle, og pipelines, der ikke kan blive røde,<br />
8
- og vurderer derefter, hvor langt resultatet er til at stole på, med beviset for hvert point.
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
- [Se det i aktion](#se-det-i-aktion) · [Kom hurtigt i gang](#kom-hurtigt-i-gang) · [Hvad det finder](#hvad-mjölnir-finder) · [Score](#worthiness-scoren) · [Evidens](#evidensmodellen) · [Kørselsanalyse](#kørselsanalyse) · [CI](#ci-integritet) · [Agenter](#ai-agenter) · [Sikkerhed](#tillid-og-sikkerhed) · [Grænser](#hvad-mjölnir-ikke-kan-fortælle-dig) · [Dokumentation](#dokumentation)
25
-
26
- <details>
27
- <summary>Læs på et andet sprog — 22 oversættelser</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.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](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
- ## Et grønt flueben er en påstand, ikke et bevis
56
-
57
- Et grønt flueben betyder, at pipelinen ikke fejlede. Det betyder ikke, at testene kørte, eller at de kunne have fejlet. Hver eneste af disse går grønt igennem:
58
-
59
- - en committet `.only`, der kørte 3 tests i stedet for 900
60
- - `continue-on-error: true` på det job, der skulle have blokeret
61
- - `|| true` efter testkommandoen
62
- - en test, der ikke tjekker noget, eller som har en tom krop
63
- - en retry-wrapper, der gør en reel fejl til et heldigt bestået
64
- - en rapport, som workflowet uploader, men aldrig har genereret
65
- - et fast sleep, der holder sammen på en race condition
66
-
67
- Ingen af dem gør pipelinen rød, og hver af dem ser tilsigtet ud i review. Det er derfor, de overlever. Her læser Mjölnir et rigtigt eksempel:
68
-
69
- <p align="center">
70
- <img src="assets/readme/scan.svg" alt="Demo-repositoriets CI-workflow, læst linje for linje. Mjölnir markerer hvert fund på den rapporterede linje, med dets regel, hvad der er galt, dets evidensniveau og dets målte falsk-positiv-rate." width="800" />
71
- </p>
72
-
73
- <sub>Hvert fund, som demo-scannet rapporterede for dette workflow, på den rapporterede linje. Genereret af `npm run docs:readme-brand` ud fra [`demo-report.json`](assets/readme/demo-report.json) og låst mod afvigelser i CI.</sub>
74
-
75
- **Streng tilstand.** De mest aggressive registreringer — `.only`, `continue-on-error`, tomme tests, misbrug af genkørsler — lever i karantænelaget. De kører kun med `--strict` og er begrænset til `info`-alvorlighed: de flagger, de blokerer aldrig. Standardscanningen (`npx mjolnir-qa@3.0.0` uden `--strict`) dækker kun kerne- og udvidede regler. Tilføj `--strict` når du også vil have rådgivningslaget.
76
-
77
- Mjölnir læser testsuiten, CI-workflowene og, hvis du har en, rapporten fra en rigtig kørsel. Det kører ikke dine tests, installerer ikke dine afhængigheder og udfører ikke den kode, det scanner. Og når det ikke har evidens, siger det det i stedet for at opfinde tillid:
78
-
79
- | Situation | Hvad Mjölnir rapporterer |
80
- | -------------------------------------------- | ----------------------------------------------------------- |
81
- | Ingen testdeklarationer fundet | Score `null`, vist som **UNKNOWN**. Aldrig et opdigtet 100. |
82
- | Ingen baseline eller sammenlignelig revision | **UNKNOWN**, med årsagen angivet. Aldrig et antaget 0. |
83
- | Scan afbrudt (tidsbudget, ulæselige filer) | **PARTIAL**, exit `2`. Aldrig præsenteret som rent. |
84
-
85
- <p align="center">
86
- <img src="assets/readme/how-it-works.svg" alt="Sådan virker Mjölnir. Det læser testsuiten og CI-pipelinen statisk, og rapporten fra en rigtig kørsel, når der er en. Det vægter hvert fund efter dets evidensniveau og tillidsniveau, hvor kun en rigtig kørsel kan nå L3 til L5, og leverer fund, en worthiness-score og en CI-gate med fastfrosne exitkoder. I agent-loopet skriver AI rettelsen, og Mjölnir scanner igen for at bevise den." width="880" />
87
- </p>
88
-
89
- <sub>Komponeret til denne side og vist i 1:1. Genereret af `npm run docs:readme-brand` og låst mod afvigelser i CI; score, antal og regel-ID kommer fra [`script.demo.json`](assets/video/script.demo.json), [`demo-report.json`](assets/readme/demo-report.json) og regelregistret, aldrig tastet ind i hånden. Samme billede som plakat: [`architecture.svg`](assets/readme/architecture.svg).</sub>
90
-
91
- <br />
92
-
93
- ## Se det i aktion
94
-
95
- Et rigtigt scan af [`examples/demo-repo`](examples/demo-repo), en lille Playwright-suite med et CI-workflow. Her er, hvor dens point forsvandt hen:
96
-
97
- <p align="center">
98
- <img src="assets/readme/terminal-hero.svg" alt="Mjölnirs opgørelse af fradrag: WORTHINESS 80/100 WORTHY, scoren pr. kategori, fradragsboksen pr. alvorlighed og en FIX THIS FIRST-liste" width="520" />
99
- </p>
100
-
101
- <sub>Genereret af `npm run docs:hero` ud fra et rigtigt scan og låst mod afvigelser i CI. Den fulde `--verbose`-rapport fra samme scan er [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`).</sub>
102
-
103
- <details>
104
- <summary><strong>Se det</strong> — et scan, rettelsen det udskriver, og det nye scan, der beviser den</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="Et billede fra demo-optagelsen: npx mjolnir-qa@3.0.0 scanner demo-repositoriet i et terminalvindue" width="900" />
111
- </a>
112
- </p>
113
-
114
- <sub>Renderet billede for billede ud fra et rigtigt scan af `npm run docs:video`; aldrig optaget fra skærmen. Vælg billedet for at åbne [`mjolnir-demo.mp4`](assets/video/mjolnir-demo.mp4).</sub>
115
-
116
- </details>
117
-
118
- ### Ét fund helt tæt på
119
-
120
- Hvert fund besvarer fire spørgsmål: hvor det er, hvor sikker Mjölnir er, hvor ofte reglen tager fejl, og hvordan det rettes.
121
-
122
- <p align="center">
123
- <img src="assets/readme/finding-anatomy.svg" alt="Det første fund fra demo-scannet, præcis som terminalen udskriver det, med dets fire dele markeret: hvor, hvor sikkert, hvor ofte reglen tager fejl, og rettelsen." width="100%" />
124
- </p>
125
-
126
- `mjolnir explain QA-CI-001` udskriver en regels samlede tillidsprofil, inklusive dens målte falsk-positiv-rate og det niveau, raten har givet den:
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
- Det er værdienheden: ét sted, hvor CI rapporterer et bestået, den ikke har gjort sig fortjent til.
173
-
174
- <br />
175
-
176
- ## Kom hurtigt i gang
177
-
178
- ```bash
179
- npx mjolnir-qa@3.0.0
180
- ```
181
-
182
- Det scanner den aktuelle mappe og udskriver Trust Report: hvad det fandt, hvor langt du kan stole på det, hvorfor, og hvad du skal gøre nu. Det afslutter med `0`, når intet på eller over gaten blev fundet.
183
-
184
- I CI skal du kun scanne det, grenen har tilføjet, så en ældre testsuite ikke drukner din første pull request:
185
-
186
- ```bash
187
- npx mjolnir-qa@3.0.0 --scope changed
188
- ```
189
-
190
- `mjolnir ci install` skriver det som et GitHub Actions-workflow med [action'en](https://github.com/Sergey-Bar/Mjolnir#readme) fastlåst til major-tagget `v3` (eller rent `npx` med `--no-action`). Det forbliver rådgivende, indtil du beslutter, at det skal blokere.
191
-
192
- | Kommando | Hvad den gør |
193
- | --------------------------------------------- | --------------------------------------------------------- |
194
- | `mjolnir` | Trust Report: dom, sikkerhed, næste handling |
195
- | `mjolnir --scope changed` | Kun det, din gren har tilføjet (CI-formen) |
196
- | `mjolnir ci install` | Generér det rådgivende PR-workflow (action-baseret) |
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` | Hvad, hvorfor og rettelse, plus den målte FP-rate |
213
- | `mjolnir why src/a.spec.ts:42` | Hvorfor netop denne linje blev markeret. Blokerer aldrig. |
214
- | `mjolnir forensics ./test-results/` | Kørselsevidens fra en rigtig kørsel |
215
- | `mjolnir trust-report` | Selvstændigt Trust-artefakt (md + json) |
216
- | `mjolnir handoff` | Udbedringsplan til en kodeagent |
217
- | `mjolnir --json` / `--format sarif` | Maskinlæsbart output, GitHub Code Scanning |
218
- | `mjolnir --format codequality` | GitLab Code Quality-rapport (MR-widget-artefakt) |
219
- | `mjolnir --strict` | Kør også regler på quarantine-niveau (højere FP-risiko) |
220
-
221
- <details>
222
- <summary><strong>Alle andre kommandoer</strong> — triage af ustabile tests, rapportering, governance</summary>
223
-
224
- <br />
225
-
226
- | Kommando | Hvad den gør |
227
- | ----------------------------------- | ------------------------------------------------------------------------- |
228
- | `mjolnir --classic` | Scorebanneret fra før Trust Report |
229
- | `mjolnir explain verdict` | Hvorfor dommen for det gemte scan er, som den er |
230
- | `mjolnir triage ./test-results/` | Guidet triage. Hver række ender med en næste handling. |
231
- | `mjolnir pw-report ./test-results/` | Opsummering af Playwright-kørsel: retries, ustabile tests, de langsomste |
232
- | `mjolnir doctor:playwright` | Dybdescan kun for Playwright plus Selector Health Score |
233
- | `mjolnir fix --dry-run` / `fix` | Sikre autorettelser, hver scannet igen for at bevise, at den virkede |
234
- | `mjolnir baseline` / `diff` | Gem et øjebliksbillede af fund, og rapportér derefter kun nye eller værre |
235
- | `mjolnir impact --since <ref>` | Hvad et commit tilføjede og løste |
236
- | `mjolnir summary` | CI-annoteringer og en step-opsummering ud fra en rapport |
237
- | `mjolnir pr-comment` | En afgrænset PR-kommentar, som Markdown |
238
- | `mjolnir debt` | Register over testgæld med en omkostningsmodel |
239
- | `mjolnir handover` | Introduktionskort over suiten til en ny QA-ingeniør |
240
- | `mjolnir init` | Find frameworks, udskriv en tjekliste til opsætning |
241
- | `mjolnir suppressions` | List undertrykte fund, til governance |
242
- | `mjolnir rules --unmeasured` | De regler, der kører på antagelser, ikke målinger |
243
- | `mjolnir rules --md` | Fuldt regelkatalog (JSON eller Markdown) |
244
- | `mjolnir doctor` | Selvrevision af Mjölnirs egen regelbase |
245
- | `mjolnir create-rule <ID>` | Opret skelettet til en ny regel og dens fixtures |
246
- | `mjolnir stats` | Lokale tællere over alle rettelser, der nogensinde er set |
247
- | `mjolnir badge` | shields.io-endpoint-JSON og snippet |
248
- | `mjolnir --cache` | Inkrementelle genscanninger via en lokal cache over domme |
249
- | `mjolnir --format mermaid` | Diagram over testarkitekturen til en PR-kommentar |
250
-
251
- `mjolnir help <command>` udskriver brug, eksempler og næste skridt for hver af dem.
252
-
253
- </details>
254
-
255
- Kræver **Node.js ≥ 22.18** på Windows, macOS eller Linux. Foretrækker du en global installation? `npm i -g mjolnir-qa`. Minimumskravet kommer fra build-værktøjskæden (tsdown sigter mod den, og release-pipelinen røgtester mod den); kørselsafhængighederne kræver ikke mere end det.
256
-
257
- <br />
258
-
259
- ## Hvad Mjölnir finder
260
-
261
- <p align="center">
262
- <img src="assets/readme/stack.svg" alt="Virker med din stack: de sprog, testframeworks og CI-systemer, som reglerne dækker, fra regelregistret." width="100%" />
263
- </p>
264
-
265
- **79 regler** i fire familier — testhygiejne, testkvalitet, Playwright og CI-integritet — på tværs af TypeScript og JavaScript, Python, Java, C# og GitHub Actions-YAML. De dækker Playwright i alle fire bindings, plus pytest, JUnit, TestNG, NUnit, xUnit, MSTest, Jest, Vitest og Mocha, med startdækning for Cypress og Selenium. Ni af dem, så du kan se formen:
266
-
267
- | ID | Regel | Alvorlighed | Niveau |
268
- | ------------ | ----------------------------------------------------------------- | ----------- | ---------- |
269
- | QA-CI-001 | `continue-on-error` skjuler en fejlende verifikations-gate | error | quarantine |
270
- | QA-CI-009 | Testens exitkode videregives ikke (`\|` uden pipefail, `;`-kæder) | error | extended |
271
- | QA-TEST-001 | Fokuseret test committet (`.only`, `fit`) | error | quarantine |
272
- | QA-TEST-003 | Test uden assertions | error | quarantine |
273
- | QA-TQUAL-009 | Promise-assertion uden await | error | quarantine |
274
- | QA-PW-002 | Locator-assertion uden await | error | core |
275
- | QA-PW-004 | Skrøbelige CSS/XPath-selektorer | warning | quarantine |
276
- | QA-PY-002 | Sprunget test over (`skip`, ikke-streng `xfail`) | warning | core |
277
- | QA-CS-103 | Testmetode uden assertions | error | core |
278
-
279
- Det fulde katalog genereres ud fra registret, aldrig vedligeholdt i hånden: `mjolnir rules --md`, [`docs/rules/`](docs/rules/) eller [guiden til, hvad det tjekker](https://sergey-bar.github.io/Mjolnir/guide/what-it-checks).
280
-
281
- <details>
282
- <summary><strong>Alle regler nævnt i denne README</strong>, i én tabel</summary>
283
-
284
- <br />
285
-
286
- > `quarantine`-regler kører kun under `--strict` og blokerer aldrig (de er begrænset til info). Den viste alvorlighed er forfatterens.
287
-
288
- | ID | Familie | Regel | Alvorlighed | Niveau |
289
- | ------------ | ---------- | --------------------------------------------------------------------- | ----------- | ---------- |
290
- | QA-TEST-001 | Hygiejne | Fokuseret test committet (`.only`, `fit`) | error | quarantine |
291
- | QA-TEST-002 | Hygiejne | Sprunget test over. Eskalerer til `error` uden en sporet begrundelse. | warning | quarantine |
292
- | QA-TEST-003 | Hygiejne | Test uden assertions | error | quarantine |
293
- | QA-TEST-004 | Hygiejne | Fast sleep (`waitForTimeout`, `sleep()`, `delay()`) | warning | extended |
294
- | QA-TEST-006 | Hygiejne | Misbrug af retries, der skjuler ustabilitet | warning | quarantine |
295
- | QA-TEST-010 | Hygiejne | Tom testkrop | error | quarantine |
296
- | QA-TQUAL-002 | Kvalitet | Tautologisk assertion | error | quarantine |
297
- | QA-TQUAL-009 | Kvalitet | Promise-assertion uden await | error | quarantine |
298
- | QA-TQUAL-011 | Kvalitet | Udkommenterede tests | warning | extended |
299
- | QA-PW-002 | Playwright | Locator-assertion uden await | error | core |
300
- | QA-PW-003 | Playwright | `page.pause()` / `test.only()` committet | error | core |
301
- | QA-PW-004 | Playwright | Skrøbelige CSS/XPath-selektorer | warning | quarantine |
302
- | QA-PW-123 | Playwright | Hardkodede miljø-URL'er | warning | quarantine |
303
- | QA-PW-140 | Playwright | Skærmbillede uden `maxDiffPixelRatio` | warning | core |
304
- | QA-CI-001 | CI | `continue-on-error` skjuler en fejlende gate | error | quarantine |
305
- | QA-CI-002 | CI | `\|\| true` sluger exitkoder | error | extended |
306
- | QA-CI-005 | CI | Rapport brugt, men aldrig genereret | error | quarantine |
307
- | QA-CI-007 | CI | Retry-wrappers omkring tests | warning | extended |
308
- | QA-CI-008 | CI | Step, der altid lykkes, skjuler fejl | error | quarantine |
309
- | QA-CI-009 | CI | Exitkode videregives ikke (`\|` uden pipefail, `;`-kæder) | error | extended |
310
- | QA-CI-010 | CI | Tests sprunget over, hvor de skal blokere | error | quarantine |
311
- | QA-PY-002 | Python | Sprunget test over (`skip`, ikke-streng `xfail`) | warning | core |
312
- | QA-PY-003 | Python | Testfunktion uden assertions | error | quarantine |
313
- | QA-PY-005 | Python | `time.sleep()` i tests | warning | extended |
314
- | QA-PY-012 | Python | Tautologisk assertion | error | quarantine |
315
- | QA-JV-101 | Java | Deaktiveret test (`@Disabled`) | warning | core |
316
- | QA-JV-102 | Java | Fast sleep (`Thread.sleep()`) | warning | extended |
317
- | QA-JV-103 | Java | Testmetode uden assertions | error | extended |
318
- | QA-JV-105 | Java | Fast sleep med Playwright `waitForTimeout()` | warning | core |
319
- | QA-JV-106 | Java | Skrøbelig selektor i stedet for rollebaseret locator | warning | quarantine |
320
- | QA-CS-101 | C# | Sprunget test over (`[Ignore]`, `[Fact(Skip=)]`) | warning | core |
321
- | QA-CS-102 | C# | Fast sleep (`Thread.Sleep` / `Task.Delay`) | warning | core |
322
- | QA-CS-103 | C# | Testmetode uden assertions | error | core |
323
- | QA-CS-105 | C# | Fast sleep med `WaitForTimeoutAsync()` | warning | extended |
324
- | QA-CS-106 | C# | Skrøbelig selektor i stedet for rollebaseret locator | warning | quarantine |
325
-
326
- Python har desuden QA-PY-001…012 (pytest-hygiejne) og QA-PY-101…108 (Playwright til Python). Cypress og Selenium har startsæt på tre regler hver.
327
-
328
- </details>
329
-
330
- Hver regel leveres med en must-fire- **og** en must-not-fire-fixture, og en regel, der udløses på sin egen negative fixture, kan ikke leveres. Det er firewallen mod falske positiver; `mjolnir doctor` håndhæver den i dette repositories egen CI.
331
-
332
- ### Selector Health Score
333
-
334
- `mjolnir doctor:playwright` bedømmer hver locator efter, hvordan den finder et element: som en bruger ville (rolle, label, tekst), via en eksplicit kontrakt (`data-testid`) eller ved et strukturelt tilfælde (CSS-kæder, XPath). Hver fil får en score fra 0 til 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
- Det måler **robusthed, ikke korrekthed**. `.btn.btn-primary > div:nth-child(2)` består i dag og bliver ved med at bestå, indtil nogen rører ved markuppen. En lav score påstår aldrig, at testen er i stykker, kun at den afhænger af markup, som ingen har lovet at bevare.
349
-
350
- <br />
351
-
352
- ## Worthiness-scoren
353
-
354
- <p align="center">
355
- <img src="assets/readme/score-gauge.svg" alt="Worthiness-skalaen fra 0 til 100, med en markør, der gennemløber hver score: UNWORTHY under 50, NEEDS WORK fra 50 til 79, WORTHY fra 80 til 99, FORGED ved 100" width="720" />
356
- </p>
357
-
358
- <sub>Hver score fra 0 til 100, placeret af den rigtige `deriveScoreState`. Genereret af `npm run docs:gauge` og låst mod afvigelser i CI.</sub>
359
-
360
- | Score | Dom |
361
- | --------- | ------------------------------------------- |
362
- | `0 – 49` | **UNWORTHY** |
363
- | `50 – 79` | **NEEDS WORK** |
364
- | `80 – 99` | **WORTHY** |
365
- | `100` | **FORGED** |
366
- | `null` | **UNKNOWN**: ingen testdeklarationer fundet |
367
-
368
- **Sådan beregnes den.** Alvorligheden fastsætter et grundfradrag (`error −8`, `warning −3`, `info −1`), og evidensniveauet nedskriver det: E2 tæller fuldt, E1 halvt (rundet ned), E0 slet ikke. Summen normaliseres efter suitens eksponering, altså fradrag pr. testdeklaration i stedet for pr. fil. Terminalen udskriver de samme nedskrevne tal, som scoren brugte; der er ingen skjult anden model. Detaljer: [docs/SCORING.md](docs/SCORING.md) og [scoringsguiden](https://sergey-bar.github.io/Mjolnir/guide/scoring).
369
-
370
- **Hvad 100 ikke betyder.** Det betyder ikke, at softwaren er korrekt, at suiten er tilstrækkelig, eller at produktet er fejlfrit. Det betyder én ting: **ingen af Mjölnirs evaluerede regler gav et fradrag under dette scan og denne evidensmodel.**
371
-
372
- <br />
373
-
374
- ## Evidensmodellen
375
-
376
- Hvert fund har to etiketter: hvor sikker Mjölnir er, og hvor langt fundet er blevet tjekket. Det er forskellen på et værktøj, der rapporterer mønstre, og et værktøj, du kan lade en release afhænge af.
377
-
378
- **Hvor sikkert — evidensniveauet.**
379
-
380
- | Niveau | Navn | Betyder | Fradrag |
381
- | ------ | -------------------- | -------------------------------------------------------- | ------- |
382
- | **E2** | Deterministisk bevis | Defekten findes i koden, som den er skrevet | Fuldt |
383
- | **E1** | Mønsterevidens | Et mønster, der er stærkt knyttet til defekten, matchede | Halvt |
384
- | **E0** | Observation | Værd at vide. Ikke en påstand om, at noget er galt. | Nul |
385
-
386
- Sikkerhed i en detektion er ikke styrken af beviset. En regel kan være sikker på, at den fandt det, den ledte efter, og stadig kigge på en heuristik. E1-fund er der for at blive læst og vurderet, aldrig anvendt i blinde, og den grænse står på fundet i terminalen, i JSON'en og i overdragelsen til agenten.
387
-
388
- **Hvor langt det er tjekket — tillidsniveauet.** De fleste fund kommer fra at læse din kode. Giv Mjölnir rapporten fra en rigtig testkørsel, så kan det bekræfte, at koden faktisk kørte.
389
-
390
- <p align="center">
391
- <img src="assets/readme/trust-ladder.svg" alt="Tillidsstigen fra L0 til L5. L0 til L2 kommer fra at læse koden; L3 til L5 kræver en rigtig kørselsrapport, markeret med et brud i stigen." width="100%" />
392
- </p>
393
-
394
- | Niveau | Med almindelige ord | Hvad det kræver |
395
- | ------ | ------------------- | ---------------------------------------------------- |
396
- | **L0** | Noteret | At læse koden |
397
- | **L1** | Ligner problemet | At læse koden: et mønster matchede |
398
- | **L2** | Bevist i koden | At læse koden: defekten er strukturel |
399
- | **L3** | Filen kørte | En kørselsrapport viser, at fundets fil blev udført |
400
- | **L4** | Testen kørte | En kørselsrapport viser, at fundets test blev udført |
401
- | **L5** | Kørslen er enig | Kørslens eget resultat bekræfter defektklassen |
402
-
403
- Et statisk scan stopper ved L2. Kun en rigtig kørselsrapport (Playwright JSON, Jest eller Vitest JSON, JUnit XML) kan løfte et fund til L3 eller højere, så et fund, der aldrig er set køre, aldrig kan påstå, at det gjorde. Definitioner: [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md).
404
-
405
- ### Hvor meget af dette er målt
406
-
407
- **74 af 79 regler har en falsk-positiv-rate målt mod rigtig OSS-kode** (mindst 10 håndklassificerede fund hver; se [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). De øvrige 5 bygger på forfatterens skøn og siger det, regel for regel, i `mjolnir explain`. `mjolnir rules --unmeasured` lister dem, og hver scanfod angiver, hvor mange af de regler, der faktisk _blev udløst_, der er målt.
408
-
409
- Raterne forbliver offentlige, også når de er dårlige. QA-TEST-001 (en committet `.only`) klarer sig dårligt i revisionen på rigtige repositorier og sidder derfor i quarantine. Det aktuelle tal for hver regel, inklusive QA-PW-141, står i revisionen.
410
-
411
- ### Tillidsniveauer
412
-
413
- Niveauerne følger den målte falsk-positiv-rate, ikke holdninger:
414
-
415
- | Niveau | Målt FP | Adfærd |
416
- | -------------- | ------------------------------ | --------------------------------------------------- |
417
- | **core** | ≤ 10% | Standardrapport, blokerer |
418
- | **extended** | ≤ 30% | Standardrapport, lavere sikkerhed |
419
- | **quarantine** | > 30% eller eksplicit erklæret | Kun `--strict`, begrænset til info, blokerer aldrig |
420
- | _ikke målt_ | n < 10 | Kan ikke forfremmes til core, før den er målt |
421
-
422
- FP-bånd kan kun degradere et niveau — de forfremmer aldrig en regel ud af `quarantine`, hvis den var eksplicit erklæret der. En eksplicit karantænesat regel forbliver i quarantine uanset dens målte FP-rate.
423
-
424
- Forfremmelse, degradering og modenhed pr. sprog: [reglernes livscyklus](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle).
425
-
426
- ### Hvorfor det ikke er en linter
427
-
428
- Linters fortæller dig, om koden følger regler. Mjölnir fortæller dig, om din verifikation er til at stole på.
429
-
430
- | | Linters (ESLint, SonarQube) | Coverage-værktøjer | AI-kodereview | **Mjölnir** |
431
- | ------------------------------------------------------------- | :-------------------------: | :----------------: | :-----------: | :--------------: |
432
- | Scorer **verifikationssystemet**, ikke produktkoden | Nej | Nej | Nej | Ja |
433
- | CI-workflowintegritet (`continue-on-error`, `\|\| true`) | Nej | Nej | kun diffen | Ja |
434
- | Bedømmer robustheden af Playwright-locators (Selector Health) | Nej | Nej | Nej | Ja |
435
- | Læser rigtige kørselsdata til `TRUE-FLAKE`-domme | Nej | Nej | Nej | Ja |
436
- | Offentliggør en målt falsk-positiv-rate pr. regel | Nej | Nej | Nej | Ja |
437
- | Markerer tests uden assertions | Ja\* | Nej | sommetider | Ja |
438
- | Fanger faste sleeps (`waitForTimeout`, `time.sleep`) | Ja\* | Nej | sommetider | Ja |
439
- | Deterministisk (samme input, samme output) | Ja | Ja | Nej | Ja |
440
- | Pris pr. scan | gratis | gratis | tokens | **nul** (lokalt) |
441
-
442
- <sub>\*Dækket af `eslint-plugin-jest` og `eslint-plugin-playwright` (`expect-expect`, `no-wait-for-timeout`) og af SonarQubes egne assertion-regler. Kolonnerne beskriver standardadfærden for verifikation af testsuiter; plugins, betalte planer og egne regler ændrer nogle svar. Dette er en positioneringsoversigt, ikke en benchmark.</sub>
443
-
444
- Brug også AI-review. Det fanger nuancer, hensigt og designfejl, som intet mønster kan finde. Mjölnir fanger det, AI-review overser, fordi det ser tilsigtet ud: en committet `.only`, en slugt exitkode, en `continue-on-error` på et testjob. Det kræver scanning, ikke ræsonnement.
445
-
446
- <br />
447
-
448
- ## Kørselsanalyse
449
-
450
- Statisk analyse ræsonnerer om kode, der aldrig har kørt. Kørselsanalysen læser, hvad der faktisk skete: Playwright JSON, Jest JSON, Vitest JSON og JUnit XML fra enhver runner.
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` betyder ikke, at testen blev prøvet igen. Det betyder, at testen **fejlede mindst ét forsøg og derefter endte grønt**: et heldigt bestået, markeret uanset hvad det endelige flueben siger. `mjolnir triage` gør den historik til et karantæneforslag, og `mjolnir pw-report` opsummerer en kørsel. Det er de samme kørselsrapporter, der løfter fund til tillidsniveau L3 og derover.
468
-
469
- <br />
470
-
471
- ## CI-integritet
472
-
473
- En test kan bestå, mens pipelinen omkring den ikke kan fejle. Mjölnir læser også workflowene: `continue-on-error`, `|| true`, exitkoder, der aldrig videregives, steps, der altid lykkes, rapporter, der bruges, men aldrig genereres, og gates, der springes over ved netop de hændelser, der burde blokere. Hvert fund angiver job, step og linje og har sit eget evidensniveau.
474
-
475
- Generér PR-workflowet, rådgivende som standard:
476
-
477
- ```bash
478
- mjolnir ci install
479
- ```
480
-
481
- Eller tilføj Marketplace-action'en til et workflow, du allerede har:
482
-
483
- ```yaml
484
- - uses: Sergey-Bar/Mjolnir@v3
485
- with:
486
- scope: changed
487
- fail-on: error
488
- ```
489
-
490
- Fastlås `@v3` for at følge major-linjen, eller et præcist tag (`@v0.5.32`) for en reproducerbar gate. [docs/DISTRIBUTION-KIT.md](docs/DISTRIBUTION-KIT.md) dækker Marketplace, Smithery og MCP-registrene.
491
-
492
- Upload SARIF for at få fund ind i GitHub Code Scanning (kræver `security-events: write` på workflow- eller job-niveau):
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
- På GitLab skriver `--format codequality` den Code Quality-rapport, som MR-widgetten og diff-annoteringerne læser ([docs/GITLAB-CI.md](docs/GITLAB-CI.md)). Opsætning af editor og pipeline: [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md).
504
-
505
- ### Tilskrivning i det ændrede scope
506
-
507
- ```bash
508
- npx mjolnir-qa@3.0.0 --scope changed
509
- ```
510
-
511
- Fund tilskrives de linjer, din gren har tilføjet, målt mod **merge-base**. Scopet er det samme filsæt, som et fuldt scan finder (TS/JS-specs og adapterkonfigurationer, `test_*.py`, `*Test.java`, `*Tests.cs`, `.github/workflows/*.yml`), plus ucommittede og usporede ændringer, så det virker, før du committer. Basen findes i rækkefølgen `main → master → origin/main → origin/master → origin/HEAD`; tilsidesæt den med `--base <ref>`.
512
-
513
- Når merge-base ikke kan findes (en shallow clone, et detached HEAD, et mål uden for git), falder fundene tilbage til tilskrivning til hele filen, **og rapporten siger det.** En tavs fallback ville være præcis den slags defekt, dette værktøj findes for at fange.
514
-
515
- <br />
516
-
517
- ## AI-agenter
518
-
519
- Fund er kun noget værd, hvis noget handler på dem.
520
-
521
- ```text
522
- SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
523
- ```
524
-
525
- **AI skriver rettelsen. Mjölnir verificerer den.** Beviset kommer fra det nye scan, aldrig fra agentens egen melding om succes.
526
-
527
- | Kommando | Hvad agenten får |
528
- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
529
- | `mjolnir mcp` | En [MCP](https://modelcontextprotocol.io)-server over stdio. `scan`, `explain` og `diff` bliver til kaldbare værktøjer. |
530
- | `mjolnir handoff` | En gemt `--json`-rapport bliver til en deterministisk Markdown-plan: hvad der blev fundet, evidensgrænsen for hvert fund, hvad der **ikke** må ændres, og hvordan det verificeres. |
531
- | `mjolnir install` | Skriver ind i de agentflader, dit repo allerede har (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`), så agenten scanner igen, før den påstår, at den er færdig. |
532
-
533
- Tilføj det til en klient med sin egen CLI:
534
-
535
- ```bash
536
- claude mcp add mjolnir -- npx -y mjolnir-qa@3.0.0 mcp
537
- ```
538
-
539
- Eller til enhver klient, der tager en `mcpServers`-blok:
540
-
541
- ```json
542
- {
543
- "mcpServers": {
544
- "mjolnir": { "command": "npx", "args": ["-y", "mjolnir-qa@3.0.0", "mcp"] }
545
- }
546
- }
547
- ```
548
-
549
- **Rækværket betyder mere end bekvemmeligheden.** Hvert fund i en overdragelse bærer sin grænse. **E2** siger _deterministisk: tjek placeringen, og anvend rettelsen_. **E1** siger _KRÆVER BEKRÆFTELSE: observationen alene beviser ikke defekten_. En agent, der retter E1 i blinde, undertrykker en regel eller redigerer en regel for at hæve scoren, gør præcis det, dette værktøj findes for at fange, så overdragelsen siger det i prompten, lige ved siden af fundet.
550
-
551
- <br />
552
-
553
- ## Tillid og sikkerhed
554
-
555
- **Local-first, nul telemetri.** Der findes ingen netværkskapabel API (`fetch`, `http`, `https`, `net`, `dns`, `dgram`, WebSocket) nogen steder i `src/`, og [`privacy-network-isolation.spec.ts`](tests/contract/privacy-network-isolation.spec.ts) får buildet til at fejle, hvis der dukker en op. Den forbyder også `eval` og `new Function`. At scanne kode, du ikke stoler på, udfører den aldrig: statisk analyse læser kildetekst, og kørselsanalysen parser rapportfiler, der allerede ligger på disken.
556
-
557
- To forbehold: `npx` henter selv pakken, før noget kører, og garantien dækker `src/`, ikke tredjeparts-plugins.
558
-
559
- **Plugins kører ikke i en sandbox.** JS-plugins (`mjolnir-rules/*.mjs` eller npm-pakker angivet under `"plugins"`) kører med fulde Node-rettigheder, samme tillidsmodel som ESLint- eller Vitest-plugins. At indlæse dem er et tilvalg **pr. scan**: uden `--enable-plugins` (eller `MJOLNIR_ENABLE_PLUGINS=1`) indlæses deres kilder aldrig, og en besked på stderr lister, hvad der blev sprunget over. JSON-regelmanifester udfører ingen kode, og præfikserne for core-regel-ID'er er reserverede, så et plugin ikke kan udgive sig for at være en af dem. Rapportér sårbarheder via [SECURITY.md](SECURITY.md).
560
-
561
- **Det kører på sig selv.** En verification trust engine har ingen troværdighed, medmindre den selv kan verificeres. Hver CI-kørsel scanner dette repository med det build, samme kørsel producerede. Gaten fejler ved ethvert fund med alvorligheden error, og også ved et **delvist** scan eller en **regel, der gik ned**, fordi et afkortet selvscan, der ikke rapporterer noget, er præcis den falske grønne farve, dette projekt findes for at fange. `mjolnir doctor` reviderer regelbasen igen i samme kørsel (fixture-firewall, ærlige niveauer, loftet for core-niveauet), og et INCONCLUSIVE-tjek fejler præcis som et fejlende tjek. Begge rapporter uploades som build-artefakter.
562
-
563
- ### Exitkoder og maskinkontrakten
564
-
565
- Fastfrosne, så du kan bygge CI-logik på dem:
566
-
567
- | Exitkode | Betydning |
568
- | -------- | -------------------------------------------------------------------- |
569
- | `0` | Rent: ingen fund på eller over gaten |
570
- | `1` | Fund på eller over gaten |
571
- | `2` | Delvist scan (tidsbudget opbrugt, ulæselige filer). Blokerer aldrig. |
572
- | `10` | Brugsfejl (forkert flag, manglende mål) |
573
- | `20` | Intern fejl |
574
-
575
- `2` er bevidst forskellig fra `0`: et scan, der ikke blev færdigt, har ikke fundet ingenting. Det er bare ikke færdigt med at lede.
576
-
577
- Alt, hvad en maskine forbruger (MCP-værktøjsresultater, `--json`, SARIF 2.1), kommer fra ét kanonisk resultat under et versioneret, **kun additivt** skema (`schemaVersion: 1`, `contractVersion: 1`), så ingen forbruger behøver at genskabe betydningen ud fra renderet tekst. Se [maskinkontrakten](docs/machine-contract.md). Regel-ID'er (`QA-<FAMILY>-NNN`) kan ikke ændres, når de er udgivet, og genbruges aldrig.
578
-
579
- <br />
580
-
581
- ## Hvad Mjölnir ikke kan fortælle dig
582
-
583
- - **Det kører ikke dine tests.** Et rent scan er ikke en bestået suite.
584
- - **Det kan ikke fortælle dig, at en assertion er _forkert_.** `expect(total).toBe(41)` ser sund ud. Mjölnir finder tests, der _ikke kan fejle_, og pipelines, der _ikke kan blive røde_, ikke tests, der tjekker det forkerte.
585
- - **Det beviser ikke forretningsmæssig korrekthed.** Intet her siger, at dit produkt gør, hvad kravet bad om.
586
- - **100 er ikke bevis for en god suite.** Om din suite dækker din reelle risiko, er et andet spørgsmål, og det besvarer dette værktøj ikke.
587
- - **5 af 79 regler bygger på et skøn**, ikke en målt rate. Hver af dem siger det på sit eget fund.
588
- - **E1 er ikke E2.** Heuristiske fund er værd at læse, ikke værd at anvende i blinde.
589
- - **Et tomt repo får `null`, aldrig 100.**
590
- - **En fil ved navn `*.spec.ts` uden testdeklarationer tæller ikke som dækning.** Et repo, hvis eneste spec-filer indeholder imports eller typer (nul `it`/`test`-kald), får `null`, ikke 100.
591
-
592
- <br />
593
-
594
- ## Dokumentation
595
-
596
- Det fulde dokumentationssite ligger på <https://sergey-bar.github.io/Mjolnir/>.
597
-
598
- | Dokument | Hvad det indeholder |
599
- | ------------------------------------------------------ | --------------------------------------------------- |
600
- | [docs/SCORING.md](docs/SCORING.md) | Normalisering af scoren og vægtning af evidens |
601
- | [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md) | Kanonisk ordforråd: ét ord pr. begreb |
602
- | [docs/FP-AUDIT.md](docs/FP-AUDIT.md) | Målte falsk-positiv-rater og metoden |
603
- | [docs/RULE-LIFECYCLE.md](docs/RULE-LIFECYCLE.md) | Regeltilstande, niveauer, undertrykkelse, udfasning |
604
- | [docs/VERSIONING.md](docs/VERSIONING.md) | Semver-politik, fastfrosne flader, udfasningscyklus |
605
- | [docs/machine-contract.md](docs/machine-contract.md) | Det kanoniske maskinlæsbare resultat |
606
- | [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md) | SARIF-output og opsætning af editor eller CI |
607
- | [docs/GITLAB-CI.md](docs/GITLAB-CI.md) | GitLab: Code Quality-rapport, MR-opskrift, gate |
608
- | [docs/rules/](docs/rules/) | Genereret katalog pr. regel |
609
- | [CONTRIBUTING.md](CONTRIBUTING.md) | Udviklingsmiljø og bidragsproces |
610
- | [SUPPORT.md](SUPPORT.md) | Hvor du kan spørge, rapportere og få hjælp |
611
- | [SECURITY.md](SECURITY.md) | Rapportering af sårbarheder |
612
- | [CHANGELOG.md](CHANGELOG.md) | Udgivelseshistorik |
613
-
614
- ### Status
615
-
616
- **Version 3.0.0.** JSON-skemaet og exitkoderne er fastfrosne kontrakter. TypeScript og Python har den bredeste målte dækning. Java og C# er nyere; læs dem gennem [modenhedstabellen](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle). Hvad der kommer næste gang, uden opdigtede datoer: [den offentlige roadmap](https://sergey-bar.github.io/Mjolnir/reference/roadmap).
617
-
618
- ### Bidrag
619
-
620
- Nye regler er det nemmeste første bidrag. Én kommando opretter skelettet til reglen med dens must-fire- **og** must-not-fire-fixtures. Den genererede regel fejler bevidst sine egne fixtures, indtil der er skrevet rigtig detektion, fordi en stub, der bliver leveret, er en regel, ingen har målt:
621
-
622
- ```bash
623
- mjolnir create-rule QA-PW-140 --title "Screenshot without diff bound"
624
- ```
625
-
626
- Udviklingsmiljøet, kommandoerne til de faste gates samt anti-creep- og fixture-firewall-lovene står i [CONTRIBUTING.md](CONTRIBUTING.md).
627
-
628
- <br />
629
-
630
- <div align="center">
631
-
632
- <img src="assets/readme/closing.svg" alt="Kør det på dit repo." width="100%" />
633
-
634
- ```bash
635
- npx mjolnir-qa@3.0.0
636
- ```
637
-
638
- [Læs guiden](https://sergey-bar.github.io/Mjolnir/guide/getting-started) · [Dokumentationssite](https://sergey-bar.github.io/Mjolnir/) · [npm](https://www.npmjs.com/package/mjolnir-qa)
639
-
640
- <br />
641
-
642
- Spørg ikke, om testene bestod.<br />
643
- Spørg, om evidensen beviser, at de fortjener tillid.
644
-
645
- <sub>Bygget af [Sergey Bar](https://www.linkedin.com/in/sergeybar/) · MIT-licens</sub>
646
-
647
- </div>