@hunter-harness/workflow-harness 0.3.0 → 0.3.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 (138) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +1 -1
  3. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  4. package/harness/bundles/general/claude-code/harness-execute/SKILL.md +1 -1
  5. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  6. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
  7. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
  8. package/harness/bundles/general/claude-code/harness-pull/SKILL.md +1 -1
  9. package/harness/bundles/general/claude-code/harness-push/SKILL.md +1 -1
  10. package/harness/bundles/general/claude-code/harness-review/SKILL.md +1 -1
  11. package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
  12. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
  13. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
  14. package/harness/bundles/general/claude-code/harness-test/SKILL.md +1 -1
  15. package/harness/bundles/general/claude-code/scripts/harness_archive.py +24 -2
  16. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  17. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
  18. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  19. package/harness/bundles/general/codebuddy/harness-execute/SKILL.md +1 -1
  20. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  21. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  22. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
  23. package/harness/bundles/general/codebuddy/harness-pull/SKILL.md +1 -1
  24. package/harness/bundles/general/codebuddy/harness-push/SKILL.md +1 -1
  25. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
  26. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
  27. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
  28. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
  29. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +1 -1
  30. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +24 -2
  31. package/harness/bundles/general/codex/.harness-build.json +1 -1
  32. package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
  33. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  34. package/harness/bundles/general/codex/harness-execute/SKILL.md +1 -1
  35. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
  36. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  37. package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
  38. package/harness/bundles/general/codex/harness-pull/SKILL.md +1 -1
  39. package/harness/bundles/general/codex/harness-push/SKILL.md +1 -1
  40. package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
  41. package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
  42. package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
  43. package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
  44. package/harness/bundles/general/codex/harness-test/SKILL.md +1 -1
  45. package/harness/bundles/general/codex/scripts/harness_archive.py +24 -2
  46. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  47. package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
  48. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  49. package/harness/bundles/general/cursor/harness-execute/SKILL.md +1 -1
  50. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  51. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  52. package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
  53. package/harness/bundles/general/cursor/harness-pull/SKILL.md +1 -1
  54. package/harness/bundles/general/cursor/harness-push/SKILL.md +1 -1
  55. package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
  56. package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
  57. package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
  58. package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
  59. package/harness/bundles/general/cursor/harness-test/SKILL.md +1 -1
  60. package/harness/bundles/general/cursor/scripts/harness_archive.py +24 -2
  61. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  62. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  63. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
  64. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  65. package/harness/bundles/java/claude-code/harness-execute/SKILL.md +1 -1
  66. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  67. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  68. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  69. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
  70. package/harness/bundles/java/claude-code/harness-pull/SKILL.md +1 -1
  71. package/harness/bundles/java/claude-code/harness-push/SKILL.md +1 -1
  72. package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
  73. package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
  74. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
  75. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
  76. package/harness/bundles/java/claude-code/harness-test/SKILL.md +1 -1
  77. package/harness/bundles/java/claude-code/scripts/harness_archive.py +24 -2
  78. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  79. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  80. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
  81. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  82. package/harness/bundles/java/codebuddy/harness-execute/SKILL.md +1 -1
  83. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  84. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  85. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  86. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
  87. package/harness/bundles/java/codebuddy/harness-pull/SKILL.md +1 -1
  88. package/harness/bundles/java/codebuddy/harness-push/SKILL.md +1 -1
  89. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
  90. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
  91. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
  92. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
  93. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +1 -1
  94. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +24 -2
  95. package/harness/bundles/java/codex/.harness-build.json +1 -1
  96. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  97. package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
  98. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  99. package/harness/bundles/java/codex/harness-execute/SKILL.md +1 -1
  100. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
  101. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  102. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  103. package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
  104. package/harness/bundles/java/codex/harness-pull/SKILL.md +1 -1
  105. package/harness/bundles/java/codex/harness-push/SKILL.md +1 -1
  106. package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
  107. package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
  108. package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
  109. package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
  110. package/harness/bundles/java/codex/harness-test/SKILL.md +1 -1
  111. package/harness/bundles/java/codex/scripts/harness_archive.py +24 -2
  112. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  113. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  114. package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
  115. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  116. package/harness/bundles/java/cursor/harness-execute/SKILL.md +1 -1
  117. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  118. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  119. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  120. package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
  121. package/harness/bundles/java/cursor/harness-pull/SKILL.md +1 -1
  122. package/harness/bundles/java/cursor/harness-push/SKILL.md +1 -1
  123. package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
  124. package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
  125. package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
  126. package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
  127. package/harness/bundles/java/cursor/harness-test/SKILL.md +1 -1
  128. package/harness/bundles/java/cursor/scripts/harness_archive.py +24 -2
  129. package/harness/manifests/general/claude-code.json +15 -15
  130. package/harness/manifests/general/codebuddy.json +15 -15
  131. package/harness/manifests/general/codex.json +15 -15
  132. package/harness/manifests/general/cursor.json +15 -15
  133. package/harness/manifests/java/claude-code.json +17 -17
  134. package/harness/manifests/java/codebuddy.json +17 -17
  135. package/harness/manifests/java/codex.json +17 -17
  136. package/harness/manifests/java/cursor.json +17 -17
  137. package/hunter-workflow-family.json +2 -2
  138. package/package.json +1 -1
