harness-everything 0.34.0 → 0.36.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 (246) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.github/workflows/ci.yml +2 -0
  4. package/AGENTS.md +3 -0
  5. package/CHANGELOG.md +42 -0
  6. package/ci/fixtures/doc-obligations/derive/acceptance-only/base/docs/prd/graph.md +22 -0
  7. package/ci/fixtures/doc-obligations/derive/acceptance-only/candidate/docs/prd/graph.md +22 -0
  8. package/ci/fixtures/doc-obligations/derive/alias-only/base/docs/prd/graph.md +24 -0
  9. package/ci/fixtures/doc-obligations/derive/alias-only/candidate/docs/prd/graph.md +24 -0
  10. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/base/ci/mechanism-lint.test.js +2 -0
  11. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/base/docs/prd/graph.md +20 -0
  12. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/candidate/ci/mechanism-lint.test.js +2 -0
  13. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/candidate/docs/prd/graph.md +20 -0
  14. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/base/ci/mechanism-lint.test.js +2 -0
  15. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/base/docs/prd/graph.md +20 -0
  16. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/candidate/ci/mechanism-lint.test.js +2 -0
  17. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/candidate/docs/prd/graph.md +20 -0
  18. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/inventory.json +7 -0
  19. package/ci/fixtures/doc-obligations/derive/attribution-impossible/base/ci/mechanism-open.test.js +3 -0
  20. package/ci/fixtures/doc-obligations/derive/attribution-impossible/candidate/ci/mechanism-open.test.js.fixture +2 -0
  21. package/ci/fixtures/doc-obligations/derive/clause-context-typo/base/docs/prd/graph.md +24 -0
  22. package/ci/fixtures/doc-obligations/derive/clause-context-typo/candidate/docs/prd/graph.md +24 -0
  23. package/ci/fixtures/doc-obligations/derive/code-only/base/src/lint.js +1 -0
  24. package/ci/fixtures/doc-obligations/derive/code-only/candidate/src/lint.js +1 -0
  25. package/ci/fixtures/doc-obligations/derive/comment-only-test/base/ci/mechanism-lint.test.js +2 -0
  26. package/ci/fixtures/doc-obligations/derive/comment-only-test/candidate/ci/mechanism-lint.test.js +2 -0
  27. package/ci/fixtures/doc-obligations/derive/computed-member-assert/base/ci/mechanism-c1.test.js +2 -0
  28. package/ci/fixtures/doc-obligations/derive/computed-member-assert/candidate/ci/mechanism-c1.test.js +2 -0
  29. package/ci/fixtures/doc-obligations/derive/computed-member-variable/base/ci/mechanism-c1.test.js +2 -0
  30. package/ci/fixtures/doc-obligations/derive/computed-member-variable/candidate/ci/mechanism-c1.test.js +2 -0
  31. package/ci/fixtures/doc-obligations/derive/config.json +11 -0
  32. package/ci/fixtures/doc-obligations/derive/decision-fence-backtick/base/docs/adr/GRPH-010.md +20 -0
  33. package/ci/fixtures/doc-obligations/derive/decision-fence-backtick/candidate/docs/adr/GRPH-010.md +20 -0
  34. package/ci/fixtures/doc-obligations/derive/decision-fence-tilde/base/docs/adr/GRPH-010.md +20 -0
  35. package/ci/fixtures/doc-obligations/derive/decision-fence-tilde/candidate/docs/adr/GRPH-010.md +20 -0
  36. package/ci/fixtures/doc-obligations/derive/deep-strict-equal/base/ci/mechanism-s1.test.js +2 -0
  37. package/ci/fixtures/doc-obligations/derive/deep-strict-equal/candidate/ci/mechanism-s1.test.js +2 -0
  38. package/ci/fixtures/doc-obligations/derive/deleted-adr/base/docs/adr/GRPH-008.md +14 -0
  39. package/ci/fixtures/doc-obligations/derive/deleted-prd/base/ci/mechanism-lint.test.js +2 -0
  40. package/ci/fixtures/doc-obligations/derive/deleted-prd/base/docs/prd/graph.md +20 -0
  41. package/ci/fixtures/doc-obligations/derive/deleted-prd/candidate/ci/mechanism-lint.test.js +2 -0
  42. package/ci/fixtures/doc-obligations/derive/derived-rename/base/docs/index.md +3 -0
  43. package/ci/fixtures/doc-obligations/derive/derived-rename/base/src/model/a.js +1 -0
  44. package/ci/fixtures/doc-obligations/derive/derived-rename/candidate/docs/index.md +3 -0
  45. package/ci/fixtures/doc-obligations/derive/derived-rename/candidate/src/model/b.js +1 -0
  46. package/ci/fixtures/doc-obligations/derive/derived-rename/config.json +7 -0
  47. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/base/docs/index.md +3 -0
  48. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/base/docs/model-summary.md +3 -0
  49. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/base/src/model.js +1 -0
  50. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/candidate/docs/index.md +3 -0
  51. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/candidate/docs/model-summary.md +3 -0
  52. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/candidate/src/model.js +1 -0
  53. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/config.json +10 -0
  54. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/base/ci/mechanism-lint.test.js +2 -0
  55. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/base/docs/prd/graph-one/r001.md +19 -0
  56. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/base/docs/prd/graph-two/r001.md +19 -0
  57. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/candidate/ci/mechanism-lint.test.js +2 -0
  58. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/candidate/docs/prd/graph-one/r001.md +19 -0
  59. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/candidate/docs/prd/graph-two/r001.md +19 -0
  60. package/ci/fixtures/doc-obligations/derive/docs-only/base/docs/reference/guide.md +3 -0
  61. package/ci/fixtures/doc-obligations/derive/docs-only/candidate/docs/reference/guide.md +3 -0
  62. package/ci/fixtures/doc-obligations/derive/dup-req-id/base/ci/mechanism-lint.test.js +2 -0
  63. package/ci/fixtures/doc-obligations/derive/dup-req-id/base/docs/prd/graph-a.md +20 -0
  64. package/ci/fixtures/doc-obligations/derive/dup-req-id/base/docs/prd/graph-b.md +20 -0
  65. package/ci/fixtures/doc-obligations/derive/dup-req-id/candidate/ci/mechanism-lint.test.js +2 -0
  66. package/ci/fixtures/doc-obligations/derive/dup-req-id/candidate/docs/prd/graph-a.md +20 -0
  67. package/ci/fixtures/doc-obligations/derive/dup-req-id/candidate/docs/prd/graph-b.md +20 -0
  68. package/ci/fixtures/doc-obligations/derive/expect-computed-literal/base/ci/mechanism-e.test.js +2 -0
  69. package/ci/fixtures/doc-obligations/derive/expect-computed-literal/candidate/ci/mechanism-e.test.js +2 -0
  70. package/ci/fixtures/doc-obligations/derive/expect-computed-matcher/base/ci/mechanism-e.test.js +2 -0
  71. package/ci/fixtures/doc-obligations/derive/expect-computed-matcher/candidate/ci/mechanism-e.test.js +2 -0
  72. package/ci/fixtures/doc-obligations/derive/expect-not-to-equal/base/ci/mechanism-s1.test.js +2 -0
  73. package/ci/fixtures/doc-obligations/derive/expect-not-to-equal/candidate/ci/mechanism-s1.test.js +2 -0
  74. package/ci/fixtures/doc-obligations/derive/formatting-only-test/base/ci/mechanism-lint.test.js +2 -0
  75. package/ci/fixtures/doc-obligations/derive/formatting-only-test/candidate/ci/mechanism-lint.test.js +2 -0
  76. package/ci/fixtures/doc-obligations/derive/helper-delegated-test/base/docs/prd/graph.md +18 -0
  77. package/ci/fixtures/doc-obligations/derive/helper-delegated-test/candidate/ci/mechanism-helper.test.js +1 -0
  78. package/ci/fixtures/doc-obligations/derive/helper-delegated-test/candidate/docs/prd/graph.md +18 -0
  79. package/ci/fixtures/doc-obligations/derive/historical-only-req/base/ci/mechanism-lint.test.js +2 -0
  80. package/ci/fixtures/doc-obligations/derive/historical-only-req/base/docs/prd/graph/r001.md +25 -0
  81. package/ci/fixtures/doc-obligations/derive/historical-only-req/candidate/ci/mechanism-lint.test.js +2 -0
  82. package/ci/fixtures/doc-obligations/derive/historical-only-req/candidate/docs/prd/graph/r001.md +25 -0
  83. package/ci/fixtures/doc-obligations/derive/historical-only-req/candidate/docs/prd/graph/r002.md +23 -0
  84. package/ci/fixtures/doc-obligations/derive/in-place-current/base/ci/mechanism-inplace.test.js +2 -0
  85. package/ci/fixtures/doc-obligations/derive/in-place-current/base/docs/prd/graph/r001.md +20 -0
  86. package/ci/fixtures/doc-obligations/derive/in-place-current/base/docs/prd/graph/r002.md +26 -0
  87. package/ci/fixtures/doc-obligations/derive/in-place-current/candidate/ci/mechanism-inplace.test.js +2 -0
  88. package/ci/fixtures/doc-obligations/derive/in-place-current/candidate/docs/prd/graph/r001.md +20 -0
  89. package/ci/fixtures/doc-obligations/derive/in-place-current/candidate/docs/prd/graph/r002.md +28 -0
  90. package/ci/fixtures/doc-obligations/derive/in-place-historical/base/ci/mechanism-inplace.test.js +2 -0
  91. package/ci/fixtures/doc-obligations/derive/in-place-historical/base/docs/prd/graph/r001.md +20 -0
  92. package/ci/fixtures/doc-obligations/derive/in-place-historical/base/docs/prd/graph/r002.md +26 -0
  93. package/ci/fixtures/doc-obligations/derive/in-place-historical/candidate/ci/mechanism-inplace.test.js +2 -0
  94. package/ci/fixtures/doc-obligations/derive/in-place-historical/candidate/docs/prd/graph/r001.md +22 -0
  95. package/ci/fixtures/doc-obligations/derive/in-place-historical/candidate/docs/prd/graph/r002.md +26 -0
  96. package/ci/fixtures/doc-obligations/derive/invalid-clause/base/docs/prd/graph.md +24 -0
  97. package/ci/fixtures/doc-obligations/derive/invalid-clause/candidate/docs/prd/graph.md +24 -0
  98. package/ci/fixtures/doc-obligations/derive/legacy-untagged-fallback/base/ci/mechanism-legacy.test.js +6 -0
  99. package/ci/fixtures/doc-obligations/derive/legacy-untagged-fallback/candidate/ci/mechanism-legacy.test.js +6 -0
  100. package/ci/fixtures/doc-obligations/derive/literal-whitespace-assert/base/ci/mechanism-lint.test.js +2 -0
  101. package/ci/fixtures/doc-obligations/derive/literal-whitespace-assert/candidate/ci/mechanism-lint.test.js +2 -0
  102. package/ci/fixtures/doc-obligations/derive/malformed-citation-attribution/base/ci/mechanism-bad.test.js +6 -0
  103. package/ci/fixtures/doc-obligations/derive/malformed-citation-attribution/candidate/ci/mechanism-bad.test.js.fixture +6 -0
  104. package/ci/fixtures/doc-obligations/derive/malformed-prd/base/ci/mechanism-lint.test.js +2 -0
  105. package/ci/fixtures/doc-obligations/derive/malformed-prd/base/docs/prd/graph.md +20 -0
  106. package/ci/fixtures/doc-obligations/derive/malformed-prd/candidate/ci/mechanism-lint.test.js +2 -0
  107. package/ci/fixtures/doc-obligations/derive/malformed-prd/candidate/docs/prd/graph.md +11 -0
  108. package/ci/fixtures/doc-obligations/derive/missing-approval/base/docs/prd/graph.md +20 -0
  109. package/ci/fixtures/doc-obligations/derive/missing-approval/candidate/docs/prd/graph.md +20 -0
  110. package/ci/fixtures/doc-obligations/derive/mixed-attribution/base/ci/mechanism-mixed.test.js +6 -0
  111. package/ci/fixtures/doc-obligations/derive/mixed-attribution/base/docs/prd/graph.md +24 -0
  112. package/ci/fixtures/doc-obligations/derive/mixed-attribution/candidate/ci/mechanism-mixed.test.js.fixture +5 -0
  113. package/ci/fixtures/doc-obligations/derive/mixed-attribution/candidate/docs/prd/graph.md +24 -0
  114. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/base/ci/mechanism-lint.test.js +2 -0
  115. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/base/docs/reference/guide.md +3 -0
  116. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/base/src/lint.js +1 -0
  117. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/candidate/ci/mechanism-lint.test.js +2 -0
  118. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/candidate/docs/reference/guide.md +3 -0
  119. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/candidate/src/lint.js +1 -0
  120. package/ci/fixtures/doc-obligations/derive/multiline-comment-only/base/ci/mechanism-multi.test.js +5 -0
  121. package/ci/fixtures/doc-obligations/derive/multiline-comment-only/candidate/ci/mechanism-multi.test.js +5 -0
  122. package/ci/fixtures/doc-obligations/derive/multiline-expect/base/ci/mechanism-multi.test.js +6 -0
  123. package/ci/fixtures/doc-obligations/derive/multiline-expect/candidate/ci/mechanism-multi.test.js +6 -0
  124. package/ci/fixtures/doc-obligations/derive/multiline-formatting-only/base/ci/mechanism-multi.test.js +5 -0
  125. package/ci/fixtures/doc-obligations/derive/multiline-formatting-only/candidate/ci/mechanism-multi.test.js +5 -0
  126. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/base/ci/mechanism-multi.test.js +5 -0
  127. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/base/docs/prd/graph.md +18 -0
  128. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/candidate/ci/mechanism-multi.test.js +5 -0
  129. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/candidate/docs/prd/graph.md +18 -0
  130. package/ci/fixtures/doc-obligations/derive/multiline-strictequal/base/ci/mechanism-multi.test.js +5 -0
  131. package/ci/fixtures/doc-obligations/derive/multiline-strictequal/candidate/ci/mechanism-multi.test.js +5 -0
  132. package/ci/fixtures/doc-obligations/derive/new-prd/candidate/docs/prd/graph-new.md +20 -0
  133. package/ci/fixtures/doc-obligations/derive/new-reference/candidate/docs/reference/new-note.md +3 -0
  134. package/ci/fixtures/doc-obligations/derive/new-req-test/candidate/ci/mechanism-new.test.js +2 -0
  135. package/ci/fixtures/doc-obligations/derive/orphan-req-test/base/ci/mechanism-lint.test.js +2 -0
  136. package/ci/fixtures/doc-obligations/derive/orphan-req-test/base/docs/prd/graph.md +20 -0
  137. package/ci/fixtures/doc-obligations/derive/orphan-req-test/candidate/ci/mechanism-lint.test.js +2 -0
  138. package/ci/fixtures/doc-obligations/derive/orphan-req-test/candidate/docs/prd/graph.md +20 -0
  139. package/ci/fixtures/doc-obligations/derive/partial-revision/base/ci/mechanism-partial.test.js +5 -0
  140. package/ci/fixtures/doc-obligations/derive/partial-revision/base/docs/prd/graph/r001.md +24 -0
  141. package/ci/fixtures/doc-obligations/derive/partial-revision/candidate/ci/mechanism-partial.test.js +5 -0
  142. package/ci/fixtures/doc-obligations/derive/partial-revision/candidate/docs/prd/graph/r001.md +24 -0
  143. package/ci/fixtures/doc-obligations/derive/partial-revision/candidate/docs/prd/graph/r002.md +26 -0
  144. package/ci/fixtures/doc-obligations/derive/regex-literal-whitespace/base/ci/mechanism-lint.test.js +2 -0
  145. package/ci/fixtures/doc-obligations/derive/regex-literal-whitespace/candidate/ci/mechanism-lint.test.js +2 -0
  146. package/ci/fixtures/doc-obligations/derive/rename/base/docs/reference/old-guide.md +3 -0
  147. package/ci/fixtures/doc-obligations/derive/rename/candidate/docs/reference/guide.md +3 -0
  148. package/ci/fixtures/doc-obligations/derive/replacement-target/base/docs/prd/graph.md +24 -0
  149. package/ci/fixtures/doc-obligations/derive/replacement-target/candidate/docs/prd/graph.md +24 -0
  150. package/ci/fixtures/doc-obligations/derive/req-context-typo/base/docs/prd/graph.md +26 -0
  151. package/ci/fixtures/doc-obligations/derive/req-context-typo/candidate/docs/prd/graph.md +26 -0
  152. package/ci/fixtures/doc-obligations/derive/req-revision/base/ci/mechanism-lint.test.js +2 -0
  153. package/ci/fixtures/doc-obligations/derive/req-revision/base/docs/prd/graph/r001.md +20 -0
  154. package/ci/fixtures/doc-obligations/derive/req-revision/candidate/ci/mechanism-lint.test.js +2 -0
  155. package/ci/fixtures/doc-obligations/derive/req-revision/candidate/docs/prd/graph/r001.md +20 -0
  156. package/ci/fixtures/doc-obligations/derive/req-revision/candidate/docs/prd/graph/r002.md +28 -0
  157. package/ci/fixtures/doc-obligations/derive/req-revision-in-place/base/docs/prd/graph/r001.md +20 -0
  158. package/ci/fixtures/doc-obligations/derive/req-revision-in-place/candidate/docs/prd/graph/r001.md +22 -0
  159. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/base/ci/mechanism-lint.test.js +2 -0
  160. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/base/docs/prd/graph/r001.md +20 -0
  161. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/base/docs/prd/graph/r002.md +26 -0
  162. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/candidate/ci/mechanism-lint.test.js +2 -0
  163. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/candidate/docs/prd/graph/r001.md +20 -0
  164. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/candidate/docs/prd/graph/r002.md +26 -0
  165. package/ci/fixtures/doc-obligations/derive/string-literal-tag/base/ci/mechanism-str.test.js +2 -0
  166. package/ci/fixtures/doc-obligations/derive/string-literal-tag/candidate/ci/mechanism-str.test.js +2 -0
  167. package/ci/fixtures/doc-obligations/derive/tag-inside-test-call/base/ci/mechanism-inside.test.js +5 -0
  168. package/ci/fixtures/doc-obligations/derive/tag-inside-test-call/candidate/ci/mechanism-inside.test.js +5 -0
  169. package/ci/fixtures/doc-obligations/derive/tagged-test/base/ci/mechanism-lint.test.js +2 -0
  170. package/ci/fixtures/doc-obligations/derive/tagged-test/candidate/ci/mechanism-lint.test.js +2 -0
  171. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/base/ci/mechanism-lint.test.js +2 -0
  172. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/base/docs/prd/graph.md +20 -0
  173. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/candidate/ci/mechanism-lint.test.js +2 -0
  174. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/candidate/docs/prd/graph.md +20 -0
  175. package/ci/fixtures/doc-obligations/derive/template-literal-tag/base/ci/mechanism-tpl.test.js +4 -0
  176. package/ci/fixtures/doc-obligations/derive/template-literal-tag/base/docs/prd/graph.md +18 -0
  177. package/ci/fixtures/doc-obligations/derive/template-literal-tag/candidate/ci/mechanism-tpl.test.js +4 -0
  178. package/ci/fixtures/doc-obligations/derive/template-literal-tag/candidate/docs/prd/graph.md +18 -0
  179. package/ci/fixtures/doc-obligations/derive/template-literal-whitespace/base/ci/mechanism-lint.test.js +2 -0
  180. package/ci/fixtures/doc-obligations/derive/template-literal-whitespace/candidate/ci/mechanism-lint.test.js +2 -0
  181. package/ci/fixtures/doc-obligations/derive/title-only-rename/base/ci/mechanism-title.test.js +3 -0
  182. package/ci/fixtures/doc-obligations/derive/title-only-rename/candidate/ci/mechanism-title.test.js +3 -0
  183. package/ci/fixtures/doc-obligations/derive/title-only-unrelated-computed/base/ci/mechanism-u.test.js +4 -0
  184. package/ci/fixtures/doc-obligations/derive/title-only-unrelated-computed/candidate/ci/mechanism-u.test.js +4 -0
  185. package/ci/fixtures/doc-obligations/derive/top-level-no-file-tag/base/ci/mechanism-top.test.js +4 -0
  186. package/ci/fixtures/doc-obligations/derive/top-level-no-file-tag/candidate/ci/mechanism-top.test.js +4 -0
  187. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/base/ci/mechanism-lint.test.js +2 -0
  188. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/base/docs/prd/graph.md +20 -0
  189. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/candidate/ci/mechanism-lint.test.js +2 -0
  190. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/candidate/docs/prd/graph.md +20 -0
  191. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/base/ci/mechanism-two.test.js +6 -0
  192. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/base/docs/prd/graph.md +24 -0
  193. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/candidate/ci/mechanism-two.test.js +6 -0
  194. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/candidate/docs/prd/graph.md +24 -0
  195. package/ci/fixtures/doc-obligations/derive/typo-context/base/docs/adr/GRPH-007.md +14 -0
  196. package/ci/fixtures/doc-obligations/derive/typo-context/candidate/docs/adr/GRPH-007.md +14 -0
  197. package/ci/fixtures/doc-obligations/derive/typo-decision/base/docs/adr/GRPH-007.md +14 -0
  198. package/ci/fixtures/doc-obligations/derive/typo-decision/candidate/docs/adr/GRPH-007.md +14 -0
  199. package/ci/fixtures/doc-obligations/derive/unbalanced-statement/base/ci/mechanism-multi.test.js +5 -0
  200. package/ci/fixtures/doc-obligations/derive/unbalanced-statement/candidate/ci/mechanism-multi.test.js.fixture +4 -0
  201. package/ci/fixtures/doc-obligations/derive/unknown-adr/base/docs/adr/GRPH-009.md +14 -0
  202. package/ci/fixtures/doc-obligations/derive/unknown-adr/candidate/docs/adr/GRPH-009.md +12 -0
  203. package/ci/fixtures/doc-obligations/derive/unsupported-assertion-syntax/base/ci/mechanism-s1.test.js +2 -0
  204. package/ci/fixtures/doc-obligations/derive/unsupported-assertion-syntax/candidate/ci/mechanism-s1.test.js +2 -0
  205. package/ci/fixtures/doc-obligations/derive/whitespace-only-test/base/ci/mechanism-lint.test.js +2 -0
  206. package/ci/fixtures/doc-obligations/derive/whitespace-only-test/candidate/ci/mechanism-lint.test.js +2 -0
  207. package/ci/fixtures/doc-obligations/evidence/base/docs/adr/GRPH-007.md +15 -0
  208. package/ci/fixtures/doc-obligations/evidence/base/docs/prd/PRD-GRPH-001.md +25 -0
  209. package/ci/fixtures/doc-obligations/evidence/candidate/docs/adr/GRPH-007.md +15 -0
  210. package/ci/fixtures/doc-obligations/evidence/candidate/docs/prd/PRD-GRPH-001.md +25 -0
  211. package/ci/mechanism-325-3a-cross.test.js +795 -0
  212. package/ci/mechanism-325-3a-doc-evidence.test.js +1172 -0
  213. package/ci/mechanism-325-3a-doc-obligations.test.js +742 -0
  214. package/ci/mechanism-36-verify-timeout.test.js +534 -0
  215. package/ci/mechanism-37-portability-lint.test.js +71 -0
  216. package/ci/mechanism-38-verify-all.test.js +112 -0
  217. package/ci/mechanism-39-opencode-verify-outcomes.test.js +374 -0
  218. package/ci/mechanism-pr334-haiku.test.js +298 -0
  219. package/ci/mechanism-pr334-luna.test.js +192 -0
  220. package/ci/mechanism-pr334-opencode.test.js +313 -0
  221. package/ci/mechanism-pr334-r2-boundary.test.js +239 -0
  222. package/ci/mechanism-pr334-r2-resolution.test.js +243 -0
  223. package/ci/mechanism-pr334-r2-scope.test.js +127 -0
  224. package/ci/mechanism-pr334-r3-boundary.test.js +356 -0
  225. package/ci/mechanism-pr334-r3-citations.test.js +205 -0
  226. package/ci/mechanism-pr334-r3-headings.test.js +268 -0
  227. package/ci/portability-lint.js +288 -0
  228. package/docs/document-lifecycle.md +57 -1
  229. package/docs/repository-contract.md +1 -1
  230. package/harness-everything/SKILL.md +1 -1
  231. package/harness-everything/scripts/doc-evidence.js +471 -0
  232. package/harness-everything/scripts/doc-lifecycle.js +1 -1
  233. package/harness-everything/scripts/doc-obligations.js +1571 -0
  234. package/opencode-plugin/README.md +33 -2
  235. package/opencode-plugin/hooks/verify.js +87 -11
  236. package/opencode-plugin/index.mjs +216 -25
  237. package/opencode-plugin/plugin.json +1 -1
  238. package/package.json +3 -1
  239. package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
  240. package/plugins/harness-everything/plugin.json +1 -1
  241. package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
  242. package/plugins/harness-everything/skills/harness-everything/scripts/doc-evidence.js +471 -0
  243. package/plugins/harness-everything/skills/harness-everything/scripts/doc-lifecycle.js +1 -1
  244. package/plugins/harness-everything/skills/harness-everything/scripts/doc-obligations.js +1571 -0
  245. package/sbom.cdx.json +7 -7
  246. package/scripts/verify-all.js +314 -0
