harness-everything 0.33.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 (297) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +48 -0
  4. package/ci/fixtures/doc-lifecycle/prd-revisions/config.json +9 -0
  5. package/ci/fixtures/doc-lifecycle/prd-revisions/packaged/config.json +20 -0
  6. package/ci/fixtures/doc-lifecycle/prd-revisions/packaged/expected.json +12 -0
  7. package/ci/fixtures/doc-lifecycle/prd-revisions/packaged/invalid-fork/docs/prd/graph/r001.md +20 -0
  8. package/ci/fixtures/doc-lifecycle/prd-revisions/packaged/invalid-fork/docs/prd/graph/r002.md +26 -0
  9. package/ci/fixtures/doc-lifecycle/prd-revisions/packaged/invalid-fork/docs/prd/graph/r003.md +26 -0
  10. package/ci/fixtures/doc-lifecycle/prd-revisions/packaged/valid/docs/prd/graph/r001.md +20 -0
  11. package/ci/fixtures/doc-lifecycle/prd-revisions/packaged/valid/docs/prd/graph/r002.md +26 -0
  12. package/ci/fixtures/doc-lifecycle/prd-revisions/ten-reqs/r001.body.md +39 -0
  13. package/ci/fixtures/doc-lifecycle/prd-revisions/ten-reqs/r002-dropped.body.md +35 -0
  14. package/ci/fixtures/doc-lifecycle/prd-revisions/ten-reqs/r002-incomplete.body.md +37 -0
  15. package/ci/fixtures/doc-lifecycle/prd-revisions/ten-reqs/r002-one-replaced.body.md +39 -0
  16. package/ci/fixtures/doc-lifecycle/prd-revisions/ten-reqs/r002-overlap.body.md +39 -0
  17. package/ci/fixtures/doc-lifecycle/scenarios/active-to-active/config.json +1 -0
  18. package/ci/fixtures/doc-lifecycle/scenarios/active-to-active/docs/adr/GRPH-001.md +8 -0
  19. package/ci/fixtures/doc-lifecycle/scenarios/active-to-active/docs/adr/GRPH-002.md +9 -0
  20. package/ci/fixtures/doc-lifecycle/scenarios/active-to-active/expected.json +1 -0
  21. package/ci/fixtures/doc-lifecycle/scenarios/active-to-active-mismatch/config.json +1 -0
  22. package/ci/fixtures/doc-lifecycle/scenarios/active-to-active-mismatch/docs/adr/GRPH-001.md +8 -0
  23. package/ci/fixtures/doc-lifecycle/scenarios/active-to-active-mismatch/docs/adr/GRPH-002.md +9 -0
  24. package/ci/fixtures/doc-lifecycle/scenarios/active-to-active-mismatch/expected.json +1 -0
  25. package/ci/fixtures/doc-lifecycle/scenarios/active-to-legacy/config.json +1 -0
  26. package/ci/fixtures/doc-lifecycle/scenarios/active-to-legacy/docs/adr/GRPH-010.md +9 -0
  27. package/ci/fixtures/doc-lifecycle/scenarios/active-to-legacy/docs/adr/legacy/GRPH-007.md +8 -0
  28. package/ci/fixtures/doc-lifecycle/scenarios/active-to-legacy/expected.json +1 -0
  29. package/ci/fixtures/doc-lifecycle/scenarios/alias-rename/config.json +1 -0
  30. package/ci/fixtures/doc-lifecycle/scenarios/alias-rename/docs/adr/GRAPH-007.md +9 -0
  31. package/ci/fixtures/doc-lifecycle/scenarios/alias-rename/docs/adr/legacy/GRPH-007.md +8 -0
  32. package/ci/fixtures/doc-lifecycle/scenarios/alias-rename/expected.json +1 -0
  33. package/ci/fixtures/doc-lifecycle/scenarios/duplicate-legacy/config.json +1 -0
  34. package/ci/fixtures/doc-lifecycle/scenarios/duplicate-legacy/docs/adr/legacy/v1/GRPH-007.md +8 -0
  35. package/ci/fixtures/doc-lifecycle/scenarios/duplicate-legacy/docs/adr/legacy/v2/GRPH-007.md +8 -0
  36. package/ci/fixtures/doc-lifecycle/scenarios/duplicate-legacy/expected.json +1 -0
  37. package/ci/fixtures/doc-lifecycle/scenarios/invalid-refs/config.json +1 -0
  38. package/ci/fixtures/doc-lifecycle/scenarios/invalid-refs/docs/adr/GRPH-003.md +9 -0
  39. package/ci/fixtures/doc-lifecycle/scenarios/invalid-refs/docs/adr/GRPH-004.md +9 -0
  40. package/ci/fixtures/doc-lifecycle/scenarios/invalid-refs/docs/adr/GRPH-005.md +9 -0
  41. package/ci/fixtures/doc-lifecycle/scenarios/invalid-refs/docs/adr/GRPH-006.md +9 -0
  42. package/ci/fixtures/doc-lifecycle/scenarios/invalid-refs/docs/adr/GRPH-007.md +9 -0
  43. package/ci/fixtures/doc-lifecycle/scenarios/invalid-refs/expected.json +1 -0
  44. package/ci/fixtures/doc-lifecycle/scenarios/pending-edge/config.json +1 -0
  45. package/ci/fixtures/doc-lifecycle/scenarios/pending-edge/docs/adr/GRPH-020.md +8 -0
  46. package/ci/fixtures/doc-lifecycle/scenarios/pending-edge/docs/adr/GRPH-021.md +9 -0
  47. package/ci/fixtures/doc-lifecycle/scenarios/pending-edge/expected.json +1 -0
  48. package/ci/fixtures/doc-lifecycle/scenarios/recorded-conflict/config.json +1 -0
  49. package/ci/fixtures/doc-lifecycle/scenarios/recorded-conflict/docs/adr/GRPH-003.md +8 -0
  50. package/ci/fixtures/doc-lifecycle/scenarios/recorded-conflict/docs/prd/graph.md +10 -0
  51. package/ci/fixtures/doc-lifecycle/scenarios/recorded-conflict/expected.json +1 -0
  52. package/ci/fixtures/doc-obligations/derive/acceptance-only/base/docs/prd/graph.md +22 -0
  53. package/ci/fixtures/doc-obligations/derive/acceptance-only/candidate/docs/prd/graph.md +22 -0
  54. package/ci/fixtures/doc-obligations/derive/alias-only/base/docs/prd/graph.md +24 -0
  55. package/ci/fixtures/doc-obligations/derive/alias-only/candidate/docs/prd/graph.md +24 -0
  56. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/base/ci/mechanism-lint.test.js +2 -0
  57. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/base/docs/prd/graph.md +20 -0
  58. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/candidate/ci/mechanism-lint.test.js +2 -0
  59. package/ci/fixtures/doc-obligations/derive/assertion-no-revision/candidate/docs/prd/graph.md +20 -0
  60. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/base/ci/mechanism-lint.test.js +2 -0
  61. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/base/docs/prd/graph.md +20 -0
  62. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/candidate/ci/mechanism-lint.test.js +2 -0
  63. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/candidate/docs/prd/graph.md +20 -0
  64. package/ci/fixtures/doc-obligations/derive/assertion-no-revision-attested/inventory.json +7 -0
  65. package/ci/fixtures/doc-obligations/derive/attribution-impossible/base/ci/mechanism-open.test.js +3 -0
  66. package/ci/fixtures/doc-obligations/derive/attribution-impossible/candidate/ci/mechanism-open.test.js.fixture +2 -0
  67. package/ci/fixtures/doc-obligations/derive/clause-context-typo/base/docs/prd/graph.md +24 -0
  68. package/ci/fixtures/doc-obligations/derive/clause-context-typo/candidate/docs/prd/graph.md +24 -0
  69. package/ci/fixtures/doc-obligations/derive/code-only/base/src/lint.js +1 -0
  70. package/ci/fixtures/doc-obligations/derive/code-only/candidate/src/lint.js +1 -0
  71. package/ci/fixtures/doc-obligations/derive/comment-only-test/base/ci/mechanism-lint.test.js +2 -0
  72. package/ci/fixtures/doc-obligations/derive/comment-only-test/candidate/ci/mechanism-lint.test.js +2 -0
  73. package/ci/fixtures/doc-obligations/derive/computed-member-assert/base/ci/mechanism-c1.test.js +2 -0
  74. package/ci/fixtures/doc-obligations/derive/computed-member-assert/candidate/ci/mechanism-c1.test.js +2 -0
  75. package/ci/fixtures/doc-obligations/derive/computed-member-variable/base/ci/mechanism-c1.test.js +2 -0
  76. package/ci/fixtures/doc-obligations/derive/computed-member-variable/candidate/ci/mechanism-c1.test.js +2 -0
  77. package/ci/fixtures/doc-obligations/derive/config.json +11 -0
  78. package/ci/fixtures/doc-obligations/derive/decision-fence-backtick/base/docs/adr/GRPH-010.md +20 -0
  79. package/ci/fixtures/doc-obligations/derive/decision-fence-backtick/candidate/docs/adr/GRPH-010.md +20 -0
  80. package/ci/fixtures/doc-obligations/derive/decision-fence-tilde/base/docs/adr/GRPH-010.md +20 -0
  81. package/ci/fixtures/doc-obligations/derive/decision-fence-tilde/candidate/docs/adr/GRPH-010.md +20 -0
  82. package/ci/fixtures/doc-obligations/derive/deep-strict-equal/base/ci/mechanism-s1.test.js +2 -0
  83. package/ci/fixtures/doc-obligations/derive/deep-strict-equal/candidate/ci/mechanism-s1.test.js +2 -0
  84. package/ci/fixtures/doc-obligations/derive/deleted-adr/base/docs/adr/GRPH-008.md +14 -0
  85. package/ci/fixtures/doc-obligations/derive/deleted-prd/base/ci/mechanism-lint.test.js +2 -0
  86. package/ci/fixtures/doc-obligations/derive/deleted-prd/base/docs/prd/graph.md +20 -0
  87. package/ci/fixtures/doc-obligations/derive/deleted-prd/candidate/ci/mechanism-lint.test.js +2 -0
  88. package/ci/fixtures/doc-obligations/derive/derived-rename/base/docs/index.md +3 -0
  89. package/ci/fixtures/doc-obligations/derive/derived-rename/base/src/model/a.js +1 -0
  90. package/ci/fixtures/doc-obligations/derive/derived-rename/candidate/docs/index.md +3 -0
  91. package/ci/fixtures/doc-obligations/derive/derived-rename/candidate/src/model/b.js +1 -0
  92. package/ci/fixtures/doc-obligations/derive/derived-rename/config.json +7 -0
  93. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/base/docs/index.md +3 -0
  94. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/base/docs/model-summary.md +3 -0
  95. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/base/src/model.js +1 -0
  96. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/candidate/docs/index.md +3 -0
  97. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/candidate/docs/model-summary.md +3 -0
  98. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/candidate/src/model.js +1 -0
  99. package/ci/fixtures/doc-obligations/derive/derived-two-outputs/config.json +10 -0
  100. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/base/ci/mechanism-lint.test.js +2 -0
  101. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/base/docs/prd/graph-one/r001.md +19 -0
  102. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/base/docs/prd/graph-two/r001.md +19 -0
  103. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/candidate/ci/mechanism-lint.test.js +2 -0
  104. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/candidate/docs/prd/graph-one/r001.md +19 -0
  105. package/ci/fixtures/doc-obligations/derive/distinct-logical-prds/candidate/docs/prd/graph-two/r001.md +19 -0
  106. package/ci/fixtures/doc-obligations/derive/docs-only/base/docs/reference/guide.md +3 -0
  107. package/ci/fixtures/doc-obligations/derive/docs-only/candidate/docs/reference/guide.md +3 -0
  108. package/ci/fixtures/doc-obligations/derive/dup-req-id/base/ci/mechanism-lint.test.js +2 -0
  109. package/ci/fixtures/doc-obligations/derive/dup-req-id/base/docs/prd/graph-a.md +20 -0
  110. package/ci/fixtures/doc-obligations/derive/dup-req-id/base/docs/prd/graph-b.md +20 -0
  111. package/ci/fixtures/doc-obligations/derive/dup-req-id/candidate/ci/mechanism-lint.test.js +2 -0
  112. package/ci/fixtures/doc-obligations/derive/dup-req-id/candidate/docs/prd/graph-a.md +20 -0
  113. package/ci/fixtures/doc-obligations/derive/dup-req-id/candidate/docs/prd/graph-b.md +20 -0
  114. package/ci/fixtures/doc-obligations/derive/expect-computed-literal/base/ci/mechanism-e.test.js +2 -0
  115. package/ci/fixtures/doc-obligations/derive/expect-computed-literal/candidate/ci/mechanism-e.test.js +2 -0
  116. package/ci/fixtures/doc-obligations/derive/expect-computed-matcher/base/ci/mechanism-e.test.js +2 -0
  117. package/ci/fixtures/doc-obligations/derive/expect-computed-matcher/candidate/ci/mechanism-e.test.js +2 -0
  118. package/ci/fixtures/doc-obligations/derive/expect-not-to-equal/base/ci/mechanism-s1.test.js +2 -0
  119. package/ci/fixtures/doc-obligations/derive/expect-not-to-equal/candidate/ci/mechanism-s1.test.js +2 -0
  120. package/ci/fixtures/doc-obligations/derive/formatting-only-test/base/ci/mechanism-lint.test.js +2 -0
  121. package/ci/fixtures/doc-obligations/derive/formatting-only-test/candidate/ci/mechanism-lint.test.js +2 -0
  122. package/ci/fixtures/doc-obligations/derive/helper-delegated-test/base/docs/prd/graph.md +18 -0
  123. package/ci/fixtures/doc-obligations/derive/helper-delegated-test/candidate/ci/mechanism-helper.test.js +1 -0
  124. package/ci/fixtures/doc-obligations/derive/helper-delegated-test/candidate/docs/prd/graph.md +18 -0
  125. package/ci/fixtures/doc-obligations/derive/historical-only-req/base/ci/mechanism-lint.test.js +2 -0
  126. package/ci/fixtures/doc-obligations/derive/historical-only-req/base/docs/prd/graph/r001.md +25 -0
  127. package/ci/fixtures/doc-obligations/derive/historical-only-req/candidate/ci/mechanism-lint.test.js +2 -0
  128. package/ci/fixtures/doc-obligations/derive/historical-only-req/candidate/docs/prd/graph/r001.md +25 -0
  129. package/ci/fixtures/doc-obligations/derive/historical-only-req/candidate/docs/prd/graph/r002.md +23 -0
  130. package/ci/fixtures/doc-obligations/derive/in-place-current/base/ci/mechanism-inplace.test.js +2 -0
  131. package/ci/fixtures/doc-obligations/derive/in-place-current/base/docs/prd/graph/r001.md +20 -0
  132. package/ci/fixtures/doc-obligations/derive/in-place-current/base/docs/prd/graph/r002.md +26 -0
  133. package/ci/fixtures/doc-obligations/derive/in-place-current/candidate/ci/mechanism-inplace.test.js +2 -0
  134. package/ci/fixtures/doc-obligations/derive/in-place-current/candidate/docs/prd/graph/r001.md +20 -0
  135. package/ci/fixtures/doc-obligations/derive/in-place-current/candidate/docs/prd/graph/r002.md +28 -0
  136. package/ci/fixtures/doc-obligations/derive/in-place-historical/base/ci/mechanism-inplace.test.js +2 -0
  137. package/ci/fixtures/doc-obligations/derive/in-place-historical/base/docs/prd/graph/r001.md +20 -0
  138. package/ci/fixtures/doc-obligations/derive/in-place-historical/base/docs/prd/graph/r002.md +26 -0
  139. package/ci/fixtures/doc-obligations/derive/in-place-historical/candidate/ci/mechanism-inplace.test.js +2 -0
  140. package/ci/fixtures/doc-obligations/derive/in-place-historical/candidate/docs/prd/graph/r001.md +22 -0
  141. package/ci/fixtures/doc-obligations/derive/in-place-historical/candidate/docs/prd/graph/r002.md +26 -0
  142. package/ci/fixtures/doc-obligations/derive/invalid-clause/base/docs/prd/graph.md +24 -0
  143. package/ci/fixtures/doc-obligations/derive/invalid-clause/candidate/docs/prd/graph.md +24 -0
  144. package/ci/fixtures/doc-obligations/derive/legacy-untagged-fallback/base/ci/mechanism-legacy.test.js +6 -0
  145. package/ci/fixtures/doc-obligations/derive/legacy-untagged-fallback/candidate/ci/mechanism-legacy.test.js +6 -0
  146. package/ci/fixtures/doc-obligations/derive/literal-whitespace-assert/base/ci/mechanism-lint.test.js +2 -0
  147. package/ci/fixtures/doc-obligations/derive/literal-whitespace-assert/candidate/ci/mechanism-lint.test.js +2 -0
  148. package/ci/fixtures/doc-obligations/derive/malformed-citation-attribution/base/ci/mechanism-bad.test.js +6 -0
  149. package/ci/fixtures/doc-obligations/derive/malformed-citation-attribution/candidate/ci/mechanism-bad.test.js.fixture +6 -0
  150. package/ci/fixtures/doc-obligations/derive/malformed-prd/base/ci/mechanism-lint.test.js +2 -0
  151. package/ci/fixtures/doc-obligations/derive/malformed-prd/base/docs/prd/graph.md +20 -0
  152. package/ci/fixtures/doc-obligations/derive/malformed-prd/candidate/ci/mechanism-lint.test.js +2 -0
  153. package/ci/fixtures/doc-obligations/derive/malformed-prd/candidate/docs/prd/graph.md +11 -0
  154. package/ci/fixtures/doc-obligations/derive/missing-approval/base/docs/prd/graph.md +20 -0
  155. package/ci/fixtures/doc-obligations/derive/missing-approval/candidate/docs/prd/graph.md +20 -0
  156. package/ci/fixtures/doc-obligations/derive/mixed-attribution/base/ci/mechanism-mixed.test.js +6 -0
  157. package/ci/fixtures/doc-obligations/derive/mixed-attribution/base/docs/prd/graph.md +24 -0
  158. package/ci/fixtures/doc-obligations/derive/mixed-attribution/candidate/ci/mechanism-mixed.test.js.fixture +5 -0
  159. package/ci/fixtures/doc-obligations/derive/mixed-attribution/candidate/docs/prd/graph.md +24 -0
  160. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/base/ci/mechanism-lint.test.js +2 -0
  161. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/base/docs/reference/guide.md +3 -0
  162. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/base/src/lint.js +1 -0
  163. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/candidate/ci/mechanism-lint.test.js +2 -0
  164. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/candidate/docs/reference/guide.md +3 -0
  165. package/ci/fixtures/doc-obligations/derive/mixed-docs-code/candidate/src/lint.js +1 -0
  166. package/ci/fixtures/doc-obligations/derive/multiline-comment-only/base/ci/mechanism-multi.test.js +5 -0
  167. package/ci/fixtures/doc-obligations/derive/multiline-comment-only/candidate/ci/mechanism-multi.test.js +5 -0
  168. package/ci/fixtures/doc-obligations/derive/multiline-expect/base/ci/mechanism-multi.test.js +6 -0
  169. package/ci/fixtures/doc-obligations/derive/multiline-expect/candidate/ci/mechanism-multi.test.js +6 -0
  170. package/ci/fixtures/doc-obligations/derive/multiline-formatting-only/base/ci/mechanism-multi.test.js +5 -0
  171. package/ci/fixtures/doc-obligations/derive/multiline-formatting-only/candidate/ci/mechanism-multi.test.js +5 -0
  172. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/base/ci/mechanism-multi.test.js +5 -0
  173. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/base/docs/prd/graph.md +18 -0
  174. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/candidate/ci/mechanism-multi.test.js +5 -0
  175. package/ci/fixtures/doc-obligations/derive/multiline-numeric-prd/candidate/docs/prd/graph.md +18 -0
  176. package/ci/fixtures/doc-obligations/derive/multiline-strictequal/base/ci/mechanism-multi.test.js +5 -0
  177. package/ci/fixtures/doc-obligations/derive/multiline-strictequal/candidate/ci/mechanism-multi.test.js +5 -0
  178. package/ci/fixtures/doc-obligations/derive/new-prd/candidate/docs/prd/graph-new.md +20 -0
  179. package/ci/fixtures/doc-obligations/derive/new-reference/candidate/docs/reference/new-note.md +3 -0
  180. package/ci/fixtures/doc-obligations/derive/new-req-test/candidate/ci/mechanism-new.test.js +2 -0
  181. package/ci/fixtures/doc-obligations/derive/orphan-req-test/base/ci/mechanism-lint.test.js +2 -0
  182. package/ci/fixtures/doc-obligations/derive/orphan-req-test/base/docs/prd/graph.md +20 -0
  183. package/ci/fixtures/doc-obligations/derive/orphan-req-test/candidate/ci/mechanism-lint.test.js +2 -0
  184. package/ci/fixtures/doc-obligations/derive/orphan-req-test/candidate/docs/prd/graph.md +20 -0
  185. package/ci/fixtures/doc-obligations/derive/partial-revision/base/ci/mechanism-partial.test.js +5 -0
  186. package/ci/fixtures/doc-obligations/derive/partial-revision/base/docs/prd/graph/r001.md +24 -0
  187. package/ci/fixtures/doc-obligations/derive/partial-revision/candidate/ci/mechanism-partial.test.js +5 -0
  188. package/ci/fixtures/doc-obligations/derive/partial-revision/candidate/docs/prd/graph/r001.md +24 -0
  189. package/ci/fixtures/doc-obligations/derive/partial-revision/candidate/docs/prd/graph/r002.md +26 -0
  190. package/ci/fixtures/doc-obligations/derive/regex-literal-whitespace/base/ci/mechanism-lint.test.js +2 -0
  191. package/ci/fixtures/doc-obligations/derive/regex-literal-whitespace/candidate/ci/mechanism-lint.test.js +2 -0
  192. package/ci/fixtures/doc-obligations/derive/rename/base/docs/reference/old-guide.md +3 -0
  193. package/ci/fixtures/doc-obligations/derive/rename/candidate/docs/reference/guide.md +3 -0
  194. package/ci/fixtures/doc-obligations/derive/replacement-target/base/docs/prd/graph.md +24 -0
  195. package/ci/fixtures/doc-obligations/derive/replacement-target/candidate/docs/prd/graph.md +24 -0
  196. package/ci/fixtures/doc-obligations/derive/req-context-typo/base/docs/prd/graph.md +26 -0
  197. package/ci/fixtures/doc-obligations/derive/req-context-typo/candidate/docs/prd/graph.md +26 -0
  198. package/ci/fixtures/doc-obligations/derive/req-revision/base/ci/mechanism-lint.test.js +2 -0
  199. package/ci/fixtures/doc-obligations/derive/req-revision/base/docs/prd/graph/r001.md +20 -0
  200. package/ci/fixtures/doc-obligations/derive/req-revision/candidate/ci/mechanism-lint.test.js +2 -0
  201. package/ci/fixtures/doc-obligations/derive/req-revision/candidate/docs/prd/graph/r001.md +20 -0
  202. package/ci/fixtures/doc-obligations/derive/req-revision/candidate/docs/prd/graph/r002.md +28 -0
  203. package/ci/fixtures/doc-obligations/derive/req-revision-in-place/base/docs/prd/graph/r001.md +20 -0
  204. package/ci/fixtures/doc-obligations/derive/req-revision-in-place/candidate/docs/prd/graph/r001.md +22 -0
  205. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/base/ci/mechanism-lint.test.js +2 -0
  206. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/base/docs/prd/graph/r001.md +20 -0
  207. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/base/docs/prd/graph/r002.md +26 -0
  208. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/candidate/ci/mechanism-lint.test.js +2 -0
  209. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/candidate/docs/prd/graph/r001.md +20 -0
  210. package/ci/fixtures/doc-obligations/derive/retained-revision-chain/candidate/docs/prd/graph/r002.md +26 -0
  211. package/ci/fixtures/doc-obligations/derive/string-literal-tag/base/ci/mechanism-str.test.js +2 -0
  212. package/ci/fixtures/doc-obligations/derive/string-literal-tag/candidate/ci/mechanism-str.test.js +2 -0
  213. package/ci/fixtures/doc-obligations/derive/tag-inside-test-call/base/ci/mechanism-inside.test.js +5 -0
  214. package/ci/fixtures/doc-obligations/derive/tag-inside-test-call/candidate/ci/mechanism-inside.test.js +5 -0
  215. package/ci/fixtures/doc-obligations/derive/tagged-test/base/ci/mechanism-lint.test.js +2 -0
  216. package/ci/fixtures/doc-obligations/derive/tagged-test/candidate/ci/mechanism-lint.test.js +2 -0
  217. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/base/ci/mechanism-lint.test.js +2 -0
  218. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/base/docs/prd/graph.md +20 -0
  219. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/candidate/ci/mechanism-lint.test.js +2 -0
  220. package/ci/fixtures/doc-obligations/derive/tagged-test-prd/candidate/docs/prd/graph.md +20 -0
  221. package/ci/fixtures/doc-obligations/derive/template-literal-tag/base/ci/mechanism-tpl.test.js +4 -0
  222. package/ci/fixtures/doc-obligations/derive/template-literal-tag/base/docs/prd/graph.md +18 -0
  223. package/ci/fixtures/doc-obligations/derive/template-literal-tag/candidate/ci/mechanism-tpl.test.js +4 -0
  224. package/ci/fixtures/doc-obligations/derive/template-literal-tag/candidate/docs/prd/graph.md +18 -0
  225. package/ci/fixtures/doc-obligations/derive/template-literal-whitespace/base/ci/mechanism-lint.test.js +2 -0
  226. package/ci/fixtures/doc-obligations/derive/template-literal-whitespace/candidate/ci/mechanism-lint.test.js +2 -0
  227. package/ci/fixtures/doc-obligations/derive/title-only-rename/base/ci/mechanism-title.test.js +3 -0
  228. package/ci/fixtures/doc-obligations/derive/title-only-rename/candidate/ci/mechanism-title.test.js +3 -0
  229. package/ci/fixtures/doc-obligations/derive/title-only-unrelated-computed/base/ci/mechanism-u.test.js +4 -0
  230. package/ci/fixtures/doc-obligations/derive/title-only-unrelated-computed/candidate/ci/mechanism-u.test.js +4 -0
  231. package/ci/fixtures/doc-obligations/derive/top-level-no-file-tag/base/ci/mechanism-top.test.js +4 -0
  232. package/ci/fixtures/doc-obligations/derive/top-level-no-file-tag/candidate/ci/mechanism-top.test.js +4 -0
  233. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/base/ci/mechanism-lint.test.js +2 -0
  234. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/base/docs/prd/graph.md +20 -0
  235. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/candidate/ci/mechanism-lint.test.js +2 -0
  236. package/ci/fixtures/doc-obligations/derive/trailing-comment-test/candidate/docs/prd/graph.md +20 -0
  237. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/base/ci/mechanism-two.test.js +6 -0
  238. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/base/docs/prd/graph.md +24 -0
  239. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/candidate/ci/mechanism-two.test.js +6 -0
  240. package/ci/fixtures/doc-obligations/derive/two-tests-one-file/candidate/docs/prd/graph.md +24 -0
  241. package/ci/fixtures/doc-obligations/derive/typo-context/base/docs/adr/GRPH-007.md +14 -0
  242. package/ci/fixtures/doc-obligations/derive/typo-context/candidate/docs/adr/GRPH-007.md +14 -0
  243. package/ci/fixtures/doc-obligations/derive/typo-decision/base/docs/adr/GRPH-007.md +14 -0
  244. package/ci/fixtures/doc-obligations/derive/typo-decision/candidate/docs/adr/GRPH-007.md +14 -0
  245. package/ci/fixtures/doc-obligations/derive/unbalanced-statement/base/ci/mechanism-multi.test.js +5 -0
  246. package/ci/fixtures/doc-obligations/derive/unbalanced-statement/candidate/ci/mechanism-multi.test.js.fixture +4 -0
  247. package/ci/fixtures/doc-obligations/derive/unknown-adr/base/docs/adr/GRPH-009.md +14 -0
  248. package/ci/fixtures/doc-obligations/derive/unknown-adr/candidate/docs/adr/GRPH-009.md +12 -0
  249. package/ci/fixtures/doc-obligations/derive/unsupported-assertion-syntax/base/ci/mechanism-s1.test.js +2 -0
  250. package/ci/fixtures/doc-obligations/derive/unsupported-assertion-syntax/candidate/ci/mechanism-s1.test.js +2 -0
  251. package/ci/fixtures/doc-obligations/derive/whitespace-only-test/base/ci/mechanism-lint.test.js +2 -0
  252. package/ci/fixtures/doc-obligations/derive/whitespace-only-test/candidate/ci/mechanism-lint.test.js +2 -0
  253. package/ci/fixtures/doc-obligations/evidence/base/docs/adr/GRPH-007.md +15 -0
  254. package/ci/fixtures/doc-obligations/evidence/base/docs/prd/PRD-GRPH-001.md +25 -0
  255. package/ci/fixtures/doc-obligations/evidence/candidate/docs/adr/GRPH-007.md +15 -0
  256. package/ci/fixtures/doc-obligations/evidence/candidate/docs/prd/PRD-GRPH-001.md +25 -0
  257. package/ci/mechanism-2aw-project-docs-config.test.js +759 -0
  258. package/ci/mechanism-2ax-doc-lifecycle.test.js +1061 -0
  259. package/ci/mechanism-2ay-prd-revisions.test.js +2891 -0
  260. package/ci/mechanism-325-3a-cross.test.js +795 -0
  261. package/ci/mechanism-325-3a-doc-evidence.test.js +1172 -0
  262. package/ci/mechanism-325-3a-doc-obligations.test.js +742 -0
  263. package/ci/mechanism-pr334-haiku.test.js +298 -0
  264. package/ci/mechanism-pr334-luna.test.js +192 -0
  265. package/ci/mechanism-pr334-opencode.test.js +313 -0
  266. package/ci/mechanism-pr334-r2-boundary.test.js +239 -0
  267. package/ci/mechanism-pr334-r2-resolution.test.js +243 -0
  268. package/ci/mechanism-pr334-r2-scope.test.js +127 -0
  269. package/ci/mechanism-pr334-r3-boundary.test.js +356 -0
  270. package/ci/mechanism-pr334-r3-citations.test.js +205 -0
  271. package/ci/mechanism-pr334-r3-headings.test.js +268 -0
  272. package/docs/document-lifecycle.md +262 -0
  273. package/harness-everything/SKILL.md +1 -1
  274. package/harness-everything/scripts/doc-evidence.js +471 -0
  275. package/harness-everything/scripts/doc-lifecycle.js +2401 -0
  276. package/harness-everything/scripts/doc-obligations.js +1571 -0
  277. package/harness-everything/scripts/project-docs-resolver.js +764 -0
  278. package/multi-agent-workspace/SKILL.md +1 -1
  279. package/multi-agent-workspace/scripts/project-docs-resolver.js +437 -30
  280. package/opencode-plugin/plugin.json +1 -1
  281. package/package.json +1 -1
  282. package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
  283. package/plugins/harness-everything/plugin.json +1 -1
  284. package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
  285. package/plugins/harness-everything/skills/harness-everything/scripts/doc-evidence.js +471 -0
  286. package/plugins/harness-everything/skills/harness-everything/scripts/doc-lifecycle.js +2401 -0
  287. package/plugins/harness-everything/skills/harness-everything/scripts/doc-obligations.js +1571 -0
  288. package/plugins/harness-everything/skills/harness-everything/scripts/project-docs-resolver.js +764 -0
  289. package/plugins/harness-everything/skills/multi-agent-workspace/SKILL.md +1 -1
  290. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/project-docs-resolver.js +437 -30
  291. package/plugins/harness-everything/skills/to-spec/SKILL.md +1 -1
  292. package/plugins/harness-everything/skills/to-spec/scripts/check-project-docs.js +168 -54
  293. package/plugins/harness-everything/skills/to-spec/scripts/project-docs-resolver.js +749 -96
  294. package/sbom.cdx.json +7 -7
  295. package/to-spec/SKILL.md +1 -1
  296. package/to-spec/scripts/check-project-docs.js +168 -54
  297. package/to-spec/scripts/project-docs-resolver.js +749 -96
