mjolnir-qa 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  <div align="center">
2
2
 
3
- <img src="assets/readme/hero.svg" alt="Mjölnir. Tests tell you what passed. Mjölnir tells you what you can trust." width="100%" />
3
+ <img src="assets/readme/hero.svg" alt="Mjölnir. Prevents release-blocking false-green." width="100%" />
4
4
 
5
5
  <br />
6
6
 
7
- Mjölnir finds tests that cannot fail and pipelines that cannot go red,<br />
8
- then scores how far the result can be trusted, with the evidence for every point.
7
+ Mjölnir quantifies how much you can trust your CI — and blocks releases
8
+ when verification isn't earning its keep.
9
9
 
10
10
  <br />
11
11
 
@@ -39,8 +39,9 @@ it; `npm run docs:translations` reports how far.
39
39
 
40
40
  ## A green check is a claim, not a proof
41
41
 
42
- A green check means the pipeline did not fail. It does not mean the tests
43
- ran, or that they could have failed. Every one of these ships green:
42
+ A green check means the pipeline did not fail. It does not mean
43
+ the tests ran, or that they could have failed. Every one of these
44
+ ships green — and every one of them makes your release untrustworthy:
44
45
 
45
46
  - a committed `.only` that ran 3 tests instead of 900
46
47
  - `continue-on-error: true` on the job that was supposed to gate
@@ -50,8 +51,10 @@ ran, or that they could have failed. Every one of these ships green:
50
51
  - a report the workflow uploads but never generated
51
52
  - a hard sleep holding a race condition together
52
53
 
53
- None of them turns the pipeline red, and each one looks deliberate in
54
- review. That is why they survive. Here is Mjölnir reading a real one:
54
+ None of them turns the pipeline red, and each one looks deliberate
55
+ in review. That is why they survive. **They are the reason releases ship bugs.**
56
+
57
+ Here is Mjölnir reading a real one:
55
58
 
56
59
  <p align="center">
57
60
  <img src="assets/readme/scan.svg" alt="The demo repository's CI workflow, read line by line. Mjölnir flags each finding at the line it reported, with its rule, what is wrong, its evidence level and its measured false-positive rate." width="800" />
@@ -98,7 +101,7 @@ A real scan of [`examples/demo-repo`](examples/demo-repo), a small
98
101
  Playwright suite with a CI workflow. This is where its points went:
99
102
 
100
103
  <p align="center">
101
- <img src="assets/readme/terminal-hero.svg" alt="Mjölnir's deduction breakdown: WORTHINESS 75/100 NEEDS WORK, the score by category, the per-severity deduction box, and a FIX THIS FIRST list" width="520" />
104
+ <img src="assets/readme/terminal-hero.svg" alt="Mjölnir's deduction breakdown: WORTHINESS 80/100 WORTHY, the score by category, the per-severity deduction box, and a FIX THIS FIRST list" width="520" />
102
105
  </p>
103
106
 
104
107
  <sub>Generated by `npm run docs:hero` from a real scan and drift-locked in
@@ -147,6 +150,17 @@ FP risk: low (author estimate)
147
150
  Languages: yaml
148
151
  Frameworks: github-actions, azure-pipelines
149
152
 
153
+ COPY-READY REVIEW COMMENT
154
+ Advisory finding — this does not block merging: Job `security-scan` runs a
155
+ verification gate under `continue-on-error: true`.
156
+ Why it weakens verification: This job can fail every day and CI will still
157
+ show green. The checkmark on this workflow cannot be trusted.
158
+ Confidence: high, evidence E2, tier quarantine; measured FP 11% (19 verdicts).
159
+ Suggested fix: Remove continue-on-error, or scope it to individual
160
+ non-blocking steps only.
161
+ Verify with: mjolnir --scope changed, then mjolnir explain QA-CI-001 if the
162
+ finding still appears.
163
+
150
164
  WHAT WAS FOUND (real detector output, not a mockup)
151
165
  Job `security-scan` runs a verification gate under `continue-on-error: true`.
152
166
 
@@ -188,65 +202,78 @@ That is the unit of value: one place where CI reports a pass it did not earn.
188
202
  npx mjolnir-qa@latest
