@godv61/dsh-task-engine 0.25.0 → 0.26.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/.acceptance.mjs +150 -150
- package/.assessment-batch1.mjs +20 -20
- package/.enforce-test.mjs +138 -138
- package/.evidence-test.mjs +118 -119
- package/.filter-test.mjs +92 -92
- package/.hook-test.mjs +195 -195
- package/.p0-test.mjs +59 -59
- package/.preset-test.mjs +160 -160
- package/.revision-test.mjs +30 -16
- package/.roundtrip-test.mjs +178 -63
- package/.workflow-test.mjs +86 -0
- package/README.md +7 -7
- package/cordis.patch.yml +10 -10
- package/defaults/eng.json +70 -22
- package/docs/BRIEF-FOR-REVIEW.md +162 -162
- package/docs/CHANGELOG.md +12 -0
- package/docs/README.md +40 -40
- package/docs/configuration.md +12 -9
- package/docs/development.md +1 -1
- package/docs/faq.md +4 -4
- package/docs/listing/godv61__dsh-task-engine.yml +5 -5
- package/docs/listing/submission.md +83 -83
- package/docs/manual.html +31 -26
- package/docs/releases/0.23.2.md +21 -21
- package/docs/roadmap.md +34 -34
- package/docs/testing/0.23.2/R02/344/270/232/345/212/241/346/265/213/350/257/225/346/230/216/347/273/206.md +56 -56
- package/docs/testing/0.23.2/R03/344/270/232/345/212/241/346/265/213/350/257/225/346/230/216/347/273/206.md +38 -38
- package/docs/testing/0.23.2//346/265/213/350/257/225/346/212/245/345/221/212.md +65 -65
- package/hooks/commit-msg +70 -1
- package/lib/client.js +825 -570
- package/lib/client.js.map +3 -3
- package/lib/controller.d.ts +2 -1
- package/lib/controller.js +6 -3
- package/lib/controller.js.map +1 -1
- package/lib/dev-task.js +79 -11
- package/lib/dev-task.js.map +1 -1
- package/lib/engine.d.ts +15 -0
- package/lib/engine.js +29 -5
- package/lib/engine.js.map +1 -1
- package/lib/hook.js +3 -0
- package/lib/hook.js.map +1 -1
- package/lib/skill-audit.js +3 -3
- package/lib/skill-audit.js.map +1 -1
- package/lib/workflows.d.ts +4 -1
- package/lib/workflows.js +90 -2
- package/lib/workflows.js.map +1 -1
- package/package.json +1 -1
- package/preset/agent.cordis.yml +21 -21
- package/preset/enable.mjs +87 -87
- package/preset/persona.md +4 -4
- package/preset/preset.yml +1 -1
- package/rules/coding-conventions.md +6 -6
- package/rules/commit-conventions.md +6 -6
- package/rules/security-redlines.md +5 -5
- package/scripts/verify-dsh-compat.mjs +144 -144
- package/skills/code-verify/SKILL.md +3 -3
package/docs/roadmap.md
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
# 功能规划
|
|
2
|
-
|
|
3
|
-
[← 文档导航](README.md)
|
|
4
|
-
|
|
5
|
-
本页记录**讨论中的方向,不代表已发布功能**;是否实现、何时实现都在开始编码前单独确认。
|
|
6
|
-
已发布的能力与版本变化见[更新日志](CHANGELOG.md)。
|
|
7
|
-
|
|
8
|
-
## 当前能力边界
|
|
9
|
-
|
|
10
|
-
| 能力 | 状态 |
|
|
11
|
-
| :--- | :--- |
|
|
12
|
-
| 三个内置流程(`standard`、`agile`、`minimal`) | ✅ 已发布,开箱即用 |
|
|
13
|
-
|
|
|
14
|
-
| 任务台账、验证与审核回执、提交门禁 | ✅ 已发布 |
|
|
15
|
-
| 项目级与个人级资源安装、来源保留 | ✅ 已发布 |
|
|
16
|
-
| **自由编辑流程阶段与条件** | ❌ **不在计划内** |
|
|
17
|
-
|
|
18
|
-
**关于自定义流程**:让使用者自行设计阶段、条件与提交流程曾被评估,结论是**不列入计划**——
|
|
19
|
-
它把流程设计的负担转嫁给使用者,而三个内置流程已覆盖个人项目的常见需要。代码中不存在该能力的
|
|
20
|
-
实现;相关尝试保留在非发布分支,不在 `main` 上。
|
|
21
|
-
|
|
22
|
-
需要调整时,可修改项目根目录的 `.dsh/eng.json` 改变阶段资源绑定,或直接在三个内置流程中选择。
|
|
23
|
-
|
|
24
|
-
## 后续体验方向
|
|
25
|
-
|
|
26
|
-
- 资源导入:文件选择取消、大包进度、分块上传与取消。
|
|
27
|
-
- 资源维护:来源与版本记录、升级差异预览、备份和恢复。
|
|
28
|
-
- 工作台:未保存内容保护、台账扩展、语言与可访问性完善。
|
|
29
|
-
- 项目展示:真实工作台截图、案例和收录信息。
|
|
30
|
-
|
|
31
|
-
## 产品范围
|
|
32
|
-
|
|
33
|
-
本项目服务本机个人开发工作台。多用户服务器的会话权限架构不列为当前版本的必修项。日常改进优先
|
|
34
|
-
解决工作区目标清晰、文件误操作、任务连续性和操作反馈。
|
|
1
|
+
# 功能规划
|
|
2
|
+
|
|
3
|
+
[← 文档导航](README.md)
|
|
4
|
+
|
|
5
|
+
本页记录**讨论中的方向,不代表已发布功能**;是否实现、何时实现都在开始编码前单独确认。
|
|
6
|
+
已发布的能力与版本变化见[更新日志](CHANGELOG.md)。
|
|
7
|
+
|
|
8
|
+
## 当前能力边界
|
|
9
|
+
|
|
10
|
+
| 能力 | 状态 |
|
|
11
|
+
| :--- | :--- |
|
|
12
|
+
| 三个内置流程(`standard`、`agile`、`minimal`) | ✅ 已发布,开箱即用 |
|
|
13
|
+
| 阶段选择技能、规则归属技能 | ✅ 已发布 |
|
|
14
|
+
| 任务台账、验证与审核回执、提交门禁 | ✅ 已发布 |
|
|
15
|
+
| 项目级与个人级资源安装、来源保留 | ✅ 已发布 |
|
|
16
|
+
| **自由编辑流程阶段与条件** | ❌ **不在计划内** |
|
|
17
|
+
|
|
18
|
+
**关于自定义流程**:让使用者自行设计阶段、条件与提交流程曾被评估,结论是**不列入计划**——
|
|
19
|
+
它把流程设计的负担转嫁给使用者,而三个内置流程已覆盖个人项目的常见需要。代码中不存在该能力的
|
|
20
|
+
实现;相关尝试保留在非发布分支,不在 `main` 上。
|
|
21
|
+
|
|
22
|
+
需要调整时,可修改项目根目录的 `.dsh/eng.json` 改变阶段资源绑定,或直接在三个内置流程中选择。
|
|
23
|
+
|
|
24
|
+
## 后续体验方向
|
|
25
|
+
|
|
26
|
+
- 资源导入:文件选择取消、大包进度、分块上传与取消。
|
|
27
|
+
- 资源维护:来源与版本记录、升级差异预览、备份和恢复。
|
|
28
|
+
- 工作台:未保存内容保护、台账扩展、语言与可访问性完善。
|
|
29
|
+
- 项目展示:真实工作台截图、案例和收录信息。
|
|
30
|
+
|
|
31
|
+
## 产品范围
|
|
32
|
+
|
|
33
|
+
本项目服务本机个人开发工作台。多用户服务器的会话权限架构不列为当前版本的必修项。日常改进优先
|
|
34
|
+
解决工作区目标清晰、文件误操作、任务连续性和操作反馈。
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
# 自动化测试逐项记录
|
|
2
|
-
|
|
3
|
-
来源:r02-business-tests.log;共 50 项。
|
|
4
|
-
|
|
5
|
-
| ID | 用例 | 结果 | 耗时 ms |
|
|
6
|
-
| --- | --- | --- | ---: |
|
|
7
|
-
| 1 | aggregate / 主验收用例:按批次累计并按 batchId 升序输出,总计正确 | 通过 | 1.7221 |
|
|
8
|
-
| 2 | aggregate / 空数组合法:batches 为空且 totals 全为 0 | 通过 | 0.3127 |
|
|
9
|
-
| 3 | aggregate / 零值合法:inspected 与 defective 为 0 时 defectRate 为 0 | 通过 | 0.2572 |
|
|
10
|
-
| 4 | aggregate / defective 为 0 而 inspected 大于 0 时 defectRate 为 0 | 通过 | 0.2215 |
|
|
11
|
-
| 5 | aggregate / batchId 去除前后空格后归并同一批次并累计 | 通过 | 0.1655 |
|
|
12
|
-
| 6 | aggregate / batches 按 batchId 字符串升序(码元序,与本地化无关) | 通过 | 0.2373 |
|
|
13
|
-
| 7 | aggregate / totals 为各批次之和,且 totals.defectRate 由总计重新计算 | 通过 | 0.1854 |
|
|
14
|
-
| 8 | aggregate / 根不是数组时抛出 ValidationError | 通过 | 0.5797 |
|
|
15
|
-
| 9 | defectRateOf / inspected 为 0 时返回 0 | 通过 | 0.2674 |
|
|
16
|
-
| 10 | defectRateOf / 按百分数计算并四舍五入到至多两位小数 | 通过 | 0.247 |
|
|
17
|
-
| 11 | defectRateOf / 所有取值的百分数结果都至多两位小数 | 通过 | 2.3668 |
|
|
18
|
-
| 12 | validateRecord / 返回归一化后的记录(batchId 已去除前后空格) | 通过 | 0.3104 |
|
|
19
|
-
| 13 | validateRecord / 记录不是对象 → 抛出带具体原因的 ValidationError | 通过 | 0.2946 |
|
|
20
|
-
| 14 | validateRecord / 记录是数组或 null → 抛出带具体原因的 ValidationError | 通过 | 0.0734 |
|
|
21
|
-
| 15 | validateRecord / batchId 缺失 → 抛出带具体原因的 ValidationError | 通过 | 0.0679 |
|
|
22
|
-
| 16 | validateRecord / batchId 不是字符串 → 抛出带具体原因的 ValidationError | 通过 | 0.1043 |
|
|
23
|
-
| 17 | validateRecord / batchId 为空字符串 → 抛出带具体原因的 ValidationError | 通过 | 0.0562 |
|
|
24
|
-
| 18 | validateRecord / batchId 为纯空白 → 抛出带具体原因的 ValidationError | 通过 | 0.0991 |
|
|
25
|
-
| 19 | validateRecord / inspected 为字符串数字 → 抛出带具体原因的 ValidationError | 通过 | 0.063 |
|
|
26
|
-
| 20 | validateRecord / inspected 为小数 → 抛出带具体原因的 ValidationError | 通过 | 1.6018 |
|
|
27
|
-
| 21 | validateRecord / inspected 为负数 → 抛出带具体原因的 ValidationError | 通过 | 0.2323 |
|
|
28
|
-
| 22 | validateRecord / defective 为字符串数字 → 抛出带具体原因的 ValidationError | 通过 | 0.0926 |
|
|
29
|
-
| 23 | validateRecord / defective 为小数 → 抛出带具体原因的 ValidationError | 通过 | 0.0762 |
|
|
30
|
-
| 24 | validateRecord / defective 为负数 → 抛出带具体原因的 ValidationError | 通过 | 0.1131 |
|
|
31
|
-
| 25 | validateRecord / defective 大于 inspected → 抛出带具体原因的 ValidationError | 通过 | 0.0584 |
|
|
32
|
-
| 26 | validateRecord / 非法记录的错误信息包含记录下标,便于定位 | 通过 | 0.1725 |
|
|
33
|
-
| 27 | aggregate 对非法输入的短路行为 / 逐条校验,遇到首条非法记录即抛出且不返回结果 | 通过 | 0.117 |
|
|
34
|
-
| 28 | CLI 成功路径(node src/cli.mjs <input.json>) / 主验收用例:B 10/1、A 5/0、B 10/2 → A 5/0/0、B 20/3/15,总计 25/3/12 | 通过 | 490.6289 |
|
|
35
|
-
| 29 | CLI 成功路径(node src/cli.mjs <input.json>) / 空数组合法:batches 为空,totals 全为 0 | 通过 | 281.0915 |
|
|
36
|
-
| 30 | CLI 成功路径(node src/cli.mjs <input.json>) / 零值合法:inspected 与 defective 均为 0 时 defectRate 为 0 | 通过 | 209.3507 |
|
|
37
|
-
| 31 | CLI 成功路径(node src/cli.mjs <input.json>) / batchId 去除前后空格后同批次累计 | 通过 | 113.847 |
|
|
38
|
-
| 32 | CLI 成功路径(node src/cli.mjs <input.json>) / defectRate 至多两位小数且为数值型 | 通过 | 87.8699 |
|
|
39
|
-
| 33 | CLI 参数错误 / 无参数 → 非零退出并说明缺少参数 | 通过 | 82.0618 |
|
|
40
|
-
| 34 | CLI 参数错误 / 文件不存在 → 非零退出并说明读取失败 | 通过 | 81.6583 |
|
|
41
|
-
| 35 | CLI 参数错误 / 多余参数 → 非零退出 | 通过 | 96.195 |
|
|
42
|
-
| 36 | CLI 参数错误 / 未知选项 → 非零退出 | 通过 | 98.5844 |
|
|
43
|
-
| 37 | CLI --help / --help 退出码 0 且 stdout 输出用法 | 通过 | 83.1551 |
|
|
44
|
-
| 38 | CLI --help / -h 退出码 0 且 stdout 输出用法 | 通过 | 89.7449 |
|
|
45
|
-
| 39 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / 非法 JSON 文本 | 通过 | 88.3874 |
|
|
46
|
-
| 40 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / 根不是数组 | 通过 | 88.4727 |
|
|
47
|
-
| 41 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / batchId 为空字符串 | 通过 | 79.4806 |
|
|
48
|
-
| 42 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / batchId 为纯空白 | 通过 | 78.3269 |
|
|
49
|
-
| 43 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / inspected 为负数 | 通过 | 81.4441 |
|
|
50
|
-
| 44 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / defective 为负数 | 通过 | 76.5963 |
|
|
51
|
-
| 45 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / inspected 为小数 | 通过 | 69.1574 |
|
|
52
|
-
| 46 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / defective 为小数 | 通过 | 72.4095 |
|
|
53
|
-
| 47 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / 数字写成字符串 | 通过 | 74.708 |
|
|
54
|
-
| 48 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / defective 大于 inspected | 通过 | 79.6399 |
|
|
55
|
-
| 49 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / 记录不是对象 | 通过 | 70.2125 |
|
|
56
|
-
| 50 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / 错误信息带记录下标,可定位到具体记录 | 通过 | 75.1616 |
|
|
1
|
+
# 自动化测试逐项记录
|
|
2
|
+
|
|
3
|
+
来源:r02-business-tests.log;共 50 项。
|
|
4
|
+
|
|
5
|
+
| ID | 用例 | 结果 | 耗时 ms |
|
|
6
|
+
| --- | --- | --- | ---: |
|
|
7
|
+
| 1 | aggregate / 主验收用例:按批次累计并按 batchId 升序输出,总计正确 | 通过 | 1.7221 |
|
|
8
|
+
| 2 | aggregate / 空数组合法:batches 为空且 totals 全为 0 | 通过 | 0.3127 |
|
|
9
|
+
| 3 | aggregate / 零值合法:inspected 与 defective 为 0 时 defectRate 为 0 | 通过 | 0.2572 |
|
|
10
|
+
| 4 | aggregate / defective 为 0 而 inspected 大于 0 时 defectRate 为 0 | 通过 | 0.2215 |
|
|
11
|
+
| 5 | aggregate / batchId 去除前后空格后归并同一批次并累计 | 通过 | 0.1655 |
|
|
12
|
+
| 6 | aggregate / batches 按 batchId 字符串升序(码元序,与本地化无关) | 通过 | 0.2373 |
|
|
13
|
+
| 7 | aggregate / totals 为各批次之和,且 totals.defectRate 由总计重新计算 | 通过 | 0.1854 |
|
|
14
|
+
| 8 | aggregate / 根不是数组时抛出 ValidationError | 通过 | 0.5797 |
|
|
15
|
+
| 9 | defectRateOf / inspected 为 0 时返回 0 | 通过 | 0.2674 |
|
|
16
|
+
| 10 | defectRateOf / 按百分数计算并四舍五入到至多两位小数 | 通过 | 0.247 |
|
|
17
|
+
| 11 | defectRateOf / 所有取值的百分数结果都至多两位小数 | 通过 | 2.3668 |
|
|
18
|
+
| 12 | validateRecord / 返回归一化后的记录(batchId 已去除前后空格) | 通过 | 0.3104 |
|
|
19
|
+
| 13 | validateRecord / 记录不是对象 → 抛出带具体原因的 ValidationError | 通过 | 0.2946 |
|
|
20
|
+
| 14 | validateRecord / 记录是数组或 null → 抛出带具体原因的 ValidationError | 通过 | 0.0734 |
|
|
21
|
+
| 15 | validateRecord / batchId 缺失 → 抛出带具体原因的 ValidationError | 通过 | 0.0679 |
|
|
22
|
+
| 16 | validateRecord / batchId 不是字符串 → 抛出带具体原因的 ValidationError | 通过 | 0.1043 |
|
|
23
|
+
| 17 | validateRecord / batchId 为空字符串 → 抛出带具体原因的 ValidationError | 通过 | 0.0562 |
|
|
24
|
+
| 18 | validateRecord / batchId 为纯空白 → 抛出带具体原因的 ValidationError | 通过 | 0.0991 |
|
|
25
|
+
| 19 | validateRecord / inspected 为字符串数字 → 抛出带具体原因的 ValidationError | 通过 | 0.063 |
|
|
26
|
+
| 20 | validateRecord / inspected 为小数 → 抛出带具体原因的 ValidationError | 通过 | 1.6018 |
|
|
27
|
+
| 21 | validateRecord / inspected 为负数 → 抛出带具体原因的 ValidationError | 通过 | 0.2323 |
|
|
28
|
+
| 22 | validateRecord / defective 为字符串数字 → 抛出带具体原因的 ValidationError | 通过 | 0.0926 |
|
|
29
|
+
| 23 | validateRecord / defective 为小数 → 抛出带具体原因的 ValidationError | 通过 | 0.0762 |
|
|
30
|
+
| 24 | validateRecord / defective 为负数 → 抛出带具体原因的 ValidationError | 通过 | 0.1131 |
|
|
31
|
+
| 25 | validateRecord / defective 大于 inspected → 抛出带具体原因的 ValidationError | 通过 | 0.0584 |
|
|
32
|
+
| 26 | validateRecord / 非法记录的错误信息包含记录下标,便于定位 | 通过 | 0.1725 |
|
|
33
|
+
| 27 | aggregate 对非法输入的短路行为 / 逐条校验,遇到首条非法记录即抛出且不返回结果 | 通过 | 0.117 |
|
|
34
|
+
| 28 | CLI 成功路径(node src/cli.mjs <input.json>) / 主验收用例:B 10/1、A 5/0、B 10/2 → A 5/0/0、B 20/3/15,总计 25/3/12 | 通过 | 490.6289 |
|
|
35
|
+
| 29 | CLI 成功路径(node src/cli.mjs <input.json>) / 空数组合法:batches 为空,totals 全为 0 | 通过 | 281.0915 |
|
|
36
|
+
| 30 | CLI 成功路径(node src/cli.mjs <input.json>) / 零值合法:inspected 与 defective 均为 0 时 defectRate 为 0 | 通过 | 209.3507 |
|
|
37
|
+
| 31 | CLI 成功路径(node src/cli.mjs <input.json>) / batchId 去除前后空格后同批次累计 | 通过 | 113.847 |
|
|
38
|
+
| 32 | CLI 成功路径(node src/cli.mjs <input.json>) / defectRate 至多两位小数且为数值型 | 通过 | 87.8699 |
|
|
39
|
+
| 33 | CLI 参数错误 / 无参数 → 非零退出并说明缺少参数 | 通过 | 82.0618 |
|
|
40
|
+
| 34 | CLI 参数错误 / 文件不存在 → 非零退出并说明读取失败 | 通过 | 81.6583 |
|
|
41
|
+
| 35 | CLI 参数错误 / 多余参数 → 非零退出 | 通过 | 96.195 |
|
|
42
|
+
| 36 | CLI 参数错误 / 未知选项 → 非零退出 | 通过 | 98.5844 |
|
|
43
|
+
| 37 | CLI --help / --help 退出码 0 且 stdout 输出用法 | 通过 | 83.1551 |
|
|
44
|
+
| 38 | CLI --help / -h 退出码 0 且 stdout 输出用法 | 通过 | 89.7449 |
|
|
45
|
+
| 39 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / 非法 JSON 文本 | 通过 | 88.3874 |
|
|
46
|
+
| 40 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / 根不是数组 | 通过 | 88.4727 |
|
|
47
|
+
| 41 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / batchId 为空字符串 | 通过 | 79.4806 |
|
|
48
|
+
| 42 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / batchId 为纯空白 | 通过 | 78.3269 |
|
|
49
|
+
| 43 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / inspected 为负数 | 通过 | 81.4441 |
|
|
50
|
+
| 44 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / defective 为负数 | 通过 | 76.5963 |
|
|
51
|
+
| 45 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / inspected 为小数 | 通过 | 69.1574 |
|
|
52
|
+
| 46 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / defective 为小数 | 通过 | 72.4095 |
|
|
53
|
+
| 47 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / 数字写成字符串 | 通过 | 74.708 |
|
|
54
|
+
| 48 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / defective 大于 inspected | 通过 | 79.6399 |
|
|
55
|
+
| 49 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / 记录不是对象 | 通过 | 70.2125 |
|
|
56
|
+
| 50 | CLI 非法输入(非零退出 + stderr 具体原因 + stdout 无成功结果) / 错误信息带记录下标,可定位到具体记录 | 通过 | 75.1616 |
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
# 自动化测试逐项记录
|
|
2
|
-
|
|
3
|
-
来源:r03-business-tests.log;共 32 项。
|
|
4
|
-
|
|
5
|
-
| ID | 用例 | 结果 | 耗时 ms |
|
|
6
|
-
| --- | --- | --- | ---: |
|
|
7
|
-
| 1 | 单元 aggregate:同批次累计、码元升序并输出 defectRate | 通过 | 1.695 |
|
|
8
|
-
| 2 | 单元 aggregate:空数组得到空 batches 与全零 totals | 通过 | 0.2052 |
|
|
9
|
-
| 3 | 单元 aggregate:inspected 为 0 时 defectRate 为 0 | 通过 | 0.1467 |
|
|
10
|
-
| 4 | 单元 aggregate:defectRate 至多两位小数且为数值类型 | 通过 | 0.2306 |
|
|
11
|
-
| 5 | 单元 aggregate:totals.defectRate 基于累计值而非各批次比率平均 | 通过 | 0.111 |
|
|
12
|
-
| 6 | 单元 aggregate:按 batchId 字符串码元升序(大写先于小写) | 通过 | 0.0989 |
|
|
13
|
-
| 7 | 单元 validateRecords:batchId 去除前后空格后作为同一批次 | 通过 | 0.1417 |
|
|
14
|
-
| 8 | 单元 validateRecords:接受非负整数与零值边界 | 通过 | 0.1628 |
|
|
15
|
-
| 9 | 单元 validateRecords:拒绝非数组、非法元素与非法字段 | 通过 | 0.683 |
|
|
16
|
-
| 10 | AC1 同批次累计,stdout 仅一行 JSON,totals 正确 | 通过 | 74.2086 |
|
|
17
|
-
| 11 | AC2 空数组合法 | 通过 | 75.882 |
|
|
18
|
-
| 12 | AC3 零数合法 | 通过 | 85.2254 |
|
|
19
|
-
| 13 | AC4 batchId 去空格归并并按码元升序 | 通过 | 82.9206 |
|
|
20
|
-
| 14 | AC5 非法 JSON 失败且 stdout 为空 | 通过 | 90.9043 |
|
|
21
|
-
| 15 | AC6 顶层非数组失败且 stdout 为空 | 通过 | 379.1634 |
|
|
22
|
-
| 16 | AC7 batchId 为空字符串 → 非零退出、stdout 为空、stderr 具体 | 通过 | 80.0845 |
|
|
23
|
-
| 17 | AC7 batchId 为纯空白 → 非零退出、stdout 为空、stderr 具体 | 通过 | 74.659 |
|
|
24
|
-
| 18 | AC7 batchId 缺失 → 非零退出、stdout 为空、stderr 具体 | 通过 | 78.5134 |
|
|
25
|
-
| 19 | AC8 inspected 为负数 → 非零退出、stdout 为空、stderr 具体 | 通过 | 121.0524 |
|
|
26
|
-
| 20 | AC8 defective 为负数 → 非零退出、stdout 为空、stderr 具体 | 通过 | 77.35 |
|
|
27
|
-
| 21 | AC9 inspected 为小数 → 非零退出、stdout 为空、stderr 具体 | 通过 | 66.7267 |
|
|
28
|
-
| 22 | AC9 defective 为小数 → 非零退出、stdout 为空、stderr 具体 | 通过 | 68.4103 |
|
|
29
|
-
| 23 | AC10 inspected 为字符串数字 → 非零退出、stdout 为空、stderr 具体 | 通过 | 71.1564 |
|
|
30
|
-
| 24 | AC10 defective 为字符串数字 → 非零退出、stdout 为空、stderr 具体 | 通过 | 71.2365 |
|
|
31
|
-
| 25 | AC11 defective 大于 inspected → 非零退出、stdout 为空、stderr 具体 | 通过 | 76.4629 |
|
|
32
|
-
| 26 | 非对象元素 → 非零退出、stdout 为空、stderr 具体 | 通过 | 72.6897 |
|
|
33
|
-
| 27 | AC12 无参数失败并提示用法 | 通过 | 75.6079 |
|
|
34
|
-
| 28 | 多余参数失败并提示用法 | 通过 | 73.248 |
|
|
35
|
-
| 29 | AC13 文件不存在失败且 stdout 为空 | 通过 | 71.4465 |
|
|
36
|
-
| 30 | AC14 --help 退出 0 并输出用法 | 通过 | 141.8224 |
|
|
37
|
-
| 31 | AC14 --help 优先于其他参数 | 通过 | 70.1995 |
|
|
38
|
-
| 32 | AC15 examples/batches.json 可直接运行并得到文档所述结果 | 通过 | 73.5514 |
|
|
1
|
+
# 自动化测试逐项记录
|
|
2
|
+
|
|
3
|
+
来源:r03-business-tests.log;共 32 项。
|
|
4
|
+
|
|
5
|
+
| ID | 用例 | 结果 | 耗时 ms |
|
|
6
|
+
| --- | --- | --- | ---: |
|
|
7
|
+
| 1 | 单元 aggregate:同批次累计、码元升序并输出 defectRate | 通过 | 1.695 |
|
|
8
|
+
| 2 | 单元 aggregate:空数组得到空 batches 与全零 totals | 通过 | 0.2052 |
|
|
9
|
+
| 3 | 单元 aggregate:inspected 为 0 时 defectRate 为 0 | 通过 | 0.1467 |
|
|
10
|
+
| 4 | 单元 aggregate:defectRate 至多两位小数且为数值类型 | 通过 | 0.2306 |
|
|
11
|
+
| 5 | 单元 aggregate:totals.defectRate 基于累计值而非各批次比率平均 | 通过 | 0.111 |
|
|
12
|
+
| 6 | 单元 aggregate:按 batchId 字符串码元升序(大写先于小写) | 通过 | 0.0989 |
|
|
13
|
+
| 7 | 单元 validateRecords:batchId 去除前后空格后作为同一批次 | 通过 | 0.1417 |
|
|
14
|
+
| 8 | 单元 validateRecords:接受非负整数与零值边界 | 通过 | 0.1628 |
|
|
15
|
+
| 9 | 单元 validateRecords:拒绝非数组、非法元素与非法字段 | 通过 | 0.683 |
|
|
16
|
+
| 10 | AC1 同批次累计,stdout 仅一行 JSON,totals 正确 | 通过 | 74.2086 |
|
|
17
|
+
| 11 | AC2 空数组合法 | 通过 | 75.882 |
|
|
18
|
+
| 12 | AC3 零数合法 | 通过 | 85.2254 |
|
|
19
|
+
| 13 | AC4 batchId 去空格归并并按码元升序 | 通过 | 82.9206 |
|
|
20
|
+
| 14 | AC5 非法 JSON 失败且 stdout 为空 | 通过 | 90.9043 |
|
|
21
|
+
| 15 | AC6 顶层非数组失败且 stdout 为空 | 通过 | 379.1634 |
|
|
22
|
+
| 16 | AC7 batchId 为空字符串 → 非零退出、stdout 为空、stderr 具体 | 通过 | 80.0845 |
|
|
23
|
+
| 17 | AC7 batchId 为纯空白 → 非零退出、stdout 为空、stderr 具体 | 通过 | 74.659 |
|
|
24
|
+
| 18 | AC7 batchId 缺失 → 非零退出、stdout 为空、stderr 具体 | 通过 | 78.5134 |
|
|
25
|
+
| 19 | AC8 inspected 为负数 → 非零退出、stdout 为空、stderr 具体 | 通过 | 121.0524 |
|
|
26
|
+
| 20 | AC8 defective 为负数 → 非零退出、stdout 为空、stderr 具体 | 通过 | 77.35 |
|
|
27
|
+
| 21 | AC9 inspected 为小数 → 非零退出、stdout 为空、stderr 具体 | 通过 | 66.7267 |
|
|
28
|
+
| 22 | AC9 defective 为小数 → 非零退出、stdout 为空、stderr 具体 | 通过 | 68.4103 |
|
|
29
|
+
| 23 | AC10 inspected 为字符串数字 → 非零退出、stdout 为空、stderr 具体 | 通过 | 71.1564 |
|
|
30
|
+
| 24 | AC10 defective 为字符串数字 → 非零退出、stdout 为空、stderr 具体 | 通过 | 71.2365 |
|
|
31
|
+
| 25 | AC11 defective 大于 inspected → 非零退出、stdout 为空、stderr 具体 | 通过 | 76.4629 |
|
|
32
|
+
| 26 | 非对象元素 → 非零退出、stdout 为空、stderr 具体 | 通过 | 72.6897 |
|
|
33
|
+
| 27 | AC12 无参数失败并提示用法 | 通过 | 75.6079 |
|
|
34
|
+
| 28 | 多余参数失败并提示用法 | 通过 | 73.248 |
|
|
35
|
+
| 29 | AC13 文件不存在失败且 stdout 为空 | 通过 | 71.4465 |
|
|
36
|
+
| 30 | AC14 --help 退出 0 并输出用法 | 通过 | 141.8224 |
|
|
37
|
+
| 31 | AC14 --help 优先于其他参数 | 通过 | 70.1995 |
|
|
38
|
+
| 32 | AC15 examples/batches.json 可直接运行并得到文档所述结果 | 通过 | 73.5514 |
|
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
# 0.23.2 实机循环回归报告
|
|
2
|
-
|
|
3
|
-
[← 发布说明](../../releases/0.23.2.md)
|
|
4
|
-
|
|
5
|
-
日期:2026-09-17。结论:权限缺陷修复后,两个新会话从同一空业务基线完成标准研发流程、独立验收、本地提交和归档回退;门禁专项通过。验证对象是本机 Harness 上的独立 CLI 项目,不是 QMS 页面、数据库或生产业务。
|
|
6
|
-
|
|
7
|
-
## 环境与方法
|
|
8
|
-
|
|
9
|
-
Harness 提交 `d347e703908d0406b7a7ef80e3a0e594d86b2215`,Windows、Node 22.22.3、web profile,模型 `deepseek-v4.1-flash`,工程化开发引擎预设。独立仓库 `D:\dshtest`,分支 `codex/plugin-live-regression`,基线 `aae3bf8994ef803cf8370f5f53840b508539499c` 仅有 `.gitignore`。
|
|
10
|
-
|
|
11
|
-
冻结需求为零依赖 ESM 质检批次统计 CLI:严格校验 JSON 记录,按 trim 后的 batchId 累计并按码元排序,计算百分数缺陷率,正确区分成功 JSON 与失败 stderr,提供单元测试、真实 CLI 子进程测试、样例及 README。所有业务代码由 DSH 编写;观察者只审阅、执行独立验收、归档及修复插件。每轮使用新会话,不读取前轮实现;QMS 未改动。
|
|
12
|
-
|
|
13
|
-
## 轮次结果
|
|
14
|
-
|
|
15
|
-
| 轮次 | 插件 | 业务测试 / 独立黑盒 | 流程结果 | 本地提交 |
|
|
16
|
-
| --- | --- | --- | --- | --- |
|
|
17
|
-
| R01 | 0.23.1 | 24 / 19 通过 | 插件验证权限缺陷阻塞交付;停止、归档,未冒充完成 | 无 |
|
|
18
|
-
| R02 | 0.23.2-rc.1 | 50 / 19 通过 | 审批、3项实施审核、验证、代码审核、提交回写、完成、归档回退通过 | `15ffd9c230363520a934586107ce9f4023e828ed` |
|
|
19
|
-
| R03 | 0.23.2-rc.3 | 32 / 19 通过 | 设计退回修订、4项实施审核、验证、代码审核、提交回写、完成、归档回退通过 | `4e476a514d3109417bac602e818460b09dd57289` |
|
|
20
|
-
|
|
21
|
-
R02 与 R03 的权限核心构建文件 SHA256 均为 `FD116354D20D870E8981B4C098E9F0BDBE9B213397918D7181FE07E0E1713688`;期间只修正提交规则及文档。rc.2 安装核对时发现新指南误称 status 返回格式字段,已改为实际的 `commit.label` 并重打 rc.3,rc.2 不计作业务轮次。
|
|
22
|
-
|
|
23
|
-
R02 为27项单元、23项CLI子进程测试;R03 为9项单元、23项CLI子进程测试。DSH 的 R03 最终文字误写8+24,本报告按实际测试文件与TAP用例核对为9+23。逐项结果和耗时见[R02明细](R02业务测试明细.md)、[R03明细](R03业务测试明细.md)。独立黑盒19项覆盖主用例、空数组、零值、trim与取整、4类非法顶层输入、7类非法字段、非法JSON、缺参数、缺文件和帮助。
|
|
24
|
-
|
|
25
|
-
## 门禁专项
|
|
26
|
-
|
|
27
|
-
| 场景 | 实际结果 | 结论 |
|
|
28
|
-
| --- | --- | --- |
|
|
29
|
-
| 未加载绑定技能即推进 | 返回 load skill requirement-analysis,未推进 | 通过 |
|
|
30
|
-
| 缺少需求产物与确认即推进 | 返回 requirement_confirmation / artifacts_present 未满足 | 通过 |
|
|
31
|
-
| 使用合法消息提前提交 | 返回当前阶段无提交检查点,revision仍为1 | 通过 |
|
|
32
|
-
| 普通权限运行 node --test | 真实exit1,子进程spawn EPERM,回执mode=workspace-write | 按预期失败 |
|
|
33
|
-
| 拒绝该命令的权限升级 | 工具报rejected,台账逐字节哈希不变 | 通过 |
|
|
34
|
-
| 明确重新授权后批准原命令 | 50项测试通过,exit0,回执mode=danger-full-access | 通过 |
|
|
35
|
-
| 修改唯一范围文件 | status出现验证过期的evidence_blockers,冻结旧回执保留 | 通过 |
|
|
36
|
-
| 同会话后续普通shell调用 | 原命令重新EPERM,未继承单次权限 | 通过 |
|
|
37
|
-
|
|
38
|
-
拒绝前后台账 SHA256 均为 `99F13BB166B4D0C9D7EC4EAE00F0471E7CEABD97541ADD85820A64A0D2008306`。专项任务 `DSH-GATE-PROBE` 停在需求阶段,不计作完整业务轮次。过期提交的检查点路径由自动化回归覆盖;本次专项实机验证到动态过期提示,未声称在该检查点另外执行过过期提交。
|
|
39
|
-
|
|
40
|
-
R03完整流程另通过正式 `dev_task verify` 执行 `npm test`:单次审批后32项通过、exit0、实际模式danger-full-access。R02使用可在受限环境运行的真实文件描述符子进程测试,其workspace-write成功回执不冒充权限修复证据。R03修正后的提交消息首次预检即获批准,随后核对真实Git提交并登记。
|
|
41
|
-
|
|
42
|
-
## 插件回归与缺陷
|
|
43
|
-
|
|
44
|
-
P1:0.23.1在执行验证命令之后才审批写台账,导致命令先运行且未收到批准模式。回归测试先复现“审批服务不可用却已调用一次shell”,修复后拒绝、取消、审批不可用、非法参数均不运行命令或改台账;verify与skill_result批准顺序、请求上下文、单次权限和回执写入不重复审批均受断言保护。
|
|
45
|
-
|
|
46
|
-
P2:随包提交规则要求模块名,而引擎要求任务id,R02实际出现两次格式拒绝。规则及手册改为当前任务id和status.commit.label;R03未再出现该格式错误。
|
|
47
|
-
|
|
48
|
-
源码构建、host/client类型检查、126项P0和37项node:test回归通过;候选包干净安装、入口导入、客户端注册、包内测试及CLI语法验证通过。源码测试明细见[自动化测试明细](自动化测试明细.md)。最终0.23.2的 `npm run verify:package` 由用户在插件源码目录执行并确认通过;此项依据用户执行反馈,观察者没有独立保存该次终端日志。发布版本与远端提交另外核对,不以本报告代替发布成功回执。
|
|
49
|
-
|
|
50
|
-
## 归档与干预
|
|
51
|
-
|
|
52
|
-
两个完成轮次的父提交均为B0,文件分别严格限制为10个、5个;归档前工作区干净,任务均为完成、review=pass,最终登记hash等于HEAD。业务ZIP、任务JSON、会话日志及独立验收记录保存在本地 `live-project-test/regression-20260917`;备份分支为 `codex/archive-dsh-reg-r02` 和 `codex/archive-dsh-reg-r03`。业务分支最终恢复B0,保留被忽略的历史台账。
|
|
53
|
-
|
|
54
|
-
| 归档 | 业务ZIP SHA256 |
|
|
55
|
-
| --- | --- |
|
|
56
|
-
| R02 | `2545B54A201D70D536B85BDB52F2356CE2364310FCAF32E99F759408BFC98D82` |
|
|
57
|
-
| R03 | `F7BB52228137BA0A37722097A26AF6BBE1AEFB09C416792F4EE94EA29E71DD56` |
|
|
58
|
-
|
|
59
|
-
观察者处理了正式需求/设计/权限审批;R03退回已知Node22测试目录入口问题,并要求DSH通过正式审批区分EPERM与入口错误,保留默认测试隔离和真实子进程。观察者未代写业务代码。测试包含这些干预,不能称为完全自主执行。
|
|
60
|
-
|
|
61
|
-
## 能力边界与未覆盖范围
|
|
62
|
-
|
|
63
|
-
`dev_task`对阶段、证据和提交登记实施门禁,通用文件写入不会逐次经过状态机;R03实际在实施项仍为todo时写入文件,随后才逐项审核和标记done。没有安装提交钩子时,不能据此宣称插件能阻止直接shell绕过提交预检。本轮未测试强行篡改台账、直接Git绕过、多人并发、QMS集成、全部Harness/模型版本或生产部署。
|
|
64
|
-
|
|
65
|
-
scope_hash只覆盖任务files的内容,不能证明命令或范围外业务文件未变;观察者已纠正DSH一次过度解读。模型报告也可能出现测试分类计数错误,必须复核实际日志。自动化中的模拟宿主与真实DSH会话分开计证,不互相替代。
|
|
1
|
+
# 0.23.2 实机循环回归报告
|
|
2
|
+
|
|
3
|
+
[← 发布说明](../../releases/0.23.2.md)
|
|
4
|
+
|
|
5
|
+
日期:2026-09-17。结论:权限缺陷修复后,两个新会话从同一空业务基线完成标准研发流程、独立验收、本地提交和归档回退;门禁专项通过。验证对象是本机 Harness 上的独立 CLI 项目,不是 QMS 页面、数据库或生产业务。
|
|
6
|
+
|
|
7
|
+
## 环境与方法
|
|
8
|
+
|
|
9
|
+
Harness 提交 `d347e703908d0406b7a7ef80e3a0e594d86b2215`,Windows、Node 22.22.3、web profile,模型 `deepseek-v4.1-flash`,工程化开发引擎预设。独立仓库 `D:\dshtest`,分支 `codex/plugin-live-regression`,基线 `aae3bf8994ef803cf8370f5f53840b508539499c` 仅有 `.gitignore`。
|
|
10
|
+
|
|
11
|
+
冻结需求为零依赖 ESM 质检批次统计 CLI:严格校验 JSON 记录,按 trim 后的 batchId 累计并按码元排序,计算百分数缺陷率,正确区分成功 JSON 与失败 stderr,提供单元测试、真实 CLI 子进程测试、样例及 README。所有业务代码由 DSH 编写;观察者只审阅、执行独立验收、归档及修复插件。每轮使用新会话,不读取前轮实现;QMS 未改动。
|
|
12
|
+
|
|
13
|
+
## 轮次结果
|
|
14
|
+
|
|
15
|
+
| 轮次 | 插件 | 业务测试 / 独立黑盒 | 流程结果 | 本地提交 |
|
|
16
|
+
| --- | --- | --- | --- | --- |
|
|
17
|
+
| R01 | 0.23.1 | 24 / 19 通过 | 插件验证权限缺陷阻塞交付;停止、归档,未冒充完成 | 无 |
|
|
18
|
+
| R02 | 0.23.2-rc.1 | 50 / 19 通过 | 审批、3项实施审核、验证、代码审核、提交回写、完成、归档回退通过 | `15ffd9c230363520a934586107ce9f4023e828ed` |
|
|
19
|
+
| R03 | 0.23.2-rc.3 | 32 / 19 通过 | 设计退回修订、4项实施审核、验证、代码审核、提交回写、完成、归档回退通过 | `4e476a514d3109417bac602e818460b09dd57289` |
|
|
20
|
+
|
|
21
|
+
R02 与 R03 的权限核心构建文件 SHA256 均为 `FD116354D20D870E8981B4C098E9F0BDBE9B213397918D7181FE07E0E1713688`;期间只修正提交规则及文档。rc.2 安装核对时发现新指南误称 status 返回格式字段,已改为实际的 `commit.label` 并重打 rc.3,rc.2 不计作业务轮次。
|
|
22
|
+
|
|
23
|
+
R02 为27项单元、23项CLI子进程测试;R03 为9项单元、23项CLI子进程测试。DSH 的 R03 最终文字误写8+24,本报告按实际测试文件与TAP用例核对为9+23。逐项结果和耗时见[R02明细](R02业务测试明细.md)、[R03明细](R03业务测试明细.md)。独立黑盒19项覆盖主用例、空数组、零值、trim与取整、4类非法顶层输入、7类非法字段、非法JSON、缺参数、缺文件和帮助。
|
|
24
|
+
|
|
25
|
+
## 门禁专项
|
|
26
|
+
|
|
27
|
+
| 场景 | 实际结果 | 结论 |
|
|
28
|
+
| --- | --- | --- |
|
|
29
|
+
| 未加载绑定技能即推进 | 返回 load skill requirement-analysis,未推进 | 通过 |
|
|
30
|
+
| 缺少需求产物与确认即推进 | 返回 requirement_confirmation / artifacts_present 未满足 | 通过 |
|
|
31
|
+
| 使用合法消息提前提交 | 返回当前阶段无提交检查点,revision仍为1 | 通过 |
|
|
32
|
+
| 普通权限运行 node --test | 真实exit1,子进程spawn EPERM,回执mode=workspace-write | 按预期失败 |
|
|
33
|
+
| 拒绝该命令的权限升级 | 工具报rejected,台账逐字节哈希不变 | 通过 |
|
|
34
|
+
| 明确重新授权后批准原命令 | 50项测试通过,exit0,回执mode=danger-full-access | 通过 |
|
|
35
|
+
| 修改唯一范围文件 | status出现验证过期的evidence_blockers,冻结旧回执保留 | 通过 |
|
|
36
|
+
| 同会话后续普通shell调用 | 原命令重新EPERM,未继承单次权限 | 通过 |
|
|
37
|
+
|
|
38
|
+
拒绝前后台账 SHA256 均为 `99F13BB166B4D0C9D7EC4EAE00F0471E7CEABD97541ADD85820A64A0D2008306`。专项任务 `DSH-GATE-PROBE` 停在需求阶段,不计作完整业务轮次。过期提交的检查点路径由自动化回归覆盖;本次专项实机验证到动态过期提示,未声称在该检查点另外执行过过期提交。
|
|
39
|
+
|
|
40
|
+
R03完整流程另通过正式 `dev_task verify` 执行 `npm test`:单次审批后32项通过、exit0、实际模式danger-full-access。R02使用可在受限环境运行的真实文件描述符子进程测试,其workspace-write成功回执不冒充权限修复证据。R03修正后的提交消息首次预检即获批准,随后核对真实Git提交并登记。
|
|
41
|
+
|
|
42
|
+
## 插件回归与缺陷
|
|
43
|
+
|
|
44
|
+
P1:0.23.1在执行验证命令之后才审批写台账,导致命令先运行且未收到批准模式。回归测试先复现“审批服务不可用却已调用一次shell”,修复后拒绝、取消、审批不可用、非法参数均不运行命令或改台账;verify与skill_result批准顺序、请求上下文、单次权限和回执写入不重复审批均受断言保护。
|
|
45
|
+
|
|
46
|
+
P2:随包提交规则要求模块名,而引擎要求任务id,R02实际出现两次格式拒绝。规则及手册改为当前任务id和status.commit.label;R03未再出现该格式错误。
|
|
47
|
+
|
|
48
|
+
源码构建、host/client类型检查、126项P0和37项node:test回归通过;候选包干净安装、入口导入、客户端注册、包内测试及CLI语法验证通过。源码测试明细见[自动化测试明细](自动化测试明细.md)。最终0.23.2的 `npm run verify:package` 由用户在插件源码目录执行并确认通过;此项依据用户执行反馈,观察者没有独立保存该次终端日志。发布版本与远端提交另外核对,不以本报告代替发布成功回执。
|
|
49
|
+
|
|
50
|
+
## 归档与干预
|
|
51
|
+
|
|
52
|
+
两个完成轮次的父提交均为B0,文件分别严格限制为10个、5个;归档前工作区干净,任务均为完成、review=pass,最终登记hash等于HEAD。业务ZIP、任务JSON、会话日志及独立验收记录保存在本地 `live-project-test/regression-20260917`;备份分支为 `codex/archive-dsh-reg-r02` 和 `codex/archive-dsh-reg-r03`。业务分支最终恢复B0,保留被忽略的历史台账。
|
|
53
|
+
|
|
54
|
+
| 归档 | 业务ZIP SHA256 |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| R02 | `2545B54A201D70D536B85BDB52F2356CE2364310FCAF32E99F759408BFC98D82` |
|
|
57
|
+
| R03 | `F7BB52228137BA0A37722097A26AF6BBE1AEFB09C416792F4EE94EA29E71DD56` |
|
|
58
|
+
|
|
59
|
+
观察者处理了正式需求/设计/权限审批;R03退回已知Node22测试目录入口问题,并要求DSH通过正式审批区分EPERM与入口错误,保留默认测试隔离和真实子进程。观察者未代写业务代码。测试包含这些干预,不能称为完全自主执行。
|
|
60
|
+
|
|
61
|
+
## 能力边界与未覆盖范围
|
|
62
|
+
|
|
63
|
+
`dev_task`对阶段、证据和提交登记实施门禁,通用文件写入不会逐次经过状态机;R03实际在实施项仍为todo时写入文件,随后才逐项审核和标记done。没有安装提交钩子时,不能据此宣称插件能阻止直接shell绕过提交预检。本轮未测试强行篡改台账、直接Git绕过、多人并发、QMS集成、全部Harness/模型版本或生产部署。
|
|
64
|
+
|
|
65
|
+
scope_hash只覆盖任务files的内容,不能证明命令或范围外业务文件未变;观察者已纠正DSH一次过度解读。模型报告也可能出现测试分类计数错误,必须复核实际日志。自动化中的模拟宿主与真实DSH会话分开计证,不互相替代。
|
package/hooks/commit-msg
CHANGED
|
@@ -30,6 +30,9 @@ var import_node_fs = __toESM(require("node:fs"), 1);
|
|
|
30
30
|
var import_node_path = __toESM(require("node:path"), 1);
|
|
31
31
|
|
|
32
32
|
// src/engine.ts
|
|
33
|
+
function formatResourceRef(ref) {
|
|
34
|
+
return `${ref.source}:${ref.name}`;
|
|
35
|
+
}
|
|
33
36
|
function artifactsForStage(stage, config2) {
|
|
34
37
|
return config2.artifacts.filter((artifact) => artifact.stage === stage);
|
|
35
38
|
}
|
|
@@ -305,15 +308,80 @@ function applyProjectConfig(base, project) {
|
|
|
305
308
|
if (project === void 0) return base;
|
|
306
309
|
const next = { ...base };
|
|
307
310
|
if (project.stage_bindings !== void 0) {
|
|
311
|
+
const profiles = { ...project.skill_profiles ?? {} };
|
|
312
|
+
const explicitProfiles = new Set(Object.keys(project.skill_profiles ?? {}));
|
|
313
|
+
const problems = [];
|
|
308
314
|
const bindings = {};
|
|
309
315
|
for (const [stage, binding] of Object.entries(project.stage_bindings)) {
|
|
310
316
|
const entry = {};
|
|
311
|
-
if (
|
|
317
|
+
if (binding === null || typeof binding !== "object") {
|
|
318
|
+
problems.push(`stage_bindings "${stage}" must be an object`);
|
|
319
|
+
bindings[stage] = entry;
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
if (binding.skill_refs !== void 0 && binding.skills !== void 0) {
|
|
323
|
+
problems.push(`stage_bindings "${stage}" has both skill_refs and legacy skills`);
|
|
324
|
+
}
|
|
325
|
+
if (binding.skill_refs !== void 0) {
|
|
326
|
+
if (!Array.isArray(binding.skill_refs)) {
|
|
327
|
+
problems.push(`stage_bindings "${stage}" skill_refs must be an array`);
|
|
328
|
+
}
|
|
329
|
+
entry.skills = (Array.isArray(binding.skill_refs) ? binding.skill_refs : []).flatMap((ref) => {
|
|
330
|
+
if (ref === null || typeof ref !== "object") {
|
|
331
|
+
problems.push(`stage_bindings "${stage}" has an invalid skill reference`);
|
|
332
|
+
return [];
|
|
333
|
+
}
|
|
334
|
+
const key = formatResourceRef(ref);
|
|
335
|
+
const profile = profiles[key];
|
|
336
|
+
if (profile === void 0) {
|
|
337
|
+
problems.push(`skill profile "${key}" is missing`);
|
|
338
|
+
return [];
|
|
339
|
+
}
|
|
340
|
+
if (profile === null || !Array.isArray(profile.rules)) {
|
|
341
|
+
problems.push(`skill profile "${key}" must declare a rules array`);
|
|
342
|
+
return [];
|
|
343
|
+
}
|
|
344
|
+
return [{ skill: ref, rules: profile.rules, ...profile.evidence !== void 0 ? { evidence: profile.evidence } : {} }];
|
|
345
|
+
});
|
|
346
|
+
} else if (binding.skills !== void 0) {
|
|
347
|
+
if (!Array.isArray(binding.skills)) {
|
|
348
|
+
problems.push(`stage_bindings "${stage}" skills must be an array`);
|
|
349
|
+
}
|
|
350
|
+
entry.skills = (Array.isArray(binding.skills) ? binding.skills : []).flatMap((skill) => {
|
|
351
|
+
if (skill === null || typeof skill !== "object" || skill.skill === null || typeof skill.skill !== "object") {
|
|
352
|
+
problems.push(`stage_bindings "${stage}" has an invalid skill binding`);
|
|
353
|
+
return [];
|
|
354
|
+
}
|
|
355
|
+
const key = formatResourceRef(skill.skill);
|
|
356
|
+
if (explicitProfiles.has(key)) {
|
|
357
|
+
const profile = profiles[key];
|
|
358
|
+
if (profile === null || !Array.isArray(profile?.rules)) {
|
|
359
|
+
problems.push(`skill profile "${key}" must declare a rules array`);
|
|
360
|
+
return [];
|
|
361
|
+
}
|
|
362
|
+
return [{
|
|
363
|
+
skill: skill.skill,
|
|
364
|
+
rules: profile.rules,
|
|
365
|
+
...profile.evidence !== void 0 ? { evidence: profile.evidence } : {}
|
|
366
|
+
}];
|
|
367
|
+
}
|
|
368
|
+
const candidate = { rules: skill.rules ?? [], ...skill.evidence !== void 0 ? { evidence: skill.evidence } : {} };
|
|
369
|
+
const existing = profiles[key];
|
|
370
|
+
if (existing !== void 0 && JSON.stringify(existing) !== JSON.stringify(candidate)) {
|
|
371
|
+
problems.push(`skill "${key}" has different rules or evidence in multiple stages; copy it as a distinct skill`);
|
|
372
|
+
} else profiles[key] = candidate;
|
|
373
|
+
return [skill];
|
|
374
|
+
});
|
|
375
|
+
}
|
|
312
376
|
const legacy = dedupe(binding.legacy_rules ?? []);
|
|
313
377
|
if (legacy.length > 0) entry.legacy_rules = legacy;
|
|
314
378
|
bindings[stage] = entry;
|
|
315
379
|
}
|
|
316
380
|
next.stage_bindings = bindings;
|
|
381
|
+
next.skill_profiles = profiles;
|
|
382
|
+
if (problems.length > 0) next.configuration_errors = problems;
|
|
383
|
+
} else if (project.skill_profiles !== void 0) {
|
|
384
|
+
next.skill_profiles = project.skill_profiles;
|
|
317
385
|
}
|
|
318
386
|
if (project.commit !== void 0) next.commit = project.commit;
|
|
319
387
|
if (project.artifacts !== void 0) next.artifacts = project.artifacts;
|
|
@@ -485,6 +553,7 @@ function loadWorkflow(parsed) {
|
|
|
485
553
|
const project = {
|
|
486
554
|
flow,
|
|
487
555
|
...typeof parsed.stage_bindings === "object" && parsed.stage_bindings !== null && !Array.isArray(parsed.stage_bindings) ? { stage_bindings: parsed.stage_bindings } : {},
|
|
556
|
+
...typeof parsed.skill_profiles === "object" && parsed.skill_profiles !== null && !Array.isArray(parsed.skill_profiles) ? { skill_profiles: parsed.skill_profiles } : {},
|
|
488
557
|
...typeof parsed.commit === "object" && parsed.commit !== null && !Array.isArray(parsed.commit) ? { commit: parsed.commit } : {},
|
|
489
558
|
...Array.isArray(parsed.artifacts) ? { artifacts: parsed.artifacts } : {},
|
|
490
559
|
...typeof parsed.review_depth === "string" ? { review_depth: parsed.review_depth } : {},
|