mjolnir-qa 0.5.38 → 0.6.7

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.md CHANGED
@@ -160,6 +160,18 @@ HOW TO FIX
160
160
 
161
161
  Example from this rule's own must-fire fixture: QA-CI-001/must-fire/masked.yml
162
162
 
163
+ WHAT WOULD CHANGE THE VERDICT
164
+ - a run report next to the scan target (mjolnir.report.json or test-results/)
165
+ corroborating this file lifts its findings to L3–L5
166
+ - a documented suppression (mjolnir.config.json) lowers the finding count
167
+ without claiming correctness
168
+ - quarantine findings run only under --strict and are advisory (E0) — they can
169
+ never gate CI
170
+
171
+ NEXT ACTION
172
+ Fix the first occurrence, then re-run: `mjolnir --scope changed`. Every
173
+ occurrence of this rule is listed in the scan output.
174
+
163
175
  HOW TO VERIFY THE FIX
164
176
  Re-run `mjolnir` on the changed file(s) — this finding should no longer
165
177
  appear. `mjolnir --scope changed` scopes the check to just what you touched.
@@ -178,11 +190,11 @@ reporting a pass it did not earn.
178
190
  npx mjolnir-qa@latest
179
191
  ```
180
192
 
181
- That is the whole product: it scans the current directory, prints a
182
- worthiness score and the findings behind it, and exits `0` if nothing at or
183
- above the gate was found. **In CI, use the changed-scope form** — it
184
- attributes findings to what your branch introduced, so a legacy suite does
185
- not drown a first PR:
193
+ That is the whole product: it scans the current directory and prints the
194
+ Trust Report — what the scan found, how much you can trust it, why, and
195
+ what to do next — then exits `0` if nothing at or above the gate was
196
+ found. **In CI, use the changed-scope form** — it attributes findings to
197
+ what your branch introduced, so a legacy suite does not drown a first PR:
186
198
 
187
199
  ```bash
188
200
  npx mjolnir-qa@latest --scope changed
@@ -195,12 +207,13 @@ pinned to the `v1` major tag) by default, or plain `npx` with
195
207
 
196
208
  | Command | What it does |
197
209
  | ----------------------------------- | ------------------------------------------------ |
198
- | `mjolnir` | Full-repo scan + worthiness score |
210
+ | `mjolnir` | Trust Report — verdict, confidence, next action |
199
211
  | `mjolnir --scope changed` | Only what your branch introduced — the CI form |
200
212
  | `mjolnir ci install` | Generate the advisory PR workflow (action-based) |
201
213
  | `mjolnir explain QA-CI-001` | What / why / fix + measured FP rate for one rule |
202
214
  | `mjolnir why src/a.spec.ts:42` | Why this exact line was flagged — never a gate |
203
215
  | `mjolnir forensics ./test-results/` | Runtime evidence from a real run |
216
+ | `mjolnir trust-report` | Self-contained Trust Artifact (md + json) |
204
217
  | `mjolnir handoff` | Remediation plan for a coding agent |
205
218
  | `mjolnir --json` / `--format sarif` | Machine-readable / GitHub Code Scanning |
206
219
  | `mjolnir --format codequality` | GitLab Code Quality report (MR widget artifact) |
@@ -209,28 +222,30 @@ pinned to the `v1` major tag) by default, or plain `npx` with
209
222
  <details>
210
223
  <summary><strong>Everything else</strong> — flake triage, reporting, governance</summary>
211
224
 