189
203
  ```
190
204
 
191
- It scans the current directory and prints the Trust Report: what it found,
192
- how far you can trust it, why, and what to do next. It exits `0` when
193
- nothing at or above the gate was found.
205
+ Three steps to trust your release pipeline:
194
206
 
195
- In CI, scan only what the branch introduced, so a legacy suite does not
196
- drown your first pull request:
207
+ 1. **Scan** — `npx mjolnir-qa@latest` — scans the current directory, prints the Trust Report, exits `1` if findings at the gate
208
+ 2. **Block in CI** — `npx mjolnir-qa@latest --scope changed` — scans only changed lines, blocks PRs with error findings
209
+ 3. **Fix and re-verify** — `mjolnir fix` applies safe auto-fixes, then re-scans to prove each one landed
210
+
211
+ Install the advisory PR workflow first, so existing trust debt cannot break
212
+ CI on day one:
197
213
 
198
214
  ```bash
199
- npx mjolnir-qa@latest --scope changed
215
+ mjolnir ci install
216
+ ```
217
+
218
+ After reviewing the findings or baselining existing debt, opt into blocking:
219
+
220
+ ```bash
221
+ mjolnir ci install --gate error
200
222
  ```
201
223
 
202
- `mjolnir ci install` writes that as a GitHub Actions workflow, using the
203
- [action](https://github.com/Sergey-Bar/Mjolnir#readme) pinned to the `v1`
204
- major tag (or plain `npx` with `--no-action`). It stays advisory until you
205
- decide it should block.
206
-
207
- | Command | What it does |
208
- | ----------------------------------- | ------------------------------------------------ |
209
- | `mjolnir` | Trust Report: verdict, confidence, next action |
210
- | `mjolnir --scope changed` | Only what your branch introduced (the CI form) |
211
- | `mjolnir ci install` | Generate the advisory PR workflow (action-based) |
212
- | `mjolnir explain QA-CI-001` | What, why and fix, plus the measured FP rate |
213
- | `mjolnir why src/a.spec.ts:42` | Why this exact line was flagged. Never gates. |
214
- | `mjolnir forensics ./test-results/` | Runtime evidence from a real run |
215
- | `mjolnir trust-report` | Self-contained Trust Artifact (md + json) |
216
- | `mjolnir handoff` | Remediation plan for a coding agent |
217
- | `mjolnir --json` / `--format sarif` | Machine-readable output, GitHub Code Scanning |
218
- | `mjolnir --format codequality` | GitLab Code Quality report (MR widget artifact) |
219
- | `mjolnir --strict` | Also run quarantine-tier rules (higher FP risk) |
224
+ | Command | What it does |
225
+ | ----------------------------------- | ----------------------------------------------- |
226
+ | `mjolnir` | Trust Report: verdict, confidence, next action |
227
+ | `mjolnir --scope changed` | Only what your branch introduced (CI form) |
228
+ | `mjolnir --blocking error` | Exit 1 on error findings — gate releases |
229
+ | `mjolnir ci install` | Write the advisory PR workflow (default) |
230
+ | `mjolnir ci install --gate error` | Opt into the blocking PR workflow |
231
+ | `mjolnir business-case` | ROI estimate: projected savings per finding |
232
+ | `mjolnir explain QA-CI-001` | What, why and fix, plus the measured FP rate |
233
+ | `mjolnir why src/a.spec.ts:42` | Why this exact line was flagged. Never gates. |
234
+ | `mjolnir forensics ./test-results/` | Runtime evidence from a real run |
235
+ | `mjolnir trust-report` | Self-contained Trust Artifact (md + json) |
236
+ | `mjolnir handoff` | Remediation plan for a coding agent |
237
+ | `mjolnir --json` / `--format sarif` | Machine-readable output, GitHub Code Scanning |
238
+ | `mjolnir --format codequality` | GitLab Code Quality report (MR widget artifact) |
239
+ | `mjolnir --strict` | Also run quarantine-tier rules (higher FP risk) |
220
240
 
221
241
  <details>
222
242
  <summary><strong>Every other command</strong> — flake triage, reporting, governance</summary>
223
243
 
224
244
  <br />
225
245
 
226
- | Command | What it does |
227
- | ----------------------------------- | ---------------------------------------------------- |
228
- | `mjolnir --classic` | The pre-Trust-Report score banner render |
229
- | `mjolnir explain verdict` | Why the saved scan's verdict is what it is |
230
- | `mjolnir triage ./test-results/` | Guided triage. Every row ends in a next action. |
231
- | `mjolnir pw-report ./test-results/` | Playwright run summary: retries, flakes, slowest |
232
- | `mjolnir doctor:playwright` | Playwright-only deep scan plus Selector Health Score |
233
- | `mjolnir fix --dry-run` / `fix` | Safe auto-fixes, each re-scanned to prove it landed |
234
- | `mjolnir baseline` / `diff` | Snapshot findings, then report only new or worse |
235
- | `mjolnir impact --since <ref>` | What a commit introduced and resolved |
236
- | `mjolnir summary` | CI annotations and a step summary from a report |
237
- | `mjolnir pr-comment` | A scoped PR comment, as Markdown |
238
- | `mjolnir debt` | Test-debt register with a cost model |
239
- | `mjolnir handover` | Onboarding map of the suite for a new QA engineer |
240
- | `mjolnir init` | Detect frameworks, print a setup checklist |
241
- | `mjolnir suppressions` | List suppressed findings, for governance |
242
- | `mjolnir rules --unmeasured` | The rules running on assumption, not measurement |
243
- | `mjolnir rules --md` | Full rule catalog (JSON or Markdown) |
244
- | `mjolnir doctor` | Self-audit of Mjölnir's own rule base |
245
- | `mjolnir create-rule <ID>` | Scaffold a new rule and its fixtures |
246
- | `mjolnir stats` | Local all-time counters of fixes seen |
247
- | `mjolnir badge` | shields.io endpoint JSON and snippet |
248
- | `mjolnir --cache` | Incremental re-scans via a local verdict cache |
249
- | `mjolnir --format mermaid` | Test-architecture diagram for a PR comment |
246
+ | Command | What it does |
247
+ | ----------------------------------- | ----------------------------------------------------- |
248
+ | `mjolnir --classic` | The pre-Trust-Report score banner render |
249
+ | `mjolnir explain verdict` | Why the saved scan's verdict is what it is |
250
+ | `mjolnir triage ./test-results/` | Guided triage. Every row ends in a next action. |
251
+ | `mjolnir pw-report ./test-results/` | Playwright run summary: retries, flakes, slowest |
252
+ | `mjolnir doctor:playwright` | Playwright-only deep scan plus Selector Health Score |
253
+ | `mjolnir fix --dry-run` / `fix` | Safe auto-fixes, each re-scanned to prove it landed |
254
+ | `mjolnir baseline` / `diff` | Snapshot findings, then report only new or worse |
255
+ | `mjolnir impact --since <ref>` | What a commit introduced and resolved |
256
+ | `mjolnir summary` | CI annotations and a step summary from a report |
257
+ | `mjolnir pr-comment` | A scoped PR comment, as Markdown |
258
+ | `mjolnir debt` | Test-debt register with a cost model |
259
+ | `mjolnir handover` | Onboarding map of the suite for a new QA engineer |
260
+ | `mjolnir init` | Detect frameworks, print a setup checklist |
261
+ | `mjolnir suppressions` | List suppressed findings, for governance |
262
+ | `mjolnir ci-integrity` | Verify blocking CI scans and suppression policy |
263
+ | `mjolnir framework-maturity` | Inspect bounded maturity with human calibration |
264
+ | `mjolnir suppression-gate` | Enforce expiry, allowlist, and mass-suppression rules |
265
+ | `mjolnir cross-file` | Analyze duplicate, shared, and circular test signals |
266
+ | `mjolnir contract-verify` | Verify a persisted machine contract artifact |
267
+ | `mjolnir trust-trend` | Persist and compare trust snapshots over time |
268
+ | `mjolnir evidence-graph` | Build or query the verification evidence graph |
269
+ | `mjolnir rules --unmeasured` | The rules running on assumption, not measurement |
270
+ | `mjolnir rules --md` | Full rule catalog (JSON or Markdown) |
271
+ | `mjolnir doctor` | Self-audit of Mjölnir's own rule base |
272
+ | `mjolnir create-rule <ID>` | Scaffold a new rule and its fixtures |
273
+ | `mjolnir stats` | Local all-time counters of fixes seen |
274
+ | `mjolnir badge` | shields.io endpoint JSON and snippet |
275
+ | `mjolnir --cache` | Incremental re-scans via a local verdict cache |
276
+ | `mjolnir --format mermaid` | Test-architecture diagram for a PR comment |
250
277
 
251
278
  `mjolnir help <command>` prints usage, examples and the next step for any
252
279
  of them.
@@ -360,8 +387,8 @@ e2e/login.spec.ts
360
387
  role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
361
388
 
362
389
  e2e/checkout.spec.ts
363
- [█████████████████░░░] 86 / 100
364
- role/text: 3 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
390
+ [██████████████████░░] 88 / 100
391
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
365
392
  ```
