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
@@ -7,32 +7,21 @@ const fs = require('fs');
7
7
  module.exports = {
8
8
  name: 'copilot',
9
9
  label: 'GitHub Copilot',
10
- getHarnessDir(workspaceRoot) {
11
- return path.join(workspaceRoot, '.github', 'harness-everything');
12
- },
13
- getStateDir(workspaceRoot) {
14
- return path.join(this.getHarnessDir(workspaceRoot), 'state');
15
- },
16
- getSkillsDir(workspaceRoot) {
17
- return path.join(workspaceRoot, '.github', 'skills');
18
- },
10
+ getHarnessDir(workspaceRoot) { return path.join(workspaceRoot, '.github', 'harness-everything'); },
11
+ getStateDir(workspaceRoot) { return path.join(this.getHarnessDir(workspaceRoot), 'state'); },
12
+ getSkillsDir(workspaceRoot) { return path.join(workspaceRoot, '.github', 'skills'); },
19
13
  getIgnorePatterns(workspaceRoot) {
20
14
  const patterns = ['.github/harness-everything/'];
21
15
  const skillsDir = path.join(workspaceRoot, '.github', 'skills');
22
16
  if (fs.existsSync(skillsDir)) {
23
17
  try {
24
- const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
25
- for (const entry of entries) {
26
- if (entry.isDirectory()) {
27
- const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
28
- if (fs.existsSync(skillMdPath)) {
29
- const content = fs.readFileSync(skillMdPath, 'utf8');
30
- const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
31
- if (authorLine && (authorLine.includes('Miya Daniel'))) {
32
- patterns.push(`.github/skills/${entry.name}/`);
33
- }
34
- }
35
- }
18
+ for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {
19
+ if (!entry.isDirectory()) continue;
20
+ const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
21
+ if (!fs.existsSync(skillMdPath)) continue;
22
+ const content = fs.readFileSync(skillMdPath, 'utf8');
23
+ const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
24
+ if (authorLine && authorLine.includes('Miya Daniel')) patterns.push(`.github/skills/${entry.name}/`);
36
25
  }
37
26
  } catch (e) {
38
27
  // Fallback or ignore to prevent breaking execution
@@ -41,19 +30,14 @@ module.exports = {
41
30
  return patterns;
42
31
  },
43
32
  isMatch(pattern, trimmedLine) {
44
- if (trimmedLine === '.github/' || trimmedLine === '.github') {
45
- return true;
46
- }
33
+ if (trimmedLine === '.github/' || trimmedLine === '.github') return true;
47
34
  if (pattern === '.github/harness-everything/') {
48
- return trimmedLine === '.github/harness-everything' ||
49
- trimmedLine === '.github/harness-everything/';
35
+ return trimmedLine === '.github/harness-everything' || trimmedLine === '.github/harness-everything/';
50
36
  }
51
37
  return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
52
38
  },
53
39
  isInstalled(workspaceRoot, userHome, isGlobal) {
54
- if (isGlobal) {
55
- return false; // Handled via global userPromptsDir check
56
- }
40
+ if (isGlobal) return false;
57
41
  return fs.existsSync(path.join(workspaceRoot, '.github', 'copilot-instructions.md'));
58
42
  },
59
43
  getSkillsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
@@ -64,46 +48,38 @@ module.exports = {
64
48
  label: '~/.agents/skills/',
65
49
  manifestPath: manifest.getManifestPath(globalAgentsDir),
66
50
  };
67
- } else {
68
- const githubDir = path.join(workspaceRoot, '.github');
69
- return {
70
- path: path.join(githubDir, 'skills'),
71
- label: '.github/skills/',
72
- manifestPath: manifest.getManifestPath(githubDir),
73
- };
74
51
  }
52
+ const githubDir = path.join(workspaceRoot, '.github');
53
+ return {
54
+ path: path.join(githubDir, 'skills'),
55
+ label: '.github/skills/',
56
+ manifestPath: manifest.getManifestPath(githubDir),
57
+ };
75
58
  },
76
59
  install({ isGlobal, targetWorkspaceRoot, getUserPromptsDir, advisory }) {
77
60
  if (!isGlobal) {
78
61
  const targetFile = path.join(targetWorkspaceRoot, '.github', 'copilot-instructions.md');
79
62
  advisory.injectAdvisoryText(targetFile, '# Copilot Instructions', '.github/copilot-instructions.md');
80
- } else {
81
- try {
82
- const promptsDir = getUserPromptsDir();
83
- if (!fs.existsSync(promptsDir)) {
84
- fs.mkdirSync(promptsDir, { recursive: true });
85
- }
86
- const vscodeInstFile = path.join(promptsDir, 'harness.instructions.md');
87
- fs.writeFileSync(vscodeInstFile, advisory.buildCopilotGlobalContent(), 'utf8');
88
- console.log(` ✅ Installed global Copilot instructions to VS Code: ${vscodeInstFile}`);
89
- } catch (err) {
90
- console.warn(` ⚠️ Failed to write VS Code user prompts folder: ${err.message}`);
91
- }
63
+ return;
92
64
  }
65
+ const promptsDir = getUserPromptsDir();
66
+ if (!fs.existsSync(promptsDir)) fs.mkdirSync(promptsDir, { recursive: true });
67
+ const vscodeInstFile = path.join(promptsDir, 'harness.instructions.md');
68
+ advisory.assertHarnessOwnedOrAbsent(vscodeInstFile, 'global Copilot instructions');
69
+ fs.writeFileSync(vscodeInstFile, advisory.buildCopilotGlobalContent(), 'utf8');
70
+ console.log(` ✅ Installed global Copilot instructions to VS Code: ${vscodeInstFile}`);
93
71
  },
94
72
  uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome, getUserPromptsDir, cleanEmptyDirs }) {
95
73
  const advisory = require('../../../../scripts/lib/advisory-text');
96
- if (removeLocal) {
97
- advisory.removeAdvisoryText(path.join(workspaceRoot, '.github', 'copilot-instructions.md'));
98
- }
74
+ if (removeLocal) advisory.removeAdvisoryText(path.join(workspaceRoot, '.github', 'copilot-instructions.md'));
99
75
  if (removeGlobal) {
100
76
  const promptsDir = getUserPromptsDir();
101
77
  const vscodeInstFile = path.join(promptsDir, 'harness.instructions.md');
102
- if (fs.existsSync(vscodeInstFile)) {
78
+ if (fs.existsSync(vscodeInstFile) && advisory.hasHarnessMarker(fs.readFileSync(vscodeInstFile, 'utf8'))) {
103
79
  fs.unlinkSync(vscodeInstFile);
104
80
  console.log(` ✅ Removed global Copilot instructions: ${vscodeInstFile}`);
105
81
  }
106
82
  cleanEmptyDirs(promptsDir, [userHome]);
107
83
  }
108
84
  }
109
- };
85
+ };
@@ -1,57 +1,108 @@
1
1
  const path = require('path');
