dsh-standards 1.3.0 → 1.4.1
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 +109 -8
- 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 +27 -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,848 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/PerryLink/dsh-standards/spec/schemas/conformance.schema.json",
|
|
4
|
+
"title": "DSH conformance report (dsh-conformance/1)",
|
|
5
|
+
"description": "The complete shape of the JSON printed by `dsh-standards check --json` / `dsh-plugin-verify --format json` in dsh-standards 1.3.0. `advice` is additive and may be omitted with --no-advice; every other top-level property is always present. Counts in `coverage` cover every check carried by the report, not only the mandatory subset. Verification (PASS/FAIL) is never derived from `advice`, `buckets` or `metrics`.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"schema",
|
|
10
|
+
"standard",
|
|
11
|
+
"subject",
|
|
12
|
+
"anchor",
|
|
13
|
+
"g4",
|
|
14
|
+
"checks",
|
|
15
|
+
"coverage",
|
|
16
|
+
"buckets",
|
|
17
|
+
"metrics",
|
|
18
|
+
"conclusion"
|
|
19
|
+
],
|
|
20
|
+
"properties": {
|
|
21
|
+
"schema": {
|
|
22
|
+
"const": "dsh-conformance/1"
|
|
23
|
+
},
|
|
24
|
+
"standard": {
|
|
25
|
+
"$ref": "#/$defs/standard"
|
|
26
|
+
},
|
|
27
|
+
"subject": {
|
|
28
|
+
"$ref": "#/$defs/subject"
|
|
29
|
+
},
|
|
30
|
+
"anchor": {
|
|
31
|
+
"$ref": "#/$defs/anchor"
|
|
32
|
+
},
|
|
33
|
+
"g4": {
|
|
34
|
+
"oneOf": [
|
|
35
|
+
{
|
|
36
|
+
"$ref": "#/$defs/g4"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"type": "null"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"description": "Static G4 client shape. Present (possibly null) even when the package has no client."
|
|
43
|
+
},
|
|
44
|
+
"checks": {
|
|
45
|
+
"type": "array",
|
|
46
|
+
"minItems": 1,
|
|
47
|
+
"items": {
|
|
48
|
+
"$ref": "#/$defs/check"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"coverage": {
|
|
52
|
+
"$ref": "#/$defs/coverage"
|
|
53
|
+
},
|
|
54
|
+
"buckets": {
|
|
55
|
+
"$ref": "#/$defs/buckets"
|
|
56
|
+
},
|
|
57
|
+
"metrics": {
|
|
58
|
+
"$ref": "#/$defs/metrics"
|
|
59
|
+
},
|
|
60
|
+
"conclusion": {
|
|
61
|
+
"$ref": "#/$defs/conclusion"
|
|
62
|
+
},
|
|
63
|
+
"advice": {
|
|
64
|
+
"type": "array",
|
|
65
|
+
"description": "Additive remediation entries (dsh-advice/1). Omitted by --no-advice; never changes the verdict. The canonical per-entry schema is spec/schemas/advice.schema.json.",
|
|
66
|
+
"items": {
|
|
67
|
+
"$ref": "#/$defs/advice"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"notChecked": {
|
|
71
|
+
"type": "array",
|
|
72
|
+
"description": "Additive flattened view: buckets.notChecked plus partly-checked (coverage=partial) rows, de-duplicated by id, each with howToEnable. Omitted by builds that do not emit it; consumers that only know the 9-field coverage contract must ignore it.",
|
|
73
|
+
"items": {
|
|
74
|
+
"$ref": "#/$defs/bucketRow"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"$defs": {
|
|
79
|
+
"standard": {
|
|
80
|
+
"type": "object",
|
|
81
|
+
"additionalProperties": false,
|
|
82
|
+
"required": [
|
|
83
|
+
"id",
|
|
84
|
+
"version"
|
|
85
|
+
],
|
|
86
|
+
"properties": {
|
|
87
|
+
"id": {
|
|
88
|
+
"type": "string",
|
|
89
|
+
"minLength": 1,
|
|
90
|
+
"description": "Standard family, for example DS-C."
|
|
91
|
+
},
|
|
92
|
+
"version": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"minLength": 1,
|
|
95
|
+
"description": "Version of the clause document the checks implement."
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"subject": {
|
|
100
|
+
"type": "object",
|
|
101
|
+
"additionalProperties": false,
|
|
102
|
+
"required": [
|
|
103
|
+
"mode",
|
|
104
|
+
"profile",
|
|
105
|
+
"kind",
|
|
106
|
+
"kindInferred",
|
|
107
|
+
"kindEvaluated",
|
|
108
|
+
"name",
|
|
109
|
+
"version",
|
|
110
|
+
"path"
|
|
111
|
+
],
|
|
112
|
+
"properties": {
|
|
113
|
+
"mode": {
|
|
114
|
+
"enum": [
|
|
115
|
+
"package",
|
|
116
|
+
"listing"
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
"profile": {
|
|
120
|
+
"enum": [
|
|
121
|
+
"package",
|
|
122
|
+
"listing",
|
|
123
|
+
"both"
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
"kind": {
|
|
127
|
+
"$ref": "#/$defs/kind"
|
|
128
|
+
},
|
|
129
|
+
"kindInferred": {
|
|
130
|
+
"type": "boolean"
|
|
131
|
+
},
|
|
132
|
+
"kindEvaluated": {
|
|
133
|
+
"$ref": "#/$defs/kind"
|
|
134
|
+
},
|
|
135
|
+
"name": {
|
|
136
|
+
"oneOf": [
|
|
137
|
+
{
|
|
138
|
+
"type": "string",
|
|
139
|
+
"minLength": 1
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"type": "null"
|
|
143
|
+
}
|
|
144
|
+
]
|
|
145
|
+
},
|
|
146
|
+
"version": {
|
|
147
|
+
"oneOf": [
|
|
148
|
+
{
|
|
149
|
+
"type": "string",
|
|
150
|
+
"minLength": 1
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"type": "null"
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
},
|
|
157
|
+
"path": {
|
|
158
|
+
"type": "string",
|
|
159
|
+
"minLength": 1
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
"kind": {
|
|
164
|
+
"enum": [
|
|
165
|
+
"plugin",
|
|
166
|
+
"bundle",
|
|
167
|
+
"client",
|
|
168
|
+
"preset",
|
|
169
|
+
"skill",
|
|
170
|
+
"theme",
|
|
171
|
+
"mcp-config",
|
|
172
|
+
"unknown"
|
|
173
|
+
]
|
|
174
|
+
},
|
|
175
|
+
"anchor": {
|
|
176
|
+
"type": "object",
|
|
177
|
+
"description": "The five-part anchor plus scanner/runtime provenance. `runtimeSource` says where `dsh` came from: cli (--runtime-version), host detection, or the checked-in fallback constant. `suspect` is true only when a cli-supplied version differs from the detected host.",
|
|
178
|
+
"additionalProperties": false,
|
|
179
|
+
"required": [
|
|
180
|
+
"repo",
|
|
181
|
+
"commit",
|
|
182
|
+
"scanner",
|
|
183
|
+
"dsh",
|
|
184
|
+
"cordis",
|
|
185
|
+
"runtime",
|
|
186
|
+
"runtimeSource",
|
|
187
|
+
"hostVersion",
|
|
188
|
+
"suspect"
|
|
189
|
+
],
|
|
190
|
+
"properties": {
|
|
191
|
+
"repo": {
|
|
192
|
+
"type": "string",
|
|
193
|
+
"minLength": 1
|
|
194
|
+
},
|
|
195
|
+
"commit": {
|
|
196
|
+
"type": "string",
|
|
197
|
+
"minLength": 1
|
|
198
|
+
},
|
|
199
|
+
"scanner": {
|
|
200
|
+
"type": "string",
|
|
201
|
+
"minLength": 1
|
|
202
|
+
},
|
|
203
|
+
"dsh": {
|
|
204
|
+
"oneOf": [
|
|
205
|
+
{
|
|
206
|
+
"type": "string",
|
|
207
|
+
"minLength": 1
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"type": "null"
|
|
211
|
+
}
|
|
212
|
+
]
|
|
213
|
+
},
|
|
214
|
+
"cordis": {
|
|
215
|
+
"oneOf": [
|
|
216
|
+
{
|
|
217
|
+
"type": "string",
|
|
218
|
+
"minLength": 1
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"type": "null"
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
},
|
|
225
|
+
"runtime": {
|
|
226
|
+
"oneOf": [
|
|
227
|
+
{
|
|
228
|
+
"type": "string",
|
|
229
|
+
"minLength": 1
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"type": "null"
|
|
233
|
+
}
|
|
234
|
+
],
|
|
235
|
+
"description": "Absolute path to a --runtime Cordis build, or null when L1-L3 did not run."
|
|
236
|
+
},
|
|
237
|
+
"runtimeSource": {
|
|
238
|
+
"enum": [
|
|
239
|
+
"cli",
|
|
240
|
+
"host",
|
|
241
|
+
"fallback"
|
|
242
|
+
]
|
|
243
|
+
},
|
|
244
|
+
"hostVersion": {
|
|
245
|
+
"oneOf": [
|
|
246
|
+
{
|
|
247
|
+
"type": "string",
|
|
248
|
+
"minLength": 1
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"type": "null"
|
|
252
|
+
}
|
|
253
|
+
]
|
|
254
|
+
},
|
|
255
|
+
"suspect": {
|
|
256
|
+
"type": "boolean"
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
"g4": {
|
|
261
|
+
"type": "object",
|
|
262
|
+
"additionalProperties": false,
|
|
263
|
+
"required": [
|
|
264
|
+
"hasClient",
|
|
265
|
+
"ok",
|
|
266
|
+
"result",
|
|
267
|
+
"reason"
|
|
268
|
+
],
|
|
269
|
+
"properties": {
|
|
270
|
+
"hasClient": {
|
|
271
|
+
"type": "boolean"
|
|
272
|
+
},
|
|
273
|
+
"ok": {
|
|
274
|
+
"type": "boolean"
|
|
275
|
+
},
|
|
276
|
+
"result": {
|
|
277
|
+
"enum": [
|
|
278
|
+
"PASS",
|
|
279
|
+
"FAIL",
|
|
280
|
+
"NA"
|
|
281
|
+
]
|
|
282
|
+
},
|
|
283
|
+
"reason": {
|
|
284
|
+
"type": "string"
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
"check": {
|
|
289
|
+
"type": "object",
|
|
290
|
+
"additionalProperties": false,
|
|
291
|
+
"required": [
|
|
292
|
+
"id",
|
|
293
|
+
"clause",
|
|
294
|
+
"layer",
|
|
295
|
+
"result",
|
|
296
|
+
"coverage",
|
|
297
|
+
"reason",
|
|
298
|
+
"evidence",
|
|
299
|
+
"details",
|
|
300
|
+
"method",
|
|
301
|
+
"advisory"
|
|
302
|
+
],
|
|
303
|
+
"properties": {
|
|
304
|
+
"id": {
|
|
305
|
+
"type": "string",
|
|
306
|
+
"pattern": "^DSC-[0-9]{2}$"
|
|
307
|
+
},
|
|
308
|
+
"clause": {
|
|
309
|
+
"type": "string",
|
|
310
|
+
"pattern": "^C-[0-9]+(?:\\.[0-9]+)?$"
|
|
311
|
+
},
|
|
312
|
+
"layer": {
|
|
313
|
+
"enum": [
|
|
314
|
+
"L0",
|
|
315
|
+
"L1",
|
|
316
|
+
"L1+L2",
|
|
317
|
+
"L2",
|
|
318
|
+
"L3"
|
|
319
|
+
]
|
|
320
|
+
},
|
|
321
|
+
"result": {
|
|
322
|
+
"$ref": "#/$defs/result"
|
|
323
|
+
},
|
|
324
|
+
"coverage": {
|
|
325
|
+
"$ref": "#/$defs/checkCoverage"
|
|
326
|
+
},
|
|
327
|
+
"reason": {
|
|
328
|
+
"type": "string"
|
|
329
|
+
},
|
|
330
|
+
"evidence": {
|
|
331
|
+
"type": "array",
|
|
332
|
+
"items": {
|
|
333
|
+
"type": "string"
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
"details": {
|
|
337
|
+
"type": "array",
|
|
338
|
+
"items": {
|
|
339
|
+
"$ref": "#/$defs/detail"
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
"method": {
|
|
343
|
+
"enum": [
|
|
344
|
+
"M",
|
|
345
|
+
"M+H",
|
|
346
|
+
"H"
|
|
347
|
+
],
|
|
348
|
+
"description": "M = machine, M+H = machine plus human, H = human."
|
|
349
|
+
},
|
|
350
|
+
"advisory": {
|
|
351
|
+
"type": "boolean",
|
|
352
|
+
"description": "True when the check is reported but never moves the verdict."
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
"detail": {
|
|
357
|
+
"type": "object",
|
|
358
|
+
"additionalProperties": false,
|
|
359
|
+
"required": [
|
|
360
|
+
"item",
|
|
361
|
+
"result",
|
|
362
|
+
"reason"
|
|
363
|
+
],
|
|
364
|
+
"properties": {
|
|
365
|
+
"item": {
|
|
366
|
+
"type": "string",
|
|
367
|
+
"minLength": 1,
|
|
368
|
+
"description": "Sub-clause (C-1.2) or host gate (G0-G4)."
|
|
369
|
+
},
|
|
370
|
+
"result": {
|
|
371
|
+
"$ref": "#/$defs/result"
|
|
372
|
+
},
|
|
373
|
+
"reason": {
|
|
374
|
+
"type": "string"
|
|
375
|
+
},
|
|
376
|
+
"evidence": {
|
|
377
|
+
"type": "array",
|
|
378
|
+
"items": {
|
|
379
|
+
"type": "string"
|
|
380
|
+
},
|
|
381
|
+
"description": "Optional evidence references; the detail() helper emits [], but a few manually built details (for example the G4 detail) omit the key in 1.3.0."
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
"result": {
|
|
386
|
+
"enum": [
|
|
387
|
+
"PASS",
|
|
388
|
+
"WARN",
|
|
389
|
+
"FAIL",
|
|
390
|
+
"NA",
|
|
391
|
+
"ERROR"
|
|
392
|
+
]
|
|
393
|
+
},
|
|
394
|
+
"checkCoverage": {
|
|
395
|
+
"enum": [
|
|
396
|
+
"full",
|
|
397
|
+
"partial",
|
|
398
|
+
"not-run"
|
|
399
|
+
],
|
|
400
|
+
"description": "Per-check coverage. `partial` means only part of the sub-checks ran; it is counted in coverage.notRun, never as a pass."
|
|
401
|
+
},
|
|
402
|
+
"coverage": {
|
|
403
|
+
"type": "object",
|
|
404
|
+
"description": "Counts over every check the report carries. Check-level `full|partial|not-run` is a different axis: see spec/coverage-contract.md for the mapping. Invariants: total == checks.length; pass + warn + fail == checked; error <= notRun; checked + na + notRun == total when no mandatory check is missing.",
|
|
405
|
+
"additionalProperties": false,
|
|
406
|
+
"required": [
|
|
407
|
+
"total",
|
|
408
|
+
"mandatory",
|
|
409
|
+
"checked",
|
|
410
|
+
"pass",
|
|
411
|
+
"warn",
|
|
412
|
+
"advisory",
|
|
413
|
+
"fail",
|
|
414
|
+
"na",
|
|
415
|
+
"notRun",
|
|
416
|
+
"error",
|
|
417
|
+
"entryBlocking"
|
|
418
|
+
],
|
|
419
|
+
"properties": {
|
|
420
|
+
"total": {
|
|
421
|
+
"type": "integer",
|
|
422
|
+
"minimum": 0,
|
|
423
|
+
"description": "Number of checks in checks[]."
|
|
424
|
+
},
|
|
425
|
+
"mandatory": {
|
|
426
|
+
"type": "integer",
|
|
427
|
+
"minimum": 0,
|
|
428
|
+
"description": "Number of mandatory check ids for the selected scope/profile."
|
|
429
|
+
},
|
|
430
|
+
"checked": {
|
|
431
|
+
"type": "integer",
|
|
432
|
+
"minimum": 0,
|
|
433
|
+
"description": "Checks with result PASS, WARN or FAIL."
|
|
434
|
+
},
|
|
435
|
+
"pass": {
|
|
436
|
+
"type": "integer",
|
|
437
|
+
"minimum": 0
|
|
438
|
+
},
|
|
439
|
+
"warn": {
|
|
440
|
+
"type": "integer",
|
|
441
|
+
"minimum": 0
|
|
442
|
+
},
|
|
443
|
+
"advisory": {
|
|
444
|
+
"type": "integer",
|
|
445
|
+
"minimum": 0,
|
|
446
|
+
"description": "Advisory checks that produced WARN. Subset of warn; never moves the verdict."
|
|
447
|
+
},
|
|
448
|
+
"fail": {
|
|
449
|
+
"type": "integer",
|
|
450
|
+
"minimum": 0
|
|
451
|
+
},
|
|
452
|
+
"na": {
|
|
453
|
+
"type": "integer",
|
|
454
|
+
"minimum": 0,
|
|
455
|
+
"description": "Checks explicitly NA (not applicable), not a pass."
|
|
456
|
+
},
|
|
457
|
+
"notRun": {
|
|
458
|
+
"type": "integer",
|
|
459
|
+
"minimum": 0,
|
|
460
|
+
"description": "Checks with coverage not-run/partial, ERROR checks, and missing mandatory ids. Includes error."
|
|
461
|
+
},
|
|
462
|
+
"error": {
|
|
463
|
+
"type": "integer",
|
|
464
|
+
"minimum": 0,
|
|
465
|
+
"description": "Checks whose result is ERROR (checker failure or not executed)."
|
|
466
|
+
},
|
|
467
|
+
"entryBlocking": {
|
|
468
|
+
"oneOf": [
|
|
469
|
+
{
|
|
470
|
+
"$ref": "#/$defs/entryBlocking"
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"type": "null"
|
|
474
|
+
}
|
|
475
|
+
],
|
|
476
|
+
"description": "Entry-scope prerequisite summary; null for ds-c/mvp."
|
|
477
|
+
},
|
|
478
|
+
"partial": {
|
|
479
|
+
"type": "integer",
|
|
480
|
+
"minimum": 0,
|
|
481
|
+
"description": "Additive diagnostic: checks whose per-check coverage is partial. They remain in checked when their result is PASS/WARN/FAIL and in notRun; this count makes the overlap explicit."
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
},
|
|
485
|
+
"entryBlocking": {
|
|
486
|
+
"type": "object",
|
|
487
|
+
"additionalProperties": false,
|
|
488
|
+
"required": [
|
|
489
|
+
"required",
|
|
490
|
+
"checked",
|
|
491
|
+
"notChecked",
|
|
492
|
+
"failed",
|
|
493
|
+
"pass"
|
|
494
|
+
],
|
|
495
|
+
"properties": {
|
|
496
|
+
"required": {
|
|
497
|
+
"type": "integer",
|
|
498
|
+
"minimum": 0
|
|
499
|
+
},
|
|
500
|
+
"checked": {
|
|
501
|
+
"type": "array",
|
|
502
|
+
"items": {
|
|
503
|
+
"type": "string"
|
|
504
|
+
}
|
|
505
|
+
},
|
|
506
|
+
"notChecked": {
|
|
507
|
+
"type": "array",
|
|
508
|
+
"items": {
|
|
509
|
+
"type": "string"
|
|
510
|
+
}
|
|
511
|
+
},
|
|
512
|
+
"failed": {
|
|
513
|
+
"type": "array",
|
|
514
|
+
"items": {
|
|
515
|
+
"type": "string"
|
|
516
|
+
}
|
|
517
|
+
},
|
|
518
|
+
"pass": {
|
|
519
|
+
"type": "boolean",
|
|
520
|
+
"description": "True only when every prerequisite emitted a detail and none failed."
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
},
|
|
524
|
+
"buckets": {
|
|
525
|
+
"type": "object",
|
|
526
|
+
"description": "Reader-facing split. A check appears in exactly one bucket: FAIL -> blocking, WARN -> hygiene, NA/ERROR/not-run -> notChecked.",
|
|
527
|
+
"additionalProperties": false,
|
|
528
|
+
"required": [
|
|
529
|
+
"blocking",
|
|
530
|
+
"hygiene",
|
|
531
|
+
"notChecked"
|
|
532
|
+
],
|
|
533
|
+
"properties": {
|
|
534
|
+
"blocking": {
|
|
535
|
+
"type": "array",
|
|
536
|
+
"items": {
|
|
537
|
+
"$ref": "#/$defs/bucketRow"
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
"hygiene": {
|
|
541
|
+
"type": "array",
|
|
542
|
+
"items": {
|
|
543
|
+
"$ref": "#/$defs/bucketRow"
|
|
544
|
+
}
|
|
545
|
+
},
|
|
546
|
+
"notChecked": {
|
|
547
|
+
"type": "array",
|
|
548
|
+
"items": {
|
|
549
|
+
"$ref": "#/$defs/bucketRow"
|
|
550
|
+
}
|
|
551
|
+
},
|
|
552
|
+
"partial": {
|
|
553
|
+
"type": "array",
|
|
554
|
+
"description": "Additive: checks with coverage=partial, even when they also appear in blocking or hygiene.",
|
|
555
|
+
"items": {
|
|
556
|
+
"$ref": "#/$defs/bucketRow"
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
},
|
|
561
|
+
"bucketRow": {
|
|
562
|
+
"type": "object",
|
|
563
|
+
"additionalProperties": false,
|
|
564
|
+
"required": [
|
|
565
|
+
"id",
|
|
566
|
+
"clause",
|
|
567
|
+
"result",
|
|
568
|
+
"coverage",
|
|
569
|
+
"reason"
|
|
570
|
+
],
|
|
571
|
+
"properties": {
|
|
572
|
+
"id": {
|
|
573
|
+
"type": "string",
|
|
574
|
+
"minLength": 1
|
|
575
|
+
},
|
|
576
|
+
"clause": {
|
|
577
|
+
"oneOf": [
|
|
578
|
+
{
|
|
579
|
+
"type": "string",
|
|
580
|
+
"pattern": "^C-[0-9]+(?:\\.[0-9]+)?$"
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
"type": "null"
|
|
584
|
+
}
|
|
585
|
+
]
|
|
586
|
+
},
|
|
587
|
+
"result": {
|
|
588
|
+
"enum": [
|
|
589
|
+
"PASS",
|
|
590
|
+
"WARN",
|
|
591
|
+
"FAIL",
|
|
592
|
+
"NA",
|
|
593
|
+
"ERROR",
|
|
594
|
+
"NOT-RUN"
|
|
595
|
+
]
|
|
596
|
+
},
|
|
597
|
+
"coverage": {
|
|
598
|
+
"$ref": "#/$defs/checkCoverage"
|
|
599
|
+
},
|
|
600
|
+
"reason": {
|
|
601
|
+
"type": "string"
|
|
602
|
+
},
|
|
603
|
+
"declaration": {
|
|
604
|
+
"type": "boolean",
|
|
605
|
+
"description": "Hygiene only: DSC-11/12/13 declaration-class check."
|
|
606
|
+
},
|
|
607
|
+
"advisory": {
|
|
608
|
+
"type": "boolean",
|
|
609
|
+
"description": "Hygiene only: check.advisory is true."
|
|
610
|
+
},
|
|
611
|
+
"howToEnable": {
|
|
612
|
+
"type": "string",
|
|
613
|
+
"description": "Additive: command/flag that would let this row run, for NA/ERROR/partial rows."
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
},
|
|
617
|
+
"metrics": {
|
|
618
|
+
"type": "object",
|
|
619
|
+
"additionalProperties": false,
|
|
620
|
+
"required": [
|
|
621
|
+
"checked",
|
|
622
|
+
"total",
|
|
623
|
+
"declaredFields"
|
|
624
|
+
],
|
|
625
|
+
"properties": {
|
|
626
|
+
"checked": {
|
|
627
|
+
"type": "integer",
|
|
628
|
+
"minimum": 0
|
|
629
|
+
},
|
|
630
|
+
"total": {
|
|
631
|
+
"type": "integer",
|
|
632
|
+
"minimum": 0
|
|
633
|
+
},
|
|
634
|
+
"declaredFields": {
|
|
635
|
+
"type": "integer",
|
|
636
|
+
"minimum": 0,
|
|
637
|
+
"maximum": 5,
|
|
638
|
+
"description": "How many of capabilities/labels/commitments/disclosure/engines.dsh are declared. Context only."
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
},
|
|
642
|
+
"conclusion": {
|
|
643
|
+
"type": "object",
|
|
644
|
+
"additionalProperties": false,
|
|
645
|
+
"required": [
|
|
646
|
+
"headline",
|
|
647
|
+
"level",
|
|
648
|
+
"status",
|
|
649
|
+
"exitCode",
|
|
650
|
+
"profile",
|
|
651
|
+
"scope",
|
|
652
|
+
"subset",
|
|
653
|
+
"staticOnly",
|
|
654
|
+
"entryRuntime",
|
|
655
|
+
"entryClaim",
|
|
656
|
+
"reason"
|
|
657
|
+
],
|
|
658
|
+
"properties": {
|
|
659
|
+
"headline": {
|
|
660
|
+
"type": "string"
|
|
661
|
+
},
|
|
662
|
+
"level": {
|
|
663
|
+
"oneOf": [
|
|
664
|
+
{
|
|
665
|
+
"type": "string",
|
|
666
|
+
"minLength": 1
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
"type": "null"
|
|
670
|
+
}
|
|
671
|
+
],
|
|
672
|
+
"description": "DS-C / DSH-ENTRY display label; null when the scope cannot claim one."
|
|
673
|
+
},
|
|
674
|
+
"status": {
|
|
675
|
+
"enum": [
|
|
676
|
+
"pass",
|
|
677
|
+
"warn",
|
|
678
|
+
"incomplete",
|
|
679
|
+
"fail"
|
|
680
|
+
]
|
|
681
|
+
},
|
|
682
|
+
"exitCode": {
|
|
683
|
+
"enum": [
|
|
684
|
+
0,
|
|
685
|
+
1,
|
|
686
|
+
2
|
|
687
|
+
]
|
|
688
|
+
},
|
|
689
|
+
"profile": {
|
|
690
|
+
"enum": [
|
|
691
|
+
"package",
|
|
692
|
+
"listing",
|
|
693
|
+
"both"
|
|
694
|
+
]
|
|
695
|
+
},
|
|
696
|
+
"scope": {
|
|
697
|
+
"enum": [
|
|
698
|
+
"ds-c",
|
|
699
|
+
"entry",
|
|
700
|
+
"mvp"
|
|
701
|
+
]
|
|
702
|
+
},
|
|
703
|
+
"subset": {
|
|
704
|
+
"oneOf": [
|
|
705
|
+
{
|
|
706
|
+
"const": "MVP-13"
|
|
707
|
+
},
|
|
708
|
+
{
|
|
709
|
+
"type": "null"
|
|
710
|
+
}
|
|
711
|
+
]
|
|
712
|
+
},
|
|
713
|
+
"staticOnly": {
|
|
714
|
+
"type": "boolean"
|
|
715
|
+
},
|
|
716
|
+
"entryRuntime": {
|
|
717
|
+
"oneOf": [
|
|
718
|
+
{
|
|
719
|
+
"enum": [
|
|
720
|
+
"require",
|
|
721
|
+
"server-entry"
|
|
722
|
+
]
|
|
723
|
+
},
|
|
724
|
+
{
|
|
725
|
+
"type": "null"
|
|
726
|
+
}
|
|
727
|
+
]
|
|
728
|
+
},
|
|
729
|
+
"entryClaim": {
|
|
730
|
+
"oneOf": [
|
|
731
|
+
{
|
|
732
|
+
"enum": [
|
|
733
|
+
"runtime",
|
|
734
|
+
"static"
|
|
735
|
+
]
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
"type": "null"
|
|
739
|
+
}
|
|
740
|
+
]
|
|
741
|
+
},
|
|
742
|
+
"reason": {
|
|
743
|
+
"type": "string"
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
},
|
|
747
|
+
"advice": {
|
|
748
|
+
"type": "object",
|
|
749
|
+
"additionalProperties": false,
|
|
750
|
+
"required": [
|
|
751
|
+
"key",
|
|
752
|
+
"gate",
|
|
753
|
+
"severity",
|
|
754
|
+
"title",
|
|
755
|
+
"why",
|
|
756
|
+
"fix",
|
|
757
|
+
"docsUrl",
|
|
758
|
+
"source",
|
|
759
|
+
"version",
|
|
760
|
+
"evidence",
|
|
761
|
+
"reason",
|
|
762
|
+
"occurrences",
|
|
763
|
+
"advisory"
|
|
764
|
+
],
|
|
765
|
+
"properties": {
|
|
766
|
+
"key": {
|
|
767
|
+
"type": "string",
|
|
768
|
+
"minLength": 1
|
|
769
|
+
},
|
|
770
|
+
"gate": {
|
|
771
|
+
"enum": [
|
|
772
|
+
"FAIL",
|
|
773
|
+
"WARN"
|
|
774
|
+
]
|
|
775
|
+
},
|
|
776
|
+
"severity": {
|
|
777
|
+
"enum": [
|
|
778
|
+
"FAIL",
|
|
779
|
+
"WARN"
|
|
780
|
+
]
|
|
781
|
+
},
|
|
782
|
+
"title": {
|
|
783
|
+
"type": "string",
|
|
784
|
+
"minLength": 1
|
|
785
|
+
},
|
|
786
|
+
"why": {
|
|
787
|
+
"oneOf": [
|
|
788
|
+
{
|
|
789
|
+
"type": "string"
|
|
790
|
+
},
|
|
791
|
+
{
|
|
792
|
+
"type": "null"
|
|
793
|
+
}
|
|
794
|
+
]
|
|
795
|
+
},
|
|
796
|
+
"fix": {
|
|
797
|
+
"oneOf": [
|
|
798
|
+
{
|
|
799
|
+
"type": "string"
|
|
800
|
+
},
|
|
801
|
+
{
|
|
802
|
+
"type": "null"
|
|
803
|
+
}
|
|
804
|
+
]
|
|
805
|
+
},
|
|
806
|
+
"docsUrl": {
|
|
807
|
+
"oneOf": [
|
|
808
|
+
{
|
|
809
|
+
"type": "string",
|
|
810
|
+
"format": "uri"
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
"type": "null"
|
|
814
|
+
}
|
|
815
|
+
]
|
|
816
|
+
},
|
|
817
|
+
"source": {
|
|
818
|
+
"type": "string",
|
|
819
|
+
"minLength": 1
|
|
820
|
+
},
|
|
821
|
+
"version": {
|
|
822
|
+
"type": "string",
|
|
823
|
+
"minLength": 1
|
|
824
|
+
},
|
|
825
|
+
"evidence": {
|
|
826
|
+
"type": "array",
|
|
827
|
+
"maxItems": 10,
|
|
828
|
+
"items": {
|
|
829
|
+
"type": "string"
|
|
830
|
+
}
|
|
831
|
+
},
|
|
832
|
+
"reason": {
|
|
833
|
+
"type": "string"
|
|
834
|
+
},
|
|
835
|
+
"occurrences": {
|
|
836
|
+
"type": "integer",
|
|
837
|
+
"minimum": 1
|
|
838
|
+
},
|
|
839
|
+
"advisory": {
|
|
840
|
+
"type": "boolean"
|
|
841
|
+
},
|
|
842
|
+
"ruleMissing": {
|
|
843
|
+
"type": "boolean"
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
}
|