dsh-standards 0.0.3 → 1.0.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/README.md +251 -0
- package/40-checker/bin/dsh-levels.mjs +15 -0
- package/40-checker/bin/dsh-plugin-verify.mjs +8 -0
- package/40-checker/fixtures/bad/index.mjs +12 -0
- package/40-checker/fixtures/bad/package.json +15 -0
- package/40-checker/fixtures/bad-manifest/index.js +1 -0
- package/40-checker/fixtures/bad-manifest/package.json +5 -0
- package/40-checker/fixtures/bundle/cordis.patch.yml +3 -0
- package/40-checker/fixtures/bundle/package.json +15 -0
- package/40-checker/fixtures/bundle/server.mjs +7 -0
- package/40-checker/fixtures/bundle-v0/cordis.patch.yml +3 -0
- package/40-checker/fixtures/bundle-v0/package.json +21 -0
- package/40-checker/fixtures/bundle-v0/server.mjs +7 -0
- package/40-checker/fixtures/client-missing/client.js +1 -0
- package/40-checker/fixtures/client-missing/index.js +1 -0
- package/40-checker/fixtures/client-missing/package.json +6 -0
- package/40-checker/fixtures/flow-config/index.js +9 -0
- package/40-checker/fixtures/flow-config/package.json +10 -0
- package/40-checker/fixtures/fs-write/index.mjs +7 -0
- package/40-checker/fixtures/fs-write/package.json +10 -0
- package/40-checker/fixtures/good/index.mjs +10 -0
- package/40-checker/fixtures/good/package.json +19 -0
- package/40-checker/fixtures/hang/index.mjs +5 -0
- package/40-checker/fixtures/hang/package.json +10 -0
- package/40-checker/fixtures/known-answer/expected.json +18 -0
- package/40-checker/fixtures/market-index-real.json +18 -0
- package/40-checker/fixtures/market-index.json +18 -0
- package/40-checker/fixtures/negative/bad-entry/package.json +1 -0
- package/40-checker/fixtures/negative/no-entry/package.json +1 -0
- package/40-checker/fixtures/negative/no-patch/package.json +1 -0
- package/40-checker/fixtures/negative/root-missing/cordis.patch.yml +2 -0
- package/40-checker/fixtures/negative/root-missing/package.json +1 -0
- package/40-checker/fixtures/negative/workspace/package.json +1 -0
- package/40-checker/package.json +22 -0
- package/40-checker/samples/README.md +8 -0
- package/40-checker/samples/entry18.json +139 -0
- package/40-checker/samples/frame.json +485 -0
- package/40-checker/scripts/apply-overlay.mjs +59 -0
- package/40-checker/scripts/attestation-check.mjs +151 -0
- package/40-checker/scripts/bundle-smoke.mjs +126 -0
- package/40-checker/scripts/claim-check.mjs +145 -0
- package/40-checker/scripts/clause-map.mjs +94 -0
- package/40-checker/scripts/collect-fixtures.mjs +44 -0
- package/40-checker/scripts/dashboard.mjs +85 -0
- package/40-checker/scripts/dco-check.mjs +147 -0
- package/40-checker/scripts/dependabot-check.mjs +40 -0
- package/40-checker/scripts/doc-commands-check.mjs +92 -0
- package/40-checker/scripts/entry-scan.mjs +190 -0
- package/40-checker/scripts/entry-validate.mjs +291 -0
- package/40-checker/scripts/entry18-attribution.mjs +66 -0
- package/40-checker/scripts/entry18-ci.mjs +685 -0
- package/40-checker/scripts/entry18-realweb-summary.mjs +71 -0
- package/40-checker/scripts/entry18-web.mjs +307 -0
- package/40-checker/scripts/evidence-chain.mjs +100 -0
- package/40-checker/scripts/flow-index.mjs +82 -0
- package/40-checker/scripts/flow-sample-ci.mjs +529 -0
- package/40-checker/scripts/governance-check.mjs +210 -0
- package/40-checker/scripts/host-farm.mjs +165 -0
- package/40-checker/scripts/journey-config-observe.mjs +109 -0
- package/40-checker/scripts/journey-disclosure-shape.mjs +83 -0
- package/40-checker/scripts/journey-runtime.mjs +178 -0
- package/40-checker/scripts/journey.mjs +76 -0
- package/40-checker/scripts/label-drift.mjs +74 -0
- package/40-checker/scripts/label-sync.mjs +87 -0
- package/40-checker/scripts/label-verify.mjs +90 -0
- package/40-checker/scripts/landlock-exec.c +101 -0
- package/40-checker/scripts/level-audit.mjs +336 -0
- package/40-checker/scripts/m1-sidecar.mjs +126 -0
- package/40-checker/scripts/m2-runner.mjs +213 -0
- package/40-checker/scripts/round-robin.mjs +88 -0
- package/40-checker/scripts/sample-frame.mjs +72 -0
- package/40-checker/scripts/sample20-ci.mjs +25 -0
- package/40-checker/scripts/sample60-ci.mjs +25 -0
- package/40-checker/scripts/stale-check.mjs +59 -0
- package/40-checker/scripts/surveillance.mjs +88 -0
- package/40-checker/scripts/web-probe.mjs +504 -0
- package/40-checker/src/cli.mjs +300 -0
- package/40-checker/src/client-shape.mjs +37 -0
- package/40-checker/src/declarations.mjs +242 -0
- package/40-checker/src/index.mjs +8 -0
- package/40-checker/src/install-spec.mjs +67 -0
- package/40-checker/src/label.mjs +130 -0
- package/40-checker/src/manifest.mjs +381 -0
- package/40-checker/src/permissions.mjs +60 -0
- package/40-checker/src/report.mjs +204 -0
- package/40-checker/src/result.mjs +60 -0
- package/40-checker/src/runtime.mjs +299 -0
- package/40-checker/src/semver.mjs +194 -0
- package/40-checker/src/util.mjs +148 -0
- package/40-checker/test/attestation.test.mjs +59 -0
- package/40-checker/test/checks.test.mjs +172 -0
- package/40-checker/test/claim.test.mjs +28 -0
- package/40-checker/test/client-shape.test.mjs +35 -0
- package/40-checker/test/dco.test.mjs +51 -0
- package/40-checker/test/entry-validate.test.mjs +172 -0
- package/40-checker/test/governance.test.mjs +76 -0
- package/40-checker/test/label.test.mjs +97 -0
- package/40-checker/test/level-audit.test.mjs +99 -0
- package/40-checker/test/levels.test.mjs +31 -0
- package/40-checker/test/ops.test.mjs +117 -0
- package/40-checker/test/permissions.test.mjs +40 -0
- package/40-checker/test/semver.test.mjs +32 -0
- package/40-checker/test/verify.test.mjs +57 -0
- package/CHANGELOG.md +24 -0
- package/LICENSE +28 -0
- package/LICENSE-APACHE +190 -0
- package/LICENSE-CC-BY +23 -0
- package/NOTICE +14 -0
- package/NOTICE.md +11 -0
- package/README.md +146 -3
- package/bin/dsh-levels.mjs +4 -0
- package/bin/dsh-standards.mjs +19 -0
- package/docs/BOOST-FIXTURES-2026-11-02.md +38 -0
- package/docs/DEVELOPER-JOURNEY.md +40 -0
- package/docs/HOST-J3-BUG-REPORT-DRAFT.md +27 -0
- package/docs/HOST-J3-CONFIG-REPRO-2026-11-02.md +36 -0
- package/docs/NAMING-FALLBACK.md +11 -0
- package/docs/fork-policy.md +12 -0
- package/docs/full-test-plan-2026-11-02.md +207 -0
- package/docs/incident.md +37 -0
- package/docs/onboarding.md +27 -0
- package/docs/privacy.md +12 -0
- package/docs/release.md +16 -0
- package/docs/scope-security.md +62 -0
- package/docs/status-taxonomy.md +54 -0
- package/docs/sunset.md +44 -0
- package/docs/translating.md +12 -0
- package/package.json +58 -12
- package/spec/README.md +27 -0
- package/spec/boost/README.md +8 -0
- package/spec/clauses.json +253 -0
- package/spec/entry/README.md +9 -0
- package/spec/flow/README.md +8 -0
- package/spec/levels.json +371 -0
- package/spec/levels.schema.json +45 -0
- package/spec/reference-suite.json +35 -0
- package/spec/schemas/attestation.schema.json +284 -0
- package/spec/schemas/evidence.schema.json +331 -0
- package/spec/schemas/report.schema.json +64 -0
package/spec/levels.json
ADDED
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "dsh-levels/1",
|
|
3
|
+
"version": "1.0.0-rc.1",
|
|
4
|
+
"status": "draft",
|
|
5
|
+
"updatedAt": "2026-11-01",
|
|
6
|
+
"nonOfficial": true,
|
|
7
|
+
"disclaimer": "Not an official DeepSeek standard, not a certification, not a security audit, and not a legal GB/GB-T/GB-Z instrument. The GB analogy is a communication aid only.",
|
|
8
|
+
"canonical": "https://github.com/PerryLink/dsh-standards",
|
|
9
|
+
"axes": {
|
|
10
|
+
"depth": [
|
|
11
|
+
"entry",
|
|
12
|
+
"flow",
|
|
13
|
+
"boost"
|
|
14
|
+
],
|
|
15
|
+
"evidence": [
|
|
16
|
+
"not-run",
|
|
17
|
+
"recognized",
|
|
18
|
+
"static",
|
|
19
|
+
"runtime",
|
|
20
|
+
"measured",
|
|
21
|
+
"blocked",
|
|
22
|
+
"failed",
|
|
23
|
+
"stale"
|
|
24
|
+
],
|
|
25
|
+
"rules": [
|
|
26
|
+
"Depth and evidence are independent; never collapse them into one score.",
|
|
27
|
+
"A skip is not a pass; not-run is not a pass; static is not runtime.",
|
|
28
|
+
"Certification grades A-D are orthogonal to these levels."
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
"levels": [
|
|
32
|
+
{
|
|
33
|
+
"id": "entry",
|
|
34
|
+
"label": "DSH-ENTRY",
|
|
35
|
+
"analogy": "GB",
|
|
36
|
+
"question": "Can an existing plugin be recognized, installed, and booted without changing its code?",
|
|
37
|
+
"claim": "compatibility baseline",
|
|
38
|
+
"requiredForClaim": "G0-G5 at the recorded dsh/cordis versions; G4 is static, G5 is freshness",
|
|
39
|
+
"gates": [
|
|
40
|
+
{
|
|
41
|
+
"id": "G0",
|
|
42
|
+
"check": "dsh.bundle.patch parses",
|
|
43
|
+
"owner": "plugin"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "G1",
|
|
47
|
+
"check": "base + sample compose; inserted row names resolve",
|
|
48
|
+
"owner": "plugin"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "G2",
|
|
52
|
+
"check": "evaluatePluginCompatibility admits, or an explicit exact-version exemption applies",
|
|
53
|
+
"owner": "host"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "G3",
|
|
57
|
+
"check": "real boot(): every target row is ACTIVE or disabled",
|
|
58
|
+
"owner": "plugin/host/fixture"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": "G4",
|
|
62
|
+
"check": "when dsh.client exists: exports['./client'] and a package-root row",
|
|
63
|
+
"owner": "plugin"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "G5",
|
|
67
|
+
"check": "report carries runtime version/commit/artifact mtime; stale evidence is marked stale",
|
|
68
|
+
"owner": "process"
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"evidenceStates": [
|
|
72
|
+
"recognized",
|
|
73
|
+
"static",
|
|
74
|
+
"runtime",
|
|
75
|
+
"blocked",
|
|
76
|
+
"failed",
|
|
77
|
+
"not-run",
|
|
78
|
+
"stale"
|
|
79
|
+
],
|
|
80
|
+
"notClaimed": [
|
|
81
|
+
"security",
|
|
82
|
+
"UI correctness",
|
|
83
|
+
"production readiness",
|
|
84
|
+
"official endorsement"
|
|
85
|
+
],
|
|
86
|
+
"docs": [
|
|
87
|
+
"31-DSH-ENTRY入门规范.md",
|
|
88
|
+
"90-兼容运行时保证.md",
|
|
89
|
+
"92-兼容运行时实测.md"
|
|
90
|
+
],
|
|
91
|
+
"machine": {
|
|
92
|
+
"checker": "40-checker/bin/dsh-plugin-verify.mjs --scope entry --entry-claim static|runtime",
|
|
93
|
+
"smoke": "40-checker/scripts/bundle-smoke.mjs",
|
|
94
|
+
"audit": "40-checker/scripts/level-audit.mjs",
|
|
95
|
+
"ci": ".github/workflows/entry18-runtime.yml"
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "flow",
|
|
100
|
+
"label": "DSH-FLOW",
|
|
101
|
+
"analogy": "GB/T",
|
|
102
|
+
"question": "Can a user install, configure, use, recover, upgrade, and uninstall the plugin without surprises?",
|
|
103
|
+
"claim": "recommended adoption",
|
|
104
|
+
"requiredForClaim": "J1-J8 with recorded evidence; manual journeys are allowed but must be marked manual",
|
|
105
|
+
"gates": [
|
|
106
|
+
{
|
|
107
|
+
"id": "J1",
|
|
108
|
+
"check": "install and remove: add -> dump-config -> remove; no hand-edited profile"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "J2",
|
|
112
|
+
"check": "enable and disable: default on/off, stable id, dump diff is correct"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"id": "J3",
|
|
116
|
+
"check": "configuration: schema/defaults, invalid value fails loudly with a field path, volatile hot change"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "J4",
|
|
120
|
+
"check": "first success: five-minute quickstart, readable error with three elements"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "J5",
|
|
124
|
+
"check": "permissions and disclosure: capabilities/labels/commitments match README, forbidden words 0"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"id": "J6",
|
|
128
|
+
"check": "upgrade, rollback and uninstall: two versions, data preserved, rollback <=2 commands, no residue"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "J7",
|
|
132
|
+
"check": "observability: start line name@version, diagnosable failure/pending, log path"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"id": "J8",
|
|
136
|
+
"check": "client/server shapes: headless/web/client-off work or are explicitly refused"
|
|
137
|
+
}
|
|
138
|
+
],
|
|
139
|
+
"evidenceStates": [
|
|
140
|
+
"manual",
|
|
141
|
+
"runtime",
|
|
142
|
+
"not-run",
|
|
143
|
+
"failed",
|
|
144
|
+
"stale"
|
|
145
|
+
],
|
|
146
|
+
"notClaimed": [
|
|
147
|
+
"certification",
|
|
148
|
+
"ranking",
|
|
149
|
+
"security review",
|
|
150
|
+
"every UI layout"
|
|
151
|
+
],
|
|
152
|
+
"docs": [
|
|
153
|
+
"32-DSH-FLOW顺畅规范.md",
|
|
154
|
+
"94-开发建议-顺畅.md"
|
|
155
|
+
],
|
|
156
|
+
"machine": {
|
|
157
|
+
"journey": "40-checker/scripts/journey.mjs",
|
|
158
|
+
"journeyRuntime": "40-checker/scripts/journey-runtime.mjs",
|
|
159
|
+
"audit": "40-checker/scripts/level-audit.mjs"
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"id": "boost",
|
|
164
|
+
"label": "DSH-BOOST",
|
|
165
|
+
"analogy": "GB/Z",
|
|
166
|
+
"question": "Does the plugin use Cordis primitives (effect, inject, volatile, events, seams, jobs, bounded parallelism) to make development and use measurably cheaper?",
|
|
167
|
+
"claim": "guiding practice; evidence cards, no badge",
|
|
168
|
+
"requiredForClaim": "LEV-1..LEV-8 evidence cards with environment, input, command, negative control, result, version anchor, limitations",
|
|
169
|
+
"gates": [
|
|
170
|
+
{
|
|
171
|
+
"id": "LEV-1",
|
|
172
|
+
"check": "effects/timers/connections/watchers/subprocesses are registered as effects and return to baseline"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"id": "LEV-2",
|
|
176
|
+
"check": "required services are injected; optional ones use ctx.get; no polling"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"id": "LEV-3",
|
|
180
|
+
"check": "hot config uses volatile()/get(); config change does not remount"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"id": "LEV-4",
|
|
184
|
+
"check": "event modes match; waterfall observers call next(); notification listeners are isolated"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"id": "LEV-5",
|
|
188
|
+
"check": "seam/isolate/group used only when needed; per-agent ctx is honored"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"id": "LEV-6",
|
|
192
|
+
"check": "tool/prompt declarations are byte-stable; volatile data goes through systemPrompt.context"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"id": "LEV-7",
|
|
196
|
+
"check": "independent calls use bounded parallelism; long work uses jobs; cancellation propagates"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"id": "LEV-8",
|
|
200
|
+
"check": "bundle patch/preset expresses differences; every practice has an evidence card"
|
|
201
|
+
}
|
|
202
|
+
],
|
|
203
|
+
"evidenceStates": [
|
|
204
|
+
"measured",
|
|
205
|
+
"not-measured",
|
|
206
|
+
"failed",
|
|
207
|
+
"stale"
|
|
208
|
+
],
|
|
209
|
+
"notClaimed": [
|
|
210
|
+
"production benchmark",
|
|
211
|
+
"billing/cache-hit rate",
|
|
212
|
+
"total score",
|
|
213
|
+
"ranking"
|
|
214
|
+
],
|
|
215
|
+
"docs": [
|
|
216
|
+
"33-DSH-BOOST加速实践.md",
|
|
217
|
+
"95-开发建议-加速.md",
|
|
218
|
+
"examples/boost/LEV-3-6.md"
|
|
219
|
+
],
|
|
220
|
+
"machine": {
|
|
221
|
+
"lev3": "examples/boost/lev3-loader-bench.mjs",
|
|
222
|
+
"lev6": "examples/boost/lev6-capture-server.mjs",
|
|
223
|
+
"lev7": "examples/boost/lev7-bench.mjs",
|
|
224
|
+
"audit": "40-checker/scripts/level-audit.mjs"
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
],
|
|
228
|
+
"crosswalk": {
|
|
229
|
+
"dsh-plugin-doctor": {
|
|
230
|
+
"repo": "https://github.com/PerryLink/dsh-plugin-doctor",
|
|
231
|
+
"entry": [
|
|
232
|
+
"R",
|
|
233
|
+
"K",
|
|
234
|
+
"D",
|
|
235
|
+
"X"
|
|
236
|
+
],
|
|
237
|
+
"flow": "not-covered",
|
|
238
|
+
"boost": "not-covered",
|
|
239
|
+
"note": "Doctor maps its R/K/D/X results to an ENTRY status; it does not run J1-J8 or LEV benchmarks."
|
|
240
|
+
},
|
|
241
|
+
"dsh-plugin-certification": {
|
|
242
|
+
"repo": "https://github.com/PerryLink/dsh-plugin-certification",
|
|
243
|
+
"entry": [
|
|
244
|
+
"manifest",
|
|
245
|
+
"installSmoke",
|
|
246
|
+
"securityVeto"
|
|
247
|
+
],
|
|
248
|
+
"flow": "not-covered",
|
|
249
|
+
"boost": "not-covered",
|
|
250
|
+
"note": "Grade A-D is orthogonal; certification evidence is necessary but not sufficient for ENTRY runtime."
|
|
251
|
+
},
|
|
252
|
+
"dsh-plugin-guide": {
|
|
253
|
+
"repo": "https://github.com/PerryLink/dsh-plugin-guide",
|
|
254
|
+
"entry": [
|
|
255
|
+
"guide/standards.md",
|
|
256
|
+
"SKILL.md"
|
|
257
|
+
],
|
|
258
|
+
"flow": [
|
|
259
|
+
"guide/standards.md",
|
|
260
|
+
"plugin-dev-guide.md"
|
|
261
|
+
],
|
|
262
|
+
"boost": [
|
|
263
|
+
"guide/standards.md",
|
|
264
|
+
"plugin-dev-guide.md"
|
|
265
|
+
],
|
|
266
|
+
"note": "The guide teaches the levels and routes authors to the checker/audit; it does not certify."
|
|
267
|
+
},
|
|
268
|
+
"dsh-plugin-kit": {
|
|
269
|
+
"repo": "https://github.com/PerryLink/dsh-plugin-kit",
|
|
270
|
+
"entry": [
|
|
271
|
+
"data/peer-range.json",
|
|
272
|
+
"skeleton"
|
|
273
|
+
],
|
|
274
|
+
"flow": "not-covered",
|
|
275
|
+
"boost": "not-covered",
|
|
276
|
+
"note": "Kit supplies the shared peer range and skeleton; it can carry level metadata in a future release."
|
|
277
|
+
},
|
|
278
|
+
"dsh-test-drive": {
|
|
279
|
+
"repo": "https://github.com/PerryLink/dsh-test-drive",
|
|
280
|
+
"entry": [
|
|
281
|
+
"install smoke"
|
|
282
|
+
],
|
|
283
|
+
"flow": "not-covered",
|
|
284
|
+
"boost": "not-covered",
|
|
285
|
+
"note": "Test-drive is the install/load evidence source for ENTRY and certification dimension E."
|
|
286
|
+
},
|
|
287
|
+
"dsh-score": {
|
|
288
|
+
"repo": "https://github.com/PerryLink/dsh-score",
|
|
289
|
+
"entry": [
|
|
290
|
+
"consumes test-drive"
|
|
291
|
+
],
|
|
292
|
+
"flow": "not-covered",
|
|
293
|
+
"boost": "not-covered",
|
|
294
|
+
"note": "Score is a quality summary; it must not label a plugin with a DSH level."
|
|
295
|
+
},
|
|
296
|
+
"dsh-plugin-portal": {
|
|
297
|
+
"repo": "https://github.com/PerryLink/dsh-plugin-portal",
|
|
298
|
+
"entry": "display-only",
|
|
299
|
+
"flow": "display-only",
|
|
300
|
+
"boost": "display-only",
|
|
301
|
+
"note": "A portal displays labels; it must not derive a level from stars or ratings."
|
|
302
|
+
},
|
|
303
|
+
"dsh-catalog": {
|
|
304
|
+
"repo": "https://github.com/PerryLink/dsh-catalog",
|
|
305
|
+
"entry": "display-only",
|
|
306
|
+
"flow": "display-only",
|
|
307
|
+
"boost": "display-only",
|
|
308
|
+
"note": "A market catalog may display evidence-backed labels; no label without a link."
|
|
309
|
+
},
|
|
310
|
+
"dsh-checkers": {
|
|
311
|
+
"repo": "https://github.com/PerryLink/dsh-checkers",
|
|
312
|
+
"entry": [
|
|
313
|
+
"static checks"
|
|
314
|
+
],
|
|
315
|
+
"flow": "not-covered",
|
|
316
|
+
"boost": "not-covered",
|
|
317
|
+
"note": "A 53-checker bundle; it feeds ENTRY static, not runtime G0-G3."
|
|
318
|
+
},
|
|
319
|
+
"dsh-policy-ledger": {
|
|
320
|
+
"repo": "https://github.com/PerryLink/dsh-policy-ledger",
|
|
321
|
+
"entry": [
|
|
322
|
+
"install diagnosis"
|
|
323
|
+
],
|
|
324
|
+
"flow": "not-covered",
|
|
325
|
+
"boost": "not-covered",
|
|
326
|
+
"note": "Install-only diagnosis; maps failures to G0/G2/G3 attribution."
|
|
327
|
+
},
|
|
328
|
+
"dsh-cert-mcp": {
|
|
329
|
+
"repo": "https://github.com/PerryLink/dsh-cert-mcp",
|
|
330
|
+
"entry": "not-applicable",
|
|
331
|
+
"flow": "not-applicable",
|
|
332
|
+
"boost": "not-applicable",
|
|
333
|
+
"note": "Read-only MCP over the certification registry; it does not assign levels."
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
"labels": {
|
|
337
|
+
"entry": {
|
|
338
|
+
"recognized": "dsh-entry:recognized",
|
|
339
|
+
"runtime": "dsh-entry:runtime",
|
|
340
|
+
"blocked": "dsh-entry:blocked",
|
|
341
|
+
"failed": "dsh-entry:failed"
|
|
342
|
+
},
|
|
343
|
+
"flow": {
|
|
344
|
+
"manual": "dsh-flow:manual",
|
|
345
|
+
"runtime": "dsh-flow:runtime",
|
|
346
|
+
"not-run": "dsh-flow:not-run"
|
|
347
|
+
},
|
|
348
|
+
"boost": {
|
|
349
|
+
"measured": "dsh-boost:measured",
|
|
350
|
+
"not-measured": "dsh-boost:not-measured"
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
"review": {
|
|
354
|
+
"provisionalWhileSolo": true,
|
|
355
|
+
"expiryDays": {
|
|
356
|
+
"entry": 90,
|
|
357
|
+
"flow": 180,
|
|
358
|
+
"boost": 365
|
|
359
|
+
},
|
|
360
|
+
"evidenceMustCarry": [
|
|
361
|
+
"level",
|
|
362
|
+
"levelVersion",
|
|
363
|
+
"dshVersion",
|
|
364
|
+
"cordisVersion",
|
|
365
|
+
"commit",
|
|
366
|
+
"generatedAt",
|
|
367
|
+
"scope",
|
|
368
|
+
"notClaimed"
|
|
369
|
+
]
|
|
370
|
+
}
|
|
371
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/PerryLink/dsh-standards/spec/levels.schema.json",
|
|
4
|
+
"title": "DSH levels (non-official)",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["schema", "version", "nonOfficial", "levels"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schema": { "const": "dsh-levels/1" },
|
|
9
|
+
"version": { "type": "string" },
|
|
10
|
+
"status": { "enum": ["draft", "provisional", "stable", "stale"] },
|
|
11
|
+
"nonOfficial": { "const": true },
|
|
12
|
+
"disclaimer": { "type": "string" },
|
|
13
|
+
"axes": { "type": "object" },
|
|
14
|
+
"levels": {
|
|
15
|
+
"type": "array",
|
|
16
|
+
"minItems": 3,
|
|
17
|
+
"items": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"required": ["id", "label", "analogy", "question", "claim", "gates", "evidenceStates"],
|
|
20
|
+
"properties": {
|
|
21
|
+
"id": { "enum": ["entry", "flow", "boost"] },
|
|
22
|
+
"label": { "enum": ["DSH-ENTRY", "DSH-FLOW", "DSH-BOOST"] },
|
|
23
|
+
"analogy": { "enum": ["GB", "GB/T", "GB/Z"] },
|
|
24
|
+
"question": { "type": "string" },
|
|
25
|
+
"claim": { "type": "string" },
|
|
26
|
+
"gates": {
|
|
27
|
+
"type": "array",
|
|
28
|
+
"items": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"required": ["id", "check"],
|
|
31
|
+
"properties": { "id": { "type": "string" }, "check": { "type": "string" }, "owner": { "type": "string" } }
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"evidenceStates": { "type": "array", "items": { "type": "string" } },
|
|
35
|
+
"notClaimed": { "type": "array", "items": { "type": "string" } }
|
|
36
|
+
},
|
|
37
|
+
"additionalProperties": true
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"crosswalk": { "type": "object" },
|
|
41
|
+
"labels": { "type": "object" },
|
|
42
|
+
"review": { "type": "object" }
|
|
43
|
+
},
|
|
44
|
+
"additionalProperties": true
|
|
45
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "dsh-reference-suite/1",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"updatedAt": "2026-11-02",
|
|
5
|
+
"anchors": {
|
|
6
|
+
"dsh": "0.2.2-alpha.2",
|
|
7
|
+
"cordis": "4.0.6-alpha.1",
|
|
8
|
+
"node": ">=20",
|
|
9
|
+
"platform": "linux-x64 (primary), win32-x64 (secondary)"
|
|
10
|
+
},
|
|
11
|
+
"changeRules": [
|
|
12
|
+
"Adding a sample is a minor version bump; removing or changing an expected result is a major bump.",
|
|
13
|
+
"An expected result must be frozen in a commit before the run; the run commit must not contain answer edits.",
|
|
14
|
+
"A sample without a license/provenance is not added.",
|
|
15
|
+
"A sample that only proves 'not-run' is not a positive or negative control."
|
|
16
|
+
],
|
|
17
|
+
"samples": [
|
|
18
|
+
{ "id": "fixture-good", "kind": "plugin", "path": "40-checker/fixtures/good", "expected": "recognized", "control": "positive", "provenance": "synthetic" },
|
|
19
|
+
{ "id": "fixture-bad", "kind": "plugin", "path": "40-checker/fixtures/bad", "expected": "failed", "control": "negative", "provenance": "synthetic" },
|
|
20
|
+
{ "id": "fixture-bundle", "kind": "bundle", "path": "40-checker/fixtures/bundle", "expected": "runtime-or-blocked", "control": "positive", "provenance": "synthetic" },
|
|
21
|
+
{ "id": "fixture-client-missing", "kind": "client", "path": "40-checker/fixtures/client-missing", "expected": "G4-failed", "control": "negative", "provenance": "synthetic" },
|
|
22
|
+
{ "id": "flow-ci-diet", "kind": "flow-sample", "path": "40-checker/results/flow/real/ci-diet.json", "expected": "partial", "control": "positive", "provenance": "public-npm" },
|
|
23
|
+
{ "id": "flow-free-search", "kind": "flow-sample", "path": "40-checker/results/flow/real/DDDMUC__dsh-free-search.json", "expected": "partial", "control": "positive", "provenance": "public-npm" },
|
|
24
|
+
{ "id": "flow-ui-auth", "kind": "flow-sample", "path": "40-checker/results/flow/real/ui-auth.json", "expected": "partial", "control": "positive", "provenance": "public-npm" },
|
|
25
|
+
{ "id": "flow-telemetry", "kind": "flow-sample", "path": "40-checker/results/flow/real/telemetry.json", "expected": "blocked", "control": "negative", "provenance": "public-npm" },
|
|
26
|
+
{ "id": "flow-purge", "kind": "flow-sample", "path": "40-checker/results/flow/real/YuJunZhiXue__dsh-purge.json", "expected": "partial", "control": "positive", "provenance": "public-npm" },
|
|
27
|
+
{ "id": "entry-18-index", "kind": "entry-batch", "path": "40-checker/results/entry/18/README.md", "expected": "10-verified-8-partial", "control": "batch", "provenance": "public-npm" },
|
|
28
|
+
{ "id": "boost-lev12458", "kind": "boost-batch", "path": "40-checker/results/boost/lev12458.json", "expected": "measured", "control": "positive", "provenance": "synthetic" }
|
|
29
|
+
],
|
|
30
|
+
"limits": [
|
|
31
|
+
"This is a reference suite, not a certified reference material.",
|
|
32
|
+
"Synthetic fixtures prove a parser/checker path, not ecosystem behavior.",
|
|
33
|
+
"The 18-package batch is static recognition plus base-only runtime; it is not 18/18 production."
|
|
34
|
+
]
|
|
35
|
+
}
|