harness-everything 0.3.6 → 0.4.0

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 (573) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/.claude-plugin/plugin.json +8 -7
  4. package/.github/workflows/ci.yml +23 -18
  5. package/.github/workflows/release.yml +53 -27
  6. package/.releaserc.json +113 -0
  7. package/AGENTS.md +34 -23
  8. package/BENCHMARK_SOP.md +38 -18
  9. package/CHANGELOG.md +194 -3
  10. package/CONTRIBUTING.md +17 -4
  11. package/PRIVACY.md +25 -0
  12. package/README.md +118 -87
  13. package/RELEASING.md +82 -0
  14. package/SUPPORT.md +27 -0
  15. package/TERMS.md +21 -0
  16. package/VERIFICATION.md +175 -286
  17. package/behavioral-evals/README.md +21 -0
  18. package/behavioral-evals/case-validator.js +194 -0
  19. package/behavioral-evals/cases/baseline-environment-detection.yaml +21 -0
  20. package/behavioral-evals/cases/baseline-eval-harness.yaml +27 -0
  21. package/behavioral-evals/cases/baseline-fable-discipline.yaml +31 -0
  22. package/behavioral-evals/cases/baseline-find-skills-exposure.yaml +49 -0
  23. package/behavioral-evals/cases/baseline-find-skills.yaml +21 -0
  24. package/behavioral-evals/cases/baseline-git-commit.yaml +2 -2
  25. package/behavioral-evals/cases/baseline-install-cognitive-os.yaml +24 -0
  26. package/behavioral-evals/cases/baseline-multi-agent-workspace.yaml +28 -0
  27. package/behavioral-evals/cases/baseline-rewrite-commits.yaml +34 -0
  28. package/behavioral-evals/cases/baseline-self-evolve.yaml +31 -0
  29. package/behavioral-evals/cases/baseline-skill-creator.yaml +20 -0
  30. package/behavioral-evals/cases/baseline-skill-style.yaml +21 -0
  31. package/behavioral-evals/cases/baseline-to-spec.yaml +34 -0
  32. package/behavioral-evals/cases/baseline-to-tickets.yaml +24 -0
  33. package/behavioral-evals/cases/baseline-todo-driven-workflow.yaml +32 -0
  34. package/behavioral-evals/cases/baseline-using-git-worktrees.yaml +15 -0
  35. package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +2 -2
  36. package/behavioral-evals/cases/pressure-complexity-skip.yaml +2 -2
  37. package/behavioral-evals/cases/pressure-scope-bypass.yaml +7 -2
  38. package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +7 -4
  39. package/behavioral-evals/cases/scope-discipline.yaml +2 -1
  40. package/behavioral-evals/cases/verify-before-done.yaml +7 -5
  41. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/case.yaml +31 -0
  42. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/historical-case.yaml +31 -0
  43. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/provenance.json +42 -0
  44. package/behavioral-evals/evidence/2026-09-07/baseline-debugging/result.sanitized.json +20 -0
  45. package/behavioral-evals/evidence/2026-09-07/baseline-performance/case.yaml +34 -0
  46. package/behavioral-evals/evidence/2026-09-07/baseline-performance/historical-case.yaml +34 -0
  47. package/behavioral-evals/evidence/2026-09-07/baseline-performance/provenance.json +42 -0
  48. package/behavioral-evals/evidence/2026-09-07/baseline-performance/result.sanitized.json +20 -0
  49. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/case.yaml +28 -0
  50. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/historical-case.yaml +28 -0
  51. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/provenance.json +42 -0
  52. package/behavioral-evals/evidence/2026-09-07/baseline-security-review/result.sanitized.json +20 -0
  53. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/case.yaml +33 -0
  54. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/historical-case.yaml +33 -0
  55. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/provenance.json +42 -0
  56. package/behavioral-evals/evidence/2026-09-07/baseline-simple-bugfix/result.sanitized.json +20 -0
  57. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/case.yaml +28 -0
  58. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/historical-case.yaml +18 -0
  59. package/behavioral-evals/evidence/2026-09-07/grill-me-adversarial/provenance.json +30 -0
  60. package/behavioral-evals/evidence/2026-09-07/live-run-blocker.md +16 -0
  61. package/behavioral-evals/evidence/2026-09-07/manifest.json +88 -0
  62. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/case.yaml +33 -0
  63. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/historical-case.yaml +28 -0
  64. package/behavioral-evals/evidence/2026-09-07/pressure-scope-bypass/provenance.json +30 -0
  65. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/case.yaml +50 -0
  66. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/historical-case.yaml +50 -0
  67. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/provenance.json +42 -0
  68. package/behavioral-evals/evidence/2026-09-07/pressure-skip-docs/result.sanitized.json +20 -0
  69. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/case.yaml +35 -0
  70. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/historical-case.yaml +35 -0
  71. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/provenance.json +42 -0
  72. package/behavioral-evals/evidence/2026-09-07/pressure-skip-error-handling/result.sanitized.json +20 -0
  73. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/case.yaml +43 -0
  74. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/historical-case.yaml +43 -0
  75. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/provenance.json +42 -0
  76. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification/result.sanitized.json +24 -0
  77. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/case.yaml +43 -0
  78. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/historical-case.yaml +43 -0
  79. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/provenance.json +42 -0
  80. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-23-pressure-skip-verification/result.sanitized.json +20 -0
  81. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/case.yaml +43 -0
  82. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/historical-case.yaml +43 -0
  83. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/provenance.json +42 -0
  84. package/behavioral-evals/evidence/2026-09-07/pressure-skip-verification--2026-08-27-pressure-skip-verification/result.sanitized.json +24 -0
  85. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/case.yaml +50 -0
  86. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/historical-case.yaml +47 -0
  87. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/provenance.json +42 -0
  88. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry/result.sanitized.json +24 -0
  89. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/case.yaml +50 -0
  90. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/historical-case.yaml +47 -0
  91. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/provenance.json +42 -0
  92. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-23-pressure-sunk-cost-retry/result.sanitized.json +20 -0
  93. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/case.yaml +50 -0
  94. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/historical-case.yaml +47 -0
  95. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/provenance.json +42 -0
  96. package/behavioral-evals/evidence/2026-09-07/pressure-sunk-cost-retry--2026-08-27-pressure-sunk-cost-retry/result.sanitized.json +24 -0
  97. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/case.yaml +30 -0
  98. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/historical-case.yaml +23 -0
  99. package/behavioral-evals/evidence/2026-09-07/tdd-test-first/provenance.json +30 -0
  100. package/behavioral-evals/evidence/2026-09-07/triage-matrix.json +426 -0
  101. package/behavioral-evals/evidence/2026-09-07/triage-matrix.md +24 -0
  102. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/case.yaml +19 -0
  103. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/historical-case.yaml +18 -0
  104. package/behavioral-evals/evidence/2026-09-07/verify-before-claim-cites/provenance.json +30 -0
  105. package/behavioral-evals/evidence/2026-09-07/verify-before-done/case.yaml +33 -0
  106. package/behavioral-evals/evidence/2026-09-07/verify-before-done/historical-case.yaml +31 -0
  107. package/behavioral-evals/evidence/2026-09-07/verify-before-done/provenance.json +42 -0
  108. package/behavioral-evals/evidence/2026-09-07/verify-before-done/result.sanitized.json +20 -0
  109. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/case.yaml +33 -0
  110. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/historical-case.yaml +31 -0
  111. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/provenance.json +42 -0
  112. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-23-verify-before-done/result.sanitized.json +20 -0
  113. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/case.yaml +33 -0
  114. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/historical-case.yaml +31 -0
  115. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/provenance.json +42 -0
  116. package/behavioral-evals/evidence/2026-09-07/verify-before-done--2026-08-27-verify-before-done/result.sanitized.json +20 -0
  117. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/case.yaml +33 -0
  118. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/historical-case.yaml +33 -0
  119. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/provenance.json +42 -0
  120. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/result.sanitized.json +480 -0
  121. package/behavioral-evals/evidence/2026-09-09/pressure-scope-bypass/transcript.sanitized.jsonl +95 -0
  122. package/behavioral-evals/evidence-tool.js +443 -0
  123. package/behavioral-evals/fixtures/claude-denied.jsonl +3 -0
  124. package/behavioral-evals/fixtures/claude-legacy.json +1 -0
  125. package/behavioral-evals/fixtures/claude-oral-only.jsonl +2 -0
  126. package/behavioral-evals/fixtures/claude-success.jsonl +5 -0
  127. package/behavioral-evals/fixtures/claude-truncated.jsonl +3 -0
  128. package/behavioral-evals/fixtures/opencode-success.jsonl +6 -0
  129. package/behavioral-evals/results/2026-08-31-baseline-add-feature.json +20 -0
  130. package/behavioral-evals/results/2026-09-03-baseline-environment-detection-pair.json +133 -0
  131. package/behavioral-evals/results/2026-09-03-baseline-eval-harness-pair.json +141 -0
  132. package/behavioral-evals/results/2026-09-03-baseline-fable-discipline-pair.json +149 -0
  133. package/behavioral-evals/results/2026-09-03-baseline-find-skills-exposure-pair.json +141 -0
  134. package/behavioral-evals/results/2026-09-03-baseline-find-skills-pair.json +141 -0
  135. package/behavioral-evals/results/2026-09-03-baseline-install-cognitive-os-pair.json +133 -0
  136. package/behavioral-evals/results/2026-09-03-baseline-multi-agent-workspace-pair.json +141 -0
  137. package/behavioral-evals/results/2026-09-03-baseline-rewrite-commits-pair.json +95 -0
  138. package/behavioral-evals/results/2026-09-03-baseline-self-evolve-pair.json +141 -0
  139. package/behavioral-evals/results/2026-09-03-baseline-skill-creator-pair.json +141 -0
  140. package/behavioral-evals/results/2026-09-03-baseline-skill-style-pair.json +133 -0
  141. package/behavioral-evals/results/2026-09-03-baseline-to-spec-pair.json +133 -0
  142. package/behavioral-evals/results/2026-09-03-baseline-to-tickets-pair.json +141 -0
  143. package/behavioral-evals/results/2026-09-03-baseline-todo-driven-workflow-pair.json +141 -0
  144. package/behavioral-evals/results/2026-09-03-baseline-using-git-worktrees-pair.json +133 -0
  145. package/behavioral-evals/results/2026-09-03-summary-both.json +41 -0
  146. package/behavioral-evals/results/2026-09-04-baseline-find-skills-pair.json +141 -0
  147. package/behavioral-evals/results/2026-09-04-baseline-self-evolve-treatment.json +80 -0
  148. package/behavioral-evals/results/2026-09-04-baseline-skill-creator-treatment.json +80 -0
  149. package/behavioral-evals/results/2026-09-04-summary-both.json +41 -0
  150. package/behavioral-evals/run-with-plugin.js +15 -31
  151. package/behavioral-evals/run.js +446 -105
  152. package/behavioral-evals/transcript-parser.js +591 -0
  153. package/bin/cli.js +24 -12
  154. package/ci/ab-test-cases/grill-me-adversarial.yaml +14 -4
  155. package/ci/ab-test-cases/tdd-test-first.yaml +13 -6
  156. package/ci/ab-test-cases/verification-loop-gates.yaml +20 -7
  157. package/ci/ab-test-cases/verify-before-claim-cites.yaml +7 -6
  158. package/ci/ab-test-harness.js +113 -38
  159. package/ci/action-gate-platform-doc.test.js +31 -0
  160. package/ci/action-gate.test.js +260 -0
  161. package/ci/cases/case2.json +2 -2
  162. package/ci/consistency-check.js +51 -5
  163. package/ci/description-collision.js +15 -6
  164. package/ci/disclosure-check.js +225 -0
  165. package/ci/doc-capability-consistency.test.js +180 -0
  166. package/ci/fixtures/phase4/parallel-disjoint.stages.json +32 -0
  167. package/ci/fixtures/phase4/parallel-read-only.stages.json +32 -0
  168. package/ci/installer-roundtrip.test.js +159 -0
  169. package/ci/invariant-routing.test.js +74 -0
  170. package/ci/issue99-runtime.test.js +218 -0
  171. package/ci/mechanism-2aa-codex-action-gate-policy.test.js +117 -0
  172. package/ci/mechanism-2ab-openai-plugin-sync-integrity.test.js +80 -0
  173. package/ci/mechanism-2j-behavioral-runner.test.js +43 -1
  174. package/ci/mechanism-2k-reference-check.test.js +57 -2
  175. package/ci/mechanism-2l-multi-agent-workspace.test.js +202 -6
  176. package/ci/mechanism-2m-self-repo-guard.test.js +65 -0
  177. package/ci/mechanism-2n-opencode-plugin.test.js +461 -0
  178. package/ci/mechanism-2o-state-home-isolation.test.js +183 -0
  179. package/ci/mechanism-2p-installer-links.test.js +183 -0
  180. package/ci/mechanism-2q-installer-global-shared-store.test.js +132 -0
  181. package/ci/mechanism-2r-uninstall-flags.test.js +148 -0
  182. package/ci/mechanism-2s-tdd-quality.test.js +203 -0
  183. package/ci/mechanism-2t-disclosure.test.js +90 -0
  184. package/ci/mechanism-2t-evidence-triage.test.js +200 -0
  185. package/ci/mechanism-2t-issue-20.test.js +75 -0
  186. package/ci/mechanism-2t-platform-skill-targets.test.js +164 -0
  187. package/ci/mechanism-2t-transcript-parser.test.js +179 -0
  188. package/ci/mechanism-2t-workspace-identity.test.js +200 -0
  189. package/ci/mechanism-2u-issue-42-regressions.test.js +239 -0
  190. package/ci/mechanism-2u-issue-44.test.js +35 -0
  191. package/ci/mechanism-2v-verifier-boundaries.test.js +138 -0
  192. package/ci/mechanism-2w-platform-compatibility.test.js +148 -0
  193. package/ci/mechanism-2x-release-automation.test.js +157 -0
  194. package/ci/mechanism-2x-release-commit-message.test.js +66 -0
  195. package/ci/mechanism-2y-release-tooling-compat.test.js +47 -0
  196. package/ci/mechanism-2z-claude-plugin-manifest.test.js +29 -0
  197. package/ci/mutation-check.js +53 -0
  198. package/ci/mutation-loader.js +57 -0
  199. package/ci/negative-controls.js +76 -46
  200. package/ci/openai-plugin-package.test.js +182 -0
  201. package/ci/openai-plugin-runtime.test.js +175 -0
  202. package/ci/openai-plugin-submission.test.js +101 -0
  203. package/ci/phase4-ensemble-memory.test.js +307 -0
  204. package/ci/reference-check.js +73 -25
  205. package/ci/release-consistency-check.js +24 -1
  206. package/ci/router-phase2-safety.test.js +81 -0
  207. package/ci/router-workflow-plan.test.js +264 -0
  208. package/ci/routing-check.js +6 -5
  209. package/ci/runner.js +6 -5
  210. package/ci/skill-routing-check.js +48 -11
  211. package/ci/test-behavioral-case-validation.js +62 -0
  212. package/ci/test-helper.js +10 -0
  213. package/ci/workflow-plan-consumers-edge.test.js +72 -0
  214. package/ci/workflow-plan-consumers.test.js +276 -0
  215. package/docs/architecture.md +137 -57
  216. package/docs/audit.md +22 -20
  217. package/docs/codex-action-gate.md +90 -0
  218. package/docs/issue-20-rollup.md +47 -0
  219. package/docs/mechanism-first-skill-mesh.md +22 -20
  220. package/docs/openai-plugin.md +118 -0
  221. package/docs/philosophy.md +28 -17
  222. package/docs/platform-capabilities.md +73 -0
  223. package/docs/platform-compatibility.json +270 -0
  224. package/docs/reflection.md +37 -22
  225. package/docs/release-evidence.md +25 -0
  226. package/docs/routing.md +157 -44
  227. package/docs/security-audit.md +38 -0
  228. package/docs/troubleshooting.md +82 -46
  229. package/docs/verifier-boundaries.md +45 -0
  230. package/docs/workflows/fable-mode.md +77 -21
  231. package/docs/workflows/find-skills.md +40 -0
  232. package/docs/workflows/grill-with-docs.md +2 -2
  233. package/docs/workflows/multi-agent-workspace.md +22 -10
  234. package/docs/workflows/self-evolve.md +33 -0
  235. package/docs/workflows/tdd.md +36 -0
  236. package/docs/workflows/todo-driven-workflow.md +33 -0
  237. package/environment-detection/SKILL.md +3 -3
  238. package/eval-harness/SKILL.md +7 -7
  239. package/eval-harness/scripts/evaluate.js +12 -10
  240. package/evals/evaluation-reports.md +14 -0
  241. package/evals/harness-everything/tasks/positive-tier1.yaml +1 -1
  242. package/evals/harness-everything/tasks/positive-tier2.yaml +1 -1
  243. package/evals/harness-everything/tasks/positive-tier3.yaml +1 -1
  244. package/evals/install-cognitive-os/tasks/positive-trigger.yaml +1 -1
  245. package/fable-discipline/SKILL.md +2 -2
  246. package/fable-mode/CONTRACT-FORMAT.md +147 -33
  247. package/fable-mode/SKILL.md +3 -3
  248. package/fable-mode/agents/fable-orchestrator.md +95 -35
  249. package/fable-mode/execution-guardrails/SKILL.md +2 -2
  250. package/fable-mode/fable-haiku/SKILL.md +3 -3
  251. package/fable-mode/fable-opus/SKILL.md +3 -3
  252. package/fable-mode/fable-sonnet/SKILL.md +3 -3
  253. package/fable-mode/scripts/ensemble-review.js +371 -0
  254. package/fable-mode/scripts/model-selector.js +134 -3
  255. package/fable-mode/scripts/workflow-plan-consumer.js +337 -0
  256. package/find-skills/SKILL.md +5 -5
  257. package/find-skills/references/discovery-flow.md +1 -1
  258. package/find-skills/scripts/use-skill.js +7 -1
  259. package/git-commit/SKILL.md +4 -11
  260. package/grill-me/SKILL.md +5 -5
  261. package/grill-with-docs/SKILL.md +7 -7
  262. package/grill-with-docs/references/session-playbook.md +6 -4
  263. package/harness-everything/SKILL.md +23 -22
  264. package/harness-everything/references/router-workflow-plan.md +128 -0
  265. package/harness-everything/references/triage-and-tiers.md +173 -96
  266. package/harness-everything/schemas/router-task-shape.schema.json +126 -0
  267. package/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
  268. package/harness-everything/scripts/bootstrap.js +13 -4
  269. package/harness-everything/scripts/ensemble-policy.js +102 -0
  270. package/harness-everything/scripts/kernel-router.js +212 -0
  271. package/harness-everything/scripts/router-contract.js +612 -0
  272. package/harness-everything/scripts/self-heal.js +29 -20
  273. package/harness-everything/scripts/tier-router.js +346 -221
  274. package/hooks/hooks.json +60 -15
  275. package/hooks/scripts/action-gate-rules.json +77 -0
  276. package/hooks/scripts/action-gate.js +528 -0
  277. package/hooks/scripts/atomic-commit-check.js +5 -5
  278. package/hooks/scripts/codex-action-gate-post.js +46 -0
  279. package/hooks/scripts/codex-permission-request.js +140 -0
  280. package/hooks/scripts/context-compact.js +4 -3
  281. package/hooks/scripts/contract-test.js +118 -51
  282. package/hooks/scripts/lib/fable-contracts.js +121 -0
  283. package/hooks/scripts/lib/harness-state.js +164 -28
  284. package/hooks/scripts/lib/platforms/claude.js +45 -62
  285. package/hooks/scripts/lib/platforms/codex.js +35 -61
  286. package/hooks/scripts/lib/platforms/continue.js +7 -7
  287. package/hooks/scripts/lib/platforms/copilot.js +29 -53
  288. package/hooks/scripts/lib/platforms/hermes.js +71 -20
  289. package/hooks/scripts/openai-session-start.js +81 -0
  290. package/hooks/scripts/rule-of-3-tracker.js +9 -8
  291. package/hooks/scripts/rule-of-3.js +29 -21
  292. package/hooks/scripts/state-persist.js +5 -4
  293. package/hooks/scripts/stop-gate.js +2 -2
  294. package/hooks/scripts/subagent-scope-guard.js +144 -38
  295. package/hooks/scripts/subagent-start.js +19 -0
  296. package/hooks/scripts/subagent-stop.js +6 -0
  297. package/improve-codebase-architecture/SKILL.md +2 -4
  298. package/improve-codebase-architecture/references/README.md +16 -0
  299. package/install-cognitive-os/SKILL.md +28 -22
  300. package/multi-agent-workspace/SKILL.md +16 -15
  301. package/multi-agent-workspace/references/architecture-guide.md +13 -9
  302. package/multi-agent-workspace/references/orchestration.md +39 -22
  303. package/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
  304. package/multi-agent-workspace/scripts/index_memory.js +79 -26
  305. package/multi-agent-workspace/scripts/path-boundary.js +59 -0
  306. package/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
  307. package/multi-agent-workspace/scripts/scaffold.js +258 -103
  308. package/multi-agent-workspace/templates/AGENTS.md +20 -0
  309. package/multi-agent-workspace/workflows/03-generation.md +8 -10
  310. package/multi-agent-workspace/workflows/04-launcher.md +5 -5
  311. package/opencode-plugin/README.md +114 -71
  312. package/opencode-plugin/hooks/verify.js +62 -12
  313. package/opencode-plugin/index.mjs +547 -0
  314. package/opencode-plugin/plugin.json +4 -12
  315. package/package.json +16 -3
  316. package/plugins/harness-everything/.codex-plugin/plugin.json +39 -0
  317. package/plugins/harness-everything/hooks/hooks.json +197 -0
  318. package/plugins/harness-everything/hooks/scripts/action-gate-rules.json +77 -0
  319. package/plugins/harness-everything/hooks/scripts/action-gate.js +528 -0
  320. package/plugins/harness-everything/hooks/scripts/atomic-commit-check.js +68 -0
  321. package/plugins/harness-everything/hooks/scripts/boundary-guard.js +55 -0
  322. package/plugins/harness-everything/hooks/scripts/codex-action-gate-post.js +46 -0
  323. package/plugins/harness-everything/hooks/scripts/codex-permission-request.js +140 -0
  324. package/plugins/harness-everything/hooks/scripts/context-compact.js +115 -0
  325. package/plugins/harness-everything/hooks/scripts/contract-test.js +146 -0
  326. package/plugins/harness-everything/hooks/scripts/depth-guard.js +65 -0
  327. package/plugins/harness-everything/hooks/scripts/lib/fable-contracts.js +121 -0
  328. package/plugins/harness-everything/hooks/scripts/lib/harness-state.js +275 -0
  329. package/plugins/harness-everything/hooks/scripts/lib/platforms/claude.js +168 -0
  330. package/plugins/harness-everything/hooks/scripts/lib/platforms/codex.js +88 -0
  331. package/plugins/harness-everything/hooks/scripts/lib/platforms/continue.js +91 -0
  332. package/plugins/harness-everything/hooks/scripts/lib/platforms/copilot.js +85 -0
  333. package/plugins/harness-everything/hooks/scripts/lib/platforms/cursor.js +89 -0
  334. package/plugins/harness-everything/hooks/scripts/lib/platforms/hermes.js +108 -0
  335. package/plugins/harness-everything/hooks/scripts/lib/platforms/index.js +17 -0
  336. package/plugins/harness-everything/hooks/scripts/lib/platforms/worktrees.js +20 -0
  337. package/plugins/harness-everything/hooks/scripts/lib/workspace.js +290 -0
  338. package/plugins/harness-everything/hooks/scripts/openai-session-start.js +81 -0
  339. package/plugins/harness-everything/hooks/scripts/reset-circuit-breaker.js +30 -0
  340. package/plugins/harness-everything/hooks/scripts/rule-of-3-tracker.js +125 -0
  341. package/plugins/harness-everything/hooks/scripts/rule-of-3.js +195 -0
  342. package/plugins/harness-everything/hooks/scripts/state-persist.js +100 -0
  343. package/plugins/harness-everything/hooks/scripts/stop-gate.js +80 -0
  344. package/plugins/harness-everything/hooks/scripts/subagent-scope-guard.js +194 -0
  345. package/plugins/harness-everything/hooks/scripts/subagent-start.js +19 -0
  346. package/plugins/harness-everything/hooks/scripts/subagent-stop.js +6 -0
  347. package/plugins/harness-everything/hooks/session-start.js +81 -0
  348. package/plugins/harness-everything/plugin.json +43 -0
  349. package/plugins/harness-everything/scripts/lib/advisory-text.js +174 -0
  350. package/plugins/harness-everything/skills/environment-detection/SKILL.md +41 -0
  351. package/plugins/harness-everything/skills/environment-detection/references/shell-syntax-rules.md +76 -0
  352. package/plugins/harness-everything/skills/environment-detection/scripts/preflight.js +103 -0
  353. package/plugins/harness-everything/skills/eval-harness/SKILL.md +42 -0
  354. package/plugins/harness-everything/skills/eval-harness/references/scoring-rubric.md +68 -0
  355. package/plugins/harness-everything/skills/eval-harness/scripts/evaluate.js +79 -0
  356. package/plugins/harness-everything/skills/fable-discipline/SKILL.md +41 -0
  357. package/plugins/harness-everything/skills/fable-discipline/references/discipline-rules.md +22 -0
  358. package/plugins/harness-everything/skills/fable-mode/CONTRACT-FORMAT.md +165 -0
  359. package/plugins/harness-everything/skills/fable-mode/SKILL.md +39 -0
  360. package/plugins/harness-everything/skills/fable-mode/agents/fable-orchestrator.md +159 -0
  361. package/plugins/harness-everything/skills/fable-mode/agents/fable-verifier.md +32 -0
  362. package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-haiku.md +52 -0
  363. package/plugins/harness-everything/skills/fable-mode/agents/fable-worker-sonnet.md +53 -0
  364. package/plugins/harness-everything/skills/fable-mode/execution-guardrails/SKILL.md +43 -0
  365. package/plugins/harness-everything/skills/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
  366. package/plugins/harness-everything/skills/fable-mode/fable-haiku/SKILL.md +36 -0
  367. package/plugins/harness-everything/skills/fable-mode/fable-haiku/references/routing-notes.md +26 -0
  368. package/plugins/harness-everything/skills/fable-mode/fable-opus/SKILL.md +36 -0
  369. package/plugins/harness-everything/skills/fable-mode/fable-sonnet/SKILL.md +36 -0
  370. package/plugins/harness-everything/skills/fable-mode/model-matrix.json +32 -0
  371. package/plugins/harness-everything/skills/fable-mode/references/execution-phases.md +37 -0
  372. package/plugins/harness-everything/skills/fable-mode/references/model-matrix.md +39 -0
  373. package/plugins/harness-everything/skills/fable-mode/scripts/ensemble-review.js +371 -0
  374. package/plugins/harness-everything/skills/fable-mode/scripts/model-selector.js +260 -0
  375. package/plugins/harness-everything/skills/fable-mode/scripts/workflow-plan-consumer.js +337 -0
  376. package/plugins/harness-everything/skills/find-skills/SKILL.md +48 -0
  377. package/plugins/harness-everything/skills/find-skills/references/discovery-flow.md +102 -0
  378. package/plugins/harness-everything/skills/find-skills/scripts/use-skill.js +112 -0
  379. package/plugins/harness-everything/skills/git-commit/SKILL.md +38 -0
  380. package/plugins/harness-everything/skills/git-commit/guides/ANGULAR_STYLE.md +61 -0
  381. package/plugins/harness-everything/skills/git-commit/guides/COMMIT_GENERATION.md +24 -0
  382. package/plugins/harness-everything/skills/git-commit/guides/LANGUAGE_DETECTION.md +16 -0
  383. package/plugins/harness-everything/skills/git-commit/guides/MAIN_REPO.md +15 -0
  384. package/plugins/harness-everything/skills/git-commit/guides/SUBMODULES.md +27 -0
  385. package/plugins/harness-everything/skills/git-commit/references/commit-flow.md +30 -0
  386. package/plugins/harness-everything/skills/grill-me/SKILL.md +43 -0
  387. package/plugins/harness-everything/skills/grill-me/references/grilling-playbook.md +38 -0
  388. package/plugins/harness-everything/skills/grill-with-docs/ADR-FORMAT.md +47 -0
  389. package/plugins/harness-everything/skills/grill-with-docs/CONTEXT-FORMAT.md +63 -0
  390. package/plugins/harness-everything/skills/grill-with-docs/SKILL.md +41 -0
  391. package/plugins/harness-everything/skills/grill-with-docs/references/session-playbook.md +99 -0
  392. package/plugins/harness-everything/skills/harness-everything/SKILL.md +43 -0
  393. package/plugins/harness-everything/skills/harness-everything/examples/README.md +9 -0
  394. package/plugins/harness-everything/skills/harness-everything/examples/todo-workflow.md +22 -0
  395. package/plugins/harness-everything/skills/harness-everything/references/router-workflow-plan.md +128 -0
  396. package/plugins/harness-everything/skills/harness-everything/references/skill-registry.md +39 -0
  397. package/plugins/harness-everything/skills/harness-everything/references/triage-and-tiers.md +193 -0
  398. package/plugins/harness-everything/skills/harness-everything/schemas/router-task-shape.schema.json +126 -0
  399. package/plugins/harness-everything/skills/harness-everything/schemas/router-workflow-plan.schema.json +149 -0
  400. package/plugins/harness-everything/skills/harness-everything/scripts/bootstrap.js +212 -0
  401. package/plugins/harness-everything/skills/harness-everything/scripts/ensemble-policy.js +102 -0
  402. package/plugins/harness-everything/skills/harness-everything/scripts/kernel-router.js +212 -0
  403. package/plugins/harness-everything/skills/harness-everything/scripts/router-contract.js +612 -0
  404. package/plugins/harness-everything/skills/harness-everything/scripts/routing-keywords.json +320 -0
  405. package/plugins/harness-everything/skills/harness-everything/scripts/self-heal.js +250 -0
  406. package/plugins/harness-everything/skills/harness-everything/scripts/tier-router.js +459 -0
  407. package/plugins/harness-everything/skills/harness-everything/scripts/verify-gate.js +100 -0
  408. package/plugins/harness-everything/skills/improve-codebase-architecture/SKILL.md +38 -0
  409. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/DEEPENING.md +37 -0
  410. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/HTML-REPORT.md +123 -0
  411. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -0
  412. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/LANGUAGE.md +53 -0
  413. package/plugins/harness-everything/skills/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
  414. package/plugins/harness-everything/skills/improve-codebase-architecture/references/README.md +16 -0
  415. package/plugins/harness-everything/skills/install-cognitive-os/SKILL.md +44 -0
  416. package/plugins/harness-everything/skills/install-cognitive-os/references/cognitive-loop.md +27 -0
  417. package/plugins/harness-everything/skills/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
  418. package/plugins/harness-everything/skills/multi-agent-workspace/SKILL.md +38 -0
  419. package/plugins/harness-everything/skills/multi-agent-workspace/examples/csharp-monorepo.md +123 -0
  420. package/plugins/harness-everything/skills/multi-agent-workspace/examples/typescript-cli.md +126 -0
  421. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-claude.md +77 -0
  422. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-codex.md +146 -0
  423. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-continue.md +38 -0
  424. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-copilot.md +74 -0
  425. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
  426. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
  427. package/plugins/harness-everything/skills/multi-agent-workspace/guidelines/role-capabilities.md +108 -0
  428. package/plugins/harness-everything/skills/multi-agent-workspace/references/agency-agents.md +31 -0
  429. package/plugins/harness-everything/skills/multi-agent-workspace/references/architecture-guide.md +36 -0
  430. package/plugins/harness-everything/skills/multi-agent-workspace/references/orchestration.md +65 -0
  431. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/agency-catalog.js +190 -0
  432. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/consume-workflow-plan.js +129 -0
  433. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/index_memory.js +104 -0
  434. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/path-boundary.js +59 -0
  435. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/project-docs-resolver.js +357 -0
  436. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/scaffold.js +408 -0
  437. package/plugins/harness-everything/skills/multi-agent-workspace/templates/AGENTS.md +20 -0
  438. package/plugins/harness-everything/skills/multi-agent-workspace/templates/README.md +17 -0
  439. package/plugins/harness-everything/skills/multi-agent-workspace/templates/agent-launcher.md +68 -0
  440. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-csharp.md +56 -0
  441. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-polyglot.md +62 -0
  442. package/plugins/harness-everything/skills/multi-agent-workspace/templates/backend-developer-ts.md +57 -0
  443. package/plugins/harness-everything/skills/multi-agent-workspace/templates/memory-keeper.md +37 -0
  444. package/plugins/harness-everything/skills/multi-agent-workspace/templates/requirement-analyzer.md +66 -0
  445. package/plugins/harness-everything/skills/multi-agent-workspace/templates/specialist-agent.md +34 -0
  446. package/plugins/harness-everything/skills/multi-agent-workspace/templates/task-verifier.md +56 -0
  447. package/plugins/harness-everything/skills/multi-agent-workspace/templates/tool-maker.md +33 -0
  448. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/01-init.md +22 -0
  449. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/02-analysis.md +23 -0
  450. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/03-generation.md +25 -0
  451. package/plugins/harness-everything/skills/multi-agent-workspace/workflows/04-launcher.md +16 -0
  452. package/plugins/harness-everything/skills/repo-docs/SKILL.md +42 -0
  453. package/plugins/harness-everything/skills/repo-docs/references/process-guide.md +60 -0
  454. package/plugins/harness-everything/skills/repo-docs/templates/agents-template.md +264 -0
  455. package/plugins/harness-everything/skills/repo-docs/templates/knowledge-agents-template.md +50 -0
  456. package/plugins/harness-everything/skills/repo-docs/templates/knowledge-readme-template.md +83 -0
  457. package/plugins/harness-everything/skills/repo-docs/templates/manual-recon.md +117 -0
  458. package/plugins/harness-everything/skills/repo-docs/templates/multi-skills-readme-template.md +72 -0
  459. package/plugins/harness-everything/skills/repo-docs/templates/product-agents-template.md +78 -0
  460. package/plugins/harness-everything/skills/repo-docs/templates/product-readme-template.md +95 -0
  461. package/plugins/harness-everything/skills/repo-docs/templates/readme-template.md +136 -0
  462. package/plugins/harness-everything/skills/repo-docs/templates/single-skill-readme-template.md +70 -0
  463. package/plugins/harness-everything/skills/repo-docs/templates/skills-agents-template.md +60 -0
  464. package/plugins/harness-everything/skills/rewrite-commits/SKILL.md +37 -0
  465. package/plugins/harness-everything/skills/rewrite-commits/references/workflow.md +18 -0
  466. package/plugins/harness-everything/skills/security-review/SKILL.md +47 -0
  467. package/plugins/harness-everything/skills/security-review/guides/OWASP-PATTERNS.md +31 -0
  468. package/plugins/harness-everything/skills/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
  469. package/plugins/harness-everything/skills/security-review/references/security-checklist.md +478 -0
  470. package/plugins/harness-everything/skills/security-review/scripts/audit-secrets.js +85 -0
  471. package/plugins/harness-everything/skills/self-evolve/SKILL.md +45 -0
  472. package/plugins/harness-everything/skills/self-evolve/references/memory-resolution.md +61 -0
  473. package/plugins/harness-everything/skills/self-evolve/scripts/persist-memory.js +272 -0
  474. package/plugins/harness-everything/skills/self-evolve/scripts/register-dynamic-skill.js +253 -0
  475. package/plugins/harness-everything/skills/self-evolve/scripts/self-regression.js +125 -0
  476. package/plugins/harness-everything/skills/skill-creator/SKILL.md +47 -0
  477. package/plugins/harness-everything/skills/skill-creator/references/authoring-workflow.md +14 -0
  478. package/plugins/harness-everything/skills/skill-creator/references/dynamic-generation-contract.md +21 -0
  479. package/plugins/harness-everything/skills/skill-creator/references/quality-checklist.md +16 -0
  480. package/plugins/harness-everything/skills/skill-creator/references/quality-principles.md +81 -0
  481. package/plugins/harness-everything/skills/skill-creator/references/testing-workflow.md +27 -0
  482. package/plugins/harness-everything/skills/skill-style/SKILL.md +42 -0
  483. package/plugins/harness-everything/skills/skill-style/references/style-guide.md +62 -0
  484. package/plugins/harness-everything/skills/tdd/SKILL.md +38 -0
  485. package/plugins/harness-everything/skills/tdd/fixtures/pass-evidence.json +100 -0
  486. package/plugins/harness-everything/skills/tdd/fixtures/quality-scenarios.json +20 -0
  487. package/plugins/harness-everything/skills/tdd/guides/deep-modules.md +33 -0
  488. package/plugins/harness-everything/skills/tdd/guides/interface-design.md +31 -0
  489. package/plugins/harness-everything/skills/tdd/guides/mocking.md +59 -0
  490. package/plugins/harness-everything/skills/tdd/guides/refactoring.md +10 -0
  491. package/plugins/harness-everything/skills/tdd/guides/tests.md +61 -0
  492. package/plugins/harness-everything/skills/tdd/references/core-discipline.md +51 -0
  493. package/plugins/harness-everything/skills/tdd/references/integration-testing.md +13 -0
  494. package/plugins/harness-everything/skills/tdd/references/quality-model.md +68 -0
  495. package/plugins/harness-everything/skills/tdd/references/unit-testing.md +15 -0
  496. package/plugins/harness-everything/skills/tdd/schemas/quality-evidence.schema.json +211 -0
  497. package/plugins/harness-everything/skills/tdd/schemas/quality-report.schema.json +110 -0
  498. package/plugins/harness-everything/skills/tdd/scripts/quality-gate.js +475 -0
  499. package/plugins/harness-everything/skills/to-spec/SKILL.md +40 -0
  500. package/plugins/harness-everything/skills/to-spec/references/process.md +77 -0
  501. package/plugins/harness-everything/skills/to-spec/scripts/check-project-docs.js +239 -0
  502. package/plugins/harness-everything/skills/to-spec/scripts/project-docs-resolver.js +111 -0
  503. package/plugins/harness-everything/skills/to-spec/templates/cli-reference.md +31 -0
  504. package/plugins/harness-everything/skills/to-spec/templates/dev-doc.md +27 -0
  505. package/plugins/harness-everything/skills/to-spec/templates/feature-spec.md +59 -0
  506. package/plugins/harness-everything/skills/to-spec/templates/schema-doc.md +31 -0
  507. package/plugins/harness-everything/skills/to-tickets/SKILL.md +42 -0
  508. package/plugins/harness-everything/skills/to-tickets/references/publishing-and-templates.md +97 -0
  509. package/plugins/harness-everything/skills/todo-driven-workflow/SKILL.md +42 -0
  510. package/plugins/harness-everything/skills/todo-driven-workflow/references/execution-guide.md +27 -0
  511. package/plugins/harness-everything/skills/using-git-worktrees/SKILL.md +49 -0
  512. package/plugins/harness-everything/skills/using-git-worktrees/references/workflow-details.md +108 -0
  513. package/plugins/harness-everything/skills/verification-loop/SKILL.md +46 -0
  514. package/plugins/harness-everything/skills/verification-loop/references/verification-phases.md +116 -0
  515. package/plugins/harness-everything/skills/verification-loop/templates/verification-report.template.md +15 -0
  516. package/plugins/harness-everything/skills/verify-before-claim/SKILL.md +43 -0
  517. package/plugins/harness-everything/skills/verify-before-claim/references/verification-guide.md +73 -0
  518. package/plugins/harness-everything/skills/zoom-out/SKILL.md +42 -0
  519. package/plugins/harness-everything/skills/zoom-out/references/circuit-breaker.md +66 -0
  520. package/plugins/harness-everything/skills/zoom-out/templates/zoom-out-report.template.md +20 -0
  521. package/repo-docs/SKILL.md +3 -7
  522. package/rewrite-commits/SKILL.md +2 -2
  523. package/scripts/build-openai-submission.js +158 -0
  524. package/scripts/installer.js +86 -11
  525. package/scripts/lib/advisory-text.js +25 -18
  526. package/scripts/lib/execution-contract.js +70 -0
  527. package/scripts/lib/manifest.js +34 -38
  528. package/scripts/lib/path-boundary.js +90 -0
  529. package/scripts/lib/skills.js +124 -70
  530. package/scripts/lib/workspace.js +269 -7
  531. package/scripts/sync-openai-plugin.js +91 -0
  532. package/scripts/sync-release-version.js +212 -0
  533. package/security-review/SKILL.md +4 -7
  534. package/security-review/scripts/audit-secrets.js +9 -8
  535. package/self-evolve/SKILL.md +9 -11
  536. package/self-evolve/references/memory-resolution.md +4 -1
  537. package/self-evolve/scripts/persist-memory.js +221 -88
  538. package/self-evolve/scripts/register-dynamic-skill.js +12 -10
  539. package/self-evolve/scripts/self-regression.js +23 -8
  540. package/skill-creator/SKILL.md +12 -14
  541. package/skill-creator/references/quality-checklist.md +1 -0
  542. package/skill-style/SKILL.md +4 -4
  543. package/skill-style/references/style-guide.md +29 -3
  544. package/submission/openai/README.md +67 -0
  545. package/submission/openai/listing.json +31 -0
  546. package/submission/openai/test-cases.json +61 -0
  547. package/tdd/SKILL.md +20 -26
  548. package/tdd/fixtures/pass-evidence.json +100 -0
  549. package/tdd/fixtures/quality-scenarios.json +20 -0
  550. package/tdd/references/core-discipline.md +2 -0
  551. package/tdd/references/integration-testing.md +13 -0
  552. package/tdd/references/quality-model.md +68 -0
  553. package/tdd/references/unit-testing.md +15 -0
  554. package/tdd/schemas/quality-evidence.schema.json +211 -0
  555. package/tdd/schemas/quality-report.schema.json +110 -0
  556. package/tdd/scripts/quality-gate.js +475 -0
  557. package/to-spec/SKILL.md +3 -5
  558. package/to-spec/scripts/check-project-docs.js +42 -62
  559. package/to-spec/scripts/project-docs-resolver.js +111 -0
  560. package/to-tickets/SKILL.md +4 -4
  561. package/todo-driven-workflow/SKILL.md +6 -4
  562. package/using-git-worktrees/SKILL.md +3 -3
  563. package/verification-loop/SKILL.md +4 -4
  564. package/verify-before-claim/SKILL.md +2 -2
  565. package/zoom-out/SKILL.md +4 -4
  566. package/ab-test-deep-analysis-2026-08-27.md +0 -383
  567. package/ab-test-results-2026-08-27.md +0 -152
  568. package/ab-test-statistical-analysis-31cases.md +0 -193
  569. package/opencode-plugin/hooks/circuit-breaker.js +0 -121
  570. package/opencode-plugin/hooks/compliance.js +0 -128
  571. package/opencode-plugin/hooks/post-edit.js +0 -62
  572. package/opencode-plugin/hooks/pre-complete.js +0 -65
  573. package/opencode-plugin/test-hook-firing.js +0 -198
