@hunter-harness/workflow-harness 0.2.8 → 0.2.10

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 (334) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/contracts/workflow-policy.json +3 -3
  3. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +3 -3
  4. package/harness/bundles/general/claude-code/harness-archive/reference.md +30 -12
  5. package/harness/bundles/general/claude-code/harness-archive/templates/render-summary.mjs +5 -1
  6. package/harness/bundles/general/claude-code/harness-archive/templates/summary-data-template.json +6 -2
  7. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  8. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +3 -1
  9. package/harness/bundles/general/claude-code/harness-knowledge-ingest/reference.md +7 -0
  10. package/harness/bundles/general/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
  11. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
  12. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
  13. package/harness/bundles/general/claude-code/harness-plan/checklist.md +6 -0
  14. package/harness/bundles/general/claude-code/harness-review/SKILL.md +3 -3
  15. package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
  16. package/harness/bundles/general/claude-code/harness-run/checklist.md +5 -0
  17. package/harness/bundles/general/claude-code/harness-run/reference.md +33 -1
  18. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +15 -10
  19. package/harness/bundles/general/claude-code/harness-submit/checklist.md +40 -76
  20. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +17 -2
  21. package/harness/bundles/general/claude-code/harness-sync/reference.md +2 -2
  22. package/harness/bundles/general/claude-code/harness-test/SKILL.md +1 -1
  23. package/harness/bundles/general/claude-code/harness-test/checklist.md +9 -0
  24. package/harness/bundles/general/claude-code/harness-test/pitfalls-java.md +14 -0
  25. package/harness/bundles/general/claude-code/harness-test/reference.md +38 -0
  26. package/harness/bundles/general/claude-code/protocols/archive-report-protocol.md +26 -4
  27. package/harness/bundles/general/claude-code/protocols/ledger-protocol.md +38 -0
  28. package/harness/bundles/general/claude-code/protocols/powershell-protocol.md +16 -0
  29. package/harness/bundles/general/claude-code/protocols/report-pipeline-protocol.md +17 -0
  30. package/harness/bundles/general/claude-code/protocols/state-layout-protocol.md +15 -0
  31. package/harness/bundles/general/claude-code/scripts/harness_archive.py +1209 -170
  32. package/harness/bundles/general/claude-code/scripts/harness_change.py +18 -0
  33. package/harness/bundles/general/claude-code/scripts/harness_deploy.py +1 -44
  34. package/harness/bundles/general/claude-code/scripts/harness_events.py +174 -25
  35. package/harness/bundles/general/claude-code/scripts/harness_gate.py +203 -29
  36. package/harness/bundles/general/claude-code/scripts/harness_integration.py +878 -0
  37. package/harness/bundles/general/claude-code/scripts/harness_ledger.py +457 -10
  38. package/harness/bundles/general/claude-code/scripts/harness_paths.py +315 -0
  39. package/harness/bundles/general/claude-code/scripts/harness_profile.py +45 -0
  40. package/harness/bundles/general/claude-code/scripts/harness_review.py +326 -0
  41. package/harness/bundles/general/claude-code/scripts/harness_sync.py +407 -0
  42. package/harness/bundles/general/claude-code/scripts/harness_test_guard.py +244 -49
  43. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  44. package/harness/bundles/general/codebuddy/contracts/workflow-policy.json +3 -3
  45. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +3 -3
  46. package/harness/bundles/general/codebuddy/harness-archive/reference.md +30 -12
  47. package/harness/bundles/general/codebuddy/harness-archive/templates/render-summary.mjs +5 -1
  48. package/harness/bundles/general/codebuddy/harness-archive/templates/summary-data-template.json +6 -2
  49. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  50. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +3 -1
  51. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/reference.md +7 -0
  52. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
  53. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  54. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
  55. package/harness/bundles/general/codebuddy/harness-plan/checklist.md +6 -0
  56. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +3 -3
  57. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
  58. package/harness/bundles/general/codebuddy/harness-run/checklist.md +5 -0
  59. package/harness/bundles/general/codebuddy/harness-run/reference.md +33 -1
  60. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +15 -10
  61. package/harness/bundles/general/codebuddy/harness-submit/checklist.md +40 -76
  62. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +17 -2
  63. package/harness/bundles/general/codebuddy/harness-sync/reference.md +2 -2
  64. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +1 -1
  65. package/harness/bundles/general/codebuddy/harness-test/checklist.md +9 -0
  66. package/harness/bundles/general/codebuddy/harness-test/pitfalls-java.md +14 -0
  67. package/harness/bundles/general/codebuddy/harness-test/reference.md +38 -0
  68. package/harness/bundles/general/codebuddy/protocols/archive-report-protocol.md +26 -4
  69. package/harness/bundles/general/codebuddy/protocols/ledger-protocol.md +38 -0
  70. package/harness/bundles/general/codebuddy/protocols/powershell-protocol.md +16 -0
  71. package/harness/bundles/general/codebuddy/protocols/report-pipeline-protocol.md +17 -0
  72. package/harness/bundles/general/codebuddy/protocols/state-layout-protocol.md +15 -0
  73. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +1209 -170
  74. package/harness/bundles/general/codebuddy/scripts/harness_change.py +18 -0
  75. package/harness/bundles/general/codebuddy/scripts/harness_deploy.py +1 -44
  76. package/harness/bundles/general/codebuddy/scripts/harness_events.py +174 -25
  77. package/harness/bundles/general/codebuddy/scripts/harness_gate.py +203 -29
  78. package/harness/bundles/general/codebuddy/scripts/harness_integration.py +878 -0
  79. package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +457 -10
  80. package/harness/bundles/general/codebuddy/scripts/harness_paths.py +315 -0
  81. package/harness/bundles/general/codebuddy/scripts/harness_profile.py +45 -0
  82. package/harness/bundles/general/codebuddy/scripts/harness_review.py +326 -0
  83. package/harness/bundles/general/codebuddy/scripts/harness_sync.py +407 -0
  84. package/harness/bundles/general/codebuddy/scripts/harness_test_guard.py +244 -49
  85. package/harness/bundles/general/codex/.harness-build.json +1 -1
  86. package/harness/bundles/general/codex/contracts/workflow-policy.json +3 -3
  87. package/harness/bundles/general/codex/harness-archive/SKILL.md +3 -3
  88. package/harness/bundles/general/codex/harness-archive/reference.md +30 -12
  89. package/harness/bundles/general/codex/harness-archive/templates/render-summary.mjs +5 -1
  90. package/harness/bundles/general/codex/harness-archive/templates/summary-data-template.json +6 -2
  91. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  92. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +3 -1
  93. package/harness/bundles/general/codex/harness-knowledge-ingest/reference.md +7 -0
  94. package/harness/bundles/general/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
  95. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  96. package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
  97. package/harness/bundles/general/codex/harness-plan/checklist.md +6 -0
  98. package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
  99. package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
  100. package/harness/bundles/general/codex/harness-run/checklist.md +5 -0
  101. package/harness/bundles/general/codex/harness-run/reference.md +33 -1
  102. package/harness/bundles/general/codex/harness-submit/SKILL.md +15 -10
  103. package/harness/bundles/general/codex/harness-submit/checklist.md +40 -76
  104. package/harness/bundles/general/codex/harness-sync/SKILL.md +17 -2
  105. package/harness/bundles/general/codex/harness-sync/reference.md +2 -2
  106. package/harness/bundles/general/codex/harness-test/SKILL.md +1 -1
  107. package/harness/bundles/general/codex/harness-test/checklist.md +9 -0
  108. package/harness/bundles/general/codex/harness-test/pitfalls-java.md +14 -0
  109. package/harness/bundles/general/codex/harness-test/reference.md +38 -0
  110. package/harness/bundles/general/codex/protocols/archive-report-protocol.md +26 -4
  111. package/harness/bundles/general/codex/protocols/ledger-protocol.md +38 -0
  112. package/harness/bundles/general/codex/protocols/powershell-protocol.md +16 -0
  113. package/harness/bundles/general/codex/protocols/report-pipeline-protocol.md +17 -0
  114. package/harness/bundles/general/codex/protocols/state-layout-protocol.md +15 -0
  115. package/harness/bundles/general/codex/scripts/harness_archive.py +1209 -170
  116. package/harness/bundles/general/codex/scripts/harness_change.py +18 -0
  117. package/harness/bundles/general/codex/scripts/harness_deploy.py +1 -44
  118. package/harness/bundles/general/codex/scripts/harness_events.py +174 -25
  119. package/harness/bundles/general/codex/scripts/harness_gate.py +203 -29
  120. package/harness/bundles/general/codex/scripts/harness_integration.py +878 -0
  121. package/harness/bundles/general/codex/scripts/harness_ledger.py +457 -10
  122. package/harness/bundles/general/codex/scripts/harness_paths.py +315 -0
  123. package/harness/bundles/general/codex/scripts/harness_profile.py +45 -0
  124. package/harness/bundles/general/codex/scripts/harness_review.py +326 -0
  125. package/harness/bundles/general/codex/scripts/harness_sync.py +407 -0
  126. package/harness/bundles/general/codex/scripts/harness_test_guard.py +244 -49
  127. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  128. package/harness/bundles/general/cursor/contracts/workflow-policy.json +3 -3
  129. package/harness/bundles/general/cursor/harness-archive/SKILL.md +3 -3
  130. package/harness/bundles/general/cursor/harness-archive/reference.md +30 -12
  131. package/harness/bundles/general/cursor/harness-archive/templates/render-summary.mjs +5 -1
  132. package/harness/bundles/general/cursor/harness-archive/templates/summary-data-template.json +6 -2
  133. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  134. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +3 -1
  135. package/harness/bundles/general/cursor/harness-knowledge-ingest/reference.md +7 -0
  136. package/harness/bundles/general/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
  137. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  138. package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
  139. package/harness/bundles/general/cursor/harness-plan/checklist.md +6 -0
  140. package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
  141. package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
  142. package/harness/bundles/general/cursor/harness-run/checklist.md +5 -0
  143. package/harness/bundles/general/cursor/harness-run/reference.md +33 -1
  144. package/harness/bundles/general/cursor/harness-submit/SKILL.md +15 -10
  145. package/harness/bundles/general/cursor/harness-submit/checklist.md +40 -76
  146. package/harness/bundles/general/cursor/harness-sync/SKILL.md +17 -2
  147. package/harness/bundles/general/cursor/harness-sync/reference.md +2 -2
  148. package/harness/bundles/general/cursor/harness-test/SKILL.md +1 -1
  149. package/harness/bundles/general/cursor/harness-test/checklist.md +9 -0
  150. package/harness/bundles/general/cursor/harness-test/pitfalls-java.md +14 -0
  151. package/harness/bundles/general/cursor/harness-test/reference.md +38 -0
  152. package/harness/bundles/general/cursor/protocols/archive-report-protocol.md +26 -4
  153. package/harness/bundles/general/cursor/protocols/ledger-protocol.md +38 -0
  154. package/harness/bundles/general/cursor/protocols/powershell-protocol.md +16 -0
  155. package/harness/bundles/general/cursor/protocols/report-pipeline-protocol.md +17 -0
  156. package/harness/bundles/general/cursor/protocols/state-layout-protocol.md +15 -0
  157. package/harness/bundles/general/cursor/scripts/harness_archive.py +1209 -170
  158. package/harness/bundles/general/cursor/scripts/harness_change.py +18 -0
  159. package/harness/bundles/general/cursor/scripts/harness_deploy.py +1 -44
  160. package/harness/bundles/general/cursor/scripts/harness_events.py +174 -25
  161. package/harness/bundles/general/cursor/scripts/harness_gate.py +203 -29
  162. package/harness/bundles/general/cursor/scripts/harness_integration.py +878 -0
  163. package/harness/bundles/general/cursor/scripts/harness_ledger.py +457 -10
  164. package/harness/bundles/general/cursor/scripts/harness_paths.py +315 -0
  165. package/harness/bundles/general/cursor/scripts/harness_profile.py +45 -0
  166. package/harness/bundles/general/cursor/scripts/harness_review.py +326 -0
  167. package/harness/bundles/general/cursor/scripts/harness_sync.py +407 -0
  168. package/harness/bundles/general/cursor/scripts/harness_test_guard.py +244 -49
  169. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  170. package/harness/bundles/java/claude-code/contracts/workflow-policy.json +3 -3
  171. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  172. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +3 -3
  173. package/harness/bundles/java/claude-code/harness-archive/reference.md +30 -12
  174. package/harness/bundles/java/claude-code/harness-archive/templates/render-summary.mjs +5 -1
  175. package/harness/bundles/java/claude-code/harness-archive/templates/summary-data-template.json +6 -2
  176. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  177. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +3 -1
  178. package/harness/bundles/java/claude-code/harness-knowledge-ingest/reference.md +7 -0
  179. package/harness/bundles/java/claude-code/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
  180. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  181. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  182. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
  183. package/harness/bundles/java/claude-code/harness-plan/checklist.md +6 -0
  184. package/harness/bundles/java/claude-code/harness-review/SKILL.md +3 -3
  185. package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
  186. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +15 -10
  187. package/harness/bundles/java/claude-code/harness-submit/checklist.md +40 -76
  188. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +17 -2
  189. package/harness/bundles/java/claude-code/harness-sync/reference.md +2 -2
  190. package/harness/bundles/java/claude-code/harness-test/SKILL.md +1 -1
  191. package/harness/bundles/java/claude-code/protocols/archive-report-protocol.md +26 -4
  192. package/harness/bundles/java/claude-code/protocols/ledger-protocol.md +38 -0
  193. package/harness/bundles/java/claude-code/protocols/powershell-protocol.md +16 -0
  194. package/harness/bundles/java/claude-code/protocols/report-pipeline-protocol.md +17 -0
  195. package/harness/bundles/java/claude-code/protocols/state-layout-protocol.md +15 -0
  196. package/harness/bundles/java/claude-code/scripts/harness_archive.py +1209 -170
  197. package/harness/bundles/java/claude-code/scripts/harness_change.py +18 -0
  198. package/harness/bundles/java/claude-code/scripts/harness_deploy.py +1 -44
  199. package/harness/bundles/java/claude-code/scripts/harness_events.py +174 -25
  200. package/harness/bundles/java/claude-code/scripts/harness_gate.py +203 -29
  201. package/harness/bundles/java/claude-code/scripts/harness_integration.py +878 -0
  202. package/harness/bundles/java/claude-code/scripts/harness_ledger.py +457 -10
  203. package/harness/bundles/java/claude-code/scripts/harness_paths.py +315 -0
  204. package/harness/bundles/java/claude-code/scripts/harness_profile.py +45 -0
  205. package/harness/bundles/java/claude-code/scripts/harness_review.py +326 -0
  206. package/harness/bundles/java/claude-code/scripts/harness_sync.py +407 -0
  207. package/harness/bundles/java/claude-code/scripts/harness_test_guard.py +244 -49
  208. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  209. package/harness/bundles/java/codebuddy/contracts/workflow-policy.json +3 -3
  210. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  211. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +3 -3
  212. package/harness/bundles/java/codebuddy/harness-archive/reference.md +30 -12
  213. package/harness/bundles/java/codebuddy/harness-archive/templates/render-summary.mjs +5 -1
  214. package/harness/bundles/java/codebuddy/harness-archive/templates/summary-data-template.json +6 -2
  215. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  216. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +3 -1
  217. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/reference.md +7 -0
  218. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
  219. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  220. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  221. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
  222. package/harness/bundles/java/codebuddy/harness-plan/checklist.md +6 -0
  223. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +3 -3
  224. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
  225. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +15 -10
  226. package/harness/bundles/java/codebuddy/harness-submit/checklist.md +40 -76
  227. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +17 -2
  228. package/harness/bundles/java/codebuddy/harness-sync/reference.md +2 -2
  229. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +1 -1
  230. package/harness/bundles/java/codebuddy/protocols/archive-report-protocol.md +26 -4
  231. package/harness/bundles/java/codebuddy/protocols/ledger-protocol.md +38 -0
  232. package/harness/bundles/java/codebuddy/protocols/powershell-protocol.md +16 -0
  233. package/harness/bundles/java/codebuddy/protocols/report-pipeline-protocol.md +17 -0
  234. package/harness/bundles/java/codebuddy/protocols/state-layout-protocol.md +15 -0
  235. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +1209 -170
  236. package/harness/bundles/java/codebuddy/scripts/harness_change.py +18 -0
  237. package/harness/bundles/java/codebuddy/scripts/harness_deploy.py +1 -44
  238. package/harness/bundles/java/codebuddy/scripts/harness_events.py +174 -25
  239. package/harness/bundles/java/codebuddy/scripts/harness_gate.py +203 -29
  240. package/harness/bundles/java/codebuddy/scripts/harness_integration.py +878 -0
  241. package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +457 -10
  242. package/harness/bundles/java/codebuddy/scripts/harness_paths.py +315 -0
  243. package/harness/bundles/java/codebuddy/scripts/harness_profile.py +45 -0
  244. package/harness/bundles/java/codebuddy/scripts/harness_review.py +326 -0
  245. package/harness/bundles/java/codebuddy/scripts/harness_sync.py +407 -0
  246. package/harness/bundles/java/codebuddy/scripts/harness_test_guard.py +244 -49
  247. package/harness/bundles/java/codex/.harness-build.json +1 -1
  248. package/harness/bundles/java/codex/contracts/workflow-policy.json +3 -3
  249. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  250. package/harness/bundles/java/codex/harness-archive/SKILL.md +3 -3
  251. package/harness/bundles/java/codex/harness-archive/reference.md +30 -12
  252. package/harness/bundles/java/codex/harness-archive/templates/render-summary.mjs +5 -1
  253. package/harness/bundles/java/codex/harness-archive/templates/summary-data-template.json +6 -2
  254. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  255. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +3 -1
  256. package/harness/bundles/java/codex/harness-knowledge-ingest/reference.md +7 -0
  257. package/harness/bundles/java/codex/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
  258. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  259. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  260. package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
  261. package/harness/bundles/java/codex/harness-plan/checklist.md +6 -0
  262. package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
  263. package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
  264. package/harness/bundles/java/codex/harness-submit/SKILL.md +15 -10
  265. package/harness/bundles/java/codex/harness-submit/checklist.md +40 -76
  266. package/harness/bundles/java/codex/harness-sync/SKILL.md +17 -2
  267. package/harness/bundles/java/codex/harness-sync/reference.md +2 -2
  268. package/harness/bundles/java/codex/harness-test/SKILL.md +1 -1
  269. package/harness/bundles/java/codex/protocols/archive-report-protocol.md +26 -4
  270. package/harness/bundles/java/codex/protocols/ledger-protocol.md +38 -0
  271. package/harness/bundles/java/codex/protocols/powershell-protocol.md +16 -0
  272. package/harness/bundles/java/codex/protocols/report-pipeline-protocol.md +17 -0
  273. package/harness/bundles/java/codex/protocols/state-layout-protocol.md +15 -0
  274. package/harness/bundles/java/codex/scripts/harness_archive.py +1209 -170
  275. package/harness/bundles/java/codex/scripts/harness_change.py +18 -0
  276. package/harness/bundles/java/codex/scripts/harness_deploy.py +1 -44
  277. package/harness/bundles/java/codex/scripts/harness_events.py +174 -25
  278. package/harness/bundles/java/codex/scripts/harness_gate.py +203 -29
  279. package/harness/bundles/java/codex/scripts/harness_integration.py +878 -0
  280. package/harness/bundles/java/codex/scripts/harness_ledger.py +457 -10
  281. package/harness/bundles/java/codex/scripts/harness_paths.py +315 -0
  282. package/harness/bundles/java/codex/scripts/harness_profile.py +45 -0
  283. package/harness/bundles/java/codex/scripts/harness_review.py +326 -0
  284. package/harness/bundles/java/codex/scripts/harness_sync.py +407 -0
  285. package/harness/bundles/java/codex/scripts/harness_test_guard.py +244 -49
  286. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  287. package/harness/bundles/java/cursor/contracts/workflow-policy.json +3 -3
  288. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  289. package/harness/bundles/java/cursor/harness-archive/SKILL.md +3 -3
  290. package/harness/bundles/java/cursor/harness-archive/reference.md +30 -12
  291. package/harness/bundles/java/cursor/harness-archive/templates/render-summary.mjs +5 -1
  292. package/harness/bundles/java/cursor/harness-archive/templates/summary-data-template.json +6 -2
  293. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  294. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +3 -1
  295. package/harness/bundles/java/cursor/harness-knowledge-ingest/reference.md +7 -0
  296. package/harness/bundles/java/cursor/harness-knowledge-ingest/scripts/harness_knowledge.py +117 -0
  297. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  298. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  299. package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
  300. package/harness/bundles/java/cursor/harness-plan/checklist.md +6 -0
  301. package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
  302. package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
  303. package/harness/bundles/java/cursor/harness-submit/SKILL.md +15 -10
  304. package/harness/bundles/java/cursor/harness-submit/checklist.md +40 -76
  305. package/harness/bundles/java/cursor/harness-sync/SKILL.md +17 -2
  306. package/harness/bundles/java/cursor/harness-sync/reference.md +2 -2
  307. package/harness/bundles/java/cursor/harness-test/SKILL.md +1 -1
  308. package/harness/bundles/java/cursor/protocols/archive-report-protocol.md +26 -4
  309. package/harness/bundles/java/cursor/protocols/ledger-protocol.md +38 -0
  310. package/harness/bundles/java/cursor/protocols/powershell-protocol.md +16 -0
  311. package/harness/bundles/java/cursor/protocols/report-pipeline-protocol.md +17 -0
  312. package/harness/bundles/java/cursor/protocols/state-layout-protocol.md +15 -0
  313. package/harness/bundles/java/cursor/scripts/harness_archive.py +1209 -170
  314. package/harness/bundles/java/cursor/scripts/harness_change.py +18 -0
  315. package/harness/bundles/java/cursor/scripts/harness_deploy.py +1 -44
  316. package/harness/bundles/java/cursor/scripts/harness_events.py +174 -25
  317. package/harness/bundles/java/cursor/scripts/harness_gate.py +203 -29
  318. package/harness/bundles/java/cursor/scripts/harness_integration.py +878 -0
  319. package/harness/bundles/java/cursor/scripts/harness_ledger.py +457 -10
  320. package/harness/bundles/java/cursor/scripts/harness_paths.py +315 -0
  321. package/harness/bundles/java/cursor/scripts/harness_profile.py +45 -0
  322. package/harness/bundles/java/cursor/scripts/harness_review.py +326 -0
  323. package/harness/bundles/java/cursor/scripts/harness_sync.py +407 -0
  324. package/harness/bundles/java/cursor/scripts/harness_test_guard.py +244 -49
  325. package/harness/manifests/general/claude-code.json +58 -38
  326. package/harness/manifests/general/codebuddy.json +58 -38
  327. package/harness/manifests/general/codex.json +58 -38
  328. package/harness/manifests/general/cursor.json +58 -38
  329. package/harness/manifests/java/claude-code.json +52 -36
  330. package/harness/manifests/java/codebuddy.json +52 -36
  331. package/harness/manifests/java/codex.json +52 -36
  332. package/harness/manifests/java/cursor.json +52 -36
  333. package/hunter-workflow-family.json +2 -2
  334. package/package.json +1 -1