package/sbom.cdx.json CHANGED
@@ -2,23 +2,23 @@
2
2
  "$schema": "https://cyclonedx.org/schema/bom-1.7.schema.json",
3
3
  "bomFormat": "CycloneDX",
4
4
  "specVersion": "1.7",
5
- "serialNumber": "urn:uuid:a1e5f8bb-3e11-505d-a9e9-4d3796393d51",
5
+ "serialNumber": "urn:uuid:81cf2be0-d984-5cb9-9eee-bcd04849c7b9",
6
6
  "version": 1,
7
7
  "metadata": {
8
- "timestamp": "2026-10-17T16:23:38.167Z",
8
+ "timestamp": "2026-10-18T23:18:17.342Z",
9
9
  "tools": [
10
10
  {
11
11
  "vendor": "Harness Everything",
12
12
  "name": "generate-sbom.js",
13
- "version": "0.34.0"
13
+ "version": "0.36.0"
14
14
  }
15
15
  ],
16
16
  "component": {
17
17
  "type": "application",
18
- "bom-ref": "pkg:npm/harness-everything@0.34.0",
18
+ "bom-ref": "pkg:npm/harness-everything@0.36.0",
19
19
  "name": "harness-everything",
20
- "version": "0.34.0",
21
- "purl": "pkg:npm/harness-everything@0.34.0"
20
+ "version": "0.36.0",
21
+ "purl": "pkg:npm/harness-everything@0.36.0"
22
22
  }
23
23
  },
