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,272 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const crypto = require('crypto');
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ let getWorkspaceRoot;
8
+ try {
9
+ ({ getWorkspaceRoot } = require('../../scripts/lib/workspace'));
10
+ } catch (err) {
11
+ getWorkspaceRoot = () => null;
12
+ }
13
+
14
+ // NOTE: this script ships standalone - it is copied whole into every install
15
+ // target. When the canonical workspace resolver is not present, persistence
16
+ // fails closed rather than guessing a project root (issue #42).
17
+
18
+ const SECRET_PATTERNS = [
19
+ ['github-token', /\bgh[pousr]_[A-Za-z0-9]{20,}\b/],
20
+ ['openai-key', /\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\b/],
21
+ ['aws-access-key', /\bAKIA[0-9A-Z]{16}\b/],
22
+ ['private-key', /-----BEGIN (?:RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----/],
23
+ ['jwt', /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/],
24
+ ['credential-assignment', /\b(?:api[_-]?key|access[_-]?token|auth[_-]?token|password|passwd|secret)\s*[:=]\s*["']?[A-Za-z0-9_./+=:-]{8,}/i],
25
+ ];
26
+
27
+ const INJECTION_PATTERNS = [
28
+ ['ignore-prior-instructions', /\bignore\s+(?:all\s+)?(?:previous|prior|above)\s+(?:instructions|messages|rules)\b/i],
29
+ ['replace-instructions', /\b(?:follow|obey)\s+(?:these|the following)\s+instructions\s+instead\b/i],
30
+ ['role-override', /\byou\s+are\s+now\b/i],
31
+ ['instruction-override', /\boverride\s+(?:the\s+)?(?:system|developer|safety|previous|prior)\s+(?:instructions|message|prompt|rules)\b/i],
32
+ ['system-prompt-exfiltration', /\b(?:reveal|print|show|expose)\s+(?:the\s+)?(?:system|developer)\s+prompt\b/i],
33
+ ['role-token', /<\|(?:system|developer|assistant)\|>/i],
34
+ ['jailbreak-marker', /\b(?:jailbreak|prompt[- ]injection)\b/i],
35
+ ];
36
+
37
+ function parseArgs(argv) {
38
+ let memoryText = null;
39
+ let source = 'manual-unspecified';
40
+ for (let index = 0; index < argv.length; index++) {
41
+ const token = argv[index];
42
+ if (token === '--help' || token === '-h') return { help: true, memoryText: null, source };
43
+ if (token === '--source') {
44
+ if (index + 1 >= argv.length) throw new Error('--source requires a value');
45
+ source = argv[++index];
46
+ continue;
47
+ }
48
+ if (token.startsWith('--source=')) {
49
+ source = token.slice('--source='.length);
50
+ continue;
51
+ }
52
+ if (token.startsWith('-')) throw new Error(`unknown option: ${token}`);
53
+ if (memoryText !== null) throw new Error('exactly one memory rule positional argument is allowed');
54
+ memoryText = token;
55
+ }
56
+ return { help: false, memoryText, source };
57
+ }
58
+
59
+ function normalizeSource(value) {
60
+ const source = String(value || 'manual-unspecified').trim();
61
+ if (!source) return 'manual-unspecified';
62
+ if (/[\r\n\0]/.test(source)) throw new Error('source provenance must be one line');
63
+ if (source.length > 240) throw new Error('source provenance exceeds 240 characters');
64
+ const secretReasons = detectReasonCodes(source, SECRET_PATTERNS);
65
+ if (secretReasons.length > 0) throw new Error(`source provenance rejected by secret screening: ${secretReasons.join(', ')}`);
66
+ return source;
67
+ }
68
+
69
+ function detectReasonCodes(text, patterns) {
70
+ const reasons = [];
71
+ for (const [reasonCode, pattern] of patterns) {
72
+ if (pattern.test(text)) reasons.push(reasonCode);
73
+ }
74
+ return reasons;
75
+ }
76
+
77
+ function screenMemoryForPersistence(text) {
78
+ const value = String(text || '');
79
+ const secretReasonCodes = detectReasonCodes(value, SECRET_PATTERNS);
80
+ const injectionReasonCodes = detectReasonCodes(value, INJECTION_PATTERNS);
81
+ return {
82
+ allowed: secretReasonCodes.length === 0 && injectionReasonCodes.length === 0,
83
+ secretReasonCodes,
84
+ injectionReasonCodes,
85
+ };
86
+ }
87
+
88
+ function calculateSimilarity(text1, text2) {
89
+ const words1 = text1.toLowerCase().split(/\s+/);
90
+ const words2 = text2.toLowerCase().split(/\s+/);
91
+ const set1 = new Set(words1);
92
+ const set2 = new Set(words2);
93
+ let intersection = 0;
94
+ for (const word of set1) {
95
+ if (set2.has(word)) intersection++;
96
+ }
97
+ const union = set1.size + set2.size - intersection;
98
+ return union === 0 ? 0 : intersection / union;
99
+ }
100
+
101
+ function scoreRuleQuality(ruleText, existingRules = []) {
102
+ let score = 0;
103
+ if (/\.\w{2,4}/.test(ruleText)) score += 2;
104
+ if (/Error|Exception|Warning|錯誤|異常|警告/.test(ruleText)) score += 2;
105
+ if (/\b(test|lint|build|verify|check|測試|檢查)\b/i.test(ruleText)) score += 1;
106
+ if (/^(Always|Never|Check|Verify|Prefer|Avoid|Use|不要|總是|檢查|驗證|避免|使用)/i.test(ruleText)) score += 3;
107
+ if (/^(should|must|will|needs? to|ought|應該|必須|需要)/i.test(ruleText)) score += 2;
108
+ const isDuplicate = existingRules.some(existing => calculateSimilarity(ruleText, existing) > 0.7);
109
+ if (!isDuplicate) score += 3;
110
+ if (ruleText.length > 20 && ruleText.length < 200) score += 1;
111
+ return Math.min(score, 10);
112
+ }
113
+
114
+ function extractExistingRules(rulesFile) {
115
+ if (!fs.existsSync(rulesFile)) return [];
116
+ try {
117
+ const content = fs.readFileSync(rulesFile, 'utf8');
118
+ const ruleMatches = content.match(/^- .+$/gm) || [];
119
+ return ruleMatches.map(rule => rule.substring(2));
120
+ } catch (err) {
121
+ return [];
122
+ }
123
+ }
124
+
125
+ function contentHash(text) {
126
+ return crypto.createHash('sha256').update(String(text), 'utf8').digest('hex');
127
+ }
128
+
129
+ function persistMemory({ memoryText, source = 'manual-unspecified' }) {
130
+ const ruleText = String(memoryText || '').trim();
131
+ if (!ruleText) return { ok: false, exitCode: 1, message: 'memory rule is required' };
132
+
133
+ const screening = screenMemoryForPersistence(ruleText);
134
+ if (!screening.allowed) {
135
+ const reasons = [...screening.secretReasonCodes, ...screening.injectionReasonCodes];
136
+ return {
137
+ ok: false,
138
+ exitCode: 2,
139
+ screening,
140
+ message: `memory rejected by persistence screening: ${reasons.join(', ')}`,
141
+ };
142
+ }
143
+
144
+ let provenance;
145
+ try {
146
+ provenance = normalizeSource(source);
147
+ } catch (err) {
148
+ return { ok: false, exitCode: 2, screening, message: err.message };
149
+ }
150
+
151
+ const currentDir = getWorkspaceRoot();
152
+ if (!currentDir) {
153
+ return {
154
+ ok: false,
155
+ exitCode: 1,
156
+ screening,
157
+ message: 'Cannot persist project memory without a resolved git workspace.',
158
+ };
159
+ }
160
+
161
+ const memoryDir = path.join(currentDir, 'memories', 'repo');
162
+ const rulesFile = path.join(memoryDir, 'RULES.md');
163
+ const existingRules = extractExistingRules(rulesFile);
164
+ const qualityScore = scoreRuleQuality(ruleText, existingRules);
165
+ if (qualityScore < 5) {
166
+ return {
167
+ ok: false,
168
+ exitCode: 1,
169
+ screening,
170
+ qualityScore,
171
+ message: `Rule rejected - score ${qualityScore}/10 (minimum 5 required)`,
172
+ };
173
+ }
174
+
175
+ const isDuplicate = existingRules.some(existing => calculateSimilarity(ruleText, existing) > 0.7);
176
+ if (isDuplicate) {
177
+ return {
178
+ ok: false,
179
+ exitCode: 1,
180
+ screening,
181
+ qualityScore,
182
+ message: 'Rule rejected - similar rule already exists',
183
+ };
184
+ }
185
+
186
+ fs.mkdirSync(memoryDir, { recursive: true });
187
+ const timestamp = new Date().toISOString().split('T')[0];
188
+ const hash = contentHash(ruleText);
189
+ const formattedMemory = [
190
+ '',
191
+ `## [${timestamp}] Self-Evolution Insight (Quality: ${qualityScore}/10)`,
192
+ `Source: ${provenance}`,
193
+ `Content-SHA256: ${hash}`,
194
+ 'Screening: secret=clear; prompt-injection=clear',
195
+ `- ${ruleText}`,
196
+ '',
197
+ ].join('\n');
198
+ fs.appendFileSync(rulesFile, formattedMemory, 'utf8');
199
+ return {
200
+ ok: true,
201
+ exitCode: 0,
202
+ rulesFile,
203
+ qualityScore,
204
+ source: provenance,
205
+ contentSha256: hash,
206
+ screening,
207
+ };
208
+ }
209
+
210
+ function printHelp() {
211
+ console.log(`Append a short defensive rule to memories/repo/RULES.md.
212
+
213
+ Usage: node persist-memory.js "<insight to remember>" [--source <provenance>]
214
+
215
+ The rule must be universal and actionable. --source records where the lesson came
216
+ from (for example issue-85, verifier-stage-3, or manual-review); when omitted the
217
+ source is recorded as manual-unspecified.
218
+
219
+ Persistence gates:
220
+ - secret-like tokens and credential material are rejected before any write
221
+ - prompt-injection-shaped instructions are rejected before any write
222
+ - source provenance is recorded with a SHA-256 content fingerprint
223
+ - minimum quality score of 5/10 and similarity deduplication still apply`);
224
+ }
225
+
226
+ if (require.main === module) {
227
+ let parsed;
228
+ try {
229
+ parsed = parseArgs(process.argv.slice(2));
230
+ } catch (err) {
231
+ console.error(`[self-evolve] ${err.message}`);
232
+ process.exit(1);
233
+ }
234
+
235
+ if (parsed.help) {
236
+ printHelp();
237
+ process.exit(0);
238
+ }
239
+ if (!parsed.memoryText) {
240
+ console.error('Usage: node persist-memory.js "<insight to remember>" [--source <provenance>]');
241
+ process.exit(1);
242
+ }
243
+
244
+ try {
245
+ const result = persistMemory(parsed);
246
+ if (!result.ok) {
247
+ const prefix = result.exitCode === 2 ? '[Persistence Screening]' : '[Quality Gate]';
248
+ console.error(`${prefix} ${result.message}`);
249
+ if (result.qualityScore !== undefined && result.qualityScore < 5) {
250
+ console.error('Suggestions to improve:');
251
+ console.error('- Be more specific (mention file types, error patterns)');
252
+ console.error('- Start with action verbs (Always, Never, Check, Verify)');
253
+ console.error('- Ensure the rule is actionable and not already captured');
254
+ }
255
+ process.exit(result.exitCode);
256
+ }
257
+ console.log(`[Success] Memory persisted to ${result.rulesFile} (Quality: ${result.qualityScore}/10, Source: ${result.source})`);
258
+ } catch (err) {
259
+ console.error(`[Error] Failed to write memory: ${err.message}`);
260
+ process.exit(1);
261
+ }
262
+ }
263
+
264
+ module.exports = {
265
+ calculateSimilarity,
266
+ contentHash,
267
+ extractExistingRules,
268
+ parseArgs,
269
+ persistMemory,
270
+ scoreRuleQuality,
271
+ screenMemoryForPersistence,
272
+ };
@@ -0,0 +1,253 @@
1
+ #!/usr/bin/env node
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ let getWorkspaceRoot;
5
+ try {
6
+ ({ getWorkspaceRoot } = require('../../scripts/lib/workspace'));
7
+ } catch (err) {
8
+ getWorkspaceRoot = () => null;
9
+ }
10
+
11
+ const workspaceRoot = getWorkspaceRoot();
12
+ if (!workspaceRoot) {
13
+ console.error('[self-evolve] Cannot register a dynamic skill without a resolved git workspace.');
14
+ process.exit(1);
15
+ }
16
+
17
+ function loadManifestHelper() {
18
+ const candidates = [
19
+ path.join(__dirname, '../../scripts/lib/manifest'),
20
+ path.join(__dirname, '../scripts/lib/manifest'),
21
+ path.join(__dirname, '../../../scripts/lib/manifest'),
22
+ path.join(workspaceRoot, 'scripts/lib/manifest'),
23
+ path.join(workspaceRoot, 'harness-everything/scripts/lib/manifest'),
24
+ ];
25
+ for (const cand of candidates) {
26
+ try {
27
+ if (fs.existsSync(cand + '.js') || fs.existsSync(cand)) {
28
+ return require(cand);
29
+ }
30
+ } catch (e) {}
31
+ }
32
+ throw new Error('[register-dynamic-skill] Failed to locate manifest helper module (scripts/lib/manifest)');
33
+ }
34
+
35
+ const { getManifestPath, readManifest, writeManifest, recordGeneratedSkill } = loadManifestHelper();
36
+
37
+ // Find user home folder
38
+ const userHome = process.env.HOME || process.env.USERPROFILE || '';
39
+
40
+ // List of all possible manifest.json home paths
41
+ const manifestHomes = [
42
+ path.join(workspaceRoot, '.claude'),
43
+ path.join(workspaceRoot, '.cursor'),
44
+ path.join(workspaceRoot, '.github'),
45
+ path.join(workspaceRoot, '.codex'),
46
+ path.join(workspaceRoot, '.continue'),
47
+ path.join(userHome, '.agents'),
48
+ path.join(userHome, '.claude')
49
+ ];
50
+
51
+ // Helper to parse simple YAML frontmatter without external dependencies
52
+ function parseFrontmatter(content) {
53
+ const lines = content.split(/\r?\n/);
54
+ const fm = {};
55
+ let inFM = false;
56
+ const fmLines = [];
57
+
58
+ for (const line of lines) {
59
+ if (line.trim() === '---') {
60
+ if (!inFM) {
61
+ inFM = true;
62
+ continue;
63
+ } else {
64
+ break;
65
+ }
66
+ }
67
+ if (inFM) {
68
+ fmLines.push(line);
69
+ }
70
+ }
71
+
72
+ let currentKey = null;
73
+ for (const line of fmLines) {
74
+ const trimmed = line.trim();
75
+ if (!trimmed || trimmed.startsWith('#')) continue;
76
+
77
+ // Check if indent level is substantial (nested list or object)
78
+ const indent = line.search(/\S/);
79
+
80
+ if (indent === 0) {
81
+ const match = line.match(/^([a-zA-Z0-9_-]+)\s*:\s*(.*)$/);
82
+ if (match) {
83
+ const key = match[1];
84
+ const val = match[2].trim();
85
+
86
+ let cleanVal = val;
87
+ if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
88
+ cleanVal = val.slice(1, -1);
89
+ }
90
+
91
+ if (val.startsWith('[') && val.endsWith(']')) {
92
+ cleanVal = val.slice(1, -1).split(',').map(s => s.trim().replace(/^['"]|['"]$/g, ''));
93
+ }
94
+
95
+ fm[key] = cleanVal;
96
+ currentKey = key;
97
+ }
98
+ } else if (indent > 0 && currentKey) {
99
+ // Handle nested properties or array items
100
+ if (trimmed.startsWith('- ')) {
101
+ if (!Array.isArray(fm[currentKey])) {
102
+ fm[currentKey] = [];
103
+ }
104
+ fm[currentKey].push(trimmed.slice(2).trim().replace(/^['"]|['"]$/g, ''));
105
+ } else {
106
+ const childMatch = trimmed.match(/^([a-zA-Z0-9_-]+)\s*:\s*(.*)$/);
107
+ if (childMatch) {
108
+ if (typeof fm[currentKey] !== 'object' || Array.isArray(fm[currentKey])) {
109
+ fm[currentKey] = {};
110
+ }
111
+ const childKey = childMatch[1];
112
+ const childVal = childMatch[2].trim().replace(/^['"]|['"]$/g, '');
113
+ fm[currentKey][childKey] = childVal;
114
+ }
115
+ }
116
+ }
117
+ }
118
+ return fm;
119
+ }
120
+
121
+ function processSkillDir(skillDirPath) {
122
+ const skillFile = path.join(skillDirPath, 'SKILL.md');
123
+ if (!fs.existsSync(skillFile)) {
124
+ return null;
125
+ }
126
+
127
+ const content = fs.readFileSync(skillFile, 'utf8');
128
+ const fm = parseFrontmatter(content);
129
+
130
+ const skillId = fm.name || path.basename(skillDirPath);
131
+ const description = fm.description || 'No description provided';
132
+
133
+ // Extract custom triggers/tags if defined, or infer them from keywords
134
+ let triggers = [];
135
+ if (fm.triggers) {
136
+ triggers = Array.isArray(fm.triggers) ? fm.triggers : [fm.triggers];
137
+ } else if (fm.metadata && fm.metadata.triggers) {
138
+ triggers = Array.isArray(fm.metadata.triggers) ? fm.metadata.triggers : [fm.metadata.triggers];
139
+ } else {
140
+ // Fallback only - explicit `triggers:` frontmatter (mandated by
141
+ // skill-creator/SKILL.md §4) should make this branch rare. Kept
142
+ // deliberately conservative: only the skill name plus the description's
143
+ // first sentence (not the whole prose block), a longer stopword list,
144
+ // and a length-5+ floor, so a generic skill description doesn't spam
145
+ // tier-router.js with broad words that fire on unrelated prompts.
146
+ const firstSentence = description.split(/[.!?]/)[0];
147
+ const STOPWORDS = new Set([
148
+ 'with', 'from', 'this', 'that', 'your', 'about', 'some', 'than', 'then',
149
+ 'prevent', 'resolved', 'skill', 'agent', 'using', 'which', 'these',
150
+ 'those', 'their', 'there', 'where', 'when', 'while', 'after', 'before',
151
+ 'again', 'other', 'every', 'being', 'would', 'could', 'should', 'still',
152
+ 'first', 'never', 'always', 'ensure', 'provide', 'provided'
153
+ ]);
154
+ const words = (skillId + ' ' + firstSentence)
155
+ .toLowerCase()
156
+ .replace(/[^\w\s-]/g, ' ')
157
+ .split(/\s+/)
158
+ .filter(w => w.length >= 5 && !STOPWORDS.has(w));
159
+ triggers = [...new Set(words)].slice(0, 8);
160
+ }
161
+
162
+ return {
163
+ id: skillId,
164
+ dirPath: skillDirPath,
165
+ description,
166
+ triggers,
167
+ metadata: fm.metadata || {}
168
+ };
169
+ }
170
+
171
+ function register() {
172
+ const arg = process.argv[2];
173
+
174
+ if (arg === '--help' || arg === '-h') {
175
+ console.log(`Register self-evolve dynamic skills into every detected platform manifest.json.
176
+
177
+ Usage:
178
+ node register-dynamic-skill.js Scan .claude/harness-everything/skills/generated/ and register every skill found there.
179
+ node register-dynamic-skill.js <name> Register only the skill folder named <name> under skills/generated/.
180
+ node register-dynamic-skill.js <path> Register the skill folder at this literal path instead.
181
+
182
+ Each skill folder needs a SKILL.md with 'name' and 'description' frontmatter (plus
183
+ 'triggers' - if omitted, triggers are inferred from the name and description, which
184
+ is a conservative fallback, not a substitute for setting them explicitly). Writes to
185
+ every already-bootstrapped platform's manifest.json (.claude/, .cursor/, .github/,
186
+ .codex/, .continue/, plus the user-home ~/.agents and ~/.claude homes).`);
187
+ process.exit(0);
188
+ }
189
+
190
+ const generatedBaseDir = path.join(workspaceRoot, '.claude', 'harness-everything', 'skills', 'generated');
191
+
192
+ let skillsToRegister = [];
193
+
194
+ if (arg) {
195
+ // Scenario A: Register specific skill ID or path
196
+ let skillPath = arg;
197
+ if (!fs.existsSync(skillPath)) {
198
+ skillPath = path.join(generatedBaseDir, arg);
199
+ }
200
+ if (fs.existsSync(skillPath)) {
201
+ const info = processSkillDir(skillPath);
202
+ if (info) skillsToRegister.push(info);
203
+ } else {
204
+ console.error(`[Error] Dynamic skill folder not found: ${arg}`);
205
+ process.exit(1);
206
+ }
207
+ } else {
208
+ // Scenario B: Scan whole generated folder
209
+ if (fs.existsSync(generatedBaseDir)) {
210
+ const subdirs = fs.readdirSync(generatedBaseDir, { withFileTypes: true });
211
+ for (const entry of subdirs) {
212
+ if (entry.isDirectory()) {
213
+ const dirPath = path.join(generatedBaseDir, entry.name);
214
+ const info = processSkillDir(dirPath);
215
+ if (info) skillsToRegister.push(info);
216
+ }
217
+ }
218
+ }
219
+ }
220
+
221
+ if (skillsToRegister.length === 0) {
222
+ console.log('[Info] No self-evolved dynamic skills found to register.');
223
+ return;
224
+ }
225
+
226
+ // Write to all detected manifests (auto-creating target directories if in workspace)
227
+ let count = 0;
228
+ for (const home of manifestHomes) {
229
+ const manifestPath = getManifestPath(home);
230
+ const parentDir = path.dirname(manifestPath);
231
+ const isRepoHome = home.startsWith(workspaceRoot);
232
+ if (fs.existsSync(parentDir) || isRepoHome) {
233
+ fs.mkdirSync(parentDir, { recursive: true });
234
+ for (const skill of skillsToRegister) {
235
+ recordGeneratedSkill(manifestPath, skill.id, skill.dirPath, skill.description, skill.triggers);
236
+ }
237
+ console.log(`[Success] Registered ${skillsToRegister.length} skill(s) to ${manifestPath}`);
238
+ count++;
239
+ }
240
+ }
241
+
242
+ if (count === 0) {
243
+ // Fallback: If no manifest path's directory existed, write to at least the standard home path
244
+ const fallbackHome = path.join(userHome, '.agents');
245
+ const manifestPath = getManifestPath(fallbackHome);
246
+ for (const skill of skillsToRegister) {
247
+ recordGeneratedSkill(manifestPath, skill.id, skill.dirPath, skill.description, skill.triggers);
248
+ }
249
+ console.log(`[Success] Registered ${skillsToRegister.length} skill(s) to fallback manifest ${manifestPath}`);
250
+ }
251
+ }
252
+
253
+ register();
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Harness Self-Regression Test Suite.
4
+ *
5
+ * This is the free, deterministic gate. Model sessions remain on-demand;
6
+ * their results must not be confused with a local tracker simulation.
7
+ */
8
+
9
+ const { spawnSync } = require('child_process');
10
+ const path = require('path');
11
+ const fs = require('fs');
12
+
13
+ const projectRoot = path.resolve(__dirname, '..', '..');
14
+ let hasErrors = false;
15
+
16
+ let pkgName = null;
17
+ try {
18
+ pkgName = JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf8')).name;
19
+ } catch (e) {}
20
+ if (pkgName !== 'harness-everything') {
21
+ console.log('self-regression.js validates the Harness-everything repo\'s own CI; this workspace is not that repo, so there is nothing to check here. Skipping.');
22
+ process.exit(0);
23
+ }
24
+
25
+ console.log('=================================================');
26
+ console.log(' Harness OS - Self-Regression Test Suite ');
27
+ console.log('=================================================');
28
+
29
+ function runNode(label, script, args = [], options = {}) {
30
+ const result = spawnSync('node', [script, ...args], {
31
+ cwd: projectRoot,
32
+ stdio: 'inherit',
33
+ ...options,
34
+ });
35
+ if (result.status !== 0) {
36
+ console.error(` FAIL ${label}`);
37
+ hasErrors = true;
38
+ } else {
39
+ console.log(` PASS ${label}`);
40
+ }
41
+ return result;
42
+ }
43
+
44
+ console.log('\n[Phase 1] Static Syntax Check...');
45
+ const foldersToScan = ['harness-everything', 'hooks', 'environment-detection', 'self-evolve', 'ci', 'eval-harness', 'scripts', 'bin', 'to-spec', 'to-tickets', 'find-skills', 'fable-mode', 'multi-agent-workspace'];
46
+ const jsFiles = [];
47
+ function walkDir(dir) {
48
+ if (!fs.existsSync(dir)) return;
49
+ for (const file of fs.readdirSync(dir)) {
50
+ const filePath = path.join(dir, file);
51
+ if (fs.statSync(filePath).isDirectory()) walkDir(filePath);
52
+ else if (filePath.endsWith('.js')) jsFiles.push(filePath);
53
+ }
54
+ }
55
+ for (const folder of foldersToScan) walkDir(path.join(projectRoot, folder));
56
+ for (const file of jsFiles) {
57
+ const check = spawnSync('node', ['--check', file]);
58
+ if (check.status !== 0) {
59
+ console.error(` FAIL syntax: ${path.relative(projectRoot, file)}`);
60
+ console.error(check.stderr.toString().trim());
61
+ hasErrors = true;
62
+ }
63
+ }
64
+ console.log(` PASS syntax: ${jsFiles.length} JavaScript file(s)`);
65
+
66
+ console.log('\n[Phase 1b] CLI Command Smoke Test...');
67
+ const cliPath = path.join(projectRoot, 'bin', 'cli.js');
68
+ const nextCheck = spawnSync('node', [cliPath, 'next', 'add a new login endpoint with tests'], { cwd: projectRoot });
69
+ if (nextCheck.status !== 0 || !nextCheck.stdout.toString().includes('RECOMMENDED TIER')) {
70
+ console.error(' FAIL `harness next` did not produce a routing recommendation.');
71
+ hasErrors = true;
72
+ } else if (!nextCheck.stdout.toString().includes('REQUIRED HARNESS INVARIANTS')) {
73
+ console.error(' FAIL `harness next` did not establish the invariant-first kernel contract.');
74
+ hasErrors = true;
75
+ } else console.log(' PASS `harness next` produced routing + invariant contract.');
76
+ const verifyCheck = spawnSync('node', [cliPath, 'verify'], {
77
+ cwd: projectRoot,
78
+ env: { ...process.env, HARNESS_SKIP_PROJECT_CHECKS: '1' },
79
+ });
80
+ if (verifyCheck.status !== 0) {
81
+ console.error(' FAIL `harness verify` exited non-zero on a skipped check.');
82
+ hasErrors = true;
83
+ } else console.log(' PASS `harness verify` exited 0 on a skipped check.');
84
+
85
+ console.log('\n[Phase 2] Routing Verification Check...');
86
+ runNode('routing matrix', path.join(projectRoot, 'ci', 'runner.js'));
87
+ runNode('skill route coverage', path.join(projectRoot, 'ci', 'skill-routing-check.js'));
88
+ runNode('invariant-first routing contract', path.join(projectRoot, 'ci', 'invariant-routing.test.js'));
89
+ runNode('workflow-plan structured contract', path.join(projectRoot, 'ci', 'router-workflow-plan.test.js'));
90
+ runNode('explicit parallel safety contract', path.join(projectRoot, 'ci', 'router-phase2-safety.test.js'));
91
+ runNode('workflow-plan consumers', path.join(projectRoot, 'ci', 'workflow-plan-consumers.test.js'));
92
+ runNode('workflow-plan consumer edge contracts', path.join(projectRoot, 'ci', 'workflow-plan-consumers-edge.test.js'));
93
+ runNode('phase 4 ensemble/memory evidence', path.join(projectRoot, 'ci', 'phase4-ensemble-memory.test.js'));
94
+ runNode('phase 5 pre-action gate', path.join(projectRoot, 'ci', 'action-gate.test.js'));
95
+ runNode('phase 5 platform evidence boundary', path.join(projectRoot, 'ci', 'action-gate-platform-doc.test.js'));
96
+ runNode('issue #99 runtime correctness', path.join(projectRoot, 'ci', 'issue99-runtime.test.js'));
97
+
98
+ console.log('\n[Phase 3] Skill Reference and Behavioral Case Checks...');
99
+ runNode('skill reference check', path.join(projectRoot, 'ci', 'reference-check.js'));
100
+ runNode('behavioral case validation', path.join(projectRoot, 'behavioral-evals', 'run.js'), ['validate']);
101
+ console.log('\n[Phase 3b] Fable Model Mode Contract Tests...');
102
+ const fableModeTestPath = path.join(projectRoot, 'ci', 'fable-mode-test.js');
103
+ if (fs.existsSync(fableModeTestPath)) {
104
+ const fableModeCheck = spawnSync('node', [fableModeTestPath], { stdio: 'inherit', cwd: projectRoot });
105
+ if (fableModeCheck.status !== 0) {
106
+ console.error("\n ❌ Fable model mode contract suite failed!");
107
+ hasErrors = true;
108
+ } else {
109
+ console.log("\n ✅ Fable model mode contract suite 100% Passed!");
110
+ }
111
+ } else {
112
+ console.warn(" ⚠️ ci/fable-mode-test.js not found. Skipping Phase 3.");
113
+ }
114
+
115
+ console.log('\n[Phase 4] Mechanism Test Suite (Claude Code hooks)...');
116
+ runNode('mechanism suite', path.join(projectRoot, 'ci', 'mechanism-test.js'));
117
+
118
+ console.log('\n=================================================');
119
+ if (hasErrors) {
120
+ console.error(' FAIL: self-regression found one or more problems.');
121
+ console.log('=================================================');
122
+ process.exit(1);
123
+ }
124
+ console.log(' PASS: all deterministic self-regression checks passed.');
125
+ console.log('=================================================');