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
@@ -4,18 +4,28 @@
4
4
  const fs = require('fs');
5
5
  const path = require('path');
6
6
  const { execFileSync } = require('child_process');
7
+ const {
8
+ ZONES: DOCUMENT_ZONES,
9
+ getWorkspaceRoot,
10
+ resolveProjectDocs,
11
+ ensureCommittableFallback
12
+ } = require('./project-docs-resolver');
7
13
  const {
8
14
  SUPPORTED_PLATFORMS,
9
15
  readAgencyCatalog,
10
16
  resolveSelection
11
17
  } = require('./agency-catalog');
18
+ const { assertContainedPath } = require('./path-boundary');
12
19
 
13
20
  const GENERATOR = 'harness-everything/multi-agent-workspace';
14
- const ZONES = Object.freeze(['state', 'logs', 'decisions', 'domain', 'architecture', 'roles']);
21
+ const RUNTIME_ZONES = Object.freeze(['state', 'logs', 'roles']);
22
+ const ALL_ZONES = Object.freeze(['state', 'logs', 'decisions', 'domain', 'architecture', 'roles']);
23
+ const ROUTER_TEMPLATE = path.join(__dirname, '..', 'templates', 'AGENTS.md');
15
24
 
16
25
  function values(args, name) {
17
26
  const result = [];
18
- for (let i = 0; i < args.length; i++) if (args[i] === name) {
27
+ for (let i = 0; i < args.length; i++) {
28
+ if (args[i] !== name) continue;
19
29
  if (!args[i + 1] || args[i + 1].startsWith('--')) throw new Error(`${name} requires a value`);
20
30
  result.push(args[++i]);
21
31
  }
@@ -28,7 +38,11 @@ function commaValues(args, name) {
28
38
 
29
39
  function parseArgs(args) {
30
40
  if (args.includes('--help') || args.includes('-h')) return { help: true };
31
- const workspace = values(args, '--workspace')[0] || '.';
41
+ const explicitWorkspace = values(args, '--workspace')[0];
42
+ const workspace = explicitWorkspace || getWorkspaceRoot();
43
+ if (!workspace) {
44
+ throw new Error('cannot infer a workspace outside a git repository; pass --workspace <path> explicitly');
45
+ }
32
46
  const sourceValues = values(args, '--agency-source');
33
47
  const platform = values(args, '--platform')[0] || null;
34
48
  if (platform && !SUPPORTED_PLATFORMS.includes(platform)) {
@@ -51,16 +65,16 @@ function json(value) {
51
65
  return `${JSON.stringify(value, null, 2)}\n`;
52
66
  }
53
67
 
54
- function readExistingManifest(outputRoot) {
55
- const file = path.join(outputRoot, 'manifest.json');
68
+ function readExistingManifest(runtimeRoot) {
69
+ const file = path.join(runtimeRoot, 'manifest.json');
56
70
  if (!fs.existsSync(file)) return null;
57
71
  try { return JSON.parse(fs.readFileSync(file, 'utf8')); }
58
- catch (error) { throw new Error(`existing manifest is invalid: ${error.message}`); }
72
+ catch (error) { throw new Error(`existing runtime manifest is invalid: ${error.message}`); }
59
73
  }
60
74
 
61
75
  function detectStack(workspaceRoot) {
62
- const files = fs.readdirSync(workspaceRoot, { withFileTypes: true });
63
- const names = new Set(files.filter(entry => entry.isFile()).map(entry => entry.name));
76
+ const names = new Set(fs.readdirSync(workspaceRoot, { withFileTypes: true })
77
+ .filter(entry => entry.isFile()).map(entry => entry.name));
64
78
  if (names.has('package.json')) return 'node';
65
79
  if (names.has('pyproject.toml') || names.has('requirements.txt')) return 'python';
66
80
  if (names.has('Cargo.toml')) return 'rust';
@@ -70,55 +84,47 @@ function detectStack(workspaceRoot) {
70
84
 
71
85
  function gitRevision(root) {
72
86
  if (!fs.existsSync(path.join(root, '.git'))) return null;
73
- try { return execFileSync('git', ['-C', root, 'rev-parse', '--short', 'HEAD'], { encoding: 'utf8' }).trim(); }
87
+ try { return execFileSync('git', ['-C', root, 'rev-parse', '--short', 'HEAD'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim(); }
74
88
  catch { return null; }
75
89
  }
76
90
 
77
91
  function renderRouter(manifest) {
78
- const agencyLine = manifest.agency.status === 'available'
79
- ? `Agency catalog: ${manifest.agency.agentCount} agents in ${manifest.agency.divisionCount} divisions; load selected roles only.`
80
- : `Agency catalog unavailable: ${manifest.agency.reason}`;
81
- return `# Multi-Agent Workspace Router
82
-
83
- This router is generated by ${GENERATOR}. Sub-agents MUST NOT modify this file.
84
-
85
- ## Bootstrap Protocol
86
- 1. Read the task payload, then \`.harness/multi-agent/state/\`.
87
- 2. Read only the relevant decision and architecture records.
88
- 3. Load the launcher and selected roles before delegating.
89
- 4. Return a structured handoff with changed files and verification evidence.
90
-
91
- ## Boundaries
92
- - Write working state to \`.harness/multi-agent/state/\`; keep raw output in \`.harness/multi-agent/logs/\`.
93
- - Treat \`.harness/multi-agent/architecture/\` and this router as immutable contracts.
94
- - Delegate only the scope named in the launcher; never preload the external roster.
95
- - If a specialist fails, report the failure and use a bounded fallback or human escalation.
96
-
97
- ## Catalog
98
- ${agencyLine}
99
- `;
92
+ const values = {
93
+ RUNTIME_ROOT: manifest.runtime.root,
94
+ RUNTIME_STATE: manifest.runtime.state,
95
+ RUNTIME_LOGS: manifest.runtime.logs,
96
+ LAUNCHER: path.join(manifest.runtime.root, 'launcher.md'),
97
+ DECISION_PATH: manifest.paths.decision.path,
98
+ DOMAIN_PATH: manifest.paths.domain.path,
99
+ ARCHITECTURE_PATH: manifest.paths.architecture.path
100
+ };
101
+ const template = fs.readFileSync(ROUTER_TEMPLATE, 'utf8');
102
+ return template.replace(/\{\{([A-Z_]+)\}\}/g, (match, name) => {
103
+ if (!(name in values)) throw new Error(`router template placeholder is unknown: ${name}`);
104
+ return values[name];
105
+ });
100
106
  }
101
107
 
102
108
  function renderLauncher(manifest, selectedAgents) {
103
109
  const lines = [
104
- '# Multi-Agent Launcher',
105
- '',
110
+ '# Multi-Agent Launcher', '',
106
111
  `Generator: ${GENERATOR}`,
107
- `Platform: ${manifest.platform || 'generic'}`,
108
- `Stack: ${manifest.stack}`,
109
- '',
110
- '## Dispatch Contract',
112
+ `Runtime: ${manifest.runtime.root}`,
113
+ `Workspace: ${manifest.workspace.root}`,
114
+ `Platform: ${manifest.workspace.platform || 'generic'}`,
115
+ `Stack: ${manifest.workspace.stack}`,
111
116
  '',
112
- 'The orchestrator owns sequencing, scope assignment, retries, and final verification.',
113
- 'Each specialist receives one bounded brief and returns a structured handoff.',
114
- 'Load source bodies on demand; this workspace stores metadata, not an unreviewed roster copy.',
115
- `Converter targets: ${(manifest.agency.converterTargets || []).join(', ') || 'none configured'}.`,
116
- '',
117
- '## Selected Specialists',
118
- ''
117
+ 'The installed multi-agent-workspace skill and indexer are immutable. Read',
118
+ 'manifest.json and handoff.json from the runtime root before dispatching.',
119
+ '', '## Resolved document paths', ''
119
120
  ];
120
- if (selectedAgents.length === 0) {
121
- lines.push('- None selected. Search `roles/agency-catalog.json` and rerun the scaffold with `--agent` or `--division`.');
121
+ for (const zone of DOCUMENT_ZONES) {
122
+ const entry = manifest.paths[zone];
123
+ lines.push(`- ${zone}: ${entry.path} (${entry.source})`);
124
+ }
125
+ lines.push('', '## Selected Specialists', '');
126
+ if (!selectedAgents.length) {
127
+ lines.push('- None selected. Configure an agency source and rerun with --agent or --division.');
122
128
  } else {
123
129
  for (const agent of selectedAgents) {
124
130
  lines.push(`- **${agent.name}** [${agent.division}] - ${agent.description}`);
@@ -126,53 +132,148 @@ function renderLauncher(manifest, selectedAgents) {
126
132
  lines.push(' - boundary: only the files and deliverables named in the dispatch brief.');
127
133
  }
128
134
  }
129
- lines.push('', '## Handoff Schema', '', 'Return `status`, `changes`, `verification`, `risks`, and `nextAction`; a failed verification is not a successful handoff.', '');
135
+ lines.push('', '## Handoff Schema', '', 'Return `status`, `changes`, `verification`, `risks`, and `nextAction`.', '');
130
136
  return lines.join('\n');
131
137
  }
132
138
 
133
- function planArtifacts(outputRoot, manifest, catalog, selectedAgents) {
134
- const catalogPayload = catalog
135
- ? { ...catalog, generatedBy: GENERATOR }
136
- : { generatedBy: GENERATOR, status: 'unavailable', agents: [], divisions: [], reason: manifest.agency.reason };
137
- const artifacts = [
138
- ['manifest.json', json(manifest)],
139
- ['AGENTS.md', renderRouter(manifest)],
140
- ['launcher.md', renderLauncher(manifest, selectedAgents)],
141
- ['roles/agency-catalog.json', json(catalogPayload)],
142
- ['roles/selected-agents.json', json({ selected: selectedAgents })],
143
- ['handoff.json', json({
144
- schemaVersion: 1,
145
- status: selectedAgents.length || manifest.agency.status !== 'available' ? 'ready' : 'selection-required',
146
- generator: GENERATOR,
147
- scope: { workspace: '.', root: '.harness/multi-agent', zones: ZONES },
148
- selectedAgents: selectedAgents.map(agent => agent.slug),
149
- verification: { catalog: manifest.agency.status, indexer: 'passed' },
150
- nextAction: selectedAgents.length ? 'dispatch selected specialists with bounded briefs' : 'select specialists or configure AGENCY_AGENTS_SOURCE'
151
- })],
152
- ['index_memory.js', fs.readFileSync(path.join(__dirname, 'index_memory.js'))]
153
- ];
154
- for (const zone of ZONES) artifacts.push([`${zone}/.gitkeep`, '']);
155
- return artifacts.map(([relative, content]) => ({ path: path.join(outputRoot, relative), content }));
139
+ function listFiles(root) {
140
+ const files = [];
141
+ if (!fs.existsSync(root)) return files;
142
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
143
+ const full = path.join(root, entry.name);
144
+ if (entry.isDirectory()) files.push(...listFiles(full));
145
+ else if (entry.isFile()) files.push(full);
146
+ }
147
+ return files;
156
148
  }
157
149
 
158
- function writeArtifacts(outputRoot, artifacts, force) {
159
- for (const artifact of artifacts) {
160
- if (!fs.existsSync(artifact.path)) continue;
161
- const existing = fs.readFileSync(artifact.path);
162
- if (!existing.equals(Buffer.isBuffer(artifact.content) ? artifact.content : Buffer.from(artifact.content)) && !force) {
163
- throw new Error(`generated artifact conflict: ${path.relative(outputRoot, artifact.path)} (use --force only for Harness-owned output)`);
150
+ function sameFile(left, right) {
151
+ try { return fs.readFileSync(left).equals(fs.readFileSync(right)); }
152
+ catch { return false; }
153
+ }
154
+
155
+ function isSamePath(left, right) {
156
+ const a = path.resolve(left);
157
+ const b = path.resolve(right);
158
+ return process.platform === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b;
159
+ }
160
+
161
+ function migrationTargetKey(target) {
162
+ const resolved = path.normalize(path.resolve(target));
163
+ return process.platform === 'win32' ? resolved.toLowerCase() : resolved;
164
+ }
165
+
166
+ function generatedLegacyArtifact(file, manifest) {
167
+ const name = path.basename(file);
168
+ if (name === 'manifest.json') {
169
+ // The pre-#43 manifest had no schema marker, but was still Harness-owned
170
+ // because it lived at the reserved legacy root.
171
+ return manifest && (manifest.generator === GENERATOR || Object.keys(manifest).length === 0);
172
+ }
173
+ if (name === 'handoff.json') return manifest && manifest.generator === GENERATOR;
174
+ if (name === 'AGENTS.md') return /^# Multi-Agent Workspace Router\b/m.test(fs.readFileSync(file, 'utf8'));
175
+ if (name === 'launcher.md') return /^# Multi-Agent Launcher\b/m.test(fs.readFileSync(file, 'utf8'));
176
+ if (name === 'index_memory.js') return /^#!\/usr\/bin\/env node\b/m.test(fs.readFileSync(file, 'utf8'));
177
+ if (name === 'memory-index.md') return /^# Multi-Agent Memory Index\b/m.test(fs.readFileSync(file, 'utf8'));
178
+ return false;
179
+ }
180
+
181
+ function removeEmptyParents(start, stop) {
182
+ let current = start;
183
+ const boundary = path.resolve(stop);
184
+ while (path.resolve(current) !== boundary) {
185
+ const relative = path.relative(boundary, current);
186
+ if (relative.startsWith('..') || path.isAbsolute(relative)) break;
187
+ try {
188
+ if (fs.readdirSync(current).length) break;
189
+ fs.rmdirSync(current);
190
+ } catch { break; }
191
+ current = path.dirname(current);
192
+ }
193
+ }
194
+
195
+ // Migrate authored records from the pre-#43 repository-local output only
196
+ // after every destination conflict has been checked. Generated router,
197
+ // launcher, indexer, and runtime files are intentionally not copied.
198
+ function migrateLegacyWorkspace(workspaceRoot, resolution) {
199
+ const legacyRoot = path.join(workspaceRoot, '.harness', 'multi-agent');
200
+ if (!fs.existsSync(legacyRoot)) return null;
201
+ // The legacy root is an input boundary, not an allowed link target. A
202
+ // junction here could make the migration read and delete authored files
203
+ // outside the workspace while every lexical path still looks local.
204
+ assertContainedPath(workspaceRoot, legacyRoot);
205
+ const legacyBoundary = path.resolve(legacyRoot);
206
+ const copies = [];
207
+ const plannedTargets = new Map();
208
+ for (const zone of DOCUMENT_ZONES) {
209
+ const legacyZone = path.join(legacyRoot, zone === 'decision' ? 'decisions' : zone);
210
+ const destination = resolution.paths[zone].path;
211
+ for (const source of listFiles(legacyZone)) {
212
+ if (path.basename(source) === '.gitkeep') continue;
213
+ const relative = path.relative(legacyZone, source);
214
+ const target = path.join(destination, relative);
215
+ const containedSource = assertContainedPath(legacyRoot, source).target;
216
+ const containedTarget = assertContainedPath(workspaceRoot, target).target;
217
+ if (isSamePath(containedSource, containedTarget)) continue;
218
+ const targetFromLegacy = path.relative(legacyBoundary, containedTarget);
219
+ if (!targetFromLegacy.startsWith('..') && !path.isAbsolute(targetFromLegacy)) {
220
+ throw new Error(`migration destination is inside legacy workspace: ${path.relative(workspaceRoot, containedTarget).replace(/\\/g, '/')}`);
221
+ }
222
+ const targetKey = migrationTargetKey(containedTarget);
223
+ if (plannedTargets.has(targetKey)) {
224
+ throw new Error(`migration conflict: multiple legacy records target ${path.relative(workspaceRoot, containedTarget).replace(/\\/g, '/')}`);
225
+ }
226
+ plannedTargets.set(targetKey, containedSource);
227
+ if (fs.existsSync(containedTarget) && !sameFile(containedSource, containedTarget)) {
228
+ throw new Error(`migration conflict: ${path.relative(workspaceRoot, containedTarget).replace(/\\/g, '/')}`);
229
+ }
230
+ copies.push({ source: containedSource, target: containedTarget });
164
231
  }
165
232
  }
233
+
234
+ for (const copy of copies) {
235
+ fs.mkdirSync(path.dirname(copy.target), { recursive: true });
236
+ if (!fs.existsSync(copy.target)) fs.copyFileSync(copy.source, copy.target);
237
+ }
238
+
239
+ // Remove known generated artifacts only once migration has fully succeeded.
240
+ let legacyManifest = null;
241
+ const manifestPath = path.join(legacyRoot, 'manifest.json');
242
+ if (fs.existsSync(manifestPath)) {
243
+ try { legacyManifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')); } catch { legacyManifest = null; }
244
+ }
245
+ const generated = ['manifest.json', 'AGENTS.md', 'launcher.md', 'index_memory.js', 'memory-index.md', 'handoff.json'];
246
+ for (const name of generated) {
247
+ const file = path.join(legacyRoot, name);
248
+ if (fs.existsSync(file) && generatedLegacyArtifact(file, legacyManifest)) fs.rmSync(file, { force: true });
249
+ }
250
+ for (const copy of copies) fs.rmSync(copy.source, { force: true });
251
+ for (const zone of ['roles', 'state', 'logs']) {
252
+ const runtimeZone = path.join(legacyRoot, zone);
253
+ if (fs.existsSync(runtimeZone)) fs.rmSync(runtimeZone, { recursive: true, force: true });
254
+ }
255
+ for (const zone of ['decisions', 'domain', 'architecture']) {
256
+ for (const marker of listFiles(path.join(legacyRoot, zone)).filter(file => path.basename(file) === '.gitkeep')) {
257
+ fs.rmSync(marker, { force: true });
258
+ }
259
+ removeEmptyParents(path.join(legacyRoot, zone), legacyRoot);
260
+ }
261
+ removeEmptyParents(legacyRoot, workspaceRoot);
262
+ return { from: legacyRoot, records: copies.length };
263
+ }
264
+
265
+ function writeRuntimeArtifacts(runtimeRoot, artifacts) {
166
266
  for (const artifact of artifacts) {
167
267
  fs.mkdirSync(path.dirname(artifact.path), { recursive: true });
168
- fs.writeFileSync(artifact.path, artifact.content);
268
+ fs.writeFileSync(artifact.path, artifact.content, 'utf8');
169
269
  }
170
270
  }
171
271
 
172
- function runIndexer(outputRoot) {
173
- const indexer = path.join(outputRoot, 'index_memory.js');
174
- const output = path.join(outputRoot, 'memory-index.md');
175
- execFileSync(process.execPath, [indexer, '--root', path.dirname(path.dirname(outputRoot)), '--output', output], { stdio: 'pipe' });
272
+ function runIndexer(workspaceRoot, runtimeRoot) {
273
+ const indexer = path.join(__dirname, 'index_memory.js');
274
+ const manifest = path.join(runtimeRoot, 'manifest.json');
275
+ const output = path.join(runtimeRoot, 'memory-index.md');
276
+ execFileSync(process.execPath, [indexer, '--workspace', workspaceRoot, '--manifest', manifest, '--output', output], { stdio: 'pipe' });
176
277
  return output;
177
278
  }
178
279
 
@@ -180,44 +281,90 @@ function scaffold(options) {
180
281
  if (!fs.existsSync(options.workspace) || !fs.statSync(options.workspace).isDirectory()) {
181
282
  throw new Error(`workspace not found: ${options.workspace}`);
182
283
  }
183
- const outputRoot = path.join(options.workspace, '.harness', 'multi-agent');
184
- const existing = readExistingManifest(outputRoot);
185
- if (existing && existing.generator !== GENERATOR) throw new Error('existing .harness/multi-agent belongs to another generator');
284
+ const resolution = ensureCommittableFallback(resolveProjectDocs(options.workspace));
285
+ const runtimeRoot = resolution.runtimeRoot;
286
+ const existing = readExistingManifest(runtimeRoot);
287
+ if (existing && existing.generator !== GENERATOR) throw new Error('existing Harness runtime belongs to another generator');
288
+
186
289
  const catalog = options.source ? readAgencyCatalog(options.source) : null;
187
290
  if (options.expectedRevision && (!catalog || catalog.source.revision !== options.expectedRevision)) {
188
291
  throw new Error(`agency source revision mismatch: expected ${options.expectedRevision}, got ${catalog && catalog.source.revision || '(unknown)'}`);
189
292
  }
190
- if (existing && existing.agency && existing.agency.sourceRevision && (!catalog || existing.agency.sourceRevision !== catalog.source.revision) && !options.allowSourceDrift) {
293
+ if (existing && existing.agency && existing.agency.sourceRevision &&
294
+ (!catalog || existing.agency.sourceRevision !== catalog.source.revision) && !options.allowSourceDrift) {
191
295
  throw new Error(`agency source revision drift: existing ${existing.agency.sourceRevision}, current ${catalog && catalog.source.revision || '(unavailable)'}; pass --allow-source-drift to refresh`);
192
296
  }
193
- const selection = catalog ? resolveSelection(catalog, options.divisions, options.agents, options.allAgents) : { divisionIds: [], agents: [] };
297
+ const selection = catalog
298
+ ? resolveSelection(catalog, options.divisions, options.agents, options.allAgents)
299
+ : { divisionIds: [], agents: [] };
194
300
  if (!catalog && (options.divisions.length || options.agents.length || options.allAgents)) {
195
301
  throw new Error('cannot select agency agents without --agency-source or AGENCY_AGENTS_SOURCE');
196
302
  }
303
+ const migration = migrateLegacyWorkspace(options.workspace, resolution);
304
+ for (const zone of DOCUMENT_ZONES) fs.mkdirSync(resolution.paths[zone].path, { recursive: true });
197
305
  const agency = catalog
198
306
  ? { status: 'available', ...catalog.source, selectedCount: selection.agents.length, selectionRequired: selection.agents.length === 0 }
199
307
  : { status: 'unavailable', reason: 'No agency source configured', requiredConfiguration: '--agency-source <path> or AGENCY_AGENTS_SOURCE', selectedCount: 0, selectionRequired: false };
308
+ const generatedAt = new Date().toISOString();
200
309
  const manifest = {
201
- schemaVersion: 1,
310
+ schemaVersion: 2,
202
311
  generator: GENERATOR,
203
- workspaceRevision: gitRevision(options.workspace),
204
- stack: detectStack(options.workspace),
205
- platform: options.platform,
206
- zones: ZONES,
312
+ workspace: {
313
+ root: resolution.workspaceRoot,
314
+ key: resolution.workspaceKey,
315
+ revision: gitRevision(options.workspace),
316
+ stack: detectStack(options.workspace),
317
+ platform: options.platform
318
+ },
319
+ runtime: {
320
+ root: runtimeRoot,
321
+ state: resolution.runtime.state,
322
+ logs: resolution.runtime.logs,
323
+ roles: resolution.runtime.roles,
324
+ manifest: path.join(runtimeRoot, 'manifest.json'),
325
+ handoff: path.join(runtimeRoot, 'handoff.json')
326
+ },
327
+ paths: resolution.paths,
328
+ zones: ALL_ZONES,
329
+ documentationZones: DOCUMENT_ZONES,
207
330
  supportedPlatforms: SUPPORTED_PLATFORMS,
208
331
  agency,
209
332
  selectedDivisions: selection.divisionIds,
210
333
  selectedAgents: selection.agents,
211
- artifactPaths: ['AGENTS.md', 'launcher.md', 'index_memory.js', 'memory-index.md', 'manifest.json', 'handoff.json']
334
+ execution: { generatedAt, resolver: 'project-docs-resolver', migration },
335
+ artifactPaths: ['AGENTS.md', 'manifest.json', 'handoff.json', 'memory-index.md', 'launcher.md', 'roles/']
212
336
  };
213
- const artifacts = planArtifacts(outputRoot, manifest, catalog, selection.agents);
214
- writeArtifacts(outputRoot, artifacts, options.force || options.allowSourceDrift);
215
- const memoryIndex = runIndexer(outputRoot);
216
- const handoffPath = path.join(outputRoot, 'handoff.json');
217
- const handoff = JSON.parse(fs.readFileSync(handoffPath, 'utf8'));
337
+ const catalogPayload = catalog
338
+ ? { ...catalog, generatedBy: GENERATOR }
339
+ : { generatedBy: GENERATOR, status: 'unavailable', agents: [], divisions: [], reason: agency.reason };
340
+ const handoff = {
341
+ schemaVersion: 2,
342
+ status: selection.agents.length || agency.status !== 'available' ? 'ready' : 'selection-required',
343
+ generator: GENERATOR,
344
+ workspace: resolution.workspaceRoot,
345
+ runtimeRoot,
346
+ paths: resolution.paths,
347
+ selectedAgents: selection.agents.map(agent => agent.slug),
348
+ changes: [],
349
+ execution: { generatedAt, workspaceRevision: manifest.workspace.revision },
350
+ verification: { catalog: agency.status, indexer: 'pending' },
351
+ risks: [],
352
+ nextAction: selection.agents.length ? 'dispatch selected specialists with bounded briefs' : 'select specialists or configure AGENCY_AGENTS_SOURCE'
353
+ };
354
+ const artifacts = [
355
+ { path: path.join(runtimeRoot, 'AGENTS.md'), content: renderRouter(manifest) },
356
+ { path: path.join(runtimeRoot, 'manifest.json'), content: json(manifest) },
357
+ { path: path.join(runtimeRoot, 'handoff.json'), content: json(handoff) },
358
+ { path: path.join(runtimeRoot, 'launcher.md'), content: renderLauncher(manifest, selection.agents) },
359
+ { path: path.join(runtimeRoot, 'roles', 'agency-catalog.json'), content: json(catalogPayload) },
360
+ { path: path.join(runtimeRoot, 'roles', 'selected-agents.json'), content: json({ selected: selection.agents }) }
361
+ ];
362
+ for (const zone of RUNTIME_ZONES) fs.mkdirSync(path.join(runtimeRoot, zone), { recursive: true });
363
+ writeRuntimeArtifacts(runtimeRoot, artifacts);
364
+ const memoryIndex = runIndexer(options.workspace, runtimeRoot);
218
365
  handoff.verification.indexer = 'passed';
219
- fs.writeFileSync(handoffPath, json(handoff));
220
- return { outputRoot, manifest, memoryIndex };
366
+ fs.writeFileSync(path.join(runtimeRoot, 'handoff.json'), json(handoff), 'utf8');
367
+ return { runtimeRoot, manifest, memoryIndex, resolution, migration };
221
368
  }
222
369
 
223
370
  function usage() {
@@ -229,7 +376,7 @@ function usage() {
229
376
  ' --all-agents Explicitly select the complete metadata catalog',
230
377
  ' --platform <name> Validate a supported converter target',
231
378
  ' --allow-source-drift Accept a different source revision on refresh',
232
- ' --force Overwrite only existing Harness-owned artifacts'
379
+ ' --force Retained for compatibility; runtime files are Harness-owned'
233
380
  ].join('\n');
234
381
  }
235
382
 
@@ -238,8 +385,8 @@ function main() {
238
385
  const options = parseArgs(process.argv.slice(2));
239
386
  if (options.help) return console.log(usage());
240
387
  const result = scaffold(options);
241
- console.log(`Multi-agent workspace written to ${result.outputRoot}`);
242
- console.log(` Zones: ${result.manifest.zones.length}`);
388
+ console.log(`Multi-agent runtime written to ${result.runtimeRoot}`);
389
+ console.log(` Documentation zones: ${result.manifest.documentationZones.length}`);
243
390
  console.log(` Agency: ${result.manifest.agency.status}`);
244
391
  console.log(` Selected agents: ${result.manifest.selectedAgents.length}`);
245
392
  console.log(` Memory index: ${result.memoryIndex}`);
@@ -250,4 +397,12 @@ function main() {
250
397
  }
251
398
 
252
399
  if (require.main === module) main();
253
- module.exports = { GENERATOR, ZONES, parseArgs, scaffold, usage };
400
+ module.exports = {
401
+ GENERATOR,
402
+ ZONES: ALL_ZONES,
403
+ DOCUMENT_ZONES,
404
+ parseArgs,
405
+ migrateLegacyWorkspace,
406
+ scaffold,
407
+ usage
408
+ };
@@ -0,0 +1,20 @@
1
+ # Multi-Agent Workspace Router
2
+
3
+ This router is resolved from the installed `multi-agent-workspace` skill. Sub-agents MUST NOT modify it.
4
+
5
+ ## Bootstrap Protocol
6
+
7
+ 1. Read the task payload, then `{{RUNTIME_STATE}}`.
8
+ 2. Read only the relevant document records:
9
+ - decision records at `{{DECISION_PATH}}`
10
+ - domain records at `{{DOMAIN_PATH}}`
11
+ - architecture records at `{{ARCHITECTURE_PATH}}`
12
+ 3. Read `{{LAUNCHER}}` and the selected roles before delegating.
13
+ 4. Return a structured handoff with changed files and verification evidence.
14
+
15
+ ## Boundaries
16
+
17
+ - Write working state to `{{RUNTIME_STATE}}`; keep raw output in `{{RUNTIME_LOGS}}`.
18
+ - Treat `{{ARCHITECTURE_PATH}}` and this router as immutable contracts.
19
+ - Delegate only the scope named in the launcher; never preload the external roster.
20
+ - If a specialist fails, report the failure and use a bounded fallback or human escalation.
@@ -10,18 +10,16 @@
10
10
  2. Semantic Integrity: For Smart Merge, align updates with logical consistency, memory management, and verification guardrails while preserving original YAML frontmatter.
11
11
 
12
12
  ## [Action Phase: Generation]
13
- 3. Template Iteration: Process selected agents iteratively to manage context usage:
14
- - Read the corresponding template for each chosen role.
15
- - If merging into an existing file, read the target file first to preserve custom configuration.
16
- - Inject cognitive guardrails: role boundaries, shared memory references (`memory-keeper`), and outcome verification guidelines.
17
- - Align generated prompts with target platform capabilities (e.g. VS Code Copilot, Cursor, Claude Code) and appropriate task-tracking frameworks.
18
- - Substitute placeholders using the `Context Profile`. If a placeholder remains unresolved, insert a clear comment tag (e.g. `// TODO: Manual configuration needed`).
19
- - Save generated files to paths defined in `guidelines/platform-<platform>.md`.
20
- 4. Orchestrator Generation: Consult `guidelines/platform-<platform>.md` for Orchestrator requirements and update central prompts if necessary.
13
+ 3. Run `node multi-agent-workspace/scripts/scaffold.js --workspace <root>` with the selected source, divisions, agents, and platform.
14
+ - Resolve document zones through the shared resolver; preserve the provenance of explicit, inferred, and fallback paths.
15
+ - Migrate authored decision, domain, and architecture records only after checking every destination conflict.
16
+ - Keep runtime metadata, roles, state, logs, and memory indexes under the global workspace-keyed state root.
17
+ - Resolve the router template and indexer from the installed skill directory; render the router into the global runtime, never into the repository.
18
+ 4. If the source is unavailable, retain the explicit unavailable-catalog status and do not claim a complete roster.
21
19
 
22
20
  ## [Summarize & Verification Phase]
23
- 5. Integrity Check: Verify generated files exist on disk before reporting completion.
21
+ 5. Integrity Check: Verify the global manifest, handoff, launcher, selected roles, memory index, and resolved document paths before reporting completion.
24
22
 
25
23
  ## [Record: Exit]
26
24
  6. Completion: Record successful subagent scaffolding.
27
- 7. Handoff: Load and execute `workflows/04-launcher.md`, passing the `Context Profile`, `Selected Agents`, and newly created file paths.
25
+ 7. Handoff: Load and execute `workflows/04-launcher.md`, passing the `Context Profile`, `Selected Agents`, and newly created file paths.
@@ -4,13 +4,13 @@
4
4
  - Verify inheritance of `Target Directory`, `Context Profile`, `Selected Agents`, and newly created file paths from Phase 3.
5
5
 
6
6
  ## [Action Phase: Entry Point Generation]
7
- 1. Entry Point Generation: Read `templates/agent-launcher.md`.
8
- 2. Handoff Integration: Substitute placeholders using the `Context Profile`. Dynamically inject the paths and roles of `Selected Agents` into the Launcher so it serves as an effective central router.
9
- 3. Disk Write: Save the launcher entry point to the path specified in platform guidelines.
7
+ 1. Entry Point Generation: Read the installed multi-agent-workspace skill and the runtime `manifest.json`/`handoff.json`.
8
+ 2. Handoff Integration: Use the resolved decision, domain, and architecture paths plus the selected roles from the manifest when dispatching bounded briefs.
9
+ 3. Disk Write: Update the global runtime launcher and resolved router generated by `scaffold.js`; repository-local router and executable copies are not created.
10
10
 
11
11
  ## [Summarize: Verification]
12
- 4. Check: Verify the Launcher was created successfully on disk.
12
+ 4. Check: Verify the runtime launcher, handoff schema, memory index, and selected-role metadata are readable from the global runtime root.
13
13
 
14
14
  ## [Record: Exit]
15
15
  5. Completion: Present a clean summary table listing generated agent files and their configured roles.
16
- 6. UX Handoff: Provide the user with guidance on how to trigger or invoke their new agent scaffold.
16
+ 6. UX Handoff: Provide the user with guidance on how to trigger or invoke their new agent scaffold.