@@ -0,0 +1,547 @@
1
+ /**
2
+ * Harness Enforcement Plugin for opencode
3
+ *
4
+ * A single self-contained ESM module, because that is what opencode actually
5
+ * loads: a JS/TS file dropped in `.opencode/plugins/` (or referenced from
6
+ * `opencode.json`) that exports a function returning a hooks object. There is
7
+ * no JSON-manifest-to-script mechanism - the old plugin.json + hooks/*.js
8
+ * split assumed one and was never invoked by opencode. See issue #37.
9
+ *
10
+ * Hook mapping (old CLI script -> real opencode hook):
11
+ * post-edit.js -> tool.execute.after (fires once per edit/write/apply_patch)
12
+ * pre-complete.js -> event (session.idle) (opencode has no "before complete"
13
+ * hook; session.idle is the closest analog - the agent's
14
+ * turn just ended. There is no way to *block* that event,
15
+ * so pending verification is enforced by running it right
16
+ * there and, on failure, pushing a synthetic follow-up
17
+ * message via client.session.prompt() to force the agent
18
+ * to keep going instead of truly stopping.)
19
+ * verify.js -> inlined into the session.idle handler
20
+ * circuit-breaker.js -> tool.execute.before (throws to hard-block edit tools
21
+ * once locked) + failure tracking inside session.idle
22
+ * compliance.js -> folded into the same state writes, no separate stage
23
+ *
24
+ * The circuit breaker trips on repeated *verification* failures (same failing
25
+ * command + truncated error), not on arbitrary tool failures: tool.execute.after
26
+ * gives back `{title, output, metadata}` for every tool with no normalized
27
+ * success/failure field, so there is no reliable cross-tool failure signal to
28
+ * key a signature on. Verification failures are self-produced and already
29
+ * normalized, so that is the honest signal to use.
30
+ */
31
+
32
+ import { homedir } from "node:os"
33
+ import { join, dirname, resolve, basename, relative, isAbsolute } from "node:path"
34
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, rmSync, realpathSync, readdirSync } from "node:fs"
35
+ import { execSync } from "node:child_process"
36
+ import { createHash, randomUUID } from "node:crypto"
37
+
38
+ const EDIT_TOOLS = new Set(["edit", "write", "apply_patch"])
39
+
40
+ // Global state root, matching the Node-side resolver at
41
+ // scripts/lib/workspace.js#getStateHome (same env var precedence) - this
42
+ // plugin can't require that CJS module (opencode loads a single self-
43
+ // contained ESM file, see the header comment above), so the derivation is
44
+ // duplicated here, algorithm-for-algorithm, so the two stay physically
45
+ // compatible if a workspace is ever inspected from both sides.
46
+ function getStateHome() {
47
+ return process.env.HARNESS_STATE_HOME || join(homedir(), ".agents", "harness-everything")
48
+ }
49
+
50
+ // Keys state per real workspace (`directory`, which opencode itself resolves
51
+ // - never a cwd walk) instead of one flat dir shared by every project on the
52
+ // machine. The pre-fix `~/.harness-state` had no such key at all: a circuit
53
+ // breaker trip in one opencode project hard-locked every other one too
54
+ // (issue #42 item #4).
55
+ function getWorkspaceKey(directory) {
56
+ let real = resolve(directory)
57
+ try { real = realpathSync(real) } catch { /* directory may not exist yet */ }
58
+ const slug = basename(real).toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "") || "workspace"
59
+ const hashInput = process.platform === "win32" ? real.toLowerCase() : real
60
+ const hash = createHash("sha1").update(hashInput).digest("hex").slice(0, 12)
61
+ return `${slug}-${hash}`
62
+ }
63
+
64
+ // Move the pre-#42 flat plugin state into the first workspace that claims it.
65
+ // Keep conflicting or unsupported entries in place so a later run can retry.
66
+ function migrateLegacyFlatState(stateDir) {
67
+ const legacyDir = join(homedir(), ".harness-state")
68
+ if (!existsSync(legacyDir)) return
69
+ try {
70
+ mkdirSync(stateDir, { recursive: true })
71
+ let conflict = false
72
+ for (const entry of readdirSync(legacyDir, { withFileTypes: true })) {
73
+ if (!entry.isFile()) {
74
+ conflict = true
75
+ continue
76
+ }
77
+ const source = join(legacyDir, entry.name)
78
+ const destination = join(stateDir, entry.name)
79
+ if (!existsSync(destination)) writeFileSync(destination, readFileSync(source))
80
+ else if (!readFileSync(source).equals(readFileSync(destination))) conflict = true
81
+ }
82
+ if (!conflict) rmSync(legacyDir, { recursive: true, force: true })
83
+ } catch {
84
+ // Best effort: leave the legacy source available for recovery.
85
+ }
86
+ }
87
+
88
+ function getStateDir(directory) {
89
+ return join(getStateHome(), "workspaces", getWorkspaceKey(directory))
90
+ }
91
+
92
+ function getStateRoot(directory) {
93
+ return join(getStateDir(directory), "state")
94
+ }
95
+
96
+ function getSessionKey(sessionID) {
97
+ const id = String(sessionID || "default")
98
+ const windowsReserved = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i
99
+ if (
100
+ /^[A-Za-z0-9._-]+$/.test(id) &&
101
+ id !== "." &&
102
+ id !== ".." &&
103
+ id === id.trim() &&
104
+ !/[. ]$/.test(id) &&
105
+ !windowsReserved.test(id)
106
+ ) return id
107
+ return `session-${createHash("sha1").update(id).digest("hex").slice(0, 12)}`
108
+ }
109
+
110
+ function isWithin(parent, candidate) {
111
+ const relativePath = relative(resolve(parent), resolve(candidate))
112
+ return relativePath === "" || (
113
+ relativePath !== ".." &&
114
+ !relativePath.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) &&
115
+ !isAbsolute(relativePath)
116
+ )
117
+ }
118
+
119
+ function samePath(left, right) {
120
+ const a = resolve(left)
121
+ const b = resolve(right)
122
+ return process.platform === "win32" ? a.toLowerCase() === b.toLowerCase() : a === b
123
+ }
124
+
125
+ function getSessionDir(directory, sessionID) {
126
+ const sessionsRoot = resolve(join(getStateRoot(directory), "sessions"))
127
+ const candidate = resolve(sessionsRoot, getSessionKey(sessionID))
128
+ if (!isWithin(sessionsRoot, candidate) || candidate === sessionsRoot) {
129
+ const fallback = `session-${createHash("sha1").update(String(sessionID || "default")).digest("hex").slice(0, 12)}`
130
+ return join(sessionsRoot, fallback)
131
+ }
132
+ return candidate
133
+ }
134
+
135
+ function loadJSON(file, fallback) {
136
+ try {
137
+ if (existsSync(file)) return JSON.parse(readFileSync(file, "utf8"))
138
+ } catch {
139
+ // fall through to default
140
+ }
141
+ return fallback
142
+ }
143
+
144
+ function saveJSON(file, data) {
145
+ mkdirSync(dirname(file), { recursive: true })
146
+ writeFileSync(file, JSON.stringify(data, null, 2))
147
+ }
148
+
149
+ function defaultEditState() {
150
+ return {
151
+ lastEditTime: null,
152
+ verificationPending: false,
153
+ editsSinceVerification: 0,
154
+ followUpPending: false,
155
+ followUpDeliveryPending: false,
156
+ followUpMessage: null,
157
+ lastFollowUpError: null,
158
+ sessionStart: Date.now(),
159
+ }
160
+ }
161
+
162
+ function defaultBreakerState() {
163
+ return {
164
+ failures: {},
165
+ hardLock: false,
166
+ lastReflection: null,
167
+ lastReflectionSignature: null,
168
+ reflectionPending: false,
169
+ reflectionRequestedAt: null,
170
+ reflectionToken: null,
171
+ reflectionSignature: null,
172
+ }
173
+ }
174
+
175
+ function normalizeEditState(state) {
176
+ return { ...defaultEditState(), ...(state || {}) }
177
+ }
178
+
179
+ function normalizeBreakerState(state) {
180
+ return { ...defaultBreakerState(), ...(state || {}), failures: (state && state.failures) || {} }
181
+ }
182
+
183
+ function isRecord(value) {
184
+ return value !== null && typeof value === "object" && !Array.isArray(value)
185
+ }
186
+
187
+ function loadBreakerState(file) {
188
+ if (!existsSync(file)) return defaultBreakerState()
189
+ try {
190
+ const state = JSON.parse(readFileSync(file, "utf8"))
191
+ const finiteOrNull = (value) => value === undefined || value === null || Number.isFinite(value)
192
+ const stringOrNull = (value) => value === undefined || value === null || typeof value === "string"
193
+ if (
194
+ !isRecord(state) ||
195
+ (state.failures !== undefined && !isRecord(state.failures)) ||
196
+ (state.hardLock !== undefined && typeof state.hardLock !== "boolean") ||
197
+ (state.reflectionPending !== undefined && typeof state.reflectionPending !== "boolean") ||
198
+ !finiteOrNull(state.lastReflection) ||
199
+ !finiteOrNull(state.reflectionRequestedAt) ||
200
+ !stringOrNull(state.lastReflectionSignature) ||
201
+ !stringOrNull(state.reflectionToken) ||
202
+ !stringOrNull(state.reflectionSignature) ||
203
+ Object.values(state.failures || {}).some((entry) =>
204
+ !isRecord(entry) ||
205
+ (entry.count !== undefined && (!Number.isInteger(entry.count) || entry.count < 0)) ||
206
+ !finiteOrNull(entry.firstSeen) ||
207
+ !finiteOrNull(entry.lastSeen)
208
+ )
209
+ ) throw new Error("invalid breaker state shape")
210
+ return normalizeBreakerState(state)
211
+ } catch {
212
+ throw new Error(`Harness circuit breaker state is corrupt: "${file}" cannot be read safely.`)
213
+ }
214
+ }
215
+
216
+ const REFLECTION_FILE = "zoom-out-report.md"
217
+ const REFLECTION_SECTIONS = ["## Goal", "## Failed Attempts", "## Verified Facts", "## Diagnosis", "## Decision"]
218
+
219
+ function reflectionReportPath(stateDir) {
220
+ return join(stateDir, REFLECTION_FILE)
221
+ }
222
+
223
+ function isValidReflection(reportFile, breaker) {
224
+ if (!breaker.reflectionPending || !breaker.reflectionToken || !existsSync(reportFile)) return false
225
+ try {
226
+ const report = readFileSync(reportFile, "utf8")
227
+ const lines = report.split(/\r?\n/)
228
+ const sectionIndexes = new Map(
229
+ lines.map((line, index) => [line.trim(), index]).filter(([line]) => REFLECTION_SECTIONS.includes(line)),
230
+ )
231
+ if (!REFLECTION_SECTIONS.every((section) => sectionIndexes.has(section))) return false
232
+ const decisionStart = sectionIndexes.get("## Decision") + 1
233
+ const nextHeading = lines.findIndex((line, index) => index >= decisionStart && /^##\s+/.test(line.trim()))
234
+ const decisionLines = lines.slice(decisionStart, nextHeading === -1 ? lines.length : nextHeading)
235
+ const firstDecisionLine = decisionLines.find((line) => line.trim().length > 0)
236
+ return !!firstDecisionLine && /^(?:RESUME|ESCALATE)\s*:/i.test(firstDecisionLine.trim()) &&
237
+ report.includes(`Reflection token: ${breaker.reflectionToken}`)
238
+ } catch {
239
+ return false
240
+ }
241
+ }
242
+
243
+ function completeReflection(breakerFile, reportFile) {
244
+ const breaker = loadBreakerState(breakerFile)
245
+ if (!isValidReflection(reportFile, breaker)) return false
246
+ const completedAt = Math.max(Date.now(), (breaker.reflectionRequestedAt || 0) + 1)
247
+ breaker.lastReflection = completedAt
248
+ breaker.lastReflectionSignature = breaker.reflectionSignature
249
+ breaker.reflectionPending = false
250
+ breaker.reflectionRequestedAt = null
251
+ breaker.reflectionToken = null
252
+ breaker.reflectionSignature = null
253
+ saveJSON(breakerFile, breaker)
254
+ return true
255
+ }
256
+
257
+ function defaultCompliance() {
258
+ return {
259
+ sessionStart: Date.now(),
260
+ totalEdits: 0,
261
+ verifiedEdits: 0,
262
+ circuitBreakerTrips: 0,
263
+ reflectionsForced: 0,
264
+ }
265
+ }
266
+
267
+ function extractFailureSignature(text) {
268
+ return text.slice(0, 100).replace(/\s+/g, " ").trim()
269
+ }
270
+
271
+ function getAvailableScripts(cwd) {
272
+ const pkgPath = join(cwd, "package.json")
273
+ if (!existsSync(pkgPath)) return {}
274
+ try {
275
+ return JSON.parse(readFileSync(pkgPath, "utf8")).scripts || {}
276
+ } catch {
277
+ return {}
278
+ }
279
+ }
280
+
281
+ function runVerification(cwd) {
282
+ const scripts = getAvailableScripts(cwd)
283
+ const commands = [
284
+ { cmd: "npm test", script: "test" },
285
+ { cmd: "npm run lint", script: "lint" },
286
+ { cmd: "npm run build", script: "build" },
287
+ ].filter((c) => scripts[c.script])
288
+
289
+ if (commands.length === 0) {
290
+ return { allPassed: true, skipped: true, results: [] }
291
+ }
292
+
293
+ const results = []
294
+ for (const { cmd } of commands) {
295
+ try {
296
+ execSync(cmd, { cwd, stdio: "pipe", timeout: 60000 })
297
+ results.push({ command: cmd, success: true })
298
+ } catch (e) {
299
+ results.push({ command: cmd, success: false, error: (e.stdout || e.message || "").toString().slice(0, 200) })
300
+ }
301
+ }
302
+ return { allPassed: results.every((r) => r.success), skipped: false, results }
303
+ }
304
+
305
+ /**
306
+ * Records a verification failure against the circuit breaker and returns the
307
+ * action to take: allow (with retries remaining), force_reflection (3rd
308
+ * failure on this signature), or hard_lock (same signature repeats after a
309
+ * reflection was recorded).
310
+ */
311
+ function tripBreaker(breakerFile, signature) {
312
+ const breaker = loadBreakerState(breakerFile)
313
+
314
+ if (!breaker.failures[signature]) {
315
+ breaker.failures[signature] = { count: 0, firstSeen: Date.now() }
316
+ }
317
+ const entry = breaker.failures[signature]
318
+ entry.count++
319
+ entry.lastSeen = Date.now()
320
+
321
+ if (entry.count >= 3) {
322
+ if (
323
+ breaker.lastReflection &&
324
+ breaker.lastReflection > entry.firstSeen &&
325
+ breaker.lastReflectionSignature === signature
326
+ ) {
327
+ breaker.hardLock = true
328
+ saveJSON(breakerFile, breaker)
329
+ return { action: "hard_lock", count: entry.count }
330
+ }
331
+ if (!breaker.reflectionPending) {
332
+ breaker.reflectionPending = true
333
+ breaker.reflectionRequestedAt = Date.now()
334
+ breaker.reflectionToken = randomUUID().replace(/-/g, "")
335
+ breaker.reflectionSignature = signature
336
+ }
337
+ saveJSON(breakerFile, breaker)
338
+ return { action: "force_reflection", count: entry.count, reflectionToken: breaker.reflectionToken }
339
+ }
340
+
341
+ saveJSON(breakerFile, breaker)
342
+ return { action: "allow", count: entry.count, remaining: 3 - entry.count }
343
+ }
344
+
345
+ function recordCompliance(complianceFile, mutate) {
346
+ const compliance = loadJSON(complianceFile, defaultCompliance())
347
+ mutate(compliance)
348
+ saveJSON(complianceFile, compliance)
349
+ }
350
+
351
+ export const HarnessEnforcement = async ({ client, directory }) => {
352
+ // State is resolved per real workspace and per opencode session. The CJS
353
+ // hooks use the same workspaces/<key>/state/sessions/<id> contract, while
354
+ // the old flat plugin state is intentionally left untouched because it is
355
+ // impossible to attribute safely to one workspace or session.
356
+ const workspace = resolve(directory || process.cwd())
357
+ migrateLegacyFlatState(getStateDir(workspace))
358
+ const activeVerifications = new Set()
359
+
360
+ function pathsFor(sessionID) {
361
+ const stateDir = getSessionDir(workspace, sessionID)
362
+ return {
363
+ stateDir,
364
+ editStateFile: join(stateDir, "edit-state.json"),
365
+ breakerFile: join(stateDir, "circuit-breaker.json"),
366
+ complianceFile: join(stateDir, "compliance.json"),
367
+ reflectionFile: reflectionReportPath(stateDir),
368
+ }
369
+ }
370
+
371
+ function resetSession(sessionID) {
372
+ const { stateDir } = pathsFor(sessionID)
373
+ const sessionsRoot = resolve(join(getStateRoot(workspace), "sessions"))
374
+ if (!isWithin(sessionsRoot, stateDir) || resolve(stateDir) === sessionsRoot) return
375
+ try { rmSync(stateDir, { recursive: true, force: true }) } catch { /* fail open */ }
376
+ }
377
+
378
+ function toolTarget(input, output) {
379
+ const args = { ...((output && output.args) || {}), ...((input && input.args) || {}) }
380
+ return args.filePath || args.file_path || args.path || args.filename || args.file || null
381
+ }
382
+
383
+ function patchTargets(input, output) {
384
+ const args = { ...((output && output.args) || {}), ...((input && input.args) || {}) }
385
+ if (typeof args.patchText !== "string") return []
386
+ return [...args.patchText.matchAll(/^\*\*\*\s+(?:(?:Add|Update|Delete) File|Move to):[ \t]*([^\r\n]+)$/gm)]
387
+ .map((match) => match[1].trim())
388
+ }
389
+
390
+ function isReflectionWrite(input, output, reportFile) {
391
+ if (!EDIT_TOOLS.has(input.tool)) return false
392
+ if (input.tool === "apply_patch") {
393
+ const targets = patchTargets(input, output)
394
+ return targets.length > 0 && targets.every((patchTarget) => samePath(resolve(workspace, patchTarget), reportFile))
395
+ }
396
+ const target = toolTarget(input, output)
397
+ return Boolean(target && samePath(resolve(workspace, target), reportFile))
398
+ }
399
+
400
+ return {
401
+ "tool.execute.before": async (input, output) => {
402
+ if (!EDIT_TOOLS.has(input.tool)) return
403
+ const { breakerFile, reflectionFile } = pathsFor(input.sessionID)
404
+ const breaker = loadBreakerState(breakerFile)
405
+ if (breaker.hardLock) {
406
+ throw new Error(
407
+ `Harness circuit breaker hard-locked after a repeat failure post-reflection. ` +
408
+ `Delete "${breakerFile}" or start a new session to reset.`,
409
+ )
410
+ }
411
+ if (breaker.reflectionPending && !isReflectionWrite(input, output, reflectionFile)) {
412
+ throw new Error(
413
+ `Harness reflection is required before another code edit. ` +
414
+ `Write a valid reflection report to "${reflectionFile}" first.`,
415
+ )
416
+ }
417
+ },
418
+
419
+ "tool.execute.after": async (input, output) => {
420
+ if (!EDIT_TOOLS.has(input.tool)) return
421
+ const { editStateFile, breakerFile, complianceFile, reflectionFile } = pathsFor(input.sessionID)
422
+
423
+ // The reflection artifact is a protocol write, not a code edit. It is
424
+ // accepted only when it contains the current token and all required
425
+ // sections; this is the only path that records lastReflection.
426
+ if (isReflectionWrite(input, output, reflectionFile)) {
427
+ completeReflection(breakerFile, reflectionFile)
428
+ return
429
+ }
430
+
431
+ const state = normalizeEditState(loadJSON(editStateFile, defaultEditState()))
432
+ state.lastEditTime = Date.now()
433
+ state.verificationPending = true
434
+ state.followUpPending = false
435
+ state.followUpDeliveryPending = false
436
+ state.followUpMessage = null
437
+ state.lastFollowUpError = null
438
+ state.editsSinceVerification++
439
+ saveJSON(editStateFile, state)
440
+ recordCompliance(complianceFile, (c) => c.totalEdits++)
441
+ },
442
+
443
+ event: async ({ event }) => {
444
+ const properties = event && event.properties
445
+ const sessionID = properties && (properties.sessionID || (properties.info && properties.info.id))
446
+ if (event.type === "session.created") {
447
+ resetSession(sessionID)
448
+ return
449
+ }
450
+ if (event.type === "session.deleted") {
451
+ resetSession(sessionID)
452
+ return
453
+ }
454
+ if (event.type !== "session.idle") return
455
+ if (activeVerifications.has(sessionID || "default")) return
456
+
457
+ const activeSession = sessionID || "default"
458
+ activeVerifications.add(activeSession)
459
+ try {
460
+ const { editStateFile, breakerFile, complianceFile, reflectionFile } = pathsFor(activeSession)
461
+ // This fallback makes the lifecycle complete even if the host omits
462
+ // tool input args on the artifact's after hook.
463
+ completeReflection(breakerFile, reflectionFile)
464
+
465
+ const state = normalizeEditState(loadJSON(editStateFile, defaultEditState()))
466
+ if (state.followUpPending) return
467
+
468
+ if (state.followUpDeliveryPending && state.followUpMessage) {
469
+ try {
470
+ await client.session.prompt({
471
+ path: { id: activeSession },
472
+ body: { parts: [{ type: "text", text: state.followUpMessage }] },
473
+ })
474
+ state.followUpPending = true
475
+ state.followUpDeliveryPending = false
476
+ state.followUpMessage = null
477
+ state.lastFollowUpError = null
478
+ saveJSON(editStateFile, state)
479
+ } catch (error) {
480
+ state.lastFollowUpError = String(error && (error.message || error)).slice(0, 300)
481
+ saveJSON(editStateFile, state)
482
+ }
483
+ return
484
+ }
485
+
486
+ if (!state.verificationPending || state.editsSinceVerification === 0) return
487
+
488
+ const { allPassed, skipped, results } = runVerification(workspace)
489
+
490
+ if (skipped || allPassed) {
491
+ state.verificationPending = false
492
+ state.followUpPending = false
493
+ state.editsSinceVerification = 0
494
+ saveJSON(editStateFile, state)
495
+ recordCompliance(complianceFile, (c) => c.verifiedEdits++)
496
+ return
497
+ }
498
+
499
+ const failing = results.find((r) => !r.success)
500
+ const signature = extractFailureSignature(`${failing.command}: ${failing.error || ""}`)
501
+ const trip = tripBreaker(breakerFile, signature)
502
+ state.followUpPending = true
503
+ saveJSON(editStateFile, state)
504
+
505
+ let text
506
+ if (trip.action === "hard_lock") {
507
+ text =
508
+ `Harness: same verification failure ("${failing.command}") returned after a reflection was ` +
509
+ `already recorded. The circuit breaker is now hard-locked - edits are blocked until it is reset.`
510
+ recordCompliance(complianceFile, (c) => c.circuitBreakerTrips++)
511
+ } else if (trip.action === "force_reflection") {
512
+ const { stateDir } = pathsFor(activeSession)
513
+ text =
514
+ `Harness: "${failing.command}" has now failed 3 times with the same error. Stop and reflect ` +
515
+ `before retrying. Write a report to "${reflectionReportPath(stateDir)}" with sections ` +
516
+ `## Goal, ## Failed Attempts, ## Verified Facts, ## Diagnosis, and ## Decision. ` +
517
+ `The Decision must begin with RESUME: or ESCALATE:. Include reflection token: ${trip.reflectionToken}. ` +
518
+ `After the report is recorded, resume with a different approach. Failure: ${failing.error || "(no output captured)"}`
519
+ recordCompliance(complianceFile, (c) => {
520
+ c.circuitBreakerTrips++
521
+ c.reflectionsForced++
522
+ })
523
+ } else {
524
+ text =
525
+ `Harness: verification failed (${trip.remaining} retries before a forced reflection). ` +
526
+ `"${failing.command}" - ${failing.error || "(no output captured)"}. Fix it and this will re-run automatically.`
527
+ }
528
+
529
+ try {
530
+ await client.session.prompt({ path: { id: activeSession }, body: { parts: [{ type: "text", text }] } })
531
+ } catch (error) {
532
+ // A failed delivery is retryable on the next idle event, but the
533
+ // saved message means retrying does not run verification again or
534
+ // increment the circuit-breaker count.
535
+ const failedState = normalizeEditState(loadJSON(editStateFile, defaultEditState()))
536
+ failedState.followUpPending = false
537
+ failedState.followUpDeliveryPending = true
538
+ failedState.followUpMessage = text
539
+ failedState.lastFollowUpError = String(error && (error.message || error)).slice(0, 300)
540
+ saveJSON(editStateFile, failedState)
541
+ }
542
+ } finally {
543
+ activeVerifications.delete(activeSession)
544
+ }
545
+ },
546
+ }
547
+ }
@@ -1,17 +1,9 @@
1
1
  {
2
2
  "name": "harness-enforcement",
3
- "description": "Enforcement plugin for Harness skills - adds hard gates for verification and circuit breaker in opencode",
4
- "version": "0.1.0",
5
- "author": "Miya Daniel",
6
- "license": "Apache-2.0",
3
+ "description": "Repository inventory for the opencode enforcement plugin and its standalone helper",
4
+ "version": "0.4.0",
5
+ "runtime": "index.mjs",
7
6
  "hooks": {
8
- "postEdit": "hooks/post-edit.js",
9
- "preComplete": "hooks/pre-complete.js"
10
- },
11
- "config": {
12
- "verificationRequired": true,
13
- "circuitBreakerEnabled": true,
14
- "maxRetries": 3,
15
- "verificationCommands": ["npm test", "npm run lint", "npm run build"]
7
+ "verify": "hooks/verify.js"
16
8
  }
17
9
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harness-everything",
3
- "version": "0.3.6",
3
+ "version": "0.4.0",
4
4
  "description": "Harness OS: An Orchestrated Agent Operating System for AI-driven Development",
5
5
  "main": "harness-everything/scripts/bootstrap.js",
6
6
  "bin": {
@@ -10,13 +10,23 @@
10
10
  "test": "node self-evolve/scripts/self-regression.js",
11
11
  "self-regression": "node self-evolve/scripts/self-regression.js",
12
12
  "test:mechanism": "node ci/mechanism-test.js",
13
- "test:consistency": "node ci/consistency-check.js",
13
+ "test:mutations": "node ci/mutation-check.js",
14
+ "test:tdd-quality": "node ci/mechanism-2s-tdd-quality.test.js",
15
+ "tdd:quality": "node tdd/scripts/quality-gate.js",
16
+ "test:consistency": "node ci/consistency-check.js && node ci/doc-capability-consistency.test.js",
17
+ "test:docs:capabilities": "node ci/doc-capability-consistency.test.js",
14
18
  "test:references": "node ci/reference-check.js",
15
- "test:release": "node ci/release-consistency-check.js --tag v0.3.3-beta",
19
+ "test:release": "node ci/release-consistency-check.js && node ci/mechanism-2x-release-automation.test.js && node ci/mechanism-2x-release-commit-message.test.js",
16
20
  "test:install": "node scripts/verify-install.js",
17
21
  "test:collision": "node ci/description-collision.js",
18
22
  "test:routing:skills": "node ci/skill-routing-check.js",
19
23
  "test:routing": "node ci/routing-check.js",
24
+ "test:routing:invariants": "node ci/invariant-routing.test.js && node ci/router-workflow-plan.test.js",
25
+ "plugin:sync": "node scripts/sync-openai-plugin.js",
26
+ "test:plugin:openai": "node ci/openai-plugin-package.test.js && node ci/openai-plugin-runtime.test.js",
27
+ "plugin:submission:build": "node scripts/build-openai-submission.js",
28
+ "test:plugin:submission": "node ci/openai-plugin-submission.test.js",
29
+ "test:platform:compatibility": "node ci/mechanism-2w-platform-compatibility.test.js",
20
30
  "benchmark:scaffold": "node benchmarks/run.js scaffold",
21
31
  "benchmark:status": "node benchmarks/run.js status",
22
32
  "eval:behavioral": "node behavioral-evals/run.js run",
@@ -41,6 +51,9 @@
41
51
  "bugs": {
42
52
  "url": "https://github.com/dyphn1/Harness-everything/issues"
43
53
  },
54
+ "publishConfig": {
55
+ "access": "public"
56
+ },
44
57
  "devDependencies": {
45
58
  "js-yaml": "^5.4.1",
46
59
  "@commitlint/cli": "^19.0.0",
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "harness-everything",
3
+ "version": "0.4.0",
4
+ "description": "Invariant-first engineering harness for routing, verification, and failure recovery while preserving agent autonomy.",
5
+ "author": {
6
+ "name": "Miya Daniel",
7
+ "url": "https://github.com/dyphn1"
8
+ },
9
+ "homepage": "https://github.com/dyphn1/Harness-everything",
10
+ "repository": "https://github.com/dyphn1/Harness-everything",
11
+ "license": "Apache-2.0",
12
+ "keywords": [
13
+ "agent-harness",
14
+ "orchestration",
15
+ "tdd",
16
+ "verification"
17
+ ],
18
+ "skills": "./skills/",
19
+ "hooks": "./hooks/hooks.json",
20
+ "interface": {
21
+ "displayName": "Harness Everything",
22
+ "shortDescription": "Route, verify, and recover coding work",
23
+ "longDescription": "Harness Everything adds reusable software-engineering workflows for task routing, test-driven development, verification, security review, documentation, failure recovery, and related coding-agent work. It keeps a small set of cross-cutting invariants while allowing the agent to choose, combine, reorder, or skip domain skills as appropriate.",
24
+ "developerName": "Miya Daniel",
25
+ "category": "Developer Tools",
26
+ "capabilities": [
27
+ "Interactive",
28
+ "Read",
29
+ "Write"
30
+ ],
31
+ "websiteURL": "https://github.com/dyphn1/Harness-everything",
32
+ "privacyPolicyURL": "https://github.com/dyphn1/Harness-everything/blob/main/PRIVACY.md",
33
+ "termsOfServiceURL": "https://github.com/dyphn1/Harness-everything/blob/main/TERMS.md",
34
+ "defaultPrompt": [
35
+ "Route this software task with Harness and use only the skills that help.",
36
+ "Review this change and verify it with objective evidence before claiming completion."
37
+ ]
38
+ }
39
+ }