@hunter-harness/workflow-harness 0.2.26 → 0.2.28

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 (210) 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-archive/templates/render-summary.mjs +25 -6
  4. package/harness/bundles/general/claude-code/harness-archive/templates/summary-data-template.json +44 -0
  5. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  6. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  7. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  8. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
  9. package/harness/bundles/general/claude-code/harness-plan/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 +8 -4
  14. package/harness/bundles/general/claude-code/harness-sync/reference.md +28 -0
  15. package/harness/bundles/general/claude-code/harness-test/SKILL.md +1 -1
  16. package/harness/bundles/general/claude-code/scripts/harness_archive.py +2147 -189
  17. package/harness/bundles/general/claude-code/scripts/harness_change.py +8 -3
  18. package/harness/bundles/general/claude-code/scripts/harness_events.py +57 -9
  19. package/harness/bundles/general/claude-code/scripts/harness_gate.py +530 -8
  20. package/harness/bundles/general/claude-code/scripts/harness_integration.py +263 -6
  21. package/harness/bundles/general/claude-code/scripts/harness_phase.py +758 -1
  22. package/harness/bundles/general/claude-code/scripts/harness_plan_finalize.py +74 -0
  23. package/harness/bundles/general/claude-code/scripts/harness_retry.py +175 -0
  24. package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +702 -22
  25. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  26. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
  27. package/harness/bundles/general/codebuddy/harness-archive/templates/render-summary.mjs +25 -6
  28. package/harness/bundles/general/codebuddy/harness-archive/templates/summary-data-template.json +44 -0
  29. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  30. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  31. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  32. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  33. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
  34. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
  35. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
  36. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
  37. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +8 -4
  38. package/harness/bundles/general/codebuddy/harness-sync/reference.md +28 -0
  39. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +1 -1
  40. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +2147 -189
  41. package/harness/bundles/general/codebuddy/scripts/harness_change.py +8 -3
  42. package/harness/bundles/general/codebuddy/scripts/harness_events.py +57 -9
  43. package/harness/bundles/general/codebuddy/scripts/harness_gate.py +530 -8
  44. package/harness/bundles/general/codebuddy/scripts/harness_integration.py +263 -6
  45. package/harness/bundles/general/codebuddy/scripts/harness_phase.py +758 -1
  46. package/harness/bundles/general/codebuddy/scripts/harness_plan_finalize.py +74 -0
  47. package/harness/bundles/general/codebuddy/scripts/harness_retry.py +175 -0
  48. package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +702 -22
  49. package/harness/bundles/general/codex/.harness-build.json +1 -1
  50. package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
  51. package/harness/bundles/general/codex/harness-archive/templates/render-summary.mjs +25 -6
  52. package/harness/bundles/general/codex/harness-archive/templates/summary-data-template.json +44 -0
  53. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  54. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
  55. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  56. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  57. package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
  58. package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
  59. package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
  60. package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
  61. package/harness/bundles/general/codex/harness-sync/SKILL.md +8 -4
  62. package/harness/bundles/general/codex/harness-sync/reference.md +28 -0
  63. package/harness/bundles/general/codex/harness-test/SKILL.md +1 -1
  64. package/harness/bundles/general/codex/scripts/harness_archive.py +2147 -189
  65. package/harness/bundles/general/codex/scripts/harness_change.py +8 -3
  66. package/harness/bundles/general/codex/scripts/harness_events.py +57 -9
  67. package/harness/bundles/general/codex/scripts/harness_gate.py +530 -8
  68. package/harness/bundles/general/codex/scripts/harness_integration.py +263 -6
  69. package/harness/bundles/general/codex/scripts/harness_phase.py +758 -1
  70. package/harness/bundles/general/codex/scripts/harness_plan_finalize.py +74 -0
  71. package/harness/bundles/general/codex/scripts/harness_retry.py +175 -0
  72. package/harness/bundles/general/codex/scripts/harness_test_guard.py +702 -22
  73. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  74. package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
  75. package/harness/bundles/general/cursor/harness-archive/templates/render-summary.mjs +25 -6
  76. package/harness/bundles/general/cursor/harness-archive/templates/summary-data-template.json +44 -0
  77. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  78. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  79. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  80. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  81. package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
  82. package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
  83. package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
  84. package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
  85. package/harness/bundles/general/cursor/harness-sync/SKILL.md +8 -4
  86. package/harness/bundles/general/cursor/harness-sync/reference.md +28 -0
  87. package/harness/bundles/general/cursor/harness-test/SKILL.md +1 -1
  88. package/harness/bundles/general/cursor/scripts/harness_archive.py +2147 -189
  89. package/harness/bundles/general/cursor/scripts/harness_change.py +8 -3
  90. package/harness/bundles/general/cursor/scripts/harness_events.py +57 -9
  91. package/harness/bundles/general/cursor/scripts/harness_gate.py +530 -8
  92. package/harness/bundles/general/cursor/scripts/harness_integration.py +263 -6
  93. package/harness/bundles/general/cursor/scripts/harness_phase.py +758 -1
  94. package/harness/bundles/general/cursor/scripts/harness_plan_finalize.py +74 -0
  95. package/harness/bundles/general/cursor/scripts/harness_retry.py +175 -0
  96. package/harness/bundles/general/cursor/scripts/harness_test_guard.py +702 -22
  97. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  98. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  99. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
  100. package/harness/bundles/java/claude-code/harness-archive/templates/render-summary.mjs +25 -6
  101. package/harness/bundles/java/claude-code/harness-archive/templates/summary-data-template.json +44 -0
  102. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  103. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  104. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  105. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  106. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  107. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
  108. package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
  109. package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
  110. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
  111. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +8 -4
  112. package/harness/bundles/java/claude-code/harness-sync/reference.md +28 -0
  113. package/harness/bundles/java/claude-code/harness-test/SKILL.md +1 -1
  114. package/harness/bundles/java/claude-code/scripts/harness_archive.py +2147 -189
  115. package/harness/bundles/java/claude-code/scripts/harness_change.py +8 -3
  116. package/harness/bundles/java/claude-code/scripts/harness_events.py +57 -9
  117. package/harness/bundles/java/claude-code/scripts/harness_gate.py +530 -8
  118. package/harness/bundles/java/claude-code/scripts/harness_integration.py +263 -6
  119. package/harness/bundles/java/claude-code/scripts/harness_phase.py +758 -1
  120. package/harness/bundles/java/claude-code/scripts/harness_plan_finalize.py +74 -0
  121. package/harness/bundles/java/claude-code/scripts/harness_retry.py +175 -0
  122. package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +702 -22
  123. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  124. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  125. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
  126. package/harness/bundles/java/codebuddy/harness-archive/templates/render-summary.mjs +25 -6
  127. package/harness/bundles/java/codebuddy/harness-archive/templates/summary-data-template.json +44 -0
  128. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  129. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  130. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  131. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  132. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  133. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
  134. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
  135. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
  136. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
  137. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +8 -4
  138. package/harness/bundles/java/codebuddy/harness-sync/reference.md +28 -0
  139. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +1 -1
  140. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +2147 -189
  141. package/harness/bundles/java/codebuddy/scripts/harness_change.py +8 -3
  142. package/harness/bundles/java/codebuddy/scripts/harness_events.py +57 -9
  143. package/harness/bundles/java/codebuddy/scripts/harness_gate.py +530 -8
  144. package/harness/bundles/java/codebuddy/scripts/harness_integration.py +263 -6
  145. package/harness/bundles/java/codebuddy/scripts/harness_phase.py +758 -1
  146. package/harness/bundles/java/codebuddy/scripts/harness_plan_finalize.py +74 -0
  147. package/harness/bundles/java/codebuddy/scripts/harness_retry.py +175 -0
  148. package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +702 -22
  149. package/harness/bundles/java/codex/.harness-build.json +1 -1
  150. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  151. package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
  152. package/harness/bundles/java/codex/harness-archive/templates/render-summary.mjs +25 -6
  153. package/harness/bundles/java/codex/harness-archive/templates/summary-data-template.json +44 -0
  154. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  155. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
  156. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  157. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  158. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  159. package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
  160. package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
  161. package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
  162. package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
  163. package/harness/bundles/java/codex/harness-sync/SKILL.md +8 -4
  164. package/harness/bundles/java/codex/harness-sync/reference.md +28 -0
  165. package/harness/bundles/java/codex/harness-test/SKILL.md +1 -1
  166. package/harness/bundles/java/codex/scripts/harness_archive.py +2147 -189
  167. package/harness/bundles/java/codex/scripts/harness_change.py +8 -3
  168. package/harness/bundles/java/codex/scripts/harness_events.py +57 -9
  169. package/harness/bundles/java/codex/scripts/harness_gate.py +530 -8
  170. package/harness/bundles/java/codex/scripts/harness_integration.py +263 -6
  171. package/harness/bundles/java/codex/scripts/harness_phase.py +758 -1
  172. package/harness/bundles/java/codex/scripts/harness_plan_finalize.py +74 -0
  173. package/harness/bundles/java/codex/scripts/harness_retry.py +175 -0
  174. package/harness/bundles/java/codex/scripts/harness_test_guard.py +702 -22
  175. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  176. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  177. package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
  178. package/harness/bundles/java/cursor/harness-archive/templates/render-summary.mjs +25 -6
  179. package/harness/bundles/java/cursor/harness-archive/templates/summary-data-template.json +44 -0
  180. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  181. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  182. package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +493 -74
  183. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  184. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  185. package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
  186. package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
  187. package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
  188. package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
  189. package/harness/bundles/java/cursor/harness-sync/SKILL.md +8 -4
  190. package/harness/bundles/java/cursor/harness-sync/reference.md +28 -0
  191. package/harness/bundles/java/cursor/harness-test/SKILL.md +1 -1
  192. package/harness/bundles/java/cursor/scripts/harness_archive.py +2147 -189
  193. package/harness/bundles/java/cursor/scripts/harness_change.py +8 -3
  194. package/harness/bundles/java/cursor/scripts/harness_events.py +57 -9
  195. package/harness/bundles/java/cursor/scripts/harness_gate.py +530 -8
  196. package/harness/bundles/java/cursor/scripts/harness_integration.py +263 -6
  197. package/harness/bundles/java/cursor/scripts/harness_phase.py +758 -1
  198. package/harness/bundles/java/cursor/scripts/harness_plan_finalize.py +74 -0
  199. package/harness/bundles/java/cursor/scripts/harness_retry.py +175 -0
  200. package/harness/bundles/java/cursor/scripts/harness_test_guard.py +702 -22
  201. package/harness/manifests/general/claude-code.json +28 -24
  202. package/harness/manifests/general/codebuddy.json +28 -24
  203. package/harness/manifests/general/codex.json +28 -24
  204. package/harness/manifests/general/cursor.json +28 -24
  205. package/harness/manifests/java/claude-code.json +30 -26
  206. package/harness/manifests/java/codebuddy.json +30 -26
  207. package/harness/manifests/java/codex.json +30 -26
  208. package/harness/manifests/java/cursor.json +30 -26
  209. package/hunter-workflow-family.json +2 -2
  210. package/package.json +1 -1
