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,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,3 @@
1
+ # Guide
2
+
3
+ The lint step runs first.
@@ -0,0 +1,3 @@
1
+ # Guide
2
+
3
+ The lint step runs first, then the link check.
@@ -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,20 @@
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:175ac77bc36c13ddb0b8449e7ba5683929e1ff81997aea5997cc44a979f2214f"
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-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:175ac77bc36c13ddb0b8449e7ba5683929e1ff81997aea5997cc44a979f2214f"
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-011
2
+ expect(run())['toEqual'](1);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ expect(run())['toEqual'](2);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ expect(run())[matcher](1);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ expect(run())[matcher](2);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ expect(run()).not.toEqual(1);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ expect(run()).not.toEqual(2);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal(run(), 1);
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal( run(), 1 );
@@ -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:17bcb4d28a4bb5198e38a4df95ef405722abb107a654584e1d6ea9199f5d6c3a"
13
+ ---
14
+ ### REQ-GRPH-001: Router
15
+
16
+ The router selects one topology.
17
+
18
+ Acceptance: one topology is selected.
@@ -0,0 +1 @@
1
+ test('REQ-GRPH-001', verifyRequirement);
@@ -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:17bcb4d28a4bb5198e38a4df95ef405722abb107a654584e1d6ea9199f5d6c3a"
13
+ ---
14
+ ### REQ-GRPH-001: Router
15
+
16
+ The router selects one topology.
17
+
18
+ Acceptance: one topology is selected.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-013
2
+ assert.equal(run(), 1);
@@ -0,0 +1,25 @@
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:f469f068b8f7eb5d93aac4e4f5b959fcbccdb48f81c6bf15f36ecc5595dbb36f"
13
+ ---
14
+ ### REQ-GRPH-011: Stable requirement
15
+
16
+ The router keeps the stable behavior.
17
+
18
+ Acceptance: preserve the stable behavior.
19
+
20
+ ### REQ-GRPH-013: Retired requirement
21
+
22
+ The router retires the old behavior.
23
+
24
+ Acceptance: retire the old behavior.
25
+
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-013
2
+ assert.equal(run(), 2);
@@ -0,0 +1,25 @@
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:f469f068b8f7eb5d93aac4e4f5b959fcbccdb48f81c6bf15f36ecc5595dbb36f"
13
+ ---
14
+ ### REQ-GRPH-011: Stable requirement
15
+
16
+ The router keeps the stable behavior.
17
+
18
+ Acceptance: preserve the stable behavior.
19
+
20
+ ### REQ-GRPH-013: Retired requirement
21
+
22
+ The router retires the old behavior.
23
+
24
+ Acceptance: retire the old behavior.
25
+
@@ -0,0 +1,23 @@
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:da1486a41acb66da8ea31622315086caa367b21c722011f451b3f6fc0fa04506"
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:f90d563d9297140828cafda5f154583590e7872a0024c1743d37e5e066fdfea1"
15
+ removed_reqs:
16
+ - "REQ-GRPH-013"
17
+ ---
18
+ ### REQ-GRPH-011: Stable requirement
19
+
20
+ The router keeps the stable behavior.
21
+
22
+ Acceptance: preserve the stable behavior.
23
+
@@ -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,26 @@
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:f0ad5b331c847bd91a3dffd3bfb653ec631c201c592fb599c5c4777e3cb01606"
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
+ Acceptance: preserve the stable behavior.
23
+
24
+ ### REQ-GRPH-012: Added requirement
25
+
26
+ Acceptance: include the new 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,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,26 @@
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:f0ad5b331c847bd91a3dffd3bfb653ec631c201c592fb599c5c4777e3cb01606"
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
+ Acceptance: preserve the stable behavior.
23
+
24
+ ### REQ-GRPH-012: Added requirement
25
+
26
+ Acceptance: include the new behavior.
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-011
2
+ assert.equal(run(), 2);
@@ -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,26 @@
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:f0ad5b331c847bd91a3dffd3bfb653ec631c201c592fb599c5c4777e3cb01606"
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
+ Acceptance: preserve the stable behavior.
23
+
24
+ ### REQ-GRPH-012: Added requirement
25
+
26
+ Acceptance: include the new behavior.
@@ -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:48ef1601f5559dbabd9c860d3c86a4ccb7492d5d466766405ef550a9019f47fa"
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,6 @@
1
+ test('REQ-GRPH-001 check', () => {
2
+ assert.equal(run(), 1);
3
+ });
4
+ test('ordinary check', () => {
5
+ assert.equal(other(), 1);
6
+ });
@@ -0,0 +1,6 @@
1
+ test('REQ-GRPH-001 check', () => {
2
+ assert.equal(run(), 1);
3
+ });
4
+ test('ordinary check', () => {
5
+ assert.equal(other(), 2);
6
+ });
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal(run(), 'a b');
@@ -0,0 +1,2 @@
1
+ // REQ-GRPH-001
2
+ assert.equal(run(), 'ab');
@@ -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,6 @@
1
+ test('REQ-GRPH-001 check, () => {
2
+ assert.equal(run(), 2);
3
+ });
4
+ test('REQ-GRPH-002 check', () => {
5
+ assert.equal(other(), 1);
6
+ });
@@ -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,11 @@
1
+ ---
2
+ id: graph
3
+ role: prd
4
+ status: active
5
+ # Graph
6
+
7
+ ### REQ-GRPH-001
8
+
9
+ The router records one topology per task.
10
+
11
+ 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.