hunter-harness 0.1.0 → 0.1.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.
Files changed (69) hide show
  1. package/dist/bin.js +127 -106
  2. package/package.json +2 -2
  3. package/resources/harness/general/.harness-build.json +1 -1
  4. package/resources/harness/general/harness-archive/SKILL.md +215 -215
  5. package/resources/harness/general/harness-codebase-map/SKILL.md +112 -112
  6. package/resources/harness/general/harness-codebase-map/templates/map-summary.md +3 -3
  7. package/resources/harness/general/harness-knowledge-ingest/SKILL.md +246 -246
  8. package/resources/harness/general/harness-knowledge-query/SKILL.md +164 -164
  9. package/resources/harness/general/harness-plan/SKILL.md +127 -127
  10. package/resources/harness/general/harness-review/SKILL.md +156 -156
  11. package/resources/harness/general/harness-run/SKILL.md +132 -132
  12. package/resources/harness/general/harness-submit/SKILL.md +159 -159
  13. package/resources/harness/general/harness-sync/SKILL.md +82 -82
  14. package/resources/harness/general/harness-test/SKILL.md +180 -180
  15. package/resources/harness/general/scripts/harness_deploy.py +580 -580
  16. package/resources/harness/java/.harness-build.json +1 -1
  17. package/resources/harness/java/harness-apidoc/SKILL.md +86 -86
  18. package/resources/harness/java/harness-archive/SKILL.md +215 -215
  19. package/resources/harness/java/harness-codebase-map/SKILL.md +112 -112
  20. package/resources/harness/java/harness-codebase-map/templates/map-summary.md +3 -3
  21. package/resources/harness/java/harness-knowledge-ingest/SKILL.md +246 -246
  22. package/resources/harness/java/harness-knowledge-query/SKILL.md +164 -164
  23. package/resources/harness/java/harness-package/SKILL.md +87 -87
  24. package/resources/harness/java/harness-plan/SKILL.md +127 -127
  25. package/resources/harness/java/harness-review/SKILL.md +156 -156
  26. package/resources/harness/java/harness-run/SKILL.md +148 -148
  27. package/resources/harness/java/harness-submit/SKILL.md +166 -166
  28. package/resources/harness/java/harness-sync/SKILL.md +82 -82
  29. package/resources/harness/java/harness-test/SKILL.md +192 -192
  30. package/resources/harness/java/scripts/harness_deploy.py +580 -580
  31. package/resources/harness/manifests/general.json +13 -33
  32. package/resources/harness/manifests/java.json +15 -35
  33. package/resources/bootstrap-ir/manifest.json +0 -19
  34. package/resources/bootstrap-ir/skills/harness-apidoc.yaml +0 -24
  35. package/resources/bootstrap-ir/skills/harness-archive.yaml +0 -24
  36. package/resources/bootstrap-ir/skills/harness-codebase-map.yaml +0 -24
  37. package/resources/bootstrap-ir/skills/harness-knowledge-ingest.yaml +0 -24
  38. package/resources/bootstrap-ir/skills/harness-package.yaml +0 -24
  39. package/resources/bootstrap-ir/skills/harness-plan.yaml +0 -24
  40. package/resources/bootstrap-ir/skills/harness-review.yaml +0 -24
  41. package/resources/bootstrap-ir/skills/harness-run.yaml +0 -24
  42. package/resources/bootstrap-ir/skills/harness-skill-optimizer.yaml +0 -28
  43. package/resources/bootstrap-ir/skills/harness-submit.yaml +0 -24
  44. package/resources/bootstrap-ir/skills/harness-sync.yaml +0 -24
  45. package/resources/bootstrap-ir/skills/harness-test.yaml +0 -24
  46. package/resources/bootstrap-ir/templates/claude-code-skill.md +0 -12
  47. package/resources/harness/general/harness-knowledge-ingest/tests/fixtures/mcp-eval-project/.harness/archive/2026-01-10-ledger-reconciliation/reports/final/summary-data.json +0 -43
  48. package/resources/harness/general/harness-knowledge-ingest/tests/fixtures/mcp-eval-project/.harness/archive/2026-02-14-ledger-snapshot-followup/reports/final/summary-data.json +0 -38
  49. package/resources/harness/general/harness-knowledge-ingest/tests/fixtures/mcp-eval-project/.harness/archive/2026-03-05-webhook-contract/reports/final/summary-data.json +0 -36
  50. package/resources/harness/general/harness-knowledge-ingest/tests/fixtures/mcp-eval-project/.harness/project.yaml +0 -1
  51. package/resources/harness/general/harness-knowledge-ingest/tests/test_harness_knowledge.py +0 -1792
  52. package/resources/harness/java/harness-knowledge-ingest/tests/fixtures/mcp-eval-project/.harness/archive/2026-01-10-ledger-reconciliation/reports/final/summary-data.json +0 -43
  53. package/resources/harness/java/harness-knowledge-ingest/tests/fixtures/mcp-eval-project/.harness/archive/2026-02-14-ledger-snapshot-followup/reports/final/summary-data.json +0 -38
  54. package/resources/harness/java/harness-knowledge-ingest/tests/fixtures/mcp-eval-project/.harness/archive/2026-03-05-webhook-contract/reports/final/summary-data.json +0 -36
  55. package/resources/harness/java/harness-knowledge-ingest/tests/fixtures/mcp-eval-project/.harness/project.yaml +0 -1
  56. package/resources/harness/java/harness-knowledge-ingest/tests/test_harness_knowledge.py +0 -1792
  57. package/resources/manifest.json +0 -19
  58. package/resources/skills/harness-apidoc/SKILL.md +0 -50
  59. package/resources/skills/harness-archive/SKILL.md +0 -48
  60. package/resources/skills/harness-codebase-map/SKILL.md +0 -53
  61. package/resources/skills/harness-knowledge-ingest/SKILL.md +0 -48
  62. package/resources/skills/harness-package/SKILL.md +0 -48
  63. package/resources/skills/harness-plan/SKILL.md +0 -51
  64. package/resources/skills/harness-review/SKILL.md +0 -50
  65. package/resources/skills/harness-run/SKILL.md +0 -48
  66. package/resources/skills/harness-skill-optimizer/SKILL.md +0 -54
  67. package/resources/skills/harness-submit/SKILL.md +0 -47
  68. package/resources/skills/harness-sync/SKILL.md +0 -48
  69. package/resources/skills/harness-test/SKILL.md +0 -50
