harness-everything 0.34.0 → 0.35.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 (234) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +25 -0
  4. package/ci/fixtures/doc-obligations/derive/acceptance-only/base/docs/prd/graph.md +22 -0
  5. package/ci/fixtures/doc-obligations/derive/acceptance-only/candidate/docs/prd/graph.md +22 -0
  6. package/ci/fixtures/doc-obligations/derive/alias-only/base/docs/prd/graph.md +24 -0
  7. package/ci/fixtures/doc-obligations/derive/alias-only/candidate/docs/prd/graph.md +24 -0
  8. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/base/ci/mechanism-lint.test.js +2 -0
  9. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/base/docs/prd/graph.md +20 -0
  10. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/candidate/ci/mechanism-lint.test.js +2 -0
  11. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/candidate/docs/prd/graph.md +20 -0
  12. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/base/ci/mechanism-lint.test.js +2 -0
  13. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/base/docs/prd/graph.md +20 -0
  14. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/candidate/ci/mechanism-lint.test.js +2 -0
  15. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/candidate/docs/prd/graph.md +20 -0
  16. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/inventory.json +7 -0
  17. package/ci/fixtures/doc-obligations/derive/attribution-impossible/base/ci/mechanism-open.test.js +3 -0
  18. package/ci/fixtures/doc-obligations/derive/attribution-impossible/candidate/ci/mechanism-open.test.js.fixture +2 -0
  19. package/ci/fixtures/doc-obligations/derive/clause-context-typo/base/docs/prd/graph.md +24 -0
  20. package/ci/fixtures/doc-obligations/derive/clause-context-typo/candidate/docs/prd/graph.md +24 -0
  21. package/ci/fixtures/doc-obligations/derive/code-only/base/src/lint.js +1 -0
  22. package/ci/fixtures/doc-obligations/derive/code-only/candidate/src/lint.js +1 -0
  23. package/ci/fixtures/doc-obligations/derive/comment-only-test/base/ci/mechanism-lint.test.js +2 -0
  24. package/ci/fixtures/doc-obligations/derive/comment-only-test/candidate/ci/mechanism-lint.test.js +2 -0
  25. package/ci/fixtures/doc-obligations/derive/computed-member-assert/base/ci/mechanism-c1.test.js +2 -0
  26. package/ci/fixtures/doc-obligations/derive/computed-member-assert/candidate/ci/mechanism-c1.test.js +2 -0
  27. package/ci/fixtures/doc-obligations/derive/computed-member-variable/base/ci/mechanism-c1.test.js +2 -0
  28. package/ci/fixtures/doc-obligations/derive/computed-member-variable/candidate/ci/mechanism-c1.test.js +2 -0
  29. package/ci/fixtures/doc-obligations/derive/config.json +11 -0
  30. package/ci/fixtures/doc-obligations/derive/decision-fence-backtick/base/docs/adr/GRPH-010.md +20 -0
  31. package/ci/fixtures/doc-obligations/derive/decision-fence-backtick/candidate/docs/adr/GRPH-010.md +20 -0
  32. package/ci/fixtures/doc-obligations/derive/decision-fence-tilde/base/docs/adr/GRPH-010.md +20 -0
  33. package/ci/fixtures/doc-obligations/derive/decision-fence-tilde/candidate/docs/adr/GRPH-010.md +20 -0
  34. package/ci/fixtures/doc-obligations/derive/deep-strict-equal/base/ci/mechanism-s1.test.js +2 -0
  35. package/ci/fixtures/doc-obligations/derive/deep-strict-equal/candidate/ci/mechanism-s1.test.js +2 -0
  36. package/ci/fixtures/doc-obligations/derive/deleted-adr/base/docs/adr/GRPH-008.md +14 -0
  37. package/ci/fixtures/doc-obligations/derive/deleted-prd/base/ci/mechanism-lint.test.js +2 -0
  38. package/ci/fixtures/doc-obligations/derive/deleted-prd/base/docs/prd/graph.md +20 -0
  39. package/ci/fixtures/doc-obligations/derive/deleted-prd/candidate/ci/mechanism-lint.test.js +2 -0
  40. package/ci/fixtures/doc-obligations/derive/derived-rename/base/docs/index.md +3 -0
  41. package/ci/fixtures/doc-obligations/derive/derived-rename/base/src/model/a.js +1 -0
  42. package/ci/fixtures/doc-obligations/derive/derived-rename/candidate/docs/index.md +3 -0
  43. package/ci/fixtures/doc-obligations/derive/derived-rename/candidate/src/model/b.js +1 -0
  44. package/ci/fixtures/doc-obligations/derive/derived-rename/config.json +7 -0
  45. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/base/docs/index.md +3 -0
  46. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/base/docs/model-summary.md +3 -0
  47. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/base/src/model.js +1 -0
  48. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/candidate/docs/index.md +3 -0
  49. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/candidate/docs/model-summary.md +3 -0
  50. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/candidate/src/model.js +1 -0
  51. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/config.json +10 -0
  52. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/base/ci/mechanism-lint.test.js +2 -0
  53. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/base/docs/prd/graph-one/r001.md +19 -0
  54. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/base/docs/prd/graph-two/r001.md +19 -0
  55. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/candidate/ci/mechanism-lint.test.js +2 -0
  56. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/candidate/docs/prd/graph-one/r001.md +19 -0
  57. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/candidate/docs/prd/graph-two/r001.md +19 -0
  58. package/ci/fixtures/doc-obligations/derive/docs-only/base/docs/reference/guide.md +3 -0
  59. package/ci/fixtures/doc-obligations/derive/docs-only/candidate/docs/reference/guide.md +3 -0
  60. package/ci/fixtures/doc-obligations/derive/dup-req-id/base/ci/mechanism-lint.test.js +2 -0
  61. package/ci/fixtures/doc-obligations/derive/dup-req-id/base/docs/prd/graph-a.md +20 -0
  62. package/ci/fixtures/doc-obligations/derive/dup-req-id/base/docs/prd/graph-b.md +20 -0
  63. package/ci/fixtures/doc-obligations/derive/dup-req-id/candidate/ci/mechanism-lint.test.js +2 -0
  64. package/ci/fixtures/doc-obligations/derive/dup-req-id/candidate/docs/prd/graph-a.md +20 -0
  65. package/ci/fixtures/doc-obligations/derive/dup-req-id/candidate/docs/prd/graph-b.md +20 -0
  66. package/ci/fixtures/doc-obligations/derive/expect-computed-literal/base/ci/mechanism-e.test.js +2 -0
  67. package/ci/fixtures/doc-obligations/derive/expect-computed-literal/candidate/ci/mechanism-e.test.js +2 -0
  68. package/ci/fixtures/doc-obligations/derive/expect-computed-matcher/base/ci/mechanism-e.test.js +2 -0
  69. package/ci/fixtures/doc-obligations/derive/expect-computed-matcher/candidate/ci/mechanism-e.test.js +2 -0
  70. package/ci/fixtures/doc-obligations/derive/expect-not-to-equal/base/ci/mechanism-s1.test.js +2 -0
  71. package/ci/fixtures/doc-obligations/derive/expect-not-to-equal/candidate/ci/mechanism-s1.test.js +2 -0
  72. package/ci/fixtures/doc-obligations/derive/formatting-only-test/base/ci/mechanism-lint.test.js +2 -0
  73. package/ci/fixtures/doc-obligations/derive/formatting-only-test/candidate/ci/mechanism-lint.test.js +2 -0
  74. package/ci/fixtures/doc-obligations/derive/helper-delegated-test/base/docs/prd/graph.md +18 -0
  75. package/ci/fixtures/doc-obligations/derive/helper-delegated-test/candidate/ci/mechanism-helper.test.js +1 -0
  76. package/ci/fixtures/doc-obligations/derive/helper-delegated-test/candidate/docs/prd/graph.md +18 -0
  77. package/ci/fixtures/doc-obligations/derive/historical-only-req/base/ci/mechanism-lint.test.js +2 -0
  78. package/ci/fixtures/doc-obligations/derive/historical-only-req/base/docs/prd/graph/r001.md +25 -0
  79. package/ci/fixtures/doc-obligations/derive/historical-only-req/candidate/ci/mechanism-lint.test.js +2 -0
  80. package/ci/fixtures/doc-obligations/derive/historical-only-req/candidate/docs/prd/graph/r001.md +25 -0
  81. package/ci/fixtures/doc-obligations/derive/historical-only-req/candidate/docs/prd/graph/r002.md +23 -0
  82. package/ci/fixtures/doc-obligations/derive/in-place-current/base/ci/mechanism-inplace.test.js +2 -0
  83. package/ci/fixtures/doc-obligations/derive/in-place-current/base/docs/prd/graph/r001.md +20 -0
  84. package/ci/fixtures/doc-obligations/derive/in-place-current/base/docs/prd/graph/r002.md +26 -0
  85. package/ci/fixtures/doc-obligations/derive/in-place-current/candidate/ci/mechanism-inplace.test.js +2 -0
  86. package/ci/fixtures/doc-obligations/derive/in-place-current/candidate/docs/prd/graph/r001.md +20 -0
  87. package/ci/fixtures/doc-obligations/derive/in-place-current/candidate/docs/prd/graph/r002.md +28 -0
  88. package/ci/fixtures/doc-obligations/derive/in-place-historical/base/ci/mechanism-inplace.test.js +2 -0
  89. package/ci/fixtures/doc-obligations/derive/in-place-historical/base/docs/prd/graph/r001.md +20 -0
  90. package/ci/fixtures/doc-obligations/derive/in-place-historical/base/docs/prd/graph/r002.md +26 -0
  91. package/ci/fixtures/doc-obligations/derive/in-place-historical/candidate/ci/mechanism-inplace.test.js +2 -0
  92. package/ci/fixtures/doc-obligations/derive/in-place-historical/candidate/docs/prd/graph/r001.md +22 -0
  93. package/ci/fixtures/doc-obligations/derive/in-place-historical/candidate/docs/prd/graph/r002.md +26 -0
  94. package/ci/fixtures/doc-obligations/derive/invalid-clause/base/docs/prd/graph.md +24 -0
  95. package/ci/fixtures/doc-obligations/derive/invalid-clause/candidate/docs/prd/graph.md +24 -0
  96. package/ci/fixtures/doc-obligations/derive/legacy-untagged-fallback/base/ci/mechanism-legacy.test.js +6 -0
  97. package/ci/fixtures/doc-obligations/derive/legacy-untagged-fallback/candidate/ci/mechanism-legacy.test.js +6 -0
  98. package/ci/fixtures/doc-obligations/derive/literal-whitespace-assert/base/ci/mechanism-lint.test.js +2 -0
  99. package/ci/fixtures/doc-obligations/derive/literal-whitespace-assert/candidate/ci/mechanism-lint.test.js +2 -0
  100. package/ci/fixtures/doc-obligations/derive/malformed-citation-attribution/base/ci/mechanism-bad.test.js +6 -0
  101. package/ci/fixtures/doc-obligations/derive/malformed-citation-attribution/candidate/ci/mechanism-bad.test.js.fixture +6 -0
  102. package/ci/fixtures/doc-obligations/derive/malformed-prd/base/ci/mechanism-lint.test.js +2 -0
  103. package/ci/fixtures/doc-obligations/derive/malformed-prd/base/docs/prd/graph.md +20 -0
  104. package/ci/fixtures/doc-obligations/derive/malformed-prd/candidate/ci/mechanism-lint.test.js +2 -0
  105. package/ci/fixtures/doc-obligations/derive/malformed-prd/candidate/docs/prd/graph.md +11 -0
  106. package/ci/fixtures/doc-obligations/derive/missing-approval/base/docs/prd/graph.md +20 -0
  107. package/ci/fixtures/doc-obligations/derive/missing-approval/candidate/docs/prd/graph.md +20 -0
  108. package/ci/fixtures/doc-obligations/derive/mixed-attribution/base/ci/mechanism-mixed.test.js +6 -0
  109. package/ci/fixtures/doc-obligations/derive/mixed-attribution/base/docs/prd/graph.md +24 -0
  110. package/ci/fixtures/doc-obligations/derive/mixed-attribution/candidate/ci/mechanism-mixed.test.js.fixture +5 -0
  111. package/ci/fixtures/doc-obligations/derive/mixed-attribution/candidate/docs/prd/graph.md +24 -0
  112. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/base/ci/mechanism-lint.test.js +2 -0
  113. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/base/docs/reference/guide.md +3 -0
  114. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/base/src/lint.js +1 -0
  115. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/candidate/ci/mechanism-lint.test.js +2 -0
  116. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/candidate/docs/reference/guide.md +3 -0
  117. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/candidate/src/lint.js +1 -0
  118. package/ci/fixtures/doc-obligations/derive/multiline-comment-only/base/ci/mechanism-multi.test.js +5 -0
  119. package/ci/fixtures/doc-obligations/derive/multiline-comment-only/candidate/ci/mechanism-multi.test.js +5 -0
  120. package/ci/fixtures/doc-obligations/derive/multiline-expect/base/ci/mechanism-multi.test.js +6 -0
  121. package/ci/fixtures/doc-obligations/derive/multiline-expect/candidate/ci/mechanism-multi.test.js +6 -0
  122. package/ci/fixtures/doc-obligations/derive/multiline-formatting-only/base/ci/mechanism-multi.test.js +5 -0
  123. package/ci/fixtures/doc-obligations/derive/multiline-formatting-only/candidate/ci/mechanism-multi.test.js +5 -0
  124. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/base/ci/mechanism-multi.test.js +5 -0
  125. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/base/docs/prd/graph.md +18 -0
  126. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/candidate/ci/mechanism-multi.test.js +5 -0
  127. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/candidate/docs/prd/graph.md +18 -0
  128. package/ci/fixtures/doc-obligations/derive/multiline-strictequal/base/ci/mechanism-multi.test.js +5 -0
  129. package/ci/fixtures/doc-obligations/derive/multiline-strictequal/candidate/ci/mechanism-multi.test.js +5 -0
  130. package/ci/fixtures/doc-obligations/derive/new-prd/candidate/docs/prd/graph-new.md +20 -0
  131. package/ci/fixtures/doc-obligations/derive/new-reference/candidate/docs/reference/new-note.md +3 -0
  132. package/ci/fixtures/doc-obligations/derive/new-req-test/candidate/ci/mechanism-new.test.js +2 -0
  133. package/ci/fixtures/doc-obligations/derive/orphan-req-test/base/ci/mechanism-lint.test.js +2 -0
  134. package/ci/fixtures/doc-obligations/derive/orphan-req-test/base/docs/prd/graph.md +20 -0
  135. package/ci/fixtures/doc-obligations/derive/orphan-req-test/candidate/ci/mechanism-lint.test.js +2 -0
  136. package/ci/fixtures/doc-obligations/derive/orphan-req-test/candidate/docs/prd/graph.md +20 -0
  137. package/ci/fixtures/doc-obligations/derive/partial-revision/base/ci/mechanism-partial.test.js +5 -0
  138. package/ci/fixtures/doc-obligations/derive/partial-revision/base/docs/prd/graph/r001.md +24 -0
  139. package/ci/fixtures/doc-obligations/derive/partial-revision/candidate/ci/mechanism-partial.test.js +5 -0
  140. package/ci/fixtures/doc-obligations/derive/partial-revision/candidate/docs/prd/graph/r001.md +24 -0
  141. package/ci/fixtures/doc-obligations/derive/partial-revision/candidate/docs/prd/graph/r002.md +26 -0
  142. package/ci/fixtures/doc-obligations/derive/regex-literal-whitespace/base/ci/mechanism-lint.test.js +2 -0
  143. package/ci/fixtures/doc-obligations/derive/regex-literal-whitespace/candidate/ci/mechanism-lint.test.js +2 -0
  144. package/ci/fixtures/doc-obligations/derive/rename/base/docs/reference/old-guide.md +3 -0
  145. package/ci/fixtures/doc-obligations/derive/rename/candidate/docs/reference/guide.md +3 -0
  146. package/ci/fixtures/doc-obligations/derive/replacement-target/base/docs/prd/graph.md +24 -0
  147. package/ci/fixtures/doc-obligations/derive/replacement-target/candidate/docs/prd/graph.md +24 -0
  148. package/ci/fixtures/doc-obligations/derive/req-context-typo/base/docs/prd/graph.md +26 -0
  149. package/ci/fixtures/doc-obligations/derive/req-context-typo/candidate/docs/prd/graph.md +26 -0
  150. package/ci/fixtures/doc-obligations/derive/req-revision/base/ci/mechanism-lint.test.js +2 -0
  151. package/ci/fixtures/doc-obligations/derive/req-revision/base/docs/prd/graph/r001.md +20 -0
  152. package/ci/fixtures/doc-obligations/derive/req-revision/candidate/ci/mechanism-lint.test.js +2 -0
  153. package/ci/fixtures/doc-obligations/derive/req-revision/candidate/docs/prd/graph/r001.md +20 -0
  154. package/ci/fixtures/doc-obligations/derive/req-revision/candidate/docs/prd/graph/r002.md +28 -0
  155. package/ci/fixtures/doc-obligations/derive/req-revision-in-place/base/docs/prd/graph/r001.md +20 -0
  156. package/ci/fixtures/doc-obligations/derive/req-revision-in-place/candidate/docs/prd/graph/r001.md +22 -0
  157. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/base/ci/mechanism-lint.test.js +2 -0
  158. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/base/docs/prd/graph/r001.md +20 -0
  159. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/base/docs/prd/graph/r002.md +26 -0
  160. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/candidate/ci/mechanism-lint.test.js +2 -0
  161. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/candidate/docs/prd/graph/r001.md +20 -0
  162. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/candidate/docs/prd/graph/r002.md +26 -0
  163. package/ci/fixtures/doc-obligations/derive/string-literal-tag/base/ci/mechanism-str.test.js +2 -0
  164. package/ci/fixtures/doc-obligations/derive/string-literal-tag/candidate/ci/mechanism-str.test.js +2 -0
  165. package/ci/fixtures/doc-obligations/derive/tag-inside-test-call/base/ci/mechanism-inside.test.js +5 -0
  166. package/ci/fixtures/doc-obligations/derive/tag-inside-test-call/candidate/ci/mechanism-inside.test.js +5 -0
  167. package/ci/fixtures/doc-obligations/derive/tagged-test/base/ci/mechanism-lint.test.js +2 -0
  168. package/ci/fixtures/doc-obligations/derive/tagged-test/candidate/ci/mechanism-lint.test.js +2 -0
  169. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/base/ci/mechanism-lint.test.js +2 -0
  170. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/base/docs/prd/graph.md +20 -0
  171. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/candidate/ci/mechanism-lint.test.js +2 -0
  172. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/candidate/docs/prd/graph.md +20 -0
  173. package/ci/fixtures/doc-obligations/derive/template-literal-tag/base/ci/mechanism-tpl.test.js +4 -0
  174. package/ci/fixtures/doc-obligations/derive/template-literal-tag/base/docs/prd/graph.md +18 -0
  175. package/ci/fixtures/doc-obligations/derive/template-literal-tag/candidate/ci/mechanism-tpl.test.js +4 -0
  176. package/ci/fixtures/doc-obligations/derive/template-literal-tag/candidate/docs/prd/graph.md +18 -0
  177. package/ci/fixtures/doc-obligations/derive/template-literal-whitespace/base/ci/mechanism-lint.test.js +2 -0
  178. package/ci/fixtures/doc-obligations/derive/template-literal-whitespace/candidate/ci/mechanism-lint.test.js +2 -0
  179. package/ci/fixtures/doc-obligations/derive/title-only-rename/base/ci/mechanism-title.test.js +3 -0
  180. package/ci/fixtures/doc-obligations/derive/title-only-rename/candidate/ci/mechanism-title.test.js +3 -0
  181. package/ci/fixtures/doc-obligations/derive/title-only-unrelated-computed/base/ci/mechanism-u.test.js +4 -0
  182. package/ci/fixtures/doc-obligations/derive/title-only-unrelated-computed/candidate/ci/mechanism-u.test.js +4 -0
  183. package/ci/fixtures/doc-obligations/derive/top-level-no-file-tag/base/ci/mechanism-top.test.js +4 -0
  184. package/ci/fixtures/doc-obligations/derive/top-level-no-file-tag/candidate/ci/mechanism-top.test.js +4 -0
  185. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/base/ci/mechanism-lint.test.js +2 -0
  186. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/base/docs/prd/graph.md +20 -0
  187. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/candidate/ci/mechanism-lint.test.js +2 -0
  188. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/candidate/docs/prd/graph.md +20 -0
  189. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/base/ci/mechanism-two.test.js +6 -0
  190. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/base/docs/prd/graph.md +24 -0
  191. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/candidate/ci/mechanism-two.test.js +6 -0
  192. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/candidate/docs/prd/graph.md +24 -0
  193. package/ci/fixtures/doc-obligations/derive/typo-context/base/docs/adr/GRPH-007.md +14 -0
  194. package/ci/fixtures/doc-obligations/derive/typo-context/candidate/docs/adr/GRPH-007.md +14 -0
  195. package/ci/fixtures/doc-obligations/derive/typo-decision/base/docs/adr/GRPH-007.md +14 -0
  196. package/ci/fixtures/doc-obligations/derive/typo-decision/candidate/docs/adr/GRPH-007.md +14 -0
  197. package/ci/fixtures/doc-obligations/derive/unbalanced-statement/base/ci/mechanism-multi.test.js +5 -0
  198. package/ci/fixtures/doc-obligations/derive/unbalanced-statement/candidate/ci/mechanism-multi.test.js.fixture +4 -0
  199. package/ci/fixtures/doc-obligations/derive/unknown-adr/base/docs/adr/GRPH-009.md +14 -0
  200. package/ci/fixtures/doc-obligations/derive/unknown-adr/candidate/docs/adr/GRPH-009.md +12 -0
  201. package/ci/fixtures/doc-obligations/derive/unsupported-assertion-syntax/base/ci/mechanism-s1.test.js +2 -0
  202. package/ci/fixtures/doc-obligations/derive/unsupported-assertion-syntax/candidate/ci/mechanism-s1.test.js +2 -0
  203. package/ci/fixtures/doc-obligations/derive/whitespace-only-test/base/ci/mechanism-lint.test.js +2 -0
  204. package/ci/fixtures/doc-obligations/derive/whitespace-only-test/candidate/ci/mechanism-lint.test.js +2 -0
  205. package/ci/fixtures/doc-obligations/evidence/base/docs/adr/GRPH-007.md +15 -0
  206. package/ci/fixtures/doc-obligations/evidence/base/docs/prd/PRD-GRPH-001.md +25 -0
  207. package/ci/fixtures/doc-obligations/evidence/candidate/docs/adr/GRPH-007.md +15 -0
  208. package/ci/fixtures/doc-obligations/evidence/candidate/docs/prd/PRD-GRPH-001.md +25 -0
  209. package/ci/mechanism-325-3a-cross.test.js +795 -0
  210. package/ci/mechanism-325-3a-doc-evidence.test.js +1172 -0
  211. package/ci/mechanism-325-3a-doc-obligations.test.js +742 -0
  212. package/ci/mechanism-pr334-haiku.test.js +298 -0
  213. package/ci/mechanism-pr334-luna.test.js +192 -0
  214. package/ci/mechanism-pr334-opencode.test.js +313 -0
  215. package/ci/mechanism-pr334-r2-boundary.test.js +239 -0
  216. package/ci/mechanism-pr334-r2-resolution.test.js +243 -0
  217. package/ci/mechanism-pr334-r2-scope.test.js +127 -0
  218. package/ci/mechanism-pr334-r3-boundary.test.js +356 -0
  219. package/ci/mechanism-pr334-r3-citations.test.js +205 -0
  220. package/ci/mechanism-pr334-r3-headings.test.js +268 -0
  221. package/docs/document-lifecycle.md +57 -1
  222. package/harness-everything/SKILL.md +1 -1
  223. package/harness-everything/scripts/doc-evidence.js +471 -0
  224. package/harness-everything/scripts/doc-lifecycle.js +1 -1
  225. package/harness-everything/scripts/doc-obligations.js +1571 -0
  226. package/opencode-plugin/plugin.json +1 -1
  227. package/package.json +1 -1
  228. package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
  229. package/plugins/harness-everything/plugin.json +1 -1
  230. package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
  231. package/plugins/harness-everything/skills/harness-everything/scripts/doc-evidence.js +471 -0
  232. package/plugins/harness-everything/skills/harness-everything/scripts/doc-lifecycle.js +1 -1
  233. package/plugins/harness-everything/skills/harness-everything/scripts/doc-obligations.js +1571 -0
  234. package/sbom.cdx.json +7 -7
