mjolnir-qa 0.5.39 → 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.uk.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) | [Русский](README.ru.md) | [Norsk](README.no.md) | [Português (Brasil)](README.br.md) | [ไทย](README.th.md) | [Türkçe](README.tr.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 @@ macOS і Linux.
202
202
 
203
203
  | ID | Правило | Severity |
204
204
  | ------------ | ----------------------------- | -------- |
205
- | QA-TQUAL-001 | Верифікація лише моками | info |
206
205
  | QA-TQUAL-002 | Тавтологічний ассерт | error |
207
206
  | QA-TQUAL-009 | Ассерт не-awaitнутого promise | error |
208
207
  | QA-TQUAL-011 | Закоментовані тести | warning |
@@ -212,15 +211,12 @@ macOS і Linux.
212
211
  <details>
213
212
  <summary><strong>Playwright 🎭</strong></summary>
214
213
 
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-005 | Бізнес-логіка всередині `page.evaluate()` | info |
221
- | QA-PW-114 | Легасі element handles (`page.$`) | info |
222
- | QA-PW-118 | Очікування `networkidle` (флейкові by design) | info |
223
- | QA-PW-123 | Захардкоджені URL середовищ | warning |
214
+ | ID | Правило | Severity |
215
+ | --------- | --------------------------------------- | -------- |
216
+ | QA-PW-002 | Ассерт локатора без await | error |
217
+ | QA-PW-003 | `page.pause()` / `test.only()` у коміті | error |
218
+ | QA-PW-004 | Крихкі CSS/XPath-селектори | warning |
219
+ | QA-PW-123 | Захардкоджені URL середовищ | warning |
224
220
 
225
221
  </details>
226
222
 
@@ -247,8 +243,6 @@ macOS і Linux.
247
243
  | QA-PY-002 | Пропущений тест (`skip`, нестрогий `xfail`) | warning |
248
244
  | QA-PY-003 | Тестова функція без ассертів | error |
249
245
  | QA-PY-005 | `time.sleep()` у тестах | warning |
250
- | QA-PY-006 | Порожнє тіло тесту (`pass`) | info |
251
- | QA-PY-010 | Залежність від випадковості/часу без freeze | info |
252
246
  | QA-PY-012 | Тавтологічний ассерт | error |
253
247
 
254
248
  Усього 20 Python-правил (QA-PY-001…012 гігієна pytest + QA-PY-101…108 Playwright-Python).
@@ -265,8 +259,6 @@ macOS і Linux.
265
259
  | QA-JV-103 | Тестовий метод без ассертів | error |
266
260
  | QA-JV-105 | Жорсткий sleep Playwright `waitForTimeout()` | warning |
267
261
  | QA-JV-106 | Крихкий селектор замість role-локатора | warning |
268
- | QA-JV-108 | Захардкоджений URL середовища у тесті | info |
269
- | QA-JV-111 | Бланкетний мок `page.route("**")` | info |
270
262
 
271
263
  </details>
272
264
 
@@ -280,8 +272,6 @@ macOS і Linux.
280
272
  | QA-CS-103 | Тестовий метод без ассертів | error |
281
273
  | QA-CS-105 | Жорсткий sleep `WaitForTimeoutAsync()` | warning |
282
274
  | QA-CS-106 | Крихкий селектор замість role-локатора | warning |
283
- | QA-CS-108 | Захардкоджений URL середовища у тесті | info |
284
- | QA-CS-111 | Бланкетний мок `page.RouteAsync("**")` | info |
285
275
 
286
276
  </details>
287
277
 
@@ -302,7 +292,6 @@ OSS-коді** (по ≥ 10 вручну класифікованих знахі
302
292
  автора. Футер кожного скана каже, скільки із _спрацьованих_ правил
303
293
  виміряно; `mjolnir rules --unmeasured` перелічує невиміряні; сторінка
304
294
  `mjolnir explain` кожного правила вказує її статус. Ми публікуємо
305
- частоту, навіть коли вона негарна — QA-PW-107 аудитується на 95 % і за
306
295
  це відправлено в карантин. Збільшувати це число — постійна робота проєкту.
307
296
 
308
297
  ### Тіри правил і зрілість мов
@@ -520,7 +509,7 @@ Mjölnir — zero-config. Опціональний `mjolnir.config.json` (або
520
509
  {
521
510
  "gate": "error",
522
511
  "exclude": ["legacy/**"],
523
- "severityOverrides": { "QA-PW-118": "warning" },
512
+ "severityOverrides": { "QA-PW-141": "warning" },
524
513
  "ignore": [
525
514
  {
526
515
  "ruleId": "QA-TEST-004",
package/README.vi.md CHANGED
@@ -15,7 +15,7 @@ niềm tin gãy.
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.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
@@ -198,7 +198,6 @@ lửa false positive.
198
198
 
199
199
  | ID | Quy tắc | Severity |
200
200
  | ------------ | --------------------------------------- | -------- |
201
- | QA-TQUAL-001 | Xác minh chỉ bằng mock | info |
202
201
  | QA-TQUAL-002 | Assertion đồng nghĩa lặp (tautological) | error |
203
202
  | QA-TQUAL-009 | Assertion của promise không await | error |
204
203
  | QA-TQUAL-011 | Kiểm thử bị comment | warning |
@@ -213,9 +212,6 @@ lửa false positive.
213
212
  | QA-PW-002 | Assertion locator không await | error |
214
213
  | QA-PW-003 | `page.pause()` / `test.only()` bị commit | error |
215
214
  | QA-PW-004 | Selector CSS/XPath giòn | warning |
216
- | QA-PW-005 | Logic nghiệp vụ trong `page.evaluate()` | info |
217
- | QA-PW-114 | Element handle kiểu cũ (`page.$`) | info |
218
- | QA-PW-118 | Chờ `networkidle` (flaky by design) | info |
219
215
  | QA-PW-123 | URL môi trường hardcode | warning |
220
216
 
221
217
  </details>
@@ -243,8 +239,6 @@ lửa false positive.
243
239
  | QA-PY-002 | Kiểm thử bị bỏ qua (`skip`, `xfail` không nghiêm) | warning |
244
240
  | QA-PY-003 | Hàm kiểm thử không có assertion | error |
245
241
  | QA-PY-005 | `time.sleep()` trong kiểm thử | warning |
246
- | QA-PY-006 | Thân kiểm thử rỗng (`pass`) | info |
247
- | QA-PY-010 | Phụ thuộc ngẫu nhiên/thời gian mà không freeze | info |
248
242
  | QA-PY-012 | Assertion tautological | error |
249
243
 
250
244
  Tổng cộng 20 quy tắc Python (QA-PY-001…012 vệ sinh pytest + QA-PY-101…108 Playwright-Python).
@@ -261,8 +255,6 @@ Tổng cộng 20 quy tắc Python (QA-PY-001…012 vệ sinh pytest + QA-PY-101
261
255
  | QA-JV-103 | Phương thức kiểm thử không có assertion | error |
262
256
  | QA-JV-105 | Sleep cứng Playwright `waitForTimeout()` | warning |
263
257
  | QA-JV-106 | Selector giòn thay vì role locator | warning |
264
- | QA-JV-108 | URL môi trường hardcode trong kiểm thử | info |
265
- | QA-JV-111 | Mock phủ sóng `page.route("**")` | info |
266
258
 
267
259
  </details>
268
260
 
@@ -276,8 +268,6 @@ Tổng cộng 20 quy tắc Python (QA-PY-001…012 vệ sinh pytest + QA-PY-101
276
268
  | QA-CS-103 | Phương thức kiểm thử không có assertion | error |
277
269
  | QA-CS-105 | Sleep cứng `WaitForTimeoutAsync()` | warning |
278
270
  | QA-CS-106 | Selector giòn thay vì role locator | warning |
279
- | QA-CS-108 | URL môi trường hardcode trong kiểm thử | info |
280
- | QA-CS-111 | Mock phủ sóng `page.RouteAsync("**")` | info |
281
271
 
282
272
  </details>
283
273
 
@@ -298,7 +288,6 @@ thật** (≥ 10 finding được phân loại tay mỗi quy tắc; xem
298
288
  ước lượng của tác giả. Chân mỗi bản quét cho biết bao nhiêu quy tắc
299
289
  _đã bắn_ được đo; `mjolnir rules --unmeasured` liệt kê những quy tắc
300
290
  chưa đo; trang `mjolnir explain` của từng quy tắc nêu trạng thái. Chúng
301
- tôi công bố tỷ lệ kể cả khi nó xấu xí — QA-PW-107 kiểm toán ở mức 95 %
302
291
  và bị cách ly vì thế. Mở rộng con số đó là công việc liên tục của
303
292
  dự án.
304
293
 
@@ -515,7 +504,7 @@ không bao giờ đổi ngữ nghĩa phát hiện.
515
504
  {
516
505
  "gate": "error",
517
506
  "exclude": ["legacy/**"],
518
- "severityOverrides": { "QA-PW-118": "warning" },
507
+ "severityOverrides": { "QA-PW-141": "warning" },
519
508
  "ignore": [
520
509
  {
521
510
  "ruleId": "QA-TEST-004",
package/README.zh.md CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  [English](README.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](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
@@ -193,7 +193,6 @@ npx mjolnir-qa@latest --scope changed
193
193
 
194
194
  | ID | 规则 | Severity |
195
195
  | ------------ | ------------------------ | -------- |
196
- | QA-TQUAL-001 | 仅用 mock 验证 | info |
197
196
  | QA-TQUAL-002 | 同义反复的断言 | error |
198
197
  | QA-TQUAL-009 | 未 await 的 promise 断言 | error |
199
198
  | QA-TQUAL-011 | 被注释掉的测试 | warning |
@@ -208,9 +207,6 @@ npx mjolnir-qa@latest --scope changed
208
207
  | QA-PW-002 | 未 await 的 locator 断言 | error |
209
208
  | QA-PW-003 | 提交了 `page.pause()` / `test.only()` | error |
210
209
  | QA-PW-004 | 脆弱的 CSS/XPath 选择器 | warning |
211
- | QA-PW-005 | 在 `page.evaluate()` 中写业务逻辑 | info |
212
- | QA-PW-114 | 旧式元素句柄(`page.$`) | info |
213
- | QA-PW-118 | `networkidle` 等待(天生不稳定) | info |
214
210
  | QA-PW-123 | 硬编码的环境 URL | warning |
215
211
 
216
212
  </details>
@@ -238,8 +234,6 @@ npx mjolnir-qa@latest --scope changed
238
234
  | QA-PY-002 | 跳过的测试(`skip`、非严格 `xfail`) | warning |
239
235
  | QA-PY-003 | 无断言的测试函数 | error |
240
236
  | QA-PY-005 | 测试中的 `time.sleep()` | warning |
241
- | QA-PY-006 | 空测试主体(`pass`) | info |
242
- | QA-PY-010 | 未冻结的随机/时间依赖 | info |
243
237
  | QA-PY-012 | 同义反复的断言 | error |
244
238
 
245
239
  共 20 条 Python 规则(QA-PY-001…012 pytest 卫生 + QA-PY-101…108 Playwright-Python)。
@@ -256,8 +250,6 @@ npx mjolnir-qa@latest --scope changed
256
250
  | QA-JV-103 | 无断言的测试方法 | error |
257
251
  | QA-JV-105 | Playwright 硬性 sleep `waitForTimeout()` | warning |
258
252
  | QA-JV-106 | 脆弱选择器取代 role 定位器 | warning |
259
- | QA-JV-108 | 测试里硬编码的环境 URL | info |
260
- | QA-JV-111 | 全覆盖 mock `page.route("**")` | info |
261
253
 
262
254
  </details>
263
255
 
@@ -271,8 +263,6 @@ npx mjolnir-qa@latest --scope changed
271
263
  | QA-CS-103 | 无断言的测试方法 | error |
272
264
  | QA-CS-105 | 硬性 sleep `WaitForTimeoutAsync()` | warning |
273
265
  | QA-CS-106 | 脆弱选择器取代 role 定位器 | warning |
274
- | QA-CS-108 | 测试里硬编码的环境 URL | info |
275
- | QA-CS-111 | 全覆盖 mock `page.RouteAsync("**")` | info |
276
266
 
277
267
  </details>
278
268
 
@@ -292,7 +282,6 @@ npx mjolnir-qa@latest --scope changed
292
282
  作者的估计发布。每次扫描的页脚都会告诉你,_触发过的_ 规则中有多少经过
293
283
  测量;`mjolnir rules --unmeasured` 列出未测量的;每条规则的
294
284
  `mjolnir explain` 页面都声明其状态。即使数字难看我们也照样公布——
295
- QA-PW-107 的实测假阳性率是 95%,因此被隔离。把这个数字扩大,是项目的
296
285
  持续性工作。
297
286
 
298
287
  ### 规则层级与语言成熟度
@@ -495,7 +484,7 @@ Mjölnir 是零配置的。仓库根目录下可选的 `mjolnir.config.json`(
495
484
  {
496
485
  "gate": "error",
497
486
  "exclude": ["legacy/**"],
498
- "severityOverrides": { "QA-PW-118": "warning" },
487
+ "severityOverrides": { "QA-PW-141": "warning" },
499
488
  "ignore": [
500
489
  {
501
490
  "ruleId": "QA-TEST-004",
package/README.zht.md CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  [English](README.md) | [简体中文](README.zh.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](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
@@ -193,7 +193,6 @@ npx mjolnir-qa@latest --scope changed
193
193
 
194
194
  | ID | 規則 | Severity |
195
195
  | ------------ | ------------------------ | -------- |
196
- | QA-TQUAL-001 | 僅用 mock 驗證 | info |
197
196
  | QA-TQUAL-002 | 同義反覆的斷言 | error |
198
197
  | QA-TQUAL-009 | 未 await 的 promise 斷言 | error |
199
198
  | QA-TQUAL-011 | 被註解掉的測試 | warning |
@@ -208,9 +207,6 @@ npx mjolnir-qa@latest --scope changed
208
207
  | QA-PW-002 | 未 await 的 locator 斷言 | error |
209
208
  | QA-PW-003 | 提交了 `page.pause()` / `test.only()` | error |
210
209
  | QA-PW-004 | 脆弱的 CSS/XPath 選擇器 | warning |
211
- | QA-PW-005 | 在 `page.evaluate()` 中寫商業邏輯 | info |
212
- | QA-PW-114 | 舊式元素控制代碼(`page.$`) | info |
213
- | QA-PW-118 | `networkidle` 等待(天生不穩定) | info |
214
210
  | QA-PW-123 | 寫死的環境 URL | warning |
215
211
 
216
212
  </details>
@@ -238,8 +234,6 @@ npx mjolnir-qa@latest --scope changed
238
234
  | QA-PY-002 | 跳過的測試(`skip`、非嚴格 `xfail`) | warning |
239
235
  | QA-PY-003 | 無斷言的測試函式 | error |
240
236
  | QA-PY-005 | 測試中的 `time.sleep()` | warning |
241
- | QA-PY-006 | 空測試主體(`pass`) | info |
242
- | QA-PY-010 | 未凍結的隨機/時間依賴 | info |
243
237
  | QA-PY-012 | 同義反覆的斷言 | error |
244
238
 
245
239
  共 20 條 Python 規則(QA-PY-001…012 pytest 衛生 + QA-PY-101…108 Playwright-Python)。
@@ -256,8 +250,6 @@ npx mjolnir-qa@latest --scope changed
256
250
  | QA-JV-103 | 無斷言的測試方法 | error |
257
251
  | QA-JV-105 | Playwright 硬式 sleep `waitForTimeout()` | warning |
258
252
  | QA-JV-106 | 脆弱選擇器取代 role 定位器 | warning |
259
- | QA-JV-108 | 測試裡寫死的環境 URL | info |
260
- | QA-JV-111 | 全覆蓋 mock `page.route("**")` | info |
261
253
 
262
254
  </details>
263
255
 
@@ -271,8 +263,6 @@ npx mjolnir-qa@latest --scope changed
271
263
  | QA-CS-103 | 無斷言的測試方法 | error |
272
264
  | QA-CS-105 | 硬式 sleep `WaitForTimeoutAsync()` | warning |
273
265
  | QA-CS-106 | 脆弱選擇器取代 role 定位器 | warning |
274
- | QA-CS-108 | 測試裡寫死的環境 URL | info |
275
- | QA-CS-111 | 全覆蓋 mock `page.RouteAsync("**")` | info |
276
266
 
277
267
  </details>
278
268
 
@@ -292,7 +282,6 @@ npx mjolnir-qa@latest --scope changed
292
282
  作者的估計發布。每次掃描的頁尾都會告訴你,_觸發過的_ 規則中有多少經過
293
283
  測量;`mjolnir rules --unmeasured` 列出未測量的;每條規則的
294
284
  `mjolnir explain` 頁面都聲明其狀態。即使數字難看我們也照樣公布——
295
- QA-PW-107 的實測假陽性率是 95%,因此被隔離。把這個數字擴大,是專案的
296
285
  持續性工作。
297
286
 
298
287
  ### 規則層級與語言成熟度
@@ -495,7 +484,7 @@ Mjölnir 是零設定的。儲存庫根目錄下選用的 `mjolnir.config.json`
495
484
  {
496
485
  "gate": "error",
497
486
  "exclude": ["legacy/**"],
498
- "severityOverrides": { "QA-PW-118": "warning" },
487
+ "severityOverrides": { "QA-PW-141": "warning" },
499
488
  "ignore": [
500
489
  {
501
490
  "ruleId": "QA-TEST-004",
package/dist/cli.d.mts CHANGED
@@ -319,6 +319,40 @@ interface ScanResult {
319
319
  /** Absolute path of the cache file — auditable, gitignored. */
320
320
  file: string;
321
321
  };
322
+ /**
323
+ * Scan-level trust summary (Mega MVP Master Plan v3.1 §26 WI-3, §6).
324
+ * A MEASUREMENT, not a contract: additive within schemaVersion 1,
325
+ * formulas published in docs/SCORING.md, hard incompleteness ceilings
326
+ * (a summary never claims more certainty than the scan that produced
327
+ * it). Present on every completed scan (absent only on scans whose
328
+ * producer predates this field). Built by
329
+ * src/engine/trust-summary.ts — the single definition site.
330
+ */
331
+ trustSummary?: TrustSummary;
332
+ }
333
+ /** Trust summary metric block (plan §6 — measurement, not contract). */
334
+ interface TrustSummary {
335
+ /** Best trust level any finding reached (L2 when none corroborated). */
336
+ level: TrustLevel;
337
+ /** Deterministic composite in [0,1], capped by the incompleteness ceiling. */
338
+ confidence: number;
339
+ /** evidenceBackedDeclarations / analyzedDeclarations. */
340
+ evidenceCoverage: number;
341
+ /** INCONCLUSIVE classifications + scan-level unknowns, over judged. */
342
+ inconclusiveRate: number;
343
+ /**
344
+ * Evidence-weighted measured FP rate over fired rules. Absent when no
345
+ * fired rule is measured OR the fired set mixes measured and
346
+ * unmeasured rules (a mixed average would hide the unknown) — see
347
+ * `provisionalRuleIds`.
348
+ */
349
+ measuredFpOfFiredRules?: number;
350
+ /** Fired rules without a valid measurement — the PROVISIONAL disclosure. */
351
+ provisionalRuleIds: string[];
352
+ /** The incompleteness ceiling that bound confidence (present when < 1). */
353
+ confidenceCeiling?: number;
354
+ /** Which incompleteness factors applied (audit trail for the cap). */
355
+ ceilingReasons: string[];
322
356
  }
323
357
  //#endregion
324
358
  //#region src/engine/tier-policy.d.ts
@@ -673,6 +707,13 @@ interface CliArgs {
673
707
  * equivalent. JSON rule manifests are unaffected (no code by design).
674
708
  */
675
709
  enablePlugins?: boolean;
710
+ /**
711
+ * --classic (plan §26 WI-5): escape hatch back to the pre-Trust-Report
712
+ * terminal render. Rendering flag only — scan semantics, exit codes
713
+ * and JSON are identical under both surfaces. Default OFF: the Trust
714
+ * Report is the hero output.
715
+ */
716
+ classic?: boolean;
676
717
  }
677
718
  interface ScanHooks {
678
719
  /** Invoked when a rule throws on a file (audit R-9). */
@@ -721,12 +762,14 @@ declare function fallbackWorkspace$1(targetAbs: string): Workspace;
721
762
  */
722
763
  declare function pathMatchesGlob$1(path: string, glob: string): boolean;
723
764
  /**
724
- * Plan §16: locate a runtime run report next to the scan target, using
725
- * the exact conventions the forensics ingestion already accepts —
726
- * `mjolnir.report.json` (the packages/playwright-reporter default
727
- * output) or a `test-results/` directory. Returns the path for
728
- * `runForensics`, or undefined when neither convention is present
729
- * ("no runtime evidence" — never guessed).
765
+ * Plan §16 + WI-11: locate a runtime run report next to the scan
766
+ * target, using the exact conventions the forensics ingestion already
767
+ * accepts. Zero-config search over conventional artifact names at
768
+ * depth ≤ 2 (src/discovery/evidence-discovery.ts); the FIRST parsable
769
+ * candidate wins (priority: mjolnir-report > playwright-json >
770
+ * test-results-dir > junit-file). Returns the path for `runForensics`,
771
+ * or undefined when no convention is present ("no runtime evidence" —
772
+ * never guessed; the CLI surfaces the missing-evidence message).
730
773
  */
731
774
  declare function discoverRuntimeReport$1(scanRoot: string): string | undefined;
732
775
  /**
@@ -783,7 +826,7 @@ declare const runScan: typeof runScan$1, buildUniversalRules: typeof buildUniver
783
826
  * `scripts/sync-sarif-version.cjs` on release and guarded by
784
827
  * `tests/version-consistency.spec.ts` locally.
785
828
  */
786
- declare const CLI_VERSION = "0.5.39";
829
+ declare const CLI_VERSION = "0.6.7";
787
830
  /** A usage-error detail: the offending token, when one exists. */
788
831
  interface UsageErrorDetail {
789
832
  /** The unknown flag or rejected value (e.g. `--nope`, `loud`). */
@@ -838,7 +881,7 @@ declare function runRulesCommand(argv: string[], io?: {
838
881
  declare function runExplainCommand(argv: string[], io?: {
839
882
  out: Output;
840
883
  err: Output;
841
- }): number;
884
+ }): Promise<number>;
842
885
  declare function runScanCommand(argv: string[], io?: {
843
886
  out: Output;
844
887
  err: Output;