@@ -2,5 +2,5 @@
2
2
  "schemaVersion": 1,
3
3
  "overlay": "none",
4
4
  "agent": "claude-code",
5
- "coreHash": "d516445f37019ef0"
5
+ "coreHash": "8b33a3eaa74f46ca"
6
6
  }
@@ -20,7 +20,7 @@ disallowed-tools:
20
20
  - Bash(awk *)
21
21
  - Bash(curl *)
22
22
  ---
23
- <!-- generated by harness_deploy.py; core=d516445f37019ef0; overlay=none; agent=claude-code; do not edit -->
23
+ <!-- generated by harness_deploy.py; core=8b33a3eaa74f46ca; overlay=none; agent=claude-code; do not edit -->
24
24
  # harness-archive — 变更归档
25
25
 
26
26
  ## Purpose
@@ -61,15 +61,26 @@ const performance = record(verification.performance);
61
61
  const durations = record(data.durations);
62
62
  const durationStages = list(durations.stages);
63
63
  const timing = record(data.timing);
64
+ const attempts = list(timing.attempts);
65
+ const sessions = list(timing.sessions);
66
+ const candidate = record(data.candidateVerification);
67
+ const archiveIntegrity = record(data.archiveIntegrity);
68
+ const releaseDecision = record(data.releaseDecision);
69
+ const releaseChecks = Object.entries(record(releaseDecision.checks));
70
+ const artifactStorage = record(data.artifactStorage);
71
+ const remoteCost = record(record(data.remoteCost).totals);
72
+ const projection = record(data.projection);
64
73
  const wallLabel = timing.workflowWallClockMs != null