212
- | Command | What it does |
213
- | ----------------------------------- | ------------------------------------------------------ |
214
- | `mjolnir triage ./test-results/` | Quarantine proposal from execution history |
215
- | `mjolnir pw-report ./test-results/` | Playwright run summary — retries / flakes / slowest |
216
- | `mjolnir doctor:playwright` | Playwright-only deep scan + Selector Health Score |
217
- | `mjolnir fix --dry-run` / `fix` | Safe auto-fixes, each re-scanned to prove it landed |
218
- | `mjolnir baseline` / `diff` | Snapshot findings, then report only new/worsened |
219
- | `mjolnir impact --since <ref>` | What a commit introduced vs resolved |
220
- | `mjolnir summary` | CI annotations + step summary from a saved report |
221
- | `mjolnir pr-comment` | A scoped PR comment, as Markdown |
222
- | `mjolnir debt` | Test-debt register with a cost model |
223
- | `mjolnir handover` | New-QA onboarding map of the suite |
224
- | `mjolnir init` | Detect frameworks + setup checklist (never overwrites) |
225
- | `mjolnir suppressions` | List suppressed findings — governance transparency |
226
- | `mjolnir rules --unmeasured` | The rules running on assumption, not measurement |
227
- | `mjolnir rules --md` | Full rule catalog (JSON or Markdown) |
228
- | `mjolnir doctor` | Self-audit of Mjölnir's own rule base |
229
- | `mjolnir create-rule <ID>` | Scaffold a new rule + fixtures |
230
- | `mjolnir stats` | Local all-time counters of fixes seen |
231
- | `mjolnir badge` | shields.io endpoint JSON + snippet |
232
- | `mjolnir --cache` | Incremental re-scans via a local verdict cache |
233
- | `mjolnir --format mermaid` | Test-architecture diagram for a PR comment |
225
+ | Command | What it does |
226
+ | ----------------------------------- | -------------------------------------------------------- |
227
+ | `mjolnir --classic` | The pre-Trust-Report score banner render |
228
+ | `mjolnir explain verdict` | Why the saved scan's verdict is what it is |
229
+ | `mjolnir triage ./test-results/` | Guided triage workflow — every row ends in a next action |
230
+ | `mjolnir pw-report ./test-results/` | Playwright run summary — retries / flakes / slowest |
231
+ | `mjolnir doctor:playwright` | Playwright-only deep scan + Selector Health Score |
232
+ | `mjolnir fix --dry-run` / `fix` | Safe auto-fixes, each re-scanned to prove it landed |
233
+ | `mjolnir baseline` / `diff` | Snapshot findings, then report only new/worsened |
234
+ | `mjolnir impact --since <ref>` | What a commit introduced vs resolved |
235
+ | `mjolnir summary` | CI annotations + step summary from a saved report |
236
+ | `mjolnir pr-comment` | A scoped PR comment, as Markdown |
237
+ | `mjolnir debt` | Test-debt register with a cost model |
238
+ | `mjolnir handover` | New-QA onboarding map of the suite |
239
+ | `mjolnir init` | Detect frameworks + setup checklist (never overwrites) |
240
+ | `mjolnir suppressions` | List suppressed findings — governance transparency |
241
+ | `mjolnir rules --unmeasured` | The rules running on assumption, not measurement |
242
+ | `mjolnir rules --md` | Full rule catalog (JSON or Markdown) |
243
+ | `mjolnir doctor` | Self-audit of Mjölnir's own rule base |
244
+ | `mjolnir create-rule <ID>` | Scaffold a new rule + fixtures |
245
+ | `mjolnir stats` | Local all-time counters of fixes seen |
246
+ | `mjolnir badge` | shields.io endpoint JSON + snippet |
247
+ | `mjolnir --cache` | Incremental re-scans via a local verdict cache |
248
+ | `mjolnir --format mermaid` | Test-architecture diagram for a PR comment |
234
249
 
235
250
  `mjolnir help <command>` prints usage, examples and the next step for any
236
251
  of them.
@@ -247,7 +262,7 @@ have no such requirement.)
247
262
 
248
263
  ## What Mjölnir finds
249
264
 
250
- **<!-- census:total-rules -->99 rules<!-- /census:total-rules -->** in four families — **test hygiene**, **test quality**,
265
+ **<!-- census:total-rules -->78 rules<!-- /census:total-rules -->** in four families — **test hygiene**, **test quality**,
251
266
  **Playwright**, **CI integrity** — over TypeScript/JavaScript, Python,
252
267
  Java, C# and GitHub Actions YAML, covering Playwright in all four bindings
253
268
  plus pytest, JUnit, TestNG, NUnit, xUnit, MSTest, Jest, Vitest and Mocha,
@@ -263,7 +278,6 @@ is clear:
263
278
  | QA-TQUAL-009 | Unawaited promise assertion | error | quarantine |
264
279
  | QA-PW-002 | Unawaited locator assertion | error | core |
265
280
  | QA-PW-004 | Brittle CSS/XPath selectors | warning | quarantine |
266
- | QA-PW-118 | `networkidle` waits (flaky by design) | info | quarantine |
267
281
  | QA-PY-002 | Skipped test (`skip`, non-strict `xfail`) | warning | core |
268
282
  | QA-CS-103 | Test method with no assertions | error | core |
269
283
 
