@godv61/dsh-task-engine 0.22.7 → 0.23.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/.p0-test.mjs +739 -748
- package/.resource-test.mjs +133 -0
- package/.workflow-test.mjs +234 -0
- package/LICENSE +21 -0
- package/README.md +110 -207
- package/cordis.patch.yml +10 -10
- package/defaults/eng.json +10 -10
- package/docs/CHANGELOG.md +185 -0
- package/docs/README.md +27 -0
- package/docs/assets/workflow-banner.svg +29 -0
- package/docs/configuration.md +49 -0
- package/docs/development.md +53 -0
- package/docs/faq.md +43 -0
- package/docs/getting-started.md +51 -0
- package/docs/listing/godv61__dsh-task-engine.yml +6 -0
- package/docs/listing/submission.md +9 -0
- package/docs/manual.html +391 -382
- package/docs/release-0.23.0.md +32 -0
- package/docs/release-0.23.1.md +58 -0
- package/docs/resource-install.md +62 -0
- package/docs/roadmap.md +33 -0
- package/docs/testing/0.23.0//346/265/213/350/257/225/346/211/247/350/241/214/350/256/260/345/275/225.md +189 -0
- package/docs/testing/0.23.0//346/265/213/350/257/225/346/212/245/345/221/212.md +42 -0
- package/docs/testing/0.23.1//346/265/213/350/257/225/346/212/245/345/221/212.md +34 -0
- package/docs/testing/0.23.1//350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/346/230/216/347/273/206.md +41 -0
- package/docs/workflow-regression.md +36 -0
- package/hooks/commit-msg +4 -4
- package/lib/client.js +555 -868
- package/lib/client.js.map +4 -4
- package/lib/controller.d.ts +19 -0
- package/lib/controller.js +86 -137
- package/lib/controller.js.map +1 -1
- package/lib/dev-task.js +190 -37
- package/lib/dev-task.js.map +1 -1
- package/lib/engine.d.ts +19 -1
- package/lib/engine.js +5 -0
- package/lib/engine.js.map +1 -1
- package/lib/resource-import.d.ts +21 -0
- package/lib/resource-import.js +210 -0
- package/lib/resource-import.js.map +1 -0
- package/lib/resource-types.d.ts +25 -0
- package/lib/resource-types.js +2 -0
- package/lib/resource-types.js.map +1 -0
- package/lib/shipped-skills.js +2 -1
- package/lib/shipped-skills.js.map +1 -1
- package/lib/skill-audit.d.ts +16 -0
- package/lib/skill-audit.js +60 -0
- package/lib/skill-audit.js.map +1 -0
- package/lib/workflows.js +4 -4
- package/lib/workflows.js.map +1 -1
- package/lib/workspace-access.d.ts +6 -0
- package/lib/workspace-access.js +13 -0
- package/lib/workspace-access.js.map +1 -0
- package/package.json +95 -85
- 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 +5 -5
- package/rules/security-redlines.md +5 -5
- package/skills/code-commit/SKILL.md +13 -13
- package/skills/code-implement/SKILL.md +23 -22
- package/skills/code-review/SKILL.md +13 -13
- package/skills/code-verify/SKILL.md +16 -11
- package/skills/eng-delivery/SKILL.md +38 -34
- package/skills/requirement-analysis/SKILL.md +15 -15
- package/skills/solution-design/SKILL.md +18 -15
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# 0.23.0 修改清单与发布说明
|
|
2
|
+
|
|
3
|
+
[← 文档导航](README.md)
|
|
4
|
+
|
|
5
|
+
## 本次实现
|
|
6
|
+
|
|
7
|
+
| 分类 | 问题 | 处理 |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| 安装 | 目录逐级浏览步骤多,Web host 原生选择器可能无 provider | 默认使用浏览器系统文件选择器,技能选目录,规则选 .md;高级主机路径入口保留 |
|
|
10
|
+
| 安装 | 写入前看不清目标与内容 | 预览名称、正文、数量、大小、路径、同名冲突,确认后写入 |
|
|
11
|
+
| 安全 | 路径、体积、链接与失败残留处理分散 | 公用导入模块,全包校验、摘要绑定、独占写入、失败清理 |
|
|
12
|
+
| 安全 | client workspace 只有路径黑名单 | 优先查询 Harness workspaceRegistry;未知路径拒绝,旧 host 使用已有严格注册策略 |
|
|
13
|
+
| 并发 | 读取内容后才读取文件版本仍可能覆盖并发修改 | 先读版本再读内容,逻辑 revision 和文件版本共同检查 |
|
|
14
|
+
| UI | 技能/规则两套重复界面,状态不统一 | 共用资源管理器,卡片、搜索、来源筛选、目标说明、加载/错误/成功状态 |
|
|
15
|
+
| UI | 删除动作不够明确 | 显示实际目标和永久删除说明,提供保留按钮 |
|
|
16
|
+
| UI | 弹窗键盘操作不完整 | Escape、焦点限制、关闭后恢复焦点 |
|
|
17
|
+
| UI | 台账难定位任务 | 标题/任务/分支搜索,风险/阶段筛选,验证/审核/更新时间 |
|
|
18
|
+
| 错误 | 保存和台账读取失败提示不全 | 捕获传输与校验错误、保存防重、读失败可见;损坏记录报错 |
|
|
19
|
+
| 文档 | 历史文案夸大防篡改保证 | 明确 hash、CAS、hook、workspace registry 各自能力与限制 |
|
|
20
|
+
| 发布 | 仓库与包元信息不完整 | repository/homepage/bugs、MIT LICENSE、Windows CI、发布包行为验证 |
|
|
21
|
+
|
|
22
|
+
## 删减与保留
|
|
23
|
+
|
|
24
|
+
删除重复技能/规则 UI 和旧目录复制实现;替换 14 条仅搜索复制器源码文本的旧断言。保留已有 Remote 安装方法以兼容旧客户端;保留高级主机目录导入和现有流程预设。未删除用户已有技能、规则、任务或流程配置。
|
|
25
|
+
|
|
26
|
+
## 后续建议
|
|
27
|
+
|
|
28
|
+
后续优先讨论可视化自定义流程、资源导入反馈和资源维护。详细范围见[功能规划](roadmap.md)。产品定位为个人本机工作台,会话级服务器隔离不列为当前版本必修项。
|
|
29
|
+
|
|
30
|
+
## 验证与发布
|
|
31
|
+
|
|
32
|
+
以[测试报告](testing/0.23.0/测试报告.md)记录实际结果。源代码与 npm 发布各自验证;GitHub CI 未完成时不能称已通过。市场 PR 只添加 `data/plugins/godv61__dsh-task-engine.yml`,按[贡献指南](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/blob/main/contributing.md)检查,npm 关联来自 package.json repository。
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# 0.23.1:真实项目回归后的流程修复
|
|
2
|
+
|
|
3
|
+
[← 文档导航](README.md)
|
|
4
|
+
|
|
5
|
+
本版集中修复真实开发中暴露的资源来源、技能执行、审核记录、验证与提交问题,并改善错误提示。仍使用三个预设流程,不包含自定义流程编排。
|
|
6
|
+
|
|
7
|
+
## 问题与处理
|
|
8
|
+
|
|
9
|
+
| 问题 | 处理方法 | 约束性质 |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| 项目与个人同名技能被覆盖,界面来源误标 | 管理目录保留全部来源,绑定按名称去重;项目同名规则优先于个人规则 | 代码修复;技能正文最终解析由 Harness 负责 |
|
|
12
|
+
| Windows 的 BOM/CRLF 导致内置技能加载失败 | 技能注册、列表和正文读取兼容两种格式 | 代码修复及安装包测试 |
|
|
13
|
+
| 技能只披露而不执行,终态技能来不及参与验收 | 新任务检查成功的 skill 工具事件;附加技能登记真实命令回执;终态绑定在进入完成前执行 | 流转和提交门禁 |
|
|
14
|
+
| 内置技能被误当附加技能,重复登记导致多余阻塞 | status 列出 command_receipts_required;可选内置回执不升级为额外门禁 | 代码修复 |
|
|
15
|
+
| 更新实施项丢失审核;模型重写旧标题使审核消失 | 同 ID/标题保留审核,已有项可省略标题;已审核项改名须明确重开 | 写入前校验 |
|
|
16
|
+
| 子代理开工后任务项仍显示待办 | dispatch 提前登记并激活唯一进行项;重派清除旧审核 | 计划记录,不能证明子代理实际执行 |
|
|
17
|
+
| 验证未继承调用会话的权限与取消状态 | 验证传递会话沙箱策略、取消信号,保存退出码、超时和沙箱结果 | 代码修复 |
|
|
18
|
+
| 审核后错过提交窗口,完成缺少实际 Git 证据 | 新标准流程 v2 审核后提交;核对真实 HEAD、摘要及文件,回写哈希后完成 | 新任务门禁 |
|
|
19
|
+
| 文件变化后仍沿用旧测试结论 | 回执关联声明文件摘要,变化后重验 | 流转和提交门禁 |
|
|
20
|
+
| status 显示允许提交,实际被过期回执拒绝 | status.commit.allowed 同时检查技能与回执,evidence_blockers 列出过期原因 | 状态与执行校验一致 |
|
|
21
|
+
| 模型发明记录字段,需求写入被拒绝 | status.artifact_requirements 主动列出当前阶段允许字段和缺项;错误附恢复说明且不保存 | 保持严格校验,改善可发现性 |
|
|
22
|
+
| 小修正也强制派子代理,失败后重复换命令试探 | 小修正允许主代理实施,仍需审核与验证;权限拒绝走正式审批或报告阻塞 | 技能指引,不是硬拦截 |
|
|
23
|
+
| 猜测接口字段、混淆模拟测试与真实联调 | 设计核对原始契约与实际组件;报告区分对象、执行状态及证据来源 | 技能指引和人工审核 |
|
|
24
|
+
|
|
25
|
+
## 新的状态信息
|
|
26
|
+
|
|
27
|
+
标准流程在需求阶段返回的字段提示示例:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"artifact_requirements": [
|
|
32
|
+
{
|
|
33
|
+
"id": "requirement",
|
|
34
|
+
"name": "需求说明",
|
|
35
|
+
"fields": ["scope", "acceptance_criteria"],
|
|
36
|
+
"missing_fields": ["scope", "acceptance_criteria"]
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
字段来自任务冻结流程,不硬编码同一套字段给所有预设。例如敏捷流程只有 scope;疑问和技术取舍写在已有字段正文,不增加字段名。无记录要求的阶段返回空列表。查询不会更改台账。
|
|
43
|
+
|
|
44
|
+
`legal_next` 是流程图中的候选去向,不表示门禁已经通过。`commit.allowed` 是阶段、技能和回执层面的提交资格;实际 commit 仍会检查此次输入的文件范围、摘要及所回写的 Git 证据。
|
|
45
|
+
|
|
46
|
+
## 验证结果与边界
|
|
47
|
+
|
|
48
|
+
自动化及安装包结果见 [0.23.1 测试说明](testing/0.23.1/测试报告.md)。候选版 rc.3 在一项真实需求中完成了需求/方案审批、8个实施项双阶段审核、测试技能执行、真实验证和本地提交回写。rc.5 与本次字段提示修复有定向回归及包验证,未再次执行整轮真实需求。
|
|
49
|
+
|
|
50
|
+
该实机过程包含观察方纠正契约、复现异步缺陷和修订报告的干预,不能称为完全自主交付。业务结构树真实联调仍有环境与请求差异待核实,不能用插件本地闭环证明业务端到端可用。
|
|
51
|
+
|
|
52
|
+
以下问题不由本版解决:Harness 内的文件删除权限限制、同步子代理反馈传播、模型服务鉴权/额度、旧业务项目的 Node/webpack 和测试运行器兼容问题。插件保留失败证据并指导正式恢复,不修改宿主权限系统或模型凭证。
|
|
53
|
+
|
|
54
|
+
命令退出码成功不证明覆盖充分;本地记录不是防篡改存储;声明文件摘要不涵盖数据库、远程服务和未声明文件。报告准确性与代码质量仍需审核。
|
|
55
|
+
|
|
56
|
+
## 升级与后续重跑
|
|
57
|
+
|
|
58
|
+
升级安装后重启 Harness。既有任务沿用冻结流程及原执行约定,不自动迁移到新标准流程;新的执行证据门禁用于带 execution_version=1 的任务。需要比较插件效果时,归档上一轮任务和业务差异,在独立测试项目中将本需求改动恢复到同一基线,再用新会话完整重跑。保留插件修复及历轮证据,不能为重跑无差别清理用户文件。
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# 技能与规则安装
|
|
2
|
+
|
|
3
|
+
[← 文档导航](README.md)
|
|
4
|
+
|
|
5
|
+
技能用于复用工作方法,规则用于描述项目约定。打开工作台后,先选择目标工作区,再进入“技能”或“规则”。
|
|
6
|
+
|
|
7
|
+
## 安装四步
|
|
8
|
+
|
|
9
|
+
1. **选择资源**:点“安装技能”选择文件夹;点“安装规则”选择一个 `.md` 文件。
|
|
10
|
+
2. **检查预览**:查看名称、正文、文件数、体积、目标路径与同名冲突。
|
|
11
|
+
3. **选择范围**:选择项目或个人,改变范围后会重新预览。
|
|
12
|
+
4. **确认安装**:成功后列表刷新,再到“流程配置”把资源挂到对应阶段。
|
|
13
|
+
|
|
14
|
+
预览不写入目标目录。已有同名资源时拒绝覆盖;请先检查现有内容,或给新资源使用不同名称。
|
|
15
|
+
|
|
16
|
+
## 准备文件
|
|
17
|
+
|
|
18
|
+
技能文件夹中需要 UTF-8 编码的 `SKILL.md`,frontmatter 包含单行 `name` 和 `description`。名称使用小写字母、数字和连字符,例如 `code-check`。脚本、模板和二进制附件可与清单一同安装。
|
|
19
|
+
|
|
20
|
+
规则是一个 UTF-8 编码的 Markdown 文件,名称来自文件名,使用同样的命名规则,例如 `code-check.md`。支持 BOM 与 CRLF;其他编码请先转换。安装不会执行脚本。
|
|
21
|
+
|
|
22
|
+
## 选择存放位置
|
|
23
|
+
|
|
24
|
+
| 范围 | 技能 | 规则 |
|
|
25
|
+
| :--- | :--- | :--- |
|
|
26
|
+
| 项目 | 工作区 `.dsh/skills` | 工作区 `.dsh/rules` |
|
|
27
|
+
| 个人 | `$DSH_HOME/skills` | `$DSH_HOME/rules` |
|
|
28
|
+
|
|
29
|
+
`DSH_HOME` 默认是用户主目录下的 `.dsh`。删除确认框显示实际路径;确认删除后不经过回收站。内置资源只读,项目和个人资源可以查看、编辑和删除。
|
|
30
|
+
|
|
31
|
+
## 格式与大小限制
|
|
32
|
+
|
|
33
|
+
| 项目 | 上限 |
|
|
34
|
+
| :--- | ---: |
|
|
35
|
+
| 技能文件数量 | 1,000 |
|
|
36
|
+
| 总体积 | 100 MB |
|
|
37
|
+
| 单文件 | 20 MB |
|
|
38
|
+
| 相对目录深度 | 20 层 |
|
|
39
|
+
| SKILL.md 或规则正文 | 1 MB |
|
|
40
|
+
|
|
41
|
+
常见缓存目录会自动排除,包括 `node_modules`、`.git`、`__pycache__`、`.venv`、`venv`、`.cache` 和 `.DS_Store`。不接受越级路径、Windows ADS、保留名称、大小写重名以及文件/目录冲突。
|
|
42
|
+
|
|
43
|
+
## 安装失败时
|
|
44
|
+
|
|
45
|
+
| 提示或现象 | 处理方式 |
|
|
46
|
+
| :--- | :--- |
|
|
47
|
+
| 缺少 SKILL.md 或有多个技能 | 直接选择一个技能的根文件夹。 |
|
|
48
|
+
| 名称无效 | 修改源清单的 name 或规则文件名,再重新选择。 |
|
|
49
|
+
| 同名冲突 | 取消安装,检查现有资源;需要共存时使用不同名称。 |
|
|
50
|
+
| 超过限制 | 移除不需要的构建产物与大文件,再重新选择。 |
|
|
51
|
+
| 预览后内容或目标变化 | 重新预览后再确认。 |
|
|
52
|
+
|
|
53
|
+
确认时会重新校验内容和目标摘要,并使用独占创建避免覆盖。技能写入中途失败时,会清理本次新建的技能目录。
|
|
54
|
+
|
|
55
|
+
<details>
|
|
56
|
+
<summary>高级:主机目录模式与上传限制</summary>
|
|
57
|
+
|
|
58
|
+
系统选择器读取浏览器所在电脑的文件;高级目录模式读取 Harness 进程所在电脑的目录。本机个人使用时通常是同一台电脑。主机扫描拒绝符号链接、junction 和特殊文件;浏览器文件 API 不提供源链接元数据。
|
|
59
|
+
|
|
60
|
+
上传内容在内存中编码、校验。100 MB 是代码限制,不是已经完成大包和并发压力测试的容量承诺;分块、进度和取消见[功能规划](roadmap.md)。
|
|
61
|
+
|
|
62
|
+
</details>
|
package/docs/roadmap.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 功能规划
|
|
2
|
+
|
|
3
|
+
[← 文档导航](README.md)
|
|
4
|
+
|
|
5
|
+
本页记录讨论中的方向,不代表已发布功能。当前 npm 版本为 0.23.0;实现范围在开始编码前确认。
|
|
6
|
+
|
|
7
|
+
## 优先讨论:自定义流程
|
|
8
|
+
|
|
9
|
+
三个内置流程继续开箱即用,用户可以复制成自己的模板,通过可视化表单配置:
|
|
10
|
+
|
|
11
|
+
| 能力 | 建议第一版范围 |
|
|
12
|
+
| :--- | :--- |
|
|
13
|
+
| 阶段 | 添加、重命名、删除和调整顺序。 |
|
|
14
|
+
| 条件 | 为阶段设置人工确认、实施完成、验证、审核或必填产物。 |
|
|
15
|
+
| 资源 | 自由添加、替换和移除阶段技能/规则。 |
|
|
16
|
+
| 产物 | 配置名称与必填字段。 |
|
|
17
|
+
| 提交 | 配置提交阶段、方式、格式与文件范围要求。 |
|
|
18
|
+
| 复用 | 保存到项目,支持配置导入/导出。 |
|
|
19
|
+
|
|
20
|
+
建议采用左侧阶段列表、右侧配置、底部流程预览。第一版以顺序流程为主;分支、循环和并行需要单独设计证据失效和任务恢复逻辑。
|
|
21
|
+
|
|
22
|
+
运行中的任务保持原流程快照。多次验证、审核和人工确认应绑定到各自阶段,不能自动复用前一个阶段的通过状态。配置保存还应保留 verify_command 等已有项目字段。
|
|
23
|
+
|
|
24
|
+
## 后续体验方向
|
|
25
|
+
|
|
26
|
+
- 资源导入:文件选择取消、大包进度、分块上传与取消。
|
|
27
|
+
- 资源维护:来源与版本记录、升级差异预览、备份和恢复。
|
|
28
|
+
- 工作台:未保存内容保护、台账扩展、语言与可访问性完善。
|
|
29
|
+
- 项目展示:真实工作台截图、案例和插件市场收录。
|
|
30
|
+
|
|
31
|
+
## 产品范围
|
|
32
|
+
|
|
33
|
+
本项目服务本机个人开发工作台。多用户服务器的会话权限架构不列为当前版本的必修项。日常改进优先解决工作区目标清晰、文件误操作、任务连续性和操作反馈。
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# 0.23.0 测试执行记录
|
|
2
|
+
|
|
3
|
+
日期:2026-09-15。Windows,Node 22.22.3,npm 10.9.8;插件基线 7f13fc6 加本次改动;Harness 源码 d347e70390(0.1.3-alpha.1),web profile,Codex 内置 Chromium 浏览器。
|
|
4
|
+
|
|
5
|
+
## 执行命令
|
|
6
|
+
|
|
7
|
+
`npm run build`、`npm run typecheck`、`npm test` 均通过。为生成逐条记录,执行 `$env:DSH_TEST_DETAILS='1'; node .p0-test.mjs` 以及 `node --test .resource-test.mjs`;以下表由这次输出生成。
|
|
8
|
+
|
|
9
|
+
`npm run verify:package` 通过:npm pack、解包、8 个必备文件、排除源码与构建脚本、干净项目 npm 安装、主入口导入、客户端 ModuleLoader 注册、包内 P0 与资源测试、CLI 语法,共 18 个检查点。包内测试与源码测试重复覆盖,不另计为独立用例。该脚本的 CLI 检查仅检查语法,不能替代实际 CLI 启用流程。
|
|
10
|
+
|
|
11
|
+
## 实机记录
|
|
12
|
+
|
|
13
|
+
| 编号 | 操作/测试数据 | 实际结果 | 状态 |
|
|
14
|
+
|---|---|---|---|
|
|
15
|
+
| UI-01 | 最终 tarball 经 dsh plugin --profile web add 安装并重启 3080 | 工作台加载,主机注册工作区读取成功 | 通过 |
|
|
16
|
+
| UI-02 | 安装 codex-ui-review-skill 目录 | 系统 filechooser 接收目录,预览 2 文件/162 B,正文不含 frontmatter | 通过 |
|
|
17
|
+
| UI-03 | 预览后、确认前检查目标 | Test-Path 为 False;预览没有落盘 | 通过 |
|
|
18
|
+
| UI-04 | 确认项目技能安装 | 成功提示与列表更新,附件 SHA-256 与源相同 | 通过 |
|
|
19
|
+
| UI-05 | 重复选择同名技能 | 冲突提示出现,确认安装按钮 disabled | 通过 |
|
|
20
|
+
| UI-06 | 安装 codex-ui-review-rule.md,切换个人范围 | 预览目标切换为个人规则目录,1 文件/26 B,确认后落盘并显示个人来源 | 通过 |
|
|
21
|
+
| UI-07 | 搜索测试技能,打开删除框后选择保留 | 匹配结果正确,目标/永久删除说明可见,取消未删除 | 通过(本次早期同版构建) |
|
|
22
|
+
| UI-08 | 安装弹窗按 Escape | 弹窗关闭,返回工作台 | 通过 |
|
|
23
|
+
| UI-09 | 台账读取既有任务,选择高风险 | 显示任务验证/审核结果;无匹配时显示调整筛选提示 | 通过 |
|
|
24
|
+
| UI-10 | 420×850 视口查看技能页 | 卡片单列、标签与工作区选择换行、按钮可见,随后恢复视口 | 通过 |
|
|
25
|
+
| UI-11 | 流程配置页读取 | 显示有效标准预设与绑定,不改写用户配置 | 通过 |
|
|
26
|
+
|
|
27
|
+
## 自动化明细
|
|
28
|
+
|
|
29
|
+
P0 是 125 条验收断言,包含部分历史源码文本断言,不等同于 125 个独立端到端场景。资源集合包含 18 个 Node test 用例。P0 没有每条耗时记录;未伪造时间。
|
|
30
|
+
|
|
31
|
+
| 用例标识 | 状态 | 耗时 | 失败/错误原因 | 证据 |
|
|
32
|
+
|---|---|---:|---|---|
|
|
33
|
+
| P0-1:standard satisfies high-risk capabilities | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
34
|
+
| P0-2:agile lacks a high-risk capability | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
35
|
+
| P0-3:minimal lacks a high-risk capability | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
36
|
+
| P0-4:preset carries a version | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
37
|
+
| P0-5:unknown flow returns UNKNOWN_FLOW | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
38
|
+
| P0-6:known flow list is surfaced | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
39
|
+
| P0-7:emptying a stage override keeps the core rule | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
40
|
+
| P0-8:newTask stores the frozen snapshot | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
41
|
+
| P0-9:newTask starts at the frozen start stage | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
42
|
+
| P0-10:high_risk on minimal is rejected (got: high_risk task cannot run on flow "minimal" — it lacks the required capabilities (verification_gate, file_scope, review_gate). Use the standard flow or lower the task risk.) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
43
|
+
| P0-11:standard create starts at 需求评审 | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
44
|
+
| P0-12:status re-reads the frozen snapshot | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
45
|
+
| P0-13:gates come from the frozen standard flow, not the live minimal flow | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
46
|
+
| P0-14:create on an unknown flow fails closed (got: invalid .dsh/eng.json — fix the project config first: | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
47
|
+
| P0-15:eng.json without a flow field is a config error (got: invalid .dsh/eng.json — fix the project config first: | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
48
|
+
| P0-16:inspect on empty project prompts a scan | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
49
|
+
| P0-17:propose previews without writing | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
50
|
+
| P0-18:propose writes nothing | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
51
|
+
| P0-19:apply writes the file | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
52
|
+
| P0-20:apply persisted the draft | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
53
|
+
| P0-21:propose returns the existing-file hash when the file exists | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
54
|
+
| P0-22:apply without existing_hash on an existing file is rejected (got: init apply requires existing_hash returned by propose when AGENTS.md exists — re-propose to obtain it) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
55
|
+
| P0-23:apply with a stale existing_hash is rejected (TOCTOU) (got: AGENTS.md changed since propose (existing_hash mismatch) — re-inspect and re-propose before overwriting) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
56
|
+
| P0-24:apply without overwrite on an existing file is rejected (got: AGENTS.md already exists (2 lines) and is protected. Inspect via init phase=inspect, merge, then resubmit with phase=apply plus overwrite: true (human approval).) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
57
|
+
| P0-25:overwrite requires an approval service (got: overwriting the protected AGENTS.md requires human approval, but the approval service is unavailable) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
58
|
+
| P0-26:apply without expected_hash is rejected (got: init apply requires expected_hash returned by propose — re-propose to obtain it) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
59
|
+
| P0-27:bundled security-redlines exists as expected | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
60
|
+
| P0-28:security-redlines is disclosed at the start stage | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
61
|
+
| P0-29:a project shadow of a core rule is ignored | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
62
|
+
| P0-30:the bundled core rule body wins over a shadow | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
63
|
+
| P0-31:inspect reads the session workspace AGENTS.md | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
64
|
+
| P0-32:inspect does not read the harness repo AGENTS.md | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
65
|
+
| P0-33:task record lands in the session workspace | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
66
|
+
| P0-34:task record does not land in the backend base | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
67
|
+
| P0-35:cross-stage duplicate artifact id is rejected | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
68
|
+
| P0-36:recording an artifact at a non-owning stage is rejected (got: artifact "design" belongs to stage "设计", but the task is at "需求评审" — record it at its owning stage) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
69
|
+
| P0-37:high_risk with text-only evidence is blocked (no command receipt) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
70
|
+
| P0-38:high_risk with an exit-0 receipt passes the verified gate | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
71
|
+
| P0-39:high_risk with a non-zero exit receipt is blocked | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
72
|
+
| P0-40:high_risk with a timed-out receipt is blocked | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
73
|
+
| P0-41:high_risk with an aborted receipt is blocked | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
74
|
+
| P0-42:standard summary yields its task id | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
75
|
+
| P0-43:item-label summary yields its task id | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
76
|
+
| P0-44:non-matching summary yields no task id | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
77
|
+
| P0-45:pattern-less flow yields no task id | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
78
|
+
| P0-46:task record and eng.json do not violate file scope | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
79
|
+
| P0-47:an out-of-scope code file is still flagged | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
80
|
+
| P0-48:hook disables git octal path quoting | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
81
|
+
| P0-49:hook reads NUL-separated raw-byte paths | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
82
|
+
| P0-50:hook includes deletions and type changes in the scope check | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
83
|
+
| P0-51:hook checks the task frozen flow snapshot | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
84
|
+
| P0-52:hook extracts the task id independent of the live config | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
85
|
+
| P0-53:hook bundles the single source (workflows.ts), not a hand mirror | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
86
|
+
| P0-54:workbench writeInit refuses to overwrite without an explicit intent | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
87
|
+
| P0-55:writeInit request carries an overwrite field | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
88
|
+
| P0-56:node marker resolves to node | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
89
|
+
| P0-57:root discovery climbs to the package.json directory | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
90
|
+
| P0-58:pom.xml resolves to java | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
91
|
+
| P0-59:go.mod resolves to go | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
92
|
+
| P0-60:Cargo.toml resolves to rust | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
93
|
+
| P0-61:requirements.txt resolves to python | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
94
|
+
| P0-62:empty tree reports unknown type | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
95
|
+
| P0-63:root discovery falls back to the start directory | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
96
|
+
| P0-64:mixed tree reports unknown, never a silent single-language guess | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
97
|
+
| P0-65:root discovery stops at the git repository | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
98
|
+
| P0-66:node default verify command | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
99
|
+
| P0-67:java default verify command | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
100
|
+
| P0-68:go default verify command | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
101
|
+
| P0-69:unknown type has no default command | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
102
|
+
| P0-70:governance files are recognized as present | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
103
|
+
| P0-71:absent governance files are not listed | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
104
|
+
| P0-72:init write escaping the root is rejected (got: write target D:\outside.txt escapes the project root D:\repo) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
105
|
+
| P0-73:absolute target outside the root is rejected (got: write target C:\elsewhere\x.txt escapes the project root D:\repo) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
106
|
+
| P0-74:hook bundles the risk policy table (single source) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
107
|
+
| P0-75:hook requires high_risk before touching sensitive paths | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
108
|
+
| P0-76:project rules list from .dsh/rules/*.md | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
109
|
+
| P0-77:project skills list only dirs carrying SKILL.md | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
110
|
+
| P0-78:hashConfig is a deterministic sha256 | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
111
|
+
| P0-79:editing the frozen config changes the hash | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
112
|
+
| P0-80:status on a tampered snapshot is rejected (got: task "HASH-1" snapshot hash mismatch — the frozen workflow config was edited after creation. Restore the original record or recreate the task; the gate refuses to run on a tampered snapshot.) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
113
|
+
| P0-81:hook reuses the single hashConfig source | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
114
|
+
| P0-82:hook bundles the sha256 snapshot check | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
115
|
+
| P0-83:verify_hook reports an absent hook | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
116
|
+
| P0-84:verify_hook passes on the bundled hook | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
117
|
+
| P0-85:verify_hook rejects a tampered hook (got: hook integrity FAILED — .git/hooks/commit-msg differs from the bundled gate; reinstall with install_hook) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
118
|
+
| P0-86:downgrade without an approval service is rejected (got: downgrading a high_risk task requires human approval, but the approval service is unavailable) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
119
|
+
| P0-87:same-risk set_risk is a no-op | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
120
|
+
| P0-88:approved downgrade succeeds | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
121
|
+
| P0-89:downgrade is recorded in the audit trail | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
122
|
+
| P0-90:fresh task shows no bindings drift | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
123
|
+
| P0-91:create records the bundled-rules fingerprint | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
124
|
+
| P0-92:verify falls back to the eng.json command and fails loud without a shell service (got: verify 带 command 需要 host 提供 shell 服务(用于跑真实验证命令),但当前未挂载) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
125
|
+
| P0-93:verify falls back to the language default (node → npm test) and fails loud without a shell service (got: verify 带 command 需要 host 提供 shell 服务(用于跑真实验证命令),但当前未挂载) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
126
|
+
| P0-94:unknown-type verify keeps the legacy self-reported path | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
127
|
+
| P0-95:two tasks in one repo advance independently | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
128
|
+
| P0-96:propose returns the content hash | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
129
|
+
| P0-97:apply with a mismatched hash is rejected (got: init content changed since propose (expected_hash mismatch) — resubmit the identical proposed content) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
130
|
+
| P0-98:apply with the matching hash writes the file | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
131
|
+
| P0-99:project binding dir (.dsh/rules, .dsh/skills) stays committable by normal tasks | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
132
|
+
| P0-100:env files remain sensitive | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
133
|
+
| P0-101:dev_task writes carry the sandbox mode (default workspace-write) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
134
|
+
| P0-102:dev_task writes carry the session workspace root so in-workspace paths are never misjudged as out-of-root | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
135
|
+
| P0-103:escalation without a justification is rejected (got: invalid escalation: sandbox_permissions requires a justification) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
136
|
+
| P0-104:approved escalation upgrades the per-call write mode | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
137
|
+
| P0-105:escalation without an approval service fails closed (got: sandbox escalation to danger-full-access requires human approval, but the approval service is unavailable) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
138
|
+
| P0-106:raising risk on a minimal flow is rejected (same gate as create) (got: cannot raise risk to high_risk on flow "minimal" — it lacks the required capabilities (verification_gate, file_scope, review_gate). Use the standard flow.) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
139
|
+
| P0-107:raising risk on the standard flow succeeds | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
140
|
+
| P0-108:remote rejects non-absolute workspace paths | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
141
|
+
| P0-109:remote rejects system-wide roots | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
142
|
+
| P0-110:bare verify ran the default command | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
143
|
+
| P0-111:verify ran in the recorded project root, not the session cwd | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
144
|
+
| P0-112:receipt binds the recorded project root | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
145
|
+
| P0-113:revision increments on every write | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
146
|
+
| P0-114:concurrent-write CAS guard is present | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
147
|
+
| P0-115:absolute workspace passes | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
148
|
+
| P0-116:trailing slash is normalized | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
149
|
+
| P0-117:relative path is rejected (got: task-engine: workspace path must be absolute: relative/path) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
150
|
+
| P0-118:system root is rejected (got: task-engine: path is not an allowed workspace: C:/Windows/system32) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
151
|
+
| P0-119:case variant of a system root is rejected (got: task-engine: path is not an allowed workspace: c:/windows) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
152
|
+
| P0-120:registered workspace passes under any case | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
153
|
+
| P0-121:unregistered workspace is rejected once the registry is active (got: task-engine: workspace not registered on this host: D:/other-project) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
154
|
+
| P0-122:strict mode keeps rejecting unregistered workspaces (got: task-engine: workspace not registered on this host: D:/still-unregistered) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
155
|
+
| P0-123:strict mode still admits registered workspaces | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
156
|
+
| P0-124:CAS rejects writes when version changes after the content read (got: task "CAS-RACE" changed concurrently (file version moved) — reload status and retry this operation) | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
157
|
+
| P0-125:CAS preserves the concurrent writer record | 通过 | 未单独计时 | 无 | P0 明细输出 |
|
|
158
|
+
| Import-1:preview has no filesystem side effects and reports exact bytes | 通过 | 11.0717 ms | 无 | Node TAP 输出 |
|
|
159
|
+
| Import-2:confirmed install preserves binary assets and refuses duplicates | 通过 | 8.0443 ms | 无 | Node TAP 输出 |
|
|
160
|
+
| Import-3:changed content and changed installation target invalidate preview | 通过 | 2.3299 ms | 无 | Node TAP 输出 |
|
|
161
|
+
| Import-4:path traversal, Windows ADS and reserved names are rejected | 通过 | 1.572 ms | 无 | Node TAP 输出 |
|
|
162
|
+
| Import-5:case-colliding filenames are rejected | 通过 | 1.3899 ms | 无 | Node TAP 输出 |
|
|
163
|
+
| Import-6:bundled names and ambiguous containers are rejected | 通过 | 0.8907 ms | 无 | Node TAP 输出 |
|
|
164
|
+
| Import-7:single-file rule accepts UTF-8 BOM and CRLF; empty rules are refused | 通过 | 3.1442 ms | 无 | Node TAP 输出 |
|
|
165
|
+
| Import-8:file and directory prefix conflicts fail during preview | 通过 | 0.7124 ms | 无 | Node TAP 输出 |
|
|
166
|
+
| Import-9:failed installation removes only its own incomplete directory | 通过 | 6.7741 ms | 无 | Node TAP 输出 |
|
|
167
|
+
| Import-10:host directory scanner resolves one container child and excludes caches | 通过 | 5.6005 ms | 无 | Node TAP 输出 |
|
|
168
|
+
| Import-11:host scanner rejects symlink or junction source paths | 通过 | 2.4246 ms | 无 | Node TAP 输出 |
|
|
169
|
+
| Import-12:deep directories and oversized files fail before installation | 通过 | 21.9509 ms | 无 | Node TAP 输出 |
|
|
170
|
+
| Import-13:invalid UTF-8, encoding and absent source directories report errors | 通过 | 1.2419 ms | 无 | Node TAP 输出 |
|
|
171
|
+
| Import-14:registered host workspace wins over client spelling; unknown paths fail | 通过 | 2.6087 ms | 无 | Node TAP 输出 |
|
|
172
|
+
| Import-15:legacy host retains its explicit workspace policy | 通过 | 0.214 ms | 无 | Node TAP 输出 |
|
|
173
|
+
| Import-16:host registry failures are not downgraded to legacy permissions | 通过 | 0.1672 ms | 无 | Node TAP 输出 |
|
|
174
|
+
| Import-17:ledger shows absent storage as empty and propagates access errors | 通过 | 18.696 ms | 无 | Node TAP 输出 |
|
|
175
|
+
| Import-18:ledger rejects malformed records instead of pretending there are no tasks | 通过 | 0.3443 ms | 无 | Node TAP 输出 |
|
|
176
|
+
|
|
177
|
+
## 缺陷与复测
|
|
178
|
+
|
|
179
|
+
首次大文件边界测试触发 Base64 正则回溯导致 RangeError;已改用 Buffer 解码后规范编码比对,本次 Import-12 通过。目录中同时含文件 a 与 a/b 的输入现于预览拒绝(Import-8);磁盘故障回滚通过独立写入故障注入覆盖(Import-9),且验证兄弟文件保留。任务 CAS 测试在读取期间注入另一写者,拒绝覆盖并保留并发内容。
|
|
180
|
+
|
|
181
|
+
## 数据与环境
|
|
182
|
+
|
|
183
|
+
单元测试使用 mkdtemp 独立临时目录并在 teardown 删除;文件写入故障注入在 finally 恢复 fs 方法。实机只添加 codex-ui-review-skill 与 codex-ui-review-rule.md 两个一次性测试资源,清理结果见报告。用户原有 software-testing 资源和任务未修改。
|
|
184
|
+
|
|
185
|
+
profile 的 pnpm peers check 报缺少五个 Harness peer;实际运行由 Harness 源码环境提供,工作台功能通过。干净 npm 项目自动解析 peer 安装通过。显式添加已实测 0.1.3-alpha.1 预发布分支,避免 semver 将其排除。没有通过关闭依赖安全策略来安装。
|
|
186
|
+
|
|
187
|
+
## 首轮 CI 差异与修复
|
|
188
|
+
|
|
189
|
+
GitHub run 34950017436:Node 22 与 24 的安装、类型检查和 npm test 均通过;Node 24 发布包脚本错误地把测试成功输出判为失败,Node 22 发布包任务随后被矩阵 fail-fast 取消。原因是检查脚本依赖 `# fail 0`,却没有固定 Node test reporter,Node 24 默认输出格式与本机不同。修复为显式 `--test-reporter=tap`;矩阵关闭 fail-fast 以保留各版本完整结果,没有跳过测试或降低通过条件。复验状态见 GitHub Actions。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# 0.23.0 测试报告
|
|
2
|
+
|
|
3
|
+
本地发布候选验证通过。范围为资源导入、工作台交互、工作区注册路径、任务并发写入和 npm 包入口;不代表完成所有模型驱动的需求到提交流程、全部平台验证或安全认证。
|
|
4
|
+
|
|
5
|
+
环境与逐条结果见[测试执行记录](测试执行记录.md)。
|
|
6
|
+
|
|
7
|
+
| 验证集 | 已执行 | 通过 | 失败 | 跳过 |
|
|
8
|
+
|---|---:|---:|---:|---:|
|
|
9
|
+
| P0 验收断言(含部分静态断言) | 125 | 125 | 0 | 0 |
|
|
10
|
+
| Node 行为用例 | 18 | 18 | 0 | 0 |
|
|
11
|
+
| 实机交互场景 | 11 | 11 | 0 | 0 |
|
|
12
|
+
| 发布包检查点 | 18 | 18 | 0 | 0 |
|
|
13
|
+
| 构建/host+client 类型检查命令 | 2 | 2 | 0 | 0 |
|
|
14
|
+
|
|
15
|
+
各组包含重复验证,不相加为独立测试总数。源码和实际安装包内的行为测试均通过。首次 Base64 大包测试发现并修复了栈溢出;最终无失败。
|
|
16
|
+
|
|
17
|
+
## 需求追踪
|
|
18
|
+
|
|
19
|
+
| 需求 | 证据 |
|
|
20
|
+
|---|---|
|
|
21
|
+
| 系统文件选择与项目/个人安装 | UI-02~06,Import-1~7 |
|
|
22
|
+
| 安装前校验、拒绝覆盖与失败清理 | Import-1~13,UI-03~05 |
|
|
23
|
+
| 工作区信任来源 | Import-14~16,UI-01 |
|
|
24
|
+
| CAS 竞态 | P0 明细中的读取期间并发写入/保留另一写者断言 |
|
|
25
|
+
| 窄屏、筛选与弹窗 | UI-07~11 |
|
|
26
|
+
| 损坏/不可读任务可见 | Import-17~18 |
|
|
27
|
+
| 真实 npm 包可安装、入口可用 | 发布包 18 个检查点 |
|
|
28
|
+
|
|
29
|
+
## 剩余限制
|
|
30
|
+
|
|
31
|
+
- 主机工作区注册不等于会话级授权;本地任务 JSON 没有签名。需要 Harness 调用上下文与可信存储支持才能完成多用户边界。
|
|
32
|
+
- 整包内存上传未做 100 MB 远程网关/并发压力测试;浏览器源符号链接不可辨识;未覆盖断电中断和恶意同权限进程抢改目录。
|
|
33
|
+
- 实机为 Windows/Chromium、当前 Harness 源码;没有执行 macOS/Linux、其他浏览器或真实模型从建任务到提交的全流程。本地 hook 不能替代服务端 CI 验证。
|
|
34
|
+
- 原生选择器取消、完整屏幕阅读器与深色主题尚未形成专门验收矩阵;全量语言字典、资源升级和备份属于后续建议。
|
|
35
|
+
- profile 缺少单独声明的 Harness peer 会产生警告;源码主机与干净 npm 安装验证都通过,不能推断所有第三方 profile 都兼容。
|
|
36
|
+
- GitHub Actions 与 npm 公网发布状态单独记录,不以本地成功代替。
|
|
37
|
+
|
|
38
|
+
## 清理与发布状态
|
|
39
|
+
|
|
40
|
+
实机技能附件与规则文件均核对 SHA-256 一致,两个一次性资源已清理并确认目标不存在;源码 fixture 留在评测工作目录,不进入发布仓库。源历史 163 个 blob 和当前待发布文件的常见凭据模式扫描无命中;模式扫描不保证发现所有形式的秘密。
|
|
41
|
+
|
|
42
|
+
完整修改与后续建议见[发布说明](../../release-0.23.0.md)。收录指南要求仓库创建满一天,申请材料已准备,提交与合并应分别确认。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# 0.23.1 发布验证
|
|
2
|
+
|
|
3
|
+
[← 发布说明](../../release-0.23.1.md)
|
|
4
|
+
|
|
5
|
+
日期:2026-09-16。对象:插件 0.23.1。此文记录插件验证,不等同业务项目端到端验收。
|
|
6
|
+
|
|
7
|
+
## 检查范围
|
|
8
|
+
|
|
9
|
+
| 检查 | 内容 | 状态 |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| 新字段提示回归 | 两个新增用例先失败,修复后通过;错误输入不写入台账,提示按冻结流程变化 | 通过 |
|
|
12
|
+
| 流程回归 | 15项:审核保留、标题保护、派工状态、任务发现、技能回执、沙箱透传、Git回写、过期提示、字段披露及技能来源/注册 | 通过 |
|
|
13
|
+
| host/client 类型检查 | 两个 TypeScript 编译面 | 通过 |
|
|
14
|
+
| P0 与资源测试 | 126项基础检查、18项资源测试 | 通过 |
|
|
15
|
+
| 安装包黑盒 | 打包、干净项目安装、入口导入、客户端注册、包内测试和启用脚本语法 | 通过 |
|
|
16
|
+
|
|
17
|
+
流程用例名称及断言位于包内 `.workflow-test.mjs`,资源用例位于 `.resource-test.mjs`,基础断言位于 `.p0-test.mjs`。发布前执行日志保留在发布工作区。`npm run typecheck` 与 `npm run verify:package` 均退出0,安装包检查包含实际安装后的包内测试。逐项运行明细见[自动化测试明细](自动化测试明细.md)。
|
|
18
|
+
|
|
19
|
+
## 新增用例覆盖
|
|
20
|
+
|
|
21
|
+
1. 当前需求阶段披露 scope/acceptance_criteria;返回准确缺项;未定义字段拒绝时整个记录保持不变;修正字段后可继续。
|
|
22
|
+
2. 敏捷流程仅披露 scope,设计阶段披露自身字段,无记录阶段返回空列表。字段提示从冻结配置读取,不改变历史任务。
|
|
23
|
+
|
|
24
|
+
新增测试在修复前均失败,避免只断言实现自身返回成功。状态查询一致性、真实提交、验证过期及失败技能等既有回归一并执行。
|
|
25
|
+
|
|
26
|
+
## 实机证据的适用范围
|
|
27
|
+
|
|
28
|
+
rc.3 在真实业务需求中走完同一任务的审批、8项实施审核、测试技能、真实命令验证、范围受控本地提交及哈希回写。新增文档后过期的验证和测试技能回执实际阻止过提交,重验后恢复。rc.5 的状态提示修复及本次字段披露有自动化证据;由于用户暂停业务重跑,没有本版完整业务重跑证据。
|
|
29
|
+
|
|
30
|
+
实机包含观察方干预,不算完全自主。业务结构树真实联调未通过;额外布局与虚拟滚动需求未实施。没有以这些未完成事项宣称产品业务全通过。
|
|
31
|
+
|
|
32
|
+
## 发布限制
|
|
33
|
+
|
|
34
|
+
仅已执行检查可标通过。包测试使用模拟宿主与干净安装,不能覆盖所有 Harness 版本、模型行为或共享部署权限场景。技能指引不能强制模型报告内容准确,所有完成结论仍须结合证据审查。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 0.23.1 自动化测试明细
|
|
2
|
+
|
|
3
|
+
执行日期:2026-09-16。命令:`node --test --test-reporter=tap .resource-test.mjs .workflow-test.mjs`。
|
|
4
|
+
|
|
5
|
+
结果:33项全部通过(资源18项、流程15项),失败0、跳过0。以下耗时来自该次TAP日志,单位毫秒。P0的126项逐条断言另由安装包黑盒运行并通过,不合并计算为本表用例。
|
|
6
|
+
|
|
7
|
+
| 序号 | 用例 | 状态 | 耗时(ms) | 失败原因 |
|
|
8
|
+
| --- | --- | --- | ---: | --- |
|
|
9
|
+
| 1 | preview has no filesystem side effects and reports exact bytes | 通过 | 14.1514 | — |
|
|
10
|
+
| 2 | confirmed install preserves binary assets and refuses duplicates | 通过 | 10.1495 | — |
|
|
11
|
+
| 3 | changed content and changed installation target invalidate preview | 通过 | 3.697 | — |
|
|
12
|
+
| 4 | path traversal, Windows ADS and reserved names are rejected | 通过 | 1.2775 | — |
|
|
13
|
+
| 5 | case-colliding filenames are rejected | 通过 | 1.307 | — |
|
|
14
|
+
| 6 | bundled names and ambiguous containers are rejected | 通过 | 1.1597 | — |
|
|
15
|
+
| 7 | single-file rule accepts UTF-8 BOM and CRLF; empty rules are refused | 通过 | 4.3463 | — |
|
|
16
|
+
| 8 | file and directory prefix conflicts fail during preview | 通过 | 1.1838 | — |
|
|
17
|
+
| 9 | failed installation removes only its own incomplete directory | 通过 | 10.333 | — |
|
|
18
|
+
| 10 | host directory scanner resolves one container child and excludes caches | 通过 | 5.7372 | — |
|
|
19
|
+
| 11 | host scanner rejects symlink or junction source paths | 通过 | 2.4564 | — |
|
|
20
|
+
| 12 | deep directories and oversized files fail before installation | 通过 | 32.4539 | — |
|
|
21
|
+
| 13 | invalid UTF-8, encoding and absent source directories report errors | 通过 | 1.8314 | — |
|
|
22
|
+
| 14 | registered host workspace wins over client spelling; unknown paths fail | 通过 | 2.952 | — |
|
|
23
|
+
| 15 | legacy host retains its explicit workspace policy | 通过 | 0.3168 | — |
|
|
24
|
+
| 16 | host registry failures are not downgraded to legacy permissions | 通过 | 0.1657 | — |
|
|
25
|
+
| 17 | ledger shows absent storage as empty and propagates access errors | 通过 | 21.1636 | — |
|
|
26
|
+
| 18 | ledger rejects malformed records instead of pretending there are no tasks | 通过 | 0.3444 | — |
|
|
27
|
+
| 19 | 审查通过后更新状态并激活下一项,保留已完成项的审计 | 通过 | 9.621 | — |
|
|
28
|
+
| 20 | 追加修复项可按 id 保留旧标题,拒绝已完成项改名后静默丢审核 | 通过 | 2.9022 | — |
|
|
29
|
+
| 21 | 派发立即反映进行中,重派不复用旧审核且保持单一进行项 | 通过 | 2.2759 | — |
|
|
30
|
+
| 22 | 无任务 id 的 status 发现当前工作区任务并支持分支过滤 | 通过 | 0.904 | — |
|
|
31
|
+
| 23 | 状态明确区分内置节点门禁与附加技能命令回执,避免重复验证 | 通过 | 2.5274 | — |
|
|
32
|
+
| 24 | status 披露当前阶段记录字段和缺项,字段误用不写入且可按提示恢复 | 通过 | 2.3448 | — |
|
|
33
|
+
| 25 | 记录字段来自冻结流程,精简流程不硬编码标准字段,无记录阶段返回空列表 | 通过 | 3.7337 | — |
|
|
34
|
+
| 26 | 可选内置技能回执不会因范围变更升级成额外流转门禁 | 通过 | 1.993 | — |
|
|
35
|
+
| 27 | 验证使用会话策略与取消信号,并明确返回失败及沙箱信息 | 通过 | 0.9705 | — |
|
|
36
|
+
| 28 | 只声明已测试、或加载失败,均不能冒充执行绑定技能 | 通过 | 1.2714 | — |
|
|
37
|
+
| 29 | 绑定技能失败阻止完成;成功后仍须提交真实 Git 回执 | 通过 | 4.7971 | — |
|
|
38
|
+
| 30 | 验证后修改代码会使旧回执失效,必须重新验证 | 通过 | 1.7267 | — |
|
|
39
|
+
| 31 | status 提交提示与真实门禁一致,分别披露过期验证和附加技能回执且不改台账 | 通过 | 4.7468 | — |
|
|
40
|
+
| 32 | 同名技能与规则在项目和个人目录各自保留管理入口 | 通过 | 19.3435 | — |
|
|
41
|
+
| 33 | 安装包的七个内置技能实际注册且可在资源目录发现 | 通过 | 2.9187 | — |
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# 真实项目回归迭代
|
|
2
|
+
|
|
3
|
+
版本:0.23.1,汇总本轮候选修复;完整业务流程的实机证据来自 rc.3,后续修复有针对性回归及包验证。
|
|
4
|
+
|
|
5
|
+
以 EAM 设备结构树和单选弹窗需求重跑工作台,业务代码由工作台执行;插件修复与独立观察分开记录。
|
|
6
|
+
|
|
7
|
+
| 上一轮问题 | 本轮处理 |
|
|
8
|
+
| :--- | :--- |
|
|
9
|
+
| 项目技能被同名个人技能覆盖 | 资源目录保留各来源;绑定选择按名称去重。 |
|
|
10
|
+
| 无任务 ID 的入口 status 报错 | 返回候选列表,支持分支过滤,不猜测当前任务。 |
|
|
11
|
+
| 更新实施项状态清空审核记录 | 同 ID、同标题保留审核;重开或改标题使审核失效。 |
|
|
12
|
+
| verify 丢会话沙箱上下文 | 透传会话策略与取消信号,记录沙箱结果。 |
|
|
13
|
+
| 审核后已错过提交窗口 | 标准 v2 改为审核通过后提交,离开前核对 Git 回执。 |
|
|
14
|
+
| 完成才披露测试技能,未执行 | 终态绑定提前执行;加载记录和附加技能命令回执参与门禁。 |
|
|
15
|
+
| 内置技能被误当成附加技能重复登记 | 状态列出必需回执技能;可选内置回执过期不额外拦截。 |
|
|
16
|
+
| 子代理已开工而实施项仍待办 | 派工前登记并自动设进行中,禁止另一项同时进行;实际执行仍核对日志。 |
|
|
17
|
+
| 追加修复项重写标题使审核丢失 | 已有项支持省略标题;已审核项改名须先重新打开。 |
|
|
18
|
+
| 方案猜测字段、驳回后直接重试 | 要求核对资料和真实组件行为,先收集反馈再修订送审。 |
|
|
19
|
+
|
|
20
|
+
新任务验证使用真实命令,并关联声明文件内容。改动代码后重跑验证;不会把“我测过了”直接转换为通过。附加技能可用交付文件内容校验命令,但不能用恒成功命令充当验收。
|
|
21
|
+
|
|
22
|
+
旧任务使用冻结配置及原执行约定,不自动修改历史记录。规则解析优先级为内置、项目、个人;技能正文的选择由 Harness 技能目录负责。
|
|
23
|
+
|
|
24
|
+
边界:文件摘要只涵盖声明的任务文件,不涵盖数据库、远端接口、依赖和未声明文件;成功退出码不证明测试充分。审核意见仍需人工判断。当前没有对任务记录做签名,也不防止有权限的人直接手改状态。
|
|
25
|
+
|
|
26
|
+
验收要求:同一个真实需求走完确认、设计、开发、技能测试、验证、审核、受控提交;不得另建收尾任务绕过门禁,不得以简单命令替代失败的核心验证。插件发布与业务验收分开记录,未完成的真实联调不宣称通过。
|
|
27
|
+
|
|
28
|
+
执行指引:范围清楚的小修正可由主代理完成,保留状态、审核及定向验证,不强制重复派子代理;权限或沙箱拒绝须走正式审批或报告阻塞,禁止反复换命令或修改 ACL 规避。上述行为指引不能替代 Harness 的权限执行,也尚未证明可消除模型误用。
|
|
29
|
+
|
|
30
|
+
本轮 EAMDEV-R2 已在同一任务达到完成(revision 60),8 项审核齐全,software-testing 在终态前执行并记录真实回执,业务提交 95892e8 回写成功;未推送或发布。结构树真实请求返回非 JSON,配置大小写差异待授权修正,不能声称端到端验收通过。
|
|
31
|
+
|
|
32
|
+
实机发现状态查询仍将过期回执任务显示为可提交,但真实 commit 门禁拒绝。rc.5 让 status 使用与 commit 相同的技能和摘要阻塞检查,新增 evidence_blockers,保持状态查询只读。报告证据归属错误仍需审查,技能加载和退出码不能证明报告内容准确。
|
|
33
|
+
|
|
34
|
+
后续任务出现未定义记录字段:校验正确拒绝,但模型缺少主动字段提示。0.23.1 新增 artifact_requirements,按冻结流程返回当前阶段字段及缺项,错误附恢复说明;兼容敏捷流程只有 scope 的情况,两个新增用例先失败后通过。
|
|
35
|
+
|
|
36
|
+
完整重跑方法:每轮归档业务差异、任务和问题证据,修复插件后将本轮业务改动恢复到同一基线,用独立会话重新交付完整需求。保留插件改进,不把上一轮实现复制为下一轮成果。暂停期间不调用模型;额度/鉴权问题属于服务状态,不由本包修改凭证处理。
|
package/hooks/commit-msg
CHANGED
|
@@ -137,7 +137,7 @@ var STANDARD = {
|
|
|
137
137
|
policy: "task",
|
|
138
138
|
message_pattern: "^\u3010(\\S+)\u3011\u3010(?:TASK|T\\d+)\u3011.+",
|
|
139
139
|
message_hint: "\u3010<task_id>\u3011\u3010TASK/T1\u3011\u8BF4\u660E \u2014\u2014 \u7B2C\u4E00\u6BB5\u586B\u672C\u4EFB\u52A1 id\uFF08\u5982 GREET-001\uFF09\uFF0C\u5199\u7ED3\u679C\u4E0D\u5199\u7A7A\u6CDB\u52A8\u4F5C",
|
|
140
|
-
checkpoints: ["\
|
|
140
|
+
checkpoints: ["\u4EE3\u7801\u5BA1\u6838"],
|
|
141
141
|
file_scope: true
|
|
142
142
|
},
|
|
143
143
|
high_risk_requires_verification: true,
|
|
@@ -145,8 +145,8 @@ var STANDARD = {
|
|
|
145
145
|
"\u9700\u6C42\u8BC4\u5BA1": { skills: ["requirement-analysis"], rules: ["security-redlines"] },
|
|
146
146
|
"\u8BBE\u8BA1": { skills: ["solution-design"] },
|
|
147
147
|
"\u5F00\u53D1": { skills: ["code-implement"], rules: ["coding-conventions"] },
|
|
148
|
-
"\u4EA4\u4ED8": { skills: ["code-verify"
|
|
149
|
-
"\u4EE3\u7801\u5BA1\u6838": { skills: ["code-review"], rules: ["security-redlines"] }
|
|
148
|
+
"\u4EA4\u4ED8": { skills: ["code-verify"], rules: ["coding-conventions"] },
|
|
149
|
+
"\u4EE3\u7801\u5BA1\u6838": { skills: ["code-review", "code-commit"], rules: ["security-redlines", "commit-conventions"] }
|
|
150
150
|
}
|
|
151
151
|
};
|
|
152
152
|
var AGILE = {
|
|
@@ -208,7 +208,7 @@ function preset(id, version, label, description, config2) {
|
|
|
208
208
|
return { id, version, label, description, capabilities: deriveCapabilities(config2), config: config2 };
|
|
209
209
|
}
|
|
210
210
|
var FLOW_PRESETS = {
|
|
211
|
-
standard: preset("standard",
|
|
211
|
+
standard: preset("standard", 2, "\u6807\u51C6\u7814\u53D1", "\u9700\u6C42\u8BC4\u5BA1 \u2192 \u8BBE\u8BA1 \u2192 \u5F00\u53D1 \u2192 \u4EA4\u4ED8 \u2192 \u4EE3\u7801\u5BA1\u6838\uFF0C\u5BA1\u6838\u540E\u63D0\u4EA4", STANDARD),
|
|
212
212
|
agile: preset("agile", 1, "\u654F\u6377\u8F7B\u91CF", "\u9700\u6C42 \u2192 \u5F00\u53D1 \u2192 \u4EA4\u4ED8 \u2192 \u5BA1\u67E5\uFF0C\u56DB\u9636\u6BB5\u3001\u5C11\u4EA7\u7269", AGILE),
|
|
213
213
|
minimal: preset("minimal", 1, "\u7EAF\u4EE3\u7801", "\u5F00\u53D1 \u2192 \u4EA4\u4ED8\uFF0C\u4E24\u9636\u6BB5\uFF0C\u53EA\u7559\u63D0\u4EA4\u95E8\u7981", MINIMAL)
|
|
214
214
|
};
|