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/CHANGELOG.md CHANGED
@@ -9,6 +9,155 @@ Rule behavior changes (new rules, FP-rate changes against the corpus,
9
9
  severity changes) are first-class entries here — rule IDs are immutable
10
10
  once shipped, so this file is the record of what changed between versions.
11
11
 
12
+ ## [0.6.7] — 2026-09-09
13
+
14
+ ### Changes since 0.6.6
15
+
16
+ - fix(tests): fresh-install gate asserts the Trust Report surface (WI-5 follow-through)
17
+
18
+ ## [0.6.6] — 2026-09-09
19
+
20
+ ### Changes since 0.6.5
21
+
22
+ - fix(release): format the collapsed CHANGELOG before the lint gate (bot fix)
23
+
24
+ ## [0.6.5] — 2026-09-09
25
+
26
+ ### Changes since 0.6.4
27
+
28
+ - chore(test): re-baseline the coverage ratchet for the 0.6.x line (measured 99.8/99.37/99.81/99.82; per-file pause documented)
29
+
30
+ ## [0.6.4] — 2026-09-09
31
+
32
+ ### Changes since 0.6.3
33
+
34
+ ## [0.6.3] — 2026-09-09
35
+
36
+ ### Added
37
+
38
+ - `trust-report --from <mjolnir.json> [--stdout]` (WI-9): the Trust
39
+ Artifact rendered from a SAVED canonical scan result — the GitHub
40
+ Action's comment/annotation steps derive from the exact saved report
41
+ (one semantic truth, no second scan). Includes honest error paths:
42
+ read / parse / write failures each surface their own catch via the
43
+ consolidated `errorMessage` derivation in cli-io.ts.
44
+
45
+ ### Fixed
46
+
47
+ - Error-path hardening across the trust-report verb: read and parse
48
+ failures split into separate honest catches; artifact-write failures
49
+ (disk-full / permission) exit 20 instead of crashing; the
50
+ no-positional default-target arm covered.
51
+
52
+ ## [0.6.2] — 2026-09-09
53
+
54
+ ### Changes since 0.6.1
55
+
56
+ - Create FUNDING.yml
57
+
58
+ ## [0.6.1] — 2026-09-09
59
+
60
+ ### Changes since 0.6.0
61
+
62
+ ## [0.6.0] — 2026-09-09
63
+
64
+ ### Changed
65
+
66
+ - Version line opens: **0.6.x = Productized Core (plan §31)**. The full
67
+ workstream-A capability set (Trust Report hero surface, Canonical
68
+ Evidence Core, trustSummary metrics, machine contract extension,
69
+ explain v2, triage v2 guided workflow, Action Trust-Report
70
+ consumption, zero-config evidence discovery, CHANGELOG integrity
71
+ gate, mvp-demo corpus + golden harness, E-1 retirement of 21 rules —
72
+ active census 78 rules: 57 measured, 21 PROVISIONAL) shipped in
73
+ **0.5.40**, the first release produced under the active CHANGELOG
74
+ integrity gate. 0.6.0 establishes the 0.6.x version line; no code
75
+ changes in this release.
76
+
77
+ ## [0.5.40] — 2026-09-09
78
+
79
+ ### Added
80
+
81
+ - **Trust Report — the hero product surface (WI-5).** `mjolnir` now leads
82
+ with the five questions — TRUST VERDICT (trust level + headline),
83
+ CONFIDENCE (confidence, evidence coverage, inconclusive rate, measured-FP
84
+ of fired rules, tests analyzed), WHY THIS VERDICT (evidence-backed
85
+ reasons), TOP TRUST RISKS (corroboration-ranked), NEXT ACTION (concrete
86
+ command) — all rendered from the canonical scan result only (every
87
+ number exists in `--json`). `--classic` escapes to the previous render;
88
+ rendering flag only, semantics and exit codes unchanged.
89
+ - **`mjolnir trust-report` (WI-6).** Emits deterministic, self-contained
90
+ `mjolnir-trust-report.{md,json}` — no cloud/telemetry; PR-attachable,
91
+ agent-consumable; byte-identical for the same scan.
92
+ - **`trustSummary` on the scan JSON (WI-3, plan §6).** Scan-level trust
93
+ measurement: level, ceiling-capped confidence (partial 0.5 /
94
+ truncation 0.6 / rules-crashed 0.8 / framework-unknown 0.9),
95
+ evidenceCoverage, inconclusiveRate, measuredFpOfFiredRules with
96
+ PROVISIONAL disclosure of unmeasured fired rules. Formulas published in
97
+ `docs/SCORING.md`.
98
+ - **Machine contract extension (WI-4).** `buildMachineContract` now
99
+ carries `trustSummary` and `provenance` verbatim from the canonical
100
+ result, plus a reserved `forensicVerdicts` slot (unpopulated until the
101
+ 1.1.x forensic taxonomy). `contractVersion` stays 1; additive only.
102
+ - **Canonical Evidence Core (WI-2).** `src/engine/evidence-core.ts` — one
103
+ normalized `EvidenceRecord` shape with deterministic ordering; the scan
104
+ pipeline fans all runtime evidence through it; stamping semantics
105
+ preserved byte-identically (differential preservation suite).
106
+ - **Explain v2 (WI-7).** `mjolnir explain` gains verdict mode
107
+ (`mjolnir explain verdict --json <mjolnir.json>`) and finding mode
108
+ (file:line delegates to `mjolnir why`); every mode now answers the §8
109
+ checklist including WHAT WOULD CHANGE THE VERDICT and NEXT ACTION.
110
+ - **Triage v2 (WI-8).** `mjolnir triage` now runs the §9 guided workflow —
111
+ CLASSIFY → EVIDENCE → TRUST VERDICT → NEXT ACTION per row, every row
112
+ ending in a concrete command; `--classic` keeps the table, `--json`
113
+ emits the structured twin.
114
+ - **Zero-config evidence discovery (WI-11).** The scan auto-discovers
115
+ run evidence from conventional layouts (mjolnir.report.json, PW JSON
116
+ reporter names, test-results/, JUnit XML) at depth ≤ 2; scans without
117
+ evidence state exactly what is missing and the honest trust ceiling.
118
+ - **Canonical MVP evidence corpus + golden harness stage 1 (WI-13A/B).**
119
+ `examples/mvp-demo/` covers all 12 evidence case classes (9 active / 3
120
+ awaiting-ingestion, trace.zip deferred to WI-17); the stage-1 harness
121
+ proves same-evidence → same-verdict across CLI + JSON with
122
+ INCONCLUSIVE-as-pass semantics.
123
+ - **CHANGELOG integrity gate (WI-12A).** `scripts/check-changelog.ts` is
124
+ release-blocking in the release workflow (before publish, before
125
+ Release creation) and runs on every main CI build: released version
126
+ must have a dated CHANGELOG section; gate-era headings strictly
127
+ ordered; rule changes must be documented.
128
+
129
+ ### Removed
130
+
131
+ - **21 rules retired and unregistered (E-1 retirement reconciliation, owner
132
+ ruling 2026-09-08).** `RETIRED_RULE_IDS` (in `src/rules/index.ts`) is now the
133
+ canonical, auditable record of retirement: a rule explicitly marked RETIRED by
134
+ `docs/RULE-LIFECYCLE.md`'s Phase 2 quarantine-cluster triage no longer counts
135
+ toward the active registry, the census, or the measurement KPI — quarantine
136
+ does not equal retirement. The active registry is now **78 rules (57 measured,
137
+ 21 author-estimated)**. Every removed rule was measured at 100% FP with zero
138
+ true positives (n ≥ 10 each, `docs/FP-AUDIT.md`), i.e. its premise is wrong on
139
+ real code, not its tuning. Behavioral impact: none on default scans (all 21
140
+ were quarantine-tier, which runs only under `--strict`); `--strict` scans stop
141
+ reporting these advisory findings. Evidence level of every removed finding was
142
+ E0 (observation only, never gating). Measurement status: all 21 measured at
143
+ 1.0 FP rate (detector revision 1) — the measurements and their verdict rows
144
+ are preserved as history (`tests/corpus/verdicts/archive/`,
145
+ `docs/RULE-LIFECYCLE.md`). User-visible impact: fewer false-positive advisory
146
+ findings under `--strict`; the "99 rules" claim everywhere becomes the honest
147
+ count of active canonical rules (78). Frozen IDs are never reused; the
148
+ retired IDs are listed with per-rule rationale in `RETIRED_RULE_IDS`.
149
+ Removed IDs — Playwright TS: QA-PW-005, QA-PW-103, QA-PW-105, QA-PW-107,
150
+ QA-PW-108, QA-PW-112, QA-PW-114, QA-PW-118, QA-PW-119, QA-PW-120, QA-PW-145;
151
+ quality: QA-TQUAL-001; Python: QA-PY-006, QA-PY-008, QA-PY-010; family
152
+ variants: QA-JV-108, QA-CS-108 (hardcoded-URL), QA-JV-110, QA-CS-110
153
+ (no-a11y), QA-JV-111, QA-CS-111 (blanket-route).
154
+
155
+ ## [0.5.39] — 2026-09-09
156
+
157
+ ### Changes since 0
158
+
159
+ - P9: bus-factor program — MAINTAINERS ladder, OWNER-RUNBOOK, ADJUDICATION-KIT, CODEOWNERS (#69)
160
+
12
161
  ## [0.5.38] — 2026-09-09
13
162
 
14
163
  ### Changes since 0
package/README.ar.md CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  [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.tr.md) | [Українська](README.uk.md) | [বাংলা](README.bn.md) | [Ελληνικά](README.gr.md) | [Tiếng Việt](README.vi.md) | [עברית](README.he.md) | العربية | [Bosanski](README.bs.md)
16
16
 
17
- > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-07.
17
+ > 🤖 Machine-assisted translation. The [English README](README.md) is canonical. Last synced: 2026-09-08.
18
18
 
19
19
  ```bash
20
20
  npx mjolnir-qa@latest
@@ -196,7 +196,6 @@ npx mjolnir-qa@latest --scope changed
196
196
 
197
197
  | ID | القاعدة | Severity |
198
198
  | ------------ | ------------------------- | -------- |
199
- | QA-TQUAL-001 | تحقق بالمحاكاة فقط | info |
200
199
  | QA-TQUAL-002 | تأكيد مُبرهن ذاتيًا | error |
201
200
  | QA-TQUAL-009 | تأكيد وعد بلا await | error |
202
201
  | QA-TQUAL-011 | اختبارات معطَّلة بالتعليق | warning |
@@ -206,15 +205,12 @@ npx mjolnir-qa@latest --scope changed
206
205
  <details>
207
206
  <summary><strong>Playwright 🎭</strong></summary>
208
207
 
209
- | ID | القاعدة | Severity |
210
- | --------- | ----------------------------------------- | -------- |
211
- | QA-PW-002 | تأكيد محدِّد بلا await | error |
212
- | QA-PW-003 | `page.pause()` / `test.only()` مودعة | error |
213
- | QA-PW-004 | محدِّدات CSS/XPath هشّة | warning |
214
- | QA-PW-005 | منطق عمل داخل `page.evaluate()` | info |
215
- | QA-PW-114 | مقابض عناصر قديمة (`page.$`) | info |
216
- | QA-PW-118 | انتظارات `networkidle` (متذبذبة بطبيعتها) | info |
217
- | QA-PW-123 | عناوين بيئات مضمّنة | warning |
208
+ | ID | القاعدة | Severity |
209
+ | --------- | ------------------------------------ | -------- |
210
+ | QA-PW-002 | تأكيد محدِّد بلا await | error |
211
+ | QA-PW-003 | `page.pause()` / `test.only()` مودعة | error |
212
+ | QA-PW-004 | محدِّدات CSS/XPath هشّة | warning |
213
+ | QA-PW-123 | عناوين بيئات مضمّنة | warning |
218
214
 
219
215
  </details>
220
216
 
@@ -241,8 +237,6 @@ npx mjolnir-qa@latest --scope changed
241
237
  | QA-PY-002 | اختبار متجاوز (`skip`، `xfail` غير صارم) | warning |
242
238
  | QA-PY-003 | دالة اختبار بلا تأكيدات | 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 | تأكيد مُبرهن ذاتيًا | error |
247
241
 
248
242
  20 قاعدة Python إجمالًا (QA-PY-001…012 نظافة pytest + QA-PY-101…108 Playwright-Python).
@@ -259,8 +253,6 @@ npx mjolnir-qa@latest --scope changed
259
253
  | QA-JV-103 | طريقة اختبار بلا تأكيدات | error |
260
254
  | QA-JV-105 | سبات صارم في Playwright `waitForTimeout()` | warning |
261
255
  | QA-JV-106 | محدِّد هشّ بدل role locator | warning |
262
- | QA-JV-108 | عنوان بيئة مضمّن في اختبار | info |
263
- | QA-JV-111 | محاكاة شاملة `page.route("**")` | info |
264
256
 
265
257
  </details>
266
258
 
@@ -274,8 +266,6 @@ npx mjolnir-qa@latest --scope changed
274
266
  | QA-CS-103 | طريقة اختبار بلا تأكيدات | error |
275
267
  | QA-CS-105 | سبات صارم `WaitForTimeoutAsync()` | warning |
276
268
  | QA-CS-106 | محدِّد هشّ بدل role locator | warning |
277
- | QA-CS-108 | عنوان بيئة مضمّن في اختبار | info |
278
- | QA-CS-111 | محاكاة شاملة `page.RouteAsync("**")` | info |
279
269
 
280
270
  </details>
281
271
 
@@ -295,7 +285,6 @@ npx mjolnir-qa@latest --scope changed
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
 
@@ -505,7 +494,7 @@ Mjölnir صفر إعداد. ملف `mjolnir.config.json` اختياري (أو `.
505
494
  {
506
495
  "gate": "error",
507
496
  "exclude": ["legacy/**"],
508
- "severityOverrides": { "QA-PW-118": "warning" },
497
+ "severityOverrides": { "QA-PW-141": "warning" },
509
498
  "ignore": [
510
499
  {
511
500
  "ruleId": "QA-TEST-004",
package/README.bn.md CHANGED
@@ -15,7 +15,7 @@
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.tr.md) | [Українська](README.uk.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
@@ -199,7 +199,6 @@ false-positive ফায়ারওয়াল।
199
199
 
200
200
  | ID | রুল | Severity |
201
201
  | ------------ | ----------------------------- | -------- |
202
- | QA-TQUAL-001 | শুধু mock-ভিত্তিক যাচাই | info |
203
202
  | QA-TQUAL-002 | টাটলজিক্যাল assertion | error |
204
203
  | QA-TQUAL-009 | await-বিহীন promise assertion | error |
205
204
  | QA-TQUAL-011 | কমেন্ট-আউট করা টেস্ট | warning |
@@ -214,9 +213,6 @@ false-positive ফায়ারওয়াল।
214
213
  | QA-PW-002 | await-বিহীন locator assertion | error |
215
214
  | QA-PW-003 | কমিট করা `page.pause()` / `test.only()` | error |
216
215
  | QA-PW-004 | ভঙ্গুর CSS/XPath selector | warning |
217
- | QA-PW-005 | `page.evaluate()`-এর ভিতরে বিজনেস লজিক | info |
218
- | QA-PW-114 | লিগেসি element handle (`page.$`) | info |
219
- | QA-PW-118 | `networkidle` wait (flaky by design) | info |
220
216
  | QA-PW-123 | hardcode করা পরিবেশ URL | warning |
221
217
 
222
218
  </details>
@@ -244,8 +240,6 @@ false-positive ফায়ারওয়াল।
244
240
  | QA-PY-002 | বাদ দেওয়া টেস্ট (`skip`, কঠোর-নয় এমন `xfail`) | warning |
245
241
  | QA-PY-003 | assertion-বিহীন টেস্ট ফাংশন | error |
246
242
  | QA-PY-005 | টেস্টে `time.sleep()` | warning |
247
- | QA-PY-006 | খালি টেস্ট বডি (`pass`) | info |
248
- | QA-PY-010 | freeze ছাড়া এলোমেলো/সময় নির্ভরতা | info |
249
243
  | QA-PY-012 | টাটলজিক্যাল assertion | error |
250
244
 
251
245
  মোট ২০টি Python রুল (QA-PY-001…012 pytest হাইজিন + QA-PY-101…108 Playwright-Python)।
@@ -262,8 +256,6 @@ false-positive ফায়ারওয়াল।
262
256
  | QA-JV-103 | assertion-বিহীন টেস্ট মেথড | error |
263
257
  | QA-JV-105 | Playwright কড়া sleep `waitForTimeout()` | warning |
264
258
  | QA-JV-106 | role locator-এর বদলে ভঙ্গুর selector | warning |
265
- | QA-JV-108 | টেস্টে hardcode করা পরিবেশ URL | info |
266
- | QA-JV-111 | ছাতা-মক `page.route("**")` | info |
267
259
 
268
260
  </details>
269
261
 
@@ -277,8 +269,6 @@ false-positive ফায়ারওয়াল।
277
269
  | QA-CS-103 | assertion-বিহীন টেস্ট মেথড | error |
278
270
  | QA-CS-105 | কড়া sleep `WaitForTimeoutAsync()` | warning |
279
271
  | QA-CS-106 | role locator-এর বদলে ভঙ্গুর selector | warning |
280
- | QA-CS-108 | টেস্টে hardcode করা পরিবেশ URL | info |
281
- | QA-CS-111 | ছাতা-মক `page.RouteAsync("**")` | info |
282
272
 
283
273
  </details>
284
274
 
@@ -299,7 +289,6 @@ false-positive ফায়ারওয়াল।
299
289
  প্রতিটি স্ক্যানের ফুটার বলে দেয় _ফায়ার_ করা রুলগুলোর কতগুলো পরিমাপকৃত;
300
290
  `mjolnir rules --unmeasured` যেগুলো নয় তা তালিকাভুক্ত করে; প্রতিটি রুলের
301
291
  `mjolnir explain` পেজ তার অবস্থা জানায়। আমরা হারটি প্রকাশ করি — এমনকি
302
- কুৎসিত হলেও — QA-PW-107 ৯৫%-এ অডিট হয় এবং এজন্যই কোয়ারেন্টাইনে। সেই
303
292
  সংখ্যা বাড়ানোই প্রজেক্টের চলমান কাজ।
304
293
 
305
294
  ### রুল টিয়ার ও ভাষা-পরিপক্বতা
@@ -514,7 +503,7 @@ Mjölnir zero-config। রিপো রুটে ঐচ্ছিক `mjolnir.co
514
503
  {
515
504
  "gate": "error",
516
505
  "exclude": ["legacy/**"],
517
- "severityOverrides": { "QA-PW-118": "warning" },
506
+ "severityOverrides": { "QA-PW-141": "warning" },
518
507
  "ignore": [
519
508
  {
520
509
  "ruleId": "QA-TEST-004",
package/README.br.md CHANGED
@@ -15,7 +15,7 @@ exatamente onde a confiança se quebra.
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.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
@@ -204,7 +204,6 @@ que dispara na própria fixture negativa não pode ser publicada — esse
204
204
 
205
205
  | ID | Regra | Severity |
206
206
  | ------------ | ----------------------------- | -------- |
207
- | QA-TQUAL-001 | Verificação só com mocks | info |
208
207
  | QA-TQUAL-002 | Asserção tautológica | error |
209
208
  | QA-TQUAL-009 | Asserção de promise sem await | error |
210
209
  | QA-TQUAL-011 | Testes comentados | warning |
@@ -214,15 +213,12 @@ que dispara na própria fixture negativa não pode ser publicada — esse
214
213
  <details>
215
214
  <summary><strong>Playwright 🎭</strong></summary>
216
215
 
217
- | ID | Regra | Severity |
218
- | --------- | --------------------------------------------- | -------- |
219
- | QA-PW-002 | Asserção de locator sem await | error |
220
- | QA-PW-003 | `page.pause()` / `test.only()` commitados | error |
221
- | QA-PW-004 | Seletores CSS/XPath frágeis | warning |
222
- | QA-PW-005 | Lógica de negócio dentro de `page.evaluate()` | info |
223
- | QA-PW-114 | Element handles legados (`page.$`) | info |
224
- | QA-PW-118 | Esperas `networkidle` (instáveis por design) | info |
225
- | QA-PW-123 | URLs de ambiente fixas no código | warning |
216
+ | ID | Regra | Severity |
217
+ | --------- | ----------------------------------------- | -------- |
218
+ | QA-PW-002 | Asserção de locator sem await | error |
219
+ | QA-PW-003 | `page.pause()` / `test.only()` commitados | error |
220
+ | QA-PW-004 | Seletores CSS/XPath frágeis | warning |
221
+ | QA-PW-123 | URLs de ambiente fixas no código | warning |
226
222
 
227
223
  </details>
228
224
 
@@ -244,14 +240,12 @@ que dispara na própria fixture negativa não pode ser publicada — esse
244
240
  <details>
245
241
  <summary><strong>Python / pytest 🐍</strong></summary>
246
242
 
247
- | ID | Regra | Severity |
248
- | --------- | --------------------------------------------- | -------- |
249
- | QA-PY-002 | Teste pulado (`skip`, `xfail` não estrito) | warning |
250
- | QA-PY-003 | Função de teste sem asserções | error |
251
- | QA-PY-005 | `time.sleep()` em testes | warning |
252
- | QA-PY-006 | Corpo de teste vazio (`pass`) | info |
253
- | QA-PY-010 | Dependência de aleatoriedade/tempo sem freeze | info |
254
- | QA-PY-012 | Asserção tautológica | error |
243
+ | ID | Regra | Severity |
244
+ | --------- | ------------------------------------------ | -------- |
245
+ | QA-PY-002 | Teste pulado (`skip`, `xfail` não estrito) | warning |
246
+ | QA-PY-003 | Função de teste sem asserções | error |
247
+ | QA-PY-005 | `time.sleep()` em testes | warning |
248
+ | QA-PY-012 | Asserção tautológica | error |
255
249
 
256
250
  20 regras Python no total (QA-PY-001…012 higiene pytest + QA-PY-101…108 Playwright-Python).
257
251
 
@@ -267,8 +261,6 @@ que dispara na própria fixture negativa não pode ser publicada — esse
267
261
  | QA-JV-103 | Método de teste sem asserções | error |
268
262
  | QA-JV-105 | Sleep fixo do Playwright `waitForTimeout()` | warning |
269
263
  | QA-JV-106 | Seletor frágil em vez de role locator | warning |
270
- | QA-JV-108 | URL de ambiente fixa no teste | info |
271
- | QA-JV-111 | Mock generalizado `page.route("**")` | info |
272
264
 
273
265
  </details>
274
266
 
@@ -282,8 +274,6 @@ que dispara na própria fixture negativa não pode ser publicada — esse
282
274
  | QA-CS-103 | Método de teste sem asserções | error |
283
275
  | QA-CS-105 | Sleep fixo `WaitForTimeoutAsync()` | warning |
284
276
  | QA-CS-106 | Seletor frágil em vez de role locator | warning |
285
- | QA-CS-108 | URL de ambiente fixa no teste | info |
286
- | QA-CS-111 | Mock generalizado `page.RouteAsync("**")` | info |
287
277
 
288
278
  </details>
289
279
 
@@ -305,7 +295,6 @@ código OSS real** (≥ 10 findings classificados à mão cada; veja
305
295
  a estimativa do autor. O rodapé de cada escaneio diz quantas das regras
306
296
  _que dispararam_ são medidas; `mjolnir rules --unmeasured` lista as que
307
297
  não são; a página `mjolnir explain` de cada regra declara seu status.
308
- Publicamos a taxa mesmo quando ela é feia — QA-PW-107 audita em 95 % e
309
298
  está em quarentena por isso. Fazer esse número crescer é o trabalho contínuo
310
299
  do projeto.
311
300
 
@@ -529,7 +518,7 @@ ele nunca muda a semântica de detecção.
529
518
  {
530
519
  "gate": "error",
531
520
  "exclude": ["legacy/**"],
532
- "severityOverrides": { "QA-PW-118": "warning" },
521
+ "severityOverrides": { "QA-PW-141": "warning" },
533
522
  "ignore": [
534
523
  {
535
524
  "ruleId": "QA-TEST-004",
package/README.bs.md CHANGED
@@ -15,7 +15,7 @@ povjerenje lomi.
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.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
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
@@ -197,7 +197,6 @@ to je vatrozid lažnih pozitiva.
197
197
 
198
198
  | ID | Pravilo | Severity |
199
199
  | ------------ | ----------------------------- | -------- |
200
- | QA-TQUAL-001 | Verifikacija samo mockovima | info |
201
200
  | QA-TQUAL-002 | Tautološka asercija | error |
202
201
  | QA-TQUAL-009 | Asercija neawaitanog promisea | error |
203
202
  | QA-TQUAL-011 | Komentarisani testovi | warning |
@@ -212,9 +211,6 @@ to je vatrozid lažnih pozitiva.
212
211
  | QA-PW-002 | Asercija lokatora bez awaita | error |
213
212
  | QA-PW-003 | `page.pause()` / `test.only()` commitirani | error |
214
213
  | QA-PW-004 | Krhki CSS/XPath selektori | warning |
215
- | QA-PW-005 | Poslovna logika unutar `page.evaluate()` | info |
216
- | QA-PW-114 | Legacy element handleovi (`page.$`) | info |
217
- | QA-PW-118 | `networkidle` čekanja (flaky po dizajnu) | info |
218
214
  | QA-PW-123 | Ugrađeni URL-ovi okruženja | warning |
219
215
 
220
216
  </details>
@@ -237,14 +233,12 @@ to je vatrozid lažnih pozitiva.
237
233
  <details>
238
234
  <summary><strong>Python / pytest 🐍</strong></summary>
239
235
 
240
- | ID | Pravilo | Severity |
241
- | --------- | ------------------------------------------ | -------- |
242
- | QA-PY-002 | Preskočen test (`skip`, nestrogi `xfail`) | warning |
243
- | QA-PY-003 | Test funkcija bez asercija | error |
244
- | QA-PY-005 | `time.sleep()` u testovima | warning |
245
- | QA-PY-006 | Prazno tijelo testa (`pass`) | info |
246
- | QA-PY-010 | Ovisnost o slučajnosti/vremenu bez freezea | info |
247
- | QA-PY-012 | Tautološka asercija | error |
236
+ | ID | Pravilo | Severity |
237
+ | --------- | ----------------------------------------- | -------- |
238
+ | QA-PY-002 | Preskočen test (`skip`, nestrogi `xfail`) | warning |
239
+ | QA-PY-003 | Test funkcija bez asercija | error |
240
+ | QA-PY-005 | `time.sleep()` u testovima | warning |
241
+ | QA-PY-012 | Tautološka asercija | error |
248
242
 
249
243
  Ukupno 20 Python pravila (QA-PY-001…012 pytest higijena + QA-PY-101…108 Playwright-Python).
250
244
 
@@ -260,8 +254,6 @@ Ukupno 20 Python pravila (QA-PY-001…012 pytest higijena + QA-PY-101…108 Play
260
254
  | QA-JV-103 | Test metoda bez asercija | error |
261
255
  | QA-JV-105 | Tvrdi sleep Playwright `waitForTimeout()` | warning |
262
256
  | QA-JV-106 | Krhki selektor umjesto role lokatora | warning |
263
- | QA-JV-108 | Ugrađeni URL okruženja u testu | info |
264
- | QA-JV-111 | Pokrivni mock `page.route("**")` | info |
265
257
 
266
258
  </details>
267
259
 
@@ -275,8 +267,6 @@ Ukupno 20 Python pravila (QA-PY-001…012 pytest higijena + QA-PY-101…108 Play
275
267
  | QA-CS-103 | Test metoda bez asercija | error |
276
268
  | QA-CS-105 | Tvrdi sleep `WaitForTimeoutAsync()` | warning |
277
269
  | QA-CS-106 | Krhki selektor umjesto role lokatora | warning |
278
- | QA-CS-108 | Ugrađeni URL okruženja u testu | info |
279
- | QA-CS-111 | Pokrivni mock `page.RouteAsync("**")` | info |
280
270
 
281
271
  </details>
282
272
 
@@ -297,7 +287,6 @@ OSS kodom** (≥ 10 ručno klasificiranih nalaza svako; vidi
297
287
  procjeni. Podnožje svakog skana kaže koliko od _okinutih_ pravila je
298
288
  izmjereno; `mjolnir rules --unmeasured` izlista neizmjerena; stranica
299
289
  `mjolnir explain` svakog pravila navodi njen status. Objavljujemo stopu
300
- čak i kad je ružna — QA-PW-107 se audita na 95 % i u karanteni je radi
301
290
  toga. Rast tog broja je neprekidni rad projekta.
302
291
 
303
292
  ### Tierovi pravila i jezična zrelost
@@ -516,7 +505,7 @@ nikad ne mijenja semantiku detekcije.
516
505
  {
517
506
  "gate": "error",
518
507
  "exclude": ["legacy/**"],
519
- "severityOverrides": { "QA-PW-118": "warning" },
508
+ "severityOverrides": { "QA-PW-141": "warning" },
520
509
  "ignore": [
521
510
  {
522
511
  "ruleId": "QA-TEST-004",
package/README.da.md CHANGED
@@ -15,7 +15,7 @@ tilliden brister.
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.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)
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
@@ -202,7 +202,6 @@ det er false-positive-firewallen.
202
202
 
203
203
  | ID | Regel | Severity |
204
204
  | ------------ | ------------------------------- | -------- |
205
- | QA-TQUAL-001 | Kun-mock-verifikation | info |
206
205
  | QA-TQUAL-002 | Tautologisk assertion | error |
207
206
  | QA-TQUAL-009 | Assertion på promise uden await | error |
208
207
  | QA-TQUAL-011 | Udkommenterede tests | warning |
@@ -217,9 +216,6 @@ det er false-positive-firewallen.
217
216
  | QA-PW-002 | Locator-assertion uden await | error |
218
217
  | QA-PW-003 | `page.pause()` / `test.only()` committet | error |
219
218
  | QA-PW-004 | Skrøbelige CSS/XPath-selectors | warning |
220
- | QA-PW-005 | Forretningslogik i `page.evaluate()` | info |
221
- | QA-PW-114 | Legacy element handles (`page.$`) | info |
222
- | QA-PW-118 | `networkidle`-venten (flaky by design) | info |
223
219
  | QA-PW-123 | Hårdkodede miljø-URL'er | warning |
224
220
 
225
221
  </details>
@@ -247,8 +243,6 @@ det er false-positive-firewallen.
247
243
  | QA-PY-002 | Sprunget test (`skip`, ikke-strikt `xfail`) | warning |
248
244
  | QA-PY-003 | Testfunktion uden assertions | error |
249
245
  | QA-PY-005 | `time.sleep()` i tests | warning |
250
- | QA-PY-006 | Tomt testlegeme (`pass`) | info |
251
- | QA-PY-010 | Tilfældigheds-/tidsafhængighed uden freeze | info |
252
246
  | QA-PY-012 | Tautologisk assertion | error |
253
247
 
254
248
  20 Python-regler i alt (QA-PY-001…012 pytest-hygiejne + QA-PY-101…108 Playwright-Python).
@@ -265,8 +259,6 @@ det er false-positive-firewallen.
265
259
  | QA-JV-103 | Testmetode uden assertions | error |
266
260
  | QA-JV-105 | Playwright hårdt sleep `waitForTimeout()` | warning |
267
261
  | QA-JV-106 | Skrøbelig selector i stedet for role-locator | warning |
268
- | QA-JV-108 | Hårdkodet miljø-URL i test | info |
269
- | QA-JV-111 | Blanket-mock `page.route("**")` | info |
270
262
 
271
263
  </details>
272
264
 
@@ -280,8 +272,6 @@ det er false-positive-firewallen.
280
272
  | QA-CS-103 | Testmetode uden assertions | error |
281
273
  | QA-CS-105 | Hårdt sleep `WaitForTimeoutAsync()` | warning |
282
274
  | QA-CS-106 | Skrøbelig selector i stedet for role-locator | warning |
283
- | QA-CS-108 | Hårdkodet miljø-URL i test | info |
284
- | QA-CS-111 | Blanket-mock `page.RouteAsync("**")` | info |
285
275
 
286
276
  </details>
287
277
 
@@ -303,7 +293,6 @@ det er false-positive-firewallen.
303
293
  estimat. Hver scan-fodnote fortæller, hvor mange af de _udløste_ regler,
304
294
  der er målt; `mjolnir rules --unmeasured` lister de uregistrerede; hver
305
295
  regels `mjolnir explain`-side angiver dens status. Vi offentliggør
306
- raten, selv når den er grim — QA-PW-107 auditeres til 95 % og er sat i
307
296
  karantæne for det. At få det tal til at vokse er projektets fortsatte
308
297
  arbejde.
309
298
 
@@ -524,7 +513,7 @@ scope — den ændrer aldrig detektionssemantikken.
524
513
  {
525
514
  "gate": "error",
526
515
  "exclude": ["legacy/**"],
527
- "severityOverrides": { "QA-PW-118": "warning" },
516
+ "severityOverrides": { "QA-PW-141": "warning" },
528
517
  "ignore": [
529
518
  {
530
519
  "ruleId": "QA-TEST-004",
package/README.de.md CHANGED
@@ -15,7 +15,7 @@ bricht.
15
15
 
16
16
  [English](README.md) | [简体中文](README.zh.md) | [繁體中文](README.zht.md) | [한국어](README.ko.md) | Deutsch | [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.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
@@ -206,7 +206,6 @@ geshippt werden — das ist die False-Positive-Firewall.
206
206
 
207
207
  | ID | Regel | Severity |
208
208
  | ------------ | ----------------------------------- | -------- |
209
- | QA-TQUAL-001 | Nur-Mock-Verifikation | info |
210
209
  | QA-TQUAL-002 | Tautologische Assertion | error |
211
210
  | QA-TQUAL-009 | Nicht abgewartete Promise-Assertion | error |
212
211
  | QA-TQUAL-011 | Auskommentierte Tests | warning |
@@ -221,9 +220,6 @@ geshippt werden — das ist die False-Positive-Firewall.
221
220
  | QA-PW-002 | Nicht abgewartete Locator-Assertion | error |
222
221
  | QA-PW-003 | `page.pause()` / `test.only()` committed | error |
223
222
  | QA-PW-004 | Spröde CSS/XPath-Selektoren | warning |
224
- | QA-PW-005 | Business-Logik in `page.evaluate()` | info |
225
- | QA-PW-114 | Legacy Element Handles (`page.$`) | info |
226
- | QA-PW-118 | `networkidle`-Warten (flaky by design) | info |
227
223
  | QA-PW-123 | Hartkodierte Umgebungs-URLs | warning |
228
224
 
229
225
  </details>
@@ -251,8 +247,6 @@ geshippt werden — das ist die False-Positive-Firewall.
251
247
  | QA-PY-002 | Übersprungener Test (`skip`, nicht-strictes `xfail`) | warning |
252
248
  | QA-PY-003 | Testfunktion ohne Assertionen | error |
253
249
  | QA-PY-005 | `time.sleep()` in Tests | warning |
254
- | QA-PY-006 | Leerer Testkörper (`pass`) | info |
255
- | QA-PY-010 | Zufalls-/Zeitabhängigkeit ohne Freeze | info |
256
250
  | QA-PY-012 | Tautologische Assertion | error |
257
251
 
258
252
  20 Python-Regeln insgesamt (QA-PY-001…012 pytest-Hygiene + QA-PY-101…108 Playwright-Python).
@@ -269,8 +263,6 @@ geshippt werden — das ist die False-Positive-Firewall.
269
263
  | QA-JV-103 | Testmethode ohne Assertionen | error |
270
264
  | QA-JV-105 | Playwright `waitForTimeout()`-harter Sleep | warning |
271
265
  | QA-JV-106 | Spröder Selektor statt Role-Locator | warning |
272
- | QA-JV-108 | Hartkodierte Umgebungs-URL im Test | info |
273
- | QA-JV-111 | Pauschales `page.route("**")`-Mock | info |
274
266
 
275
267
  </details>
276
268
 
@@ -284,8 +276,6 @@ geshippt werden — das ist die False-Positive-Firewall.
284
276
  | QA-CS-103 | Testmethode ohne Assertionen | error |
285
277
  | QA-CS-105 | `WaitForTimeoutAsync()`-harter Sleep | warning |
286
278
  | QA-CS-106 | Spröder Selektor statt Role-Locator | warning |
287
- | QA-CS-108 | Hartkodierte Umgebungs-URL im Test | info |
288
- | QA-CS-111 | Pauschales `page.RouteAsync("**")`-Mock | info |
289
279
 
290
280
  </details>
291
281
 
@@ -308,7 +298,6 @@ Schätzung des Autors. Jeder Scan-Footer sagt dir, wie viele der
308
298
  _ausgelösten_ Regeln gemessen sind; `mjolnir rules --unmeasured` listet
309
299
  die nicht gemessenen; die `mjolnir explain`-Seite jeder Regel nennt
310
300
  ihren Status. Wir veröffentlichen die Rate, selbst wenn sie hässlich
311
- ist — QA-PW-107 auditiert bei 95 % und ist deshalb quarantäniert. Diese
312
301
  Zahl zu vergrößern ist die fortlaufende Arbeit des Projekts.
313
302
 
314
303
  ### Regel-Tiers und Sprachreife
@@ -533,7 +522,7 @@ sie ändert nie die Erkennungssemantik.
533
522
  {
534
523
  "gate": "error",
535
524
  "exclude": ["legacy/**"],
536
- "severityOverrides": { "QA-PW-118": "warning" },
525
+ "severityOverrides": { "QA-PW-141": "warning" },
537
526
  "ignore": [
538
527
  {
539
528
  "ruleId": "QA-TEST-004",