@@ -31,6 +31,8 @@ SCRIPTS_DIR = Path(__file__).resolve().parent
31
31
  if str(SCRIPTS_DIR) not in sys.path:
32
32
  sys.path.insert(0, str(SCRIPTS_DIR))
33
33
 
34
+ import harness_paths # noqa: E402
35
+
34
36
  if hasattr(sys.stdout, "reconfigure"):
35
37
  sys.stdout.reconfigure(encoding="utf-8")
36
38
  if hasattr(sys.stderr, "reconfigure"):
@@ -208,6 +210,20 @@ def change_dir_for_id(project_root: Path, change_id: str) -> Path | None:
208
210
  return None
209
211
 
210
212
 
213
+ def _layout_fields(project_root: Path, change_id: str) -> dict[str, Any]:
214
+ """Layout enrichment for resolve payloads; empty on any resolution issue."""
215
+ try:
216
+ layout = harness_paths.resolve_change_layout(project_root, change_id)
217
+ except (FileNotFoundError, ValueError, OSError):
218
+ return {}
219
+ return {
220
+ "contractRoot": layout["contractRoot"],
221
+ "stateRoot": layout["stateRoot"],
222
+ "layout": layout["layout"],
223
+ "repositoryId": layout["repositoryId"],
224
+ }
225
+
226
+
211
227
  def resolve_change(
212
228
  project_root: Path,
213
229
  change_id: str | None,
@@ -229,6 +245,7 @@ def resolve_change(
229
245
  "changeDir": str(resolved),
230
246
  "projectRoot": str(project_root.resolve()),
231
247
  "activeCount": len(active),
248
+ **_layout_fields(project_root, change_id),
232
249
  }
233
250
  if not active:
234
251
  return {
@@ -247,6 +264,7 @@ def resolve_change(
247
264
  "projectRoot": str(project_root.resolve()),
248
265
  "activeCount": 1,
249
266
  "autoSelected": True,
267
+ **_layout_fields(project_root, only["changeId"]),
250
268
  }
251
269
  return {
252
270
  "ok": False,
@@ -719,40 +719,6 @@ def cmd_install(build_out: Path, project: Path, target: Path | None) -> dict[str
719
719
  }
720
720
 
721
721
 
722
- def cmd_diff(build_out: Path, project: Path, target: Path | None) -> dict[str, Any]:
723
- build_out = build_out.resolve()
724
- project = project.resolve()
725
- installed = (target or project / ".claude" / "skills").resolve()
726
- if not installed.is_dir():
727
- return {
728
- "ok": True,
729
- "action": "diff",
730
- "stale": True,
731
- "missingInstall": True,
732
- "outdated": [],
733
- "missing": [],
734
- "extra": [],
735
- }
736
-
737
- built = collect_files(build_out)
738
- current = collect_files(installed)
739
- outdated = [p for p, h in built.items() if p in current and current[p] != h]
740
- missing = [p for p in built if p not in current]
741
- # extra includes install-side managed manifests only as metadata, so they
742
- # are excluded from the extra set; every other untracked file is a real
743
- # extra and must mark the install stale (design §3.8 要点3).
744
- extra = [p for p in current if p not in built and p not in INSTALL_METADATA]
745
- return {
746
- "ok": True,
747
- "action": "diff",
748
- "stale": bool(outdated or missing or extra),
749
- "outdated": sorted(outdated),
750
- "missing": sorted(missing),
751
- "extra": sorted(extra),
752
- "comparedAt": now_iso(),
753
- }
754
-
755
-
756
722
  def cmd_validate_manifest(
757
723
  bundle_dir: Path, manifest_entries: list[dict[str, Any]]
758
724
  ) -> dict[str, Any]:
@@ -783,7 +749,7 @@ def cmd_validate_manifest(
783
749
 
784
750
 
785
751
  def build_parser() -> argparse.ArgumentParser:
786
- p = argparse.ArgumentParser(description="Harness skills deploy (build/install/diff)")
752
+ p = argparse.ArgumentParser(description="Harness skills deploy (build/install)")
787
753
  sub = p.add_subparsers(dest="command", required=True)
788
754
 
789
755
  b = sub.add_parser("build", help="Synthesize core + overlay into output dir")
@@ -799,12 +765,6 @@ def build_parser() -> argparse.ArgumentParser:
799
765
  i.add_argument("--target", type=Path)
800
766
  i.add_argument("--json", action="store_true")
801
767
 
802
- d = sub.add_parser("diff", help="Compare installed skills vs build output")
803
- d.add_argument("--from", dest="from_dir", type=Path, required=True)
804
- d.add_argument("--project", type=Path, required=True)
805
- d.add_argument("--target", type=Path)
806
- d.add_argument("--json", action="store_true")
807
-
808
768
  v = sub.add_parser(
809
769
  "validate-manifest", help="Validate bundle dir vs manifest (missing/extra/hash)"
810
770
  )
@@ -823,9 +783,6 @@ def main(argv: list[str] | None = None) -> int:
823
783
  if args.command == "install":
824
784
  result = cmd_install(args.from_dir, args.project, args.target)
825
785
  return emit_json(result) if args.json else 0
826
- if args.command == "diff":
827
- result = cmd_diff(args.from_dir, args.project, args.target)
828
- return emit_json(result) if args.json else 0
829
786
  if args.command == "validate-manifest":
830
787
  manifest_data = json.loads(args.manifest.read_text(encoding="utf-8"))
831
788
  entries = (
@@ -23,6 +23,12 @@ import uuid
23
23
  from pathlib import Path
24
24
  from typing import Any
25
25
 
26
+ SCRIPTS_DIR = Path(__file__).resolve().parent
27
+ if str(SCRIPTS_DIR) not in sys.path:
28
+ sys.path.insert(0, str(SCRIPTS_DIR))
29
+
30
+ import harness_paths # noqa: E402
31
+
26
32
 
27
33
  if hasattr(sys.stdout, "reconfigure"):
28
34
  sys.stdout.reconfigure(encoding="utf-8")
@@ -43,6 +49,7 @@ EVENT_TYPES = frozenset(
43
49
  )
44
50
 
45
51
  SCHEMA_VERSION = 3
52
+ _NOTE_FALLBACK_MAXLEN = 60
46
53
  HEADER_LINE = (
47
54
  "本文件由 harness_events.py 自动渲染,请勿手工编辑;事实源为 events.ndjson"
48
55
  )
@@ -98,12 +105,16 @@ def resolve_change_dir(raw: str) -> Path:
98
105
  return Path(raw).expanduser().resolve()
99
106
 
100
107
 
108
+ def _state_dir(change_dir: Path) -> Path:
109
+ return Path(harness_paths.resolve_state_dir_for_contract(change_dir))
110
+
111
+
101
112
  def events_path(change_dir: Path) -> Path:
102
- return change_dir / "events.ndjson"
113
+ return _state_dir(change_dir) / "events.ndjson"
103
114
 
104
115
 
105
116
  def execution_log_path(change_dir: Path) -> Path:
106
- return change_dir / "logs" / "execution-log.md"
117
+ return _state_dir(change_dir) / "logs" / "execution-log.md"
107
118
 
108
119
 
109
120
  def archived_change_dir(change_dir: Path) -> Path | None:
@@ -178,6 +189,26 @@ def load_events(path: Path) -> list[dict[str, Any]]:
178
189
  return events
179
190
 
180
191
 
192
+ def merge_event_files(paths: list[Path]) -> list[dict[str, Any]]:
193
+ """Union events from multiple NDJSON files by event ID (UT-001/RET-05).
194
+
195
+ Each event ID appears exactly once; first-seen copy wins. Missing IDs are
196
+ kept keyed by (file index, line number) so unidentified events are never
197
+ silently dropped.
198
+ """
199
+ merged: list[dict[str, Any]] = []
200
+ seen: set[str] = set()
201
+ for path in paths:
202
+ for event in load_events(Path(path)):
203
+ event_id = str(event.get("id") or "").strip()
204
+ if event_id:
205
+ if event_id in seen:
206
+ continue
207
+ seen.add(event_id)
208
+ merged.append(event)
209
+ return merged
210
+
211
+
181
212
  def atomic_append_line(path: Path, line: str) -> None:
182
213
  """Write line to a temp file first, then append to the target (append-only)."""
183
214
  path.parent.mkdir(parents=True, exist_ok=True)
@@ -316,6 +347,8 @@ def build_event(args: argparse.Namespace, existing: list[dict[str, Any]]) -> dic
316
347
  def status_symbol(status: Any, reason: Any = None) -> str:
317
348
  text = str(status or "").strip().lower()
318
349
  reason_text = str(reason or "").strip()
350
+ if not text:
351
+ return "—"
319
352
  ok_set = {"ok", "passed", "pass", "success", "green", "✅", "✅ok"}
320
353
  warn_set = {"warn", "warning", "yellow", "skipped", "skip", "🟡", "🟡warn"}
321
354
  fail_set = {"fail", "failed", "error", "red", "blocked", "❌", "❌fail"}
@@ -327,7 +360,7 @@ def status_symbol(status: Any, reason: Any = None) -> str:
327
360
  return f"❌FAIL({reason_text})" if reason_text else "❌FAIL"
328
361
  if reason_text:
329
362
  return f"{status}({reason_text})"
330
- return str(status or "unknown")
363
+ return str(status)
331
364
 
332
365
 
333
366
  def severity_symbol(severity: Any, message: Any = None) -> str:
@@ -339,7 +372,10 @@ def severity_symbol(severity: Any, message: Any = None) -> str:
339
372
  return f"🟡WARN({msg})" if msg else "🟡WARN"
340
373
  if text in {"info", "ok", "note"}:
341
374
  return f"✅OK({msg})" if msg else "✅OK"
342
- return f"{severity}: {msg}" if msg else str(severity or "issue")
375
+ # Empty/unknown severity: never emit literal "issue"/"None".
376
+ if not text:
377
+ return ""
378
+ return f"{severity}: {msg}" if msg else str(severity)
343
379
 
344
380
 
345
381
  def format_duration(ms: int | None) -> str:
@@ -427,9 +463,10 @@ def phase_duration_ms(phase_events: list[dict[str, Any]]) -> int | None:
427
463
  elif etype == "phase.end":
428
464
  end_ts = event.get("timestamp")
429
465
  if start_ts and end_ts:
430
- stamps = [e.get("timestamp") for e in phase_events if e.get("timestamp")]
431
- effective_end = stamps[-1] if stamps else end_ts
432
- return duration_ms_between(start_ts, effective_end)
466
+ # Closed phases end at the matching phase.end. Late events appended
467
+ # after closure are reported separately (late_event_stats) and never
468
+ # extend the closed duration (RET-21).
469
+ return duration_ms_between(start_ts, end_ts)
433
470
  # Fallback: first to last timestamp in the phase bucket.
434
471
  stamps = [e.get("timestamp") for e in phase_events if e.get("timestamp")]
435
472
  if len(stamps) >= 2:
@@ -437,38 +474,124 @@ def phase_duration_ms(phase_events: list[dict[str, Any]]) -> int | None:
437
474
  return None
438
475
 
439
476
 
477
+ def late_event_stats(phase_events: list[dict[str, Any]]) -> dict[str, int]:
478
+ """Count events recorded after the closing phase.end (RET-21)."""
479
+ end_ts = None
480
+ for event in phase_events:
481
+ if event.get("type") == "phase.end":
482
+ end_ts = event.get("timestamp")
483
+ if not end_ts:
484
+ return {"lateEventCount": 0, "lateEventSpanMs": 0}
485
+ late_stamps = []
486
+ seen_end = False
487
+ for event in phase_events:
488
+ if event.get("type") == "phase.end" and not seen_end:
489
+ seen_end = True
490
+ continue
491
+ if seen_end and event.get("timestamp"):
492
+ late_stamps.append(event["timestamp"])
493
+ if not late_stamps:
494
+ return {"lateEventCount": 0, "lateEventSpanMs": 0}
495
+ span = duration_ms_between(end_ts, late_stamps[-1]) or 0
496
+ return {"lateEventCount": len(late_stamps), "lateEventSpanMs": span}
497
+
498
+
499
+ def attempt_invocations(phase_events: list[dict[str, Any]]) -> list[dict[str, Any]]:
500
+ """Per-attempt invocation view: attempt, status, durationMs (RET-22)."""
501
+ invocations: list[dict[str, Any]] = []
502
+ for attempt in split_phase_attempts(phase_events):
503
+ events_in = attempt.get("events") or []
504
+ start_ts = None
505
+ end_ts = None
506
+ status = None
507
+ for event in events_in:
508
+ if event.get("type") == "phase.start" and start_ts is None:
509
+ start_ts = event.get("timestamp")
510
+ elif event.get("type") == "phase.end":
511
+ end_ts = event.get("timestamp")
512
+ status = event.get("status", status)
513
+ duration = None
514
+ if start_ts and end_ts:
515
+ duration = duration_ms_between(start_ts, end_ts)
516
+ invocations.append(
517
+ {
518
+ "attempt": attempt.get("attempt"),
519
+ "status": status,
520
+ "durationMs": duration,
521
+ }
522
+ )
523
+ return invocations
524
+
525
+
526
+ def canonical_phase_timing(phase_events: list[dict[str, Any]]) -> dict[str, Any]:
527
+ """Single reducer for every duration view (RET-20).
528
+
529
+ activeExecutionMs: phase.start → matching phase.end (closed contract).
530
+ wallClockSpanMs: first → last timestamp in the bucket, late events included.
531
+ """
532
+ stamps = [e.get("timestamp") for e in phase_events if e.get("timestamp")]
533
+ active = phase_duration_ms(phase_events)
534
+ late = late_event_stats(phase_events)
535
+ wall = duration_ms_between(stamps[0], stamps[-1]) if len(stamps) >= 2 else active
536
+ return {
537
+ "activeExecutionMs": active,
538
+ "wallClockSpanMs": wall,
539
+ "lateEventCount": late["lateEventCount"],
540
+ "lateEventSpanMs": late["lateEventSpanMs"],
541
+ }
542
+
543
+
440
544
  def render_command_block(commands: list[dict[str, Any]]) -> list[str]:
441
545
  if not commands:
442
546
  return []
547
+
548
+ def command_display(event: dict[str, Any]) -> str:
549
+ cmd = str(event.get("command") or "").strip()
550
+ if cmd:
551
+ return cmd
552
+ return str(event.get("note") or "").strip()
553
+
443
554
  if len(commands) == 1:
444
555
  event = commands[0]
445
- cmd = event.get("command") or ""
556
+ display = command_display(event)
557
+ if not display:
558
+ return []
446
559
  exit_code = event.get("exit_code")
447
560
  exit_text = "?" if exit_code is None else str(exit_code)
448
561
  duration = format_duration(
449
562
  int(event["duration_ms"]) if isinstance(event.get("duration_ms"), int) else None
450
563
  )
451
564
  note = str(event.get("note") or "").strip()
452
- parts = [f"- command: `{cmd}`", f"exit={exit_text}", f"duration={duration}"]
453
- if note:
565
+ parts = [f"- command: `{display}`", f"exit={exit_text}", f"duration={duration}"]
566
+ # Avoid duplicating note when it was already used as the display text.
567
+ if note and note != display:
454
568
  parts.append(f"note={note}")
455
569
  return [" · ".join(parts)]
456
570
 
457
- lines = [
458
- "",
459
- "| 命令 | exit | duration | note |",
460
- "| --- | ---: | ---: | --- |",
461
- ]
571
+ rows: list[str] = []
462
572
  for event in commands:
463
- cmd = str(event.get("command") or "").replace("|", "\\|")
573
+ display = command_display(event)
574
+ if not display:
575
+ continue
576
+ cmd = display.replace("|", "\\|")
464
577
  exit_code = event.get("exit_code")
465
578
  exit_text = "?" if exit_code is None else str(exit_code)
466
579
  duration = format_duration(
467
580
  int(event["duration_ms"]) if isinstance(event.get("duration_ms"), int) else None
468
581
  )
469
582
  note = str(event.get("note") or "").replace("|", "\\|")
470
- lines.append(f"| `{cmd}` | {exit_text} | {duration} | {note} |")
471
- lines.append("")
583
+ # If note was promoted to the command cell, leave the note column empty.
584
+ note_cell = "" if note == display else note
585
+ rows.append(f"| `{cmd}` | {exit_text} | {duration} | {note_cell} |")
586
+ if not rows:
587
+ return []
588
+ lines = [
589
+ "",
590
+ "| 命令 | exit | duration | note |",
591
+ "| --- | ---: | ---: | --- |",
592
+ *rows,
593
+ "",
594
+ ]
472
595
  return lines
473
596
 
474
597
 
@@ -491,23 +614,37 @@ def render_event_line(event: dict[str, Any]) -> list[str]:
491
614
  suffix = f" — {note}" if note else ""
492
615
  return [f"- phase.end @ {event.get('timestamp', '')}{suffix}"]
493
616
  if etype == "verification":
494
- name = event.get("name") or "(unnamed)"
495
- symbol = status_symbol(event.get("status"), event.get("reason") or event.get("note"))
617
+ note = str(event.get("note") or "").strip()
618
+ name = str(event.get("name") or "").strip() or (
619
+ note[:_NOTE_FALLBACK_MAXLEN] if note else ""
620
+ )
621
+ if not name:
622
+ return []
623
+ symbol = status_symbol(event.get("status"), event.get("reason"))
496
624
  return [f"- verification: {name} → {symbol}"]
497
625
  if etype == "decision":
498
- decision = event.get("decision") or ""
499
- reason = event.get("reason") or event.get("note") or ""
626
+ decision = str(event.get("decision") or "").strip()
627
+ reason = str(event.get("reason") or event.get("note") or "").strip()
628
+ if not decision:
629
+ return [f"- decision: {reason}"] if reason else []
500
630
  if reason:
501
631
  return [f"- decision: {decision} — {reason}"]
502
632
  return [f"- decision: {decision}"]
503
633
  if etype == "issue":
504
- symbol = severity_symbol(event.get("severity"), event.get("message"))
634
+ note = str(event.get("note") or "").strip()
635
+ message = str(event.get("message") or "").strip() or note
636
+ symbol = severity_symbol(event.get("severity"), message)
637
+ if not symbol:
638
+ return [f"- issue: {note}"] if note else []
505
639
  code = event.get("code")
506
640
  prefix = f"[{code}] " if code else ""
507
641
  return [f"- issue: {prefix}{symbol}"]
508
642
  if etype == "artifact":
509
- path = event.get("path") or ""
643
+ path = str(event.get("path") or "").strip()
644
+ note = str(event.get("note") or "").strip()
510
645
  kind = event.get("kind")
646
+ if not path:
647
+ return [f"- artifact: {note}"] if note else []
511
648
  if kind:
512
649
  return [f"- artifact: `{path}` ({kind})"]
513
650
  return [f"- artifact: `{path}`"]
@@ -647,12 +784,24 @@ def cmd_append(args: argparse.Namespace) -> int:
647
784
  as_json=as_json,
648
785
  )
649
786
  path = events_path(change_dir)
650
- lock_path = change_dir / "events.ndjson.lock"
787
+ lock_path = path.with_name(path.name + ".lock")
651
788
 
652
789
  # §6.1/§6.2: 普通 append = 加锁 -> 追加一行 -> fsync -> 解锁,不 load 历史、不渲染。
653
790
  # new_event_id 用完整 uuid,无需扫描去重。锁覆盖 atomic_append_line 的
654
791
  # open/write/flush/fsync 全过程。
655
792
  event = build_event(args, [])
793
+ # Semantic hints (non-fatal): guide agents toward required fields.
794
+ if args.type == "issue" and not args.severity:
795
+ event["severity"] = "info"
796
+ print(
797
+ "warning: issue without --severity, defaulted to info",
798
+ file=sys.stderr,
799
+ )
800
+ if args.type == "verification" and (not args.name or not args.status):
801
+ print(
802
+ "warning: verification missing --name or --status",
803
+ file=sys.stderr,
804
+ )
656
805
  line = json.dumps(event, ensure_ascii=False, separators=(",", ":"))
657
806
  try:
658
807
  with event_file_lock(lock_path):