65
74
  ? durationMs(timing.workflowWallClockMs)
66
75
  : (durations.totalLabel || duration(durations.totalMinutes));
67
76
  const timingColumnsHtml = `
68
- <article class="card" id="timingColumns"><h2>时长(三列)</h2>
69
- <div class="row"><div><strong>活动执行</strong><small>stageActiveExecution</small></div><span>${esc(durationMs(timing.stageActiveExecutionMs))}</span></div>
70
- <div class="row"><div><strong>阶段墙钟</strong><small>stageWallClockSpan</small></div><span>${esc(durationMs(timing.stageWallClockSpanMs))}</span></div>
77
+ <article class="card" id="timingColumns"><h2>时间守恒 / Timing Conservation</h2>
71
78
  <div class="row"><div><strong>全流程墙钟</strong><small>workflowWallClock</small></div><span>${esc(durationMs(timing.workflowWallClockMs))}</span></div>
72
- <p><small>reportCutoffAt=<code id="reportCutoffAt">${esc(timing.reportCutoffAt || "N/A")}</code> · durations.totalMinutes 仅为活动执行,不冒充墙钟</small></p>
79
+ <div class="row"><div><strong>归因阶段并集</strong><small>attributedStageUnion</small></div><span>${esc(durationMs(timing.attributedStageUnionMs))}</span></div>
80
+ <div class="row"><div><strong>远端等待</strong><small>externalWait</small></div><span>${esc(durationMs(timing.externalWaitMs))}</span></div>
81
+ <div class="row"><div><strong>暂停</strong><small>paused</small></div><span>${esc(durationMs(timing.pausedMs))}</span></div>
82
+ <div class="row"><div><strong>未归因</strong><small>agentOrToolUnattributed</small></div><span>${esc(durationMs(timing.agentOrToolUnattributedMs))}</span></div>
83
+ <p><small>conservationDeltaMs=<code>${esc(timing.conservationDeltaMs ?? "N/A")}</code> · reportCutoffAt=<code id="reportCutoffAt">${esc(timing.reportCutoffAt || "N/A")}</code> · active-only 不冒充墙钟</small></p>
73
84
  </article>`;
