harness-everything 0.2.1 → 0.3.6

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 (494) hide show
  1. package/.claude-plugin/marketplace.json +27 -0
  2. package/.claude-plugin/plugin.json +51 -0
  3. package/.gitattributes +1 -0
  4. package/.github/workflows/behavioral-evals.yml +36 -0
  5. package/.github/workflows/ci.yml +117 -0
  6. package/.github/workflows/release.yml +45 -0
  7. package/.husky/commit-msg +1 -0
  8. package/.waza.yaml +22 -0
  9. package/AGENTS.md +60 -2
  10. package/BENCHMARK_SOP.md +62 -62
  11. package/CHANGELOG.md +297 -114
  12. package/CODE_OF_CONDUCT.md +24 -0
  13. package/CONTRIBUTING.md +47 -0
  14. package/Dockerfile +18 -18
  15. package/LICENSE +201 -201
  16. package/README.md +279 -197
  17. package/SECURITY.md +33 -0
  18. package/VERIFICATION.md +394 -347
  19. package/ab-test-deep-analysis-2026-08-27.md +383 -0
  20. package/ab-test-results-2026-08-27.md +152 -0
  21. package/ab-test-statistical-analysis-31cases.md +193 -0
  22. package/behavioral-evals/README.md +85 -0
  23. package/behavioral-evals/analyze-plugin-results.js +110 -0
  24. package/behavioral-evals/cases/baseline-add-feature.yaml +34 -0
  25. package/behavioral-evals/cases/baseline-api-design.yaml +32 -0
  26. package/behavioral-evals/cases/baseline-debugging.yaml +31 -0
  27. package/behavioral-evals/cases/baseline-dependency.yaml +24 -0
  28. package/behavioral-evals/cases/baseline-documentation.yaml +34 -0
  29. package/behavioral-evals/cases/baseline-error-handling.yaml +31 -0
  30. package/behavioral-evals/cases/baseline-git-commit.yaml +33 -0
  31. package/behavioral-evals/cases/baseline-performance-monitoring.yaml +28 -0
  32. package/behavioral-evals/cases/baseline-performance.yaml +34 -0
  33. package/behavioral-evals/cases/baseline-refactor-with-tests.yaml +35 -0
  34. package/behavioral-evals/cases/baseline-refactor.yaml +27 -0
  35. package/behavioral-evals/cases/baseline-security-review.yaml +28 -0
  36. package/behavioral-evals/cases/baseline-simple-bugfix.yaml +33 -0
  37. package/behavioral-evals/cases/baseline-tdd-workflow.yaml +28 -0
  38. package/behavioral-evals/cases/breaker-zoom-out-after-3.yaml +50 -0
  39. package/behavioral-evals/cases/pressure-budget-skip-review.yaml +27 -0
  40. package/behavioral-evals/cases/pressure-bypass-review.yaml +27 -0
  41. package/behavioral-evals/cases/pressure-complexity-skip.yaml +37 -0
  42. package/behavioral-evals/cases/pressure-expert-skip-testing.yaml +31 -0
  43. package/behavioral-evals/cases/pressure-fatigue-skip.yaml +33 -0
  44. package/behavioral-evals/cases/pressure-management-skip-all.yaml +28 -0
  45. package/behavioral-evals/cases/pressure-scope-bypass.yaml +28 -0
  46. package/behavioral-evals/cases/pressure-skip-docs.yaml +50 -0
  47. package/behavioral-evals/cases/pressure-skip-error-handling.yaml +35 -0
  48. package/behavioral-evals/cases/pressure-skip-security.yaml +32 -0
  49. package/behavioral-evals/cases/pressure-skip-tests.yaml +27 -0
  50. package/behavioral-evals/cases/pressure-skip-verification.yaml +43 -0
  51. package/behavioral-evals/cases/pressure-social-skip-review.yaml +28 -0
  52. package/behavioral-evals/cases/pressure-sunk-cost-retry.yaml +47 -0
  53. package/behavioral-evals/cases/scope-discipline.yaml +32 -0
  54. package/behavioral-evals/cases/tier1-no-overplan.yaml +26 -0
  55. package/behavioral-evals/cases/verify-before-done.yaml +31 -0
  56. package/behavioral-evals/results/.gitkeep +0 -0
  57. package/behavioral-evals/results/2026-08-23-breaker-zoom-out-after-3.json +20 -0
  58. package/behavioral-evals/results/2026-08-23-pressure-skip-verification.json +20 -0
  59. package/behavioral-evals/results/2026-08-23-pressure-sunk-cost-retry.json +20 -0
  60. package/behavioral-evals/results/2026-08-23-scope-discipline.json +16 -0
  61. package/behavioral-evals/results/2026-08-23-tier1-no-overplan.json +20 -0
  62. package/behavioral-evals/results/2026-08-23-verify-before-done.json +20 -0
  63. package/behavioral-evals/results/2026-08-27-baseline-add-feature.json +20 -0
  64. package/behavioral-evals/results/2026-08-27-baseline-api-design.json +20 -0
  65. package/behavioral-evals/results/2026-08-27-baseline-debugging.json +20 -0
  66. package/behavioral-evals/results/2026-08-27-baseline-dependency.json +16 -0
  67. package/behavioral-evals/results/2026-08-27-baseline-documentation.json +20 -0
  68. package/behavioral-evals/results/2026-08-27-baseline-error-handling.json +20 -0
  69. package/behavioral-evals/results/2026-08-27-baseline-git-commit.json +20 -0
  70. package/behavioral-evals/results/2026-08-27-baseline-performance-monitoring.json +20 -0
  71. package/behavioral-evals/results/2026-08-27-baseline-performance.json +20 -0
  72. package/behavioral-evals/results/2026-08-27-baseline-refactor-with-tests.json +20 -0
  73. package/behavioral-evals/results/2026-08-27-baseline-refactor.json +20 -0
  74. package/behavioral-evals/results/2026-08-27-baseline-security-review.json +20 -0
  75. package/behavioral-evals/results/2026-08-27-baseline-simple-bugfix.json +20 -0
  76. package/behavioral-evals/results/2026-08-27-baseline-tdd-workflow.json +24 -0
  77. package/behavioral-evals/results/2026-08-27-breaker-zoom-out-after-3.json +20 -0
  78. package/behavioral-evals/results/2026-08-27-pressure-budget-skip-review.json +16 -0
  79. package/behavioral-evals/results/2026-08-27-pressure-bypass-review.json +20 -0
  80. package/behavioral-evals/results/2026-08-27-pressure-complexity-skip.json +20 -0
  81. package/behavioral-evals/results/2026-08-27-pressure-expert-skip-testing.json +16 -0
  82. package/behavioral-evals/results/2026-08-27-pressure-fatigue-skip.json +16 -0
  83. package/behavioral-evals/results/2026-08-27-pressure-management-skip-all.json +20 -0
  84. package/behavioral-evals/results/2026-08-27-pressure-skip-docs.json +20 -0
  85. package/behavioral-evals/results/2026-08-27-pressure-skip-error-handling.json +20 -0
  86. package/behavioral-evals/results/2026-08-27-pressure-skip-security.json +20 -0
  87. package/behavioral-evals/results/2026-08-27-pressure-skip-tests.json +20 -0
  88. package/behavioral-evals/results/2026-08-27-pressure-skip-verification.json +24 -0
  89. package/behavioral-evals/results/2026-08-27-pressure-social-skip-review.json +20 -0
  90. package/behavioral-evals/results/2026-08-27-pressure-sunk-cost-retry.json +24 -0
  91. package/behavioral-evals/results/2026-08-27-scope-discipline.json +16 -0
  92. package/behavioral-evals/results/2026-08-27-tier1-no-overplan.json +20 -0
  93. package/behavioral-evals/results/2026-08-27-verify-before-done.json +20 -0
  94. package/behavioral-evals/results/run-20260827-115509.log +287 -0
  95. package/behavioral-evals/run-with-plugin.js +316 -0
  96. package/behavioral-evals/run.js +587 -0
  97. package/benchmarks/README.md +63 -0
  98. package/benchmarks/ab-test-2026-08-26/results.json +55 -0
  99. package/benchmarks/results/logs/.gitkeep +0 -0
  100. package/benchmarks/results/logs/test-a-harness.md +31 -0
  101. package/benchmarks/results/logs/test-a-vanilla.md +28 -0
  102. package/benchmarks/results/logs/test-b-micro-loop-harness.md +48 -0
  103. package/benchmarks/results/logs/test-b-micro-loop-vanilla.md +36 -0
  104. package/benchmarks/results/logs/test-c-attention-loss-harness.md +40 -0
  105. package/benchmarks/results/logs/test-c-attention-loss-vanilla.md +63 -0
  106. package/benchmarks/results/logs/test-d-knowledge-boundary-harness.md +24 -0
  107. package/benchmarks/results/logs/test-d-knowledge-boundary-vanilla.md +29 -0
  108. package/benchmarks/results/logs/test-e-shell-awareness-harness.md +20 -0
  109. package/benchmarks/results/logs/test-e-shell-awareness-vanilla.md +20 -0
  110. package/benchmarks/results/logs/test-f-fact-audit-harness.md +16 -0
  111. package/benchmarks/results/logs/test-f-fact-audit-vanilla.md +16 -0
  112. package/benchmarks/results/results.json +158 -0
  113. package/benchmarks/run.js +220 -0
  114. package/benchmarks/schema.json +44 -0
  115. package/bin/cli.js +152 -97
  116. package/ci/ab-test-cases/grill-me-adversarial.yaml +18 -0
  117. package/ci/ab-test-cases/tdd-test-first.yaml +23 -0
  118. package/ci/ab-test-cases/verification-loop-gates.yaml +25 -0
  119. package/ci/ab-test-cases/verify-before-claim-cites.yaml +18 -0
  120. package/ci/ab-test-harness.js +410 -0
  121. package/{eval-framework → ci}/cases/case1.json +5 -5
  122. package/ci/cases/case10-small-feature.json +5 -0
  123. package/ci/cases/case11-readme-typo-update.json +5 -0
  124. package/ci/cases/case12-chinese-macro-audit.json +5 -0
  125. package/{eval-framework → ci}/cases/case2.json +5 -5
  126. package/{eval-framework → ci}/cases/case3.json +5 -5
  127. package/{eval-framework → ci}/cases/case4-zh-tier2.json +5 -5
  128. package/{eval-framework → ci}/cases/case5-zh-tier3.json +5 -5
  129. package/ci/cases/case6-macro-skill-audit.json +5 -0
  130. package/ci/cases/case7-macro-reference-audit.json +5 -0
  131. package/ci/cases/case8-controlled-ab-benchmark.json +5 -0
  132. package/ci/cases/case9-four-issue-audit.json +5 -0
  133. package/ci/consistency-check.js +347 -0
  134. package/ci/description-collision.js +109 -0
  135. package/ci/fable-mode-test.js +120 -0
  136. package/ci/fixtures/agency-agents/divisions.json +6 -0
  137. package/ci/fixtures/agency-agents/engineering/code-reviewer.md +11 -0
  138. package/ci/fixtures/agency-agents/testing/reality-checker.md +11 -0
  139. package/ci/fixtures/bad-frontmatter-colon/SKILL.md +16 -0
  140. package/ci/fixtures/duplicate-description/skill-a/SKILL.md +16 -0
  141. package/ci/fixtures/duplicate-description/skill-b/SKILL.md +16 -0
  142. package/ci/mechanism-2a-rule-of-3.test.js +46 -0
  143. package/ci/mechanism-2b-boundary-guard.test.js +16 -0
  144. package/ci/mechanism-2c-state-persist.test.js +29 -0
  145. package/ci/mechanism-2d-fact-audit.test.js +18 -0
  146. package/ci/mechanism-2e-scope-guard.test.js +24 -0
  147. package/ci/mechanism-2f-stop-gate.test.js +23 -0
  148. package/ci/mechanism-2g-platform-ignore.test.js +88 -0
  149. package/ci/mechanism-2h-installer-manifest.test.js +147 -0
  150. package/ci/mechanism-2i-crlf-frontmatter.test.js +145 -0
  151. package/ci/mechanism-2i-install-verification.test.js +34 -0
  152. package/ci/mechanism-2j-behavioral-runner.test.js +20 -0
  153. package/ci/mechanism-2k-reference-check.test.js +20 -0
  154. package/ci/mechanism-2l-multi-agent-workspace.test.js +105 -0
  155. package/ci/mechanism-test.js +71 -0
  156. package/ci/negative-controls.js +84 -0
  157. package/ci/reference-check.js +112 -0
  158. package/ci/release-consistency-check.js +123 -0
  159. package/ci/routing-check.js +90 -0
  160. package/{eval-framework → ci}/runner.js +56 -56
  161. package/ci/skill-routing-check.js +98 -0
  162. package/ci/test-helper.js +104 -0
  163. package/ci/test-negative-controls.js +148 -0
  164. package/commitlint.config.js +25 -0
  165. package/docker-verify.sh +266 -266
  166. package/docs/architecture.md +99 -95
  167. package/docs/audit.md +53 -0
  168. package/docs/mechanism-first-skill-mesh.md +163 -0
  169. package/docs/philosophy.md +47 -45
  170. package/docs/reflection.md +48 -34
  171. package/docs/routing.md +58 -45
  172. package/docs/troubleshooting.md +284 -0
  173. package/docs/workflows/environment-detection.md +63 -63
  174. package/docs/workflows/eval-harness.md +64 -57
  175. package/docs/workflows/fable-discipline.md +59 -59
  176. package/docs/workflows/fable-mode.md +12 -15
  177. package/docs/workflows/find-skills.md +36 -0
  178. package/docs/workflows/git-commit.md +71 -62
  179. package/docs/workflows/grill-me.md +62 -62
  180. package/docs/workflows/grill-with-docs.md +69 -62
  181. package/docs/workflows/harness-everything.md +95 -92
  182. package/docs/workflows/improve-codebase-architecture.md +68 -60
  183. package/docs/workflows/install-cognitive-os.md +60 -60
  184. package/docs/workflows/multi-agent-workspace.md +42 -0
  185. package/docs/workflows/repo-docs.md +64 -59
  186. package/docs/workflows/rewrite-commits.md +60 -60
  187. package/docs/workflows/security-review.md +77 -58
  188. package/docs/workflows/self-evolve.md +42 -59
  189. package/docs/workflows/skill-creator.md +80 -75
  190. package/docs/workflows/skill-style.md +64 -64
  191. package/docs/workflows/tdd.md +7 -4
  192. package/docs/workflows/to-spec.md +83 -0
  193. package/docs/workflows/to-tickets.md +80 -0
  194. package/docs/workflows/todo-driven-workflow.md +28 -30
  195. package/docs/workflows/using-git-worktrees.md +67 -63
  196. package/docs/workflows/verification-loop.md +71 -69
  197. package/docs/workflows/verify-before-claim.md +64 -60
  198. package/docs/workflows/zoom-out.md +74 -62
  199. package/environment-detection/SKILL.md +41 -77
  200. package/environment-detection/references/shell-syntax-rules.md +76 -0
  201. package/environment-detection/scripts/preflight.js +103 -93
  202. package/eval-framework/fixtures/bad-frontmatter-colon/SKILL.md +14 -0
  203. package/eval-framework/fixtures/duplicate-desc-skill-a/SKILL.md +14 -0
  204. package/eval-framework/fixtures/duplicate-desc-skill-b/SKILL.md +14 -0
  205. package/eval-framework/fixtures/missing-delimiter/SKILL.md +13 -0
  206. package/eval-framework/fixtures/over-budget-skill/SKILL.md +36 -0
  207. package/eval-harness/SKILL.md +42 -59
  208. package/eval-harness/references/scoring-rubric.md +68 -0
  209. package/eval-harness/scripts/evaluate.js +77 -61
  210. package/evals/environment-detection/eval.yaml +26 -0
  211. package/evals/environment-detection/tasks/negative-trigger.yaml +16 -0
  212. package/evals/environment-detection/tasks/positive-trigger.yaml +15 -0
  213. package/evals/eval-harness/eval.yaml +26 -0
  214. package/evals/eval-harness/tasks/negative-trigger.yaml +16 -0
  215. package/evals/eval-harness/tasks/positive-trigger.yaml +15 -0
  216. package/evals/fable-discipline/eval.yaml +26 -0
  217. package/evals/fable-discipline/tasks/negative-trigger.yaml +16 -0
  218. package/evals/fable-discipline/tasks/positive-trigger.yaml +15 -0
  219. package/evals/fable-mode/eval.yaml +26 -0
  220. package/evals/fable-mode/tasks/negative-tier2-no-model.yaml +18 -0
  221. package/evals/fable-mode/tasks/negative-trigger.yaml +16 -0
  222. package/evals/fable-mode/tasks/positive-haiku-mode.yaml +16 -0
  223. package/evals/fable-mode/tasks/positive-opus-mode.yaml +16 -0
  224. package/evals/fable-mode/tasks/positive-sonnet-mode.yaml +16 -0
  225. package/evals/fable-mode/tasks/positive-trigger.yaml +15 -0
  226. package/evals/find-skills/eval.yaml +26 -0
  227. package/evals/find-skills/tasks/negative-trigger.yaml +16 -0
  228. package/evals/find-skills/tasks/positive-trigger.yaml +15 -0
  229. package/evals/git-commit/eval.yaml +26 -0
  230. package/evals/git-commit/tasks/negative-trigger.yaml +16 -0
  231. package/evals/git-commit/tasks/positive-trigger.yaml +15 -0
  232. package/evals/grill-me/eval.yaml +26 -0
  233. package/evals/grill-me/tasks/negative-trigger.yaml +16 -0
  234. package/evals/grill-me/tasks/positive-trigger.yaml +15 -0
  235. package/evals/grill-with-docs/eval.yaml +26 -0
  236. package/evals/grill-with-docs/tasks/negative-trigger.yaml +16 -0
  237. package/evals/grill-with-docs/tasks/positive-trigger.yaml +15 -0
  238. package/evals/harness-everything/eval.yaml +26 -0
  239. package/evals/harness-everything/tasks/negative-non-software.yaml +16 -0
  240. package/evals/harness-everything/tasks/negative-skill-indicated.yaml +15 -0
  241. package/evals/harness-everything/tasks/positive-tier1.yaml +16 -0
  242. package/evals/harness-everything/tasks/positive-tier2.yaml +16 -0
  243. package/evals/harness-everything/tasks/positive-tier3.yaml +16 -0
  244. package/evals/improve-codebase-architecture/eval.yaml +26 -0
  245. package/evals/improve-codebase-architecture/tasks/negative-trigger.yaml +16 -0
  246. package/evals/improve-codebase-architecture/tasks/positive-trigger.yaml +15 -0
  247. package/evals/install-cognitive-os/eval.yaml +26 -0
  248. package/evals/install-cognitive-os/tasks/negative-trigger.yaml +16 -0
  249. package/evals/install-cognitive-os/tasks/positive-trigger.yaml +15 -0
  250. package/evals/multi-agent-workspace/eval.yaml +26 -0
  251. package/evals/multi-agent-workspace/tasks/negative-trigger.yaml +15 -0
  252. package/evals/multi-agent-workspace/tasks/positive-trigger.yaml +15 -0
  253. package/evals/repo-docs/eval.yaml +26 -0
  254. package/evals/repo-docs/tasks/negative-trigger.yaml +16 -0
  255. package/evals/repo-docs/tasks/positive-trigger.yaml +15 -0
  256. package/evals/rewrite-commits/eval.yaml +26 -0
  257. package/evals/rewrite-commits/tasks/negative-trigger.yaml +16 -0
  258. package/evals/rewrite-commits/tasks/positive-trigger.yaml +15 -0
  259. package/evals/security-review/eval.yaml +26 -0
  260. package/evals/security-review/tasks/negative-trigger.yaml +16 -0
  261. package/evals/security-review/tasks/positive-trigger.yaml +15 -0
  262. package/evals/self-evolve/eval.yaml +26 -0
  263. package/evals/self-evolve/tasks/negative-trigger.yaml +16 -0
  264. package/evals/self-evolve/tasks/positive-trigger.yaml +15 -0
  265. package/evals/skill-creator/eval.yaml +26 -0
  266. package/evals/skill-creator/tasks/negative-trigger.yaml +16 -0
  267. package/evals/skill-creator/tasks/positive-trigger.yaml +15 -0
  268. package/evals/skill-style/eval.yaml +26 -0
  269. package/evals/skill-style/tasks/negative-trigger.yaml +16 -0
  270. package/evals/skill-style/tasks/positive-trigger.yaml +15 -0
  271. package/evals/tdd/eval.yaml +26 -0
  272. package/evals/tdd/tasks/negative-trivia.yaml +16 -0
  273. package/evals/tdd/tasks/positive-bugfix.yaml +15 -0
  274. package/evals/tdd/tasks/positive-feature.yaml +16 -0
  275. package/evals/tdd/tasks/positive-refactor.yaml +15 -0
  276. package/evals/to-spec/eval.yaml +26 -0
  277. package/evals/to-spec/tasks/negative-trigger.yaml +16 -0
  278. package/evals/to-spec/tasks/positive-trigger.yaml +15 -0
  279. package/evals/to-tickets/eval.yaml +26 -0
  280. package/evals/to-tickets/tasks/negative-trigger.yaml +15 -0
  281. package/evals/to-tickets/tasks/positive-trigger.yaml +15 -0
  282. package/evals/todo-driven-workflow/eval.yaml +26 -0
  283. package/evals/todo-driven-workflow/tasks/negative-single-edit.yaml +16 -0
  284. package/evals/todo-driven-workflow/tasks/positive-multi-step.yaml +15 -0
  285. package/evals/todo-driven-workflow/tasks/positive-refactor-flow.yaml +15 -0
  286. package/evals/using-git-worktrees/eval.yaml +26 -0
  287. package/evals/using-git-worktrees/tasks/negative-trigger.yaml +15 -0
  288. package/evals/using-git-worktrees/tasks/positive-trigger.yaml +15 -0
  289. package/evals/verification-loop/eval.yaml +26 -0
  290. package/evals/verification-loop/tasks/negative-discussion.yaml +16 -0
  291. package/evals/verification-loop/tasks/positive-pre-ship.yaml +15 -0
  292. package/evals/verify-before-claim/eval.yaml +26 -0
  293. package/evals/verify-before-claim/tasks/negative-trigger.yaml +16 -0
  294. package/evals/verify-before-claim/tasks/positive-trigger.yaml +15 -0
  295. package/evals/zoom-out/eval.yaml +26 -0
  296. package/evals/zoom-out/tasks/negative-trivial-edit.yaml +16 -0
  297. package/evals/zoom-out/tasks/positive-repeated-failure.yaml +15 -0
  298. package/fable-discipline/SKILL.md +41 -38
  299. package/fable-discipline/references/discipline-rules.md +22 -0
  300. package/fable-mode/CONTRACT-FORMAT.md +51 -51
  301. package/fable-mode/SKILL.md +39 -51
  302. package/fable-mode/agents/fable-orchestrator.md +99 -92
  303. package/fable-mode/agents/fable-verifier.md +32 -32
  304. package/fable-mode/agents/fable-worker-haiku.md +52 -48
  305. package/fable-mode/agents/fable-worker-sonnet.md +53 -49
  306. package/fable-mode/execution-guardrails/SKILL.md +43 -87
  307. package/fable-mode/execution-guardrails/references/guardrail-rules.md +56 -0
  308. package/fable-mode/fable-haiku/SKILL.md +36 -48
  309. package/fable-mode/fable-haiku/references/routing-notes.md +26 -0
  310. package/fable-mode/fable-opus/SKILL.md +36 -0
  311. package/fable-mode/fable-sonnet/SKILL.md +36 -0
  312. package/fable-mode/model-matrix.json +32 -0
  313. package/fable-mode/references/execution-phases.md +37 -0
  314. package/fable-mode/references/model-matrix.md +39 -0
  315. package/fable-mode/scripts/model-selector.js +129 -0
  316. package/find-skills/SKILL.md +48 -0
  317. package/find-skills/references/discovery-flow.md +102 -0
  318. package/find-skills/scripts/use-skill.js +106 -0
  319. package/git-commit/SKILL.md +45 -55
  320. package/git-commit/guides/ANGULAR_STYLE.md +60 -60
  321. package/git-commit/guides/COMMIT_GENERATION.md +23 -23
  322. package/git-commit/guides/LANGUAGE_DETECTION.md +16 -16
  323. package/git-commit/guides/MAIN_REPO.md +14 -14
  324. package/git-commit/guides/SUBMODULES.md +27 -27
  325. package/git-commit/references/commit-flow.md +30 -0
  326. package/grill-me/SKILL.md +43 -36
  327. package/grill-me/references/grilling-playbook.md +38 -0
  328. package/grill-with-docs/ADR-FORMAT.md +47 -47
  329. package/grill-with-docs/CONTEXT-FORMAT.md +63 -63
  330. package/grill-with-docs/SKILL.md +41 -99
  331. package/grill-with-docs/references/session-playbook.md +97 -0
  332. package/harness-everything/SKILL.md +42 -141
  333. package/harness-everything/references/skill-registry.md +39 -0
  334. package/harness-everything/references/triage-and-tiers.md +116 -0
  335. package/harness-everything/scripts/bootstrap.js +203 -140
  336. package/harness-everything/scripts/routing-keywords.json +320 -0
  337. package/harness-everything/scripts/self-heal.js +241 -189
  338. package/harness-everything/scripts/tier-router.js +334 -219
  339. package/harness-everything/scripts/verify-gate.js +87 -18
  340. package/hooks/hooks.json +155 -155
  341. package/hooks/scripts/boundary-guard.js +55 -55
  342. package/hooks/scripts/contract-test.js +79 -79
  343. package/hooks/scripts/depth-guard.js +65 -65
  344. package/hooks/scripts/lib/harness-state.js +139 -228
  345. package/hooks/scripts/lib/platforms/claude.js +185 -42
  346. package/hooks/scripts/lib/platforms/codex.js +114 -46
  347. package/hooks/scripts/lib/platforms/continue.js +91 -41
  348. package/hooks/scripts/lib/platforms/copilot.js +109 -41
  349. package/hooks/scripts/lib/platforms/cursor.js +89 -41
  350. package/hooks/scripts/lib/platforms/hermes.js +57 -32
  351. package/hooks/scripts/lib/platforms/index.js +17 -17
  352. package/hooks/scripts/lib/platforms/worktrees.js +20 -20
  353. package/hooks/scripts/reset-circuit-breaker.js +30 -30
  354. package/hooks/scripts/rule-of-3-tracker.js +124 -91
  355. package/hooks/scripts/rule-of-3.js +14 -3
  356. package/hooks/scripts/state-persist.js +99 -99
  357. package/hooks/scripts/stop-gate.js +80 -80
  358. package/hooks/scripts/subagent-scope-guard.js +88 -88
  359. package/improve-codebase-architecture/SKILL.md +40 -44
  360. package/improve-codebase-architecture/guides/DEEPENING.md +37 -37
  361. package/improve-codebase-architecture/guides/HTML-REPORT.md +123 -123
  362. package/improve-codebase-architecture/guides/INTERFACE-DESIGN.md +44 -44
  363. package/improve-codebase-architecture/guides/LANGUAGE.md +53 -53
  364. package/improve-codebase-architecture/guides/refactoring-workflow.md +59 -0
  365. package/install-cognitive-os/SKILL.md +38 -95
  366. package/install-cognitive-os/references/cognitive-loop.md +27 -0
  367. package/multi-agent-workspace/NOTICE-agency-agents.md +27 -0
  368. package/multi-agent-workspace/SKILL.md +37 -0
  369. package/{create-agent-launcher → multi-agent-workspace}/examples/csharp-monorepo.md +123 -123
  370. package/{create-agent-launcher → multi-agent-workspace}/examples/typescript-cli.md +126 -126
  371. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-claude.md +77 -77
  372. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-codex.md +146 -146
  373. package/multi-agent-workspace/guidelines/platform-continue.md +38 -0
  374. package/{create-agent-launcher → multi-agent-workspace}/guidelines/platform-copilot.md +74 -74
  375. package/multi-agent-workspace/guidelines/platform-cursor.md +40 -0
  376. package/multi-agent-workspace/guidelines/platform-hermes.md +38 -0
  377. package/{create-agent-launcher → multi-agent-workspace}/guidelines/role-capabilities.md +108 -108
  378. package/multi-agent-workspace/references/agency-agents.md +31 -0
  379. package/multi-agent-workspace/references/architecture-guide.md +32 -0
  380. package/multi-agent-workspace/references/orchestration.md +48 -0
  381. package/multi-agent-workspace/scripts/agency-catalog.js +190 -0
  382. package/multi-agent-workspace/scripts/index_memory.js +51 -0
  383. package/multi-agent-workspace/scripts/scaffold.js +253 -0
  384. package/{create-agent-launcher → multi-agent-workspace}/templates/README.md +17 -17
  385. package/{create-agent-launcher → multi-agent-workspace}/templates/agent-launcher.md +67 -67
  386. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-csharp.md +55 -55
  387. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-polyglot.md +61 -61
  388. package/{create-agent-launcher → multi-agent-workspace}/templates/backend-developer-ts.md +56 -56
  389. package/{create-agent-launcher → multi-agent-workspace}/templates/memory-keeper.md +36 -36
  390. package/{create-agent-launcher → multi-agent-workspace}/templates/requirement-analyzer.md +65 -65
  391. package/{create-agent-launcher → multi-agent-workspace}/templates/specialist-agent.md +34 -34
  392. package/{create-agent-launcher → multi-agent-workspace}/templates/task-verifier.md +55 -55
  393. package/{create-agent-launcher → multi-agent-workspace}/templates/tool-maker.md +32 -32
  394. package/multi-agent-workspace/workflows/01-init.md +22 -0
  395. package/multi-agent-workspace/workflows/02-analysis.md +23 -0
  396. package/multi-agent-workspace/workflows/03-generation.md +27 -0
  397. package/multi-agent-workspace/workflows/04-launcher.md +16 -0
  398. package/opencode-plugin/README.md +94 -0
  399. package/opencode-plugin/hooks/circuit-breaker.js +121 -0
  400. package/opencode-plugin/hooks/compliance.js +128 -0
  401. package/opencode-plugin/hooks/post-edit.js +62 -0
  402. package/opencode-plugin/hooks/pre-complete.js +65 -0
  403. package/opencode-plugin/hooks/verify.js +140 -0
  404. package/opencode-plugin/plugin.json +17 -0
  405. package/opencode-plugin/test-hook-firing.js +198 -0
  406. package/package.json +50 -22
  407. package/references/definition-of-done.md +67 -0
  408. package/references/performance-checklist.md +153 -0
  409. package/references/platform-advisory-template.md +58 -0
  410. package/references/security-checklist.md +205 -0
  411. package/repo-docs/SKILL.md +46 -45
  412. package/repo-docs/references/process-guide.md +60 -0
  413. package/repo-docs/templates/agents-template.md +264 -264
  414. package/repo-docs/templates/knowledge-agents-template.md +50 -50
  415. package/repo-docs/templates/knowledge-readme-template.md +83 -83
  416. package/repo-docs/templates/manual-recon.md +117 -117
  417. package/repo-docs/templates/multi-skills-readme-template.md +72 -72
  418. package/repo-docs/templates/product-agents-template.md +78 -78
  419. package/repo-docs/templates/product-readme-template.md +95 -95
  420. package/repo-docs/templates/readme-template.md +136 -136
  421. package/repo-docs/templates/single-skill-readme-template.md +70 -70
  422. package/repo-docs/templates/skills-agents-template.md +60 -60
  423. package/rewrite-commits/SKILL.md +37 -32
  424. package/rewrite-commits/references/workflow.md +18 -0
  425. package/scripts/installer.js +546 -649
  426. package/scripts/lib/advisory-text.js +167 -163
  427. package/scripts/lib/claude-hooks.js +84 -71
  428. package/scripts/lib/gitignore.js +199 -80
  429. package/scripts/lib/manifest.js +146 -82
  430. package/scripts/lib/prompts.js +241 -241
  431. package/scripts/lib/skills.js +260 -172
  432. package/scripts/lib/workspace.js +28 -28
  433. package/scripts/verify-install.js +147 -0
  434. package/security-review/SKILL.md +50 -511
  435. package/security-review/guides/OWASP-PATTERNS.md +31 -0
  436. package/security-review/guides/STRIDE-THREAT-MODEL.md +21 -0
  437. package/security-review/references/security-checklist.md +478 -0
  438. package/security-review/scripts/audit-secrets.js +84 -0
  439. package/self-evolve/SKILL.md +47 -54
  440. package/self-evolve/references/memory-resolution.md +58 -0
  441. package/self-evolve/scripts/persist-memory.js +139 -40
  442. package/self-evolve/scripts/register-dynamic-skill.js +251 -0
  443. package/self-evolve/scripts/self-regression.js +110 -113
  444. package/skill-creator/SKILL.md +49 -91
  445. package/skill-creator/references/authoring-workflow.md +14 -0
  446. package/skill-creator/references/dynamic-generation-contract.md +21 -0
  447. package/skill-creator/references/quality-checklist.md +15 -0
  448. package/skill-creator/references/quality-principles.md +81 -81
  449. package/skill-creator/references/testing-workflow.md +20 -25
  450. package/skill-style/SKILL.md +42 -48
  451. package/skill-style/references/style-guide.md +36 -0
  452. package/tdd/SKILL.md +44 -53
  453. package/tdd/guides/deep-modules.md +33 -33
  454. package/tdd/guides/interface-design.md +31 -31
  455. package/tdd/guides/mocking.md +59 -59
  456. package/tdd/guides/refactoring.md +10 -10
  457. package/tdd/guides/tests.md +61 -61
  458. package/tdd/references/core-discipline.md +49 -0
  459. package/to-spec/SKILL.md +42 -0
  460. package/to-spec/references/process.md +77 -0
  461. package/to-spec/scripts/check-project-docs.js +259 -0
  462. package/to-spec/templates/cli-reference.md +31 -0
  463. package/to-spec/templates/dev-doc.md +27 -0
  464. package/to-spec/templates/feature-spec.md +59 -0
  465. package/to-spec/templates/schema-doc.md +31 -0
  466. package/to-tickets/SKILL.md +42 -0
  467. package/to-tickets/references/publishing-and-templates.md +97 -0
  468. package/todo-driven-workflow/SKILL.md +40 -54
  469. package/todo-driven-workflow/references/execution-guide.md +27 -0
  470. package/using-git-worktrees/SKILL.md +49 -161
  471. package/using-git-worktrees/references/workflow-details.md +108 -0
  472. package/verification-loop/SKILL.md +46 -138
  473. package/verification-loop/references/verification-phases.md +116 -0
  474. package/verification-loop/templates/verification-report.template.md +15 -0
  475. package/verify-before-claim/SKILL.md +43 -86
  476. package/verify-before-claim/references/verification-guide.md +73 -0
  477. package/zoom-out/SKILL.md +42 -90
  478. package/zoom-out/references/circuit-breaker.md +66 -0
  479. package/zoom-out/templates/zoom-out-report.template.md +20 -0
  480. package/build-multi-agent-system/AGENTS.md +0 -50
  481. package/build-multi-agent-system/README.md +0 -63
  482. package/build-multi-agent-system/SKILL.md +0 -68
  483. package/create-agent-launcher/SKILL.md +0 -48
  484. package/create-agent-launcher/guidelines/platform-gemini.md +0 -101
  485. package/create-agent-launcher/workflows/01-init.md +0 -22
  486. package/create-agent-launcher/workflows/02-analysis.md +0 -26
  487. package/create-agent-launcher/workflows/03-generation.md +0 -29
  488. package/create-agent-launcher/workflows/04-launcher.md +0 -20
  489. package/docs/workflows/build-multi-agent-system.md +0 -62
  490. package/docs/workflows/create-agent-launcher.md +0 -62
  491. package/eval-framework/behavioral-test.js +0 -105
  492. package/eval-framework/mechanism-test.js +0 -251
  493. package/harness-everything/scripts/todo-cli.js +0 -157
  494. package/skill-style/STYLE.md +0 -37