@@ -272,7 +286,7 @@ The full catalog is generated from the registry, never hand-maintained:
272
286
  [what-it-checks guide](https://sergey-bar.github.io/Mjolnir/guide/what-it-checks).
273
287
 
274
288
  <details>
275
- <summary><strong>Every rule named in this README, in one table</strong> — the other 53 live in <code>mjolnir rules --md</code></summary>
289
+ <summary><strong>Every rule named in this README, in one table</strong> — the rest live in <code>mjolnir rules --md</code></summary>
276
290
 
277
291
  > `quarantine` rules run only under `--strict` and never gate (capped to
278
292
  > info); the severity shown is the authored severity.
@@ -285,17 +299,12 @@ The full catalog is generated from the registry, never hand-maintained:
285
299
  | QA-TEST-004 | Hygiene | Hard sleep (`waitForTimeout`, `sleep()`, `delay()`) | warning | extended |
286
300
  | QA-TEST-006 | Hygiene | Retry abuse hiding flakiness | warning | quarantine |
287
301
  | QA-TEST-010 | Hygiene | Empty test body | error | quarantine |
288
- | QA-TQUAL-001 | Quality | Mock-only verification | info | quarantine |
289
302
  | QA-TQUAL-002 | Quality | Tautological assertion | error | quarantine |
290
303
  | QA-TQUAL-009 | Quality | Unawaited promise assertion | error | quarantine |
291
304
  | QA-TQUAL-011 | Quality | Commented-out tests | warning | extended |
292
305
  | QA-PW-002 | Playwright | Unawaited locator assertion | error | core |
293
306
  | QA-PW-003 | Playwright | `page.pause()` / `test.only()` committed | error | core |
294
307
  | QA-PW-004 | Playwright | Brittle CSS/XPath selectors | warning | quarantine |
295
- | QA-PW-005 | Playwright | Business logic inside `page.evaluate()` | info | quarantine |
296
- | QA-PW-107 | Playwright | `toBeVisible` where `toBeInViewport` fits better | info | quarantine |
297
- | QA-PW-114 | Playwright | Legacy element handles (`page.$`) | info | quarantine |
298
- | QA-PW-118 | Playwright | `networkidle` waits (flaky by design) | info | quarantine |
299
308
  | QA-PW-123 | Playwright | Hardcoded environment URLs | warning | quarantine |
300
309
  | QA-PW-140 | Playwright | Screenshot without `maxDiffPixelRatio` | warning | core |
301
310
  | QA-CI-001 | CI | `continue-on-error` masks a failing gate | error | quarantine |
@@ -308,23 +317,17 @@ The full catalog is generated from the registry, never hand-maintained:
308
317
  | QA-PY-002 | Python | Skipped test (`skip`, non-strict `xfail`) | warning | core |
309
318
  | QA-PY-003 | Python | Test function with no assertions | error | quarantine |
310
319
  | QA-PY-005 | Python | `time.sleep()` in tests | warning | extended |
311
- | QA-PY-006 | Python | Empty test body (`pass`) | info | quarantine |
312
- | QA-PY-010 | Python | Random/time dependence without freeze | info | quarantine |
313
320
  | QA-PY-012 | Python | Tautological assertion | error | quarantine |
314
321
  | QA-JV-101 | Java | Disabled test (`@Disabled`) | warning | core |
315
322
  | QA-JV-102 | Java | Hard sleep (`Thread.sleep()`) | warning | extended |
316
323
  | QA-JV-103 | Java | Test method with no assertions | error | extended |
317
324
  | QA-JV-105 | Java | Playwright `waitForTimeout()` hard sleep | warning | core |
318
325
  | QA-JV-106 | Java | Brittle selector instead of role locator | warning | quarantine |
319
- | QA-JV-108 | Java | Hardcoded environment URL in test | info | quarantine |
320
- | QA-JV-111 | Java | Blanket `page.route("**")` mock | info | quarantine |
321
326
  | QA-CS-101 | C# | Skipped test (`[Ignore]`, `[Fact(Skip=)]`) | warning | core |
322
327
  | QA-CS-102 | C# | Hard sleep (`Thread.Sleep` / `Task.Delay`) | warning | core |
323
328
  | QA-CS-103 | C# | Test method with no assertions | error | core |
324
329
  | QA-CS-105 | C# | `WaitForTimeoutAsync()` hard sleep | warning | extended |
325
330
  | QA-CS-106 | C# | Brittle selector instead of role locator | warning | quarantine |
326
- | QA-CS-108 | C# | Hardcoded environment URL in test | info | quarantine |
327
- | QA-CS-111 | C# | Blanket `page.RouteAsync("**")` mock | info | quarantine |
328
331
 
329
332
  Python also ships QA-PY-001…012 (pytest hygiene) and QA-PY-101…108
330
333
  (Playwright-Python); Cypress and Selenium have starter sets of three
@@ -439,13 +442,13 @@ Rung by rung: [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md).
439
442
 
440
443
  ### How much of this is measured
441
444
 
442
- **<!-- census:measured-of-total -->78 of 99<!-- /census:measured-of-total --> rules carry a false-positive rate measured against real OSS code**
445
+ **<!-- census:measured-of-total -->57 of 78<!-- /census:measured-of-total --> rules carry a false-positive rate measured against real OSS code**
443
446
  (≥ 10 hand-classified findings each — [docs/FP-AUDIT.md](docs/FP-AUDIT.md)).
444
447
  The other <!-- census:unmeasured -->21<!-- /census:unmeasured --> ship on the author's estimate and say so, per rule, in
445
448
  `mjolnir explain`; `mjolnir rules --unmeasured` lists them, and every scan
446
449
  footer reports how many of the rules that actually _fired_ are measured.
447
450
 
448
- The rate is published even when unflattering: QA-PW-107 audits at 95% and
451
+ The rate is published even when unflattering: QA-PW-141 audits at 43% and
449
452
  is quarantined for it. **Mjölnir measures its own uncertainty** — that is
450
453
  the product, not a caveat.
451
454
 
@@ -682,7 +685,7 @@ artifacts.
682
685
  product does what the requirement asked for.
683
686
  - **A 100 is not proof of a good suite.** Whether your suite covers your
684
687
  actual risk is a different question, and this tool does not answer it.
685
- - **<!-- census:unmeasured-of-total -->21 of 99<!-- /census:unmeasured-of-total --> rules ship on an estimate**, not a measured rate — disclosed
688
+ - **<!-- census:unmeasured-of-total -->21 of 78<!-- /census:unmeasured-of-total --> rules ship on an estimate**, not a measured rate — disclosed
686
689
  per rule, not buried here.
687
690
  - **E1 is not E2.** Heuristic findings are worth reading, not worth
688
691
  applying blindly.
package/README.no.md CHANGED
@@ -15,7 +15,7 @@ tilliten bryter sammen.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | Norsk | [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)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-08.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -201,7 +201,6 @@ det er false-positive-brannmuren.
201
201
 
202
202
  | ID | Regel | Severity |
203
203
  | ------------ | ------------------------------- | -------- |
204
- | QA-TQUAL-001 | Kun-mock-verifisering | info |
205
204
  | QA-TQUAL-002 | Tautologisk assertion | error |
206
205
  | QA-TQUAL-009 | Assertion på promise uten await | error |
207
206
  | QA-TQUAL-011 | Utkommenterte tester | warning |
@@ -211,15 +210,12 @@ det er false-positive-brannmuren.
211
210
  <details>
212
211
  <summary><strong>Playwright 🎭</strong></summary>
213
212
 
214
- | ID | Regel | Severity |
215
- | --------- | ---------------------------------------- | -------- |
216
- | QA-PW-002 | Locator-assertion uten await | error |
217
- | QA-PW-003 | `page.pause()` / `test.only()` commitet | error |
218
- | QA-PW-004 | Skjøre CSS/XPath-selektorer | warning |
219
- | QA-PW-005 | Forretningslogikk i `page.evaluate()` | info |
220
- | QA-PW-114 | Legacy element handles (`page.$`) | info |
221
- | QA-PW-118 | `networkidle`-ventetid (flaky by design) | info |
222
- | QA-PW-123 | Hardkodede miljø-URLer | warning |
213
+ | ID | Regel | Severity |
214
+ | --------- | --------------------------------------- | -------- |
215
+ | QA-PW-002 | Locator-assertion uten await | error |
216
+ | QA-PW-003 | `page.pause()` / `test.only()` commitet | error |
217
+ | QA-PW-004 | Skjøre CSS/XPath-selektorer | warning |
218
+ | QA-PW-123 | Hardkodede miljø-URLer | warning |
223
219
 
224
220
  </details>
225
221
 
@@ -246,8 +242,6 @@ det er false-positive-brannmuren.
246
242
  | QA-PY-002 | Hoppet over test (`skip`, ikke-strikt `xfail`) | warning |
247
243
  | QA-PY-003 | Testfunksjon uten assertions | error |
248
244
  | QA-PY-005 | `time.sleep()` i tester | warning |
249
- | QA-PY-006 | Tomt testkropp (`pass`) | info |
250
- | QA-PY-010 | Tilfeldighets-/tidsavhengighet uten freeze | info |
251
245
  | QA-PY-012 | Tautologisk assertion | error |
252
246
 
253
247
  20 Python-regler totalt (QA-PY-001…012 pytest-hygiene + QA-PY-101…108 Playwright-Python).
@@ -264,8 +258,6 @@ det er false-positive-brannmuren.
264
258
  | QA-JV-103 | Testmetode uten assertions | error |
265
259
  | QA-JV-105 | Playwright hardt sleep `waitForTimeout()` | warning |
266
260
  | QA-JV-106 | Skjør selector i stedet for role-locator | warning |
267
- | QA-JV-108 | Hardkodet miljø-URL i test | info |
268
- | QA-JV-111 | Blanket-mock `page.route("**")` | info |
269
261
 
270
262
  </details>
271
263
 
@@ -279,8 +271,6 @@ det er false-positive-brannmuren.
279
271
  | QA-CS-103 | Testmetode uten assertions | error |
280
272
  | QA-CS-105 | Hardt sleep `WaitForTimeoutAsync()` | warning |
281
273
  | QA-CS-106 | Skjør selector i stedet for role-locator | warning |
282
- | QA-CS-108 | Hardkodet miljø-URL i test | info |
283
- | QA-CS-111 | Blanket-mock `page.RouteAsync("**")` | info |
284
274
 
285
275
  </details>
286
276
 
@@ -302,7 +292,6 @@ det er false-positive-brannmuren.
302
292
  forfatterens estimat. Hver skann-fotnote forteller hvor mange av de
303
293
  _utløste_ reglene som er målt; `mjolnir rules --unmeasured` lister de
304
294
  umålte; hver regels `mjolnir explain`-side angir statusen. Vi publiserer
305
- raten selv når den er stygg — QA-PW-107 auditeres til 95 % og er satt i
306
295
  karantene for det. Å få det tallet til å vokse er prosjektets fortsatte
307
296
  arbeid.
308
297
 
@@ -522,7 +511,7 @@ scope — den endrer aldri deteksjonssemantikken.
522
511
  {
523
512
  "gate": "error",
524
513
  "exclude": ["legacy/**"],
525
- "severityOverrides": { "QA-PW-118": "warning" },
514
+ "severityOverrides": { "QA-PW-141": "warning" },
526
515
  "ignore": [
527
516
  {
528
517
  "ruleId": "QA-TEST-004",
package/README.pl.md CHANGED
@@ -15,7 +15,7 @@ gdzie zaufanie się łamie.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | Polski | [Русский](README.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)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-08.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -200,12 +200,11 @@ nie może się wydać — to zapora na fałszywe pozytywy.
200
200
  <details>
201
201
  <summary><strong>Jakość testów</strong></summary>
202
202
 
203
- | ID | Reguła | Severity |
204
- | ------------ | ----------------------------- | -------- |
205
- | QA-TQUAL-001 | Weryfikacja wyłącznie mockami | info |
206
- | QA-TQUAL-002 | Asercja tautologiczna | error |
207
- | QA-TQUAL-009 | Asercja promise bez await | error |
208
- | QA-TQUAL-011 | Zakomentowane testy | warning |
203
+ | ID | Reguła | Severity |
204
+ | ------------ | ------------------------- | -------- |
205
+ | QA-TQUAL-002 | Asercja tautologiczna | error |
206
+ | QA-TQUAL-009 | Asercja promise bez await | error |
207
+ | QA-TQUAL-011 | Zakomentowane testy | warning |
209
208
 
210
209
  </details>
211
210
 
@@ -217,9 +216,6 @@ nie może się wydać — to zapora na fałszywe pozytywy.
217
216
  | QA-PW-002 | Asercja lokatora bez await | error |
218
217
  | QA-PW-003 | `page.pause()` / `test.only()` committowane | error |
219
218
  | QA-PW-004 | Kruche selektory CSS/XPath | warning |
220
- | QA-PW-005 | Logika biznesowa wewnątrz `page.evaluate()` | info |
221
- | QA-PW-114 | Legacy element handles (`page.$`) | info |
222
- | QA-PW-118 | Czekanie `networkidle` (flaky by design) | info |
223
219
  | QA-PW-123 | Zaszyte na sztywno URL-e środowisk | warning |
224
220
 
225
221
  </details>
@@ -247,8 +243,6 @@ nie może się wydać — to zapora na fałszywe pozytywy.
247
243
  | QA-PY-002 | Pominięty test (`skip`, niestrykt `xfail`) | warning |
248
244
  | QA-PY-003 | Funkcja testowa bez asercji | error |
249
245
  | QA-PY-005 | `time.sleep()` w testach | warning |
250
- | QA-PY-006 | Puste ciało testu (`pass`) | info |
251
- | QA-PY-010 | Zależność od losowości/czasu bez freeze | info |
252
246
  | QA-PY-012 | Asercja tautologiczna | error |
253
247
 
254
248
  Łącznie 20 reguł Pythona (QA-PY-001…012 higiena pytest + QA-PY-101…108 Playwright-Python).
@@ -265,8 +259,6 @@ nie może się wydać — to zapora na fałszywe pozytywy.
265
259
  | QA-JV-103 | Metoda testowa bez asercji | error |
266
260
  | QA-JV-105 | Twardy sleep Playwright `waitForTimeout()` | warning |
267
261
  | QA-JV-106 | Kruchy selektor zamiast role lokatora | warning |
268
- | QA-JV-108 | Zaszyty na sztywno URL środowiska w teście | info |
269
- | QA-JV-111 | Blanketowy mock `page.route("**")` | info |
270
262
 
271
263
  </details>
272
264
 
@@ -280,8 +272,6 @@ nie może się wydać — to zapora na fałszywe pozytywy.
280
272
  | QA-CS-103 | Metoda testowa bez asercji | error |
281
273
  | QA-CS-105 | Twardy sleep `WaitForTimeoutAsync()` | warning |
282
274
  | QA-CS-106 | Kruchy selektor zamiast role lokatora | warning |
283
- | QA-CS-108 | Zaszyty na sztywno URL środowiska w teście | info |
284
- | QA-CS-111 | Blanketowy mock `page.RouteAsync("**")` | info |
285
275
 
286
276
  </details>
287
277
 
@@ -303,7 +293,6 @@ zob. [docs/FP-AUDIT.md](docs/FP-AUDIT.md)). Pozostałe 21 wychodzi na
303
293
  oszacowaniu autora. Stopka każdego skanu mówi, ile z _odpalonych_
304
294
  reguł jest zmierzonych; `mjolnir rules --unmeasured` wypisuje
305
295
  niezmierzone; strona `mjolnir explain` każdej reguły deklaruje jej
306
- status. Publikujemy stopę, nawet gdy jest brzydka — QA-PW-107 audytuje
307
296
  się na 95 % i za to trafia do kwarantanny. Powiększanie tej liczby to
308
297
  stale trwająca praca projektu.
309
298
 
@@ -526,7 +515,7 @@ nigdy nie zmienia semantyki detekcji.
526
515
  {
527
516
  "gate": "error",
528
517
  "exclude": ["legacy/**"],
529
- "severityOverrides": { "QA-PW-118": "warning" },
518
+ "severityOverrides": { "QA-PW-141": "warning" },
530
519
  "ignore": [
531
520
  {
532
521
  "ruleId": "QA-TEST-004",
package/README.ru.md CHANGED
@@ -15,7 +15,7 @@ CI-пайплайны, выдаёт показатель достойности
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | Русский | [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)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-08.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -203,7 +203,6 @@ macOS и Linux.
203
203
 
204
204
  | ID | Правило | Severity |
205
205
  | ------------ | ----------------------------- | -------- |
206
- | QA-TQUAL-001 | Верификация только моками | info |
207
206
  | QA-TQUAL-002 | Тавтологический ассерт | error |
208
207
  | QA-TQUAL-009 | Ассерт не-awaitнутого promise | error |
209
208
  | QA-TQUAL-011 | Закомментированные тесты | warning |
@@ -213,15 +212,12 @@ macOS и Linux.
213
212
  <details>
214
213
  <summary><strong>Playwright 🎭</strong></summary>
215
214
 
216
- | ID | Правило | Severity |
217
- | --------- | ------------------------------------------- | -------- |
218
- | QA-PW-002 | Ассерт локатора без await | error |
219
- | QA-PW-003 | `page.pause()` / `test.only()` в коммите | error |
220
- | QA-PW-004 | Хрупкие CSS/XPath-селекторы | warning |
221
- | QA-PW-005 | Бизнес-логика внутри `page.evaluate()` | info |
222
- | QA-PW-114 | Легаси element handles (`page.$`) | info |
223
- | QA-PW-118 | Ожидания `networkidle` (флаковые by design) | info |
224
- | QA-PW-123 | Захардкоженные URL окружений | warning |
215
+ | ID | Правило | Severity |
216
+ | --------- | ---------------------------------------- | -------- |
217
+ | QA-PW-002 | Ассерт локатора без await | error |
218
+ | QA-PW-003 | `page.pause()` / `test.only()` в коммите | error |
219
+ | QA-PW-004 | Хрупкие CSS/XPath-селекторы | warning |
220
+ | QA-PW-123 | Захардкоженные URL окружений | warning |
225
221
 
226
222
  </details>
227
223
 
@@ -243,14 +239,12 @@ macOS и Linux.
243
239
  <details>
244
240
  <summary><strong>Python / pytest 🐍</strong></summary>
245
241
 
246
- | ID | Правило | Severity |
247
- | --------- | --------------------------------------------- | -------- |
248
- | QA-PY-002 | Пропущенный тест (`skip`, нестрогий `xfail`) | warning |
249
- | QA-PY-003 | Тестовая функция без ассертов | error |
250
- | QA-PY-005 | `time.sleep()` в тестах | warning |
251
- | QA-PY-006 | Пустое тело теста (`pass`) | info |
252
- | QA-PY-010 | Зависимость от случайности/времени без freeze | info |
253
- | QA-PY-012 | Тавтологический ассерт | error |
242
+ | ID | Правило | Severity |
243
+ | --------- | -------------------------------------------- | -------- |
244
+ | QA-PY-002 | Пропущенный тест (`skip`, нестрогий `xfail`) | warning |
245
+ | QA-PY-003 | Тестовая функция без ассертов | error |
246
+ | QA-PY-005 | `time.sleep()` в тестах | warning |
247
+ | QA-PY-012 | Тавтологический ассерт | error |
254
248
 
255
249
  Всего 20 Python-правил (QA-PY-001…012 гигиена pytest + QA-PY-101…108 Playwright-Python).
256
250
 
@@ -266,8 +260,6 @@ macOS и Linux.
266
260
  | QA-JV-103 | Тестовый метод без ассертов | error |
267
261
  | QA-JV-105 | Жёсткий sleep Playwright `waitForTimeout()` | warning |
268
262
  | QA-JV-106 | Хрупкий селектор вместо role-локатора | warning |
269
- | QA-JV-108 | Захардкоженный URL окружения в тесте | info |
270
- | QA-JV-111 | Бланкетный мок `page.route("**")` | info |
271
263
 
272
264
  </details>
273
265
 
@@ -281,8 +273,6 @@ macOS и Linux.
281
273
  | QA-CS-103 | Тестовый метод без ассертов | error |
282
274
  | QA-CS-105 | Жёсткий sleep `WaitForTimeoutAsync()` | warning |
283
275
  | QA-CS-106 | Хрупкий селектор вместо role-локатора | warning |
284
- | QA-CS-108 | Захардкоженный URL окружения в тесте | info |
285
- | QA-CS-111 | Бланкетный мок `page.RouteAsync("**")` | info |
286
276
 
287
277
  </details>
288
278
 
@@ -304,7 +294,6 @@ macOS и Linux.
304
294
  выходят на оценке автора. Футер каждого скана говорит, сколько из
305
295
  _сработавших_ правил измерены; `mjolnir rules --unmeasured` перечисляет
306
296
  неизмеренные; страница `mjolnir explain` каждого правила указывает её
307
- статус. Мы публикуем частоту, даже когда она уродлива — QA-PW-107
308
297
  аудируется на 95 % и за это отправлен в карантин. Увеличивать это
309
298
  число — постоянная работа проекта.
310
299
 
@@ -526,7 +515,7 @@ Mjölnir — zero-config. Опциональный `mjolnir.config.json` (или
526
515
  {
527
516
  "gate": "error",
528
517
  "exclude": ["legacy/**"],
529
- "severityOverrides": { "QA-PW-118": "warning" },
518
+ "severityOverrides": { "QA-PW-141": "warning" },
530
519
  "ignore": [
531
520
  {
532
521
  "ruleId": "QA-TEST-004",
package/README.th.md CHANGED
@@ -15,7 +15,7 @@ CI pipelines รายงานคะแนนความน่าเชื่
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | ไทย | [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)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-08.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -196,7 +196,6 @@ fixture ลบของตัวเองจะปล่อยไม่ได้
196
196
 
197
197
  | ID | กฎ | Severity |
198
198
  | ------------ | -------------------------------------- | -------- |
199
- | QA-TQUAL-001 | ตรวจยืนยันด้วย mock เท่านั้น | info |
200
199
  | QA-TQUAL-002 | assertion พรรคพวกตัวเอง (tautological) | error |
201
200
  | QA-TQUAL-009 | assertion ของ promise ที่ไม่ await | error |
202
201
  | QA-TQUAL-011 | ทดสอบที่ถูกคอมเมนต์ทิ้งไว้ | warning |
@@ -211,9 +210,6 @@ fixture ลบของตัวเองจะปล่อยไม่ได้
211
210
  | QA-PW-002 | assertion ของ locator ที่ไม่ await | error |
212
211
  | QA-PW-003 | `page.pause()` / `test.only()` ถูก commit | error |
213
212
  | QA-PW-004 | selector CSS/XPath เปราะ | warning |
214
- | QA-PW-005 | ตรรกะธุรกิจใน `page.evaluate()` | info |
215
- | QA-PW-114 | element handles รุ่นเก่า (`page.$`) | info |
216
- | QA-PW-118 | การรอ `networkidle` (flaky by design) | info |
217
213
  | QA-PW-123 | URL สภาพแวดล้อมฝังตาย | warning |
218
214
 
219
215
  </details>
@@ -241,8 +237,6 @@ fixture ลบของตัวเองจะปล่อยไม่ได้
241
237
  | QA-PY-002 | ทดสอบถูกข้าม (`skip`, `xfail` ไม่เข้มงวด) | warning |
242
238
  | QA-PY-003 | ฟังก์ชันทดสอบไม่มี assertion | error |
243
239
  | QA-PY-005 | `time.sleep()` ในการทดสอบ | warning |
244
- | QA-PY-006 | เนื้อความทดสอบว่าง (`pass`) | info |
245
- | QA-PY-010 | พึ่งพาความสุ่ม/เวลาโดยไม่ freeze | info |
246
240
  | QA-PY-012 | assertion พรรคพวกตัวเอง | error |
247
241
 
248
242
  กฎ Python รวม 20 ข้อ (QA-PY-001…012 สุขอนามัย pytest + QA-PY-101…108 Playwright-Python)
@@ -259,8 +253,6 @@ fixture ลบของตัวเองจะปล่อยไม่ได้
259
253
  | QA-JV-103 | วิธีทดสอบไม่มี assertion | error |
260
254
  | QA-JV-105 | hard sleep Playwright `waitForTimeout()` | warning |
261
255
  | QA-JV-106 | selector เปราะแทน role locator | warning |
262
- | QA-JV-108 | URL สภาพแวดล้อมฝังตายในทดสอบ | info |
263
- | QA-JV-111 | mock ครอบคลุมหมด `page.route("**")` | info |
264
256
 
265
257
  </details>
266
258
 
@@ -274,8 +266,6 @@ fixture ลบของตัวเองจะปล่อยไม่ได้
274
266
  | QA-CS-103 | วิธีทดสอบไม่มี assertion | error |
275
267
  | QA-CS-105 | hard sleep `WaitForTimeoutAsync()` | warning |
276
268
  | QA-CS-106 | selector เปราะแทน role locator | warning |
277
- | QA-CS-108 | URL สภาพแวดล้อมฝังตายในทดสอบ | info |
278
- | QA-CS-111 | mock ครอบคลุมหมด `page.RouteAsync("**")` | info |
279
269
 
280
270
  </details>
281
271
 
@@ -295,7 +285,6 @@ fixture ลบของตัวเองจะปล่อยไม่ได้
295
285
  [docs/FP-AUDIT.md](docs/FP-AUDIT.md)) อีก 21 กฎออกมาบนการประเมินของผู้เขียน
296
286
  ส่วนท้ายของทุกการสแกนบอกว่ากฎที่ _ยิง_ มีกี่กฎที่วัดแล้ว;
297
287
  `mjolnir rules --unmeasured` แสดงกฎที่ยังไม่วัด; หน้า `mjolnir explain`
298
- ของทุกกฎระบุสถานะ เราเผยแพร่อัตรานี้แม้มันจะน่าเกลียด — QA-PW-107 ตรวจได้
299
288
  ที่ 95 % และถูกส่งไปกักกันเพราะเหตุนี้ การทำให้ตัวเลขนั้นโตขึ้นคืองาน
300
289
  ต่อเนื่องของโปรเจกต์
301
290
 
@@ -510,7 +499,7 @@ Mjölnir เป็น zero-config `mjolnir.config.json` (หรือ `.mjolnir.
510
499
  {
511
500
  "gate": "error",
512
501
  "exclude": ["legacy/**"],
513
- "severityOverrides": { "QA-PW-118": "warning" },
502
+ "severityOverrides": { "QA-PW-141": "warning" },
514
503
  "ignore": [
515
504
  {
516
505
  "ruleId": "QA-TEST-004",
package/README.tr.md CHANGED
@@ -15,7 +15,7 @@ olarak nerede kırıldığını gösterir.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | [Deutsch](README.de.md) | [Español](README.es.md) | [Français](README.fr.md) | [Italiano](README.it.md) | [Dansk](README.da.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | Türkçe | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | [العربية](README.ar.md) | [Bosanski](README.bs.md)
17
17
 
18
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
18
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-08.
19
19
 
20
20
  ```bash
21
21
  npx mjolnir-qa@latest
@@ -200,7 +200,6 @@ yanlış pozitif duvarıdır.
200
200
 
201
201
  | ID | Kural | Severity |
202
202
  | ------------ | ----------------------------------- | -------- |
203
- | QA-TQUAL-001 | Yalnızca mock ile doğrulama | info |
204
203
  | QA-TQUAL-002 | Totolojik assertion | error |
205
204
  | QA-TQUAL-009 | Await edilmemiş promise assertion'ı | error |
206
205
  | QA-TQUAL-011 | Yorum satırına çevrilmiş testler | warning |
@@ -215,9 +214,6 @@ yanlış pozitif duvarıdır.
215
214
  | QA-PW-002 | Await edilmemiş locator assertion'ı | error |
216
215
  | QA-PW-003 | Commit edilmiş `page.pause()` / `test.only()` | error |
217
216
  | QA-PW-004 | Kırılgan CSS/XPath seçicileri | warning |
218
- | QA-PW-005 | `page.evaluate()` içinde iş mantığı | info |
219
- | QA-PW-114 | Eski element handle'ları (`page.$`) | info |
220
- | QA-PW-118 | `networkidle` beklemeleri (flaky by design) | info |
221
217
  | QA-PW-123 | Sabitlenmiş ortam URL'leri | warning |
222
218
 
223
219
  </details>
@@ -240,14 +236,12 @@ yanlış pozitif duvarıdır.
240
236
  <details>
241
237
  <summary><strong>Python / pytest 🐍</strong></summary>
242
238
 
243
- | ID | Kural | Severity |
244
- | --------- | -------------------------------------------- | -------- |
245
- | QA-PY-002 | Atlanan test (`skip`, katı olmayan `xfail`) | warning |
246
- | QA-PY-003 | Assertion içermeyen test fonksiyonu | error |
247
- | QA-PY-005 | Testlerde `time.sleep()` | warning |
248
- | QA-PY-006 | Boş test gövdesi (`pass`) | info |
249
- | QA-PY-010 | Freeze olmadan rastgelelik/zaman bağımlılığı | info |
250
- | QA-PY-012 | Totolojik assertion | error |
239
+ | ID | Kural | Severity |
240
+ | --------- | ------------------------------------------- | -------- |
241
+ | QA-PY-002 | Atlanan test (`skip`, katı olmayan `xfail`) | warning |
242
+ | QA-PY-003 | Assertion içermeyen test fonksiyonu | error |
243
+ | QA-PY-005 | Testlerde `time.sleep()` | warning |
244
+ | QA-PY-012 | Totolojik assertion | error |
251
245
 
252
246
  Toplam 20 Python kuralı (QA-PY-001…012 pytest hijyeni + QA-PY-101…108 Playwright-Python).
253
247
 
@@ -263,8 +257,6 @@ Toplam 20 Python kuralı (QA-PY-001…012 pytest hijyeni + QA-PY-101…108 Playw
263
257
  | QA-JV-103 | Assertion içermeyen test yöntemi | error |
264
258
  | QA-JV-105 | Playwright katı sleep `waitForTimeout()` | warning |
265
259
  | QA-JV-106 | Role locator yerine kırılgan seçici | warning |
266
- | QA-JV-108 | Testte sabitlenmiş ortam URL'si | info |
267
- | QA-JV-111 | Kapsayıcı mock `page.route("**")` | info |
268
260
 
269
261
  </details>
270
262
 
@@ -278,8 +270,6 @@ Toplam 20 Python kuralı (QA-PY-001…012 pytest hijyeni + QA-PY-101…108 Playw
278
270
  | QA-CS-103 | Assertion içermeyen test yöntemi | error |
279
271
  | QA-CS-105 | Katı sleep `WaitForTimeoutAsync()` | warning |
280
272
  | QA-CS-106 | Role locator yerine kırılgan seçici | warning |
281
- | QA-CS-108 | Testte sabitlenmiş ortam URL'si | info |
282
- | QA-CS-111 | Kapsayıcı mock `page.RouteAsync("**")` | info |
283
273
 
284
274
  </details>
285
275
 
@@ -300,7 +290,6 @@ oranı taşıyor** (her biri için ≥ 10 elle sınıflandırılmış bulgu; bkz
300
290
  yayına giriyor. Her tarama alt bilgisi, _tetiklenen_ kuralların kaçının
301
291
  ölçüldüğünü söyler; `mjolnir rules --unmeasured` ölçülmeyenleri listeler;
302
292
  her kuralın `mjolnir explain` sayfası durumunu belirtir. Oranı çirkin
303
- olduğunda bile yayımlarız — QA-PW-107 %95 ile denetleniyor ve bu yüzden
304
293
  karantinada. O sayıyı büyütmek, projenin süregelen işidir.
305
294
 
306
295
  ### Kural katmanları ve dil olgunluğu
@@ -522,7 +511,7 @@ ayarlar — algılama anlamını asla değiştirmez.
522
511
  {
523
512
  "gate": "error",
524
513
  "exclude": ["legacy/**"],
525
- "severityOverrides": { "QA-PW-118": "warning" },
514
+ "severityOverrides": { "QA-PW-141": "warning" },
526
515
  "ignore": [
527
516
  {
528
517
  "ruleId": "QA-TEST-004",