@hunter-harness/workflow-harness 0.2.54 → 0.2.56
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/harness/bundles/general/claude-code/.harness-build.json +1 -1
- package/harness/bundles/general/claude-code/README.md +3 -3
- package/harness/bundles/general/claude-code/contracts/workflow-policy.json +1 -1
- package/harness/bundles/general/claude-code/harness-archive/SKILL.md +21 -33
- package/harness/bundles/general/claude-code/harness-archive/checklist.md +6 -10
- package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-plan/SKILL.md +7 -3
- package/harness/bundles/general/claude-code/harness-plan/checklist.md +2 -1
- package/harness/bundles/general/claude-code/harness-review/SKILL.md +8 -4
- package/harness/bundles/general/claude-code/harness-run/SKILL.md +9 -7
- package/harness/bundles/general/claude-code/harness-run/checklist.md +1 -1
- package/harness/bundles/general/claude-code/harness-run/reference.md +3 -3
- package/harness/bundles/general/claude-code/harness-submit/SKILL.md +6 -6
- package/harness/bundles/general/claude-code/harness-submit/checklist.md +1 -1
- package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/claude-code/harness-test/SKILL.md +8 -6
- package/harness/bundles/general/claude-code/harness-test/checklist.md +1 -1
- package/harness/bundles/general/claude-code/harness-test/reference.md +2 -2
- package/harness/bundles/general/claude-code/protocols/ledger-protocol.md +3 -3
- package/harness/bundles/general/claude-code/scripts/harness_archive.py +322 -74
- package/harness/bundles/general/claude-code/scripts/harness_context.py +236 -63
- package/harness/bundles/general/claude-code/scripts/harness_events.py +86 -5
- package/harness/bundles/general/claude-code/scripts/harness_events_sync.py +201 -17
- package/harness/bundles/general/claude-code/scripts/harness_fixback.py +189 -1
- package/harness/bundles/general/claude-code/scripts/harness_gate.py +353 -3
- package/harness/bundles/general/claude-code/scripts/harness_ledger.py +195 -11
- package/harness/bundles/general/claude-code/scripts/harness_plan_finalize.py +82 -0
- package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +37 -44
- package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/general/codebuddy/README.md +3 -3
- package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +1 -1
- package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +21 -33
- package/harness/bundles/general/codebuddy/harness-archive/checklist.md +6 -10
- package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +7 -3
- package/harness/bundles/general/codebuddy/harness-plan/checklist.md +2 -1
- package/harness/bundles/general/codebuddy/harness-review/SKILL.md +8 -4
- package/harness/bundles/general/codebuddy/harness-run/SKILL.md +9 -7
- package/harness/bundles/general/codebuddy/harness-run/checklist.md +1 -1
- package/harness/bundles/general/codebuddy/harness-run/reference.md +3 -3
- package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +6 -6
- package/harness/bundles/general/codebuddy/harness-submit/checklist.md +1 -1
- package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codebuddy/harness-test/SKILL.md +8 -6
- package/harness/bundles/general/codebuddy/harness-test/checklist.md +1 -1
- package/harness/bundles/general/codebuddy/harness-test/reference.md +2 -2
- package/harness/bundles/general/codebuddy/protocols/ledger-protocol.md +3 -3
- package/harness/bundles/general/codebuddy/scripts/harness_archive.py +322 -74
- package/harness/bundles/general/codebuddy/scripts/harness_context.py +236 -63
- package/harness/bundles/general/codebuddy/scripts/harness_events.py +86 -5
- package/harness/bundles/general/codebuddy/scripts/harness_events_sync.py +201 -17
- package/harness/bundles/general/codebuddy/scripts/harness_fixback.py +189 -1
- package/harness/bundles/general/codebuddy/scripts/harness_gate.py +353 -3
- package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +195 -11
- package/harness/bundles/general/codebuddy/scripts/harness_plan_finalize.py +82 -0
- package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +37 -44
- package/harness/bundles/general/codex/.harness-build.json +1 -1
- package/harness/bundles/general/codex/README.md +3 -3
- package/harness/bundles/general/codex/contracts/workflow-policy.json +1 -1
- package/harness/bundles/general/codex/harness-archive/SKILL.md +21 -33
- package/harness/bundles/general/codex/harness-archive/checklist.md +6 -10
- package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-plan/SKILL.md +7 -3
- package/harness/bundles/general/codex/harness-plan/checklist.md +2 -1
- package/harness/bundles/general/codex/harness-review/SKILL.md +4 -4
- package/harness/bundles/general/codex/harness-run/SKILL.md +9 -7
- package/harness/bundles/general/codex/harness-run/checklist.md +1 -1
- package/harness/bundles/general/codex/harness-run/reference.md +3 -3
- package/harness/bundles/general/codex/harness-submit/SKILL.md +6 -6
- package/harness/bundles/general/codex/harness-submit/checklist.md +1 -1
- package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/codex/harness-test/SKILL.md +8 -6
- package/harness/bundles/general/codex/harness-test/checklist.md +1 -1
- package/harness/bundles/general/codex/harness-test/reference.md +2 -2
- package/harness/bundles/general/codex/protocols/ledger-protocol.md +3 -3
- package/harness/bundles/general/codex/scripts/harness_archive.py +322 -74
- package/harness/bundles/general/codex/scripts/harness_context.py +236 -63
- package/harness/bundles/general/codex/scripts/harness_events.py +86 -5
- package/harness/bundles/general/codex/scripts/harness_events_sync.py +201 -17
- package/harness/bundles/general/codex/scripts/harness_fixback.py +189 -1
- package/harness/bundles/general/codex/scripts/harness_gate.py +353 -3
- package/harness/bundles/general/codex/scripts/harness_ledger.py +195 -11
- package/harness/bundles/general/codex/scripts/harness_plan_finalize.py +82 -0
- package/harness/bundles/general/codex/scripts/harness_test_guard.py +37 -44
- package/harness/bundles/general/cursor/.harness-build.json +1 -1
- package/harness/bundles/general/cursor/README.md +3 -3
- package/harness/bundles/general/cursor/contracts/workflow-policy.json +1 -1
- package/harness/bundles/general/cursor/harness-archive/SKILL.md +21 -33
- package/harness/bundles/general/cursor/harness-archive/checklist.md +6 -10
- package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-plan/SKILL.md +7 -3
- package/harness/bundles/general/cursor/harness-plan/checklist.md +2 -1
- package/harness/bundles/general/cursor/harness-review/SKILL.md +4 -4
- package/harness/bundles/general/cursor/harness-run/SKILL.md +9 -7
- package/harness/bundles/general/cursor/harness-run/checklist.md +1 -1
- package/harness/bundles/general/cursor/harness-run/reference.md +3 -3
- package/harness/bundles/general/cursor/harness-submit/SKILL.md +6 -6
- package/harness/bundles/general/cursor/harness-submit/checklist.md +1 -1
- package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/general/cursor/harness-test/SKILL.md +8 -6
- package/harness/bundles/general/cursor/harness-test/checklist.md +1 -1
- package/harness/bundles/general/cursor/harness-test/reference.md +2 -2
- package/harness/bundles/general/cursor/protocols/ledger-protocol.md +3 -3
- package/harness/bundles/general/cursor/scripts/harness_archive.py +322 -74
- package/harness/bundles/general/cursor/scripts/harness_context.py +236 -63
- package/harness/bundles/general/cursor/scripts/harness_events.py +86 -5
- package/harness/bundles/general/cursor/scripts/harness_events_sync.py +201 -17
- package/harness/bundles/general/cursor/scripts/harness_fixback.py +189 -1
- package/harness/bundles/general/cursor/scripts/harness_gate.py +353 -3
- package/harness/bundles/general/cursor/scripts/harness_ledger.py +195 -11
- package/harness/bundles/general/cursor/scripts/harness_plan_finalize.py +82 -0
- package/harness/bundles/general/cursor/scripts/harness_test_guard.py +37 -44
- package/harness/bundles/java/claude-code/.harness-build.json +1 -1
- package/harness/bundles/java/claude-code/README.md +3 -3
- package/harness/bundles/java/claude-code/contracts/workflow-policy.json +1 -1
- package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-archive/SKILL.md +21 -33
- package/harness/bundles/java/claude-code/harness-archive/checklist.md +6 -10
- package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-package/checklist.md +1 -1
- package/harness/bundles/java/claude-code/harness-plan/SKILL.md +7 -3
- package/harness/bundles/java/claude-code/harness-plan/checklist.md +2 -1
- package/harness/bundles/java/claude-code/harness-review/SKILL.md +8 -4
- package/harness/bundles/java/claude-code/harness-run/SKILL.md +9 -7
- package/harness/bundles/java/claude-code/harness-run/checklist.md +1 -1
- package/harness/bundles/java/claude-code/harness-run/reference.md +2 -2
- package/harness/bundles/java/claude-code/harness-submit/SKILL.md +6 -6
- package/harness/bundles/java/claude-code/harness-submit/checklist.md +1 -1
- package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/claude-code/harness-test/SKILL.md +8 -6
- package/harness/bundles/java/claude-code/harness-test/checklist.md +1 -1
- package/harness/bundles/java/claude-code/harness-test/reference.md +1 -1
- package/harness/bundles/java/claude-code/protocols/ledger-protocol.md +3 -3
- package/harness/bundles/java/claude-code/scripts/harness_archive.py +322 -74
- package/harness/bundles/java/claude-code/scripts/harness_context.py +236 -63
- package/harness/bundles/java/claude-code/scripts/harness_events.py +86 -5
- package/harness/bundles/java/claude-code/scripts/harness_events_sync.py +201 -17
- package/harness/bundles/java/claude-code/scripts/harness_fixback.py +189 -1
- package/harness/bundles/java/claude-code/scripts/harness_gate.py +353 -3
- package/harness/bundles/java/claude-code/scripts/harness_ledger.py +195 -11
- package/harness/bundles/java/claude-code/scripts/harness_plan_finalize.py +82 -0
- package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +37 -44
- package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
- package/harness/bundles/java/codebuddy/README.md +3 -3
- package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +1 -1
- package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +21 -33
- package/harness/bundles/java/codebuddy/harness-archive/checklist.md +6 -10
- package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-package/checklist.md +1 -1
- package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +7 -3
- package/harness/bundles/java/codebuddy/harness-plan/checklist.md +2 -1
- package/harness/bundles/java/codebuddy/harness-review/SKILL.md +8 -4
- package/harness/bundles/java/codebuddy/harness-run/SKILL.md +9 -7
- package/harness/bundles/java/codebuddy/harness-run/checklist.md +1 -1
- package/harness/bundles/java/codebuddy/harness-run/reference.md +2 -2
- package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +6 -6
- package/harness/bundles/java/codebuddy/harness-submit/checklist.md +1 -1
- package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codebuddy/harness-test/SKILL.md +8 -6
- package/harness/bundles/java/codebuddy/harness-test/checklist.md +1 -1
- package/harness/bundles/java/codebuddy/harness-test/reference.md +1 -1
- package/harness/bundles/java/codebuddy/protocols/ledger-protocol.md +3 -3
- package/harness/bundles/java/codebuddy/scripts/harness_archive.py +322 -74
- package/harness/bundles/java/codebuddy/scripts/harness_context.py +236 -63
- package/harness/bundles/java/codebuddy/scripts/harness_events.py +86 -5
- package/harness/bundles/java/codebuddy/scripts/harness_events_sync.py +201 -17
- package/harness/bundles/java/codebuddy/scripts/harness_fixback.py +189 -1
- package/harness/bundles/java/codebuddy/scripts/harness_gate.py +353 -3
- package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +195 -11
- package/harness/bundles/java/codebuddy/scripts/harness_plan_finalize.py +82 -0
- package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +37 -44
- package/harness/bundles/java/codex/.harness-build.json +1 -1
- package/harness/bundles/java/codex/README.md +3 -3
- package/harness/bundles/java/codex/contracts/workflow-policy.json +1 -1
- package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-archive/SKILL.md +21 -33
- package/harness/bundles/java/codex/harness-archive/checklist.md +6 -10
- package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-package/checklist.md +1 -1
- package/harness/bundles/java/codex/harness-plan/SKILL.md +7 -3
- package/harness/bundles/java/codex/harness-plan/checklist.md +2 -1
- package/harness/bundles/java/codex/harness-review/SKILL.md +4 -4
- package/harness/bundles/java/codex/harness-run/SKILL.md +9 -7
- package/harness/bundles/java/codex/harness-run/checklist.md +1 -1
- package/harness/bundles/java/codex/harness-run/reference.md +2 -2
- package/harness/bundles/java/codex/harness-submit/SKILL.md +6 -6
- package/harness/bundles/java/codex/harness-submit/checklist.md +1 -1
- package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/codex/harness-test/SKILL.md +8 -6
- package/harness/bundles/java/codex/harness-test/checklist.md +1 -1
- package/harness/bundles/java/codex/harness-test/reference.md +1 -1
- package/harness/bundles/java/codex/protocols/ledger-protocol.md +3 -3
- package/harness/bundles/java/codex/scripts/harness_archive.py +322 -74
- package/harness/bundles/java/codex/scripts/harness_context.py +236 -63
- package/harness/bundles/java/codex/scripts/harness_events.py +86 -5
- package/harness/bundles/java/codex/scripts/harness_events_sync.py +201 -17
- package/harness/bundles/java/codex/scripts/harness_fixback.py +189 -1
- package/harness/bundles/java/codex/scripts/harness_gate.py +353 -3
- package/harness/bundles/java/codex/scripts/harness_ledger.py +195 -11
- package/harness/bundles/java/codex/scripts/harness_plan_finalize.py +82 -0
- package/harness/bundles/java/codex/scripts/harness_test_guard.py +37 -44
- package/harness/bundles/java/cursor/.harness-build.json +1 -1
- package/harness/bundles/java/cursor/README.md +3 -3
- package/harness/bundles/java/cursor/contracts/workflow-policy.json +1 -1
- package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-archive/SKILL.md +21 -33
- package/harness/bundles/java/cursor/harness-archive/checklist.md +6 -10
- package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-package/checklist.md +1 -1
- package/harness/bundles/java/cursor/harness-plan/SKILL.md +7 -3
- package/harness/bundles/java/cursor/harness-plan/checklist.md +2 -1
- package/harness/bundles/java/cursor/harness-review/SKILL.md +4 -4
- package/harness/bundles/java/cursor/harness-run/SKILL.md +9 -7
- package/harness/bundles/java/cursor/harness-run/checklist.md +1 -1
- package/harness/bundles/java/cursor/harness-run/reference.md +2 -2
- package/harness/bundles/java/cursor/harness-submit/SKILL.md +6 -6
- package/harness/bundles/java/cursor/harness-submit/checklist.md +1 -1
- package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
- package/harness/bundles/java/cursor/harness-test/SKILL.md +8 -6
- package/harness/bundles/java/cursor/harness-test/checklist.md +1 -1
- package/harness/bundles/java/cursor/harness-test/reference.md +1 -1
- package/harness/bundles/java/cursor/protocols/ledger-protocol.md +3 -3
- package/harness/bundles/java/cursor/scripts/harness_archive.py +322 -74
- package/harness/bundles/java/cursor/scripts/harness_context.py +236 -63
- package/harness/bundles/java/cursor/scripts/harness_events.py +86 -5
- package/harness/bundles/java/cursor/scripts/harness_events_sync.py +201 -17
- package/harness/bundles/java/cursor/scripts/harness_fixback.py +189 -1
- package/harness/bundles/java/cursor/scripts/harness_gate.py +353 -3
- package/harness/bundles/java/cursor/scripts/harness_ledger.py +195 -11
- package/harness/bundles/java/cursor/scripts/harness_plan_finalize.py +82 -0
- package/harness/bundles/java/cursor/scripts/harness_test_guard.py +37 -44
- package/harness/manifests/general/claude-code.json +32 -32
- package/harness/manifests/general/codebuddy.json +32 -32
- package/harness/manifests/general/codex.json +32 -32
- package/harness/manifests/general/cursor.json +32 -32
- package/harness/manifests/java/claude-code.json +35 -35
- package/harness/manifests/java/codebuddy.json +35 -35
- package/harness/manifests/java/codex.json +35 -35
- package/harness/manifests/java/cursor.json +35 -35
- package/hunter-workflow-family.json +5 -4
- package/package.json +1 -1
|
@@ -278,7 +278,7 @@ harness-skills/
|
|
|
278
278
|
| **submit 步骤 4** | 提交前必须展示四项:实际 staged 文件列表、diff stat、commit message、是否 push |
|
|
279
279
|
| **submit push 前** | `git fetch` 后检查远程是否有新提交;有则**不得直接 pull 后 push**,必须 pull/rebase + 重新 compile/test |
|
|
280
280
|
| **submit hash 记录** | pre-pull local hash + final pushed hash 双标注(主目录);worktree 模式 submit 段只本地 commit,合并段产生 `mergeFinalHash`,archive 以 `mergeFinalHash` 为准(无则回退 final pushed hash) |
|
|
281
|
-
| **archive 阶段 1** |
|
|
281
|
+
| **archive 阶段 1** | 归档前确认实际计划阶段的证据与结局;有 Git 时核对最终提交身份,无 Git、无 upstream 或跳过 submit 时使用内容清单身份。发布候选资格与本地封存分开判断;阶段边界由 finalize 单进程维护,调用者不额外 append |
|
|
282
282
|
| **archive 文件移动** | 只用 PowerShell 或 Read+Write+验证,**禁止 Bash mv/cp/rm**;移动失败时不删除原目录 |
|
|
283
283
|
| **archive final-summary** | 必须运行 `harness_archive.py finalize` 生成权威 `summary-data.json` 并完成 validate;`final-summary.html` 为可选展示投影(默认渲染,失败只记 warning 不回滚;`finalize --no-html` 可跳过)。无测试或无 review 时必须在 JSON 中标记 `NOT_RUN` / `ADVISORY_NOT_RUN`,禁止伪造 100% 通过率。状态演进须真实展示(✅OK / 🟡WARN / 🔁REUSED / 🔁RETESTED / 📝ADVISORY / 🧹NON_BEHAVIORAL_CLEANUP) |
|
|
284
284
|
|
|
@@ -339,9 +339,9 @@ harness-skills/
|
|
|
339
339
|
|
|
340
340
|
> **harness-review 是参考性审查阶段**:默认只生成参考性审查报告和按需 fixback,不影响后续 submit、archive。如果用户选择处理 fixback,回到 `/harness-run --fixback`,再执行 `/harness-test` 和 `/harness-review`;如果团队希望 review RED 阻塞提交,可在 `.harness/config/harness-test-config.md` 中设置 `review.strict-review-gate: true`。
|
|
341
341
|
|
|
342
|
-
>
|
|
342
|
+
> **阶段顺序以计划为准**:Plan 会把本次 `plannedPhases` 写入上下文,后续阶段只消费该计划,不再假定 test、review、submit 或 merge 必经。快速流程默认可用 `plan → run → archive`;需要完整验证、评审或提交时再把对应阶段加入计划。无 Git、无 upstream、仅本地提交或主动跳过 submit 都不妨碍事实封存;只有“发布候选”需要额外满足发布策略。
|
|
343
343
|
|
|
344
|
-
> **verification-ledger
|
|
344
|
+
> **verification-ledger 驱动跨阶段复用**:先通过共享状态目录解析器定位变更,再读写其 `evidence/verification-ledger.json`,其中记录 compile/unitTest/apiTest 的结果、证据、diffHash 和作用范围。run/test/submit 执行验证前先读 ledger,满足复用条件(diffHash 一致、module/profile 一致、范围更严格、有证据、无行为性 post-test 修改)则跳过重跑并标记 🔁REUSED;post-test 小改动按 7 类分类,非行为性清理可复用 API 测试。详见 `protocols/ledger-protocol.md`。
|
|
345
345
|
|
|
346
346
|
## 外部方法论吸收(已内化)
|
|
347
347
|
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"riskTiers": {
|
|
35
35
|
"fast": {
|
|
36
36
|
"description": "Low-risk docs/comments/non-behavioral config; no API/DB/security/concurrency. Policy notes: checkpointRules apply only when meta/implementation-checkpoints.json defines the entry for this change; missing file/entry = disabled (gate must not require --task).",
|
|
37
|
-
"defaultPhases": ["plan", "run", "
|
|
37
|
+
"defaultPhases": ["plan", "run", "archive"],
|
|
38
38
|
"requiredValidations": ["unitTest"],
|
|
39
39
|
"conditionalStages": ["review", "package", "apidoc"],
|
|
40
40
|
"upgradeTriggers": ["api-change", "security", "migration", "concurrency", "breaking-contract"]
|
|
@@ -21,50 +21,38 @@ disallowed-tools:
|
|
|
21
21
|
- Bash(awk *)
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
---
|
|
24
|
-
<!-- generated by harness_deploy.py; core=
|
|
24
|
+
<!-- generated by harness_deploy.py; core=da2c4ac217b8c723; overlay=none; agent=claude-code; do not edit -->
|
|
25
25
|
# harness-archive — 变更归档
|
|
26
26
|
|
|
27
27
|
## Purpose
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
把变更事实安全封存、生成确定性 ZIP,并在已连接 Hunter Platform 时上传保存。归档结局、发布资格、Git 远端和平台上传分别建模,互不冒充前置条件。
|
|
30
30
|
|
|
31
31
|
## When to Use
|
|
32
32
|
|
|
33
33
|
仅当用户显式调用 `/harness-archive` 时执行。submit/merge 完成后**不自动**进入本阶段;用户口头说"归档/收尾"而未调用本 skill 时,先确认。
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
跳过场景:
|
|
38
|
-
|
|
39
|
-
- 变更尚未 submit 推送(归档前 commit 必须已 push)。
|
|
40
|
-
- 仍存在未结清的 test/review 验证(除非已明确标记 CONDITIONAL_OK)。
|
|
35
|
+
前置只看本次 `plannedPhases` 与用户选择的生命周期结局。Submit、Test 或 Review 未在计划中时记录为“未执行”,不得临时补跑;无 Git、无 upstream、仅本地 commit 都允许归档和平台上传,只是不能声明为发布候选。
|
|
41
36
|
|
|
42
37
|
自动调用边界:
|
|
43
38
|
|
|
44
39
|
- 归档涉及移动/删除原变更目录,**禁止被其他 skill 自动调用**;只接受用户显式 `/harness-archive` 调用。
|
|
45
|
-
- `harness_archive.py auto-gate`
|
|
40
|
+
- `harness_archive.py auto-gate` 只影响**本次显式调用内**是否需要归档确认对话:实际计划中的最后阶段已终态、archive-boundary/content snapshot 存在且保存门禁满足时可跳过确认。auto-gate 不构成跨阶段自动触发的授权。
|
|
46
41
|
|
|
47
42
|
## 前置条件
|
|
48
43
|
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
- **最小必备集(H-4 / `harness_archive.py status` blockers)**:
|
|
53
|
-
- `plans/*-plan.md`
|
|
54
|
-
- 非空 `events.ndjson`
|
|
55
|
-
- `evidence/verification-ledger.json`
|
|
56
|
-
- 至少一个 test 或 review 报告/证据
|
|
57
|
-
- 缺失任一项 → `archivable=false`;可从 `.harness/cache/change-snapshots/<change>/` 恢复正式层后再重试
|
|
44
|
+
- **最终产品身份**:Git 项目优先使用 Submit 最终收据/当前 HEAD;提交前验证而内容未变化时由 `certify-local` 自动重绑定 commit。非 Git 项目使用确定性内容清单与产品树散列,并记录 `sourceControl=none`。
|
|
45
|
+
- **正常完成**按 `plannedPhases` 检查已规划阶段;被省略阶段记录 `NOT_RUN` / `NOT_APPLICABLE`。**结束未完成变更**只要求足以识别和安全封存变更的最小设计、事件与内容清单,不要求补齐测试、评审或提交。
|
|
46
|
+
- 所有 events、ledger、reports、receipts 和 upload state 都通过 state layout 解析器读取;split-v1 的权威状态位于 `.harness/state/changes/<change>`,禁止复制到旧目录。
|
|
58
47
|
- **产品候选验证**:
|
|
59
48
|
- 有远端 CI:保留 `product-candidate-ci.json` 兼容证据;归档会把有效的 legacy schema v1 证据迁移为 `remote-claimed` 的 schema v2 `product-candidate-verification.json`,不会冒充 `remote-attested`。
|
|
60
49
|
- `remote-attested` 必须同时带远端运行 URL 与 `verification.attestationDigest`;只有 URL、旧 JSON 哈希或 ledger 哈希只能达到 `remote-claimed`。
|
|
61
50
|
- 无 CI:先运行 `harness_archive.py certify-local --change-dir ... --project . --json`,只复用身份一致且完整的 `unitTestFull` ledger 证据,不重复执行测试。
|
|
62
|
-
- `release-candidate`
|
|
51
|
+
- `release-candidate` 要求候选验证通过;正常本地完成或结束未完成变更使用 `--intent record-only`,固定 `releaseEligible=false`,但仍生成 ZIP 并上传平台。
|
|
63
52
|
|
|
64
53
|
## Inputs
|
|
65
54
|
|
|
66
|
-
- `$ARGUMENTS
|
|
67
|
-
- 相关文件:`.harness/changes/<change-name>/logs/execution-log.md`、`.harness/changes/<change-name>/events.ndjson`、`evidence/verification-ledger.json`、各阶段 reports/
|
|
55
|
+
- `$ARGUMENTS`:变更名(可选);必须由 `harness_change.py resolve` 解析 contract/state 双层目录,禁止按 mtime 或固定旧路径猜测。
|
|
68
56
|
|
|
69
57
|
## 统一读取协议
|
|
70
58
|
|
|
@@ -96,29 +84,29 @@ disallowed-tools:
|
|
|
96
84
|
- `../protocols/sensitive-info-protocol.md`
|
|
97
85
|
- `../protocols/evidence-based-reporting-protocol.md`
|
|
98
86
|
- `../protocols/report-pipeline-protocol.md`
|
|
99
|
-
4. 解析 `$ARGUMENTS
|
|
87
|
+
4. 用 `harness_change.py resolve [--change] --json` 解析 `$ARGUMENTS`;多个 active change 时让用户选择。
|
|
100
88
|
|
|
101
89
|
### Phase 1:确认归档对象(扫描未归档变更)
|
|
102
90
|
|
|
103
|
-
|
|
91
|
+
使用 resolver 返回的 active changes 展示变更概要;同时读取 `plannedPhases`、已完成阶段、Git 能力、平台连接和待上传 ZIP 状态。
|
|
104
92
|
|
|
105
93
|
- **Read `checklist.md`** — 归档前检查项
|
|
106
94
|
- 发现多个未归档变更 → 让用户选择或终止
|
|
107
95
|
|
|
108
96
|
### Phase 2:确认归档 / 自动门禁
|
|
109
97
|
|
|
110
|
-
先运行 `harness_archive.py auto-gate --change-dir "
|
|
98
|
+
先运行 `harness_archive.py auto-gate --change-dir "<executionRoot>" --intent <intent> --json`。
|
|
111
99
|
|
|
112
100
|
- `autoArchiveAllowed=true`:记录 gate receipt,直接进入 Phase 3;无需 AskQuestion。
|
|
113
|
-
-
|
|
101
|
+
- 否则用中文提供:①正常完成并归档(本地验证、不可发布);②作为发布候选归档;③结束未完成变更;④取消。选择③后继续选择“主动废弃”或“被其他方案替代”,并填写中文原因。不要把无 upstream 显示为阻止保存。
|
|
114
102
|
|
|
115
103
|
- **Read `reference.md`** — 确认对话框的内容格式
|
|
116
104
|
|
|
117
105
|
### Phase 3:执行归档
|
|
118
106
|
|
|
119
|
-
1.
|
|
107
|
+
1. 对“发布候选”使用 `--intent release-candidate --closure completed`;对正常本地完成使用 `--intent record-only --closure completed`;主动废弃或被替代分别使用 `--intent record-only --closure abandoned|superseded --closure-reason "<中文原因>"`。先运行 `status`;有可复用全量 ledger 时可运行 `certify-local`,不得重复测试。
|
|
120
108
|
2. `meta/archive-meta.md` **由 `harness_archive.py finalize` 自动生成**(与 summary-data `finalStatus` 同源);**禁止 agent 手写**该文件,手写视为数据丢失。维护者结论写入 events(decision/issue)即可,finalize 会汇总到 summary / archive-meta。
|
|
121
|
-
3. 运行 `
|
|
109
|
+
3. 运行 `harness_archive.py finalize --change-dir "<executionRoot>" --archive-root ".harness/archive" --intent <...> --closure <...> [--closure-reason "..."] --json`;读 JSON(cleanup、事件、移动、collect、render、validate、manifest、archive-meta、ZIP、上传与服务端知识状态)。finalize 内部只负责一次 `phase.start` / `phase.end`,调用者不得重复追加。**本地不执行知识 ingest**;服务端在 ZIP 持久保存并解包后 ingest。失败时保留原目录、ZIP 和回执。
|
|
122
110
|
- **归档包上传**:始终先生成一个确定性 ZIP;有远程凭据时再调用 `npx hunter-harness archive upload`。ZIP 仅包含 `summary-data.json`、`spec/**/*.md`、`plans/**/*.md`、`archive-meta.md`、`change-context.json` 和稳定 manifest;明确排除 logs、review/test 报告、HTML、缓存、备份、凭据和临时文件。
|
|
123
111
|
- **失败可恢复**:无论远端凭据是否齐全,都先生成 ZIP 与 `<change-key>.upload.json`;上传或服务端 ingest 失败不破坏本地归档。待上传 ZIP 与逐 change 回执保留在 `.harness/state/local/archive-packages/`,可枚举独立重试。只有 CLI 核验 package hash 且服务端同时返回 `archive_status=durable`、`knowledge_status=ready` 后,才清理对应 ZIP 与回执;`indexing` 记为 pending,不记为失败。
|
|
124
112
|
- **监控终态(C3)**:auto-upload 之后自动 `events-sync`,用归档前 change 路径派生的 `run_id` + 原 `change_key` 上报;失败只记 warning。
|
|
@@ -155,7 +143,7 @@ disallowed-tools:
|
|
|
155
143
|
|
|
156
144
|
### 二、归档前确认或自动门禁
|
|
157
145
|
|
|
158
|
-
`auto-gate`
|
|
146
|
+
`auto-gate` 只有在实际计划最后阶段终态、边界快照存在且 `status.archivable=true` 时才允许无确认执行。未满足时按 Phase 2 的四个中文选项确认;用户取消则不执行移动。
|
|
159
147
|
|
|
160
148
|
### 三、文件移动只用内置工具或 PowerShell
|
|
161
149
|
|
|
@@ -169,12 +157,12 @@ disallowed-tools:
|
|
|
169
157
|
|
|
170
158
|
归档前后生成 `evidence/archive-manifest-before.json` / `archive-manifest-after.json`(path/size/sha256),before/after 不一致时**不得删除原目录**。复杂 PowerShell 写入 `scripts/*.ps1` 后 `-File` 执行,禁止内联 `$` / `$_` / `@{}`。详见 `reference.md`。
|
|
171
159
|
|
|
172
|
-
###
|
|
160
|
+
### 六、归档前确认四项
|
|
173
161
|
|
|
174
|
-
-
|
|
175
|
-
-
|
|
176
|
-
-
|
|
177
|
-
-
|
|
162
|
+
- 生命周期结局与中文原因已确认;正常完成、主动废弃、被其他方案替代不得混写
|
|
163
|
+
- Git 项目记录当前 HEAD 与 upstream 状态;无 upstream 只影响发布资格,不阻止保存。非 Git 项目记录内容身份
|
|
164
|
+
- Test/Review 只按 `plannedPhases` 核对;未规划或提前结束时如实标记未执行
|
|
165
|
+
- 平台连接与 Git remote 分开检查;无 Git remote 仍生成 ZIP,并在平台已连接时上传
|
|
178
166
|
|
|
179
167
|
### 七、verification-ledger 汇总状态
|
|
180
168
|
|
|
@@ -37,19 +37,15 @@ description: harness-archive 的归档前检查项和归档后验证项。仅在
|
|
|
37
37
|
|
|
38
38
|
- [ ] 未在调用 finalize 前手工追加 archive 阶段边界
|
|
39
39
|
- [ ] 只有一个未归档变更目录(多个时终止或让用户选择)
|
|
40
|
-
- [ ]
|
|
41
|
-
|
|
42
|
-
- [ ] `events.ndjson` 存在且非空
|
|
43
|
-
- [ ] `evidence/verification-ledger.json` 存在
|
|
44
|
-
- [ ] 至少一个 test 或 review 报告/证据
|
|
45
|
-
- [ ] 若缺失:优先从 `.harness/cache/change-snapshots/<change>/` 恢复,禁止空壳归档
|
|
40
|
+
- [ ] 已确认 `closure`:正常完成 / 主动废弃 / 被其他方案替代;后两者有中文 `closure-reason`
|
|
41
|
+
- [ ] 正常完成按 `plannedPhases` 核对;提前结束只要求可识别变更与安全封存的最小材料
|
|
46
42
|
- [ ] 变更目录下有 plans/ 子目录(至少有计划文件)
|
|
47
43
|
- [ ] `events.ndjson` 存在;执行日志允许由 finalize 从事件流重新渲染(旧 archive 才兼容根目录 `execution-log.md`)
|
|
48
44
|
- [ ] 准备生成 `archive-manifest-before.json`(path/size/sha256)
|
|
49
45
|
- [ ] 准备生成 `summary-data.json`(业务目标、阶段状态、验证、产物、维护者结论)
|
|
50
|
-
- [ ]
|
|
51
|
-
- [ ]
|
|
52
|
-
- [ ]
|
|
46
|
+
- [ ] Git 项目记录 dirty/HEAD/upstream;无 upstream 或仅本地 commit 允许归档,但 `releaseEligible=false`
|
|
47
|
+
- [ ] 非 Git 项目生成确定性内容清单与产品树散列,并记录 `sourceControl=none`
|
|
48
|
+
- [ ] 最终产品身份来自 Submit 收据或当前内容;提交前候选只允许在验证输入未变化时由 `certify-local` 自动重绑定
|
|
53
49
|
- [ ] **test/review 报告状态确认**:
|
|
54
50
|
- ✅ `.harness/changes/<change-name>/tests/test-report-*.md` 存在 → 归档正常
|
|
55
51
|
- 🟡 不存在 → 必须在 archive-meta.md 和 final-summary.html 中标记"跳过测试"或"未运行测试",不得伪造通过率
|
|
@@ -63,7 +59,7 @@ description: harness-archive 的归档前检查项和归档后验证项。仅在
|
|
|
63
59
|
- [ ] `.harness/archive/YYYY-MM-DD-<change-name>/` 目录存在(通过 Glob 实际扫描确认)
|
|
64
60
|
- [ ] 所有子目录(plans/, tests/, reviews/, sqls/)已完整移入(通过 Glob 实际扫描确认,不仅看预期路径)
|
|
65
61
|
- [ ] before/after manifest 校验通过(排除 `logs/execution-log.md`——归档追加结束记录预期 sha256 变化;其他 moved 文件 sha256 必须一致,missing/mismatch=0)
|
|
66
|
-
- [ ]
|
|
62
|
+
- [ ] archive-meta.md 由 finalize 自动生成且字段完整;调用者未手写或补改
|
|
67
63
|
- [ ] summary-data.json 已生成,且为合法 JSON
|
|
68
64
|
- [ ] final-summary.html 已由 `templates/render-summary.mjs` 渲染生成
|
|
69
65
|
- [ ] **final-summary.html 真实性检查**:
|
|
@@ -20,7 +20,7 @@ disallowed-tools:
|
|
|
20
20
|
- Bash(awk *)
|
|
21
21
|
- Bash(curl *)
|
|
22
22
|
---
|
|
23
|
-
<!-- generated by harness_deploy.py; core=
|
|
23
|
+
<!-- generated by harness_deploy.py; core=da2c4ac217b8c723; overlay=none; agent=claude-code; do not edit -->
|
|
24
24
|
# harness-codebase-map — 代码库地图
|
|
25
25
|
|
|
26
26
|
## Purpose
|
|
@@ -8,7 +8,7 @@ disallowed-tools:
|
|
|
8
8
|
- Bash(git *)
|
|
9
9
|
- Bash(curl *)
|
|
10
10
|
---
|
|
11
|
-
<!-- generated by harness_deploy.py; core=
|
|
11
|
+
<!-- generated by harness_deploy.py; core=da2c4ac217b8c723; overlay=none; agent=claude-code; do not edit -->
|
|
12
12
|
# harness-knowledge-ingest
|
|
13
13
|
|
|
14
14
|
知识 ingest 完全由 Hunter Platform 负责。归档完成时,客户端生成一个确定性 ZIP;
|
|
@@ -8,7 +8,7 @@ disallowed-tools:
|
|
|
8
8
|
- Bash(git *)
|
|
9
9
|
- Bash(curl *)
|
|
10
10
|
---
|
|
11
|
-
<!-- generated by harness_deploy.py; core=
|
|
11
|
+
<!-- generated by harness_deploy.py; core=da2c4ac217b8c723; overlay=none; agent=claude-code; do not edit -->
|
|
12
12
|
# harness-knowledge-query
|
|
13
13
|
|
|
14
14
|
项目知识以 Hunter Platform 的服务端索引为唯一真源。客户端只提交查询并消费结果:
|
|
@@ -21,7 +21,7 @@ disallowed-tools:
|
|
|
21
21
|
- Bash(awk *)
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
---
|
|
24
|
-
<!-- generated by harness_deploy.py; core=
|
|
24
|
+
<!-- generated by harness_deploy.py; core=da2c4ac217b8c723; overlay=none; agent=claude-code; do not edit -->
|
|
25
25
|
# harness-plan — 需求规划
|
|
26
26
|
|
|
27
27
|
## Purpose
|
|
@@ -34,7 +34,7 @@ disallowed-tools:
|
|
|
34
34
|
|
|
35
35
|
仅当用户显式调用 `/harness-plan`(或明确说"用 harness 规划这个需求")时执行。用户只是描述需求、提问或讨论方案时,**不得**自动进入本 skill。
|
|
36
36
|
|
|
37
|
-
**单阶段原则**:本 skill 只负责 plan 阶段。plan finalize + verify
|
|
37
|
+
**单阶段原则**:本 skill 只负责 plan 阶段。plan finalize + verify 完成后必须停止并交还用户,仅提示 `plannedPhases` 中的真实下一阶段;禁止自动调用其他阶段 skill。
|
|
38
38
|
|
|
39
39
|
## 统一读取协议
|
|
40
40
|
|
|
@@ -86,13 +86,14 @@ disallowed-tools:
|
|
|
86
86
|
|------|------|
|
|
87
87
|
| 0 | 用当前解释器运行 `harness_runtime.py doctor`,后续消费绝对 argv;git status;脏工作区 → baseline 隔离 + `decision`,不询问 |
|
|
88
88
|
| 0.5 | 确定英文 `change-name` 后,根据需求生成一次简洁的中文展示标题(建议 6~24 个可见字符,保留必要产品名),执行 `harness_context.py prepare --phase plan --executor <tool> [--change <id>] --title "<中文标题>" --json`;英文名继续作为目录与稳定标识。以其唯一 change/executionRoot 初始化 plan-run-id 与 attempt(首次为 1),用同一身份追加 `phase.start`;从第一条知识查询起保留事件证据,并在 finalizer 中复用该身份 |
|
|
89
|
+
| 0.6 | 使用 `classify` 返回的默认阶段和项目能力生成 `plannedPhases`,向用户用中文说明可选阶段;确认后运行 `harness_context.py configure-plan --project . --change <id> --phases "plan,run,...,archive" --operator <tool> --reason "<中文原因>" --json`。无 Git 或不需要提交时不得加入 `submit`;快速迭代默认 `plan,run,archive`。省略项由脚本写入 `skippedPhases`,不得伪造阶段事件 |
|
|
89
90
|
| 1 | `harness-knowledge-query` 单次远端 query(失败记 `issue`,不建立本地索引或离线回退) |
|
|
90
91
|
| 2 | 歧义优先检查 + 复杂度分级;先确认会改变实现方向的语义歧义 |
|
|
91
92
|
| 3 | 按复杂度执行有预算的代码探索;简单修复不得扩散到无关模块 |
|
|
92
93
|
| 4 | **设计审批包** blocking user confirmation;确认事件早于 approved 设计文档和 `meta/worktree.json` |
|
|
93
94
|
| 5–6 | plan + implementation-detail + test-scenarios → `plans/` |
|
|
94
95
|
| 7.5 | 仅 `--adversarial` 对抗评审 |
|
|
95
|
-
| 8 | 在临时产物集上运行 `harness_plan_finalize.py finalize`,随后立即运行 `verify
|
|
96
|
+
| 8 | 在临时产物集上运行 `harness_plan_finalize.py finalize`,随后立即运行 `verify`;成功后把 finalizer 返回的绝对 `receiptPath` 原样传给 `harness_context.py close`,`--to-phase` 必须取 `plannedPhases` 中 plan 的真实后继,不得写死。写 append-only handoff receipt;不得手写占位路径;原子发布、派生清单计数对账、完整生命周期、render → `checklist.md` |
|
|
96
97
|
|
|
97
98
|
change-name 范围变更 → 提示重命名或记 🟡WARN(→ `reference.md`)
|
|
98
99
|
|
|
@@ -114,6 +115,9 @@ change-name 范围变更 → 提示重命名或记 🟡WARN(→ `reference.md`
|
|
|
114
115
|
|------|------|
|
|
115
116
|
| 产物路径 | 只写 `.harness/changes/<cn>/`;禁止 superpowers 输入 |
|
|
116
117
|
| Change 标题 | 首次 Plan 同时确定英文 `change-name` 与中文展示标题;英文名保持目录和机器标识不变,中文标题由 `prepare --title` 持久化,后续阶段只复用、不重新生成 |
|
|
118
|
+
| 阶段计划 | Plan 必须持久化 `plannedPhases`;固定从 plan 开始、以 archive 结束。Test、Review、Submit、Package、API 文档可按项目策略省略;高风险必需项只能转为“提前结束且不可发布”,不得伪装通过 |
|
|
119
|
+
| 产品边界 | `ownership.productPaths` 必须覆盖计划会修改的源文件、测试文件和构建入口;只写目录前缀或精确文件,禁止 `**` 通配。finalize 前对照任务表补齐,避免归档阶段才发现边界缺口 |
|
|
120
|
+
| 空目录 | 不得为“预留目录”生成 `.gitkeep`;只有产品明确需要跟踪空目录时才能创建,并在计划中说明业务原因 |
|
|
117
121
|
| 设计审批包 | 一次 blocking user confirmation 含 worktree(读 `harness.json` `defaultWorktree`) |
|
|
118
122
|
| 阶段 8 | spec/plan/detail/scenarios/gate-policy/worktree 六项标准产物先进入 staging;仅 finalizer 校验成功后发布并写唯一 `phase.end`/log;随后 `verify` 必须确认 start/end、收据完整覆盖六项标准产物、哈希、全部任务表和非空场景清单一致,失败不得手工补终态 |
|
|
119
123
|
| Plan 结束 | **禁止**询问执行模式;只提示 `/harness-run` |
|
|
@@ -211,13 +211,14 @@ source: harness-plan
|
|
|
211
211
|
|
|
212
212
|
- [ ] 所有待发布产物先写入 staging,不直接覆盖正式 change 目录
|
|
213
213
|
- [ ] 执行 `harness_plan_finalize.py finalize --change-dir ... --staging-dir ... --change ... --run-id <plan-run-id> --attempt <attempt> --json`;身份必须与本次 `phase.start` 完全相同
|
|
214
|
-
- [ ] finalizer 返回 `ok=true`
|
|
214
|
+
- [ ] finalizer 返回 `ok=true`、`artifactsHash`、绝对 `receiptPath` 与稳定 `artifactRef=meta/plan-finalization.json`;重复执行返回 `idempotent=true`
|
|
215
215
|
- [ ] 紧接着执行 `harness_plan_finalize.py verify --change-dir ... --json`
|
|
216
216
|
- [ ] verify 返回 `phaseStartCount=1`、`phaseEndCount=1`、`phaseEndStatus=OK`、`receiptConsistent=true`
|
|
217
217
|
- [ ] 收据 `files` 完整包含 design / plan / implementation-detail / test-scenarios / gate-policy / worktree 六项标准产物;不得省略、重复或经 symlink/junction/reparse point 引用
|
|
218
218
|
- [ ] verify 的 `taskCount` 等于全部任务表行数,`scenarioCount` 等于 Markdown 中全部唯一场景 ID 数;任一为 0 或不一致即 ❌FAIL
|
|
219
219
|
- [ ] finalizer 失败时正式目录无半发布产物、无成功 `phase.end`、无伪造 execution log
|
|
220
220
|
- [ ] 禁止在 finalizer 之前手工追加成功 `phase.end`
|
|
221
|
+
- [ ] context close 的 `--artifact` 只传 finalizer 原样返回的 `receiptPath` 或 `artifactRef`,不得猜测、拼接或使用 `<plan-finalization>` 占位文本
|
|
221
222
|
|
|
222
223
|
| 文件 | 必须存在 | 检查结果 |
|
|
223
224
|
|------|:---:|:---:|
|
|
@@ -22,7 +22,7 @@ disallowed-tools:
|
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
- Bash(codegraph *)
|
|
24
24
|
---
|
|
25
|
-
<!-- generated by harness_deploy.py; core=
|
|
25
|
+
<!-- generated by harness_deploy.py; core=da2c4ac217b8c723; overlay=none; agent=claude-code; do not edit -->
|
|
26
26
|
# harness-review — 代码审查
|
|
27
27
|
|
|
28
28
|
## Purpose
|
|
@@ -63,14 +63,18 @@ disallowed-tools:
|
|
|
63
63
|
|
|
64
64
|
## Workflow
|
|
65
65
|
|
|
66
|
-
先用 `harness_context.py prepare --phase review --executor <tool> [--change <id>] --json` 与 `harness_context.py begin --phase review --change <id> --executor <tool> --json` 解析唯一 active change
|
|
66
|
+
先用 `harness_context.py prepare --phase review --executor <tool> [--change <id>] --json` 与 `harness_context.py begin --phase review --change <id> --executor <tool> --json` 解析唯一 active change 并校验实际前序 receipt;多个 active change 未显式选择时返回 `ACTIVE_CHANGE_AMBIGUOUS`,禁止再按 Glob/mtime 猜测。阶段门禁使用 `harness_gate.py begin --phase review --change <id> --task <n> --skills-root <skills-root> --executor-tool <tool> --json`;结束时只执行一次 `harness_gate.py close`,正常路径的 `--to-phase` 取 `plannedPhases` 中 review 的后继,Fixback 才返回 run。由 gate 完成阶段事件、租约、上下文交接与远端补传。不得手工追加阶段边界或再次调用 context close;任一 close 失败不得宣称评审完成。
|
|
67
67
|
|
|
68
68
|
0. **启动准备** — 确定变更名(Glob `.harness/changes/*/plans/*-plan.md`,排除 `.harness/archive/*/`,读 frontmatter 提取 change-name);**append `phase.start` 事件**(不得等审查完成才补)
|
|
69
69
|
1. **读取 worktree 状态(门禁检查)** — 读 `.harness/changes/<change-name>/meta/worktree.json`:`requested=true` 但 worktree 不存在 → 停止并提示先修复 `harness-run`,不得静默回主目录(否则 git diff 为空);`requested=true` 且 worktree 已创建 → spawned agent 用该 worktree 路径执行 `git diff`(确保审查 worktree 变更而非主目录);`requested=false` → 审查主目录变更
|
|
70
70
|
<!-- @section-id review.delegate -->
|
|
71
|
-
### 2.
|
|
71
|
+
### 2. 审查执行(独立评审优先)
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
review 默认优先在独立上下文执行,避免主会话已形成的实现结论影响审查。阶段开始后只做一次能力判定:固定 reviewer 可用时执行 `python <skills-root>/scripts/harness_preflight.py check-agents --skills-root <skills-root> --agent harness-reviewer --json`;宿主提供通用隔离任务能力时可直接委派一次只读审查。委派只读取 diff、规则和测试证据,主会话负责最终核验与落盘。
|
|
74
|
+
|
|
75
|
+
无隔离能力、定义损坏、spawn 失败、空返回或只有元数据时,不重试,立即由主会话按同一 6 维度检查清单完成审查。无论是否委派,都必须追加一条结构化 `decision` 事件:`--execution-mode delegated|inline` 标明执行方式;委派时写 `--executor-agent harness-reviewer --decision-reason-code REVIEW_DELEGATED`;回退时只写一个 `--fallback-reason-code REVIEW_INLINE_UNAVAILABLE|REVIEW_INLINE_SPAWN_FAILED|REVIEW_INLINE_INVALID_RESULT`。`decision` 和 `reason` 必须用中文完整说明,禁止把原因码拼进正文。正常主会话评审是可接受结果,不显示成流程故障;`fallbackPolicy=inline-no-retry`。
|
|
76
|
+
|
|
77
|
+
项目规模小、风险低或没有 CodeGraph 都不是跳过独立评审的理由。原因码是稳定机器字段,仅用于协议与技术详情;面向用户的事件摘要必须写成「已使用独立评审」或「当前环境没有可用的隔离评审能力,已由主会话完成评审」等中文说明。
|
|
74
78
|
|
|
75
79
|
3. **持久化报告与事实 sidecar(强制,主会话)** — Agent 返回后主会话 Write 到 `reports/review/review-report-*.md`,并把同一批发现写成临时 JSON 后调用 `python <skills-root>/scripts/harness_review.py write-findings --change-dir <change-dir> --input <findings.json>`。权威计数来自 `reports/review/review-findings.json`,不是 Markdown。任一写入缺失 → 🟡WARN,不得宣称 review 完成。
|
|
76
80
|
4. **生成修复反馈(原生协议)** — 若报告存在 RED/YELLOW 问题,执行 `protocols.md` 的 `review-fixback-protocol`,将问题转化为结构化 fixback 清单并落盘到 `.harness/changes/<change-name>/reports/review/fixback-YYYYMMDD-HHmm.md`;随后把 disposition 临时 JSON 交给 `python <skills-root>/scripts/harness_review.py write-dispositions --change-dir <change-dir> --input <dispositions.json>`,权威状态写入 `reports/review/fixback-dispositions.json`。若无 RED/YELLOW,也必须写空 findings sidecar,并记录 `review-fixback-protocol: skipped(no findings)`。不调用 Superpowers `receiving-code-review`,也不记录外部 skill 降级。
|
|
@@ -22,7 +22,7 @@ disallowed-tools:
|
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
- Bash(codegraph *)
|
|
24
24
|
---
|
|
25
|
-
<!-- generated by harness_deploy.py; core=
|
|
25
|
+
<!-- generated by harness_deploy.py; core=da2c4ac217b8c723; overlay=none; agent=claude-code; do not edit -->
|
|
26
26
|
# harness-run — 需求编码
|
|
27
27
|
|
|
28
28
|
## Purpose
|
|
@@ -33,7 +33,7 @@ disallowed-tools:
|
|
|
33
33
|
|
|
34
34
|
仅当用户显式调用 `/harness-run` 时执行;plan 完成后**不自动**进入本阶段。参数:`--subagent` 强制 Subagent-Driven;`--inline` 等同默认;`--fixback` 读最新 review fixback。**默认 Inline,不询问执行模式**。
|
|
35
35
|
|
|
36
|
-
**单阶段原则**:run
|
|
36
|
+
**单阶段原则**:run 关门后必须停止并交还用户,仅提示 `plannedPhases` 中的真实下一阶段;禁止自动开始其他阶段。
|
|
37
37
|
|
|
38
38
|
## 前置条件
|
|
39
39
|
|
|
@@ -78,14 +78,16 @@ disallowed-tools:
|
|
|
78
78
|
|
|
79
79
|
## Workflow 概要
|
|
80
80
|
|
|
81
|
-
0. 加载上下文:先 `harness_context.py prepare --phase run --executor <tool> [--change <id>] --json
|
|
82
|
-
0.5. **测试基础设施探测**(先写 `CHECKING`,四项证据齐备后再结论)→ `reference.md` Step 0.5
|
|
81
|
+
0. 加载上下文:先 `harness_context.py prepare --phase run --executor <tool> [--change <id>] --json`,再 **`harness_context.py begin --phase run --change <id> --executor <tool> --json`** 校验交接。`--fixback` 时紧接着运行 `harness_fixback.py resume --change-dir "<executionRoot>"`,只消费返回的 `batchId/runId/attempt/nextStep/changedFiles/requiredVerifications`;重复调用必须复用同一批次和轮次,不重新通读实现或另建脚本。最后运行 **`harness_gate.py begin --phase run --change <id>`**;上下文未完成时 gate 会在创建租约前拒绝。禁止手写 `events.ndjson` / `phase.end`。已连接平台时 begin 会 best-effort 补传事件,失败只告警。
|
|
82
|
+
0.5. **测试基础设施探测**(先写 `CHECKING`,四项证据齐备后再结论)→ `reference.md` Step 0.5;测试基线已由上一步 gate begin 内部建立,不得再次执行 guard begin
|
|
83
83
|
1. **变更簇 TDD** — `protocols.md` `run-tdd-protocol`;批量 RED/GREEN;按需 `change-cluster-review-protocol`(高风险 + reviewer 预检可用)
|
|
84
84
|
2. 构建验证 + **仅**通过 `harness_ledger.py record` 写 ledger(禁止 Write/Edit `verification-ledger.json`);`diff-hash --change-dir` 纳入 ignored tests → `reference.md` Step 2c
|
|
85
85
|
3. **场景覆盖检查**(场景表映射,禁止用用例数冒充场景数)
|
|
86
|
-
4. **关门检查**(10 项)→
|
|
86
|
+
4. **关门检查**(10 项)→ 只执行一次 `harness_gate.py close`;`--to-phase` 必须取返回的 `nextPhases` 或 `plannedPhases` 中 run 的真实后继,禁止写死 test。该命令内部关闭 test guard、写 `phase.end`、释放租约、写 handoff 并补传事件;不得再单独调用 test-guard/context close。失败时按结构化 `recoveryAction` 原样重试,已完成步骤幂等复用。
|
|
87
87
|
|
|
88
|
-
**Fixback
|
|
88
|
+
**Fixback**:必须通过 `harness_fixback.py resume/add-issue/resolve-issue/close` 驱动,不得把修复说明当成新的普通 Run。只读取返回的受影响问题和文件;验证仅失效与 `changedFiles` 相交的目标,其他 Test/Review 证据继续复用。RED 优先;未选用则用中文记录“本轮未采纳该改进建议”。
|
|
89
|
+
|
|
90
|
+
**执行器边界**:优先使用项目 build profile 和已有测试入口。禁止为了绕过 ESM、路径或参数问题临时生成 `.js`、`require` 脚本;需要文件式 runner 时使用项目已有入口,确需新增时遵循项目模块类型(例如 ESM 使用 `.mjs`)。runner 包装说明写入 `runnerCommand` 元数据,不得拼进账本的规范 `command`。
|
|
89
91
|
|
|
90
92
|
**Foundation Gate**:若 `meta/implementation-checkpoints.json` 中 `foundation-gate` 为 pending,不得开始 plan 中任务 6+;由 `harness_gate.py` 硬阻断。
|
|
91
93
|
|
|
@@ -112,7 +114,7 @@ disallowed-tools:
|
|
|
112
114
|
| **RED/GREEN** | RED 须有效;静态验证 ≠ 测试通过;greenfield 大重写豁免见 reference |
|
|
113
115
|
| **Mapper/DB** | 纯 Mock 不得宣称 DB 验证通过;迁移脚本**永不自动执行** |
|
|
114
116
|
| **探测/ledger** | 基础设施先探测;每次构建/测试经 `harness_ledger.py record`;禁止手写 ledger JSON;用 canonical `diff-hash --change-dir` |
|
|
115
|
-
| **Gate/Guard** | 跨 Agent/阶段先用 `harness_context.py prepare/begin
|
|
117
|
+
| **Gate/Guard** | 跨 Agent/阶段先用 `harness_context.py prepare/begin`;阶段门禁与上下文交接统一用 `harness_gate.py begin/close`;gate 内部负责 guard begin/close,模型只在需要记录测试来源或修复时调用 guard 的 `record/stage/mark` |
|
|
116
118
|
| **预存变更** | 保留 → baseline 隔离;存在则最终 ≥ 🟡WARN |
|
|
117
119
|
| **关门/状态** | 10 项关门检查;持久化 run-task-status;P0 静态-only 不得建议 submit |
|
|
118
120
|
| **Worktree** | `requested=true` 时代码只写 worktree |
|
|
@@ -31,7 +31,7 @@ description: harness-run 的执行检查清单。仅在编码执行时读取。
|
|
|
31
31
|
- [ ] **读取详细计划(补充参考)**:`.harness/changes/<change>/plans/<change>-implementation-detail.md`(新版必需;legacy 缺失时 🟡WARN)
|
|
32
32
|
- [ ] **读取设计文档**:`.harness/changes/<change>/spec/<change>-design.md` — 获取核心设计决策和不变项
|
|
33
33
|
- [ ] **读取测试场景表**:`.harness/changes/<change>/plans/<change>-test-scenarios.md` — 获取与当前任务相关的测试场景
|
|
34
|
-
- [ ]
|
|
34
|
+
- [ ] **读取验证账本**:通过 context 返回的 `executionRoot` 读取 `evidence/verification-ledger.json`(如存在)— 复用已有 compile/unitTest 结果
|
|
35
35
|
- [ ] **读取任务状态**:`.harness/changes/<change>/evidence/run-task-status.md`(如存在)— 恢复上次运行状态
|
|
36
36
|
- [ ] **读取 review fixback**:用户传入 `--fixback` 或要求修复 review 问题时,读取最新 `.harness/changes/<change>/reports/review/fixback-*.md`
|
|
37
37
|
- [ ] 确认未将 `docs/superpowers/` 作为执行输入(旧草稿最多作为人工线索)
|
|
@@ -92,7 +92,7 @@ requested=true + path missing
|
|
|
92
92
|
4. **读取详细计划(补充参考)**:`.harness/changes/<change-name>/plans/<change-name>-implementation-detail.md`(新版必需,legacy 缺失时 🟡WARN)→ 获取自适应执行参考
|
|
93
93
|
5. **读取设计文档**:`.harness/changes/<change-name>/spec/<change-name>-design.md` → 获取核心设计决策和不变项
|
|
94
94
|
6. **读取测试场景表**:`.harness/changes/<change-name>/plans/<change-name>-test-scenarios.md` → 获取测试真相源
|
|
95
|
-
7.
|
|
95
|
+
7. **读取验证账本**:通过 state layout resolver 定位 `evidence/verification-ledger.json`(如存在)→ 复用已有 compile/unitTest 结果
|
|
96
96
|
8. **读取任务状态**:`.harness/changes/<change-name>/evidence/run-task-status.md`(如存在)→ 恢复上次运行状态
|
|
97
97
|
9. **读取 review fixback**:用户传入 `--fixback` 或要求修复 review 问题时,读取最新 `.harness/changes/<change-name>/reports/review/fixback-*.md`,并用 `harness_fixback.py` 将相关 RED/YELLOW 条目合并为一个批次;每条问题保留 RED/GREEN 证据,批次关闭后只触发一次 affected verification 与一次 review
|
|
98
98
|
10. 确认 `项目规则(见 .harness/context-index.json)/` 规则已加载
|
|
@@ -540,7 +540,7 @@ python <skills-root>/scripts/harness_ledger.py record --change-dir ".harness/cha
|
|
|
540
540
|
>
|
|
541
541
|
> **Ledger v3**:`record` 自动解析并强制顶层身份(`schemaVersion=3/repositoryId/changeName/baseCommit/currentHead/diffHash/ownershipHash`),缺字段非零退出、不写账本;已有 v1/v2 ledger 在写前透明迁移,`migrationHistory` 回执记录原/目标 schema 与迁移前后 evidence identity。无法迁移时返回 `LEDGER_MIGRATION_REQUIRED` 和确定性 `rerecordCommand`,不得半升级。v2 契约下 `--metrics-json` 必须通过 typed schema(unit=`total/passed/failed`,apiContract=`scenariosTotal/passed/failed`,browserE2E=`total/passed/failed`,dbCompatibility=`applicability(+reason)`)。详见 `../protocols/ledger-protocol.md` 第十节。
|
|
542
542
|
|
|
543
|
-
|
|
543
|
+
阶段边界与测试跟踪统一由 `harness_gate.py begin/close` 协调;底层 guard begin/close 不再由模型重复调用。close 失败不得用自然语言覆盖。
|
|
544
544
|
|
|
545
545
|
## 步骤 3:场景覆盖检查
|
|
546
546
|
|
|
@@ -800,7 +800,7 @@ powershell.exe -Command "git -C '<project-path>' diff --check"
|
|
|
800
800
|
```powershell
|
|
801
801
|
# gate begin/close(--task 仅在该 change 启用 checkpoint 时必需;close 不需要 --skills-root)
|
|
802
802
|
python <skills-root>/scripts/harness_gate.py begin --change <cn> --phase run --skills-root <skills-root> [--task N]
|
|
803
|
-
python <skills-root>/scripts/harness_gate.py close --change <cn> --phase run --status OK [--task N]
|
|
803
|
+
python <skills-root>/scripts/harness_gate.py close --change <cn> --phase run --status OK --to-phase <plannedPhases 中 run 的后继> --executor <tool> [--task N]
|
|
804
804
|
|
|
805
805
|
# ledger 记录(status: ok|fail|not_run —— 没有 PASS)
|
|
806
806
|
python <skills-root>/scripts/harness_ledger.py record --change-dir <dir> --verification unitTestFull --status ok --command "<完整命令>" --exit-code 0 --duration-ms 120000 --evidence "Tests run: 155, Failures: 0, Errors: 0, Skipped: 0" --coverage full --files "packages/core/src/index.ts"
|
|
@@ -21,16 +21,16 @@ disallowed-tools:
|
|
|
21
21
|
- Bash(awk *)
|
|
22
22
|
- Bash(curl *)
|
|
23
23
|
---
|
|
24
|
-
<!-- generated by harness_deploy.py; core=
|
|
24
|
+
<!-- generated by harness_deploy.py; core=da2c4ac217b8c723; overlay=none; agent=claude-code; do not edit -->
|
|
25
25
|
# harness-submit — 最终提交(含 worktree 合并)
|
|
26
26
|
|
|
27
27
|
## Purpose
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
仅在 `plannedPhases` 包含 Submit 时执行 Git 提交/推送交付;没有 Git、没有远端或本次计划省略 Submit 时直接进入下一计划阶段,不得把 Submit 当作归档前提。
|
|
30
30
|
|
|
31
31
|
## When to Use
|
|
32
32
|
|
|
33
|
-
仅当用户显式调用 `/harness-submit`(或 `/harness-merge`
|
|
33
|
+
仅当用户显式调用 `/harness-submit`(或 `/harness-merge` 从合并段重入)且 `plannedPhases` 包含 Submit 时执行。用户口头说「提交代码」「commit」「push」「完成开发」而未调用本 skill 时,先确认。前置阶段只按实际计划检查;Test/Review 被计划省略时不得补跑。
|
|
34
34
|
|
|
35
35
|
> **主目录模式**(`worktree.json` requested=false):commit+push 主分支后**停止**,仅提示可执行 `/harness-archive`,不自动归档。**worktree 模式**(requested=true):worktree 内仅本地 commit,随后本 skill 在同一次调用内接续合并流程(这是同一次提交动作的一部分,不属于跨阶段自动推进);**push 只在主分支发生一次**;合并完成后同样**停止**,仅提示 `/harness-archive`。
|
|
36
36
|
|
|
@@ -74,14 +74,14 @@ worktree 合并前必须运行 `harness_change.py integration-lock acquire --run
|
|
|
74
74
|
|
|
75
75
|
0. **启动准备** — `harness_context.py prepare --phase submit --executor <tool> [--change <id>] --json` 确定唯一变更与 executionRoot;`harness_context.py begin --phase submit --change <id> --executor <tool> --json` 校验 review→submit receipt;**`harness_gate.py begin --phase submit --change <id>`**;读 ledger,以 `harness_ledger.py diff-hash --repo . --base <baseCommit> --change-dir ".harness/changes/<change-name>" --json` 计算 diffHash + post-test 7 类分类(禁止手写 ledger / 手工 phase.end)
|
|
76
76
|
1. **合并最新代码** — 主目录与 worktree 均**不在业务工作区 stash/pull**;远端同步由合并段 integration transaction 在隔离 integration worktree 内完成(见「worktree 合并流程」);**正常路径禁止 `git stash` / `stash pop`**
|
|
77
|
-
2. **最终验证** — ledger
|
|
77
|
+
2. **最终验证** — ledger 复用优先;提交前只调用 `can-reuse --project . --profile-input unitTestFull --command <profile 规范命令>`。不得传入另一套 `--files`,不得把 runner 包装说明写进 `command`。`reuse=true` 时禁止重跑;只有真实输入、依赖、工具链或环境身份变化时才执行一次同一 profile 验证,并只登记一条结果。不要读取 ledger/archive 实现源码或临时编写散列脚本排查参数。
|
|
78
78
|
- 无远端 CI 且 gate-policy 未强制 remote provider 时,验证通过/复用后运行 `harness_archive.py certify-local --change-dir ... --project . --json`,从同一 ledger 生成 `local-reproducible` 产品候选收据;该命令不执行测试。
|
|
79
79
|
- gate-policy 要求 `remote-attested` 时不得降级成本地收据,等待远端 attestation。
|
|
80
80
|
3. **.gitignore + 精确暂存** ⚠️ — 检查 `.harness/` 在 `.gitignore`;**禁止 `git add -A`**。若存在 `evidence/test-tracking.json`,先执行 `python <skills-root>/scripts/harness_test_guard.py stage --project . --change-dir ".harness/changes/<change-name>" --json`;失败即硬停止。无 manifest 时不使用 `-f`。manifest 之外的文件按精确业务路径正常暂存,**禁止全局 force-add**。
|
|
81
81
|
4. **提交方式** — 主目录:blocking user confirmation 三选项(commit+push / 仅本地 / 取消);**worktree:固定仅本地 commit**
|
|
82
82
|
5. **commit-message.txt** ⚠️ — 展示 staged、diff stat、完整中文 message;用户确认
|
|
83
|
-
6. **commit / push** — `git commit -F`;主目录按选项 push(push 前 fetch
|
|
84
|
-
7. **收尾** —
|
|
83
|
+
6. **commit / push** — `git commit -F`;主目录按选项 push(push 前 fetch 检查远端);无 upstream 时允许仅本地 commit。commit 后立即重新运行 `harness_archive.py certify-local`:若验证输入未变化,脚本把候选从提交前身份安全重绑定到最终 commit,不得重跑测试或手工复制账本;**worktree:只 commit,记录 local hash**
|
|
84
|
+
7. **收尾** — `harness_gate.py close --phase submit --status ... --to-phase <实际计划后继>`;通常后继为 Archive,但不得显示“等待 merge”或固定写死。主目录停止并提示真实下一阶段;worktree 才接续下方同一 Submit 内的合并流程。
|
|
85
85
|
|
|
86
86
|
详细步骤见 `checklist.md`。
|
|
87
87
|
|
|
@@ -30,7 +30,7 @@ description: harness-submit 的8 步工作流详细步骤和执行日志记录
|
|
|
30
30
|
|
|
31
31
|
**读取 verification-ledger + post-test 变更分类**:
|
|
32
32
|
|
|
33
|
-
1.
|
|
33
|
+
1. 通过 state layout resolver 读取权威 `evidence/verification-ledger.json`,记录 `diffHash` / `currentHead` / `unitTest` / `apiTest` 状态;split-v1 不得回退复制到 contract 目录
|
|
34
34
|
2. 执行 `harness_ledger.py diff-hash --repo . --base <baseCommit> --change-dir ".harness/changes/<change-name>" --json` 计算当前 diffHash;manifest 校验失败即停止,不得绕过后与 ledger 比对
|
|
35
35
|
3. 若 test 之后有代码变更(当前 diffHash ≠ test 完成时的 diffHash),按 7 类对 post-test diff 分类(见 `../protocols/ledger-protocol.md` 第六章),写入 ledger 的 `postTestClassification`
|
|
36
36
|
4. 行为性变更(BEHAVIORAL_SERVICE_CHANGE / API_CONTRACT_CHANGE / SQL_OR_MAPPER_CHANGE / SECURITY_OR_PERMISSION_CHANGE)→ **停止 submit**,提示先重跑 `/harness-test` 相关场景
|
|
@@ -19,7 +19,7 @@ disallowed-tools:
|
|
|
19
19
|
- Bash(awk *)
|
|
20
20
|
- Bash(curl *)
|
|
21
21
|
---
|
|
22
|
-
<!-- generated by harness_deploy.py; core=
|
|
22
|
+
<!-- generated by harness_deploy.py; core=da2c4ac217b8c723; overlay=none; agent=claude-code; do not edit -->
|
|
23
23
|
# harness-sync
|
|
24
24
|
|
|
25
25
|
## Purpose
|
|
@@ -23,7 +23,7 @@ disallowed-tools:
|
|
|
23
23
|
- Bash(node *)
|
|
24
24
|
- Bash(codegraph *)
|
|
25
25
|
---
|
|
26
|
-
<!-- generated by harness_deploy.py; core=
|
|
26
|
+
<!-- generated by harness_deploy.py; core=da2c4ac217b8c723; overlay=none; agent=claude-code; do not edit -->
|
|
27
27
|
# harness-test — 测试执行
|
|
28
28
|
|
|
29
29
|
## Purpose
|
|
@@ -34,7 +34,7 @@ disallowed-tools:
|
|
|
34
34
|
|
|
35
35
|
仅当用户显式调用 `/harness-test` 时执行(已设 `disable-model-invocation`)。run 阶段结束后**不自动**进入本阶段;用户口头提到"跑测试"而未调用本 skill 时,先确认是否走 Harness 测试阶段。
|
|
36
36
|
|
|
37
|
-
**单阶段原则**:test
|
|
37
|
+
**单阶段原则**:test 关门后必须停止并交还用户,仅提示 `plannedPhases` 中的真实下一阶段;禁止自动接续执行。
|
|
38
38
|
|
|
39
39
|
使用场景:
|
|
40
40
|
- 完成 `/harness-run` 编码后,验证单元测试 + 接口测试 + 数据兼容
|
|
@@ -66,7 +66,9 @@ disallowed-tools:
|
|
|
66
66
|
|
|
67
67
|
## Workflow
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
测试跟踪由 `harness_gate.py begin/close` 统一协调 test guard;不得额外手工执行 guard close。任一失败都必须使用 gate 返回的结构化状态,不得以自然语言覆盖失败状态。所有 change/state 路径必须使用 `harness_change.py resolve` 或 context 返回的 `executionRoot`,不得固定拼接 `.harness/changes/**`;split-v1 默认位于 `.harness/state/changes/**`。
|
|
70
|
+
|
|
71
|
+
兼容实现中的底层命令名是 `harness_test_guard.py begin` 与 `harness_test_guard.py close`,两者只允许由 gate 内部调用;写在这里用于能力审计,不构成模型执行步骤。
|
|
70
72
|
|
|
71
73
|
并行服务测试先运行 `harness_change.py lease-port --change <id> --run-id <run-id> --range <start-end> --json`,再把返回端口传给 `harness_service.py ensure --leased-port <port> --lease-owner <run-id>`。`serviceStart` 的 command/health/overlay 可用 `{leasedPort}` 占位符;用户自启进程仍只进入 Service Gate,禁止 kill。测试清理的 `finally` 中运行 `harness_change.py release-port --change <id> --run-id <run-id> --json`,避免租约池耗尽。
|
|
72
74
|
|
|
@@ -105,7 +107,7 @@ Runner 强制同项目单实例、低调度优先级、逐命令超时、正常
|
|
|
105
107
|
|
|
106
108
|
先 `harness_context.py prepare --phase test --executor <tool> [--change <id>] --json`,再 `harness_context.py begin --phase test --change <id> --executor <tool> --json` 校验最新 run→test receipt 的 artifact/hash/HEAD;然后 **`harness_gate.py begin --phase test --change <id>`**(禁止手工 phase.start / 手写 ledger)。执行各项强制环境检查 + **命令执行模式 preflight (0.1)**;只有首选执行器不可用时,才执行 fallback 执行器探测。
|
|
107
109
|
|
|
108
|
-
验证写入**仅**允许 `harness_ledger.py record` / `can-reuse`;禁止 Write/Edit `verification-ledger.json
|
|
110
|
+
验证写入**仅**允许 `harness_ledger.py record` / `can-reuse`;禁止 Write/Edit `verification-ledger.json`。测试跟踪:gate begin → 执行(可选 `harness_test_guard.py mark stale-test-repair`)→ 单次 `harness_gate.py close`。`--to-phase` 取实际阶段计划的后继;Fixback 返回 run,普通流程可直接进入 Review、Submit 或 Archive。Fixback 只失效与改动文件相交的验证目标。
|
|
109
111
|
|
|
110
112
|
- **Read `checklist.md`** — 各项检查详情 + 0.1 preflight + Playwright 探测 + 避坑规则指引
|
|
111
113
|
- **失败处理**:任一项检查失败 → 终止流程并报告原因,用户确认修复后才能继续
|
|
@@ -127,7 +129,7 @@ Runner 强制同项目单实例、低调度优先级、逐命令超时、正常
|
|
|
127
129
|
|
|
128
130
|
### Phase 1-2:测试执行(默认主会话执行)
|
|
129
131
|
|
|
130
|
-
**Phase 1
|
|
132
|
+
**Phase 1 前先检查 verification-ledger**:通过 state layout 解析后的路径调用 `harness_ledger.py can-reuse --project . --profile-input <key> --command <profile 解析出的规范命令>`;可复用时不得重跑。不得手工读取实现源码来猜账本参数。
|
|
131
133
|
|
|
132
134
|
**默认在主会话执行**(不委派 subagent):
|
|
133
135
|
- 单元测试:可复用则跳过重跑;否则按技术栈执行测试命令
|
|
@@ -167,7 +169,7 @@ Runner 强制同项目单实例、低调度优先级、逐命令超时、正常
|
|
|
167
169
|
|
|
168
170
|
### 四、单元测试复用 + 写入 ledger
|
|
169
171
|
|
|
170
|
-
Phase 1
|
|
172
|
+
Phase 1 前用 `harness_ledger.py diff-hash` 和 `can-reuse` 重算真实指纹。验证目标必须使用 profile key 的单一入口:`--project . --profile-input unitTest|unitTestFull --command <规范命令>`;声明 `--profile-input` 后不得同时传入另一套 `--files`。`npx vitest run` 与 `vitest run` 等包装差异由账本规范化,`safe runner` 等说明只能写 `--runner-command` 元数据。可复用则跳过;否则执行同一 profile 命令并只登记一条结果。增量测试记 `unitTest`,模块全量记 `unitTestFull`,API/浏览器分别记录。详见 `checklist.md` 与 ledger protocol。
|
|
171
173
|
|
|
172
174
|
### 五、命令与请求超时治理
|
|
173
175
|
|
|
@@ -268,7 +268,7 @@ powershell.exe -NoProfile -Command "try { (Invoke-WebRequest -Uri 'http://127.0.
|
|
|
268
268
|
|
|
269
269
|
### 单元测试复用(ledger 驱动)
|
|
270
270
|
|
|
271
|
-
- [ ] Phase 1
|
|
271
|
+
- [ ] Phase 1 前通过 state layout resolver 定位并检查 `evidence/verification-ledger.json`
|
|
272
272
|
- [ ] 判断是否复用 run 的 unitTest:diffHash 一致 + module/profile 一致 + scope 一致或更严格 + run 后无行为性修改 + run 实际跑了全量测试
|
|
273
273
|
- [ ] 复用 → 跳过重跑,标记"✅ 复用 harness-run 单元测试结果"
|
|
274
274
|
- [ ] 不复用 → 按 profile key resolve 重跑测试命令(`harness_profile.py resolve --key unitTest`,不复制示例 `-pl` 命令),结果写回 ledger 的 `unitTest` 项
|