mjolnir-qa 4.0.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3178 -16
- package/README.md +81 -760
- package/dist/cli.d.mts +552 -206
- package/dist/cli.mjs +31409 -13990
- package/dist/mcp/stdio.mjs +1290 -405
- package/package.json +76 -32
- package/README.ar.md +0 -647
- package/README.bn.md +0 -647
- package/README.br.md +0 -647
- package/README.bs.md +0 -647
- package/README.da.md +0 -647
- package/README.de.md +0 -647
- package/README.es.md +0 -647
- package/README.fr.md +0 -647
- package/README.gr.md +0 -647
- package/README.he.md +0 -647
- package/README.it.md +0 -647
- package/README.ja.md +0 -647
- package/README.ko.md +0 -647
- package/README.no.md +0 -647
- package/README.pl.md +0 -647
- package/README.ru.md +0 -647
- package/README.th.md +0 -647
- package/README.tr.md +0 -647
- package/README.uk.md +0 -647
- package/README.vi.md +0 -647
- package/README.zh.md +0 -647
- package/README.zht.md +0 -647
- package/dist/scan-pipeline-Bg-46cLS.mjs +0 -2
- package/dist/scan-pipeline-CCJdEKNa.mjs +0 -16336
package/README.no.md
DELETED
|
@@ -1,647 +0,0 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
|
-
<img src="assets/readme/hero.svg" alt="Mjölnir. Tester forteller deg hva som besto. Mjölnir forteller deg hva du kan stole på." width="100%" />
|
|
4
|
-
|
|
5
|
-
<br />
|
|
6
|
-
|
|
7
|
-
Mjölnir finner tester som ikke kan feile og pipelines som ikke kan bli røde,<br />
|
|
8
|
-
og vurderer deretter hvor langt resultatet er til å stole på, med beviset for hvert poeng.
|
|
9
|
-
|
|
10
|
-
<br />
|
|
11
|
-
|
|
12
|
-
[](https://www.npmjs.com/package/mjolnir-qa)
|
|
13
|
-
[](https://www.npmjs.com/package/mjolnir-qa)
|
|
14
|
-
[](https://github.com/Sergey-Bar/Mjolnir/actions/workflows/ci.yml)
|
|
15
|
-
[](https://codecov.io/gh/Sergey-Bar/Mjolnir)
|
|
16
|
-
[](https://scorecard.dev/viewer/?uri=github.com/Sergey-Bar/Mjolnir)
|
|
17
|
-
[](LICENSE)
|
|
18
|
-
[](https://nodejs.org)
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
npx mjolnir-qa@3.0.0
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
[Se det i aksjon](#se-det-i-aksjon) · [Kom raskt i gang](#kom-raskt-i-gang) · [Hva det finner](#hva-mjölnir-finner) · [Score](#worthiness-scoren) · [Evidens](#evidensmodellen) · [Kjøringsanalyse](#kjøringsanalyse) · [CI](#ci-integritet) · [Agenter](#ai-agenter) · [Sikkerhet](#tillit-og-sikkerhet) · [Begrensninger](#hva-mjölnir-ikke-kan-fortelle-deg) · [Dokumentasjon](#dokumentasjon)
|
|
25
|
-
|
|
26
|
-
<details>
|
|
27
|
-
<summary>Les på et annet språk — 22 oversettelser</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 | [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
|
-
## En grønn hake er en påstand, ikke et bevis
|
|
56
|
-
|
|
57
|
-
En grønn hake betyr at pipelinen ikke feilet. Den betyr ikke at testene kjørte, eller at de kunne ha feilet. Hver eneste av disse går grønt gjennom:
|
|
58
|
-
|
|
59
|
-
- en committet `.only` som kjørte 3 tester i stedet for 900
|
|
60
|
-
- `continue-on-error: true` på jobben som skulle ha blokkert
|
|
61
|
-
- `|| true` etter testkommandoen
|
|
62
|
-
- en test som ikke sjekker noe, eller som har en tom kropp
|
|
63
|
-
- en retry-wrapper som gjør en reell feil om til en heldig bestått
|
|
64
|
-
- en rapport som workflowen laster opp, men aldri har generert
|
|
65
|
-
- en fast sleep som holder sammen en race condition
|
|
66
|
-
|
|
67
|
-
Ingen av dem gjør pipelinen rød, og hver av dem ser tilsiktet ut i review. Derfor overlever de. Her leser Mjölnir et ekte eksempel:
|
|
68
|
-
|
|
69
|
-
<p align="center">
|
|
70
|
-
<img src="assets/readme/scan.svg" alt="Demo-repositoriets CI-workflow, lest linje for linje. Mjölnir markerer hvert funn på linjen det ble rapportert, med regelen, hva som er galt, evidensnivået og den målte falsk-positiv-raten." width="800" />
|
|
71
|
-
</p>
|
|
72
|
-
|
|
73
|
-
<sub>Hvert funn demoskanningen rapporterte for denne workflowen, på linjen det ble rapportert. Generert av `npm run docs:readme-brand` fra [`demo-report.json`](assets/readme/demo-report.json) og låst mot avvik i CI.</sub>
|
|
74
|
-
|
|
75
|
-
**Streng modus.** De mest aggressive deteksjonene — `.only`, `continue-on-error`, tomme tester, misbruk av omkjøringer — lever i karantenenivået. De kjører bare under `--strict` og er begrenset til `info`-alvorlighetsgrad: de flagger, de blokkerer aldri. Standardskanningen (`npx mjolnir-qa@3.0.0` uten `--strict`) dekker bare kjerne- og utvidede regler. Legg til `--strict` når du også vil ha rådgivningslaget.
|
|
76
|
-
|
|
77
|
-
Mjölnir leser testsuiten, CI-workflowene og, hvis du har en, rapporten fra en ekte kjøring. Det kjører ikke testene dine, installerer ikke avhengighetene dine og kjører ikke koden det skanner. Og når det mangler evidens, sier det det i stedet for å finne på tillit:
|
|
78
|
-
|
|
79
|
-
| Situasjon | Hva Mjölnir rapporterer |
|
|
80
|
-
| ------------------------------------------------ | ----------------------------------------------------------- |
|
|
81
|
-
| Ingen testdeklarasjoner funnet | Score `null`, vist som **UNKNOWN**. Aldri en oppdiktet 100. |
|
|
82
|
-
| Ingen baseline eller sammenlignbar revisjon | **UNKNOWN**, med årsaken oppgitt. Aldri en antatt 0. |
|
|
83
|
-
| Skanning avbrutt (tidsbudsjett, uleselige filer) | **PARTIAL**, exit `2`. Aldri presentert som ren. |
|
|
84
|
-
|
|
85
|
-
<p align="center">
|
|
86
|
-
<img src="assets/readme/how-it-works.svg" alt="Slik fungerer Mjölnir. Det leser testsuiten og CI-pipelinen statisk, og rapporten fra en ekte kjøring når det finnes en. Det vekter hvert funn etter evidensnivå og tillitsnivå, der bare en ekte kjøring kan nå L3 til L5, og gir funn, en worthiness-score og en CI-gate med fryste exitkoder. I agentløkken skriver AI rettelsen, og Mjölnir skanner på nytt for å bevise den." width="880" />
|
|
87
|
-
</p>
|
|
88
|
-
|
|
89
|
-
<sub>Komponert for denne siden og vist i 1:1. Generert av `npm run docs:readme-brand` og låst mot avvik i CI; score, antall og regel-ID kommer fra [`script.demo.json`](assets/video/script.demo.json), [`demo-report.json`](assets/readme/demo-report.json) og regelregisteret, aldri skrevet inn for hånd. Samme bilde som plakat: [`architecture.svg`](assets/readme/architecture.svg).</sub>
|
|
90
|
-
|
|
91
|
-
<br />
|
|
92
|
-
|
|
93
|
-
## Se det i aksjon
|
|
94
|
-
|
|
95
|
-
En ekte skanning av [`examples/demo-repo`](examples/demo-repo), en liten Playwright-suite med en CI-workflow. Her er hvor poengene ble av:
|
|
96
|
-
|
|
97
|
-
<p align="center">
|
|
98
|
-
<img src="assets/readme/terminal-hero.svg" alt="Mjölnirs oversikt over trekk: WORTHINESS 80/100 WORTHY, scoren per kategori, trekkboksen per alvorlighetsgrad og en FIX THIS FIRST-liste" width="520" />
|
|
99
|
-
</p>
|
|
100
|
-
|
|
101
|
-
<sub>Generert av `npm run docs:hero` fra en ekte skanning og låst mot avvik i CI. Den fullstendige `--verbose`-rapporten fra samme skanning er [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`).</sub>
|
|
102
|
-
|
|
103
|
-
<details>
|
|
104
|
-
<summary><strong>Se det</strong> — en skanning, rettelsen den skriver ut, og den nye skanningen som 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 bilde fra demoopptaket: npx mjolnir-qa@3.0.0 skanner demo-repositoriet i et terminalvindu" width="900" />
|
|
111
|
-
</a>
|
|
112
|
-
</p>
|
|
113
|
-
|
|
114
|
-
<sub>Rendret bilde for bilde fra en ekte skanning av `npm run docs:video`; aldri tatt opp fra skjermen. Velg bildet for å åpne [`mjolnir-demo.mp4`](assets/video/mjolnir-demo.mp4).</sub>
|
|
115
|
-
|
|
116
|
-
</details>
|
|
117
|
-
|
|
118
|
-
### Ett funn på nært hold
|
|
119
|
-
|
|
120
|
-
Hvert funn svarer på fire spørsmål: hvor det er, hvor sikker Mjölnir er, hvor ofte regelen tar feil, og hvordan det rettes.
|
|
121
|
-
|
|
122
|
-
<p align="center">
|
|
123
|
-
<img src="assets/readme/finding-anatomy.svg" alt="Det første funnet fra demoskanningen, nøyaktig slik terminalen skriver det ut, med de fire delene markert: hvor, hvor sikkert, hvor ofte regelen tar feil, og rettelsen." width="100%" />
|
|
124
|
-
</p>
|
|
125
|
-
|
|
126
|
-
`mjolnir explain QA-CI-001` skriver ut en regels fullstendige tillitsprofil, inkludert den målte falsk-positiv-raten og nivået den raten har gitt 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 verdienheten: ett sted der CI rapporterer en bestått den ikke har gjort seg fortjent til.
|
|
173
|
-
|
|
174
|
-
<br />
|
|
175
|
-
|
|
176
|
-
## Kom raskt i gang
|
|
177
|
-
|
|
178
|
-
```bash
|
|
179
|
-
npx mjolnir-qa@3.0.0
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
Det skanner gjeldende mappe og skriver ut Trust Report: hva det fant, hvor langt du kan stole på det, hvorfor, og hva du bør gjøre videre. Det avslutter med `0` når ingenting på eller over gaten ble funnet.
|
|
183
|
-
|
|
184
|
-
I CI bør du bare skanne det grenen har introdusert, så en eldre 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 en GitHub Actions-workflow med [action-en](https://github.com/Sergey-Bar/Mjolnir#readme) festet til major-taggen `v3` (eller vanlig `npx` med `--no-action`). Den forblir rådgivende til du bestemmer at den skal blokkere.
|
|
191
|
-
|
|
192
|
-
| Kommando | Hva den gjør |
|
|
193
|
-
| --------------------------------------------- | ---------------------------------------------------------- |
|
|
194
|
-
| `mjolnir` | Trust Report: dom, sikkerhet, neste handling |
|
|
195
|
-
| `mjolnir --scope changed` | Bare det grenen din har introdusert (CI-formen) |
|
|
196
|
-
| `mjolnir ci install` | Generer den rådgivende PR-workflowen (action-basert) |
|
|
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` | Hva, hvorfor og rettelse, pluss den målte FP-raten |
|
|
213
|
-
| `mjolnir why src/a.spec.ts:42` | Hvorfor akkurat denne linjen ble markert. Blokkerer aldri. |
|
|
214
|
-
| `mjolnir forensics ./test-results/` | Kjøringsevidens fra en ekte kjøring |
|
|
215
|
-
| `mjolnir trust-report` | Selvstendig Trust-artefakt (md + json) |
|
|
216
|
-
| `mjolnir handoff` | Utbedringsplan for en kodeagent |
|
|
217
|
-
| `mjolnir --json` / `--format sarif` | Maskinlesbar utdata, GitHub Code Scanning |
|
|
218
|
-
| `mjolnir --format codequality` | GitLab Code Quality-rapport (MR-widget-artefakt) |
|
|
219
|
-
| `mjolnir --strict` | Kjør også regler på quarantine-nivå (høyere FP-risiko) |
|
|
220
|
-
|
|
221
|
-
<details>
|
|
222
|
-
<summary><strong>Alle andre kommandoer</strong> — triage av ustabile tester, rapportering, styring</summary>
|
|
223
|
-
|
|
224
|
-
<br />
|
|
225
|
-
|
|
226
|
-
| Kommando | Hva den gjør |
|
|
227
|
-
| ----------------------------------- | ------------------------------------------------------------------------- |
|
|
228
|
-
| `mjolnir --classic` | Scorebanneret fra før Trust Report |
|
|
229
|
-
| `mjolnir explain verdict` | Hvorfor dommen for den lagrede skanningen er som den er |
|
|
230
|
-
| `mjolnir triage ./test-results/` | Veiledet triage. Hver rad slutter med en neste handling. |
|
|
231
|
-
| `mjolnir pw-report ./test-results/` | Oppsummering av Playwright-kjøring: retries, ustabile tester, de tregeste |
|
|
232
|
-
| `mjolnir doctor:playwright` | Dypskanning bare for Playwright pluss Selector Health Score |
|
|
233
|
-
| `mjolnir fix --dry-run` / `fix` | Trygge autorettelser, hver skannet på nytt for å bevise at den virket |
|
|
234
|
-
| `mjolnir baseline` / `diff` | Ta et øyeblikksbilde av funn, og rapporter deretter bare nye eller verre |
|
|
235
|
-
| `mjolnir impact --since <ref>` | Hva en commit introduserte og løste |
|
|
236
|
-
| `mjolnir summary` | CI-annotasjoner og en step-oppsummering fra en rapport |
|
|
237
|
-
| `mjolnir pr-comment` | En avgrenset PR-kommentar, som Markdown |
|
|
238
|
-
| `mjolnir debt` | Register over testgjeld med en kostnadsmodell |
|
|
239
|
-
| `mjolnir handover` | Introduksjonskart over suiten for en ny QA-ingeniør |
|
|
240
|
-
| `mjolnir init` | Oppdag rammeverk, skriv ut en sjekkliste for oppsett |
|
|
241
|
-
| `mjolnir suppressions` | List undertrykte funn, for styring |
|
|
242
|
-
| `mjolnir rules --unmeasured` | Reglene som kjører på antakelser, ikke målinger |
|
|
243
|
-
| `mjolnir rules --md` | Fullstendig regelkatalog (JSON eller Markdown) |
|
|
244
|
-
| `mjolnir doctor` | Selvrevisjon av Mjölnirs egen regelbase |
|
|
245
|
-
| `mjolnir create-rule <ID>` | Lag skjelettet til en ny regel og dens fixtures |
|
|
246
|
-
| `mjolnir stats` | Lokale tellere over alle rettelser som noen gang er sett |
|
|
247
|
-
| `mjolnir badge` | shields.io-endepunkt-JSON og snutt |
|
|
248
|
-
| `mjolnir --cache` | Inkrementelle nye skanninger via en lokal hurtigbuffer for dommer |
|
|
249
|
-
| `mjolnir --format mermaid` | Diagram over testarkitekturen for en PR-kommentar |
|
|
250
|
-
|
|
251
|
-
`mjolnir help <command>` skriver ut bruk, eksempler og neste steg for hver av dem.
|
|
252
|
-
|
|
253
|
-
</details>
|
|
254
|
-
|
|
255
|
-
Krever **Node.js ≥ 22.18** på Windows, macOS eller Linux. Foretrekker du en global installasjon? `npm i -g mjolnir-qa`. Minstekravet kommer fra byggeverktøykjeden (tsdown sikter mot det, og release-pipelinen røyktester mot det); kjøretidsavhengighetene trenger ikke mer enn det.
|
|
256
|
-
|
|
257
|
-
<br />
|
|
258
|
-
|
|
259
|
-
## Hva Mjölnir finner
|
|
260
|
-
|
|
261
|
-
<p align="center">
|
|
262
|
-
<img src="assets/readme/stack.svg" alt="Fungerer med stacken din: språkene, testrammeverkene og CI-systemene reglene dekker, fra regelregisteret." width="100%" />
|
|
263
|
-
</p>
|
|
264
|
-
|
|
265
|
-
**79 regler** i fire familier — testhygiene, testkvalitet, Playwright og CI-integritet — på tvers av TypeScript og JavaScript, Python, Java, C# og GitHub Actions-YAML. De dekker Playwright i alle fire bindings, pluss pytest, JUnit, TestNG, NUnit, xUnit, MSTest, Jest, Vitest og Mocha, med startdekning for Cypress og Selenium. Ni av dem, for å vise formen:
|
|
266
|
-
|
|
267
|
-
| ID | Regel | Alvorlighetsgrad | Nivå |
|
|
268
|
-
| ------------ | ---------------------------------------------------------------------- | ---------------- | ---------- |
|
|
269
|
-
| QA-CI-001 | `continue-on-error` skjuler en feilende verifiseringsgate | error | quarantine |
|
|
270
|
-
| QA-CI-009 | Testens exitkode videreformidles ikke (`\|` uten pipefail, `;`-kjeder) | error | extended |
|
|
271
|
-
| QA-TEST-001 | Fokusert test committet (`.only`, `fit`) | error | quarantine |
|
|
272
|
-
| QA-TEST-003 | Test uten assertions | error | quarantine |
|
|
273
|
-
| QA-TQUAL-009 | Promise-assertion uten await | error | quarantine |
|
|
274
|
-
| QA-PW-002 | Locator-assertion uten await | error | core |
|
|
275
|
-
| QA-PW-004 | Skjøre CSS/XPath-selektorer | warning | quarantine |
|
|
276
|
-
| QA-PY-002 | Hoppet over test (`skip`, ikke-streng `xfail`) | warning | core |
|
|
277
|
-
| QA-CS-103 | Testmetode uten assertions | error | core |
|
|
278
|
-
|
|
279
|
-
Den fullstendige katalogen genereres fra registeret, aldri vedlikeholdt for hånd: `mjolnir rules --md`, [`docs/rules/`](docs/rules/) eller [veiledningen om hva det sjekker](https://sergey-bar.github.io/Mjolnir/guide/what-it-checks).
|
|
280
|
-
|
|
281
|
-
<details>
|
|
282
|
-
<summary><strong>Alle regler nevnt i denne README-en</strong>, i én tabell</summary>
|
|
283
|
-
|
|
284
|
-
<br />
|
|
285
|
-
|
|
286
|
-
> `quarantine`-regler kjører bare under `--strict` og blokkerer aldri (de er begrenset til info). Alvorlighetsgraden som vises, er forfatterens.
|
|
287
|
-
|
|
288
|
-
| ID | Familie | Regel | Alvorlighetsgrad | Nivå |
|
|
289
|
-
| ------------ | ---------- | ------------------------------------------------------------------- | ---------------- | ---------- |
|
|
290
|
-
| QA-TEST-001 | Hygiene | Fokusert test committet (`.only`, `fit`) | error | quarantine |
|
|
291
|
-
| QA-TEST-002 | Hygiene | Hoppet over test. Eskalerer til `error` uten en sporet begrunnelse. | warning | quarantine |
|
|
292
|
-
| QA-TEST-003 | Hygiene | Test uten assertions | error | quarantine |
|
|
293
|
-
| QA-TEST-004 | Hygiene | Fast sleep (`waitForTimeout`, `sleep()`, `delay()`) | warning | extended |
|
|
294
|
-
| QA-TEST-006 | Hygiene | Misbruk av retries som skjuler ustabilitet | warning | quarantine |
|
|
295
|
-
| QA-TEST-010 | Hygiene | Tom testkropp | error | quarantine |
|
|
296
|
-
| QA-TQUAL-002 | Kvalitet | Tautologisk assertion | error | quarantine |
|
|
297
|
-
| QA-TQUAL-009 | Kvalitet | Promise-assertion uten await | error | quarantine |
|
|
298
|
-
| QA-TQUAL-011 | Kvalitet | Utkommenterte tester | warning | extended |
|
|
299
|
-
| QA-PW-002 | Playwright | Locator-assertion uten await | error | core |
|
|
300
|
-
| QA-PW-003 | Playwright | `page.pause()` / `test.only()` committet | error | core |
|
|
301
|
-
| QA-PW-004 | Playwright | Skjøre CSS/XPath-selektorer | warning | quarantine |
|
|
302
|
-
| QA-PW-123 | Playwright | Hardkodede miljø-URL-er | warning | quarantine |
|
|
303
|
-
| QA-PW-140 | Playwright | Skjermbilde uten `maxDiffPixelRatio` | warning | core |
|
|
304
|
-
| QA-CI-001 | CI | `continue-on-error` skjuler en feilende gate | error | quarantine |
|
|
305
|
-
| QA-CI-002 | CI | `\|\| true` svelger exitkoder | error | extended |
|
|
306
|
-
| QA-CI-005 | CI | Rapport brukt, men aldri generert | error | quarantine |
|
|
307
|
-
| QA-CI-007 | CI | Retry-wrappere rundt tester | warning | extended |
|
|
308
|
-
| QA-CI-008 | CI | Step som alltid lykkes, skjuler feil | error | quarantine |
|
|
309
|
-
| QA-CI-009 | CI | Exitkode videreformidles ikke (`\|` uten pipefail, `;`-kjeder) | error | extended |
|
|
310
|
-
| QA-CI-010 | CI | Tester hoppet over der de må blokkere | error | quarantine |
|
|
311
|
-
| QA-PY-002 | Python | Hoppet over test (`skip`, ikke-streng `xfail`) | warning | core |
|
|
312
|
-
| QA-PY-003 | Python | Testfunksjon uten assertions | error | quarantine |
|
|
313
|
-
| QA-PY-005 | Python | `time.sleep()` i tester | warning | extended |
|
|
314
|
-
| QA-PY-012 | Python | Tautologisk assertion | error | quarantine |
|
|
315
|
-
| QA-JV-101 | Java | Deaktivert test (`@Disabled`) | warning | core |
|
|
316
|
-
| QA-JV-102 | Java | Fast sleep (`Thread.sleep()`) | warning | extended |
|
|
317
|
-
| QA-JV-103 | Java | Testmetode uten assertions | error | extended |
|
|
318
|
-
| QA-JV-105 | Java | Fast sleep med Playwright `waitForTimeout()` | warning | core |
|
|
319
|
-
| QA-JV-106 | Java | Skjør selektor i stedet for rollebasert locator | warning | quarantine |
|
|
320
|
-
| QA-CS-101 | C# | Hoppet over test (`[Ignore]`, `[Fact(Skip=)]`) | warning | core |
|
|
321
|
-
| QA-CS-102 | C# | Fast sleep (`Thread.Sleep` / `Task.Delay`) | warning | core |
|
|
322
|
-
| QA-CS-103 | C# | Testmetode uten assertions | error | core |
|
|
323
|
-
| QA-CS-105 | C# | Fast sleep med `WaitForTimeoutAsync()` | warning | extended |
|
|
324
|
-
| QA-CS-106 | C# | Skjør selektor i stedet for rollebasert locator | warning | quarantine |
|
|
325
|
-
|
|
326
|
-
Python har i tillegg QA-PY-001…012 (pytest-hygiene) og QA-PY-101…108 (Playwright for Python). Cypress og Selenium har startsett 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 som slår ut på sin egen negative fixture, kan ikke leveres. Det er brannmuren mot falske positiver; `mjolnir doctor` håndhever den i dette repositoriets egen CI.
|
|
331
|
-
|
|
332
|
-
### Selector Health Score
|
|
333
|
-
|
|
334
|
-
`mjolnir doctor:playwright` vurderer hver locator etter hvordan den finner et element: slik en bruker ville gjort (rolle, etikett, tekst), via en eksplisitt kontrakt (`data-testid`), eller ved et strukturelt tilfelle (CSS-kjeder, 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
|
-
Dette måler **robusthet, ikke korrekthet**. `.btn.btn-primary > div:nth-child(2)` består i dag og fortsetter å bestå til noen rører markupen. En lav score påstår aldri at testen er ødelagt, bare at den avhenger av markup ingen har lovet å beholde.
|
|
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 som går gjennom 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, plassert av den ekte `deriveScoreState`. Generert av `npm run docs:gauge` og låst mot avvik 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 testdeklarasjoner funnet |
|
|
367
|
-
|
|
368
|
-
**Slik beregnes den.** Alvorlighetsgraden setter et grunntrekk (`error −8`, `warning −3`, `info −1`), og evidensnivået reduserer det: E2 teller fullt, E1 halvt (rundet ned), E0 ingenting. Summen normaliseres etter suitens eksponering, altså trekk per testdeklarasjon i stedet for per fil. Terminalen skriver ut de samme reduserte tallene som scoren brukte; det finnes ingen skjult modell nummer to. Detaljer: [docs/SCORING.md](docs/SCORING.md) og [scoringsveiledningen](https://sergey-bar.github.io/Mjolnir/guide/scoring).
|
|
369
|
-
|
|
370
|
-
**Hva 100 ikke betyr.** Det betyr ikke at programvaren er korrekt, at suiten er tilstrekkelig, eller at produktet er feilfritt. Det betyr én ting: **ingen av Mjölnirs evaluerte regler ga et trekk under denne skanningen og denne evidensmodellen.**
|
|
371
|
-
|
|
372
|
-
<br />
|
|
373
|
-
|
|
374
|
-
## Evidensmodellen
|
|
375
|
-
|
|
376
|
-
Hvert funn har to etiketter: hvor sikker Mjölnir er, og hvor langt funnet er sjekket. Det er forskjellen mellom et verktøy som rapporterer mønstre og et verktøy du kan la en release avhenge av.
|
|
377
|
-
|
|
378
|
-
**Hvor sikkert — evidensnivået.**
|
|
379
|
-
|
|
380
|
-
| Nivå | Navn | Betyr | Trekk |
|
|
381
|
-
| ------ | -------------------- | ---------------------------------------------------- | ----- |
|
|
382
|
-
| **E2** | Deterministisk bevis | Defekten finnes i koden slik den er skrevet | Fullt |
|
|
383
|
-
| **E1** | Mønsterevidens | Et mønster som er sterkt knyttet til defekten, traff | Halvt |
|
|
384
|
-
| **E0** | Observasjon | Verdt å vite. Ikke en påstand om at noe er galt. | Null |
|
|
385
|
-
|
|
386
|
-
Sikkerhet i en deteksjon er ikke styrken i beviset. En regel kan være sikker på at den fant det den lette etter, og likevel se på en heuristikk. E1-funn er der for å bli lest og vurdert, aldri brukt i blinde, og den grensen står på funnet i terminalen, i JSON-en og i overleveringen til agenten.
|
|
387
|
-
|
|
388
|
-
**Hvor langt det er sjekket — tillitsnivået.** De fleste funn kommer fra å lese koden din. Gi Mjölnir rapporten fra en ekte testkjøring, så kan det bekrefte at koden faktisk kjørte.
|
|
389
|
-
|
|
390
|
-
<p align="center">
|
|
391
|
-
<img src="assets/readme/trust-ladder.svg" alt="Tillitsstigen fra L0 til L5. L0 til L2 kommer fra å lese koden; L3 til L5 krever en ekte kjøringsrapport, markert med et brudd i stigen." width="100%" />
|
|
392
|
-
</p>
|
|
393
|
-
|
|
394
|
-
| Nivå | Med vanlige ord | Hva det krever |
|
|
395
|
-
| ------ | -------------------- | -------------------------------------------------- |
|
|
396
|
-
| **L0** | Notert | Å lese koden |
|
|
397
|
-
| **L1** | Ser ut som problemet | Å lese koden: et mønster traff |
|
|
398
|
-
| **L2** | Bevist i koden | Å lese koden: defekten er strukturell |
|
|
399
|
-
| **L3** | Filen kjørte | En kjøringsrapport viser at funnets fil ble kjørt |
|
|
400
|
-
| **L4** | Testen kjørte | En kjøringsrapport viser at funnets test ble kjørt |
|
|
401
|
-
| **L5** | Kjøringen er enig | Kjøringens eget resultat bekrefter defektklassen |
|
|
402
|
-
|
|
403
|
-
En statisk skanning stopper ved L2. Bare en ekte kjøringsrapport (Playwright JSON, Jest eller Vitest JSON, JUnit XML) kan løfte et funn til L3 eller høyere, så et funn som aldri er sett kjøre, kan aldri påstå at det gjorde det. Definisjoner: [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md).
|
|
404
|
-
|
|
405
|
-
### Hvor mye av dette som er målt
|
|
406
|
-
|
|
407
|
-
**74 av 79 regler har en falsk-positiv-rate målt mot ekte OSS-kode** (minst 10 håndklassifiserte funn hver; se [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). De andre 5 bygger på forfatterens anslag og sier det, regel for regel, i `mjolnir explain`. `mjolnir rules --unmeasured` lister dem, og bunnteksten i hver skanning oppgir hvor mange av reglene som faktisk _slo ut_, som er målt.
|
|
408
|
-
|
|
409
|
-
Ratene forblir offentlige også når de er dårlige. QA-TEST-001 (en committet `.only`) kommer dårlig ut av revisjonen på ekte repositorier og sitter derfor i quarantine. Det aktuelle tallet for hver regel, inkludert QA-PW-141, står i revisjonen.
|
|
410
|
-
|
|
411
|
-
### Tillitsnivåer
|
|
412
|
-
|
|
413
|
-
Nivåene følger den målte falsk-positiv-raten, ikke meninger:
|
|
414
|
-
|
|
415
|
-
| Nivå | Målt FP | Oppførsel |
|
|
416
|
-
| -------------- | ------------------------------ | ---------------------------------------------------- |
|
|
417
|
-
| **core** | ≤ 10% | Standardrapport, blokkerer |
|
|
418
|
-
| **extended** | ≤ 30% | Standardrapport, lavere sikkerhet |
|
|
419
|
-
| **quarantine** | > 30% eller eksplisitt erklært | Bare `--strict`, begrenset til info, blokkerer aldri |
|
|
420
|
-
| _ikke målt_ | n < 10 | Kan ikke forfremmes til core før den er målt |
|
|
421
|
-
|
|
422
|
-
FP-bånd kan bare degradere et nivå — de forfremmer aldri en regel ut av `quarantine` hvis den var eksplisitt erklært der. En eksplisitt karantenesatt regel forblir i quarantine uavhengig av dens målte FP-rate.
|
|
423
|
-
|
|
424
|
-
Forfremmelse, degradering og modenhet per språk: [reglenes livssyklus](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle).
|
|
425
|
-
|
|
426
|
-
### Hvorfor dette ikke er en linter
|
|
427
|
-
|
|
428
|
-
Lintere forteller deg om koden følger regler. Mjölnir forteller deg om verifiseringen din er til å stole på.
|
|
429
|
-
|
|
430
|
-
| | Lintere (ESLint, SonarQube) | Dekningsverktøy | AI-kodegjennomgang | **Mjölnir** |
|
|
431
|
-
| -------------------------------------------------------------- | :-------------------------: | :-------------: | :----------------: | :---------------: |
|
|
432
|
-
| Scorer **verifiseringssystemet**, ikke produktkoden | Nei | Nei | Nei | Ja |
|
|
433
|
-
| Integritet i CI-workflows (`continue-on-error`, `\|\| true`) | Nei | Nei | bare diffen | Ja |
|
|
434
|
-
| Vurderer robustheten til Playwright-locators (Selector Health) | Nei | Nei | Nei | Ja |
|
|
435
|
-
| Leser ekte kjøringsdata for `TRUE-FLAKE`-dommer | Nei | Nei | Nei | Ja |
|
|
436
|
-
| Publiserer en målt falsk-positiv-rate per regel | Nei | Nei | Nei | Ja |
|
|
437
|
-
| Markerer tester uten assertions | Ja\* | Nei | noen ganger | Ja |
|
|
438
|
-
| Fanger faste sleeps (`waitForTimeout`, `time.sleep`) | Ja\* | Nei | noen ganger | Ja |
|
|
439
|
-
| Deterministisk (samme input, samme output) | Ja | Ja | Nei | Ja |
|
|
440
|
-
| Kostnad per skanning | gratis | gratis | tokens | **null** (lokalt) |
|
|
441
|
-
|
|
442
|
-
<sub>\*Dekket av `eslint-plugin-jest` og `eslint-plugin-playwright` (`expect-expect`, `no-wait-for-timeout`) og av SonarQubes egne assertion-regler. Kolonnene beskriver standardoppførselen for verifisering av testsuiter; plugins, betalte planer og egne regler endrer noen svar. Dette er en posisjoneringsoversikt, ikke en benchmark.</sub>
|
|
443
|
-
|
|
444
|
-
Bruk AI-gjennomgang også. Den fanger nyanser, intensjon og designfeil som ingen mønstre kan finne. Mjölnir fanger det AI-gjennomgangen overser fordi det ser tilsiktet ut: en committet `.only`, en svelget exitkode, en `continue-on-error` på en testjobb. Slikt krever skanning, ikke resonnering.
|
|
445
|
-
|
|
446
|
-
<br />
|
|
447
|
-
|
|
448
|
-
## Kjøringsanalyse
|
|
449
|
-
|
|
450
|
-
Statisk analyse resonnerer om kode som aldri har kjørt. Kjøringsanalysen leser hva som faktisk skjedde: Playwright JSON, Jest JSON, Vitest JSON og JUnit XML fra hvilken som helst 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` betyr ikke at testen ble kjørt på nytt. Det betyr at testen **feilet minst ett forsøk og deretter endte grønt**: en heldig bestått, markert uansett hva den endelige haken sier. `mjolnir triage` gjør den historikken om til et karanteneforslag, og `mjolnir pw-report` oppsummerer en kjøring. Det er de samme kjøringsrapportene som løfter funn til tillitsnivå L3 og høyere.
|
|
468
|
-
|
|
469
|
-
<br />
|
|
470
|
-
|
|
471
|
-
## CI-integritet
|
|
472
|
-
|
|
473
|
-
En test kan bestå mens pipelinen rundt den ikke kan feile. Mjölnir leser også workflowene: `continue-on-error`, `|| true`, exitkoder som aldri videreformidles, steps som alltid lykkes, rapporter som brukes, men aldri genereres, og gates som hoppes over ved nettopp de hendelsene som burde blokkere. Hvert funn oppgir jobb, step og linje, og har sitt eget evidensnivå.
|
|
474
|
-
|
|
475
|
-
Generer PR-workflowen, rådgivende som standard:
|
|
476
|
-
|
|
477
|
-
```bash
|
|
478
|
-
mjolnir ci install
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
Eller legg Marketplace-action-en til en 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
|
-
Fest `@v3` for å følge major-linjen, eller en eksakt tagg (`@v0.5.32`) for en reproduserbar gate. [docs/DISTRIBUTION-KIT.md](docs/DISTRIBUTION-KIT.md) dekker Marketplace, Smithery og MCP-registrene.
|
|
491
|
-
|
|
492
|
-
For å få funn inn i GitHub Code Scanning, last opp SARIF (krever `security-events: write` på workflow- eller job-nivå):
|
|
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` Code Quality-rapporten som MR-widgeten og diff-annotasjonene leser ([docs/GITLAB-CI.md](docs/GITLAB-CI.md)). Oppsett av editor og pipeline: [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md).
|
|
504
|
-
|
|
505
|
-
### Tilordning i endret omfang
|
|
506
|
-
|
|
507
|
-
```bash
|
|
508
|
-
npx mjolnir-qa@3.0.0 --scope changed
|
|
509
|
-
```
|
|
510
|
-
|
|
511
|
-
Funn tilordnes linjene grenen din har lagt til, målt mot **merge-base**. Omfanget er det samme filsettet en full skanning finner (TS/JS-specs og adapterkonfigurasjoner, `test_*.py`, `*Test.java`, `*Tests.cs`, `.github/workflows/*.yml`), pluss ikke-committede og usporede endringer, så det fungerer før du committer. Basen løses i rekkefølgen `main → master → origin/main → origin/master → origin/HEAD`; overstyr den med `--base <ref>`.
|
|
512
|
-
|
|
513
|
-
Når merge-base ikke kan løses (en shallow clone, et detached HEAD, et mål utenfor git), faller funnene tilbake til tilordning for hele filen, **og rapporten sier det.** En stille fallback ville vært nøyaktig den typen defekt dette verktøyet finnes for å fange.
|
|
514
|
-
|
|
515
|
-
<br />
|
|
516
|
-
|
|
517
|
-
## AI-agenter
|
|
518
|
-
|
|
519
|
-
Funn er bare verdt noe hvis noe handler på dem.
|
|
520
|
-
|
|
521
|
-
```text
|
|
522
|
-
SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
**AI skriver rettelsen. Mjölnir verifiserer den.** Beviset kommer fra den nye skanningen, aldri fra agentens egen melding om suksess.
|
|
526
|
-
|
|
527
|
-
| Kommando | Hva agenten får |
|
|
528
|
-
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
529
|
-
| `mjolnir mcp` | En [MCP](https://modelcontextprotocol.io)-server over stdio. `scan`, `explain` og `diff` blir kallbare verktøy. |
|
|
530
|
-
| `mjolnir handoff` | En lagret `--json`-rapport blir en deterministisk Markdown-plan: hva som ble oppdaget, evidensgrensen for hvert funn, hva som **ikke** må endres, og hvordan det verifiseres. |
|
|
531
|
-
| `mjolnir install` | Skriver inn i agentflatene repoet ditt allerede har (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`), slik at agenten skanner på nytt før den påstår at den er ferdig. |
|
|
532
|
-
|
|
533
|
-
Legg det til i en klient som har sin egen CLI:
|
|
534
|
-
|
|
535
|
-
```bash
|
|
536
|
-
claude mcp add mjolnir -- npx -y mjolnir-qa@3.0.0 mcp
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
Eller i en hvilken som helst klient som tar en `mcpServers`-blokk:
|
|
540
|
-
|
|
541
|
-
```json
|
|
542
|
-
{
|
|
543
|
-
"mcpServers": {
|
|
544
|
-
"mjolnir": { "command": "npx", "args": ["-y", "mjolnir-qa@3.0.0", "mcp"] }
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
```
|
|
548
|
-
|
|
549
|
-
**Rekkverket betyr mer enn bekvemmeligheten.** Hvert funn i en overlevering bærer sin grense. **E2** sier _deterministisk: sjekk plasseringen og bruk rettelsen_. **E1** sier _KREVER BEKREFTELSE: observasjonen alene beviser ikke defekten_. En agent som retter E1 i blinde, undertrykker en regel eller redigerer en regel for å heve scoren, gjør nøyaktig det dette verktøyet finnes for å fange, så overleveringen sier det i prompten, rett ved siden av funnet.
|
|
550
|
-
|
|
551
|
-
<br />
|
|
552
|
-
|
|
553
|
-
## Tillit og sikkerhet
|
|
554
|
-
|
|
555
|
-
**Local-first, null telemetri.** Det finnes ingen nettverkskapabel API (`fetch`, `http`, `https`, `net`, `dns`, `dgram`, WebSocket) noe sted i `src/`, og [`privacy-network-isolation.spec.ts`](tests/contract/privacy-network-isolation.spec.ts) får bygget til å feile hvis en dukker opp. Den forbyr også `eval` og `new Function`. Å skanne kode du ikke stoler på, kjører den aldri: statisk analyse leser kildetekst, og kjøringsanalysen parser rapportfiler som allerede ligger på disken.
|
|
556
|
-
|
|
557
|
-
To forbehold: `npx` henter selv pakken før noe kjører, og garantien dekker `src/`, ikke tredjeparts plugins.
|
|
558
|
-
|
|
559
|
-
**Plugins kjører ikke i en sandkasse.** JS-plugins (`mjolnir-rules/*.mjs`, eller npm-pakker oppført under `"plugins"`) kjører med fulle Node-rettigheter, samme tillitsmodell som ESLint- eller Vitest-plugins. Å laste dem er et aktivt valg **per skanning**: uten `--enable-plugins` (eller `MJOLNIR_ENABLE_PLUGINS=1`) lastes kildene deres aldri, og en melding på stderr lister hva som ble hoppet over. JSON-regelmanifester kjører ingen kode, og prefiksene for core-regel-ID-er er reservert, slik at et plugin ikke kan utgi seg for å være en av dem. Rapporter sårbarheter via [SECURITY.md](SECURITY.md).
|
|
560
|
-
|
|
561
|
-
**Det kjører på seg selv.** En verification trust engine har ingen troverdighet med mindre den selv kan verifiseres. Hver CI-kjøring skanner dette repositoriet med bygget den samme kjøringen produserte. Gaten feiler ved ethvert funn med alvorlighetsgrad error, og også ved en **delvis** skanning eller en **regel som krasjet**, fordi en avkortet selvskanning som ikke rapporterer noe, er nøyaktig det falske grønne dette prosjektet finnes for å fange. `mjolnir doctor` reviderer regelbasen på nytt i samme kjøring (fixture-brannmur, ærlige nivåer, taket for core-nivået), og en INCONCLUSIVE-sjekk feiler akkurat som en feilende sjekk. Begge rapportene lastes opp som byggeartefakter.
|
|
562
|
-
|
|
563
|
-
### Exitkoder og maskinkontrakten
|
|
564
|
-
|
|
565
|
-
Fryst, så du kan bygge CI-logikk på dem:
|
|
566
|
-
|
|
567
|
-
| Exitkode | Betydning |
|
|
568
|
-
| -------- | --------------------------------------------------------------------------- |
|
|
569
|
-
| `0` | Ren: ingen funn på eller over gaten |
|
|
570
|
-
| `1` | Funn på eller over gaten |
|
|
571
|
-
| `2` | Delvis skanning (tidsbudsjett brukt opp, uleselige filer). Blokkerer aldri. |
|
|
572
|
-
| `10` | Brukerfeil (feil flagg, manglende mål) |
|
|
573
|
-
| `20` | Intern feil |
|
|
574
|
-
|
|
575
|
-
`2` er bevisst forskjellig fra `0`: en skanning som ikke ble ferdig, har ikke funnet ingenting. Den er bare ikke ferdig med å lete.
|
|
576
|
-
|
|
577
|
-
Alt en maskin bruker (MCP-verktøyresultater, `--json`, SARIF 2.1), kommer fra ett kanonisk resultat under et versjonert, **bare additivt** skjema (`schemaVersion: 1`, `contractVersion: 1`), så ingen forbruker trenger å gjenskape betydningen fra rendret tekst. Se [maskinkontrakten](docs/machine-contract.md). Regel-ID-er (`QA-<FAMILY>-NNN`) kan ikke endres etter at de er levert, og gjenbrukes aldri.
|
|
578
|
-
|
|
579
|
-
<br />
|
|
580
|
-
|
|
581
|
-
## Hva Mjölnir ikke kan fortelle deg
|
|
582
|
-
|
|
583
|
-
- **Det kjører ikke testene dine.** En ren skanning er ikke en bestått suite.
|
|
584
|
-
- **Det kan ikke fortelle deg at en assertion er _feil_.** `expect(total).toBe(41)` ser sunn ut. Mjölnir finner tester som _ikke kan feile_ og pipelines som _ikke kan bli røde_, ikke tester som sjekker feil ting.
|
|
585
|
-
- **Det beviser ikke forretningsmessig korrekthet.** Ingenting her sier at produktet ditt gjør det kravet ba om.
|
|
586
|
-
- **100 er ikke bevis på en god suite.** Om suiten din dekker den reelle risikoen din, er et annet spørsmål, og det svarer ikke dette verktøyet på.
|
|
587
|
-
- **5 av 79 regler bygger på et anslag**, ikke en målt rate. Hver av dem sier det på sitt eget funn.
|
|
588
|
-
- **E1 er ikke E2.** Heuristiske funn er verdt å lese, ikke verdt å bruke i blinde.
|
|
589
|
-
- **Et tomt repo får `null`, aldri 100.**
|
|
590
|
-
- **En fil som heter `*.spec.ts` uten testdeklarasjoner, teller ikke som dekning.** Et repo der de eneste spec-filene inneholder imports eller typer (null `it`/`test`-kall), får `null`, ikke 100.
|
|
591
|
-
|
|
592
|
-
<br />
|
|
593
|
-
|
|
594
|
-
## Dokumentasjon
|
|
595
|
-
|
|
596
|
-
Det fullstendige dokumentasjonsnettstedet finner du på <https://sergey-bar.github.io/Mjolnir/>.
|
|
597
|
-
|
|
598
|
-
| Dokument | Hva det inneholder |
|
|
599
|
-
| ------------------------------------------------------ | ------------------------------------------------ |
|
|
600
|
-
| [docs/SCORING.md](docs/SCORING.md) | Normalisering av scoren og vekting av evidens |
|
|
601
|
-
| [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md) | Kanonisk ordforråd: ett ord per begrep |
|
|
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) | Regeltilstander, nivåer, undertrykking, utfasing |
|
|
604
|
-
| [docs/VERSIONING.md](docs/VERSIONING.md) | Semver-policy, fryste flater, utfasingssyklus |
|
|
605
|
-
| [docs/machine-contract.md](docs/machine-contract.md) | Det kanoniske maskinlesbare resultatet |
|
|
606
|
-
| [docs/SARIF-INTEGRATION.md](docs/SARIF-INTEGRATION.md) | SARIF-utdata og oppsett av editor eller CI |
|
|
607
|
-
| [docs/GITLAB-CI.md](docs/GITLAB-CI.md) | GitLab: Code Quality-rapport, MR-oppskrift, gate |
|
|
608
|
-
| [docs/rules/](docs/rules/) | Generert katalog per regel |
|
|
609
|
-
| [CONTRIBUTING.md](CONTRIBUTING.md) | Utviklingsmiljø og bidragsflyt |
|
|
610
|
-
| [SUPPORT.md](SUPPORT.md) | Hvor du kan spørre, rapportere og få hjelp |
|
|
611
|
-
| [SECURITY.md](SECURITY.md) | Rapportering av sårbarheter |
|
|
612
|
-
| [CHANGELOG.md](CHANGELOG.md) | Versjonshistorikk |
|
|
613
|
-
|
|
614
|
-
### Status
|
|
615
|
-
|
|
616
|
-
**Versjon 1.** JSON-skjemaet og exitkodene er fryste kontrakter. TypeScript og Python har den bredeste målte dekningen. Java og C# er nyere; les dem gjennom [modenhetstabellen](https://sergey-bar.github.io/Mjolnir/reference/rule-lifecycle). Hva som kommer videre, uten oppdiktede datoer: [det offentlige veikartet](https://sergey-bar.github.io/Mjolnir/reference/roadmap).
|
|
617
|
-
|
|
618
|
-
### Bidra
|
|
619
|
-
|
|
620
|
-
Nye regler er det enkleste første bidraget. Én kommando lager skjelettet til regelen med must-fire- **og** must-not-fire-fixtures. Den genererte regelen feiler bevisst sine egne fixtures til ekte deteksjon er skrevet, fordi en stubb som blir levert, 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
|
-
Utviklingsmiljøet, kommandoene for de faste gatene og anti-creep- og fixture-brannmur-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="Kjør det på repoet ditt." width="100%" />
|
|
633
|
-
|
|
634
|
-
```bash
|
|
635
|
-
npx mjolnir-qa@3.0.0
|
|
636
|
-
```
|
|
637
|
-
|
|
638
|
-
[Les veiledningen](https://sergey-bar.github.io/Mjolnir/guide/getting-started) · [Dokumentasjonsnettsted](https://sergey-bar.github.io/Mjolnir/) · [npm](https://www.npmjs.com/package/mjolnir-qa)
|
|
639
|
-
|
|
640
|
-
<br />
|
|
641
|
-
|
|
642
|
-
Ikke spør om testene besto.<br />
|
|
643
|
-
Spør om evidensen beviser at de fortjener tillit.
|
|
644
|
-
|
|
645
|
-
<sub>Laget av [Sergey Bar](https://www.linkedin.com/in/sergeybar/) · MIT-lisens</sub>
|
|
646
|
-
|
|
647
|
-
</div>
|