@@ -2,5 +2,5 @@
2
2
  "schemaVersion": 1,
3
3
  "overlay": "none",
4
4
  "agent": "claude-code",
5
- "coreHash": "d1485a25236f58dc"
5
+ "coreHash": "f7d84565fb42d77f"
6
6
  }
@@ -21,7 +21,7 @@ disallowed-tools:
21
21
  - Bash(awk *)
22
22
  - Bash(curl *)
23
23
  ---
24
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
24
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=claude-code; do not edit -->
25
25
  # harness-archive — 变更归档
26
26
 
27
27
  ## Purpose
@@ -20,7 +20,7 @@ disallowed-tools:
20
20
  - Bash(awk *)
21
21
  - Bash(curl *)
22
22
  ---
23
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
23
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=claude-code; do not edit -->
24
24
  # harness-codebase-map — 代码库地图
25
25
 
26
26
  ## Purpose
@@ -23,7 +23,7 @@ disallowed-tools:
23
23
  - Bash(node *)
24
24
  - Bash(codegraph *)
25
25
  ---
26
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
26
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=claude-code; do not edit -->
27
27
  # harness-execute — 执行(编码 + 验证)
28
28
 
29
29
  > 2026-08 阶段合并:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段。
@@ -8,7 +8,7 @@ disallowed-tools:
8
8
  - Bash(git *)
9
9
  - Bash(curl *)
10
10
  ---
11
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
11
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; 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=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
11
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; 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=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
24
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=claude-code; do not edit -->
25
25
  # harness-plan — 需求规划
26
26
 
27
27
  ## Purpose
@@ -21,7 +21,7 @@ disallowed-tools:
21
21
  - Bash(awk *)
22
22
  - Bash(curl *)
23
23
  ---
24
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
24
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=claude-code; do not edit -->
25
25
  # harness-pull — 从 Hunter Platform 下拉与恢复
26
26
 
27
27
  ## Purpose
@@ -21,7 +21,7 @@ disallowed-tools:
21
21
  - Bash(awk *)
22
22
  - Bash(curl *)
23
23
  ---
24
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
24
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=claude-code; do not edit -->
25
25
  # harness-push — 上传到 Hunter Platform
26
26
 
27
27
  ## Purpose
@@ -22,7 +22,7 @@ disallowed-tools:
22
22
  - Bash(curl *)
23
23
  - Bash(codegraph *)
24
24
  ---
25
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
25
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=claude-code; do not edit -->
26
26
  # harness-review — 代码审查
27
27
 
28
28
  ## Purpose
@@ -22,7 +22,7 @@ disallowed-tools:
22
22
  - Bash(curl *)
23
23
  - Bash(codegraph *)
24
24
  ---