@@ -1,180 +1,180 @@
1
- ---
2
- name: harness-test
3
- description: "测试执行:读取场景表,执行单元测试+API接口测试+数据兼容验证,输出测试报告。当用户说'跑测试/验证/跑用例/接口测试/单元测试'时使用"
4
- argument-hint: "变更名或留空自动检测"
5
- effort: medium
6
- allowed-tools: [Read, Glob, Grep, Write, Edit, Agent, Bash(powershell.exe:*)]
7
- disallowed-tools:
8
- - Bash(git *)
9
- - Bash(mvn *)
10
- - Bash(ls *)
11
- - Bash(find *)
12
- - Bash(grep *)
13
- - Bash(cat *)
14
- - Bash(cp *)
15
- - Bash(mv *)
16
- - Bash(rm *)
17
- - Bash(mkdir *)
18
- - Bash(touch *)
19
- - Bash(sed *)
20
- - Bash(awk *)
21
- - Bash(curl *)
22
- - Bash(node *)
23
- - Bash(codegraph *)
24
- ---
25
- <!-- generated by harness_deploy.py; core=63af4c482d21b6be; overlay=none; do not edit -->
26
- # harness-test — 测试执行
27
-
28
- ## Purpose
29
-
30
- 读取测试场景表,逐条执行单元测试和接口测试,验证代码变更的正确性,输出测试报告。
31
-
32
- ## When to Use
33
-
34
- 当用户明确要求运行测试时触发。典型触发语:"跑测试""验证""跑用例""接口测试""单元测试"。属于自动调用型 skill(未设 `disable-model-invocation`),默认经 `/harness-test` 显式调用。
35
-
36
- 使用场景:
37
- - 完成 `/harness-run` 编码后,验证单元测试 + 接口测试 + 数据兼容
38
- - 修改公共模块 / 数据访问 / sql / 权限认证 / 接口层 / 数据契约 后需要真实接口验证
39
- - run 阶段 ledger 可复用时,跳过单元测试重跑,只补接口测试
40
-
41
- 前置依赖:
42
- - `.harness/changes/<change-name>/plans/<change-name>-test-scenarios.md` 存在(测试真相源)
43
- - `/harness-run` 已完成,或 ledger 中有可复用的 unitTest 结果
44
- - 必须读取 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 且 worktree 已创建 → 在 worktree 目录中执行测试;`requested=true` 但 worktree 不存在 → 停止,提示先修复 `harness-run`,不得静默回到主目录
45
-
46
- 跳过场景:
47
- - 仅改了注释 / 格式化等非行为性清理,且 ledger `postTestClassification=NON_BEHAVIORAL_CLEANUP`,可复用已有 apiTest 结果,不必重跑
48
-
49
- ## 统一读取协议
50
-
51
- 1. **`.harness/changes/<change-name>/` 是唯一真相源** — 所有输入从该目录读取,产物写入对应子目录
52
- 2. **change-name 优先从 frontmatter 读取** — `spec/*-design.md`、`plans/*-plan.md` 的 YAML `change-name`
53
- 3. **frontmatter 缺失时兼容旧格式** — 从路径推断,标记 `🟡 legacy-plan`,不失败
54
- 4. **spec** — 设计真相源:`spec/<change>-design.md`
55
- 5. **plan** — 任务真相源:`plans/<change>-plan.md`
56
- 6. **implementation-detail** — 自适应执行参考;legacy 缺失 🟡WARN,不阻断
57
- 7. **test-scenarios** — 测试真相源:`plans/<change>-test-scenarios.md`
58
- 8. **禁止读取 `docs/superpowers/` 作为正式输入** — 旧草稿仅人工线索
59
-
60
- 状态目录分层:新路径优先,旧路径兼容 → [[../protocols/state-layout-protocol.md|state-layout-protocol]]
61
-
62
- ## Workflow
63
-
64
- ### Phase 0:环境准备(主会话执行,需要交互确认)
65
-
66
- 执行 各项强制环境检查 + **命令执行模式 preflight (0.1)**;只有首选执行器不可用时,才执行 fallback 执行器探测。
67
-
68
- - **Read `checklist.md`** — 各项检查详情 + 0.1 preflight + Playwright 探测 + 避坑规则指引
69
- - **失败处理**:任一项检查失败 → 终止流程并报告原因,用户确认修复后才能继续
70
- - 通过后进入 Phase 1
71
-
72
- ### Phase 0.1:命令执行模式 preflight(⚠️ 必须在编译/启动服务/生成 runner 之前执行)
73
-
74
- `/harness-test` 高度依赖 PowerShell 与接口测试执行器。如果当前会话处于 Auto mode / 安全分类器降级 / PowerShell 被拒,会反复失败并错误降级到 Playwright MCP 逐条接口,造成长时间阻塞。**必须先做 4 项执行模式检查**(PowerShell 基础命令、执行器运行时可用性、构建工具可用性、安全分类器),将通过的 `executorPath` 写入 `.harness/changes/<change-name>/runtime/preflight.json`。
75
-
76
- 任一硬停情况(安全分类器不可用 / Auto mode 拦截 / PowerShell 被拒 / 执行器或构建工具不可执行)→ 原文输出"❌ 命令执行模式不可用...",不得继续编译/启动服务/生成执行器,不得盲目降级到 Playwright MCP。用户确认切换权限模式后**必须重新执行 0.1**,重试 ≤ 1 次。详见 `reference.md`「命令执行模式 preflight」。
77
-
78
- ### Phase 0.2:fallback 执行器探测(仅在首选执行器不可用时执行)
79
-
80
- 只有 0.1 通过但首选接口测试执行器不可用时才执行 0.2。如果 0.1 已确认执行器在 PowerShell 中可用,直接选择 **接口测试执行器**(Node runner 为一种实现,可按项目替换),不得继续探测或使用 Playwright MCP。
81
-
82
- 严格优先级(不得颠倒):接口测试执行器(默认首选,Node runner 为一种实现,可按项目替换为其他 HTTP 客户端)> PowerShell batch `.ps1`(首选不可用时降级)> Playwright MCP `browser_evaluate`(仅当 1+2 都不可用或用户明确选择)> curl + UTF-8 JSON body file(最后兜底)> 禁止直接用 curl 内联发送含中文 JSON body。
83
-
84
- > ⚠️ Playwright MCP `browser_evaluate` 不得替代执行器。执行器在 PowerShell 可用时,**禁止**使用 Playwright MCP 逐条执行接口测试——认证凭证是独立凭证,应读认证凭证缓存,由执行器直连本地 baseURL 发起请求。详见 `reference.md`「fallback 执行器探测」。
85
-
86
- ### Phase 1-2:测试执行(默认主会话执行)
87
-
88
- **Phase 1 前先读 verification-ledger**:读取 `.harness/changes/<change-name>/evidence/verification-ledger.json`,判断是否可复用 run 阶段的 unitTest(见「关键规则·四」)。
89
-
90
- **默认在主会话执行**(不委派 subagent):
91
- - 单元测试:可复用则跳过重跑;否则按技术栈执行测试命令
92
- - 接口测试:**强制批量执行器**,一次跑完全部场景,主会话只读 JSON
93
-
94
- ### Phase 3:覆盖率总结 + 关门检查(主会话执行)
95
-
96
- 读取测试报告,生成覆盖率总结,**执行关门检查**,包含:单元测试通过/失败/跳过计数、接口测试逐条结果+汇总+耗时、数据兼容验证汇总、败因分类(代码 Bug vs 测试脚本 vs 预存问题)、请求执行器及降级原因、关门检查 10 项(见「关键规则·十」)。
97
-
98
- ## P0 执行可信度规则
99
-
100
- - 命令结果不得靠猜测;普通 Bash 被拒 → 立即改用等价 PowerShell 重试一次
101
- - 仅 PowerShell 成功且有明确证据(构建/git/测试输出、文件存在、exit 0)时可标 ✅OK;否则 ❌FAIL 或 🟡WARN
102
- - 禁止把 hook 拒绝、静态验证、无输出、用户跳过说成成功 → 详见 [[../protocols/powershell-protocol.md|powershell-protocol]]、[[../protocols/evidence-based-reporting-protocol.md|evidence-based-reporting-protocol]]
103
-
104
- ## 关键规则(硬门禁速查)
105
-
106
- > 每条规则的详细判定、模板、表格见 `reference.md` 对应章节;Shell 执行安全见 `../protocols/powershell-protocol.md`,证据化报告见 `../protocols/evidence-based-reporting-protocol.md`,敏感信息见 `../protocols/sensitive-info-protocol.md`,ledger 见 `../protocols/ledger-protocol.md`,状态目录见 `../protocols/state-layout-protocol.md`,结构化报告事件见 `../protocols/report-pipeline-protocol.md`。
107
-
108
- ### 一、接口测试工具优先级
109
-
110
- 强制优先级:**接口测试执行器**(默认首选,Node runner 为一种实现,可按项目替换为其他 HTTP 客户端)> PowerShell batch `.ps1`(首选不可用时降级)> Playwright MCP `browser_evaluate`(仅 1+2 不可用或用户明确选择)> curl + UTF-8 JSON body file(最后兜底,须通过 PowerShell 调用)。**禁止裸 `node`、禁止用 Bash 执行 node**(`disallowed-tools` 已禁 `Bash(node *)`);执行器在 PowerShell 可用时**不得**用 Playwright MCP 逐条执行。详见 `reference.md`「接口测试工具优先级」。
111
-
112
- ### 二、批量测试执行 + Runner 三阶段
113
-
114
- 0.1 通过后生成 `.harness/changes/<change-name>/runtime/api-test-runner.mjs`(按技术栈选择实现,Node runner 为一种实现,可按项目替换),通过**一次命令**(PowerShell + 执行器绝对路径)执行全部场景,输出 `api-test-results.json`,主会话只读 JSON。执行器必须按 **setup / test / cleanup** 三阶段:setup 失败时依赖场景标 🟡 BLOCKED,**不得用 null ID 继续请求**。绝对路径从 `runtime/preflight.json` 的 `executorPath` 读取,禁止 hardcode。详见 `reference.md`「批量测试执行器」「执行器三阶段模板」。
115
-
116
- ### 三、请求体与测试数据
117
-
118
- 请求体必须从数据契约 / 接口定义 / 真实样例生成,**禁止临场猜字段、禁止先跑失败接口再补**。测试数据用唯一前缀 `TEST_<change-name>_<timestamp>_<random>`;唯一约束字段必须随机或避让,避免冲突导致大面积 BLOCKED。详见 `reference.md`「请求体生成」「测试数据治理」。
119
-
120
- ### 四、单元测试复用 + 写入 ledger
121
-
122
- Phase 1 前先读 `.harness/changes/<change-name>/evidence/verification-ledger.json`:run 的 unitTest 满足(diffHash 一致 + module/profile 一致 + scope 一致或更严格 + run 后无行为性修改 + run 跑了全量测试)则复用,否则重跑测试命令(按技术栈,如 `mvn test -pl <module>`)。Phase 1/2 完成后必须写回 ledger 的 `unitTest`/`apiTest` 项。详见 `checklist.md`「单元测试复用」、`../protocols/ledger-protocol.md`。
123
-
124
- ### 五、命令与请求超时治理
125
-
126
- 所有命令必须有「预期时长 + 超时上限」,超过预期必须输出一次状态行,**不得静默等待**。`durationMs > 10000` → 🟡 SLOW,`> 30000` → ❌ TIMEOUT_RISK。详见 `reference.md`「命令与请求超时治理」。
127
-
128
- ### 六、服务启动 + 生命周期管理
129
-
130
- 启动等待状态机:0–30s 每 2s 探测、30–120s 每 5s 探测、>120s 读日志判定;遇启动失败特征立即停。**Service Gate**:`harness_service.py ensure` 返回 `action=needs-user-decision`(用户自启服务占端口)时 **才** AskUserQuestion;AI 托管服务或端口空闲则自动继续,不询问。服务指纹(`moduleInputsHash`,来自 CLI `--files` ∪ `serviceStart.inputFiles`)+ `startCommandHash` + `profile` + `overlayPath` + 进程身份任一变化即 restart;**空输入被拒绝**,不生成可复用空指纹。测试结束默认清理 AI 启动的服务。详见 `reference.md`「服务决策门」。
131
-
132
- ### 七、运行时配置叠加(不动 tracked 配置)
133
-
134
- 禁止默认 Edit tracked 应用配置文件。默认运行时配置叠加(ASCII 绝对路径);改 tracked 配置 → 默认拒绝,记 `decision` 事件(不 AskUserQuestion,报告 🟡 WARN)。详见 `reference.md`。
135
-
136
- ### 八、Token 缓存与复用
137
-
138
- 先读 `.harness/changes/<change-name>/runtime/credential-cache.json`(认证凭证缓存,按项目认证机制;token/SSO 为常见实现),本地轻量接口验证通过则复用,失败才走远程认证。接口测试执行器用 request context / 原生 HTTP 客户端直连本地 baseURL,**不得依赖浏览器当前页面 origin**。同一次流程内凭证刷新计数 > 1 → 🟡 WARN。**不得在报告/日志/对话总结中输出明文凭证**。详见 `reference.md`「认证凭证缓存与复用」。
139
-
140
- ### 九、测试报告状态规则
141
-
142
- 整体 ✅OK / 🟡WARN / ❌FAIL 三态;API 维度使用 `OK` / `PARTIAL` / `BLOCKED` / `NOT_RUN` / `FAIL` 五态。**不得把「5 PASS + 9 BLOCKED + 1 FAIL」写成 `apiTest=NOT_RUN`**,正确为 `apiTest=PARTIAL`。P0 场景 BLOCKED 不得仍 OK。详见 `reference.md`「结果分级规则」。
143
-
144
- ### 十、关门检查(结束前强制执行)
145
-
146
- 输出最终总结前必须执行 10 项:`git status --porcelain` / `git diff --stat` / `git diff --check`(失败→❌FAIL,必须 PowerShell-only)/ 明文敏感信息 / runtime 不提交 / 服务生命周期收尾 / 测试数据清理 / 执行器表完整 / 慢请求或超时 / 未清理+fallback+慢请求→至少 🟡WARN。详见 `checklist.md`「关门检查」、`reference.md`「关门检查」。
147
-
148
- ### 十一、请求执行器 fallback 输出 + 性能统计
149
-
150
- 报告必须区分四种执行器(接口测试执行器 / PowerShell batch / Playwright MCP browser_evaluate / curl),**不得笼统写"Playwright"**,不得把 "Playwright API 执行器" 与 "Playwright MCP browser_evaluate" 混写。报告必须含请求耗时统计表。详见 `reference.md`「请求执行器 fallback 输出」「输出格式」。
151
-
152
- ## Output Format
153
-
154
- > 详细报告格式见 `reference.md` 的「输出格式」模板。
155
-
156
- 测试报告保存到 `.harness/changes/<change-name>/reports/test/test-report-YYYYMMDD-HHmm.md`(时间戳区分多次运行),同时在控制台输出摘要。
157
-
158
- ## 渐进披露
159
-
160
- - **Read `checklist.md`** 仅在 Phase 0 环境准备时 — 含 各项强制检查、0.1 命令执行模式 preflight、服务生命周期清单
161
- - **Read `reference.md`** 仅在执行接口测试时 — 含 API 测试执行方法、已知良好测试配置、运行时配置叠加、setup/test/cleanup 执行器模板、双格式错误码兼容
162
- - **Read `pitfalls.md`** 仅在遇到测试失败时 — 含所有踩坑规则(30 条,含 Bash 执行执行器 / 运行时配置叠加 / 唯一字段冲突 / 服务生命周期等)
163
-
164
- ## 交互白名单
165
-
166
- 本 skill **仅允许**以下 AskUserQuestion;其余默认值 + `decision` 事件:
167
-
168
- 1. **Service Gate**:仅当 `harness_service.py ensure` 返回 `needs-user-decision`(用户进程占端口)时询问处理方式
169
-
170
- ## 执行日志
171
-
172
- `events.ndjson` 为唯一事实源(schema_version 2,`note` 承载人类可读摘要);`logs/execution-log.md` 由 `harness_events.py` 渲染,**禁止手工 Edit**。结构 → [[../protocols/report-pipeline-protocol.md|report-pipeline-protocol]]
173
-
174
- ```powershell
175
- python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --note "<触发指令>"
176
- ```
177
-
178
- > **脚本接线**:`harness_events.py append`;`harness_archive.py finalize`;`harness_preflight.py check`;`harness_ledger.py can-reuse`;`harness_service.py ensure/stop`(须 `--files`/`serviceStart.inputFiles`)。JSON 输出按 D13 护栏解读。
179
-
180
- > **Task 4 §6.1 写入契约**:普通 `append` = 加锁 -> 追加一行 -> fsync -> 解锁,**不 load 历史、不渲染**(O(1),跨进程锁 `events.ndjson.lock`,UUID 用完整 `uuid4().hex` 无需去重扫描)。仅 `--type phase.end` append 在追加成功后渲染一次 `execution-log.md`;显式 `harness_events.py render` 随时从完整 events 重建;`harness_archive.py finalize` 在 collect 前强制 render 一次。高频 command append 期间 log 可能滞后,phase 边界保持最新。
1
+ ---
2
+ name: harness-test
3
+ description: "测试执行:读取场景表,执行单元测试+API接口测试+数据兼容验证,输出测试报告。当用户说'跑测试/验证/跑用例/接口测试/单元测试'时使用"
4
+ argument-hint: "变更名或留空自动检测"
5
+ effort: medium
6
+ allowed-tools: [Read, Glob, Grep, Write, Edit, Agent, Bash(powershell.exe:*)]
7
+ disallowed-tools:
8
+ - Bash(git *)
9
+ - Bash(mvn *)
10
+ - Bash(ls *)
11
+ - Bash(find *)
12
+ - Bash(grep *)
13
+ - Bash(cat *)
14
+ - Bash(cp *)
15
+ - Bash(mv *)
16
+ - Bash(rm *)
17
+ - Bash(mkdir *)
18
+ - Bash(touch *)
19
+ - Bash(sed *)
20
+ - Bash(awk *)
21
+ - Bash(curl *)
22
+ - Bash(node *)
23
+ - Bash(codegraph *)
24
+ ---
25
+ <!-- generated by harness_deploy.py; core=76dd32302df53f0b; overlay=none; do not edit -->
26
+ # harness-test — 测试执行
27
+
28
+ ## Purpose
29
+
30
+ 读取测试场景表,逐条执行单元测试和接口测试,验证代码变更的正确性,输出测试报告。
31
+
32
+ ## When to Use
33
+
34
+ 当用户明确要求运行测试时触发。典型触发语:"跑测试""验证""跑用例""接口测试""单元测试"。属于自动调用型 skill(未设 `disable-model-invocation`),默认经 `/harness-test` 显式调用。
35
+
36
+ 使用场景:
37
+ - 完成 `/harness-run` 编码后,验证单元测试 + 接口测试 + 数据兼容
38
+ - 修改公共模块 / 数据访问 / sql / 权限认证 / 接口层 / 数据契约 后需要真实接口验证
39
+ - run 阶段 ledger 可复用时,跳过单元测试重跑,只补接口测试
40
+
41
+ 前置依赖:
42
+ - `.harness/changes/<change-name>/plans/<change-name>-test-scenarios.md` 存在(测试真相源)
43
+ - `/harness-run` 已完成,或 ledger 中有可复用的 unitTest 结果
44
+ - 必须读取 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 且 worktree 已创建 → 在 worktree 目录中执行测试;`requested=true` 但 worktree 不存在 → 停止,提示先修复 `harness-run`,不得静默回到主目录
45
+
46
+ 跳过场景:
47
+ - 仅改了注释 / 格式化等非行为性清理,且 ledger `postTestClassification=NON_BEHAVIORAL_CLEANUP`,可复用已有 apiTest 结果,不必重跑
48
+
49
+ ## 统一读取协议
50
+
51
+ 1. **`.harness/changes/<change-name>/` 是唯一真相源** — 所有输入从该目录读取,产物写入对应子目录
52
+ 2. **change-name 优先从 frontmatter 读取** — `spec/*-design.md`、`plans/*-plan.md` 的 YAML `change-name`
53
+ 3. **frontmatter 缺失时兼容旧格式** — 从路径推断,标记 `🟡 legacy-plan`,不失败
54
+ 4. **spec** — 设计真相源:`spec/<change>-design.md`
55
+ 5. **plan** — 任务真相源:`plans/<change>-plan.md`
56
+ 6. **implementation-detail** — 自适应执行参考;legacy 缺失 🟡WARN,不阻断
57
+ 7. **test-scenarios** — 测试真相源:`plans/<change>-test-scenarios.md`
58
+ 8. **禁止读取 `docs/superpowers/` 作为正式输入** — 旧草稿仅人工线索
59
+
60
+ 状态目录分层:新路径优先,旧路径兼容 → [[../protocols/state-layout-protocol.md|state-layout-protocol]]
61
+
62
+ ## Workflow
63
+
64
+ ### Phase 0:环境准备(主会话执行,需要交互确认)
65
+
66
+ 执行 各项强制环境检查 + **命令执行模式 preflight (0.1)**;只有首选执行器不可用时,才执行 fallback 执行器探测。
67
+
68
+ - **Read `checklist.md`** — 各项检查详情 + 0.1 preflight + Playwright 探测 + 避坑规则指引
69
+ - **失败处理**:任一项检查失败 → 终止流程并报告原因,用户确认修复后才能继续
70
+ - 通过后进入 Phase 1
71
+
72
+ ### Phase 0.1:命令执行模式 preflight(⚠️ 必须在编译/启动服务/生成 runner 之前执行)
73
+
74
+ `/harness-test` 高度依赖 PowerShell 与接口测试执行器。如果当前会话处于 Auto mode / 安全分类器降级 / PowerShell 被拒,会反复失败并错误降级到 Playwright MCP 逐条接口,造成长时间阻塞。**必须先做 4 项执行模式检查**(PowerShell 基础命令、执行器运行时可用性、构建工具可用性、安全分类器),将通过的 `executorPath` 写入 `.harness/changes/<change-name>/runtime/preflight.json`。
75
+
76
+ 任一硬停情况(安全分类器不可用 / Auto mode 拦截 / PowerShell 被拒 / 执行器或构建工具不可执行)→ 原文输出"❌ 命令执行模式不可用...",不得继续编译/启动服务/生成执行器,不得盲目降级到 Playwright MCP。用户确认切换权限模式后**必须重新执行 0.1**,重试 ≤ 1 次。详见 `reference.md`「命令执行模式 preflight」。
77
+
78
+ ### Phase 0.2:fallback 执行器探测(仅在首选执行器不可用时执行)
79
+
80
+ 只有 0.1 通过但首选接口测试执行器不可用时才执行 0.2。如果 0.1 已确认执行器在 PowerShell 中可用,直接选择 **接口测试执行器**(Node runner 为一种实现,可按项目替换),不得继续探测或使用 Playwright MCP。
81
+
82
+ 严格优先级(不得颠倒):接口测试执行器(默认首选,Node runner 为一种实现,可按项目替换为其他 HTTP 客户端)> PowerShell batch `.ps1`(首选不可用时降级)> Playwright MCP `browser_evaluate`(仅当 1+2 都不可用或用户明确选择)> curl + UTF-8 JSON body file(最后兜底)> 禁止直接用 curl 内联发送含中文 JSON body。
83
+
84
+ > ⚠️ Playwright MCP `browser_evaluate` 不得替代执行器。执行器在 PowerShell 可用时,**禁止**使用 Playwright MCP 逐条执行接口测试——认证凭证是独立凭证,应读认证凭证缓存,由执行器直连本地 baseURL 发起请求。详见 `reference.md`「fallback 执行器探测」。
85
+
86
+ ### Phase 1-2:测试执行(默认主会话执行)
87
+
88
+ **Phase 1 前先读 verification-ledger**:读取 `.harness/changes/<change-name>/evidence/verification-ledger.json`,判断是否可复用 run 阶段的 unitTest(见「关键规则·四」)。
89
+
90
+ **默认在主会话执行**(不委派 subagent):
91
+ - 单元测试:可复用则跳过重跑;否则按技术栈执行测试命令
92
+ - 接口测试:**强制批量执行器**,一次跑完全部场景,主会话只读 JSON
93
+
94
+ ### Phase 3:覆盖率总结 + 关门检查(主会话执行)
95
+
96
+ 读取测试报告,生成覆盖率总结,**执行关门检查**,包含:单元测试通过/失败/跳过计数、接口测试逐条结果+汇总+耗时、数据兼容验证汇总、败因分类(代码 Bug vs 测试脚本 vs 预存问题)、请求执行器及降级原因、关门检查 10 项(见「关键规则·十」)。
97
+
98
+ ## P0 执行可信度规则
99
+
100
+ - 命令结果不得靠猜测;普通 Bash 被拒 → 立即改用等价 PowerShell 重试一次
101
+ - 仅 PowerShell 成功且有明确证据(构建/git/测试输出、文件存在、exit 0)时可标 ✅OK;否则 ❌FAIL 或 🟡WARN
102
+ - 禁止把 hook 拒绝、静态验证、无输出、用户跳过说成成功 → 详见 [[../protocols/powershell-protocol.md|powershell-protocol]]、[[../protocols/evidence-based-reporting-protocol.md|evidence-based-reporting-protocol]]
103
+
104
+ ## 关键规则(硬门禁速查)
105
+
106
+ > 每条规则的详细判定、模板、表格见 `reference.md` 对应章节;Shell 执行安全见 `../protocols/powershell-protocol.md`,证据化报告见 `../protocols/evidence-based-reporting-protocol.md`,敏感信息见 `../protocols/sensitive-info-protocol.md`,ledger 见 `../protocols/ledger-protocol.md`,状态目录见 `../protocols/state-layout-protocol.md`,结构化报告事件见 `../protocols/report-pipeline-protocol.md`。
107
+
108
+ ### 一、接口测试工具优先级
109
+
110
+ 强制优先级:**接口测试执行器**(默认首选,Node runner 为一种实现,可按项目替换为其他 HTTP 客户端)> PowerShell batch `.ps1`(首选不可用时降级)> Playwright MCP `browser_evaluate`(仅 1+2 不可用或用户明确选择)> curl + UTF-8 JSON body file(最后兜底,须通过 PowerShell 调用)。**禁止裸 `node`、禁止用 Bash 执行 node**(`disallowed-tools` 已禁 `Bash(node *)`);执行器在 PowerShell 可用时**不得**用 Playwright MCP 逐条执行。详见 `reference.md`「接口测试工具优先级」。
111
+
112
+ ### 二、批量测试执行 + Runner 三阶段
113
+
114
+ 0.1 通过后生成 `.harness/changes/<change-name>/runtime/api-test-runner.mjs`(按技术栈选择实现,Node runner 为一种实现,可按项目替换),通过**一次命令**(PowerShell + 执行器绝对路径)执行全部场景,输出 `api-test-results.json`,主会话只读 JSON。执行器必须按 **setup / test / cleanup** 三阶段:setup 失败时依赖场景标 🟡 BLOCKED,**不得用 null ID 继续请求**。绝对路径从 `runtime/preflight.json` 的 `executorPath` 读取,禁止 hardcode。详见 `reference.md`「批量测试执行器」「执行器三阶段模板」。
115
+
116
+ ### 三、请求体与测试数据
117
+
118
+ 请求体必须从数据契约 / 接口定义 / 真实样例生成,**禁止临场猜字段、禁止先跑失败接口再补**。测试数据用唯一前缀 `TEST_<change-name>_<timestamp>_<random>`;唯一约束字段必须随机或避让,避免冲突导致大面积 BLOCKED。详见 `reference.md`「请求体生成」「测试数据治理」。
119
+
120
+ ### 四、单元测试复用 + 写入 ledger
121
+
122
+ Phase 1 前先读 `.harness/changes/<change-name>/evidence/verification-ledger.json`:run 的 unitTest 满足(diffHash 一致 + module/profile 一致 + scope 一致或更严格 + run 后无行为性修改 + run 跑了全量测试)则复用,否则重跑测试命令(按技术栈,如 `mvn test -pl <module>`)。Phase 1/2 完成后必须写回 ledger 的 `unitTest`/`apiTest` 项。详见 `checklist.md`「单元测试复用」、`../protocols/ledger-protocol.md`。
123
+
124
+ ### 五、命令与请求超时治理
125
+
126
+ 所有命令必须有「预期时长 + 超时上限」,超过预期必须输出一次状态行,**不得静默等待**。`durationMs > 10000` → 🟡 SLOW,`> 30000` → ❌ TIMEOUT_RISK。详见 `reference.md`「命令与请求超时治理」。
127
+
128
+ ### 六、服务启动 + 生命周期管理
129
+
130
+ 启动等待状态机:0–30s 每 2s 探测、30–120s 每 5s 探测、>120s 读日志判定;遇启动失败特征立即停。**Service Gate**:`harness_service.py ensure` 返回 `action=needs-user-decision`(用户自启服务占端口)时 **才** AskUserQuestion;AI 托管服务或端口空闲则自动继续,不询问。服务指纹(`moduleInputsHash`,来自 CLI `--files` ∪ `serviceStart.inputFiles`)+ `startCommandHash` + `profile` + `overlayPath` + 进程身份任一变化即 restart;**空输入被拒绝**,不生成可复用空指纹。测试结束默认清理 AI 启动的服务。详见 `reference.md`「服务决策门」。
131
+
132
+ ### 七、运行时配置叠加(不动 tracked 配置)
133
+
134
+ 禁止默认 Edit tracked 应用配置文件。默认运行时配置叠加(ASCII 绝对路径);改 tracked 配置 → 默认拒绝,记 `decision` 事件(不 AskUserQuestion,报告 🟡 WARN)。详见 `reference.md`。
135
+
136
+ ### 八、Token 缓存与复用
137
+
138
+ 先读 `.harness/changes/<change-name>/runtime/credential-cache.json`(认证凭证缓存,按项目认证机制;token/SSO 为常见实现),本地轻量接口验证通过则复用,失败才走远程认证。接口测试执行器用 request context / 原生 HTTP 客户端直连本地 baseURL,**不得依赖浏览器当前页面 origin**。同一次流程内凭证刷新计数 > 1 → 🟡 WARN。**不得在报告/日志/对话总结中输出明文凭证**。详见 `reference.md`「认证凭证缓存与复用」。
139
+
140
+ ### 九、测试报告状态规则
141
+
142
+ 整体 ✅OK / 🟡WARN / ❌FAIL 三态;API 维度使用 `OK` / `PARTIAL` / `BLOCKED` / `NOT_RUN` / `FAIL` 五态。**不得把「5 PASS + 9 BLOCKED + 1 FAIL」写成 `apiTest=NOT_RUN`**,正确为 `apiTest=PARTIAL`。P0 场景 BLOCKED 不得仍 OK。详见 `reference.md`「结果分级规则」。
143
+
144
+ ### 十、关门检查(结束前强制执行)
145
+
146
+ 输出最终总结前必须执行 10 项:`git status --porcelain` / `git diff --stat` / `git diff --check`(失败→❌FAIL,必须 PowerShell-only)/ 明文敏感信息 / runtime 不提交 / 服务生命周期收尾 / 测试数据清理 / 执行器表完整 / 慢请求或超时 / 未清理+fallback+慢请求→至少 🟡WARN。详见 `checklist.md`「关门检查」、`reference.md`「关门检查」。
147
+
148
+ ### 十一、请求执行器 fallback 输出 + 性能统计
149
+
150
+ 报告必须区分四种执行器(接口测试执行器 / PowerShell batch / Playwright MCP browser_evaluate / curl),**不得笼统写"Playwright"**,不得把 "Playwright API 执行器" 与 "Playwright MCP browser_evaluate" 混写。报告必须含请求耗时统计表。详见 `reference.md`「请求执行器 fallback 输出」「输出格式」。
151
+
152
+ ## Output Format
153
+
154
+ > 详细报告格式见 `reference.md` 的「输出格式」模板。
155
+
156
+ 测试报告保存到 `.harness/changes/<change-name>/reports/test/test-report-YYYYMMDD-HHmm.md`(时间戳区分多次运行),同时在控制台输出摘要。
157
+
158
+ ## 渐进披露
159
+
160
+ - **Read `checklist.md`** 仅在 Phase 0 环境准备时 — 含 各项强制检查、0.1 命令执行模式 preflight、服务生命周期清单
161
+ - **Read `reference.md`** 仅在执行接口测试时 — 含 API 测试执行方法、已知良好测试配置、运行时配置叠加、setup/test/cleanup 执行器模板、双格式错误码兼容
162
+ - **Read `pitfalls.md`** 仅在遇到测试失败时 — 含所有踩坑规则(30 条,含 Bash 执行执行器 / 运行时配置叠加 / 唯一字段冲突 / 服务生命周期等)
163
+
164
+ ## 交互白名单
165
+
166
+ 本 skill **仅允许**以下 AskUserQuestion;其余默认值 + `decision` 事件:
167
+
168
+ 1. **Service Gate**:仅当 `harness_service.py ensure` 返回 `needs-user-decision`(用户进程占端口)时询问处理方式
169
+
170
+ ## 执行日志
171
+
172
+ `events.ndjson` 为唯一事实源(schema_version 2,`note` 承载人类可读摘要);`logs/execution-log.md` 由 `harness_events.py` 渲染,**禁止手工 Edit**。结构 → [[../protocols/report-pipeline-protocol.md|report-pipeline-protocol]]
173
+
174
+ ```powershell
175
+ python <skills-root>/scripts/harness_events.py append --change-dir ".harness/changes/<change-name>" --phase <phase> --type phase.start --note "<触发指令>"
176
+ ```
177
+
178
+ > **脚本接线**:`harness_events.py append`;`harness_archive.py finalize`;`harness_preflight.py check`;`harness_ledger.py can-reuse`;`harness_service.py ensure/stop`(须 `--files`/`serviceStart.inputFiles`)。JSON 输出按 D13 护栏解读。
179
+
180
+ > **Task 4 §6.1 写入契约**:普通 `append` = 加锁 -> 追加一行 -> fsync -> 解锁,**不 load 历史、不渲染**(O(1),跨进程锁 `events.ndjson.lock`,UUID 用完整 `uuid4().hex` 无需去重扫描)。仅 `--type phase.end` append 在追加成功后渲染一次 `execution-log.md`;显式 `harness_events.py render` 随时从完整 events 重建;`harness_archive.py finalize` 在 collect 前强制 render 一次。高频 command append 期间 log 可能滞后,phase 边界保持最新。