366
393
 
367
394
  This measures **resilience, not correctness**.
@@ -543,24 +570,33 @@ propagate, always-success steps, reports consumed but never generated, and
543
570
  gates skipped on the events that should block. Each finding names the job,
544
571
  the step and the line, and carries its own evidence level.
545
572
 
546
- Generate the PR workflow, advisory by default:
573
+ Generate an advisory PR workflow first. It reports findings without blocking
574
+ and is pinned to this version, so adopting it cannot change gate semantics:
547
575
 
548
576
  ```bash
549
577
  mjolnir ci install
550
578
  ```
551
579
 
552
- Or add the Marketplace action to a workflow you already have:
580
+ After reviewing existing debt, opt into an enforcing gate:
581
+
582
+ ```bash
583
+ mjolnir ci install --gate error
584
+ ```
585
+
586
+ In your existing workflow, pin the action and explicitly opt into an error gate:
553
587
 
554
588
  ```yaml
555
- - uses: Sergey-Bar/Mjolnir@v1
589
+ - uses: Sergey-Bar/Mjolnir@4a588bc62d517bc85fc44c0eae64c6587d3bf70b0
556
590
  with:
557
591
  scope: changed
558
592
  fail-on: error
559
593
  ```
560
594
 
561
- Pin `@v1` to follow the major line, or an exact tag (`@v0.5.32`) for a
562
- reproducible gate. [docs/DISTRIBUTION-KIT.md](docs/DISTRIBUTION-KIT.md)
563
- covers the Marketplace, Smithery and the MCP registries.
595
+ The `--blocking error` flag does the same in any CI pipeline:
596
+
597
+ ```bash
598
+ npx mjolnir-qa@latest --scope changed --blocking error
599
+ ```
564
600
 