2
2
  const fs = require('fs');
3
3
 
4
+ const GLOBAL_MARKER = 'hermes-global.json';
5
+
6
+ function appendHarnessSkillPatterns(patterns, skillsDir, prefix) {
7
+ if (!fs.existsSync(skillsDir)) return;
8
+ try {
9
+ for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {
10
+ if (!entry.isDirectory()) continue;
11
+ const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
12
+ if (!fs.existsSync(skillMdPath)) continue;
13
+ const content = fs.readFileSync(skillMdPath, 'utf8');
14
+ const authorLine = content.split('\n').find(line => line.trim().startsWith('author:'));
15
+ if (authorLine && authorLine.includes('Miya Daniel')) patterns.push(`${prefix}/${entry.name}/`);
16
+ }
17
+ } catch (e) {
18
+ // Best effort only; ignore-pattern generation must not break installation.
19
+ }
20
+ }
21
+
4
22
  module.exports = {
5
23
  name: 'hermes',
6
24
  label: 'Hermes Agent',
25
+ getHarnessDir(workspaceRoot) {
26
+ return path.join(workspaceRoot, '.hermes', 'harness-everything');
27
+ },
7
28
  getStateDir(workspaceRoot) {
8
29
  return path.join(workspaceRoot, '.hermes', 'harness-state');
9
30
  },
31
+ getSkillsDir(workspaceRoot) {
32
+ // Hermes discovers trusted project skills from `.agents/skills/` as well
33
+ // as `.hermes/skills/`. Use the shared Agent Skills location locally so
34
+ // explicit `--copy` and canonical auto mode are both discoverable.
35
+ return path.join(workspaceRoot, '.agents', 'skills');
36
+ },
10
37
  getIgnorePatterns(workspaceRoot) {
11
38
  const patterns = [];
12
- if (fs.existsSync(path.join(workspaceRoot, '.hermes', 'harness-state'))) {
13
- patterns.push('.hermes/harness-state/');
14
- }
39
+ if (fs.existsSync(path.join(workspaceRoot, '.hermes', 'harness-state'))) patterns.push('.hermes/harness-state/');
40
+ if (fs.existsSync(path.join(workspaceRoot, '.hermes', 'harness-everything'))) patterns.push('.hermes/harness-everything/');
41
+ appendHarnessSkillPatterns(patterns, path.join(workspaceRoot, '.agents', 'skills'), '.agents/skills');
15
42
  return patterns;
16
43
  },
17
44
  isMatch(pattern, trimmedLine) {
18
- if (pattern === '.hermes/harness-state/') {
19
- return trimmedLine === '.hermes/' ||
20
- trimmedLine === '.hermes' ||
21
- trimmedLine === '.hermes/harness-state' ||
22
- trimmedLine === '.hermes/harness-state/';
45
+ if (pattern === '.hermes/harness-state/' || pattern === '.hermes/harness-everything/') {
46
+ return trimmedLine === '.hermes/' ||
47
+ trimmedLine === '.hermes' ||
48
+ trimmedLine === pattern.slice(0, -1) ||
49
+ trimmedLine === pattern;
23
50
  }
51
+ if ((trimmedLine === '.agents/' || trimmedLine === '.agents') && pattern.startsWith('.agents/skills/')) return true;
24
52
  return trimmedLine === pattern || trimmedLine === pattern.slice(0, -1);
25
53
  },
26
54
  isInstalled(workspaceRoot, userHome, isGlobal) {
27
55
  if (isGlobal) {
28
- return false;
56
+ return fs.existsSync(path.join(userHome, '.hermes', 'skills')) ||
57
+ fs.existsSync(path.join(userHome, '.agents', 'harness-everything', GLOBAL_MARKER));
29
58
  }
30
59
  return fs.existsSync(path.join(workspaceRoot, '.hermes.md'));
31
60
  },
32
61
  getSkillsTarget({ workspaceRoot, userHome, isGlobal, manifest }) {
33
62
  if (isGlobal) {
34
- const globalAgentsDir = path.join(userHome, '.agents');
63
+ const hermesDir = path.join(userHome, '.hermes');
35
64
  return {
36
- path: path.join(globalAgentsDir, 'skills'),
37
- label: '~/.agents/skills/',
38
- manifestPath: manifest.getManifestPath(globalAgentsDir),
65
+ path: path.join(hermesDir, 'skills'),
66
+ label: '~/.hermes/skills/',
67
+ manifestPath: manifest.getManifestPath(hermesDir),
39
68
  };
40
69
  }
41
- return null;
70
+ const hermesDir = path.join(workspaceRoot, '.hermes');
71
+ return {
72
+ path: path.join(workspaceRoot, '.agents', 'skills'),
73
+ label: '.agents/skills/',
74
+ manifestPath: manifest.getManifestPath(hermesDir),
75
+ };
42
76
  },
43
- install({ isGlobal, targetWorkspaceRoot, advisory }) {
77
+ install({ isGlobal, targetWorkspaceRoot, advisory, userHome }) {
44
78
  if (!isGlobal) {
45
79
  const targetFile = path.join(targetWorkspaceRoot, '.hermes.md');
46
80
  advisory.injectAdvisoryText(targetFile, '# .hermes.md', '.hermes.md');
47
81
  } else {
48
- console.log(` ℹ️ Hermes Agent has no documented global instructions file (it reads .hermes.md from the current project directory only) - skipping global install for --hermes.`);
82
+ // Hermes has no global advisory-context file. Keep a tiny Harness-owned
83
+ // marker in the existing global bookkeeping home so non-interactive
84
+ // uninstall can distinguish an intentional Hermes global install from
85
+ // an unrelated ~/.hermes directory without changing Hermes config.
86
+ const markerDir = path.join(userHome, '.agents', 'harness-everything');
87
+ fs.mkdirSync(markerDir, { recursive: true });
88
+ fs.writeFileSync(
89
+ path.join(markerDir, GLOBAL_MARKER),
90
+ JSON.stringify({ package: 'harness-everything', platform: 'hermes' }, null, 2),
91
+ 'utf8'
92
+ );
93
+ console.log(' ℹ️ Hermes global skills install to ~/.hermes/skills/. Project advisory context remains project-scoped via .hermes.md.');
49
94
  }
50
95
  },
51
- uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome }) {
96
+ uninstall({ removeLocal, removeGlobal, workspaceRoot, userHome, cleanEmptyDirs }) {
52
97
  const advisory = require('../../../../scripts/lib/advisory-text');
53
- if (removeLocal) {
54
- advisory.removeAdvisoryText(path.join(workspaceRoot, '.hermes.md'));
98
+ if (removeLocal) advisory.removeAdvisoryText(path.join(workspaceRoot, '.hermes.md'));
99
+ if (removeGlobal) {
100
+ const marker = path.join(userHome, '.agents', 'harness-everything', GLOBAL_MARKER);
101
+ if (fs.existsSync(marker)) fs.unlinkSync(marker);
102
+ if (typeof cleanEmptyDirs === 'function') {
103
+ cleanEmptyDirs(path.join(userHome, '.hermes', 'skills'), [userHome]);
104
+ cleanEmptyDirs(path.dirname(marker), [userHome]);
105
+ }
55
106
  }
56
107
  }
57
- };
108
+ };
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const {
7
+ getWorkspaceRoot,
8
+ getSessionId,
9
+ getSessionDir,
10
+ writeCurrentSession,
11
+ pruneStaleSessions
12
+ } = require('./lib/harness-state');
13
+
14
+ const POLICY = [
15
+ 'Harness Cognitive OS policy is active.',
16
+ 'Use Discover -> Think -> Try -> Summarize -> Record as a lightweight reasoning loop.',
17
+ 'Cross-cutting invariants:',
18
+ '- Route before execution: establish task scope before mutating work.',
19
+ '- Verify before claim: require objective evidence appropriate to the change.',
20
+ '- Re-plan on repetition: after 3 same-signature failures, zoom out instead of repeating the same attempt.',
21
+ 'Domain skills are advisory. Do not enforce a universal workflow order; choose the smallest useful skill/tool set.'
22
+ ].join('\n');
23
+
24
+ function readPayload() {
25
+ if (process.stdin.isTTY) return null;
26
+ try {
27
+ const raw = fs.readFileSync(0, 'utf8').trim();
28
+ return raw ? JSON.parse(raw) : null;
29
+ } catch (err) {
30
+ return null;
31
+ }
32
+ }
33
+
34
+ function removeIfPresent(file) {
35
+ try {
36
+ if (fs.existsSync(file)) fs.unlinkSync(file);
37
+ } catch (err) {
38
+ // Session reset is best effort; a stale breaker must never block startup.
39
+ }
40
+ }
41
+
42
+ function handoffContext(sessionDir) {
43
+ try {
44
+ const handoff = JSON.parse(fs.readFileSync(path.join(sessionDir, 'handoff-state.json'), 'utf8'));
45
+ if (handoff.status !== 'failed') return '';
46
+ const detail = String(handoff.errorSummary || 'No error snippet available').trim().slice(-300);
47
+ return `\nPrevious session checkpoint: ${handoff.tool || 'unknown'} failed${handoff.exitCode ? ` (exit ${handoff.exitCode})` : ''}.\nReview the failure evidence before continuing.\n${detail}`;
48
+ } catch (err) {
49
+ return '';
50
+ }
51
+ }
52
+
53
+ function main() {
54
+ const payload = readPayload();
55
+ const root = getWorkspaceRoot(payload);
56
+ const sessionId = getSessionId(payload);
57
+ let additionalContext = POLICY;
58
+
59
+ if (root) {
60
+ try {
61
+ pruneStaleSessions(root);
62
+ writeCurrentSession(root, sessionId);
63
+ const sessionDir = getSessionDir(root, sessionId);
64
+ removeIfPresent(path.join(sessionDir, 'rule-of-3-state.json'));
65
+ removeIfPresent(path.join(sessionDir, 'zoom-out-report.md'));
66
+ removeIfPresent(path.join(sessionDir, 'subagent-scope-state.json'));
67
+ additionalContext += handoffContext(sessionDir);
68
+ } catch (err) {
69
+ // Policy injection remains useful even if runtime state is unavailable.
70
+ }
71
+ }
72
+
73
+ console.log(JSON.stringify({
74
+ hookSpecificOutput: {
75
+ hookEventName: 'SessionStart',
76
+ additionalContext
77
+ }
78
+ }));
79
+ }
80
+
81
+ main();
@@ -27,7 +27,8 @@ process.stdin.on('end', () => {
27
27
  const isFailure = explicitFailure || (exitCode === undefined && stderrSignal && looksLikeError);
28
28
  const errorText = (stderrSignal ? stderr : stdout) || '';
29
29
 
30
- const stateFile = path.join(getSessionDir(getWorkspaceRoot(), payload.session_id), 'rule-of-3-state.json');
30
+ const root = getWorkspaceRoot(payload);
31
+ const stateFile = path.join(getSessionDir(root, payload.session_id || payload.sessionId), 'rule-of-3-state.json');
31
32
 
32
33
  let state = { count: 0, lastHash: null, zoomOutResolved: false, zoomOutCycles: 0, lastFailureAt: 0 };
33
34
  if (fs.existsSync(stateFile)) {
@@ -39,7 +40,7 @@ process.stdin.on('end', () => {
39
40
  // Hash includes: error message, file path, command attempted, and failure category
40
41
  const filePath = payload.tool_input?.file_path || payload.tool_input?.filePath || '';
41
42
  const command = payload.tool_input?.command || '';
42
-
43
+
43
44
  // Categorize failure type for context-aware thresholds
44
45
  let category = 'unknown';
45
46
  if (/SyntaxError|Unexpected token|Syntax Error/i.test(errorText)) {
@@ -55,7 +56,7 @@ process.stdin.on('end', () => {
55
56
  } else if (/dependency|module not found|Cannot find module|模組.*找不到/i.test(errorText)) {
56
57
  category = 'dependency';
57
58
  }
58
-
59
+
59
60
  // Normalize error text with context for better loop detection
60
61
  const normalized = errorText.slice(-400)
61
62
  .toLowerCase()
@@ -63,7 +64,7 @@ process.stdin.on('end', () => {
63
64
  .replace(/\d+/g, '#')
64
65
  .replace(/\s+/g, ' ')
65
66
  .trim();
66
-
67
+
67
68
  // Include file path and command in hash for better context
68
69
  const contextString = `${category}:${filePath}:${command}:${normalized.slice(-200)}`;
69
70
  const hash = crypto.createHash('md5').update(contextString).digest('hex');
@@ -94,10 +95,10 @@ process.stdin.on('end', () => {
94
95
  // New signature = new problem: the zoom-out cycle budget starts over.
95
96
  state.zoomOutCycles = 0;
96
97
  }
97
-
98
+
98
99
  // Store threshold for this failure type
99
100
  state.threshold = threshold;
100
-
101
+
101
102
  // Any fresh failure re-arms the breaker. Without this, a signature that
102
103
  // failed again after a success (or after a zoom-out release) would keep
103
104
  // zoomOutResolved=true and the breaker could never trip on it again.
@@ -116,9 +117,9 @@ process.stdin.on('end', () => {
116
117
  fs.writeFileSync(stateFile, JSON.stringify(state, null, 2), 'utf8');
117
118
  }
118
119
  }
119
-
120
+
120
121
  } catch (err) {
121
122
  // silently fail
122
123
  }
123
124
  process.exit(0);
124
- });
125
+ });
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // Rule of 3 circuit breaker (PreToolUse: Bash|PowerShell|Edit|Write).
2
+ // Rule of 3 circuit breaker (PreToolUse: Bash|PowerShell|Edit|Write|apply_patch).
3
3
  //
4
4
  // Tripping the breaker forces REFLECTION, not surrender. The most common
5
5
  // agent failure mode is drilling deeper on one unverified assumption, so the
@@ -34,7 +34,7 @@ function readState(stateFile) {
34
34
 
35
35
  function isTripped(state) {
36
36
  if (!state || state.zoomOutResolved) return false;
37
-
37
+
38
38
  // Use context-aware thresholds if available, otherwise default to 3
39
39
  const threshold = state.threshold || 3;
40
40
  return state.count >= threshold;
@@ -47,7 +47,7 @@ function anySessionTripped(root) {
47
47
  // The one mutation allowed while tripped: writing the reflection report.
48
48
  const ALLOWED_WRITE_TOOLS = new Set([
49
49
  'Write', 'Edit', 'create_file', 'replace_string_in_file',
50
- 'insert_edit_into_file', 'write_file', 'edit_file'
50
+ 'insert_edit_into_file', 'write_file', 'edit_file', 'apply_patch'
51
51
  ]);
52
52
 
53
53
  function isReportWrite(payload, reportFile) {
@@ -56,8 +56,15 @@ function isReportWrite(payload, reportFile) {
56
56
  if (!ALLOWED_WRITE_TOOLS.has(toolName)) return false;
57
57
  const input = payload.tool_input || payload.toolInput || payload.input || {};
58
58
  const target = input.file_path || input.filePath || input.path || input.file;
59
- if (!target) return false;
60
- return path.resolve(target).toLowerCase() === path.resolve(reportFile).toLowerCase();
59
+ if (target && path.resolve(target).toLowerCase() === path.resolve(reportFile).toLowerCase()) return true;
60
+ if (toolName !== 'apply_patch') return false;
61
+
62
+ const patch = input.patch || input.command || input.content || '';
63
+ const base = payload.cwd || process.cwd();
64
+ const files = [...String(patch).matchAll(/^\*\*\* (?:Update|Add|Delete) File:\s*(.+?)\s*$/gm)]
65
+ .map(match => match[1]);
66
+ const reportPath = path.resolve(reportFile).toLowerCase();
67
+ return files.length > 0 && files.every(file => path.resolve(base, file).toLowerCase() === reportPath);
61
68
  }
62
69
 
63
70
  // A report only counts if it was written AFTER the failure that tripped the
@@ -75,7 +82,7 @@ function blockForReflection(state, reportFile) {
75
82
  console.error(`[CRITICAL] RULE OF 3 CIRCUIT BREAKER TRIGGERED!`);
76
83
  console.error(`The same failure signature has now occurred 3 times.`);
77
84
  console.error(`Error Signature: ${state.lastHash}`);
78
- console.error(`\nMutating tools (Bash/PowerShell/Edit/Write) are locked - not because you`);
85
+ console.error(`\nMutating tools (Bash/PowerShell/Edit/Write/apply_patch) are locked - not because you`);
79
86
  console.error(`must wait for a human, but because you must stop drilling and rebuild the`);
80
87
  console.error(`full picture first. Do NOT ask the Human Partner yet.`);
81
88
  console.error(`\nACTION REQUIRED (reflect first):`);
@@ -112,8 +119,8 @@ function blockForHumanDecision(state) {
112
119
 
113
120
  function main(payload) {
114
121
  try {
115
- const root = getWorkspaceRoot();
116
- const sessionDir = getSessionDir(root, payload && payload.session_id);
122
+ const root = getWorkspaceRoot(payload);
123
+ const sessionDir = getSessionDir(root, payload && (payload.session_id || payload.sessionId));
117
124
  const stateFile = path.join(sessionDir, 'rule-of-3-state.json');
118
125
  const reportFile = path.join(sessionDir, 'zoom-out-report.md');
119
126
 
@@ -151,22 +158,23 @@ function main(payload) {
151
158
  }
152
159
  }
153
160
 
154
- // Fast path: skip stdin entirely unless some session's breaker is actually
155
- // tripped (also keeps manual terminal runs instant).
156
- let tripped = false;
157
- try {
158
- tripped = anySessionTripped(getWorkspaceRoot());
159
- } catch (err) {
160
- tripped = false; // fail open
161
- }
162
-
163
- if (!tripped) {
164
- process.exit(0);
161
+ // Read the payload before the fast path. The session registry may point at a
162
+ // different workspace than process.cwd() after an agent changes directory;
163
+ // checking the cwd first would skip an active breaker in the bound session.
164
+ function runForPayload(payload) {
165
+ let tripped = false;
166
+ try {
167
+ tripped = anySessionTripped(getWorkspaceRoot(payload));
168
+ } catch (err) {
169
+ tripped = false; // fail open
170
+ }
171
+ if (!tripped) process.exit(0);
172
+ main(payload);
165
173
  }
166
174
 
167
175
  if (process.stdin.isTTY) {
168
176
  // Manual run in a terminal - no payload is coming.
169
- main(null);
177
+ runForPayload(null);
170
178
  } else {
171
179
  let raw = '';
172
180
  let finished = false;
@@ -175,7 +183,7 @@ if (process.stdin.isTTY) {
175
183
  finished = true;
176
184
  let payload = null;
177
185
  try { payload = JSON.parse(raw); } catch (err) { /* no payload */ }
178
- main(payload);
186
+ runForPayload(payload);
179
187
  };
180
188
  // Claude Code closes stdin right after writing the payload; the timer is a
181
189
  // safety net so an odd caller that never closes stdin can't hang the hook.
@@ -29,8 +29,9 @@ process.stdin.on('end', () => {
29
29
 
30
30
  function processState(payload) {
31
31
  try {
32
- const sessionId = payload && payload.session_id;
33
- const stateFile = path.join(getSessionDir(getWorkspaceRoot(), sessionId), 'handoff-state.json');
32
+ const sessionId = payload && (payload.session_id || payload.sessionId);
33
+ const root = getWorkspaceRoot(payload);
34
+ const stateFile = path.join(getSessionDir(root, sessionId), 'handoff-state.json');
34
35
 
35
36
  // Merge into the existing state rather than replacing it, so the
36
37
  // failure/idle status and the Stop-gate milestones can coexist.
@@ -40,7 +41,7 @@ function processState(payload) {
40
41
  }
41
42
 
42
43
  if (payload) {
43
- // Claude Code nests tool output under tool_response, not at the top
44
+ // Hook hosts nest tool output under tool_response, not at the top
44
45
  // level, and uses tool_name rather than tool. A numeric exit code
45
46
  // also isn't guaranteed to be present at all - only trust it when
46
47
  // it's actually a number; fall back to a stderr signal otherwise.
@@ -76,7 +77,7 @@ function processState(payload) {
76
77
 
77
78
  // Milestones for the Stop gate: when did the last mutation happen, and
78
79
  // has any verification-ish command succeeded since.
79
- if (toolName === 'Edit' || toolName === 'Write') {
80
+ if (toolName === 'Edit' || toolName === 'Write' || toolName === 'apply_patch') {
80
81
  state.lastEditAt = Date.now();
81
82
  } else if ((toolName === 'Bash' || toolName === 'PowerShell') && !isFailed) {
82
83
  const command = (payload.tool_input && payload.tool_input.command) || '';
@@ -21,8 +21,8 @@ function decide(payload) {
21
21
  process.exit(0);
22
22
  }
23
23
 
24
- const root = getWorkspaceRoot();
25
- const sessionDir = getSessionDir(root, payload && payload.session_id);
24
+ const root = getWorkspaceRoot(payload);
25
+ const sessionDir = getSessionDir(root, payload && (payload.session_id || payload.sessionId));
26
26
  const handoffFile = path.join(sessionDir, 'handoff-state.json');
27
27
  const gateFile = path.join(sessionDir, 'stop-gate-state.json');
28
28