24
24
  "components": [
@@ -1999,7 +1999,7 @@
1999
1999
  ]
2000
2000
  },
2001
2001
  {
2002
- "ref": "pkg:npm/harness-everything@0.34.0",
2002
+ "ref": "pkg:npm/harness-everything@0.36.0",
2003
2003
  "dependsOn": [
2004
2004
  "pkg:npm/%40commitlint/cli@19.8.1",
2005
2005
  "pkg:npm/%40commitlint/config-conventional@19.8.1",
@@ -0,0 +1,314 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * Local CI-mirror gate runner.
6
+ *
7
+ * AGENTS.md lists the gate commands that cover the same contract categories
8
+ * as CI; recent PR history shows runs where a gate category was skipped
9
+ * locally and failed only after push (PR #301 consistency/runtime-floor,
10
+ * PR #327 Windows self-regression). This script runs the same set in CI
11
+ * order, from the working tree or a clean detached checkout of HEAD, and
12
+ * prints a Markdown table that is paste-ready for PR evidence.
13
+ *
14
+ * Every known gate always appears in the report. A gate that did not run is
15
+ * UNCHECKED with its reason (fast subset, skipped by flag, tool unavailable)
16
+ * and never counts as passing evidence.
17
+ *
18
+ * Usage:
19
+ * npm run verify:all # full gate set, current tree
20
+ * npm run verify:all -- --fast # hermetic + mutations + consistency + portability
21
+ * npm run verify:all -- --clean # all gates in a fresh detached worktree of HEAD
22
+ * npm run verify:all -- --node22 # add the Node 22 execution smoke-test lane (npx node@22)
23
+ * npm run verify:all -- --clean --no-install # --clean without npm ci in the worktree
24
+ * npm run verify:all -- --no-waza # skip the optional waza readiness gate
25
+ *
26
+ * Exit code is 1 when any executed gate fails.
27
+ *
28
+ * Process launching: `git` always runs with shell:false and structured
29
+ * argument vectors, so worktree paths with spaces survive on every OS. On
30
+ * Windows `npm`/`npx`/`waza` may be `.cmd` shims, which Node refuses to
31
+ * spawn without a shell; those are launched through the shell with only
32
+ * fixed, space-free argument tokens (scripts/ci/mechanism-38-* covers the
33
+ * split).
34
+ */
35
+
36
+ const fs = require('fs');
37
+ const os = require('os');
38
+ const path = require('path');
39
+ const { spawnSync } = require('child_process');
40
+
41
+ const ROOT = path.resolve(__dirname, '..');
42
+
43
+ const FULL_PLAN = [
44
+ { label: 'self-regression (hermetic + mechanism + routing contracts)', command: ['npm', 'test'], fast: true },
45
+ { label: 'mutation checks', command: ['npm', 'run', 'test:mutations'], fast: true },
46
+ { label: 'consistency (docs, manifests, repo contract, prompt contracts)', command: ['npm', 'run', 'test:consistency'], fast: true },
47
+ { label: 'references resolve', command: ['npm', 'run', 'test:references'], fast: false },
48
+ { label: 'release consistency', command: ['npm', 'run', 'test:release'], fast: false },
49
+ { label: 'skill description collision', command: ['npm', 'run', 'test:collision'], fast: false },
50
+ { label: 'skill routing coverage', command: ['npm', 'run', 'test:routing:skills'], fast: false },
51
+ { label: 'routing invariants', command: ['npm', 'run', 'test:routing:invariants'], fast: false },
52
+ { label: 'openai plugin package', command: ['npm', 'run', 'test:plugin:openai'], fast: false },
53
+ { label: 'openai public submission', command: ['npm', 'run', 'test:plugin:submission'], fast: false },
54
+ { label: 'platform compatibility matrix', command: ['npm', 'run', 'test:platform:compatibility'], fast: false },
55
+ { label: 'test-source portability', command: ['npm', 'run', 'test:portability'], fast: true },
56
+ ];
57
+
58
+ const NODE22_PLAN = [
59
+ { label: 'node22 lane: self-regression execution smoke test', command: ['npx', '-y', 'node@22', 'self-evolve/scripts/self-regression.js'] },
60
+ { label: 'node22 lane: installer roundtrip execution smoke test', command: ['npx', '-y', 'node@22', 'ci/installer-roundtrip.test.js'] },
61
+ ];
62
+
63
+ // CI's runtime-floor job installs dependencies under Node 22 before running
64
+ // the suite. Locally the smoke tests execute under Node 22 but use the
65
+ // current host's node_modules, so dependency-install compatibility stays
66
+ // explicitly UNCHECKED instead of being implied.
67
+ const NODE22_UNVERIFIED = {
68
+ label: 'node22 lane: dependency install (npm ci under Node 22)',
69
+ reason: 'covered by the CI runtime-floor job; not replicated locally',
70
+ };
71
+
72
+ const WAZA_ENTRY = {
73
+ label: 'waza readiness (optional)',
74
+ command: ['npm', 'run', 'waza:check'],
75
+ tool: 'waza',
76
+ };
77
+
78
+ function usage() {
79
+ console.log('Usage: npm run verify:all [-- --fast] [-- --clean] [-- --node22] [-- --no-install] [-- --no-waza]');
80
+ }
81
+
82
+ function parseArgs(argv) {
83
+ const options = { fast: false, clean: false, node22: false, install: true, waza: true };
84
+ for (const arg of argv) {
85
+ if (arg === '--fast') options.fast = true;
86
+ else if (arg === '--clean') options.clean = true;
87
+ else if (arg === '--node22') options.node22 = true;
88
+ else if (arg === '--no-install') options.install = false;
89
+ else if (arg === '--no-waza') options.waza = false;
90
+ else if (arg === '--help' || arg === '-h') {
91
+ usage();
92
+ process.exit(0);
93
+ } else {
94
+ console.error(`Unknown argument: ${arg}`);
95
+ usage();
96
+ process.exit(2);
97
+ }
98
+ }
99
+ return options;
100
+ }
101
+
102
+ // Windows may resolve npm/npx/waza as .cmd shims that Node only spawns with
103
+ // a shell. They receive fixed, space-free tokens only; git never needs this.
104
+ const SHELL_TOOLS = new Set(['npm', 'npx', 'waza']);
105
+
106
+ function needsShell(cmd, platform = process.platform) {
107
+ return platform === 'win32' && SHELL_TOOLS.has(cmd);
108
+ }
109
+
110
+ function spawnTool(cmd, args, options) {
111
+ return spawnSync(cmd, args, { ...options, shell: needsShell(cmd) });
112
+ }
113
+
114
+ function run(command, cwd, env) {
115
+ const [cmd, ...args] = command;
116
+ const started = Date.now();
117
+ const result = spawnTool(cmd, args, {
118
+ cwd,
119
+ stdio: 'inherit',
120
+ env: env ? { ...process.env, ...env } : process.env,
121
+ });
122
+ const seconds = (Date.now() - started) / 1000;
123
+ if (result.error) {
124
+ console.error(`spawn failed: ${cmd} — ${result.error.message}`);
125
+ return { status: null, seconds };
126
+ }
127
+ return { status: result.status, seconds };
128
+ }
129
+
130
+ function capture(command, cwd) {
131
+ const [cmd, ...args] = command;
132
+ return spawnTool(cmd, args, { cwd, encoding: 'utf8' });
133
+ }
134
+
135
+ function runGit(args, cwd) {
136
+ return spawnSync('git', args, { cwd, encoding: 'utf8', shell: false });
137
+ }
138
+
139
+ function formatSeconds(value) {
140
+ return `${value.toFixed(1)}s`;
141
+ }
142
+
143
+ function wazaEnv() {
144
+ const probe = capture(['waza', '--version']);
145
+ if (probe.status === 0) return {};
146
+ const local = path.join(os.homedir(), 'bin', process.platform === 'win32' ? 'waza.exe' : 'waza');
147
+ if (fs.existsSync(local)) return { WAZA_BIN: local };
148
+ return null;
149
+ }
150
+
151
+ function buildPlan(options) {
152
+ const entries = FULL_PLAN.map(entry => ({
153
+ ...entry,
154
+ enabled: options.fast ? entry.fast : true,
155
+ reason: entry.fast ? null : 'not in the --fast subset',
156
+ }));
157
+ entries.push(...NODE22_PLAN.map(entry => ({
158
+ ...entry,
159
+ enabled: options.node22,
160
+ reason: options.node22 ? null : 'not requested; add --node22',
161
+ })));
162
+ entries.push({ ...NODE22_UNVERIFIED, enabled: false, alwaysUnchecked: true });
163
+ entries.push({
164
+ ...WAZA_ENTRY,
165
+ enabled: options.waza,
166
+ reason: options.waza ? null : 'skipped by --no-waza',
167
+ });
168
+ return entries;
169
+ }
170
+
171
+ function prepareCleanRoot(install) {
172
+ const head = runGit(['rev-parse', 'HEAD'], ROOT).stdout.trim();
173
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'harness-verify-all-'));
174
+ const add = runGit(['worktree', 'add', '--detach', dir, head], ROOT);
175
+ if (add.status !== 0) {
176
+ throw new Error(`git worktree add failed: ${add.stderr || add.stdout}`);
177
+ }
178
+ if (install) {
179
+ console.log('\nInstalling dependencies in clean worktree (npm ci --ignore-scripts)...');
180
+ const ci = run(['npm', 'ci', '--ignore-scripts'], dir);
181
+ if (ci.status !== 0) {
182
+ runGit(['worktree', 'remove', '--force', dir], ROOT);
183
+ throw new Error('npm ci failed in the clean worktree');
184
+ }
185
+ }
186
+ return { dir, head };
187
+ }
188
+
189
+ function removeCleanRoot(dir) {
190
+ const removed = runGit(['worktree', 'remove', '--force', dir], ROOT);
191
+ if (removed.status !== 0) {
192
+ console.error(`warning: could not remove clean worktree ${dir}: ${removed.stderr || removed.stdout}`);
193
+ }
194
+ }
195
+
196
+ function formatMode(options) {
197
+ return options.fast ? 'fast subset' : 'full gate set';
198
+ }
199
+
200
+ function formatFlags(options) {
201
+ const flags = [];
202
+ if (options.fast) flags.push('--fast');
203
+ if (options.clean) flags.push('--clean');
204
+ if (options.node22) flags.push('--node22');
205
+ if (!options.install) flags.push('--no-install');
206
+ if (!options.waza) flags.push('--no-waza');
207
+ return flags.length > 0 ? flags.join(' ') : '(defaults)';
208
+ }
209
+
210
+ function renderReport(rows, meta) {
211
+ const lines = [];
212
+ lines.push('## Local gate run — paste-ready evidence');
213
+ lines.push(
214
+ `HEAD \`${meta.head}\` · node ${meta.node} · ${meta.platform}` +
215
+ `${meta.clean ? ' · clean detached worktree' : ''} · mode: ${meta.mode} · flags: ${meta.flags}`
216
+ );
217
+ lines.push('');
218
+ lines.push('| # | Gate | Result | Time |');
219
+ lines.push('| --- | --- | --- | --- |');
220
+ rows.forEach((row, index) => {
221
+ const result = row.status === 'UNCHECKED' ? `UNCHECKED (${row.reason})` : row.status;
222
+ const time = row.seconds === null || row.seconds === undefined ? '—' : formatSeconds(row.seconds);
223
+ lines.push(`| ${index + 1} | ${row.label} | ${result} | ${time} |`);
224
+ });
225
+ const failures = rows.filter(row => row.status === 'FAIL').length;
226
+ const unchecked = rows.filter(row => row.status === 'UNCHECKED').length;
227
+ const passed = rows.filter(row => row.status === 'PASS').length;
228
+ lines.push('');
229
+ lines.push(`Summary: ${passed} PASS, ${failures} FAIL, ${unchecked} UNCHECKED.`);
230
+ return { text: lines.join('\n'), failures, unchecked, passed };
231
+ }
232
+
233
+ function probeWazaEntry(entry) {
234
+ if (entry.tool !== 'waza' || !entry.enabled) return entry;
235
+ const env = wazaEnv();
236
+ if (env) return { ...entry, env };
237
+ return { ...entry, enabled: false, reason: 'waza not found on PATH or ~/bin' };
238
+ }
239
+
240
+ function main() {
241
+ const options = parseArgs(process.argv.slice(2));
242
+ const head = runGit(['rev-parse', 'HEAD'], ROOT).stdout.trim();
243
+
244
+ console.log('=== 🚦 Harness local gate runner (CI mirror) ===');
245
+ console.log(`Repository: ${ROOT}`);
246
+ console.log(`HEAD: ${head}`);
247
+ console.log(`Runtime: node ${process.version} on ${process.platform}`);
248
+ console.log(`Mode: ${formatMode(options)} · flags: ${formatFlags(options)}`);
249
+
250
+ const plan = buildPlan(options).map(probeWazaEntry);
251
+
252
+ let cwd = ROOT;
253
+ let clean = null;
254
+ if (options.clean) {
255
+ clean = prepareCleanRoot(options.install);
256
+ cwd = clean.dir;
257
+ }
258
+
259
+ const rows = [];
260
+ try {
261
+ let executed = 0;
262
+ const enabledCount = plan.filter(entry => entry.enabled).length;
263
+ for (const entry of plan) {
264
+ if (!entry.enabled) {
265
+ rows.push({ label: entry.label, status: 'UNCHECKED', reason: entry.reason, seconds: null });
266
+ continue;
267
+ }
268
+ executed += 1;
269
+ console.log(`\n▶ [${executed}/${enabledCount}] ${entry.label}`);
270
+ console.log(` $ ${entry.command.join(' ')}`);
271
+ const result = run(entry.command, cwd, entry.env);
272
+ rows.push({
273
+ label: entry.label,
274
+ status: result.status === 0 ? 'PASS' : 'FAIL',
275
+ seconds: result.seconds,
276
+ });
277
+ }
278
+ } finally {
279
+ if (clean) removeCleanRoot(clean.dir);
280
+ }
281
+
282
+ const report = renderReport(rows, {
283
+ head,
284
+ node: process.version,
285
+ platform: process.platform,
286
+ clean: Boolean(options.clean),
287
+ mode: formatMode(options),
288
+ flags: formatFlags(options),
289
+ });
290
+
291
+ console.log(`\n${report.text}`);
292
+
293
+ if (report.failures > 0) {
294
+ process.exitCode = 1;
295
+ process.exit(1);
296
+ }
297
+ }
298
+
299
+ if (require.main === module) {
300
+ main();
301
+ }
302
+
303
+ module.exports = {
304
+ FULL_PLAN,
305
+ NODE22_PLAN,
306
+ NODE22_UNVERIFIED,
307
+ buildPlan,
308
+ needsShell,
309
+ renderReport,
310
+ runGit,
311
+ formatMode,
312
+ formatFlags,
313
+ parseArgs,
314
+ };