25
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
25
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=claude-code; do not edit -->
26
26
  # harness-run — 需求编码
27
27
 
28
28
  > **2026-08 阶段合并**:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段,
@@ -21,7 +21,7 @@ disallowed-tools:
21
21
  - Bash(awk *)
22
22
  - Bash(curl *)
23
23
  ---
24
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
24
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=claude-code; do not edit -->
25
25
  # harness-submit — 最终提交(含 worktree 合并)
26
26
 
27
27
  ## Purpose
@@ -19,7 +19,7 @@ disallowed-tools:
19
19
  - Bash(awk *)
20
20
  - Bash(curl *)
21
21
  ---
22
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
22
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; 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=d1485a25236f58dc; overlay=none; agent=claude-code; do not edit -->
26
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=claude-code; do not edit -->
27
27
  # harness-test — 测试执行
28
28
 
29
29
  > **2026-08 阶段合并**:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段,
@@ -4201,11 +4201,16 @@ def _stage_status_from_sources(
4201
4201
  }
4202
4202
  projected_events = he.apply_event_corrections(events)
4203
4203
  execute_phase_end_seen = False
4204
+ # 服务端 CLI schema 2.3 要求全阶段键集 {plan, run, test, review, submit,
4205
+ # archive},而 2026-08 起事件侧 run+test 已合并为 execute。仍带 run/test
4206
+ # 原名的旧事件在折叠进 execute 之前单独留一份,供归档时拆分还原。
4207
+ raw_run_test: dict[str, str] = {}
4204
4208
  for event in projected_events:
4205
4209
  if event.get("type") != "phase.end":
4206
4210
  continue
4207
4211
  # 旧事件的 run/test phase.end 折叠进 execute,按事件序后写胜。
4208
- phase = hp.resolve_phase_name(str(event.get("phase") or "").lower()) or ""
4212
+ raw_phase = str(event.get("phase") or "").strip().lower()
4213
+ phase = hp.resolve_phase_name(raw_phase) or ""
4209
4214
  raw = str(event.get("status") or "").upper()
4210
4215
  if phase not in status or not raw:
4211
4216
  continue