@@ -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:c5bc6c8aa29b39198eec91b7af210a946896d9b7975b9c72540ddd4a4bfb37ea"
13
+ ---
14
+ # Graph
15
+
16
+ ### REQ-GRPH-001
17
+
18
+ The router records one or more topologies per task.
19
+
20
+ Acceptance: one or more topologies are recorded.
@@ -0,0 +1,6 @@
1
+ test('REQ-GRPH-001 check', () => {
2
+ assert.equal(run(), 1);
3
+ });
4
+ test('REQ-GRPH-002 check', () => {
5
+ assert.equal(other(), 1);
6
+ });
@@ -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:550389ce51f5f547bbdf85c636df01dea67fee6aad26594380f4af9b206e7a6a"
13
+ ---
14
+ ### REQ-GRPH-001: Router
15
+
16
+ The router selects one topology.
17
+
18
+ Acceptance: one topology is selected.
19
+
20
+ ### REQ-GRPH-002: Ledger
21
+
22
+ The ledger records one entry.
23
+
24
+ Acceptance: one entry is recorded.
@@ -0,0 +1,5 @@
1
+ test('REQ-GRPH-001 check', () => {
2
+ assert.equal(run(), 2);
3
+ });
4
+ test('REQ-GRPH-002 check', () => {
5
+ assert.equal(other(), 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:550389ce51f5f547bbdf85c636df01dea67fee6aad26594380f4af9b206e7a6a"
13
+ ---
14
+ ### REQ-GRPH-001: Router
15
+
16
+ The router selects one topology.
17
+
18
+ Acceptance: one topology is selected.
19
+
20
+ ### REQ-GRPH-002: Ledger
21
+
22
+ The ledger records one entry.
23
+
24
+ Acceptance: one entry is recorded.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal(run(), 1);
@@ -0,0 +1,3 @@
1
+ # Guide
2
+
3
+ The lint step runs first.
@@ -0,0 +1 @@
1
+ exports.run = () => 1;
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal(run(), 2);
@@ -0,0 +1,3 @@
1
+ # Guide
2
+
3
+ The lint step runs first, then the link check.
@@ -0,0 +1,5 @@
1
+ // REQ-GRPH-011
2
+ assert.strictEqual(
3
+ run(),
4
+ 1 // before
5
+ );
@@ -0,0 +1,5 @@
1
+ // REQ-GRPH-011
2
+ assert.strictEqual(
3
+ run(),
4
+ 1 // after
5
+ );
@@ -0,0 +1,6 @@
1
+ // REQ-GRPH-011
2
+ expect(
3
+ run()
4
+ ).toEqual(
5
+ 1
6
+ );
@@ -0,0 +1,6 @@
1
+ // REQ-GRPH-011
2
+ expect(
3
+ run()
4
+ ).toEqual(
5
+ 2
6
+ );
@@ -0,0 +1,5 @@
1
+ // REQ-GRPH-011
2
+ assert.strictEqual(
3
+ run(),
4
+ 1
5
+ );
@@ -0,0 +1,5 @@
1
+ // REQ-GRPH-011
2
+ assert.strictEqual(
3
+ run(),
4
+ 1
5
+ );
@@ -0,0 +1,5 @@
1
+ // REQ-GRPH-011
2
+ assert.strictEqual(
3
+ run(),
4
+ 1
5
+ );
@@ -0,0 +1,18 @@
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:6adb00cdc3fd2d10580d65c46488173df8e5bb968871a64dbaccc3d2f22c5428"
13
+ ---
14
+ ### REQ-GRPH-011: Alpha
15
+
16
+ The router records alpha.
17
+
18
+ Acceptance: record alpha.
@@ -0,0 +1,5 @@
1
+ // REQ-GRPH-011
2
+ assert.strictEqual(
3
+ run(),
4
+ 2
5
+ );
@@ -0,0 +1,18 @@
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:6adb00cdc3fd2d10580d65c46488173df8e5bb968871a64dbaccc3d2f22c5428"
13
+ ---
14
+ ### REQ-GRPH-011: Alpha
15
+
16
+ The router records alpha.
17
+
18
+ Acceptance: record alpha.
@@ -0,0 +1,5 @@
1
+ // REQ-GRPH-011
2
+ assert.strictEqual(
3
+ run(),
4
+ 1
5
+ );
@@ -0,0 +1,5 @@
1
+ // REQ-GRPH-011
2
+ assert.strictEqual(
3
+ run(),
4
+ 2
5
+ );
@@ -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:5b17eec5c5a7020e496fea1503f2f9185733afadb0439c4178983499c30dd048"
13
+ ---
14
+ # New graph requirements
15
+
16
+ ### REQ-GRPH-002
17
+
18
+ The graph exports a stable index.
19
+
20
+ Acceptance: the index is byte-identical across runs.
@@ -0,0 +1,3 @@
1
+ # New note
2
+
3
+ The index is rebuilt on demand.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal(run(), 1);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-099
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-099
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,5 @@
1
+ // REQ-GRPH-011 and REQ-GRPH-012
2
+ test('REQ-GRPH-011 and REQ-GRPH-012', () => {
3
+ assert.equal(alpha(), 1);
4
+ assert.equal(beta(), 1);
5
+ });
@@ -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:ee77a361adacea05a633d4fd6f1f056126450d4cbcd7433b2c338110c57ab2bd"
13
+ ---
14
+ ### REQ-GRPH-011: Alpha
15
+
16
+ The router records alpha.
17
+
18
+ Acceptance: record alpha.
19
+
20
+ ### REQ-GRPH-012: Beta
21
+
22
+ The router records beta.
23
+
24
+ Acceptance: record beta.
@@ -0,0 +1,5 @@
1
+ // REQ-GRPH-011 and REQ-GRPH-012
2
+ test('REQ-GRPH-011 and REQ-GRPH-012', () => {
3
+ assert.equal(alpha(), 2);
4
+ assert.equal(beta(), 1);
5
+ });
@@ -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:ee77a361adacea05a633d4fd6f1f056126450d4cbcd7433b2c338110c57ab2bd"
13
+ ---
14
+ ### REQ-GRPH-011: Alpha
15
+
16
+ The router records alpha.
17
+
18
+ Acceptance: record alpha.
19
+
20
+ ### REQ-GRPH-012: Beta
21
+
22
+ The router records beta.
23
+
24
+ Acceptance: record beta.
@@ -0,0 +1,26 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 2
4
+ previous_revision: 1
5
+ previous_digest: "sha256:f05c0d1805914cc15f9d41bf4499e83f594a32b002f6126681e7f9824c83c0a9"
6
+ status: "effective"
7
+ drafted_by: "Alice Example"
8
+ effective_at: "2026-10-17T00:02:00Z"
9
+ approval:
10
+ by: "Bob Independent"
11
+ at: "2026-10-17T00:00:00Z"
12
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
13
+ role: "human"
14
+ content_digest: "sha256:0e7f2fadfe3d4bd85553903e792219bbe0c2083e6e86556fdd115b931bd203ed"
15
+ ---
16
+ ### REQ-GRPH-011: Alpha
17
+
18
+ The router records alpha twice.
19
+
20
+ Acceptance: record alpha twice.
21
+
22
+ ### REQ-GRPH-012: Beta
23
+
24
+ The router records beta.
25
+
26
+ Acceptance: record beta.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.match(run(), /a b/);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.match(run(), /ab/);
@@ -0,0 +1,3 @@
1
+ # Guide
2
+
3
+ The lint step runs first.
@@ -0,0 +1,3 @@
1
+ # Guide
2
+
3
+ The lint step runs first.
@@ -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:be09e53d5409040df5d4d2533cbe3cb12e5039445a6ef7aad9589fa333fa4b60"
13
+ ---
14
+ # Graph
15
+
16
+ ## Context
17
+
18
+ The router is deterministic.
19
+
20
+ ### REQ-GRPH-020 (replaces: REQ-GRPH-013): Export
21
+
22
+ The graph exports a stable index.
23
+
24
+ Acceptance: the index is byte-identical across runs.
@@ -0,0 +1,26 @@
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:30427247b5b6504a05b63a771d69bdce8aa5c1b7fc936741f9db798cd3aadbfc"
13
+ ---
14
+ # Graph
15
+
16
+ ## Context
17
+
18
+ The router is deterministic.
19
+
20
+ ### REQ-GRPH-001
21
+
22
+ The router records one topology per task.
23
+
24
+ #### Acceptance
25
+
26
+ - exactly one topology is recorded
@@ -0,0 +1,26 @@
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:868f3bb9427a06bfdf211c74b2f8d5586e1af44c71c32f8db1a3cb68c66a03b0"
13
+ ---
14
+ # Graph
15
+
16
+ ## Context
17
+
18
+ The router is determinstic.
19
+
20
+ ### REQ-GRPH-001
21
+
22
+ The router records one topology per task.
23
+
24
+ #### Acceptance
25
+
26
+ - exactly one topology is recorded
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
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:f0715961ec620f963304941851b86493f1c58c009329aaff485ef796011dd4b3"
13
+ ---
14
+ ### REQ-GRPH-010 (aliases: REQ-GRPH-100): Initial requirement
15
+
16
+ Acceptance: resolve the original alias.
17
+
18
+ ### REQ-GRPH-011: Stable requirement
19
+
20
+ Acceptance: preserve the stable behavior.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
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:f0715961ec620f963304941851b86493f1c58c009329aaff485ef796011dd4b3"
13
+ ---
14
+ ### REQ-GRPH-010 (aliases: REQ-GRPH-100): Initial requirement
15
+
16
+ Acceptance: resolve the original alias.
17
+
18
+ ### REQ-GRPH-011: Stable requirement
19
+
20
+ Acceptance: preserve the stable behavior.
@@ -0,0 +1,28 @@
1
+ ---
2
+ id: "PRD-GRPH-001"
3
+ revision: 2
4
+ status: "effective"
5
+ drafted_by: "Alice Example"
6
+ previous_revision: 1
7
+ previous_digest: "sha256:305358d3ff29f45969b99562eec9bca2da12f35020decee5a3a667a16fd412f6"
8
+ effective_at: "2026-10-17T00:02:00Z"
9
+ approval:
10
+ by: "Bob Independent"
11
+ at: "2026-10-17T00:00:00Z"
12
+ ref: "https://approvals.example.invalid/PRD-GRPH-001"
13
+ role: "human"
14
+ content_digest: "sha256:2db2f2f1f7854177ec843c900bfd4027cf0f63f3dbfd1dd48124e91ac1e4d617"
15
+ ---
16
+ ### REQ-GRPH-010 (aliases: REQ-GRPH-100, REQ-GRPH-101): Initial requirement
17
+
18
+ Acceptance: resolve the original alias.
19
+
20
+ ### REQ-GRPH-011: Stable requirement
21
+
22
+ The router keeps the stable behavior across revisions.
23
+
24
+ Acceptance: preserve the stable behavior across revisions.
25
+
26
+ ### REQ-GRPH-012: Added requirement
27
+
28
+ Acceptance: include the new behavior.
@@ -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:f0715961ec620f963304941851b86493f1c58c009329aaff485ef796011dd4b3"
13
+ ---
14
+ ### REQ-GRPH-010 (aliases: REQ-GRPH-100): Initial requirement
15
+
16
+ Acceptance: resolve the original alias.
17
+
18
+ ### REQ-GRPH-011: Stable requirement
19
+
20
+ Acceptance: preserve the stable behavior.
@@ -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:c19bbdcbfd3018694d4a703b9d0857fef9e5d92c696cc2be3d15b4712fda7458"
13
+ ---
14
+ ### REQ-GRPH-010 (aliases: REQ-GRPH-100): Initial requirement
15
+
16
+ Acceptance: resolve the original alias.
17
+
18
+ ### REQ-GRPH-011: Stable requirement
19
+
20
+ The router keeps the stable behavior across revisions.
21
+
22
+ Acceptance: preserve the stable behavior across revisions.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ assert.equal(run(), 1);