74
85
  const maxMinutes = Math.max(1, ...durationStages.map((item) => number(item.minutes)));
75
86
  const diff = record(data.diffStat);
@@ -100,6 +111,12 @@ const actionHtml = actions.map((item) => `<li>${esc(describe(item))}</li>`).join
100
111
  const fileRows = files.map((item) => `<tr><td><code>${esc(item.path || item.file)}</code></td><td class="plus">+${number(item.insertions)}</td><td class="minus">-${number(item.deletions)}</td></tr>`).join("") || '<tr><td colspan="3">没有变更文件证据</td></tr>';
101
112
  const timelineRows = timeline.map((item) => `<tr><td>${esc(item.phase || item.stage || "-")}</td><td>${esc(item.attempt || "-")}</td><td>${pill(item.status || item.result || item.type)}</td><td>${esc(item.executorTool || item.executor_tool || item.summary || "-")}</td></tr>`).join("") || '<tr><td colspan="4">没有时间线记录</td></tr>';
102
113
  const commandRows = commands.map((item) => `<tr><td>${esc(item.phase || "-")}</td><td><code>${esc(item.command)}</code></td><td>${pill(number(item.exit_code) === 0 ? "OK" : "FAIL")}</td></tr>`).join("") || '<tr><td colspan="3">没有命令证据</td></tr>';
