dsh-standards 1.3.0 → 1.4.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/40-checker/scripts/build-sidecar.mjs +238 -8
- package/40-checker/src/author-cli.mjs +274 -7
- package/40-checker/src/author-report.mjs +14 -3
- package/40-checker/src/bundle-static.mjs +181 -0
- package/40-checker/src/cli.mjs +27 -3
- package/40-checker/src/client-shape.mjs +33 -3
- package/40-checker/src/declarations.mjs +53 -8
- package/40-checker/src/index.mjs +3 -1
- package/40-checker/src/manifest.mjs +87 -14
- package/40-checker/src/remediation.mjs +108 -7
- package/40-checker/src/report.mjs +83 -7
- package/40-checker/src/semver.mjs +112 -65
- package/40-checker/src/util.mjs +51 -8
- package/CHANGELOG.md +23 -0
- package/README.md +28 -16
- package/docs/coverage.md +82 -0
- package/package.json +1 -1
- package/spec/coverage-contract.md +100 -0
- package/spec/dsc-clauses.json +766 -0
- package/spec/examples/boost-card.example.json +15 -0
- package/spec/examples/flow-evidence.example.json +113 -0
- package/spec/remediation.json +54 -54
- package/spec/schemas/boost-card.schema.json +107 -0
- package/spec/schemas/conformance.schema.json +848 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# coverage 契约(`dsh-conformance/1`)
|
|
2
|
+
|
|
3
|
+
> 适用版本:dsh-standards **1.3.0**(`40-checker/src/report.mjs` 的 `buildReport()`)。
|
|
4
|
+
> 机器可校验形状见 [`schemas/conformance.schema.json`](schemas/conformance.schema.json);本文只统一字段含义。
|
|
5
|
+
> 结论:`coverage` 是**加性计数**,不参与 verdict;`PASS/WARN/FAIL` 与 `status/level` 由 `conclusion` 和对应 profile 的强制项决定。
|
|
6
|
+
|
|
7
|
+
## 1. 两个层次,不要混用
|
|
8
|
+
|
|
9
|
+
| 层次 | 字段 | 取值 | 回答的问题 |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| 检查级 | `checks[].coverage` | `full` / `partial` / `not-run` | **这一项自己**跑完了没有 |
|
|
12
|
+
| 报告级 | 顶层 `coverage` 对象 | 整数计数 | 报告携带的**全部** `checks[]` 里,各结果/覆盖状态各多少 |
|
|
13
|
+
|
|
14
|
+
检查级 `NA` 的默认覆盖是 `not-run`(`result.mjs`),但它是**显式不适用**,在报告级单列到 `coverage.na`,不并入 `notRun`。
|
|
15
|
+
|
|
16
|
+
## 2. 顶层 `coverage` 字段
|
|
17
|
+
|
|
18
|
+
| 字段 | 定义 |
|
|
19
|
+
|---|---|
|
|
20
|
+
| `total` | `checks[].length`,完整跑是 14(`DSC-01`…`DSC-14`)。 |
|
|
21
|
+
| `mandatory` | 当前 `scope`/`profile`/`staticOnly`/`entryClaim` 选出的强制检查 ID 数,不是 14。 |
|
|
22
|
+
| `checked` | 结果属于 `PASS` / `WARN` / `FAIL` 的检查数,即**实际评估过**的项。 |
|
|
23
|
+
| `pass` | 结果 `PASS` 的数量。 |
|
|
24
|
+
| `warn` | 结果 `WARN` 的数量。 |
|
|
25
|
+
| `advisory` | `check.advisory === true` 且结果为 `WARN` 的数量;是 `warn` 的子集,只作信号,永不改 verdict。 |
|
|
26
|
+
| `fail` | 结果 `FAIL` 的数量。 |
|
|
27
|
+
| `na` | 结果 `NA` 的数量(对象形态/上下文不适用),**不是通过**。 |
|
|
28
|
+
| `notRun` | `coverage` 为 `not-run`/`partial` 且结果非 `NA` 的项、结果 `ERROR` 的项、以及**缺失的强制项** ID 去重后的数量;包含 `error`。 |
|
|
29
|
+
| `error` | 结果 `ERROR` 的数量(检查器失效或该跑没跑);是 `notRun` 的子集。 |
|
|
30
|
+
|
|
31
|
+
加性诊断字段(1.3.0 工作树同时输出;旧消费者应按“可选”处理,不参与 verdict):
|
|
32
|
+
|
|
33
|
+
| 字段 | 定义 |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `coverage.partial` | `checks[].coverage === "partial"` 的数量。它同时保留在 `checked`(若结果 PASS/WARN/FAIL)和 `notRun` 中;这个计数只是把重叠显式化,**不是第 10 个通过口径**。 |
|
|
36
|
+
| 顶层 `notChecked` | `buckets.notChecked` 与 `buckets.partial` 按 `id` 去重后的可读视图,每行带 `howToEnable`。等价信息已在 `buckets` 里子集化,消费者可忽略。 |
|
|
37
|
+
| `buckets.partial` | `coverage: "partial"` 的检查行;同一行可能也出现在 `blocking` / `hygiene`。 |
|
|
38
|
+
| 行级 `howToEnable` | 让该 NA/ERROR/partial 行可运行的命令或 flag;仅提示。 |
|
|
39
|
+
|
|
40
|
+
恒等式与边界:
|
|
41
|
+
|
|
42
|
+
- `checked = pass + warn + fail`(`advisory <= warn`)。
|
|
43
|
+
- `error <= notRun`;`notRun` 统计的是“没拿到完整结论”的项,`NA` 不算没跑。
|
|
44
|
+
- 常规完整跑(14 项、无缺失)满足 `checked + na + notRun = total`。
|
|
45
|
+
- **例外**:若某项 `coverage: "partial"` 但结果仍是 `WARN`/`FAIL`,它会同时出现在 `checked` 与 `notRun` 中——已评估但不完整,不能当成 `full`。有缺失强制项时,`notRun` 会含不在 `checks[]` 里的 ID,此时上述加法可大于 `total`。
|
|
46
|
+
- `metrics = { checked, total, declaredFields }`:`checked`/`total` 与 `coverage` 同源;`declaredFields` 是 capabilities/labels/commitments/disclosure/engines.dsh 五个可选声明面中实际声明的个数(0–5),只作上下文。
|
|
47
|
+
|
|
48
|
+
## 3. 与旧检查级 `full` / `partial` 的映射
|
|
49
|
+
|
|
50
|
+
旧报告(31 §3.3 草案)与旧检查项只有 `coverage: full | partial | not-run`,没有结果计数。映射:
|
|
51
|
+
|
|
52
|
+
| 旧检查级 | 新顶层计数 | 说明 |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| `full` + `PASS`/`WARN`/`FAIL` | `checked`,并落入 `pass`/`warn`/`fail` | 完整评估,计入结论。 |
|
|
55
|
+
| `full` + `NA` | `na` | 显式不适用;旧报告常把 NA 记在 `full` 之外。 |
|
|
56
|
+
| `partial`(无论结果) | `notRun` | 只跑了一部分,必须当未完成;若结果仍是 `WARN`/`FAIL`,同时计入 `checked`。 |
|
|
57
|
+
| `not-run` | `notRun` | 完全没跑。 |
|
|
58
|
+
| `ERROR`(旧 `error` 计数) | `notRun` + `error` | 检查器失效/未执行;两者都计。 |
|
|
59
|
+
|
|
60
|
+
旧对象字段的对应关系:
|
|
61
|
+
|
|
62
|
+
- 旧 `mandatory` → 新 `mandatory`(同义,选出的强制项数)。
|
|
63
|
+
- 旧 `full` → 新 `checked` **减去** `partial` 但已评估的项,再减去 `full + NA` 的项;最稳妥的读法是“旧 full 只看覆盖,新 checked 看结果”。
|
|
64
|
+
- 旧 `partial` / `notRun` → 新 `notRun`。
|
|
65
|
+
- 旧 `na` → 新 `na`。
|
|
66
|
+
- 旧 `error` → 新 `error`(并已包含在 `notRun`)。
|
|
67
|
+
- 旧对象没有 `total` / `pass` / `warn` / `advisory` / `fail` / `checked`;这些是 1.3.0 的新增计数。
|
|
68
|
+
|
|
69
|
+
## 4. `entryBlocking`
|
|
70
|
+
|
|
71
|
+
仅 `scope: "entry"` 非 null;`ds-c`/`mvp` 固定为 `null`。形状:
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{ "required": 6, "checked": ["C-1.1", "..."], "notChecked": ["C-3.1"], "failed": [], "pass": false }
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
- `required`:该 claim 的阻断前提总数(static 6 个;runtime 再加 `C-2.2`/`C-2.3`)。
|
|
78
|
+
- `checked`:真正产出 detail 的前提;`notChecked`:没产出的前提。
|
|
79
|
+
- `checked.length + notChecked.length = required`;`failed` 是 `checked` 中结果为 `FAIL` 的子集。
|
|
80
|
+
- `pass` 仅在 `failed` 为空**且** `notChecked` 为空时为 `true`。没给 `--install-spec`/`--market-index` 时 C-3.x 未查,`pass` 必为 `false`。
|
|
81
|
+
- `entryBlocking` 不替代 `coverage`;它回答“阻断前提齐不齐”,`coverage` 回答“14 项各是什么状态”。
|
|
82
|
+
|
|
83
|
+
## 5. 示例(1.3.0,good fixture,`--no-exec`)
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"total": 14, "mandatory": 11, "checked": 6,
|
|
88
|
+
"pass": 5, "warn": 0, "advisory": 0, "fail": 1,
|
|
89
|
+
"na": 1, "notRun": 7, "error": 7, "entryBlocking": null
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
读法:5 项 PASS + 1 项 FAIL = 6 项实际评估;1 项显式 NA;7 项 ERROR/未跑;`checked + na + notRun = 14`;`error (7) <= notRun (7)`。`status` 仍由强制项决定(此处因 FAIL 为 `fail`),不能只看 `coverage` 反推通过。
|
|
94
|
+
|
|
95
|
+
## 6. 禁止事项
|
|
96
|
+
|
|
97
|
+
- 不得把 `na`、`notRun`、`error` 或 `partial` 写成 PASS。
|
|
98
|
+
- 不得用 `coverage.pass / total` 当通过率或等级;`total` 含未跑项,且 `mandatory` 随 profile 变。
|
|
99
|
+
- 不得把 `advisory` 计入 `fail` 或据其改变 `exitCode`。
|
|
100
|
+
- 检查级 `coverage` 与报告级 `coverage` 同名不同义;引用时必须写全路径(`checks[].coverage` vs `coverage`)。
|