dsh-standards 1.0.3 → 1.2.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/README.md +15 -0
- package/40-checker/bin/dsh-flow-collect.mjs +3 -0
- package/40-checker/bin/dsh-levels.mjs +13 -2
- package/40-checker/fixtures/bundle-patch-only/cordis.patch.yml +3 -0
- package/40-checker/fixtures/bundle-patch-only/package.json +12 -0
- package/40-checker/fixtures/c12-command-arg/index.mjs +7 -0
- package/40-checker/fixtures/c12-command-arg/package.json +10 -0
- package/40-checker/fixtures/c12-comment/index.mjs +3 -0
- package/40-checker/fixtures/c12-comment/package.json +10 -0
- package/40-checker/fixtures/c12-compare/index.mjs +3 -0
- package/40-checker/fixtures/c12-compare/package.json +10 -0
- package/40-checker/fixtures/c12-doc-string/index.mjs +13 -0
- package/40-checker/fixtures/c12-doc-string/package.json +10 -0
- package/40-checker/fixtures/c12-grant/index.mjs +3 -0
- package/40-checker/fixtures/c12-grant/package.json +10 -0
- package/40-checker/fixtures/c12-string/index.mjs +3 -0
- package/40-checker/fixtures/c12-string/package.json +10 -0
- package/40-checker/fixtures/declaration-file/index.d.ts +1 -0
- package/40-checker/fixtures/declaration-file/index.mjs +9 -0
- package/40-checker/fixtures/declaration-file/package.json +10 -0
- package/40-checker/fixtures/import-local-side-effect/index.mjs +11 -0
- package/40-checker/fixtures/import-local-side-effect/package.json +21 -0
- package/40-checker/fixtures/import-local-side-effect/side-effectful.mjs +5 -0
- package/40-checker/fixtures/import-open-readonly/index.mjs +14 -0
- package/40-checker/fixtures/import-open-readonly/package.json +19 -0
- package/40-checker/fixtures/import-package-only/index.mjs +11 -0
- package/40-checker/fixtures/import-package-only/package.json +21 -0
- package/40-checker/fixtures/import-parse-error/index.mjs +5 -0
- package/40-checker/fixtures/import-parse-error/package.json +10 -0
- package/40-checker/fixtures/import-side-effect/index.mjs +14 -0
- package/40-checker/fixtures/import-side-effect/package.json +19 -0
- package/40-checker/fixtures/import-side-effect-nonentry/index.mjs +9 -0
- package/40-checker/fixtures/import-side-effect-nonentry/package.json +19 -0
- package/40-checker/fixtures/import-side-effect-nonentry/selfcheck.mjs +8 -0
- package/40-checker/fixtures/import-void-main/index.mjs +16 -0
- package/40-checker/fixtures/import-void-main/package.json +19 -0
- package/40-checker/fixtures/no-source/package.json +19 -0
- package/40-checker/fixtures/parse-error-nonentry/index.mjs +2 -0
- package/40-checker/fixtures/parse-error-nonentry/package.json +10 -0
- package/40-checker/fixtures/parse-error-nonentry/references/broken.js +1 -0
- package/40-checker/scripts/bundle-smoke.mjs +3 -0
- package/40-checker/scripts/entry18-ci.mjs +4 -3
- package/40-checker/scripts/entry18-web.mjs +4 -1
- package/40-checker/scripts/flow-collect.mjs +494 -0
- package/40-checker/scripts/flow-sample-ci.mjs +4 -4
- package/40-checker/scripts/host-farm.mjs +2 -1
- package/40-checker/scripts/journey-config-observe.mjs +5 -3
- package/40-checker/scripts/journey-runtime.mjs +208 -83
- package/40-checker/scripts/level-audit.mjs +91 -19
- package/40-checker/scripts/m2-runner.mjs +4 -3
- package/40-checker/scripts/runtime-child.mjs +4 -0
- package/40-checker/src/cli.mjs +11 -3
- package/40-checker/src/declarations.mjs +514 -19
- package/40-checker/src/flow-evidence.mjs +431 -0
- package/40-checker/src/index.mjs +3 -0
- package/40-checker/src/manifest.mjs +5 -0
- package/40-checker/src/remediation.mjs +132 -0
- package/40-checker/src/report.mjs +19 -2
- package/40-checker/src/sandbox-env.mjs +78 -0
- package/40-checker/test/checks.test.mjs +243 -1
- package/40-checker/test/flow-evidence.test.mjs +295 -0
- package/40-checker/test/remediation.test.mjs +300 -0
- package/40-checker/vendor/babel/README.md +10 -0
- package/40-checker/vendor/babel/index.cjs +3 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-string-parser/LICENSE +22 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-string-parser/README.md +19 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-string-parser/lib/index.d.ts +41 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-string-parser/lib/index.js +286 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-string-parser/package.json +31 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-validator-identifier/LICENSE +22 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-validator-identifier/README.md +19 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-validator-identifier/lib/identifier-browser.js +62 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-validator-identifier/lib/identifier.js +60 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-validator-identifier/lib/index.d.ts +28 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-validator-identifier/lib/index.js +27 -0
- package/40-checker/vendor/babel/node_modules/@babel/helper-validator-identifier/package.json +45 -0
- package/40-checker/vendor/babel/node_modules/@babel/parser/CHANGELOG.md +1073 -0
- package/40-checker/vendor/babel/node_modules/@babel/parser/LICENSE +19 -0
- package/40-checker/vendor/babel/node_modules/@babel/parser/README.md +19 -0
- package/40-checker/vendor/babel/node_modules/@babel/parser/bin/babel-parser.js +14 -0
- package/40-checker/vendor/babel/node_modules/@babel/parser/lib/index.d.ts +1047 -0
- package/40-checker/vendor/babel/node_modules/@babel/parser/lib/index.js +14612 -0
- package/40-checker/vendor/babel/node_modules/@babel/parser/package.json +57 -0
- package/40-checker/vendor/babel/node_modules/@babel/parser/typings/babel-parser.d.ts +636 -0
- package/40-checker/vendor/babel/node_modules/@babel/types/LICENSE +22 -0
- package/40-checker/vendor/babel/node_modules/@babel/types/README.md +19 -0
- package/40-checker/vendor/babel/node_modules/@babel/types/lib/index-legacy.d.ts +2765 -0
- package/40-checker/vendor/babel/node_modules/@babel/types/lib/index.d.ts +3668 -0
- package/40-checker/vendor/babel/node_modules/@babel/types/lib/index.js +10758 -0
- package/40-checker/vendor/babel/node_modules/@babel/types/lib/index.js.flow +2618 -0
- package/40-checker/vendor/babel/node_modules/@babel/types/package.json +38 -0
- package/CHANGELOG.md +66 -0
- package/bin/dsh-flow-collect.mjs +4 -0
- package/package.json +2 -1
- package/spec/README.md +2 -0
- package/spec/flow/README.md +23 -2
- package/spec/flow-evidence.schema.json +217 -0
- package/spec/levels.json +2 -0
- package/spec/remediation.json +478 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@babel/types",
|
|
3
|
+
"version": "8.1.0",
|
|
4
|
+
"description": "Babel Types is a Lodash-esque utility library for AST nodes",
|
|
5
|
+
"author": "The Babel Team (https://babel.dev/team)",
|
|
6
|
+
"homepage": "https://babel.dev/docs/en/next/babel-types",
|
|
7
|
+
"bugs": "https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A%20types%22+is%3Aopen",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"access": "public"
|
|
11
|
+
},
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/babel/babel.git",
|
|
15
|
+
"directory": "packages/babel-types"
|
|
16
|
+
},
|
|
17
|
+
"main": "./lib/index.js",
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@babel/helper-string-parser": "^8.0.8",
|
|
20
|
+
"@babel/helper-validator-identifier": "^8.0.6"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@babel/generator": "^8.1.0",
|
|
24
|
+
"@babel/helper-fixtures": "^8.0.7",
|
|
25
|
+
"@babel/parser": "^8.1.0"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": "^22.18.0 || >=24.11.0"
|
|
29
|
+
},
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./lib/index.d.ts",
|
|
33
|
+
"default": "./lib/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./package.json": "./package.json"
|
|
36
|
+
},
|
|
37
|
+
"type": "module"
|
|
38
|
+
}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,57 @@
|
|
|
1
|
+
## 未发布
|
|
2
|
+
|
|
3
|
+
- **FLOW 证据链**:新增 `spec/flow-evidence.schema.json`(`dsh-flow-evidence/2`)与 `40-checker/src/flow-evidence.mjs`。`level-audit --flow-evidence` 只接受 v2;v1(`dsh-flow-journey/1`、`dsh-flow-runtime/1`)与裸 `{Jx:{status}}` 标 `deprecated`,不计 pass。每个 J 须有 `checks[]` 且全部 `exitCode === 0`、断言成立、至少一条非 `static` 观测检查才计 pass(`warn`/`blocked`/`na`/`static` 不计 8/8)。v2 的 `chain.evidenceHash` 由 audit 重算,改动一个字节即 `invalid`。
|
|
4
|
+
- **collector**:新增 `40-checker/bin/dsh-flow-collect.mjs`(根入口 `bin/dsh-flow-collect.mjs`,并支持 `dsh-levels flow collect`)。只读副本 + 前后 `treeSha256` 一致、`npm pack --ignore-scripts` 的 integrity/tarballSha256、`git rev-parse` commit、临时 HOME/DSH_HOME、失败五要素提示(子检查/命令/exitCode/stderr 末 20 行/日志绝对路径 + 条款锚);前置缺失记 `blocked` 且 exit 0,真失败 exit 1。
|
|
5
|
+
- **安全**:新增 `40-checker/src/sandbox-env.mjs` 白名单 env。`src/cli.mjs` 的 runtime-child/bundle-smoke 子进程、`bundle-smoke.mjs`/`runtime-child.mjs` 进程内 boot、`m2-runner.mjs`、`journey-runtime.mjs`、`journey-config-observe.mjs`、`flow-sample-ci.mjs`、`host-farm.mjs`、`entry18-web.mjs` 不再把 `process.env` 透传给被检插件/宿主 boot。
|
|
6
|
+
- 测试 137 → 149(新增 `40-checker/test/flow-evidence.test.mjs`:v1 不再 pass、v2 伪造 checks/exitCode 不 pass、篡改链路 invalid、blocked 不判 fail、collector 产物可被 audit 读取、失败五要素提示、env 白名单)。
|
|
7
|
+
|
|
8
|
+
## 1.2.0 — 2026-11-06
|
|
9
|
+
|
|
10
|
+
- 新增**建议管道**:`spec/remediation.json` 提供 68 条规则(`details[].item` ∪ `checks[].clause` ∪ G0–G4),`40-checker/src/remediation.mjs` 的纯函数 `joinAdvice(report, rules, docsBase)` 把 FAIL/WARN detail 连接成 `advice[]`;无 detail 的运行时 FAIL 用 `check.clause` 兜底(C-4/C-14)。
|
|
11
|
+
- `buildReport()` 输出新增**加性** `advice[]`(key/severity/title/why/fix/docsUrl/source/version/evidence),不改任何 check 构造、不改判定与 exit code;CLI 新增 `--advice`(默认开)与 `--no-advice`。
|
|
12
|
+
- 建议文档统一指向 `dsh-plugin-guide` 的 v0.4.3:`docsUrl = https://github.com/PerryLink/dsh-plugin-guide/blob/v0.4.3/ + docs`;规则表 `docs` 只存 `文件#锚点`。
|
|
13
|
+
- 新增 `40-checker/test/remediation.test.mjs`:规则表覆盖全集、fixture 无 `ruleMissing`、本地 guide 锚点存在、severity/merge/兜底/纯函数回归。测试 128 → 137。
|
|
14
|
+
|
|
15
|
+
## 1.1.2 — 2026-11-04
|
|
16
|
+
|
|
17
|
+
- 修复 1.1.1 的发布失败:vendored `@babel/parser` 的 `node_modules/` 被根 `.gitignore` 忽略,CI checkout 缺依赖导致 `npm test` 失败。现在 force-add 四个 vendored 包(约 2 MB),并加 1.1.2 的回归说明。
|
|
18
|
+
- 无行为变化;128 tests 仍全绿。
|
|
19
|
+
|
|
20
|
+
## 1.1.1 — 2026-11-04
|
|
21
|
+
|
|
22
|
+
- AST 解析失败的语义修正:一个**非入口**文件解析失败时,C-11.4/C-12.4 记 `NA/not-run`、coverage `partial`,不再把整条强制检查打成 ERROR/incomplete;只有所有可分析文件都失败时才保持 ERROR/not-run。第三套 holdout 的 `dsh-expert-team` 暴露了这个 bug。
|
|
23
|
+
- 新增 fixture `parse-error-nonentry` 与 1 条测试;127 → 128。
|
|
24
|
+
|
|
25
|
+
## 1.1.0 — 2026-11-04
|
|
26
|
+
|
|
27
|
+
- DSC-10 改为**真 AST**(vendored `@babel/parser`,支持 JS/TS/JSX;无运行时 npm 依赖)。只分析入口模块 + 本地相对 import 闭包;包导入/解析不到/`.d.ts` 记 C-10.3 coverage note(not-run),不再用行首正则。
|
|
28
|
+
- C-11.4 / C-12.4 改为 AST 字符串上下文:注释、等值比较、`console.*` 与 `desc`/`message`/`help` 等文档字符串不 WARN;`.set()`/`.resolve()`、`mode`/`sandboxPolicy`/`sandbox_permissions`、spawn/exec 的 `--add-dir` args 仍 WARN;未知上下文保守 WARN。
|
|
29
|
+
- 声明文件 `.d.ts` 没有运行期行为,跳过 AST 扫描,避免一条坏声明把整条检查打成 ERROR。
|
|
30
|
+
- 测试 110 → 127;新增 fixture `import-local-side-effect`、`import-package-only`、`import-parse-error`、`c12-doc-string`、`c12-command-arg`、`declaration-file`。
|
|
31
|
+
|
|
32
|
+
## 1.0.7 — 2026-11-04
|
|
33
|
+
|
|
34
|
+
- DSC-10 C-10.2 补齐“立即 `void main()`”:入口顶层 `void name()` 现在记 advisory WARN(此前只查 await/timer/process.on/env/globalThis)。
|
|
35
|
+
- DSC-11 C-11.4 / DSC-12 C-12.4:注释与等值比较(`===`/`!==`/`==`/`!=`)中的 `danger-full-access`/`--add-dir` 字面量不再 WARN;可执行上下文与普通字符串仍 WARN。5 个上下文盲案例驱动(dev 的 router/skill-mcp、holdout 的 skill-mcp、自家的 github-bot、89 条的 github-bot)。
|
|
36
|
+
- 新增 fixture `import-void-main`、`c12-comment`、`c12-compare`、`c12-grant`、`c12-string`;测试 105 → 110。
|
|
37
|
+
|
|
38
|
+
## 1.0.6 — 2026-11-04
|
|
39
|
+
|
|
40
|
+
- DSC-10:没有任何源文件可扫时记 **NA / not-run**,不再记 WARN(条款三值表本来就写“入口不可读 → NA”)。去掉 dev 上最后 3 条“no source scanned”噪声。
|
|
41
|
+
- 新增 fixture `no-source`;测试 104 → 105。
|
|
42
|
+
|
|
43
|
+
## 1.0.5 — 2026-11-04
|
|
44
|
+
|
|
45
|
+
- C-10.1/C-10.2 也改为只扫**入口模块**,与 C-10.4 一致;随包的 samples/probes/selfcheck 不再命中(89 条里 8/9、dev 里多条属于这一类)。
|
|
46
|
+
- C-10.4 不再把只读 `openSync` 当写操作(它没有写标志)。
|
|
47
|
+
- 新增 fixture `import-open-readonly`,扩展 `import-side-effect-nonentry`(根目录 selfcheck,含 globalThis);测试 102 → 104。
|
|
48
|
+
|
|
49
|
+
## 1.0.4 — 2026-11-04
|
|
50
|
+
|
|
51
|
+
- DSC-10 新增 C-10.4:入口模块顶层 fs 写操作(`writeFileSync`/`appendFileSync`/`mkdirSync`/`rmSync`/`unlinkSync` 等)与子进程调用(`execSync`/`execFileSync`/`spawnSync` 等)记为 advisory WARN,仍然永不 FAIL。
|
|
52
|
+
- C-10.4 按条款只扫**入口模块**;同一行出现在随包发布的自检脚本里属于 C-10.3(not-run),不命中。
|
|
53
|
+
- 新增 fixture `import-side-effect`、`import-side-effect-nonentry` 与 3 条回归测试;测试 99 → 102。
|
|
54
|
+
|
|
1
55
|
## 1.0.3 — 2026-11-03
|
|
2
56
|
|
|
3
57
|
- Published from GitHub Actions with npm provenance (OIDC); local token publishes are retired.
|
|
@@ -10,6 +64,12 @@
|
|
|
10
64
|
- `private: true` and workspace roots report NA instead of WARN/FAIL.
|
|
11
65
|
- A directory without `package.json` returns exit 3 (usage), matching `dsh-levels`.
|
|
12
66
|
|
|
67
|
+
## 1.0.0 — 2026-11-03
|
|
68
|
+
|
|
69
|
+
- First 1.x release: `dsh-standards` becomes the public execution umbrella — it ships the conformance checker, the level audit and the canonical specification files.
|
|
70
|
+
- Public commands: `dsh-standards` (checker) and `dsh-levels` (three-layer audit).
|
|
71
|
+
- The prose guide lives in `dsh-plugin-guide`; the low-level rule text stays in `dsh-plugin-spec`.
|
|
72
|
+
|
|
13
73
|
## 1.0.1 — 2026-11-03
|
|
14
74
|
|
|
15
75
|
- 打包:`files` 收窄,不再把 `40-checker/results/` 打进 npm 包(此前包含第三方插件结果、截图与本机路径)。
|
|
@@ -19,6 +79,12 @@
|
|
|
19
79
|
|
|
20
80
|
# Changelog
|
|
21
81
|
|
|
82
|
+
## 2026-11-04 — 0.2.2-alpha.3 baseline in the three-level docs
|
|
83
|
+
|
|
84
|
+
- Add the 0.2.2-alpha.3 baseline table and six PR-review evidence gates to `35`.
|
|
85
|
+
- Carry the baseline into `31` (ENTRY), `32` (FLOW R6) and the `33` BOOST card.
|
|
86
|
+
- Fix the ENTRY checklist: Node `>=24.9.0`, `engines.dsh` precedence from 0.2.1-alpha.4, frozen lockfile / release-age evidence.
|
|
87
|
+
|
|
22
88
|
## 2026-11-03 — Node 24.9 baseline
|
|
23
89
|
- Require Node >=24.9.0 to match DeepSeek Harness 0.2.2-alpha.3.
|
|
24
90
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-standards",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "DSH plugin standards and conformance checks: ENTRY/FLOW checks plus BOOST guidance. Non-official; no certification or ranking.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "40-checker/src/index.mjs",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"bin",
|
|
17
17
|
"40-checker/bin",
|
|
18
18
|
"40-checker/src",
|
|
19
|
+
"40-checker/vendor",
|
|
19
20
|
"40-checker/scripts",
|
|
20
21
|
"40-checker/samples",
|
|
21
22
|
"40-checker/fixtures",
|
package/spec/README.md
CHANGED
|
@@ -14,7 +14,9 @@ Machine-readable:
|
|
|
14
14
|
- [levels.json](levels.json) — levels, gates, evidence states, crosswalk.
|
|
15
15
|
- [clauses.json](clauses.json) — stable clause IDs mapped to gates (`clause-map.mjs`).
|
|
16
16
|
- [reference-suite.json](reference-suite.json) — versioned samples, anchors, change rules.
|
|
17
|
+
- [remediation.json](remediation.json) — 68-key advice table for the additive `advice[]` report field (docs anchors + severity hints).
|
|
17
18
|
- [schemas/evidence.schema.json](schemas/evidence.schema.json) — `dsh-levels/1` record.
|
|
19
|
+
- [flow-evidence.schema.json](flow-evidence.schema.json) — `dsh-flow-evidence/2` FLOW chain (J1–J8 checks, subject/host binding, `evidenceHash`). v1 and bare `{Jx:{status}}` rows are deprecated and never count as a pass.
|
|
18
20
|
- [schemas/attestation.schema.json](schemas/attestation.schema.json) — `dsh-attestation/1` quality record.
|
|
19
21
|
- [schemas/report.schema.json](schemas/report.schema.json) — `dsh-report/1` inspection report (no grade).
|
|
20
22
|
- [../40-checker/scripts/level-audit.mjs](../40-checker/scripts/level-audit.mjs) — one-command audit.
|
package/spec/flow/README.md
CHANGED
|
@@ -4,5 +4,26 @@ Usability surface: install, configure, first success, permissions, upgrade,
|
|
|
4
4
|
uninstall, diagnostics, client/server states.
|
|
5
5
|
|
|
6
6
|
- Normative text: [../../32-DSH-FLOW顺畅规范.md](../../32-DSH-FLOW顺畅规范.md)
|
|
7
|
-
- Journeys: J1–J8
|
|
8
|
-
-
|
|
7
|
+
- Journeys: J1–J8 (R1–R8 in the normative text).
|
|
8
|
+
- Runtime probe: `40-checker/scripts/journey-runtime.mjs` (J1/J2/J4/J6); J3/J5/J7/J8
|
|
9
|
+
are static preflight or manual and never count as a runtime pass.
|
|
10
|
+
- Evidence: `dsh-flow-evidence/2` ([../flow-evidence.schema.json](../flow-evidence.schema.json)).
|
|
11
|
+
Collect it with `node 40-checker/bin/dsh-flow-collect.mjs --package <dir> --out flow-evidence.json`.
|
|
12
|
+
|
|
13
|
+
## Evidence chain rules
|
|
14
|
+
|
|
15
|
+
- `level-audit.mjs --flow-evidence` accepts only `dsh-flow-evidence/2`. v1
|
|
16
|
+
(`dsh-flow-journey/1`, `dsh-flow-runtime/1`) and bare `{ "J1": { "status": "pass" } }`
|
|
17
|
+
rows are reported `deprecated` and never count as a pass.
|
|
18
|
+
- A journey counts as pass only when it has at least one `checks[]` element,
|
|
19
|
+
every check has `exitCode === 0`, every assertion holds, and at least one
|
|
20
|
+
check is an observed (non-`static`) command. `warn`, `blocked`, `na`,
|
|
21
|
+
`static` and `not-run` never count toward 8/8.
|
|
22
|
+
- `static` preflight is not runtime: a static PASS is a preflight result only.
|
|
23
|
+
- The collector copies the package to a temp dir, runs against the copy, and
|
|
24
|
+
records `subject.treeSha256` before/after; a changed tree fails the run.
|
|
25
|
+
- Child environments are built from an allowlist; tokens/keys/secrets never
|
|
26
|
+
reach the inspected plugin.
|
|
27
|
+
- `claims.claimLevel` is `self-attested` for a local collector run,
|
|
28
|
+
`ci-attested` with `--ci`. Neither is `verified`, a certification, or a
|
|
29
|
+
security audit; only a sandbox run may be described as runtime-attested.
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/PerryLink/dsh-standards/spec/flow-evidence.schema.json",
|
|
4
|
+
"title": "DSH FLOW evidence chain",
|
|
5
|
+
"description": "One collected FLOW result (J1-J8) bound to a package, a host, a timestamp, and a chain hash. Structural validation only: it does not prove the commands really ran. v1 (dsh-flow-journey/1, dsh-flow-runtime/1) and bare {Jx:{status}} documents are deprecated and never count as a pass. `level-audit.mjs --flow-evidence` accepts this document only.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"schema",
|
|
10
|
+
"generatedAt",
|
|
11
|
+
"producer",
|
|
12
|
+
"subject",
|
|
13
|
+
"host",
|
|
14
|
+
"journeys",
|
|
15
|
+
"claims",
|
|
16
|
+
"chain"
|
|
17
|
+
],
|
|
18
|
+
"properties": {
|
|
19
|
+
"schema": {
|
|
20
|
+
"const": "dsh-flow-evidence/2"
|
|
21
|
+
},
|
|
22
|
+
"evidenceId": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"minLength": 1
|
|
25
|
+
},
|
|
26
|
+
"generatedAt": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"format": "date-time"
|
|
29
|
+
},
|
|
30
|
+
"producer": {
|
|
31
|
+
"type": "object",
|
|
32
|
+
"additionalProperties": false,
|
|
33
|
+
"required": ["command", "at"],
|
|
34
|
+
"properties": {
|
|
35
|
+
"command": {
|
|
36
|
+
"type": "array",
|
|
37
|
+
"minItems": 1,
|
|
38
|
+
"items": { "type": "string" }
|
|
39
|
+
},
|
|
40
|
+
"at": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"format": "date-time"
|
|
43
|
+
},
|
|
44
|
+
"kind": {
|
|
45
|
+
"enum": ["local", "ci", "sandbox"]
|
|
46
|
+
},
|
|
47
|
+
"runner": { "type": "string" },
|
|
48
|
+
"actor": { "type": "string" },
|
|
49
|
+
"runUrl": { "type": "string" }
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"subject": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"additionalProperties": false,
|
|
55
|
+
"required": ["name", "version", "integrity", "tarballSha256", "commit", "treeSha256"],
|
|
56
|
+
"properties": {
|
|
57
|
+
"name": { "type": "string", "minLength": 1 },
|
|
58
|
+
"version": { "type": "string", "minLength": 1 },
|
|
59
|
+
"integrity": {
|
|
60
|
+
"oneOf": [
|
|
61
|
+
{ "type": "string", "pattern": "^(sha512|sha256)-[A-Za-z0-9+/=]+$" },
|
|
62
|
+
{ "type": "null" }
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"tarballSha256": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
|
|
66
|
+
"commit": {
|
|
67
|
+
"oneOf": [
|
|
68
|
+
{ "type": "string", "pattern": "^[0-9a-f]{40}$" },
|
|
69
|
+
{ "type": "null" }
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
"treeSha256": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
|
|
73
|
+
"treeSha256After": {
|
|
74
|
+
"oneOf": [
|
|
75
|
+
{ "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" },
|
|
76
|
+
{ "type": "null" }
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
"treeStable": { "type": "boolean" },
|
|
80
|
+
"treeExclude": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"items": { "type": "string" }
|
|
83
|
+
},
|
|
84
|
+
"source": { "type": "string" }
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"host": {
|
|
88
|
+
"type": "object",
|
|
89
|
+
"additionalProperties": false,
|
|
90
|
+
"required": ["dsh", "node", "platform"],
|
|
91
|
+
"properties": {
|
|
92
|
+
"dsh": {
|
|
93
|
+
"oneOf": [
|
|
94
|
+
{ "type": "string", "minLength": 1 },
|
|
95
|
+
{ "type": "null" }
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
"dshCommit": {
|
|
99
|
+
"oneOf": [
|
|
100
|
+
{ "type": "string", "pattern": "^[0-9a-f]{7,40}$" },
|
|
101
|
+
{ "type": "null" }
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
"cordis": { "type": "string" },
|
|
105
|
+
"node": { "type": "string", "minLength": 1 },
|
|
106
|
+
"platform": { "type": "string", "minLength": 1 }
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
"journeys": {
|
|
110
|
+
"type": "object",
|
|
111
|
+
"additionalProperties": false,
|
|
112
|
+
"required": ["J1", "J2", "J3", "J4", "J5", "J6", "J7", "J8"],
|
|
113
|
+
"patternProperties": {
|
|
114
|
+
"^J[1-8]$": { "$ref": "#/$defs/journey" }
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"claims": {
|
|
118
|
+
"type": "object",
|
|
119
|
+
"additionalProperties": false,
|
|
120
|
+
"required": ["claimLevel"],
|
|
121
|
+
"properties": {
|
|
122
|
+
"claimLevel": {
|
|
123
|
+
"enum": ["self-attested", "ci-attested", "sandbox-attested"]
|
|
124
|
+
},
|
|
125
|
+
"notClaimed": {
|
|
126
|
+
"type": "array",
|
|
127
|
+
"items": { "type": "string" }
|
|
128
|
+
},
|
|
129
|
+
"method": { "type": "string" }
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"chain": {
|
|
133
|
+
"type": "object",
|
|
134
|
+
"additionalProperties": false,
|
|
135
|
+
"required": ["evidenceHash"],
|
|
136
|
+
"properties": {
|
|
137
|
+
"evidenceHash": { "$ref": "#/$defs/sha256" }
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"conclusion": {
|
|
141
|
+
"enum": ["flow-pass", "flow-warn", "flow-blocked", "flow-fail"]
|
|
142
|
+
},
|
|
143
|
+
"signature": {
|
|
144
|
+
"oneOf": [{ "type": "object" }, { "type": "null" }]
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
"$defs": {
|
|
148
|
+
"sha256": {
|
|
149
|
+
"type": "string",
|
|
150
|
+
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
151
|
+
},
|
|
152
|
+
"log": {
|
|
153
|
+
"type": "object",
|
|
154
|
+
"additionalProperties": false,
|
|
155
|
+
"required": ["path", "sha256"],
|
|
156
|
+
"properties": {
|
|
157
|
+
"path": { "type": "string", "minLength": 1 },
|
|
158
|
+
"sha256": { "$ref": "#/$defs/sha256" }
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
"assertion": {
|
|
162
|
+
"type": "object",
|
|
163
|
+
"additionalProperties": false,
|
|
164
|
+
"required": ["claim", "observed"],
|
|
165
|
+
"properties": {
|
|
166
|
+
"claim": { "type": "string", "minLength": 1 },
|
|
167
|
+
"observed": { "type": "boolean" },
|
|
168
|
+
"detail": { "type": "string" }
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
"check": {
|
|
172
|
+
"type": "object",
|
|
173
|
+
"additionalProperties": false,
|
|
174
|
+
"required": ["id", "command", "exitCode", "startedAt", "endedAt", "stdout", "assertions"],
|
|
175
|
+
"properties": {
|
|
176
|
+
"id": { "type": "string", "pattern": "^J[1-8](?:\\.[A-Za-z0-9._-]+)?$" },
|
|
177
|
+
"kind": { "enum": ["observed", "static", "manual"] },
|
|
178
|
+
"command": {
|
|
179
|
+
"type": "array",
|
|
180
|
+
"minItems": 1,
|
|
181
|
+
"items": { "type": "string" }
|
|
182
|
+
},
|
|
183
|
+
"exitCode": { "type": "integer", "minimum": 0, "maximum": 255 },
|
|
184
|
+
"startedAt": { "type": "string", "format": "date-time" },
|
|
185
|
+
"endedAt": { "type": "string", "format": "date-time" },
|
|
186
|
+
"stdout": { "$ref": "#/$defs/log" },
|
|
187
|
+
"stderr": { "$ref": "#/$defs/log" },
|
|
188
|
+
"assertions": {
|
|
189
|
+
"type": "array",
|
|
190
|
+
"minItems": 1,
|
|
191
|
+
"items": { "$ref": "#/$defs/assertion" }
|
|
192
|
+
},
|
|
193
|
+
"durationMs": { "type": "number", "minimum": 0 }
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
"journey": {
|
|
197
|
+
"type": "object",
|
|
198
|
+
"additionalProperties": false,
|
|
199
|
+
"required": ["checks"],
|
|
200
|
+
"properties": {
|
|
201
|
+
"status": {
|
|
202
|
+
"enum": ["pass", "fail", "warn", "blocked", "static", "na", "not-run"]
|
|
203
|
+
},
|
|
204
|
+
"reason": { "type": "string" },
|
|
205
|
+
"kind": { "type": "string" },
|
|
206
|
+
"limitations": {
|
|
207
|
+
"type": "array",
|
|
208
|
+
"items": { "type": "string" }
|
|
209
|
+
},
|
|
210
|
+
"checks": {
|
|
211
|
+
"type": "array",
|
|
212
|
+
"items": { "$ref": "#/$defs/check" }
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
package/spec/levels.json
CHANGED
|
@@ -156,6 +156,8 @@
|
|
|
156
156
|
"machine": {
|
|
157
157
|
"journey": "40-checker/scripts/journey.mjs",
|
|
158
158
|
"journeyRuntime": "40-checker/scripts/journey-runtime.mjs",
|
|
159
|
+
"collector": "40-checker/bin/dsh-flow-collect.mjs",
|
|
160
|
+
"flowEvidence": "spec/flow-evidence.schema.json",
|
|
159
161
|
"audit": "40-checker/scripts/level-audit.mjs"
|
|
160
162
|
}
|
|
161
163
|
},
|