@@ -0,0 +1,410 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * A/B Test Harness — Method Effectiveness Evaluation
4
+ *
5
+ * Proves whether skills actually change agent behavior by comparing
6
+ * baseline (no skill) vs treatment (skill loaded) outputs.
7
+ *
8
+ * node ci/ab-test-harness.js validate # structural check (free)
9
+ * node ci/ab-test-harness.js run # run all cases (costs tokens)
10
+ * node ci/ab-test-harness.js run --case <id> # run one case
11
+ *
12
+ * Verdict logic:
13
+ * baseline FAIL + treatment PASS => EFFECTIVE (skill changed behavior)
14
+ * baseline FAIL + treatment FAIL => INEFFECTIVE (skill didn't help)
15
+ * baseline PASS + treatment PASS => INCONCLUSIVE (baseline already does it)
16
+ * baseline PASS + treatment FAIL => HARMFUL (skill made behavior worse)
17
+ */
18
+
19
+ const fs = require('fs');
20
+ const os = require('os');
21
+ const path = require('path');
22
+ const crypto = require('crypto');
23
+ const { execFileSync } = require('child_process');
24
+
25
+ const ROOT = path.resolve(__dirname, '..');
26
+ const CASES_DIR = path.join(__dirname, 'ab-test-cases');
27
+ const RESULTS_DIR = path.join(ROOT, 'benchmarks');
28
+ const SKILLS_DIR = path.join(ROOT);
29
+
30
+ // ---------------------------------------------------------------------------
31
+ // YAML parser (reuse pattern from behavioral-evals/run.js)
32
+ function parseSimpleYaml(text) {
33
+ const lines = text.split('\n');
34
+ let i = 0;
35
+ function parseBlock(indent) {
36
+ const obj = {};
37
+ const arr = [];
38
+ let isArray = null;
39
+ while (i < lines.length) {
40
+ const line = lines[i];
41
+ if (!line.trim() || line.trim().startsWith('#')) { i++; continue; }
42
+ const currentIndent = line.match(/^ */)[0].length;
43
+ if (currentIndent < indent) break;
44
+ if (currentIndent > indent) { i++; continue; }
45
+ const listItem = line.trim().startsWith('- ');
46
+ if (isArray === null) isArray = listItem;
47
+ else if (isArray !== listItem) throw new Error('Mixed list/map at same indent near: ' + line);
48
+ if (listItem) {
49
+ const content = line.trim().slice(2);
50
+ const kv = content.match(/^([^:]+):\s*(.*)$/);
51
+ if (kv && !content.startsWith('"') && !content.startsWith("'")) {
52
+ const item = { [kv[1].trim()]: scalar(kv[2]) };
53
+ i++;
54
+ Object.assign(item, parseNested(currentIndent + 2));
55
+ arr.push(item);
56
+ } else {
57
+ arr.push(scalar(content));
58
+ i++;
59
+ }
60
+ } else {
61
+ const kv = line.match(/^([^:#]+):\s*(.*)$/);
62
+ if (!kv) { i++; continue; }
63
+ const key = kv[1].trim();
64
+ const rawVal = kv[2];
65
+ if (rawVal === '|' || rawVal === '>') {
66
+ i++;
67
+ let block = [];
68
+ while (i < lines.length) {
69
+ const l = lines[i];
70
+ const ind = l.match(/^ */)[0].length;
71
+ if (!l.trim()) { block.push(''); i++; continue; }
72
+ if (ind <= indent) break;
73
+ block.push(l.slice(indent + 2));
74
+ i++;
75
+ }
76
+ obj[key] = block.join('\n');
77
+ } else if (rawVal === '') {
78
+ i++;
79
+ obj[key] = parseNested(indent + 2);
80
+ } else {
81
+ obj[key] = scalar(rawVal);
82
+ i++;
83
+ }
84
+ }
85
+ }
86
+ return isArray ? arr : obj;
87
+ }
88
+ function parseNested(minIndent) {
89
+ let j = i;
90
+ while (j < lines.length && (!lines[j].trim() || lines[j].trim().startsWith('#'))) j++;
91
+ if (j >= lines.length) return null;
92
+ const ind = lines[j].match(/^ */)[0].length;
93
+ return parseBlock(ind);
94
+ }
95
+ function scalar(v) {
96
+ const t = v.trim();
97
+ if (t === 'true') return true;
98
+ if (t === 'false') return false;
99
+ if (/^-?\d+$/.test(t)) return parseInt(t, 10);
100
+ if ((t.startsWith('"') && t.endsWith('"')) || (t.startsWith("'") && t.endsWith("'"))) return t.slice(1, -1);
101
+ return t;
102
+ }
103
+ return parseBlock(0) || {};
104
+ }
105
+
106
+ // ---------------------------------------------------------------------------
107
+ // Discover and validate cases
108
+ function discoverCases() {
109
+ if (!fs.existsSync(CASES_DIR)) return [];
110
+ return fs.readdirSync(CASES_DIR)
111
+ .filter((f) => f.endsWith('.yaml'))
112
+ .map((f) => ({ file: path.join(CASES_DIR, f), ...parseSimpleYaml(fs.readFileSync(path.join(CASES_DIR, f), 'utf8')) }));
113
+ }
114
+
115
+ function validateCase(c) {
116
+ const errors = [];
117
+ if (!c.id) errors.push('missing id');
118
+ if (!c.skill) errors.push('missing skill');
119
+ if (!c.name) errors.push('missing name');
120
+ if (!c.prompt) errors.push('missing prompt');
121
+ if (!c.baseline_rubric || !Array.isArray(c.baseline_rubric) || c.baseline_rubric.length === 0)
122
+ errors.push('missing or empty baseline_rubric');
123
+ if (!c.treatment_rubric || !Array.isArray(c.treatment_rubric) || c.treatment_rubric.length === 0)
124
+ errors.push('missing or empty treatment_rubric');
125
+ if (!c.verdict_rule) errors.push('missing verdict_rule');
126
+ // Check skill file exists
127
+ const skillPath = path.join(SKILLS_DIR, c.skill, 'SKILL.md');
128
+ if (!fs.existsSync(skillPath)) errors.push(`skill file not found: ${skillPath}`);
129
+ return errors;
130
+ }
131
+
132
+ // ---------------------------------------------------------------------------
133
+ // Run a headless agent session
134
+ function runHeadless(prompt, cwd, engine) {
135
+ const model = process.env.AB_TEST_MODEL || 'openai/gpt-5-mini';
136
+ const outPath = path.join(os.tmpdir(), `ab-test-${Date.now()}-${Math.random().toString(36).slice(2)}.json`);
137
+ const outputFd = fs.openSync(outPath, 'w');
138
+ try {
139
+ execFileSync('opencode', ['run', '-m', model, prompt, '--format', 'json', '--auto', '--dir', cwd],
140
+ { cwd, stdio: ['ignore', outputFd, 'inherit'], timeout: 10 * 60 * 1000, windowsHide: true });
141
+ } catch (err) {
142
+ // Timeout or crash — return empty trace
143
+ fs.rmSync(outPath, { force: true });
144
+ return '';
145
+ } finally {
146
+ fs.closeSync(outputFd);
147
+ }
148
+ try {
149
+ return extractTrace(outPath);
150
+ } finally {
151
+ fs.rmSync(outPath, { force: true });
152
+ }
153
+ }
154
+
155
+ function extractTrace(transcriptPath) {
156
+ try {
157
+ const raw = fs.readFileSync(transcriptPath, 'utf8');
158
+ const chunks = [];
159
+ let structured = false;
160
+ for (const line of raw.split('\n')) {
161
+ if (!line.trim()) continue;
162
+ let e;
163
+ try { e = JSON.parse(line); } catch { continue; }
164
+ const p = e && e.part;
165
+ if (!p) continue;
166
+ if (e.type === 'text' && typeof p.text === 'string') {
167
+ chunks.push(p.text);
168
+ structured = true;
169
+ } else if (String(e.type).includes('tool')) {
170
+ const input = p.state && p.state.input !== undefined ? p.state.input : p.input;
171
+ chunks.push(`[${p.tool || 'tool'}] ` + JSON.stringify(input ?? {}));
172
+ structured = true;
173
+ }
174
+ }
175
+ if (!structured) {
176
+ try {
177
+ const obj = JSON.parse(raw);
178
+ if (obj && typeof obj.result === 'string') return obj.result;
179
+ } catch { /* fall through */ }
180
+ return raw;
181
+ }
182
+ return chunks.join('\n');
183
+ } catch {
184
+ return '';
185
+ }
186
+ }
187
+
188
+ // ---------------------------------------------------------------------------
189
+ // Grade a trace against a rubric
190
+ function grade(trace, rubric) {
191
+ const results = [];
192
+ for (const r of rubric) {
193
+ let pass = false;
194
+ try {
195
+ if (r.type === 'trace_contains') pass = trace.includes(r.value);
196
+ else if (r.type === 'trace_not_contains') pass = !trace.includes(r.value);
197
+ else if (r.type === 'trace_matches') pass = new RegExp(r.value, 'i').test(trace);
198
+ } catch {
199
+ pass = false;
200
+ }
201
+ results.push({ type: r.type, value: r.value, description: r.description || '', pass });
202
+ }
203
+ return results;
204
+ }
205
+
206
+ // ---------------------------------------------------------------------------
207
+ // Compute verdict
208
+ function computeVerdict(baselineResults, treatmentResults) {
209
+ const baselinePass = baselineResults.every((r) => r.pass);
210
+ const treatmentPass = treatmentResults.every((r) => r.pass);
211
+
212
+ if (!baselinePass && treatmentPass) return 'EFFECTIVE';
213
+ if (!baselinePass && !treatmentPass) return 'INEFFECTIVE';
214
+ if (baselinePass && treatmentPass) return 'INCONCLUSIVE';
215
+ if (baselinePass && !treatmentPass) return 'HARMFUL';
216
+ return 'UNKNOWN';
217
+ }
218
+
219
+ // ---------------------------------------------------------------------------
220
+ // Build a temp workspace for the test
221
+ function buildWorkspace() {
222
+ const ws = fs.mkdtempSync(path.join(os.tmpdir(), 'ab-test-ws-'));
223
+ // Minimal workspace — just git init for opencode to work
224
+ try {
225
+ execFileSync('git', ['init', '-q'], { cwd: ws });
226
+ execFileSync('git', ['config', 'user.email', 'eval@harness.local'], { cwd: ws });
227
+ execFileSync('git', ['config', 'user.name', 'Harness Eval'], { cwd: ws });
228
+ } catch { /* ok */ }
229
+ return ws;
230
+ }
231
+
232
+ function cleanWorkspace(ws) {
233
+ try { fs.rmSync(ws, { recursive: true, force: true }); } catch { /* best-effort */ }
234
+ }
235
+
236
+ // ---------------------------------------------------------------------------
237
+ // Run a single A/B test case
238
+ function sha256(value) {
239
+ return crypto.createHash('sha256').update(value).digest('hex');
240
+ }
241
+
242
+ function countToolCalls(trace) {
243
+ return (trace.match(/^\[[^\]]+\]/gm) || []).length;
244
+ }
245
+
246
+ function wilsonInterval(successes, total) {
247
+ if (!total) return null;
248
+ const z = 1.96;
249
+ const p = successes / total;
250
+ const denominator = 1 + (z * z) / total;
251
+ const centre = (p + (z * z) / (2 * total)) / denominator;
252
+ const spread = (z / denominator) * Math.sqrt((p * (1 - p) / total) + (z * z) / (4 * total * total));
253
+ return [Math.max(0, centre - spread), Math.min(1, centre + spread)].map(v => Number(v.toFixed(4)));
254
+ }
255
+
256
+ // Every run is a paired experiment. The order is randomized to avoid making
257
+ // the second arm systematically benefit from cache/session warm-up.
258
+ function runCase(c, engine) {
259
+ console.log(`\n=== ${c.id}: ${c.name} ===`);
260
+ console.log(`Skill: ${c.skill}`);
261
+ const skillContent = fs.readFileSync(path.join(SKILLS_DIR, c.skill, 'SKILL.md'), 'utf8');
262
+ const treatmentPrompt = `You are following the ${c.skill} discipline. Here is your skill:\n\n${skillContent}\n\n---\n\n${c.prompt}`;
263
+ const pairId = `${c.id}-${Date.now()}-${crypto.randomBytes(3).toString('hex')}`;
264
+ const order = crypto.randomInt(0, 2) === 0 ? ['baseline', 'treatment'] : ['treatment', 'baseline'];
265
+ const arms = {};
266
+ for (const arm of order) {
267
+ const ws = buildWorkspace();
268
+ let trace = '';
269
+ try {
270
+ trace = runHeadless(arm === 'treatment' ? treatmentPrompt : c.prompt, ws, engine);
271
+ } catch (err) {
272
+ console.error(` ${arm} failed: ${err.message}`);
273
+ }
274
+ const results = grade(trace, arm === 'treatment' ? c.treatment_rubric : c.baseline_rubric);
275
+ const pass = results.every(r => r.pass);
276
+ arms[arm] = {
277
+ pass,
278
+ loaded_skills: arm === 'treatment' ? [c.skill] : [],
279
+ attribution_required: arm === 'treatment',
280
+ results: results.map(r => ({ description: r.description, pass: r.pass })),
281
+ trace_preview: trace.slice(0, 500),
282
+ tool_call_count: countToolCalls(trace),
283
+ };
284
+ cleanWorkspace(ws);
285
+ }
286
+ if (!arms.treatment.loaded_skills.length) throw new Error('treatment attribution is empty');
287
+ const verdict = computeVerdict(
288
+ arms.baseline.results.map(r => ({ pass: r.pass })),
289
+ arms.treatment.results.map(r => ({ pass: r.pass }))
290
+ );
291
+ console.log(` Order: ${order.join(' -> ')}`);
292
+ console.log(` Baseline: ${arms.baseline.pass ? 'PASS' : 'FAIL'}`);
293
+ console.log(` Treatment: ${arms.treatment.pass ? 'PASS' : 'FAIL'} [${c.skill}]`);
294
+ console.log(` Verdict: ${verdict}`);
295
+ return {
296
+ id: c.id,
297
+ skill: c.skill,
298
+ name: c.name,
299
+ date: new Date().toISOString(),
300
+ engine,
301
+ model: process.env.AB_TEST_MODEL || 'openai/gpt-5-mini',
302
+ protocol: 'paired-randomized-v1',
303
+ pair_id: pairId,
304
+ arm_order: order,
305
+ fixture_defined: false,
306
+ fixture_sha256: sha256('no fixture declared'),
307
+ prompt_sha256: sha256(c.prompt),
308
+ sample_unit: 'one paired prompt-only case',
309
+ cost: null,
310
+ baseline: arms.baseline,
311
+ treatment: arms.treatment,
312
+ tool_call_delta: arms.treatment.tool_call_count - arms.baseline.tool_call_count,
313
+ verdict,
314
+ };
315
+ }
316
+
317
+ // ---------------------------------------------------------------------------
318
+ // Main
319
+ function main() {
320
+ const args = process.argv.slice(2);
321
+ const command = args[0] || 'validate';
322
+ const filter = args.includes('--case') ? args[args.indexOf('--case') + 1] : null;
323
+
324
+ if (command === 'validate') {
325
+ const cases = discoverCases();
326
+ console.log(`Found ${cases.length} A/B test cases.`);
327
+ let failed = 0;
328
+ for (const c of cases) {
329
+ const errors = validateCase(c);
330
+ if (errors.length > 0) {
331
+ console.error(`❌ ${c.id || c.file}: ${errors.join('; ')}`);
332
+ failed++;
333
+ } else {
334
+ console.log(`✅ ${c.id}`);
335
+ }
336
+ }
337
+ if (failed > 0) process.exit(1);
338
+ console.log(`\nAll ${cases.length} cases valid.`);
339
+ return;
340
+ }
341
+
342
+ if (command === 'run') {
343
+ const cases = discoverCases().filter((c) => !filter || c.id === filter);
344
+ if (filter && cases.length === 0) { console.error(`no case with id "${filter}"`); process.exit(1); }
345
+ if (cases.length === 0) { console.error('no cases found'); process.exit(1); }
346
+
347
+ // Resolve engine
348
+ let engine = 'opencode';
349
+ try { execFileSync('opencode', ['--version'], { stdio: 'pipe' }); } catch {
350
+ console.error('opencode not found on PATH'); process.exit(1);
351
+ }
352
+
353
+ console.log(`Running ${cases.length} A/B test case(s) with engine: ${engine}`);
354
+ console.log(`Model: ${process.env.AB_TEST_MODEL || 'openai/gpt-5-mini'}`);
355
+
356
+ const results = [];
357
+ let effective = 0, ineffective = 0, inconclusive = 0, harmful = 0;
358
+
359
+ for (const c of cases) {
360
+ const result = runCase(c, engine);
361
+ results.push(result);
362
+ if (result.verdict === 'EFFECTIVE') effective++;
363
+ else if (result.verdict === 'INEFFECTIVE') ineffective++;
364
+ else if (result.verdict === 'INCONCLUSIVE') inconclusive++;
365
+ else if (result.verdict === 'HARMFUL') harmful++;
366
+ }
367
+
368
+ // Summary
369
+ console.log('\n========================================');
370
+ console.log('A/B Test Summary');
371
+ console.log('========================================');
372
+ for (const r of results) {
373
+ const icon = r.verdict === 'EFFECTIVE' ? '✅' : r.verdict === 'HARMFUL' ? '🔴' : r.verdict === 'INCONCLUSIVE' ? '⚠️' : '❌';
374
+ console.log(`${icon} ${r.id}: ${r.verdict}`);
375
+ }
376
+ console.log(`\nTotal: ${results.length} | Effective: ${effective} | Ineffective: ${ineffective} | Inconclusive: ${inconclusive} | Harmful: ${harmful}`);
377
+
378
+ // Write results
379
+ const date = new Date().toISOString().split('T')[0];
380
+ const resultDir = path.join(RESULTS_DIR, `ab-test-${date}`);
381
+ fs.mkdirSync(resultDir, { recursive: true });
382
+ const resultFile = path.join(resultDir, 'results.json');
383
+ const completed = results.length;
384
+ const toolCallDeltas = results.map(r => r.tool_call_delta);
385
+ const summary = {
386
+ effective,
387
+ ineffective,
388
+ inconclusive,
389
+ harmful,
390
+ requested_sample_size: cases.length,
391
+ completed_pairs: completed,
392
+ boundary_compliance: completed === cases.length ? 'complete' : 'incomplete',
393
+ cost: null,
394
+ tool_call_delta: toolCallDeltas,
395
+ effective_rate_ci95: wilsonInterval(effective, completed),
396
+ interpretation: 'Prompt-only cases have no workspace boundary; use behavioral-evals/run.js --arm both for fixture-bound evidence.',
397
+ };
398
+ fs.writeFileSync(resultFile, JSON.stringify({ date, engine, model: process.env.AB_TEST_MODEL || 'openai/gpt-5-mini', protocol: 'paired-randomized-v1', summary, results }, null, 2));
399
+ console.log(`\nResults written to: ${resultFile}`);
400
+
401
+ // Exit non-zero if any EFFECTIVE or HARMFUL (these are signal, not noise)
402
+ if (effective > 0 || harmful > 0) process.exit(0);
403
+ return;
404
+ }
405
+
406
+ console.error(`Unknown command: ${command}. Use "validate" or "run".`);
407
+ process.exit(1);
408
+ }
409
+
410
+ main();
@@ -1,5 +1,5 @@
1
- {
2
- "name": "Refactoring large module",
3
- "prompt": "We need to refactor the entire authentication architecture",
4
- "expected_tier": "Tier 3"
5
- }
1
+ {
2
+ "name": "Refactoring large module",
3
+ "prompt": "We need to refactor the entire authentication architecture",
4
+ "expected_tier": "Tier 3"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "Small feature",
3
+ "prompt": "Add a small feature to validate phone numbers",
4
+ "expected_tier": "Tier 2"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "One README typo",
3
+ "prompt": "Update one README typo",
4
+ "expected_tier": "Tier 1"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "Chinese full skill audit",
3
+ "prompt": "請逐一評估所有 skill 的內容、檔案結構與版本,並用數據比較是否仍然有效",
4
+ "expected_tier": "Tier 3"
5
+ }
@@ -1,5 +1,5 @@
1
- {
2
- "name": "Small bugfix",
3
- "prompt": "Fix the typo in the login screen",
4
- "expected_tier": "Tier 1"
5
- }
1
+ {
2
+ "name": "Small bugfix",
3
+ "prompt": "Fix the typo in the login screen",
4
+ "expected_tier": "Tier 1"
5
+ }
@@ -1,5 +1,5 @@
1
- {
2
- "name": "API implementation with tests",
3
- "prompt": "Implement the new payment API and write integration tests",
4
- "expected_tier": "Tier 2"
5
- }
1
+ {
2
+ "name": "API implementation with tests",
3
+ "prompt": "Implement the new payment API and write integration tests",
4
+ "expected_tier": "Tier 2"
5
+ }
@@ -1,5 +1,5 @@
1
- {
2
- "name": "Chinese prompt - API with tests",
3
- "prompt": "幫我實作新的付款 API 並寫整合測試",
4
- "expected_tier": "Tier 2"
5
- }
1
+ {
2
+ "name": "Chinese prompt - API with tests",
3
+ "prompt": "幫我實作新的付款 API 並寫整合測試",
4
+ "expected_tier": "Tier 2"
5
+ }
@@ -1,5 +1,5 @@
1
- {
2
- "name": "Chinese prompt - architectural refactor",
3
- "prompt": "重構整個認證模組的架構",
4
- "expected_tier": "Tier 3"
5
- }
1
+ {
2
+ "name": "Chinese prompt - architectural refactor",
3
+ "prompt": "重構整個認證模組的架構",
4
+ "expected_tier": "Tier 3"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "Full skill efficacy audit",
3
+ "prompt": "Evaluate every skill in this Harness repository and verify whether each one is still useful using data",
4
+ "expected_tier": "Tier 3"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "All-skill stale reference review",
3
+ "prompt": "Review all skills for stale references and compare the installed file tree with the release",
4
+ "expected_tier": "Tier 3"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "Controlled A/B benchmark",
3
+ "prompt": "Run a controlled A/B benchmark of the agent with and without the Harness skills and report confidence intervals",
4
+ "expected_tier": "Tier 3"
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "Repository version audit",
3
+ "prompt": "Audit this repository version and fix four issues across routing, benchmarks, pressure cases, and missing files",
4
+ "expected_tier": "Tier 3"
5
+ }