114
+ const releaseCheckHtml = releaseChecks.map(([name, checkValue]) => {
115
+ const check = record(checkValue);
116
+ return `<div class="row"><div><strong>${esc(name)}</strong><small>${esc(check.message || check.code || "")}</small></div>${pill(check.ok ? "OK" : "BLOCKED")}</div>`;
117
+ }).join("") || '<p class="empty">没有 release check 证据</p>';
118
+ const attemptRows = attempts.map((item) => `<tr><td>${esc(item.phase || "-")}</td><td>${esc(item.attempt || "-")}</td><td>${pill(item.terminalStatus || item.status || "UNKNOWN")}</td><td>${esc(durationMs(item.durationMs))}</td></tr>`).join("") || '<tr><td colspan="4">没有 typed attempt 记录</td></tr>';
119
+ const sessionRows = sessions.map((item) => `<tr><td>${esc(item.sessionId || item.id || "-")}</td><td>${esc(item.startedAt || "-")}</td><td>${esc(item.endedAt || "-")}</td><td>${esc(durationMs(item.wallClockMs || item.durationMs))}</td></tr>`).join("") || '<tr><td colspan="4">没有 session 记录</td></tr>';
103
120
 
104
121
  const html = `<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
105
122
  <title>Harness 最终报告 · ${esc(data.changeName)}</title><style>
@@ -108,11 +125,13 @@ const html = `<!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><met
108
125
  *{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.5 Inter,"Segoe UI","Microsoft YaHei",sans-serif}main{width:min(1140px,calc(100% - 28px));margin:22px auto 44px}.hero,.card,.metric,details{background:var(--card);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow)}.hero{padding:23px 25px;border-top:3px solid var(--blue)}.eyebrow{color:var(--blue);font-weight:750;letter-spacing:.08em}h1{font-size:27px;line-height:1.2;margin:5px 0 7px;overflow-wrap:anywhere}.goal,.empty,small{color:var(--muted)}.status{display:flex;align-items:center;gap:10px;margin-top:16px}.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:11px;margin:11px 0}.metric{padding:14px 15px}.metric strong{display:block;font-size:19px;margin:4px 0}.grid{display:grid;grid-template-columns:1.12fr .88fr;gap:11px}.card{padding:17px;margin-bottom:11px}h2{font-size:16px;margin:0 0 10px}.row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 0;border-bottom:1px solid var(--line)}.row:last-child{border:0}.row small{display:block;margin-top:2px}.pill{display:inline-flex;border-radius:999px;padding:3px 9px;font-size:11px;font-weight:750;white-space:nowrap}.pill.success{color:var(--good);background:color-mix(in srgb,var(--good) 13%,transparent)}.pill.warning{color:var(--warn);background:color-mix(in srgb,var(--warn) 14%,transparent)}.pill.danger{color:var(--bad);background:color-mix(in srgb,var(--bad) 13%,transparent)}.pill.neutral{color:var(--blue);background:color-mix(in srgb,var(--blue) 12%,transparent)}.duration{margin:11px 0}.duration>div{display:flex;justify-content:space-between;color:var(--muted);font-size:12px}.duration>div span:first-child{color:var(--text);font-weight:650}.duration i{display:block;height:7px;background:var(--soft);border-radius:99px;overflow:hidden;margin-top:6px}.duration b{display:block;height:100%;background:linear-gradient(90deg,var(--blue),#7c70ff)}.risk{display:grid;grid-template-columns:1fr 1fr;gap:10px}.risk>div{background:var(--soft);border-radius:10px;padding:11px}.risk h3{font-size:13px;margin:0 0 5px}.risk ul{padding-left:18px;margin:0;color:var(--muted)}details{margin:9px 0}summary{cursor:pointer;padding:13px 15px;font-weight:650}details>div{padding:0 15px 15px;overflow:auto}table{width:100%;border-collapse:collapse}th,td{text-align:left;padding:8px 9px;border-bottom:1px solid var(--line);vertical-align:top}th{color:var(--muted);font-size:11px;letter-spacing:.04em}code{font-family:"Cascadia Code",Consolas,monospace;color:var(--blue);overflow-wrap:anywhere}.plus{color:var(--good)}.minus{color:var(--bad)}dl{display:grid;grid-template-columns:145px 1fr;gap:7px 11px}dt{color:var(--muted)}dd{margin:0;overflow-wrap:anywhere}
109
126
  @media(max-width:800px){.metrics{grid-template-columns:1fr 1fr}.grid,.risk{grid-template-columns:1fr}}@media(max-width:480px){main{width:calc(100% - 18px);margin-top:9px}.metrics{grid-template-columns:1fr}.hero{padding:19px}h1{font-size:23px}dl{grid-template-columns:1fr}}
110
127
  </style></head><body><main>
111
- <section class="hero"><div class="eyebrow">HARNESS EXECUTION REPORT</div><h1>${esc(data.changeName || "未命名变更")}</h1><p class="goal">${esc(data.businessGoal || "未记录业务目标")}</p><div class="status">${pill(data.finalStatus)}<span>基于事件、验证账本与 Git 证据生成${data.riskTier ? ` · riskTier=${esc(data.riskTier)}` : ""}</span></div>${reasonHtml ? `<div class="status">${reasonHtml}</div>` : ""}</section>
128
+ <section class="hero"><div class="eyebrow">HARNESS EXECUTION REPORT · CURRENT OUTCOME / 当前结果</div><h1>${esc(data.changeName || "未命名变更")}</h1><p class="goal">${esc(data.businessGoal || "未记录业务目标")}</p><div class="status">${pill(data.finalStatus)}<span>当前结果基于事件、验证账本与 Git 证据${data.riskTier ? ` · riskTier=${esc(data.riskTier)}` : ""}</span></div>${reasonHtml ? `<div class="status">${reasonHtml}</div>` : ""}</section>
112
129
  <section class="metrics"><article class="metric"><small>产品提交</small><strong><code title="${esc(data.productCommit || data.finalCommit)}">${esc(shortHash(data.productCommit || data.finalCommit))}</code></strong><small>archive=${esc(shortHash(data.archiveCommit || data.finalCommit))}</small></article><article class="metric"><small>代码范围</small><strong>${number(diff.filesChanged)} 个文件</strong><small><span class="plus">+${number(diff.insertions)}</span> · <span class="minus">-${number(diff.deletions)}</span></small></article><article class="metric"><small>全流程墙钟</small><strong>${esc(wallLabel)}</strong><small>活动=${esc(durationMs(timing.stageActiveExecutionMs))} · ${durationStages.length} 阶段</small></article><article class="metric"><small>归档完整性</small><strong>${esc(record(data.archiveManifest).checksumStatus || "UNKNOWN")}</strong><small>${number(record(data.archiveManifest).totalArchiveFiles)} 个归档文件</small></article></section>
113
- <section class="grid"><div><article class="card"><h2>验证结论</h2>${verificationHtml}</article><article class="card"><h2>阶段耗时(活动)</h2>${durationHtml}</article>${timingColumnsHtml}</div><div><article class="card"><h2>阶段状态</h2>${stageHtml}</article><article class="card"><h2>风险与后续</h2><div class="risk"><div><h3>已知风险</h3><ul>${riskHtml}</ul></div><div><h3>人工动作</h3><ul>${actionHtml}</ul></div></div></article></div></section>
130
+ <section class="grid"><div><article class="card"><h2>Candidate Claim / Attestation</h2><div class="row"><div><strong>${esc(candidate.assurance || "none")}</strong><small>${esc(candidate.code || candidate.message || "没有候选证明")}</small></div>${pill(candidate.ok ? "VERIFIED" : "UNVERIFIED")}</div></article><article class="card"><h2>Release Eligibility</h2><div class="row"><div><strong>${esc(releaseDecision.code || "NOT_EVALUATED")}</strong><small>唯一发布公式的汇总结论</small></div>${pill(releaseDecision.releaseEligible ? "ELIGIBLE" : "BLOCKED")}</div>${releaseCheckHtml}</article><article class="card"><h2>验证结论</h2>${verificationHtml}</article><article class="card"><h2>阶段耗时(活动)</h2>${durationHtml}</article>${timingColumnsHtml}</div><div><article class="card"><h2>Archive Integrity</h2><div class="row"><div><strong>${esc(archiveIntegrity.code || "NOT_EVALUATED")}</strong><small>${esc(archiveIntegrity.message || archiveIntegrity.checksumStatus || "")}</small></div>${pill(archiveIntegrity.ok ? "OK" : "FAIL")}</div></article><article class="card"><h2>History Quality</h2><div class="row"><div><strong>${attempts.length} 次 typed attempts</strong><small>${sessions.length} 个 sessions · unclosed=${number(timing.unclosedAttemptCount)}</small></div>${pill(number(timing.unclosedAttemptCount) === 0 ? "CLOSED" : "INCOMPLETE")}</div></article><article class="card"><h2>Remote Cost</h2><div class="row"><div><strong>${number(remoteCost.runnerMinutes)} runner 分钟</strong><small>queue/wait=${durationMs(remoteCost.queueWaitMs)} · artifacts=${number(remoteCost.artifactBytes)} bytes</small></div>${pill(number(remoteCost.duplicateRunCount) === 0 ? "NO_DUPLICATES" : `${number(remoteCost.duplicateRunCount)} DUPLICATES`)}</div></article><article class="card"><h2>Artifact Storage</h2><div class="row"><div><strong>${number(artifactStorage.bytesAdded)} bytes 新增</strong><small>复用=${number(artifactStorage.bytesReused)} · 清理=${number(artifactStorage.bytesPruned)} · ${number(artifactStorage.artifactCount)} 项</small></div>${pill("OBSERVED")}</div></article><article class="card"><h2>Projection / Fallback</h2><div class="row"><div><strong>${esc(projection.mode || projection.status || "not-configured")}</strong><small>${esc(projection.remediation || projection.message || projection.code || "")}</small></div>${pill(projection.ok === false ? "BLOCKED" : (projection.mode === "fallback" ? "FALLBACK" : "OK"))}</div></article><article class="card"><h2>阶段状态</h2>${stageHtml}</article><article class="card"><h2>风险与后续</h2><div class="risk"><div><h3>已知风险</h3><ul>${riskHtml}</ul></div><div><h3>人工动作</h3><ul>${actionHtml}</ul></div></div></article></div></section>
114
131
  <details><summary>变更文件(${files.length})</summary><div><table><thead><tr><th>文件</th><th>新增</th><th>删除</th></tr></thead><tbody>${fileRows}</tbody></table></div></details>
115
132
  <details><summary>执行时间线与工具交接(${timeline.length})</summary><div><table><thead><tr><th>阶段</th><th>尝试</th><th>状态</th><th>来源 / 摘要</th></tr></thead><tbody>${timelineRows}</tbody></table></div></details>
133
+ <details><summary>Typed Attempts(${attempts.length})</summary><div><table><thead><tr><th>阶段</th><th>尝试</th><th>终态</th><th>耗时</th></tr></thead><tbody>${attemptRows}</tbody></table></div></details>
134
+ <details><summary>Sessions(${sessions.length})</summary><div><table><thead><tr><th>Session</th><th>开始</th><th>结束</th><th>墙钟</th></tr></thead><tbody>${sessionRows}</tbody></table></div></details>
116
135
  <details><summary>命令证据(${commands.length})</summary><div><table><thead><tr><th>阶段</th><th>命令</th><th>结果</th></tr></thead><tbody>${commandRows}</tbody></table></div></details>
117
136
  <details><summary>技术元数据</summary><div><dl><dt>功能合并提交</dt><dd><code>${esc(data.featureMergeHash || data.productCommit || data.finalCommit || "N/A")}</code></dd><dt>发布线尖端</dt><dd><code>${esc(data.releaseTipHash || data.archiveCommit || "N/A")}</code></dd><dt>产品提交</dt><dd><code>${esc(data.productCommit || data.finalCommit || "N/A")}</code></dd><dt>产品树哈希</dt><dd><code>${esc(data.productTreeHash || "N/A")}</code></dd><dt>归档提交</dt><dd><code>${esc(data.archiveCommit || data.finalCommit || "N/A")}</code></dd><dt>基线提交</dt><dd><code>${esc(data.baseCommit || "N/A")}</code></dd><dt>Git 范围</dt><dd><code>${esc(diff.range || "N/A")}</code></dd><dt>报告数据版本</dt><dd>${esc(data.schemaVersion || "N/A")}</dd><dt>事实来源</dt><dd>${esc(list(record(data.reportPipeline).sources).join(" · ") || "N/A")}</dd></dl></div></details>
118
137
  </main></body></html>`;
@@ -13,7 +13,14 @@
13
13
  "assurance": "local-reproducible | remote-claimed | remote-attested",
14
14
  "message": ""
15
15
  },
16
+ "releaseDecision": {
17
+ "releaseEligible": false,
18
+ "code": "RELEASE_NOT_EVALUATED",
19
+ "checks": {},
20
+ "issues": []
21
+ },
16
22
  "releaseEligible": false,
23
+ "projection": {},
17
24
  "finalCommit": "<commit-hash>",
18
25
  "finalCommitBranch": "<origin/branch>",
19
26
  "baseCommit": "<base-commit-hash>",
@@ -45,6 +52,16 @@
45
52
  }
46
53
  ]
47
54
  },
55
+ "timing": {
56
+ "workflowWallClockMs": 0,
57
+ "attributedStageUnionMs": 0,
58
+ "externalWaitMs": 0,
59
+ "pausedMs": 0,
60
+ "agentOrToolUnattributedMs": 0,
61
+ "conservationDeltaMs": 0,
62
+ "attempts": [],
63
+ "sessions": []
64
+ },
48
65
  "skillCalls": [
49
66
  { "skill": "harness-plan", "count": 1, "result": "OK" }
50
67
  ],
@@ -73,6 +90,33 @@
73
90
  { "path": "src/...", "summary": "说明", "insertions": 0, "deletions": 0 }
74
91
  ],
75
92
  "artifacts": [],
93
+ "artifactStorage": {
94
+ "schemaVersion": 1,
95
+ "artifactCount": 0,
96
+ "bytesAdded": 0,
97
+ "bytesReused": 0,
98
+ "bytesPruned": 0,
99
+ "largestItems": []
100
+ },
101
+ "retention": {
102
+ "schemaVersion": 1,
103
+ "mode": "audit-only",
104
+ "expiredCount": 0,
105
+ "bytesPrunable": 0,
106
+ "items": []
107
+ },
108
+ "remoteCost": {
109
+ "schemaVersion": 1,
110
+ "available": false,
111
+ "candidates": [],
112
+ "totals": {
113
+ "runCount": 0,
114
+ "runnerMinutes": 0,
115
+ "queueWaitMs": 0,
116
+ "artifactBytes": 0,
117
+ "duplicateRunCount": 0
118
+ }
119
+ },
76
120
  "reviewSummary": {
77
121
  "status": "ADVISORY",
78
122
  "red": 0,
@@ -20,7 +20,7 @@ disallowed-tools:
20
20
  - Bash(awk *)
21
21
  - Bash(curl *)
22
22
  ---
23
- <!-- generated by harness_deploy.py; core=d516445f37019ef0; overlay=none; agent=claude-code; do not edit -->
23
+ <!-- generated by harness_deploy.py; core=8b33a3eaa74f46ca; overlay=none; agent=claude-code; do not edit -->
24
24
  # harness-codebase-map — 代码库地图
25
25
 
26
26
  ## Purpose
@@ -20,7 +20,7 @@ disallowed-tools:
20
20
  - Bash(awk *)
21
21
  - Bash(curl *)
22
22
  ---
23
- <!-- generated by harness_deploy.py; core=d516445f37019ef0; overlay=none; agent=claude-code; do not edit -->
23
+ <!-- generated by harness_deploy.py; core=8b33a3eaa74f46ca; overlay=none; agent=claude-code; do not edit -->
24
24
  # harness-knowledge-ingest
25
25
 
26
26
  从 `.harness/archive/**/reports/final/summary-data.json` 抽取项目知识,生成并维护本地 `.harness/knowledge/` 索引。