@@ -10,7 +10,7 @@
10
10
  "name": "harness-everything",
11
11
  "source": "./",
12
12
  "description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
13
- "version": "0.34.0",
13
+ "version": "0.35.0",
14
14
  "author": {
15
15
  "name": "Miya Daniel"
16
16
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "harness-everything",
3
3
  "description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
4
- "version": "0.34.0",
4
+ "version": "0.35.0",
5
5
  "author": {
6
6
  "name": "Miya Daniel"
7
7
  },
package/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
+ ## [0.35.0](https://github.com/dyphn1/Harness-everything/compare/v0.34.0...v0.35.0) (2026-10-18)
6
+
7
+ ### Features
8
+
9
+ * **doc-lifecycle:** add phase 3a doc-change obligation derivation and evidence producer ([61590e1](https://github.com/dyphn1/Harness-everything/commit/61590e1e4ee39652964df5120ded085cd5cf6ecc)), closes [#325](https://github.com/dyphn1/Harness-everything/issues/325) [#325](https://github.com/dyphn1/Harness-everything/issues/325)
10
+
11
+ ### Bug Fixes
12
+
13
+ * **doc-lifecycle:** address review findings on phase 3a ([#334](https://github.com/dyphn1/Harness-everything/issues/334)) ([3a0f3ae](https://github.com/dyphn1/Harness-everything/commit/3a0f3aec6461cd0570c8b1de7a93dd37419a5fda)), closes [#335](https://github.com/dyphn1/Harness-everything/issues/335) [#325](https://github.com/dyphn1/Harness-everything/issues/325)
14
+ * **doc-lifecycle:** close phase 3a review round 2 gaps ([#334](https://github.com/dyphn1/Harness-everything/issues/334)) ([643c489](https://github.com/dyphn1/Harness-everything/commit/643c4899a0f43d3c27fcc26dae06c0b5b421a657)), closes [#325](https://github.com/dyphn1/Harness-everything/issues/325)
15
+ * **doc-lifecycle:** close phase 3a review round 3 gaps ([#334](https://github.com/dyphn1/Harness-everything/issues/334)) ([ccb7c48](https://github.com/dyphn1/Harness-everything/commit/ccb7c487fa67415f8ef183fba7484b237b558c93)), closes [#325](https://github.com/dyphn1/Harness-everything/issues/325)
16
+ * **doc-lifecycle:** harden requirement identity and revision evidence ([a4c1d03](https://github.com/dyphn1/Harness-everything/commit/a4c1d03db1b0c6ec0315c0b9e9c1a65d2437adbb))
17
+ * **doc-lifecycle:** preserve requirement resolution and trigger scope ([352ceb3](https://github.com/dyphn1/Harness-everything/commit/352ceb31a28cda92f88a0d7ab64381aa907c2ee3))
18
+ * **doc-lifecycle:** retain changed citations and decision obligations ([c68cf40](https://github.com/dyphn1/Harness-everything/commit/c68cf40a4b188169a98cbb66d511a2c5561cdde4))
19
+
20
+ ## [Unreleased]
21
+
22
+ ### Bug Fixes
23
+
24
+ * **doc-obligations:** keep changed REQ citations in unknown sync scope and recognize indented Decision headings
25
+ * **doc-obligations:** keep title-only REQ test edits out of new-test and assertion scope
26
+ * **doc-obligations:** reject PRD revision identities not chained to the base declaration
27
+ * **doc-obligations:** keep unrelated REQ-citing tests out of requirement-sync scope
28
+ * **doc-evidence:** keep unresolved requirement identities out of observed requirement-sync failures
29
+
5
30
  ## [0.34.0](https://github.com/dyphn1/Harness-everything/compare/v0.33.0...v0.34.0) (2026-10-17)
6
31
 
7
32
  ### Features
@@ -0,0 +1,22 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:b25abca04f8d754127ca52e4832c346aedfc5c3fe1b844b0ea8b568f08bd29f6"
13
+ ---
14
+ # Graph
15
+
16
+ ### REQ-GRPH-001
17
+
18
+ The router records one topology per task.
19
+
20
+ #### Acceptance
21
+
22
+ - exactly one topology is recorded
@@ -0,0 +1,22 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:842b30aa81c8fbe346e53a328708f163f90b9e0bba7ee080c08d918426b4977e"
13
+ ---
14
+ # Graph
15
+
16
+ ### REQ-GRPH-001
17
+
18
+ The router records one topology per task.
19
+
20
+ #### Acceptance
21
+
22
+ - one or more topologies are recorded
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:be987b0583efa406fc1d271a0cadee449a345e45f2e9a91e6707bbde06547ef2"
13
+ ---
14
+ # Graph
15
+
16
+ ## Context
17
+
18
+ The router is deterministic.
19
+
20
+ ### REQ-GRPH-020 (aliases: REQ-GRAPH-020): Export
21
+
22
+ The graph exports a stable index.
23
+
24
+ Acceptance: the index is byte-identical across runs.
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:d85bce39a521bd142110733356b88133a6c33036715d6d9248e2b3a7711591a9"
13
+ ---
14
+ # Graph
15
+
16
+ ## Context
17
+
18
+ The router is deterministic.
19
+
20
+ ### REQ-GRPH-020 (aliases: REQ-GRAPH-021): Export
21
+
22
+ The graph exports a stable index.
23
+
24
+ Acceptance: the index is byte-identical across runs.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal(run(), 1);
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:a103bf860ed9d2cf7100d93eb8f0e3c3bce322d47e0f9fd83914b5bcc264ef70"
13
+ ---
14
+ # Graph
15
+
16
+ ### REQ-GRPH-001
17
+
18
+ The router records one topology per task.
19
+
20
+ Acceptance: exactly one topology is recorded.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal(run(), 2);
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:a103bf860ed9d2cf7100d93eb8f0e3c3bce322d47e0f9fd83914b5bcc264ef70"
13
+ ---
14
+ # Graph
15
+
16
+ ### REQ-GRPH-001
17
+
18
+ The router records one topology per task.
19
+
20
+ Acceptance: exactly one topology is recorded.
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:a103bf860ed9d2cf7100d93eb8f0e3c3bce322d47e0f9fd83914b5bcc264ef70"
13
+ ---
14
+ # Graph
15
+
16
+ ### REQ-GRPH-001
17
+
18
+ The router records one topology per task.
19
+
20
+ Acceptance: exactly one topology is recorded.
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:a103bf860ed9d2cf7100d93eb8f0e3c3bce322d47e0f9fd83914b5bcc264ef70"
13
+ ---
14
+ # Graph
15
+
16
+ ### REQ-GRPH-001
17
+
18
+ The router records one topology per task.
19
+
20
+ Acceptance: exactly one topology is recorded.
@@ -0,0 +1,7 @@
1
+ {
2
+ "complete": true,
3
+ "waiverInventoryComplete": true,
4
+ "baseDigest": "ae509889693e7c586b2641654ff1fb4d1ec355c3735fb1839996a5e9a34a2c70",
5
+ "candidateDigest": "598c5319ac32def29c3c087cd286db9edaf632609aa5fefef854d3b8c9a46007",
6
+ "configDigest": "e1df4edbdeafb51eac88e1c4256ee2613b647055bbc2f3ed458bfe872d9a09a5"
7
+ }
@@ -0,0 +1,3 @@
1
+ test('REQ-GRPH-011 check', () => {
2
+ assert.equal(run(), 1);
3
+ });
@@ -0,0 +1,2 @@
1
+ test('REQ-GRPH-011 check', () => {
2
+ assert.equal(run(), 2);
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:631fcb9e83c127ab08bdb8fb1c1367dd1c5119c4a83b636484e0e397c0cfb679"
13
+ ---
14
+ # Graph
15
+
16
+ ## Context
17
+
18
+ The router is deterministic.
19
+
20
+ ### REQ-GRPH-020 (replaces: REQ-GRPH-012): Export
21
+
22
+ The graph exports a stable index.
23
+
24
+ Acceptance: the index is byte-identical across runs.
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:1bfd88602d309cd322b7502a2917d493fcc4252a91b1a7f24f45c220b4f6b367"
13
+ ---
14
+ # Graph
15
+
16
+ ## Context
17
+
18
+ The router is determinstic.
19
+
20
+ ### REQ-GRPH-020 (replaces: REQ-GRPH-012): Export
21
+
22
+ The graph exports a stable index.
23
+
24
+ Acceptance: the index is byte-identical across runs.
@@ -0,0 +1 @@
1
+ exports.run = () => 1;
@@ -0,0 +1 @@
1
+ exports.run = () => 2;
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001: router check
2
+ assert.equal(run(), 1);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001: router check (reworded)
2
+ assert.equal(run(), 1);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ assert['deepStrictEqual'](run(), 1);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ assert['deepStrictEqual'](run(), 2);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ assert[method](run(), 1);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ assert[method](run(), 2);
@@ -0,0 +1,11 @@
1
+ {
2
+ "governed": [
3
+ { "path": "docs/prd/**", "role": "prd" },
4
+ { "path": "docs/adr/**", "role": "adr" },
5
+ { "path": "docs/reference/**", "role": "reference" }
6
+ ],
7
+ "domains": ["GRPH"],
8
+ "legacy": ["docs/adr/legacy/**"],
9
+ "derived": [{ "path": "docs/roadmap/index.md", "generator": "npm run docs:index" }],
10
+ "tickets": "tracker"
11
+ }
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: GRPH-010
3
+ role: adr
4
+ status: accepted
5
+ ---
6
+ # GRPH-010 Fenced examples
7
+
8
+ ## Context
9
+
10
+ Examples help readers.
11
+
12
+ ## Decision
13
+
14
+ Run lint first.
15
+
16
+ ```md
17
+ # Example
18
+ ```
19
+
20
+ Then check links.
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: GRPH-010
3
+ role: adr
4
+ status: accepted
5
+ ---
6
+ # GRPH-010 Fenced examples
7
+
8
+ ## Context
9
+
10
+ Examples help readers.
11
+
12
+ ## Decision
13
+
14
+ Run lint first.
15
+
16
+ ```md
17
+ # Example
18
+ ```
19
+
20
+ Then check links and record evidence.
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: GRPH-010
3
+ role: adr
4
+ status: accepted
5
+ ---
6
+ # GRPH-010 Fenced examples
7
+
8
+ ## Context
9
+
10
+ Examples help readers.
11
+
12
+ ## Decision
13
+
14
+ Run lint first.
15
+
16
+ ~~~md
17
+ # Example
18
+ ~~~
19
+
20
+ Then check links.
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: GRPH-010
3
+ role: adr
4
+ status: accepted
5
+ ---
6
+ # GRPH-010 Fenced examples
7
+
8
+ ## Context
9
+
10
+ Examples help readers.
11
+
12
+ ## Decision
13
+
14
+ Run lint first.
15
+
16
+ ~~~md
17
+ # Example
18
+ ~~~
19
+
20
+ Then check links and record evidence.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ assert.deepStrictEqual(run(), 1);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ assert.deepStrictEqual(run(), 2);
@@ -0,0 +1,14 @@
1
+ ---
2
+ id: GRPH-008
3
+ role: adr
4
+ status: accepted
5
+ ---
6
+ # GRPH-008 Batch writes
7
+
8
+ ## Context
9
+
10
+ Writes arrive in bursts.
11
+
12
+ ## Decision
13
+
14
+ Batch writes per second.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal(run(), 1);
@@ -0,0 +1,20 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:a103bf860ed9d2cf7100d93eb8f0e3c3bce322d47e0f9fd83914b5bcc264ef70"
13
+ ---
14
+ # Graph
15
+
16
+ ### REQ-GRPH-001
17
+
18
+ The router records one topology per task.
19
+
20
+ Acceptance: exactly one topology is recorded.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal(run(), 2);
@@ -0,0 +1,3 @@
1
+ # Index
2
+
3
+ Generated from the model.
@@ -0,0 +1,3 @@
1
+ # Index
2
+
3
+ Generated from the model.
@@ -0,0 +1,7 @@
1
+ {
2
+ "governed": [{ "path": "docs/reference/**", "role": "reference" }],
3
+ "domains": ["GRPH"],
4
+ "legacy": [],
5
+ "derived": [{ "path": "docs/index.md", "sources": ["src/model/**"], "generator": "npm run docs:index" }],
6
+ "tickets": "tracker"
7
+ }
@@ -0,0 +1,3 @@
1
+ # Index
2
+
3
+ Generated from the model.
@@ -0,0 +1,3 @@
1
+ # Summary
2
+
3
+ Generated from the model.
@@ -0,0 +1,3 @@
1
+ # Index
2
+
3
+ Generated from the model.
@@ -0,0 +1,3 @@
1
+ # Summary
2
+
3
+ Generated from the model.
@@ -0,0 +1,10 @@
1
+ {
2
+ "governed": [{ "path": "docs/reference/**", "role": "reference" }],
3
+ "domains": ["GRPH"],
4
+ "legacy": [],
5
+ "derived": [
6
+ { "path": "docs/index.md", "sources": ["src/model.js"], "generator": "npm run docs:index" },
7
+ { "path": "docs/model-summary.md", "sources": ["src/model.js"], "generator": "npm run docs:summary" }
8
+ ],
9
+ "tickets": "tracker"
10
+ }
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ assert.equal(run(), 1);
@@ -0,0 +1,19 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:918eb7f37004bb9527a46a8e827161629cdef3c45dae374154ff319847cfe7f9"
13
+ ---
14
+ ### REQ-GRPH-011: Stable requirement
15
+
16
+ The router keeps the stable behavior.
17
+
18
+ Acceptance: preserve the stable behavior.
19
+
@@ -0,0 +1,19 @@
1
+ ---
2
+ id: "PRD-GRPH-002"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-002"
11
+ role: "human"
12
+ content_digest: "sha256:3f3631612b1a9221eb4991f40e526ac7b60327c4995d0b411f6a749ff48041bf"
13
+ ---
14
+ ### REQ-GRPH-011: Stable requirement
15
+
16
+ The router keeps the stable behavior.
17
+
18
+ Acceptance: preserve the stable behavior.
19
+
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ assert.equal(run(), 2);
@@ -0,0 +1,19 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 1
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ effective_at: "2026-10-17T00:01:00Z"
7
+ approval:
8
+ by: "Bob Independent"
9
+ at: "2026-10-17T00:00:00Z"
10
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
11
+ role: "human"
12
+ content_digest: "sha256:918eb7f37004bb9527a46a8e827161629cdef3c45dae374154ff319847cfe7f9"
13
+ ---
14
+ ### REQ-GRPH-011: Stable requirement
15
+
16
+ The router keeps the stable behavior.
17
+
18
+ Acceptance: preserve the stable behavior.
19
+