565
601
  To put findings in GitHub Code Scanning, upload SARIF (requires
566
602
  `security-events: write` at workflow or job scope):
@@ -610,11 +646,11 @@ SCAN → EVIDENCE → HANDOFF → AGENT → RE-SCAN → PROOF
610
646
  **AI writes the fix. Mjölnir verifies it.** The proof comes from the
611
647
  re-scan, never from the agent's own report of success.
612
648
 
613
- | Command | What the agent gets |
614
- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
615
- | `mjolnir mcp` | An [MCP](https://modelcontextprotocol.io) server over stdio. `scan`, `explain` and `diff` become callable tools. |
616
- | `mjolnir handoff` | A saved `--json` report becomes a deterministic Markdown plan: what was detected, the evidence boundary per finding, what must **not** change, how to verify. |
617
- | `mjolnir install` | Writes into the agent surfaces your repo already has (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`) so the agent re-scans before it claims it is done. |
649
+ | Command | What the agent gets |
650
+ | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
651
+ | `mjolnir mcp` | An [MCP](https://modelcontextprotocol.io) server over stdio. `scan`, `explain`, `diff`, `verify`, `forensics`, `triage`, and `pw-report` are read-only callable tools. |
652
+ | `mjolnir handoff` | A saved `--json` report becomes a deterministic Markdown plan: what was detected, the evidence boundary per finding, what must **not** change, how to verify. |
653
+ | `mjolnir install` | Writes into the agent surfaces your repo already has (`.claude/`, `.cursor/`, `.kilo/`, `AGENTS.md`) so the agent re-scans before it claims it is done. |
618
654
 
619
655
  Add it to a client that ships its own CLI:
620
656
 
@@ -719,6 +755,7 @@ The full docs site is at <https://sergey-bar.github.io/Mjolnir/>.
719
755
 
720
756
  | Document | What's in it |
721
757
  | ------------------------------------------------------ | ------------------------------------------------- |
758
+ | [docs/EXECUTIVE-ROI.md](docs/EXECUTIVE-ROI.md) | Business case for decision-makers |
722
759
  | [docs/SCORING.md](docs/SCORING.md) | Score normalization and evidence weighting |
723
760
  | [docs/TERMINOLOGY.md](docs/TERMINOLOGY.md) | Canonical vocabulary: one word per concept |
724
761
  | [docs/FP-AUDIT.md](docs/FP-AUDIT.md) | Measured false-positive rates and the method |
package/README.no.md CHANGED
@@ -81,7 +81,7 @@ Mjölnir leser testsuiten, CI-workflowene og, hvis du har en, rapporten fra en e
81
81
  En ekte skanning av [`examples/demo-repo`](examples/demo-repo), en liten Playwright-suite med en CI-workflow. Her er hvor poengene ble av:
82
82
 
83
83
  <p align="center">
84
- <img src="assets/readme/terminal-hero.svg" alt="Mjölnirs oversikt over trekk: WORTHINESS 75/100 NEEDS WORK, scoren per kategori, trekkboksen per alvorlighetsgrad og en FIX THIS FIRST-liste" width="520" />
84
+ <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" />
85
85
  </p>
86
86
 
87
87
  <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>
@@ -312,8 +312,8 @@ e2e/login.spec.ts
312
312
  role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
313
313
 
314
314
  e2e/checkout.spec.ts
315
- [█████████████████░░░] 86 / 100
316
- role/text: 3 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
315
+ [██████████████████░░] 88 / 100
316
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
317
317
  ```
318
318
 
319
319
  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.
package/README.pl.md CHANGED
@@ -81,7 +81,7 @@ Mjölnir czyta zestaw testów, workflow CI oraz, jeśli go masz, raport z prawdz
81
81
  Prawdziwy skan [`examples/demo-repo`](examples/demo-repo), małego zestawu Playwright z workflow CI. Oto, gdzie poszły jego punkty:
82
82
 
83
83
  <p align="center">
84
- <img src="assets/readme/terminal-hero.svg" alt="Rozbicie potrąceń Mjölnira: WORTHINESS 75/100 NEEDS WORK, wynik według kategorii, ramka potrąceń według ważności i lista FIX THIS FIRST" width="520" />
84
+ <img src="assets/readme/terminal-hero.svg" alt="Rozbicie potrąceń Mjölnira: WORTHINESS 80/100 WORTHY, wynik według kategorii, ramka potrąceń według ważności i lista FIX THIS FIRST" width="520" />
85
85
  </p>
86
86
 
87
87
  <sub>Wygenerowane przez `npm run docs:hero` z prawdziwego skanu i zabezpieczone w CI przed rozjazdem. Pełny raport `--verbose` z tego samego skanu to [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`).</sub>
@@ -312,8 +312,8 @@ e2e/login.spec.ts
312
312
  role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
313
313
 
314
314
  e2e/checkout.spec.ts
315
- [█████████████████░░░] 86 / 100
316
- role/text: 3 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
315
+ [██████████████████░░] 88 / 100
316
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
317
317
  ```
318
318
 
319
319
  To mierzy **odporność, a nie poprawność**. `.btn.btn-primary > div:nth-child(2)` przechodzi dziś i będzie przechodzić, dopóki ktoś nie ruszy znaczników. Niski wynik nigdy nie twierdzi, że test jest zepsuty, tylko że zależy od znaczników, których nikt nie obiecał zachować.
package/README.ru.md CHANGED
@@ -81,7 +81,7 @@ Mjölnir читает набор тестов, CI-workflow и, если он е
81
81
  Реальное сканирование [`examples/demo-repo`](examples/demo-repo), небольшого набора тестов Playwright с CI-workflow. Вот куда ушли его баллы:
82
82
 
83
83
  <p align="center">
84
- <img src="assets/readme/terminal-hero.svg" alt="Разбивка вычетов Mjölnir: WORTHINESS 75/100 NEEDS WORK, оценка по категориям, блок вычетов по серьёзности и список FIX THIS FIRST" width="520" />
84
+ <img src="assets/readme/terminal-hero.svg" alt="Разбивка вычетов Mjölnir: WORTHINESS 80/100 WORTHY, оценка по категориям, блок вычетов по серьёзности и список FIX THIS FIRST" width="520" />
85
85
  </p>
86
86
 
87
87
  <sub>Сгенерировано командой `npm run docs:hero` из реального сканирования и защищено от расхождений в CI. Полный отчёт `--verbose` того же сканирования — [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`).</sub>
@@ -312,8 +312,8 @@ e2e/login.spec.ts
312
312
  role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
313
313
 
314
314
  e2e/checkout.spec.ts
315
- [█████████████████░░░] 86 / 100
316
- role/text: 3 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
315
+ [██████████████████░░] 88 / 100
316
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
317
317
  ```
318
318
 
319
319
  Это измеряет **устойчивость, а не корректность**. `.btn.btn-primary > div:nth-child(2)` проходит сегодня и будет проходить, пока кто-нибудь не тронет разметку. Низкая оценка никогда не утверждает, что тест сломан, — только что он зависит от разметки, сохранять которую никто не обещал.
package/README.th.md CHANGED
@@ -81,7 +81,7 @@ Mjölnir อ่านชุดเทสต์ CI workflow และรายง
81
81
  การสแกนจริงของ [`examples/demo-repo`](examples/demo-repo) ซึ่งเป็นชุดเทสต์ Playwright ขนาดเล็กที่มี CI workflow คะแนนของมันหายไปตรงนี้:
82
82
 
83
83
  <p align="center">
84
- <img src="assets/readme/terminal-hero.svg" alt="รายละเอียดการหักคะแนนของ Mjölnir: WORTHINESS 75/100 NEEDS WORK คะแนนแยกตามหมวดหมู่ กล่องการหักคะแนนตามความรุนแรง และรายการ FIX THIS FIRST" width="520" />
84
+ <img src="assets/readme/terminal-hero.svg" alt="รายละเอียดการหักคะแนนของ Mjölnir: WORTHINESS 80/100 WORTHY คะแนนแยกตามหมวดหมู่ กล่องการหักคะแนนตามความรุนแรง และรายการ FIX THIS FIRST" width="520" />
85
85
  </p>
86
86
 
87
87
  <sub>สร้างโดย `npm run docs:hero` จากการสแกนจริง และถูกล็อกไม่ให้คลาดเคลื่อนใน CI รายงาน `--verbose` ฉบับเต็มของการสแกนเดียวกันคือ [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`)</sub>
@@ -312,8 +312,8 @@ e2e/login.spec.ts
312
312
  role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
313
313
 
314
314
  e2e/checkout.spec.ts
315
- [█████████████████░░░] 86 / 100
316
- role/text: 3 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
315
+ [██████████████████░░] 88 / 100
316
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
317
317
  ```
318
318
 
319
319
  สิ่งนี้วัด **ความทนทาน ไม่ใช่ความถูกต้อง** `.btn.btn-primary > div:nth-child(2)` ผ่านในวันนี้ และจะผ่านต่อไปจนกว่าจะมีคนแตะ markup คะแนนต่ำไม่เคยอ้างว่าเทสต์พัง เพียงบอกว่ามันพึ่งพา markup ที่ไม่มีใครสัญญาว่าจะคงไว้
package/README.tr.md CHANGED
@@ -81,7 +81,7 @@ Mjölnir test paketini, CI workflow'larını ve varsa gerçek bir çalıştırma
81
81
  CI workflow'u olan küçük bir Playwright paketi olan [`examples/demo-repo`](examples/demo-repo) üzerinde gerçek bir tarama. Puanlarının nereye gittiği burada:
82
82
 
83
83
  <p align="center">
84
- <img src="assets/readme/terminal-hero.svg" alt="Mjölnir'in kesinti dökümü: WORTHINESS 75/100 NEEDS WORK, kategoriye göre puan, önem derecesine göre kesinti kutusu ve bir FIX THIS FIRST listesi" width="520" />
84
+ <img src="assets/readme/terminal-hero.svg" alt="Mjölnir'in kesinti dökümü: WORTHINESS 80/100 WORTHY, kategoriye göre puan, önem derecesine göre kesinti kutusu ve bir FIX THIS FIRST listesi" width="520" />
85
85
  </p>
86
86
 
87
87
  <sub>`npm run docs:hero` ile gerçek bir taramadan üretilir ve CI'da sapmaya karşı kilitlenir. Aynı taramanın tam `--verbose` raporu [`demo.svg`](assets/readme/demo.svg) dosyasıdır (`npm run docs:demo`).</sub>
@@ -312,8 +312,8 @@ e2e/login.spec.ts
312
312
  role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
313
313
 
314
314
  e2e/checkout.spec.ts
315
- [█████████████████░░░] 86 / 100
316
- role/text: 3 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
315
+ [██████████████████░░] 88 / 100
316
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
317
317
  ```
318
318
 
319
319
  Bu, **doğruluğu değil dayanıklılığı** ölçer. `.btn.btn-primary > div:nth-child(2)` bugün geçer ve biri işaretlemeye dokunana kadar geçmeye devam eder. Düşük bir puan asla testin bozuk olduğunu iddia etmez; yalnızca kimsenin korumayı vaat etmediği işaretlemeye bağlı olduğunu söyler.
package/README.uk.md CHANGED
@@ -81,7 +81,7 @@ Mjölnir читає набір тестів, CI-workflow і, якщо він є,
81
81
  Реальне сканування [`examples/demo-repo`](examples/demo-repo), невеликого набору тестів Playwright із CI-workflow. Ось куди пішли його бали:
82
82
 
83
83
  <p align="center">
84
- <img src="assets/readme/terminal-hero.svg" alt="Розбивка вирахувань Mjölnir: WORTHINESS 75/100 NEEDS WORK, оцінка за категоріями, блок вирахувань за серйозністю та список FIX THIS FIRST" width="520" />
84
+ <img src="assets/readme/terminal-hero.svg" alt="Розбивка вирахувань Mjölnir: WORTHINESS 80/100 WORTHY, оцінка за категоріями, блок вирахувань за серйозністю та список FIX THIS FIRST" width="520" />
85
85
  </p>
86
86
 
87
87
  <sub>Згенеровано командою `npm run docs:hero` з реального сканування і захищено від розбіжностей у CI. Повний звіт `--verbose` того самого сканування — [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`).</sub>
@@ -312,8 +312,8 @@ e2e/login.spec.ts
312
312
  role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
313
313
 
314
314
  e2e/checkout.spec.ts
315
- [█████████████████░░░] 86 / 100
316
- role/text: 3 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
315
+ [██████████████████░░] 88 / 100
316
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
317
317
  ```
318
318
 
319
319
  Це вимірює **стійкість, а не коректність**. `.btn.btn-primary > div:nth-child(2)` проходить сьогодні й проходитиме, доки хтось не торкнеться розмітки. Низька оцінка ніколи не стверджує, що тест зламаний, — лише що він залежить від розмітки, яку ніхто не обіцяв зберігати.
package/README.vi.md CHANGED
@@ -81,7 +81,7 @@ Mjölnir đọc bộ test, các workflow CI và, nếu bạn có, báo cáo củ
81
81
  Một lần quét thật trên [`examples/demo-repo`](examples/demo-repo), một bộ test Playwright nhỏ có workflow CI. Đây là nơi điểm của nó bị trừ:
82
82
 
83
83
  <p align="center">
84
- <img src="assets/readme/terminal-hero.svg" alt="Bảng phân tích trừ điểm của Mjölnir: WORTHINESS 75/100 NEEDS WORK, điểm theo từng hạng mục, ô trừ điểm theo mức nghiêm trọng và danh sách FIX THIS FIRST" width="520" />
84
+ <img src="assets/readme/terminal-hero.svg" alt="Bảng phân tích trừ điểm của Mjölnir: WORTHINESS 80/100 WORTHY, điểm theo từng hạng mục, ô trừ điểm theo mức nghiêm trọng và danh sách FIX THIS FIRST" width="520" />
85
85
  </p>
86
86
 
87
87
  <sub>Được tạo bởi `npm run docs:hero` từ một lần quét thật và được khóa chống sai lệch trong CI. Báo cáo `--verbose` đầy đủ của cùng lần quét là [`demo.svg`](assets/readme/demo.svg) (`npm run docs:demo`).</sub>
@@ -312,8 +312,8 @@ e2e/login.spec.ts
312
312
  role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
313
313
 
314
314
  e2e/checkout.spec.ts
315
- [█████████████████░░░] 86 / 100
316
- role/text: 3 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
315
+ [██████████████████░░] 88 / 100
316
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
317
317
  ```
318
318
 
319
319
  Điều này đo **độ bền, không phải độ đúng**. `.btn.btn-primary > div:nth-child(2)` qua hôm nay và sẽ tiếp tục qua cho đến khi ai đó động vào markup. Điểm thấp không bao giờ khẳng định test bị hỏng, chỉ nói rằng nó phụ thuộc vào markup mà không ai hứa giữ nguyên.
package/README.zh.md CHANGED
@@ -81,7 +81,7 @@ Mjölnir 读取测试套件、CI workflow,以及(如果有的话)一次真
81
81
  对 [`examples/demo-repo`](examples/demo-repo) 的一次真实扫描,这是一个带 CI workflow 的小型 Playwright 套件。它的分数都扣在了这里:
82
82
 
83
83
  <p align="center">
84
- <img src="assets/readme/terminal-hero.svg" alt="Mjölnir 的扣分明细:WORTHINESS 75/100 NEEDS WORK、按类别的评分、按严重级别的扣分框,以及 FIX THIS FIRST 列表" width="520" />
84
+ <img src="assets/readme/terminal-hero.svg" alt="Mjölnir 的扣分明细:WORTHINESS 80/100 WORTHY、按类别的评分、按严重级别的扣分框,以及 FIX THIS FIRST 列表" width="520" />
85
85
  </p>
86
86
 
87
87
  <sub>由 `npm run docs:hero` 根据一次真实扫描生成,并在 CI 中锁定以防漂移。同一次扫描的完整 `--verbose` 报告是 [`demo.svg`](assets/readme/demo.svg)(`npm run docs:demo`)。</sub>
@@ -312,8 +312,8 @@ e2e/login.spec.ts
312
312
  role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
313
313
 
314
314
  e2e/checkout.spec.ts
315
- [█████████████████░░░] 86 / 100
316
- role/text: 3 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
315
+ [██████████████████░░] 88 / 100
316
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
317
317
  ```
318
318
 
319
319
  这衡量的是**韧性,而非正确性**。`.btn.btn-primary > div:nth-child(2)` 今天能通过,并会一直通过,直到有人改动标记结构。低分从不声称测试坏了,只说明它依赖于没有人承诺保留的标记结构。
package/README.zht.md CHANGED
@@ -81,7 +81,7 @@ Mjölnir 讀取測試套件、CI workflow,以及(如果有的話)一次真
81
81
  對 [`examples/demo-repo`](examples/demo-repo) 的一次真實掃描,這是一個附帶 CI workflow 的小型 Playwright 套件。它的分數都扣在了這裡:
82
82
 
83
83
  <p align="center">
84
- <img src="assets/readme/terminal-hero.svg" alt="Mjölnir 的扣分明細:WORTHINESS 75/100 NEEDS WORK、依類別的評分、依嚴重程度的扣分框,以及 FIX THIS FIRST 清單" width="520" />
84
+ <img src="assets/readme/terminal-hero.svg" alt="Mjölnir 的扣分明細:WORTHINESS 80/100 WORTHY、依類別的評分、依嚴重程度的扣分框,以及 FIX THIS FIRST 清單" width="520" />
85
85
  </p>
86
86
 
87
87
  <sub>由 `npm run docs:hero` 根據一次真實掃描產生,並在 CI 中鎖定以防漂移。同一次掃描的完整 `--verbose` 報告是 [`demo.svg`](assets/readme/demo.svg)(`npm run docs:demo`)。</sub>
@@ -312,8 +312,8 @@ e2e/login.spec.ts
312
312
  role/text: 1 · testid: 0 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
313
313
 
314
314
  e2e/checkout.spec.ts
315
- [█████████████████░░░] 86 / 100
316
- role/text: 3 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
315
+ [██████████████████░░] 88 / 100
316
+ role/text: 4 · testid: 1 · plain-css: 0 · css-chains: 1 ⚠ · xpath: 0
317
317
  ```
318
318
 
319
319
  這衡量的是**韌性,而非正確性**。`.btn.btn-primary > div:nth-child(2)` 今天能通過,並會一直通過,直到有人改動標記結構。低分從不聲稱測試壞了,只說明它依賴於沒有人承諾保留的標記結構。