@@ -4218,6 +4223,8 @@ def _stage_status_from_sources(
4218
4223
  elif raw in {"SKIP", "SKIPPED"}:
4219
4224
  raw = "USER_SKIPPED"
4220
4225
  status[phase] = raw
4226
+ if raw_phase in {"run", "test"}:
4227
+ raw_run_test[raw_phase] = raw
4221
4228
  # Issues in events can downgrade. H-14: informational / hygiene / agent-preflight
4222
4229
  # notes must not downgrade an already-OK phase.end.
4223
4230
  _informational_markers = (
@@ -4272,7 +4279,18 @@ def _stage_status_from_sources(
4272
4279
  if not review_evidence_present(change_dir, projected_events):
4273
4280
  status["review"] = "ADVISORY"
4274
4281
 
4275
- return status
4282
+ # 服务端 schema 2.3 是 passthrough:execute 键保留供既有消费方使用,
4283
+ # 同时补上 run/test 满足必需键。旧事件带 run/test 原名时按原名拆分,
4284
+ # 否则镜像 execute 聚合值(合并事件流里没有更细的信号可拆)。
4285
+ return {
4286
+ "plan": status["plan"],
4287
+ "execute": status["execute"],
4288
+ "run": raw_run_test.get("run", status["execute"]),
4289
+ "test": raw_run_test.get("test", status["execute"]),
4290
+ "review": status["review"],
4291
+ "submit": status["submit"],
4292
+ "archive": status["archive"],
4293
+ }
4276
4294
 
4277
4295
 
4278
4296
  def _compute_final_status(
@@ -5665,7 +5683,11 @@ def collect_summary_data(
5665
5683
  scenario_risks, scenario_actions = _risks_from_test_results(change_dir)
5666
5684
  data["knownRisks"] = known_risks + scenario_risks
5667
5685
  data["manualActions"] = scenario_actions
5686
+ execute_status = (data.get("stageStatus") or {}).get("execute")
5668
5687
  for name, value in (data.get("stageStatus") or {}).items():
5688
+ # run/test 镜像 execute 聚合值时不重复生成同一条人工动作。
5689
+ if name in {"run", "test"} and value == execute_status:
5690
+ continue
5669
5691
  if value in {"BLOCKED", "BLOCKED_BY_ENV", "BLOCKED_BY_DBA", "NOT_RUN", "USER_SKIPPED"}:
5670
5692
  data["manualActions"].append({
5671
5693
  "stage": name,
@@ -2,5 +2,5 @@
2
2
  "schemaVersion": 1,
3
3
  "overlay": "none",
4
4
  "agent": "codebuddy",
5
- "coreHash": "d1485a25236f58dc"
5
+ "coreHash": "f7d84565fb42d77f"
6
6
  }
@@ -3,7 +3,7 @@ name: harness-archive
3
3
  description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档)到 .harness/archive/,含归档元数据。仅当用户显式调用
4
4
  /harness-archive 时使用;不得被其他阶段 skill 自动接续触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-archive — 变更归档
8
8
 
9
9
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-codebase-map
3
3
  description: 分析现有代码库并生成 .harness/codebase/map/
4
4
  下的结构化代码库地图。用于陌生项目理解、重大改造前梳理、harness-sync 提示 map 过期后的人工刷新。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-codebase-map — 代码库地图
8
8
 
9
9
  ## Purpose
@@ -4,7 +4,7 @@ description: 执行阶段:按变更簇执行 TDD
4
4
  编码循环(RED→GREEN→REFACTOR→编译验证),随后完成单元/接口/数据兼容验证并输出测试报告。仅当用户显式调用
5
5
  /harness-execute 时使用;不得因用户提到编码/实现/测试就自动触发,也不得被其他阶段 skill 自动接续。
6
6
  ---
7
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
7
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
8
8
  # harness-execute — 执行(编码 + 验证)
9
9
 
10
10
  > 2026-08 阶段合并:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段。
@@ -2,7 +2,7 @@
2
2
  name: harness-knowledge-ingest
3
3
  description: 确认归档 ZIP 已上传并由 Hunter Platform 在服务端解包、校验和入库。客户端不再构建或维护本地知识索引。
4
4
  ---
5
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
5
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
6
6
  # harness-knowledge-ingest
7
7
 
8
8
  知识 ingest 完全由 Hunter Platform 负责。归档完成时,客户端生成一个确定性 ZIP;
@@ -2,7 +2,7 @@
2
2
  name: harness-knowledge-query
3
3
  description: 在规划、实现或排查前,通过 hunter-harness CLI 查询远端项目知识库。远端不可用时直接报告不可用,不建立本地索引或离线回退。
4
4
  ---
5
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
5
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
6
6
  # harness-knowledge-query
7
7
 
8
8
  项目知识以 Hunter Platform 的服务端索引为唯一真源。客户端只提交查询并消费结果:
@@ -3,7 +3,7 @@ name: harness-plan
3
3
  description: 将需求转化为设计文档+实施计划+完整测试场景表,必须在编码前完成。仅当用户显式调用 /harness-plan 或明确要求进入
4
4
  Harness 规划阶段时使用;不得因用户描述需求就自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-plan — 需求规划
8
8
 
9
9
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-pull
3
3
  description: 从 Hunter Platform 下拉配置/规则/架构/指令(及显式来源分支的分支文件恢复)。仅当用户显式调用
4
4
  /harness-pull 或明确说'从平台拉取/恢复'时使用;不得自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-pull — 从 Hunter Platform 下拉与恢复
8
8
 
9
9
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-push
3
3
  description: 上传本地配置/规则/架构/指令(及显式归档)到 Hunter Platform。仅当用户显式调用 /harness-push
4
4
  或明确说'上传到平台'时使用;不得因存在本地修改就自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-push — 上传到 Hunter Platform
8
8
 
9
9
  ## Purpose
@@ -4,7 +4,7 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
4
4
  .harness/context-index.json)和测试场景表,在隔离上下文运行。仅当用户显式调用 /harness-review 时使用;不得在
5
5
  test 结束后自动接续执行。
6
6
  ---
7
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
7
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
8
8
  # harness-review — 代码审查
9
9
 
10
10
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-run
3
3
  description: 按变更簇执行 TDD 编码循环(RED→GREEN→REFACTOR→编译验证),逐变更簇实现计划中的任务。仅当用户显式调用
4
4
  /harness-run 时使用;不得因用户提到编码/实现就自动触发,也不得被其他阶段 skill 自动接续。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-run — 需求编码
8
8
 
9
9
  > **2026-08 阶段合并**:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段,
@@ -3,7 +3,7 @@ name: harness-submit
3
3
  description: 最终提交封装:验证→中文 commit→提交/推送;worktree 模式含 --no-ff 合并回主分支。仅当用户显式调用
4
4
  /harness-submit(或 /harness-merge 重入合并段)时使用;用户口头说'提交/commit/push'时必须先确认,不得自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-submit — 最终提交(含 worktree 合并)
8
8
 
9
9
  ## Purpose
@@ -4,7 +4,7 @@ description: Use when the user asks to synchronize, refresh, or validate Harness
4
4
  metadata, adapters, remote knowledge ownership, instruction entrypoints,
5
5
  config origins, or CodeGraph status.
6
6
  ---
7
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
7
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
8
8
  # harness-sync
9
9
 
10
10
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-test
3
3
  description: 测试执行:读取场景表,执行单元测试+API接口测试+数据兼容验证,输出测试报告。仅当用户显式调用 /harness-test
4
4
  时使用;不得在 run 结束后自动接续执行。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=d1485a25236f58dc; overlay=none; agent=codebuddy; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=f7d84565fb42d77f; overlay=none; agent=codebuddy; do not edit -->
7
7
  # harness-test — 测试执行
8
8
 
9
9
  > **2026-08 阶段合并**:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段,
@@ -4201,11 +4201,16 @@ def _stage_status_from_sources(
4201
4201
  }
4202
4202
  projected_events = he.apply_event_corrections(events)
4203
4203
  execute_phase_end_seen = False
4204
+ # 服务端 CLI schema 2.3 要求全阶段键集 {plan, run, test, review, submit,
4205
+ # archive},而 2026-08 起事件侧 run+test 已合并为 execute。仍带 run/test
4206
+ # 原名的旧事件在折叠进 execute 之前单独留一份,供归档时拆分还原。
4207
+ raw_run_test: dict[str, str] = {}
4204
4208
  for event in projected_events:
4205
4209
  if event.get("type") != "phase.end":
4206
4210
  continue
4207
4211
  # 旧事件的 run/test phase.end 折叠进 execute,按事件序后写胜。
4208
- phase = hp.resolve_phase_name(str(event.get("phase") or "").lower()) or ""
4212
+ raw_phase = str(event.get("phase") or "").strip().lower()
4213
+ phase = hp.resolve_phase_name(raw_phase) or ""
4209
4214
  raw = str(event.get("status") or "").upper()
4210
4215
  if phase not in status or not raw:
4211
4216
  continue
@@ -4218,6 +4223,8 @@ def _stage_status_from_sources(
4218
4223
  elif raw in {"SKIP", "SKIPPED"}:
4219
4224
  raw = "USER_SKIPPED"
4220
4225
  status[phase] = raw
4226
+ if raw_phase in {"run", "test"}:
4227
+ raw_run_test[raw_phase] = raw
4221
4228
  # Issues in events can downgrade. H-14: informational / hygiene / agent-preflight
4222
4229
  # notes must not downgrade an already-OK phase.end.
4223
4230
  _informational_markers = (
@@ -4272,7 +4279,18 @@ def _stage_status_from_sources(
4272
4279
  if not review_evidence_present(change_dir, projected_events):
4273
4280
  status["review"] = "ADVISORY"
4274
4281
 
4275
- return status
4282
+ # 服务端 schema 2.3 是 passthrough:execute 键保留供既有消费方使用,
4283
+ # 同时补上 run/test 满足必需键。旧事件带 run/test 原名时按原名拆分,
4284
+ # 否则镜像 execute 聚合值(合并事件流里没有更细的信号可拆)。
4285
+ return {
4286
+ "plan": status["plan"],
4287
+ "execute": status["execute"],
4288
+ "run": raw_run_test.get("run", status["execute"]),
4289
+ "test": raw_run_test.get("test", status["execute"]),
4290
+ "review": status["review"],
4291
+ "submit": status["submit"],
4292
+ "archive": status["archive"],
4293
+ }
4276
4294
 
4277
4295
 
4278
4296
  def _compute_final_status(
@@ -5665,7 +5683,11 @@ def collect_summary_data(
5665
5683
  scenario_risks, scenario_actions = _risks_from_test_results(change_dir)
5666
5684
  data["knownRisks"] = known_risks + scenario_risks
5667
5685
  data["manualActions"] = scenario_actions
5686
+ execute_status = (data.get("stageStatus") or {}).get("execute")
5668
5687
  for name, value in (data.get("stageStatus") or {}).items():
5688
+ # run/test 镜像 execute 聚合值时不重复生成同一条人工动作。
5689
+ if name in {"run", "test"} and value == execute_status:
5690
+ continue
5669
5691
  if value in {"BLOCKED", "BLOCKED_BY_ENV", "BLOCKED_BY_DBA", "NOT_RUN", "USER_SKIPPED"}:
5670
5692
  data["manualActions"].append({
5671
5693
  "stage": name,
@@ -2,5 +2,5 @@
2
2
  "schemaVersion": 1,
3
3
  "overlay": "none",
4
4
  "agent": "codex",
5
- "coreHash": "095417dd8e8f9e34"
5
+ "coreHash": "74bf5b417c48700b"
6
6
  }
@@ -3,7 +3,7 @@ name: harness-archive
3
3
  description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档)到 .harness/archive/,含归档元数据。仅当用户显式调用
4
4
  /harness-archive 时使用;不得被其他阶段 skill 自动接续触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
7
7
  # harness-archive — 变更归档
8
8
 
9
9
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-codebase-map
3
3
  description: 分析现有代码库并生成 .harness/codebase/map/
4
4
  下的结构化代码库地图。用于陌生项目理解、重大改造前梳理、harness-sync 提示 map 过期后的人工刷新。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
7
7
  # harness-codebase-map — 代码库地图
8
8
 
9
9
  ## Purpose
@@ -4,7 +4,7 @@ description: 执行阶段:按变更簇执行 TDD
4
4
  编码循环(RED→GREEN→REFACTOR→编译验证),随后完成单元/接口/数据兼容验证并输出测试报告。仅当用户显式调用
5
5
  /harness-execute 时使用;不得因用户提到编码/实现/测试就自动触发,也不得被其他阶段 skill 自动接续。
6
6
  ---
7
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
7
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
8
8
  # harness-execute — 执行(编码 + 验证)
9
9
 
10
10
  > 2026-08 阶段合并:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段。
@@ -2,7 +2,7 @@
2
2
  name: harness-knowledge-ingest
3
3
  description: 确认归档 ZIP 已上传并由 Hunter Platform 在服务端解包、校验和入库。客户端不再构建或维护本地知识索引。
4
4
  ---
5
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
5
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
6
6
  # harness-knowledge-ingest
7
7
 
8
8
  知识 ingest 完全由 Hunter Platform 负责。归档完成时,客户端生成一个确定性 ZIP;
@@ -2,7 +2,7 @@
2
2
  name: harness-knowledge-query
3
3
  description: 在规划、实现或排查前,通过 hunter-harness CLI 查询远端项目知识库。远端不可用时直接报告不可用,不建立本地索引或离线回退。
4
4
  ---
5
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
5
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
6
6
  # harness-knowledge-query
7
7
 
8
8
  项目知识以 Hunter Platform 的服务端索引为唯一真源。客户端只提交查询并消费结果:
@@ -3,7 +3,7 @@ name: harness-plan
3
3
  description: 将需求转化为设计文档+实施计划+完整测试场景表,必须在编码前完成。仅当用户显式调用 /harness-plan 或明确要求进入
4
4
  Harness 规划阶段时使用;不得因用户描述需求就自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
7
7
  # harness-plan — 需求规划
8
8
 
9
9
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-pull
3
3
  description: 从 Hunter Platform 下拉配置/规则/架构/指令(及显式来源分支的分支文件恢复)。仅当用户显式调用
4
4
  /harness-pull 或明确说'从平台拉取/恢复'时使用;不得自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
7
7
  # harness-pull — 从 Hunter Platform 下拉与恢复
8
8
 
9
9
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-push
3
3
  description: 上传本地配置/规则/架构/指令(及显式归档)到 Hunter Platform。仅当用户显式调用 /harness-push
4
4
  或明确说'上传到平台'时使用;不得因存在本地修改就自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
7
7
  # harness-push — 上传到 Hunter Platform
8
8
 
9
9
  ## Purpose
@@ -4,7 +4,7 @@ description: 6维度代码审查(架构/安全/规范/兼容/测试/性能)
4
4
  .harness/context-index.json)和测试场景表,在隔离上下文运行。仅当用户显式调用 /harness-review 时使用;不得在
5
5
  test 结束后自动接续执行。
6
6
  ---
7
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
7
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
8
8
  # harness-review — 代码审查
9
9
 
10
10
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-run
3
3
  description: 按变更簇执行 TDD 编码循环(RED→GREEN→REFACTOR→编译验证),逐变更簇实现计划中的任务。仅当用户显式调用
4
4
  /harness-run 时使用;不得因用户提到编码/实现就自动触发,也不得被其他阶段 skill 自动接续。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
7
7
  # harness-run — 需求编码
8
8
 
9
9
  > **2026-08 阶段合并**:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段,
@@ -3,7 +3,7 @@ name: harness-submit
3
3
  description: 最终提交封装:验证→中文 commit→提交/推送;worktree 模式含 --no-ff 合并回主分支。仅当用户显式调用
4
4
  /harness-submit(或 /harness-merge 重入合并段)时使用;用户口头说'提交/commit/push'时必须先确认,不得自动触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
7
7
  # harness-submit — 最终提交(含 worktree 合并)
8
8
 
9
9
  ## Purpose
@@ -4,7 +4,7 @@ description: Use when the user asks to synchronize, refresh, or validate Harness
4
4
  metadata, adapters, remote knowledge ownership, instruction entrypoints,
5
5
  config origins, or CodeGraph status.
6
6
  ---
7
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
7
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
8
8
  # harness-sync
9
9
 
10
10
  ## Purpose
@@ -3,7 +3,7 @@ name: harness-test
3
3
  description: 测试执行:读取场景表,执行单元测试+API接口测试+数据兼容验证,输出测试报告。仅当用户显式调用 /harness-test
4
4
  时使用;不得在 run 结束后自动接续执行。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=095417dd8e8f9e34; overlay=none; agent=codex; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=74bf5b417c48700b; overlay=none; agent=codex; do not edit -->
7
7
  # harness-test — 测试执行
8
8
 
9
9
  > **2026-08 阶段合并**:原 `run`(编码)与 `test`(验证)合并为单一 `execute` 阶段,
@@ -4201,11 +4201,16 @@ def _stage_status_from_sources(
4201
4201
  }
4202
4202
  projected_events = he.apply_event_corrections(events)
4203
4203
  execute_phase_end_seen = False
4204
+ # 服务端 CLI schema 2.3 要求全阶段键集 {plan, run, test, review, submit,
4205
+ # archive},而 2026-08 起事件侧 run+test 已合并为 execute。仍带 run/test
4206
+ # 原名的旧事件在折叠进 execute 之前单独留一份,供归档时拆分还原。
4207
+ raw_run_test: dict[str, str] = {}
4204
4208
  for event in projected_events:
4205
4209
  if event.get("type") != "phase.end":
4206
4210
  continue
4207
4211
  # 旧事件的 run/test phase.end 折叠进 execute,按事件序后写胜。
4208
- phase = hp.resolve_phase_name(str(event.get("phase") or "").lower()) or ""
4212
+ raw_phase = str(event.get("phase") or "").strip().lower()
4213
+ phase = hp.resolve_phase_name(raw_phase) or ""
4209
4214
  raw = str(event.get("status") or "").upper()
4210
4215
  if phase not in status or not raw:
4211
4216
  continue
@@ -4218,6 +4223,8 @@ def _stage_status_from_sources(
4218
4223
  elif raw in {"SKIP", "SKIPPED"}:
4219
4224
  raw = "USER_SKIPPED"
4220
4225
  status[phase] = raw
4226
+ if raw_phase in {"run", "test"}:
4227
+ raw_run_test[raw_phase] = raw
4221
4228
  # Issues in events can downgrade. H-14: informational / hygiene / agent-preflight
4222
4229
  # notes must not downgrade an already-OK phase.end.
4223
4230
  _informational_markers = (
@@ -4272,7 +4279,18 @@ def _stage_status_from_sources(
4272
4279
  if not review_evidence_present(change_dir, projected_events):
4273
4280
  status["review"] = "ADVISORY"
4274
4281
 
4275
- return status
4282
+ # 服务端 schema 2.3 是 passthrough:execute 键保留供既有消费方使用,
4283
+ # 同时补上 run/test 满足必需键。旧事件带 run/test 原名时按原名拆分,
4284
+ # 否则镜像 execute 聚合值(合并事件流里没有更细的信号可拆)。
4285
+ return {
4286
+ "plan": status["plan"],
4287
+ "execute": status["execute"],
4288
+ "run": raw_run_test.get("run", status["execute"]),
4289
+ "test": raw_run_test.get("test", status["execute"]),
4290
+ "review": status["review"],
4291
+ "submit": status["submit"],
4292
+ "archive": status["archive"],
4293
+ }
4276
4294
 
4277
4295
 
4278
4296
  def _compute_final_status(
@@ -5665,7 +5683,11 @@ def collect_summary_data(
5665
5683
  scenario_risks, scenario_actions = _risks_from_test_results(change_dir)
5666
5684
  data["knownRisks"] = known_risks + scenario_risks
5667
5685
  data["manualActions"] = scenario_actions
5686
+ execute_status = (data.get("stageStatus") or {}).get("execute")
5668
5687
  for name, value in (data.get("stageStatus") or {}).items():
5688
+ # run/test 镜像 execute 聚合值时不重复生成同一条人工动作。
5689
+ if name in {"run", "test"} and value == execute_status:
5690
+ continue
5669
5691
  if value in {"BLOCKED", "BLOCKED_BY_ENV", "BLOCKED_BY_DBA", "NOT_RUN", "USER_SKIPPED"}:
5670
5692
  data["manualActions"].append({
5671
5693
  "stage": name,
@@ -2,5 +2,5 @@
2
2
  "schemaVersion": 1,
3
3
  "overlay": "none",
4
4
  "agent": "cursor",
5
- "coreHash": "749a241a858bd8d9"
5
+ "coreHash": "b246bb49cee55535"
6
6
  }
@@ -3,7 +3,7 @@ name: harness-archive
3
3
  description: 归档所有变更产出(计划/测试报告/审查/SQL/API文档)到 .harness/archive/,含归档元数据。仅当用户显式调用
4
4
  /harness-archive 时使用;不得被其他阶段 skill 自动接续触发。
5
5
  ---
6
- <!-- generated by harness_deploy.py; core=749a241a858bd8d9; overlay=none; agent=cursor; do not edit -->
6
+ <!-- generated by harness_deploy.py; core=b246bb49cee55535; overlay=none; agent=cursor; do not edit -->
7
7
  # harness-archive — 变更归档
8
8
 
9
9
  ## Purpose