@afokapu/atdd-bun 0.3.2 → 0.5.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 (208) hide show
  1. package/PLANNER_PORT.md +1 -1
  2. package/README.md +111 -4
  3. package/conventions/coder.bun/coder.bun.complexity-cyclomatic.convention.yaml +1 -3
  4. package/conventions/coder.bun/coder.bun.complexity-length.convention.yaml +1 -2
  5. package/conventions/coder.bun/coder.bun.complexity-nesting.convention.yaml +1 -2
  6. package/conventions/coder.bun/coder.bun.dead-code-reachability.convention.yaml +1 -2
  7. package/conventions/coder.bun/coder.bun.design-token-color.convention.yaml +1 -1
  8. package/conventions/coder.bun/coder.bun.design-token-hardcoded.convention.yaml +1 -1
  9. package/conventions/coder.bun/coder.bun.dto-mapper.convention.yaml +2 -1
  10. package/conventions/coder.bun/coder.bun.dto-placement.convention.yaml +2 -1
  11. package/conventions/coder.bun/coder.bun.dto-purity.convention.yaml +2 -1
  12. package/conventions/coder.bun/coder.bun.duplication-intra-layer.convention.yaml +1 -2
  13. package/conventions/coder.bun/coder.bun.green-header-order.convention.yaml +2 -11
  14. package/conventions/coder.bun/coder.bun.green-header-purpose.convention.yaml +2 -11
  15. package/conventions/coder.bun/coder.bun.green-header-runtime.convention.yaml +2 -11
  16. package/conventions/coder.bun/coder.bun.green-header-tested-by.convention.yaml +2 -11
  17. package/conventions/coder.bun/coder.bun.green-urn-layer.convention.yaml +2 -11
  18. package/conventions/coder.bun/coder.bun.green-urn-marker.convention.yaml +2 -12
  19. package/conventions/coder.bun/coder.bun.green-urn-name-matches.convention.yaml +3 -12
  20. package/conventions/coder.bun/coder.bun.green-urn-pattern.convention.yaml +2 -11
  21. package/conventions/coder.bun/coder.bun.green-urn-side.convention.yaml +2 -11
  22. package/conventions/coder.bun/coder.bun.green-urn-wagon-feature.convention.yaml +2 -11
  23. package/conventions/coder.bun/coder.bun.layer-naming.convention.yaml +2 -1
  24. package/conventions/coder.bun/coder.bun.logging-structured.convention.yaml +2 -4
  25. package/conventions/coder.bun/coder.bun.quality-comments.convention.yaml +1 -2
  26. package/conventions/coder.bun/coder.bun.quality-mi.convention.yaml +1 -2
  27. package/conventions/coder.bun/coder.bun.responsive-breakpoints-declared.convention.yaml +31 -0
  28. package/conventions/coder.bun/coder.bun.responsive-no-fixed-width.convention.yaml +30 -0
  29. package/conventions/coder.bun/coder.bun.responsive-viewport-meta.convention.yaml +31 -0
  30. package/conventions/coder.bun/coder.bun.runtime-executes-the-declaration.convention.yaml +2 -18
  31. package/conventions/coder.bun/coder.bun.runtime-typecheck-enforced.convention.yaml +2 -15
  32. package/conventions/coder.htmx/coder.htmx.swap-no-inline-handler.convention.yaml +3 -3
  33. package/conventions/coder.htmx/coder.htmx.verb-endpoint-is-routed.convention.yaml +2 -2
  34. package/conventions/coder.htmx/coder.htmx.verb-mutation-signals-progress.convention.yaml +3 -2
  35. package/conventions/planner.docs/planner.docs.adr-registry-derived.convention.yaml +2 -12
  36. package/conventions/planner.docs/planner.docs.area-index-required.convention.yaml +2 -12
  37. package/conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml +2 -12
  38. package/conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml +2 -13
  39. package/conventions/planner.docs/planner.docs.doc-id-unique.convention.yaml +2 -12
  40. package/conventions/planner.docs/planner.docs.graph-target-resolves.convention.yaml +2 -12
  41. package/conventions/planner.docs/planner.docs.identity-required.convention.yaml +2 -12
  42. package/conventions/planner.docs/planner.docs.journey-view-current.convention.yaml +53 -0
  43. package/conventions/planner.docs/planner.docs.reference-integrity.convention.yaml +2 -12
  44. package/conventions/planner.docs/planner.docs.undeclared-change.convention.yaml +2 -12
  45. package/conventions/tester.bun/tester.bun.acceptance-binding-declared.convention.yaml +2 -6
  46. package/conventions/tester.bun/tester.bun.acceptance-covers-tag-well-formed.convention.yaml +1 -5
  47. package/conventions/tester.bun/tester.bun.interlocking-train-sequence-is-exercised.convention.yaml +2 -14
  48. package/conventions/tester.bun/tester.bun.red-behavioral-assertion.convention.yaml +1 -5
  49. package/conventions/tester.bun/tester.bun.routing-runtime-family.convention.yaml +2 -1
  50. package/conventions/tester.bun/tester.bun.smoke-no-collaborator-substitution.convention.yaml +2 -7
  51. package/conventions/tester.bun/tester.bun.smoke-observable-assertion.convention.yaml +2 -7
  52. package/conventions/tester.bun/tester.bun.telemetry-emit.convention.yaml +2 -1
  53. package/conventions/tester.bun/tester.bun.test-carries-urn-identity.convention.yaml +2 -6
  54. package/conventions/tester.bun/tester.bun.test-isolation-no-live-state.convention.yaml +1 -5
  55. package/conventions/tester.bun/tester.bun.test-no-self-skip.convention.yaml +1 -5
  56. package/conventions/tester.bun/tester.bun.test-phase-declared.convention.yaml +2 -6
  57. package/conventions/tester.htmx/tester.htmx.a11y-harness.convention.yaml +32 -0
  58. package/conventions/tester.htmx/tester.htmx.covered-train-is-routed.convention.yaml +30 -0
  59. package/conventions/tester.htmx/tester.htmx.e2e-binds-declared-subject.convention.yaml +31 -0
  60. package/conventions/tester.htmx/tester.htmx.e2e-spec-naming.convention.yaml +32 -0
  61. package/conventions/tester.htmx/tester.htmx.exposed-journey-e2e-coverage.convention.yaml +31 -0
  62. package/conventions/tester.htmx/tester.htmx.fragment-asserts-returned-markup.convention.yaml +2 -6
  63. package/conventions/tester.htmx/tester.htmx.journey-binding-header.convention.yaml +32 -0
  64. package/conventions/tester.htmx/tester.htmx.journey-layer-assembly.convention.yaml +29 -0
  65. package/conventions/tester.htmx/tester.htmx.journey-no-acceptance-marker.convention.yaml +29 -0
  66. package/conventions/tester.htmx/tester.htmx.journey-urn-format.convention.yaml +32 -0
  67. package/conventions/tester.htmx/tester.htmx.presentation-smoke-coverage.convention.yaml +31 -0
  68. package/conventions/tester.htmx/tester.htmx.responsive-harness.convention.yaml +33 -0
  69. package/conventions/tester.htmx/tester.htmx.responsive-journey-coverage.convention.yaml +30 -0
  70. package/conventions/tester.htmx/tester.htmx.swap-oob-asserts-destination-id.convention.yaml +2 -1
  71. package/conventions/tester.htmx/tester.htmx.train-e2e-coverage.convention.yaml +32 -0
  72. package/conventions/tester.htmx/tester.htmx.verb-endpoint-coverage.convention.yaml +2 -1
  73. package/conventions/tester.htmx/tester.htmx.visual-harness.convention.yaml +28 -0
  74. package/conventions/traceability/traceability.plan.executable-acceptance-has-test.convention.yaml +5 -0
  75. package/conventions/traceability/traceability.source.tested-by-present.convention.yaml +5 -0
  76. package/conventions/traceability/traceability.source.tested-by-resolves.convention.yaml +5 -0
  77. package/conventions/traceability/traceability.test.binding-resolves.convention.yaml +5 -0
  78. package/detectors/bun_green_traceability_detector/urn_header.mjs +2 -1
  79. package/detectors/bun_responsive_detector/atdd.implementation.yaml +18 -0
  80. package/detectors/bun_responsive_detector/checks/_map.json +5 -0
  81. package/detectors/bun_responsive_detector/checks/_responsive.mjs +20 -0
  82. package/detectors/bun_responsive_detector/checks/responsive_breakpoints_declared.mjs +21 -0
  83. package/detectors/bun_responsive_detector/checks/responsive_no_fixed_width.mjs +13 -0
  84. package/detectors/bun_responsive_detector/checks/responsive_viewport_meta.mjs +20 -0
  85. package/detectors/bun_responsive_detector/detect.mjs +46 -0
  86. package/detectors/bun_responsive_detector/fixtures/clean/public/index.html +9 -0
  87. package/detectors/bun_responsive_detector/fixtures/clean/src/app.css +13 -0
  88. package/detectors/bun_responsive_detector/fixtures/clean/src/document.ts +7 -0
  89. package/detectors/bun_responsive_detector/fixtures/clean/src/fragment.html +1 -0
  90. package/detectors/bun_responsive_detector/fixtures/clean/src/head.ts +1 -0
  91. package/detectors/bun_responsive_detector/fixtures/clean/src/layout.tsx +8 -0
  92. package/detectors/bun_responsive_detector/fixtures/clean/src/range.css +3 -0
  93. package/detectors/bun_responsive_detector/fixtures/clean/src/viewport-expression.tsx +5 -0
  94. package/detectors/bun_responsive_detector/fixtures/dirty/public/fixed-viewport.html +5 -0
  95. package/detectors/bun_responsive_detector/fixtures/dirty/public/no-meta.html +5 -0
  96. package/detectors/bun_responsive_detector/fixtures/dirty/public/no-zoom.html +5 -0
  97. package/detectors/bun_responsive_detector/fixtures/dirty/public/scale.html +5 -0
  98. package/detectors/bun_responsive_detector/fixtures/dirty/src/app.css +4 -0
  99. package/detectors/bun_responsive_detector/fixtures/dirty/src/render.ts +2 -0
  100. package/detectors/bun_responsive_detector/fixtures/dirty/src/units.css +3 -0
  101. package/detectors/bun_responsive_detector/fixtures/dirty/src/wide.tsx +3 -0
  102. package/detectors/htmx_e2e_detector/atdd.implementation.yaml +40 -0
  103. package/detectors/htmx_e2e_detector/checks/_e2e.mjs +98 -0
  104. package/detectors/htmx_e2e_detector/checks/_map.json +16 -0
  105. package/detectors/htmx_e2e_detector/checks/a11y_harness.mjs +21 -0
  106. package/detectors/htmx_e2e_detector/checks/covered_train_is_routed.mjs +6 -0
  107. package/detectors/htmx_e2e_detector/checks/e2e_binds_declared_subject.mjs +11 -0
  108. package/detectors/htmx_e2e_detector/checks/e2e_spec_naming.mjs +6 -0
  109. package/detectors/htmx_e2e_detector/checks/exposed_journey_e2e_coverage.mjs +7 -0
  110. package/detectors/htmx_e2e_detector/checks/journey_binding_header.mjs +13 -0
  111. package/detectors/htmx_e2e_detector/checks/journey_layer_assembly.mjs +11 -0
  112. package/detectors/htmx_e2e_detector/checks/journey_no_acceptance_marker.mjs +6 -0
  113. package/detectors/htmx_e2e_detector/checks/journey_urn_format.mjs +18 -0
  114. package/detectors/htmx_e2e_detector/checks/presentation_smoke_coverage.mjs +15 -0
  115. package/detectors/htmx_e2e_detector/checks/responsive_harness.mjs +30 -0
  116. package/detectors/htmx_e2e_detector/checks/responsive_journey_coverage.mjs +7 -0
  117. package/detectors/htmx_e2e_detector/checks/train_e2e_coverage.mjs +7 -0
  118. package/detectors/htmx_e2e_detector/checks/visual_harness.mjs +7 -0
  119. package/detectors/htmx_e2e_detector/detect.mjs +46 -0
  120. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy-alias.a11y.e2e.ts +12 -0
  121. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy-inline.responsive.e2e.ts +11 -0
  122. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.a11y.e2e.ts +12 -0
  123. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.responsive.e2e.ts +14 -0
  124. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.visual.e2e.ts +10 -0
  125. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/checkout-buy.smoke.e2e.ts +10 -0
  126. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/crlf.e2e.ts +10 -0
  127. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/place-order.e2e.ts +10 -0
  128. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/reject-empty-cart.e2e.ts +10 -0
  129. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/support/fixtures.ts +3 -0
  130. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/take-payment.e2e.ts +10 -0
  131. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_journeys/buy.yaml +19 -0
  132. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_journeys/settle.yaml +14 -0
  133. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/checkout.yaml +21 -0
  134. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/payment.yaml +16 -0
  135. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/settlement.yaml +16 -0
  136. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/place-order.yaml +11 -0
  137. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/reject-empty-cart.yaml +11 -0
  138. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/settle-ledger.yaml +11 -0
  139. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/take-payment.yaml +11 -0
  140. package/detectors/htmx_e2e_detector/fixtures/clean/playwright.config.ts +3 -0
  141. package/detectors/htmx_e2e_detector/fixtures/clean/src/wagons/checkout/presentation/cart.tsx +3 -0
  142. package/detectors/htmx_e2e_detector/fixtures/clean/tests/urn-parser.test.ts +7 -0
  143. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/acceptance.e2e.ts +6 -0
  144. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/bad-id.e2e.ts +10 -0
  145. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/bad-urn.e2e.ts +10 -0
  146. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/both.e2e.ts +6 -0
  147. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.a11y.e2e.ts +10 -0
  148. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.responsive.e2e.ts +11 -0
  149. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.visual.e2e.ts +10 -0
  150. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/covered.e2e.ts +10 -0
  151. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/first-only.responsive.e2e.ts +13 -0
  152. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/ghost.e2e.ts +10 -0
  153. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/misnamed.spec.ts +10 -0
  154. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-binding.e2e.ts +4 -0
  155. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-layer.e2e.ts +4 -0
  156. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-urn.e2e.ts +4 -0
  157. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/tautology.a11y.e2e.ts +11 -0
  158. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/two-trains.e2e.ts +6 -0
  159. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/unrouted.e2e.ts +10 -0
  160. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/wrong-layer.e2e.ts +5 -0
  161. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/wrong-urn.e2e.ts +10 -0
  162. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_journeys/browse.yaml +16 -0
  163. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_journeys/buy.yaml +16 -0
  164. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/_interlockings/checkout.yaml +21 -0
  165. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/covered.yaml +11 -0
  166. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/uncovered.yaml +11 -0
  167. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/unrouted.yaml +11 -0
  168. package/detectors/htmx_e2e_detector/fixtures/dirty/src/wagons/billing/presentation/invoice.tsx +3 -0
  169. package/detectors/planner_docs_capability/atdd.implementation.yaml +2 -0
  170. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/index.adoc +170 -0
  171. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/journey-buy.svg +61 -0
  172. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/path-buy-nominal.svg +81 -0
  173. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-archive-order.svg +13 -0
  174. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-place-order.svg +31 -0
  175. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-reject-empty-cart.svg +22 -0
  176. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-retry-payment.svg +22 -0
  177. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-ship-order.svg +35 -0
  178. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-take-payment.svg +27 -0
  179. package/detectors/planner_docs_capability/fixtures/clean/plan/_journeys/buy.yaml +24 -0
  180. package/detectors/planner_docs_capability/fixtures/clean/plan/_themes.yaml +3 -0
  181. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/checkout.yaml +43 -0
  182. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/fulfilment.yaml +33 -0
  183. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/payment.yaml +43 -0
  184. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/returns.yaml +33 -0
  185. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/archive-order.yaml +11 -0
  186. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/place-order.yaml +21 -0
  187. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/reject-empty-cart.yaml +16 -0
  188. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/retry-payment.yaml +16 -0
  189. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/ship-order.yaml +21 -0
  190. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/take-payment.yaml +21 -0
  191. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/unrouted-refund.yaml +11 -0
  192. package/detectors/planner_docs_capability/fixtures/dirty_journey_view/docs/index.adoc +3 -0
  193. package/detectors/planner_docs_capability/fixtures/dirty_journey_view/plan/_trains/_interlockings/fulfilment.yaml +33 -0
  194. package/detectors/planner_static_validators/atdd.implementation.yaml +2 -0
  195. package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/_interlockings/uncomposed.yaml +4 -0
  196. package/integrity.json +207 -70
  197. package/lib/frontend.mjs +17 -0
  198. package/lib/scan.mjs +6 -2
  199. package/package.json +7 -2
  200. package/planner-nodes/ENFORCEMENT_SCOPE.yaml +25 -2
  201. package/planner-nodes/nodes/planner.journey.interlocking-composed.convention.yaml +43 -0
  202. package/relationships.yaml +4790 -0
  203. package/src/cli.ts +9 -0
  204. package/src/docs-capability.ts +10 -1
  205. package/src/enforce.ts +4 -4
  206. package/src/index.ts +2 -0
  207. package/src/journey-docs.ts +355 -0
  208. package/src/planner-validators.ts +29 -0
@@ -0,0 +1,4790 @@
1
+ # Relationship graph for every convention this package ships (planner-nodes/ and conventions/).
2
+ # planner.relationship.no-orphan-nodes: every node appears as the source or target of at least one edge.
3
+ # Edges with an `origin` other than @afokapu/atdd-bun are imported unchanged from the upstream graphs
4
+ # (atdd@36ce055a, atdd-extensions@3aa141e) because they touch a shipped convention; the rest are the
5
+ # package's own. Each edge follows planner-schemas/author/relationship.schema.json. Upstream edges whose
6
+ # type the schema does not define (realized-by, scoped-by, gated-by, refines: 32 at the commits above)
7
+ # are not imported; several do not relate two conventions at all.
8
+ schema_version: 1.0.0
9
+ graph_id: "@afokapu/atdd-bun"
10
+ nodes:
11
+ - coder.bun.boundaries-http-client
12
+ - coder.bun.commons-application-no-integration
13
+ - coder.bun.commons-cross-feature-imports-in
14
+ - coder.bun.commons-domain-no-framework-import
15
+ - coder.bun.commons-domain-no-outbound
16
+ - coder.bun.complexity-cyclomatic
17
+ - coder.bun.complexity-length
18
+ - coder.bun.complexity-nesting
19
+ - coder.bun.composition-consumer
20
+ - coder.bun.composition-root
21
+ - coder.bun.dead-code-reachability
22
+ - coder.bun.design-connected
23
+ - coder.bun.design-dependency-flow
24
+ - coder.bun.design-hierarchy-import
25
+ - coder.bun.design-orphan-export
26
+ - coder.bun.design-primitives
27
+ - coder.bun.design-token-color
28
+ - coder.bun.design-token-hardcoded
29
+ - coder.bun.design-tokens-pure
30
+ - coder.bun.design-wagons-import
31
+ - coder.bun.dto-mapper
32
+ - coder.bun.dto-placement
33
+ - coder.bun.dto-purity
34
+ - coder.bun.duplication-intra-layer
35
+ - coder.bun.error-response-bare-string
36
+ - coder.bun.error-response-code-format
37
+ - coder.bun.green-header-order
38
+ - coder.bun.green-header-purpose
39
+ - coder.bun.green-header-runtime
40
+ - coder.bun.green-header-tested-by
41
+ - coder.bun.green-urn-layer
42
+ - coder.bun.green-urn-marker
43
+ - coder.bun.green-urn-name-matches
44
+ - coder.bun.green-urn-pattern
45
+ - coder.bun.green-urn-side
46
+ - coder.bun.green-urn-wagon-feature
47
+ - coder.bun.interlocking-bilateral-binding
48
+ - coder.bun.interlocking-delegates-to-trainrunner
49
+ - coder.bun.interlocking-does-not-carry-cargo
50
+ - coder.bun.interlocking-resolution-model-exists
51
+ - coder.bun.interlocking-runner-exists
52
+ - coder.bun.journey-runner-boundary
53
+ - coder.bun.layer-naming
54
+ - coder.bun.logging-console
55
+ - coder.bun.logging-structured
56
+ - coder.bun.quality-comments
57
+ - coder.bun.quality-mi
58
+ - coder.bun.responsive-breakpoints-declared
59
+ - coder.bun.responsive-no-fixed-width
60
+ - coder.bun.responsive-viewport-meta
61
+ - coder.bun.runtime-executes-the-declaration
62
+ - coder.bun.runtime-server-is-bun-serve
63
+ - coder.bun.runtime-single-lockfile
64
+ - coder.bun.runtime-typecheck-enforced
65
+ - coder.bun.security-hardcoded-secret
66
+ - coder.bun.security-missing-auth
67
+ - coder.bun.security-sql-injection
68
+ - coder.bun.station-master-interlocking-routing
69
+ - coder.bun.station-master-journey-routing
70
+ - coder.bun.wagon-honours-its-contract
71
+ - coder.htmx.fragment-escapes-interpolation
72
+ - coder.htmx.swap-no-inline-handler
73
+ - coder.htmx.swap-oob-carries-id
74
+ - coder.htmx.verb-destructive-confirms
75
+ - coder.htmx.verb-endpoint-is-routed
76
+ - coder.htmx.verb-endpoint-same-origin
77
+ - coder.htmx.verb-mutation-signals-progress
78
+ - planner.acceptance.abstract-fields-required
79
+ - planner.acceptance.authoring-guidelines
80
+ - planner.acceptance.boundary-kind-vocabulary
81
+ - planner.acceptance.execution-kind
82
+ - planner.acceptance.extraction-no-inference
83
+ - planner.acceptance.generator-prompts
84
+ - planner.acceptance.given-when-then-structure
85
+ - planner.acceptance.harness
86
+ - planner.acceptance.harness-vocabulary
87
+ - planner.acceptance.hermetic-fake-contract
88
+ - planner.acceptance.id-pattern
89
+ - planner.acceptance.max-per-wmbt
90
+ - planner.acceptance.plane-keywords
91
+ - planner.acceptance.route-construction
92
+ - planner.acceptance.signal-telemetry-naming
93
+ - planner.acceptance.urn-generation
94
+ - planner.acceptance.well-formed
95
+ - planner.appendix.llm-guidelines
96
+ - planner.appendix.naming-pattern
97
+ - planner.appendix.storage
98
+ - planner.appendix.structure
99
+ - planner.appendix.types
100
+ - planner.artifact-naming.anti-patterns
101
+ - planner.artifact-naming.cardinality-from-aspect
102
+ - planner.artifact-naming.colon-for-hierarchy
103
+ - planner.artifact-naming.contract-file-mapping
104
+ - planner.artifact-naming.depth-guidelines
105
+ - planner.artifact-naming.dot-for-variant
106
+ - planner.artifact-naming.logical-physical-mapping
107
+ - planner.artifact-naming.migration-guide
108
+ - planner.artifact-naming.naming-pattern
109
+ - planner.artifact-naming.path-mirrors-identity
110
+ - planner.artifact-naming.planner-artifacts-use-stable
111
+ - planner.artifact-naming.pluralization
112
+ - planner.artifact-naming.schema-identifier
113
+ - planner.artifact-naming.separator-semantics
114
+ - planner.artifact-naming.theme-first-identity
115
+ - planner.artifact-naming.urn-structure
116
+ - planner.artifact-naming.validation-rules
117
+ - planner.artifact-naming.verb-object-corpus-drift
118
+ - planner.artifact.definition
119
+ - planner.component.artifact-derivation
120
+ - planner.component.business-focus
121
+ - planner.component.count-limit
122
+ - planner.component.derivation
123
+ - planner.component.io-alignment
124
+ - planner.component.layer-assignment
125
+ - planner.component.layer-consistency
126
+ - planner.component.method-limit
127
+ - planner.component.structure
128
+ - planner.component.type-catalog
129
+ - planner.component.urn
130
+ - planner.contract.registry-coherence
131
+ - planner.convention.remedy-must-be-followable
132
+ - planner.coverage.bidirectional-coverage-between-trains
133
+ - planner.coverage.bidirectional-coverage-between-wagons
134
+ - planner.coverage.coverage-graph
135
+ - planner.coverage.every-wmbt-must-be
136
+ - planner.coverage.every-wmbt-must-have
137
+ - planner.coverage.exception-handling
138
+ - planner.criteria.defaults
139
+ - planner.criteria.harness-templates
140
+ - planner.criteria.metric-mapping
141
+ - planner.criteria.plane-keywords
142
+ - planner.criteria.sequence-routing
143
+ - planner.criteria.shape
144
+ - planner.decomposition.canonical-steps
145
+ - planner.decomposition.document-trouble-obligation
146
+ - planner.decomposition.domain-vs-technology
147
+ - planner.decomposition.jtbd-vs-odi-grammar
148
+ - planner.decomposition.keep-pivot-kill
149
+ - planner.decomposition.local-scope
150
+ - planner.decomposition.natural-language-normalization
151
+ - planner.decomposition.train-journey
152
+ - planner.decomposition.wagon-rationale
153
+ - planner.definition.anchor-required
154
+ - planner.docs.adr-registry-derived
155
+ - planner.docs.area-index-required
156
+ - planner.docs.artifact-path-shape
157
+ - planner.docs.asciidoc-only
158
+ - planner.docs.doc-id-unique
159
+ - planner.docs.graph-target-resolves
160
+ - planner.docs.identity-required
161
+ - planner.docs.journey-view-current
162
+ - planner.docs.reference-integrity
163
+ - planner.docs.undeclared-change
164
+ - planner.feature.artifact-seeded-naming
165
+ - planner.feature.definition
166
+ - planner.feature.estimation
167
+ - planner.feature.feedback-loop-close-the-loop
168
+ - planner.feature.feedback-loop-kind
169
+ - planner.feature.feedback-loop-suppression
170
+ - planner.feature.footprint-scoring
171
+ - planner.feature.grouping-strategy
172
+ - planner.feature.hard-limits
173
+ - planner.feature.name-is-verb-object
174
+ - planner.feature.shape
175
+ - planner.feature.size-max-rule
176
+ - planner.feature.urn-naming
177
+ - planner.feature.validation-rules
178
+ - planner.feature.verb-selection-by-artifact-type
179
+ - planner.feature.wagon-link
180
+ - planner.interface.api-mapping
181
+ - planner.interface.artifact-transformation
182
+ - planner.interface.contract-urn
183
+ - planner.interface.naming-patterns
184
+ - planner.interface.orphan-detection
185
+ - planner.interface.ownership-rules
186
+ - planner.interface.structure-rules
187
+ - planner.interface.tests-subdirectory
188
+ - planner.interlocking.definition
189
+ - planner.interlocking.registry-mirrors-document
190
+ - planner.issue-body.dependency-entries-must-be-classified
191
+ - planner.issue-body.graph-context-required
192
+ - planner.journey.continuation-closure
193
+ - planner.journey.definition
194
+ - planner.journey.interlocking-composed
195
+ - planner.plan.confirm-before-author
196
+ - planner.plan.confirm-binds-an-issue
197
+ - planner.plan.confirm-requires-interlocking-sanity
198
+ - planner.plan.granularity-completeness
199
+ - planner.plan.session-lifecycle
200
+ - planner.plan.spec-is-schema-valid
201
+ - planner.relationship.no-orphan-nodes
202
+ - planner.smoke.feedback-loop-close-the-loop
203
+ - planner.smoke.synthetic-fixture-bypass
204
+ - planner.steps.architecture-routing
205
+ - planner.steps.jtbd-taxonomy
206
+ - planner.steps.linguistic-patterns
207
+ - planner.steps.sequence
208
+ - planner.subject.invariants
209
+ - planner.theme.definition
210
+ - planner.theme.must-be-canonical
211
+ - planner.theme.theme-zero-mandatory
212
+ - planner.theme.urn-namespace-matches
213
+ - planner.train.acceptance-commit-failures-covered
214
+ - planner.train.acceptances
215
+ - planner.train.artifact-flow
216
+ - planner.train.categories
217
+ - planner.train.definition
218
+ - planner.train.dependencies
219
+ - planner.train.dispatch-composite-key-exceptional
220
+ - planner.train.dispatch-map-is-registry
221
+ - planner.train.family
222
+ - planner.train.family-matches-terminal-contract
223
+ - planner.train.initial-cargo-inputs-declared
224
+ - planner.train.interlocking-does-not-carry-cargo
225
+ - planner.train.interlocking-entrypoint-shape
226
+ - planner.train.interlocking-fragment-acceptance-binding
227
+ - planner.train.interlocking-guard-coverage
228
+ - planner.train.interlocking-guard-grammar
229
+ - planner.train.interlocking-home
230
+ - planner.train.interlocking-message-payload-typed
231
+ - planner.train.interlocking-payload-contract-body-required
232
+ - planner.train.interlocking-payload-contract-registered
233
+ - planner.train.interlocking-projection-equivalence
234
+ - planner.train.interlocking-route-category-matches-train-id
235
+ - planner.train.interlocking-route-resolution-deterministic
236
+ - planner.train.interlocking-structural-residual-explicit
237
+ - planner.train.interlocking-wmbt-surface-or-residual
238
+ - planner.train.linearity
239
+ - planner.train.naming
240
+ - planner.train.participants
241
+ - planner.train.production-implementation
242
+ - planner.train.registry
243
+ - planner.train.registry-coherence
244
+ - planner.train.route-category-assessment
245
+ - planner.train.route-space-admission
246
+ - planner.train.scope
247
+ - planner.train.sequence
248
+ - planner.train.terminal-contract
249
+ - planner.train.theme-alignment
250
+ - planner.train.theme-orchestrator-urn
251
+ - planner.train.theme-ranges
252
+ - planner.train.validation-rules
253
+ - planner.train.variation-strategies
254
+ - planner.wagon.artifact-contracts
255
+ - planner.wagon.complexity-model
256
+ - planner.wagon.coupling-complexity
257
+ - planner.wagon.definition
258
+ - planner.wagon.features
259
+ - planner.wagon.features-format
260
+ - planner.wagon.logical-vs-filesystem-naming
261
+ - planner.wagon.name-is-verb-object
262
+ - planner.wagon.no-consume-cycle
263
+ - planner.wagon.produce-consume-artifacts
264
+ - planner.wagon.refinement-extraction
265
+ - planner.wagon.semantic-coherence
266
+ - planner.wagon.separability
267
+ - planner.wagon.slug-dirname-conversion
268
+ - planner.wagon.telemetry-filesystem
269
+ - planner.wagon.urn
270
+ - planner.wagon.urn-naming
271
+ - planner.wmbt.context-clarifier
272
+ - planner.wmbt.definition
273
+ - planner.wmbt.dimension-selection
274
+ - planner.wmbt.direction-selection
275
+ - planner.wmbt.filename-pattern
276
+ - planner.wmbt.lens-selection
277
+ - planner.wmbt.must-have-smoke-acceptance
278
+ - planner.wmbt.object-of-control
279
+ - planner.wmbt.shape
280
+ - planner.wmbt.splitting-rules
281
+ - planner.wmbt.statement-template
282
+ - planner.wmbt.step-code-vocabulary
283
+ - planner.wmbt.urn-naming
284
+ - tester.bun.acceptance-binding-declared
285
+ - tester.bun.acceptance-covers-tag-well-formed
286
+ - tester.bun.acceptance-resolves-to-declared
287
+ - tester.bun.interlocking-production-runner-used
288
+ - tester.bun.interlocking-route-coverage
289
+ - tester.bun.interlocking-smoke-coverage-for-station-master
290
+ - tester.bun.interlocking-trace-binds-declared-route
291
+ - tester.bun.interlocking-train-sequence-is-exercised
292
+ - tester.bun.red-behavioral-assertion
293
+ - tester.bun.red-fails-first
294
+ - tester.bun.routing-runtime-family
295
+ - tester.bun.security-auth
296
+ - tester.bun.security-input
297
+ - tester.bun.smoke-no-collaborator-substitution
298
+ - tester.bun.smoke-observable-assertion
299
+ - tester.bun.telemetry-emit
300
+ - tester.bun.test-carries-urn-identity
301
+ - tester.bun.test-imports-bun-test
302
+ - tester.bun.test-isolation-no-live-state
303
+ - tester.bun.test-no-self-skip
304
+ - tester.bun.test-phase-declared
305
+ - tester.htmx.a11y-harness
306
+ - tester.htmx.covered-train-is-routed
307
+ - tester.htmx.e2e-binds-declared-subject
308
+ - tester.htmx.e2e-spec-naming
309
+ - tester.htmx.exposed-journey-e2e-coverage
310
+ - tester.htmx.fragment-asserts-returned-markup
311
+ - tester.htmx.journey-binding-header
312
+ - tester.htmx.journey-layer-assembly
313
+ - tester.htmx.journey-no-acceptance-marker
314
+ - tester.htmx.journey-urn-format
315
+ - tester.htmx.presentation-smoke-coverage
316
+ - tester.htmx.responsive-harness
317
+ - tester.htmx.responsive-journey-coverage
318
+ - tester.htmx.swap-oob-asserts-destination-id
319
+ - tester.htmx.train-e2e-coverage
320
+ - tester.htmx.verb-endpoint-coverage
321
+ - tester.htmx.visual-harness
322
+ - traceability.plan.executable-acceptance-has-test
323
+ - traceability.source.tested-by-present
324
+ - traceability.source.tested-by-resolves
325
+ - traceability.test.binding-resolves
326
+ edges:
327
+ - confidence: 1
328
+ constraint: mandatory
329
+ control: internal
330
+ foundation: finish_to_start
331
+ reason: the acceptance commit is the delivery terminal contract
332
+ source_ref: coder.train.acceptance-commit-idempotent
333
+ strength: important
334
+ target_ref: planner.train.terminal-contract
335
+ type: requires
336
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
337
+ - confidence: 1
338
+ constraint: mandatory
339
+ control: internal
340
+ foundation: finish_to_start
341
+ reason: "the coder train composition root realizes the planner's production-implementation train spec"
342
+ source_ref: coder.train.production-composition-cargo-zero-drift
343
+ strength: important
344
+ target_ref: planner.train.production-implementation
345
+ type: requires
346
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
347
+ - confidence: 1
348
+ constraint: mandatory
349
+ control: internal
350
+ foundation: finish_to_start
351
+ reason: fan-out at the Station Master preserves train linearity
352
+ source_ref: coder.train.station-master-owns-child-train-fanout
353
+ strength: important
354
+ target_ref: planner.train.linearity
355
+ type: requires
356
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
357
+ - confidence: 0.9
358
+ constraint: discretionary
359
+ control: internal
360
+ foundation: finish_to_start
361
+ reason: following the authoring guidelines is what yields a complete acceptance
362
+ source_ref: planner.acceptance.authoring-guidelines
363
+ strength: minor
364
+ target_ref: planner.acceptance.complete
365
+ type: enables
366
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
367
+ - confidence: 0.9
368
+ constraint: discretionary
369
+ control: internal
370
+ foundation: finish_to_start
371
+ reason: following the authoring guidelines is what yields a well-formed acceptance
372
+ source_ref: planner.acceptance.authoring-guidelines
373
+ strength: minor
374
+ target_ref: planner.acceptance.well-formed
375
+ type: enables
376
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
377
+ - confidence: 1
378
+ constraint: mandatory
379
+ control: internal
380
+ foundation: finish_to_start
381
+ reason: completeness includes the required abstract Gherkin fields
382
+ source_ref: planner.acceptance.complete
383
+ strength: important
384
+ target_ref: planner.acceptance.abstract-fields-required
385
+ type: requires
386
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
387
+ - confidence: 1
388
+ constraint: mandatory
389
+ control: internal
390
+ foundation: finish_to_start
391
+ reason: a complete acceptance presupposes the Given/When/Then structure
392
+ source_ref: planner.acceptance.complete
393
+ strength: critical
394
+ target_ref: planner.acceptance.given-when-then-structure
395
+ type: requires
396
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
397
+ - confidence: 1
398
+ constraint: mandatory
399
+ control: internal
400
+ foundation: finish_to_start
401
+ reason: a verifiable outcome includes its telemetry signal
402
+ source_ref: planner.acceptance.complete
403
+ strength: important
404
+ target_ref: planner.acceptance.signal-telemetry-naming
405
+ type: requires
406
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
407
+ - confidence: 1
408
+ constraint: mandatory
409
+ control: internal
410
+ foundation: start_to_start
411
+ reason: completeness and harness-type declaration are two required facets of the same acceptance
412
+ source_ref: planner.acceptance.complete
413
+ strength: important
414
+ target_ref: planner.acceptance.harness
415
+ type: runs_alongside
416
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
417
+ - confidence: 1
418
+ constraint: mandatory
419
+ control: internal
420
+ foundation: finish_to_start
421
+ reason: boundary declaration is meaningful once the runtime axis is set
422
+ source_ref: planner.acceptance.execution-kind
423
+ strength: important
424
+ target_ref: planner.acceptance.boundary-kind-vocabulary
425
+ type: enables
426
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
427
+ - confidence: 1
428
+ constraint: mandatory
429
+ control: internal
430
+ foundation: finish_to_start
431
+ reason: direct extraction supplies the context the abstract fields require
432
+ source_ref: planner.acceptance.extraction-no-inference
433
+ strength: important
434
+ target_ref: planner.acceptance.abstract-fields-required
435
+ type: enables
436
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
437
+ - confidence: 0.9
438
+ constraint: discretionary
439
+ control: internal
440
+ foundation: finish_to_start
441
+ reason: extracting (not inferring) the missing context is what makes the acceptance complete and faithful
442
+ source_ref: planner.acceptance.extraction-no-inference
443
+ strength: minor
444
+ target_ref: planner.acceptance.complete
445
+ type: enables
446
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
447
+ - confidence: 0.9
448
+ constraint: discretionary
449
+ control: internal
450
+ foundation: finish_to_start
451
+ reason: extracting (not inferring) the missing context is what makes the acceptance well-formed and faithful
452
+ source_ref: planner.acceptance.extraction-no-inference
453
+ strength: minor
454
+ target_ref: planner.acceptance.well-formed
455
+ type: enables
456
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
457
+ - confidence: 0.9
458
+ constraint: discretionary
459
+ control: internal
460
+ foundation: finish_to_start
461
+ reason: the generator prompts compose the required abstract acceptance fields
462
+ source_ref: planner.acceptance.generator-prompts
463
+ strength: minor
464
+ target_ref: planner.acceptance.abstract-fields-required
465
+ type: enables
466
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
467
+ - confidence: 1
468
+ constraint: mandatory
469
+ control: internal
470
+ foundation: finish_to_start
471
+ reason: "each section's required abstract narrative is part of the structure"
472
+ source_ref: planner.acceptance.given-when-then-structure
473
+ strength: important
474
+ target_ref: planner.acceptance.abstract-fields-required
475
+ type: requires
476
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
477
+ - confidence: 1
478
+ constraint: mandatory
479
+ control: internal
480
+ foundation: finish_to_start
481
+ reason: the when section is harness-specific and draws on the harness vocabulary
482
+ source_ref: planner.acceptance.given-when-then-structure
483
+ strength: important
484
+ target_ref: planner.acceptance.harness-vocabulary
485
+ type: requires
486
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
487
+ - confidence: 1
488
+ constraint: mandatory
489
+ control: internal
490
+ foundation: finish_to_start
491
+ reason: declaring a harness presupposes the harness vocabulary
492
+ source_ref: planner.acceptance.harness
493
+ strength: critical
494
+ target_ref: planner.acceptance.harness-vocabulary
495
+ type: requires
496
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
497
+ - confidence: 1
498
+ constraint: mandatory
499
+ control: internal
500
+ foundation: finish_to_start
501
+ reason: exercised_boundaries draws on the boundary-kind controlled vocabulary
502
+ source_ref: planner.acceptance.hermetic-fake-contract
503
+ strength: critical
504
+ target_ref: planner.acceptance.boundary-kind-vocabulary
505
+ type: requires
506
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
507
+ - confidence: 1
508
+ constraint: conditional
509
+ control: internal
510
+ foundation: finish_to_start
511
+ reason: the hermetic fake-contract is required only when execution_kind is hermetic_integration
512
+ source_ref: planner.acceptance.hermetic-fake-contract
513
+ strength: critical
514
+ target_ref: planner.acceptance.execution-kind
515
+ type: requires
516
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
517
+ - confidence: 1
518
+ constraint: discretionary
519
+ control: internal
520
+ foundation: start_to_start
521
+ reason: the legacy AC id and the acceptance URN are parallel identifiers
522
+ source_ref: planner.acceptance.id-pattern
523
+ strength: minor
524
+ target_ref: planner.acceptance.urn-generation
525
+ type: runs_alongside
526
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
527
+ - confidence: 1
528
+ constraint: mandatory
529
+ control: internal
530
+ foundation: finish_to_start
531
+ reason: the <=5 cap bounds structured acceptances per WMBT
532
+ source_ref: planner.acceptance.max-per-wmbt
533
+ strength: important
534
+ target_ref: planner.acceptance.given-when-then-structure
535
+ type: blocks
536
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
537
+ - confidence: 0.9
538
+ constraint: discretionary
539
+ control: internal
540
+ foundation: start_to_start
541
+ reason: the per-WMBT acceptance cap is a sizing constraint applied alongside acceptance completeness
542
+ source_ref: planner.acceptance.max-per-wmbt
543
+ strength: minor
544
+ target_ref: planner.acceptance.complete
545
+ type: runs_alongside
546
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
547
+ - confidence: 0.9
548
+ constraint: discretionary
549
+ control: internal
550
+ foundation: start_to_start
551
+ reason: the per-WMBT acceptance cap is a sizing constraint applied alongside acceptance well-formedness
552
+ source_ref: planner.acceptance.max-per-wmbt
553
+ strength: minor
554
+ target_ref: planner.acceptance.well-formed
555
+ type: runs_alongside
556
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
557
+ - confidence: 1
558
+ constraint: discretionary
559
+ control: internal
560
+ foundation: finish_to_start
561
+ reason: the route describes the layer flow the when/then exercises
562
+ source_ref: planner.acceptance.route-construction
563
+ strength: minor
564
+ target_ref: planner.acceptance.given-when-then-structure
565
+ type: follows
566
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
567
+ - confidence: 1
568
+ constraint: discretionary
569
+ control: internal
570
+ foundation: start_to_start
571
+ reason: the route sequence is built alongside the Given/When/Then structure
572
+ source_ref: planner.acceptance.route-construction
573
+ strength: minor
574
+ target_ref: planner.acceptance.given-when-then-structure
575
+ type: runs_alongside
576
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
577
+ - confidence: 1
578
+ constraint: mandatory
579
+ control: internal
580
+ foundation: finish_to_start
581
+ reason: telemetry signals are derived from the then/when sections
582
+ source_ref: planner.acceptance.signal-telemetry-naming
583
+ strength: important
584
+ target_ref: planner.acceptance.given-when-then-structure
585
+ type: follows
586
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
587
+ - confidence: 1
588
+ constraint: discretionary
589
+ control: external
590
+ foundation: start_to_start
591
+ reason: acceptance telemetry signals and wagon telemetry URNs share naming
592
+ source_ref: planner.acceptance.signal-telemetry-naming
593
+ strength: minor
594
+ target_ref: planner.wagon.telemetry-filesystem
595
+ type: runs_alongside
596
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
597
+ - confidence: 1
598
+ constraint: mandatory
599
+ control: internal
600
+ foundation: finish_to_start
601
+ reason: the acceptance URN embeds the UPPERCASE harness code from the vocabulary
602
+ source_ref: planner.acceptance.urn-generation
603
+ strength: important
604
+ target_ref: planner.acceptance.harness-vocabulary
605
+ type: requires
606
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
607
+ - confidence: 1
608
+ constraint: mandatory
609
+ control: internal
610
+ foundation: finish_to_start
611
+ reason: well-formedness includes the required abstract Gherkin fields
612
+ source_ref: planner.acceptance.well-formed
613
+ strength: important
614
+ target_ref: planner.acceptance.abstract-fields-required
615
+ type: requires
616
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
617
+ - confidence: 1
618
+ constraint: mandatory
619
+ control: internal
620
+ foundation: finish_to_start
621
+ reason: a well-formed acceptance presupposes the Given/When/Then structure
622
+ source_ref: planner.acceptance.well-formed
623
+ strength: critical
624
+ target_ref: planner.acceptance.given-when-then-structure
625
+ type: requires
626
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
627
+ - confidence: 1
628
+ constraint: mandatory
629
+ control: internal
630
+ foundation: finish_to_start
631
+ reason: a verifiable outcome includes its telemetry signal
632
+ source_ref: planner.acceptance.well-formed
633
+ strength: important
634
+ target_ref: planner.acceptance.signal-telemetry-naming
635
+ type: requires
636
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
637
+ - confidence: 1
638
+ constraint: mandatory
639
+ control: internal
640
+ foundation: start_to_start
641
+ reason: well-formedness and harness-type declaration are two required facets of the same acceptance
642
+ source_ref: planner.acceptance.well-formed
643
+ strength: important
644
+ target_ref: planner.acceptance.harness
645
+ type: runs_alongside
646
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
647
+ - confidence: 1
648
+ constraint: mandatory
649
+ control: internal
650
+ foundation: finish_to_start
651
+ reason: the per-type creation workflow is keyed on the six types
652
+ source_ref: planner.appendix.llm-guidelines
653
+ strength: important
654
+ target_ref: planner.appendix.types
655
+ type: requires
656
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
657
+ - confidence: 1
658
+ constraint: mandatory
659
+ control: internal
660
+ foundation: finish_to_start
661
+ reason: "the {type} filename segment must be one of the six appendix types"
662
+ source_ref: planner.appendix.naming-pattern
663
+ strength: important
664
+ target_ref: planner.appendix.types
665
+ type: requires
666
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
667
+ - confidence: 1
668
+ constraint: discretionary
669
+ control: internal
670
+ foundation: finish_to_start
671
+ reason: files in appendices/ are the named artifacts the pattern produces
672
+ source_ref: planner.appendix.storage
673
+ strength: minor
674
+ target_ref: planner.appendix.naming-pattern
675
+ type: follows
676
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
677
+ - confidence: 1
678
+ constraint: mandatory
679
+ control: internal
680
+ foundation: finish_to_start
681
+ reason: "the structure node's naming term decomposes into the naming-pattern node"
682
+ source_ref: planner.appendix.structure
683
+ strength: important
684
+ target_ref: planner.appendix.naming-pattern
685
+ type: enables
686
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
687
+ - confidence: 1
688
+ constraint: mandatory
689
+ control: internal
690
+ foundation: finish_to_start
691
+ reason: "the structure node's storage term decomposes into the storage node"
692
+ source_ref: planner.appendix.structure
693
+ strength: important
694
+ target_ref: planner.appendix.storage
695
+ type: enables
696
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
697
+ - confidence: 1
698
+ constraint: mandatory
699
+ control: internal
700
+ foundation: finish_to_start
701
+ reason: "the structure node's taxonomy term decomposes into the types node"
702
+ source_ref: planner.appendix.structure
703
+ strength: important
704
+ target_ref: planner.appendix.types
705
+ type: enables
706
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
707
+ - confidence: 0.9
708
+ constraint: discretionary
709
+ control: internal
710
+ foundation: start_to_start
711
+ reason: appendix structure and step sequencing are both plan-document structural rules
712
+ source_ref: planner.appendix.structure
713
+ strength: minor
714
+ target_ref: planner.steps.sequence
715
+ type: runs_alongside
716
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
717
+ - confidence: 1
718
+ constraint: mandatory
719
+ control: internal
720
+ foundation: finish_to_start
721
+ reason: anti-patterns enumerate the malformed names the grammar excludes
722
+ source_ref: planner.artifact-naming.anti-patterns
723
+ strength: important
724
+ target_ref: planner.artifact-naming.naming-pattern
725
+ type: blocks
726
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
727
+ - confidence: 1
728
+ constraint: discretionary
729
+ control: internal
730
+ foundation: start_to_start
731
+ reason: anti-patterns are the negative companion to the validation rules
732
+ source_ref: planner.artifact-naming.anti-patterns
733
+ strength: minor
734
+ target_ref: planner.artifact-naming.validation-rules
735
+ type: runs_alongside
736
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
737
+ - confidence: 1
738
+ constraint: mandatory
739
+ control: internal
740
+ foundation: finish_to_start
741
+ reason: cardinality is read from the aspect position in the pattern
742
+ source_ref: planner.artifact-naming.cardinality-from-aspect
743
+ strength: important
744
+ target_ref: planner.artifact-naming.naming-pattern
745
+ type: requires
746
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
747
+ - confidence: 1
748
+ constraint: mandatory
749
+ control: internal
750
+ foundation: finish_to_start
751
+ reason: colon usage is defined by the separator semantics
752
+ source_ref: planner.artifact-naming.colon-for-hierarchy
753
+ strength: important
754
+ target_ref: planner.artifact-naming.separator-semantics
755
+ type: requires
756
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
757
+ - confidence: 1
758
+ constraint: mandatory
759
+ control: internal
760
+ foundation: finish_to_start
761
+ reason: name-to-path mapping splits the grammar segments
762
+ source_ref: planner.artifact-naming.contract-file-mapping
763
+ strength: important
764
+ target_ref: planner.artifact-naming.naming-pattern
765
+ type: requires
766
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
767
+ - confidence: 1
768
+ constraint: mandatory
769
+ control: internal
770
+ foundation: start_to_start
771
+ reason: the contract-file formula is the file half of the logical-physical mapping
772
+ source_ref: planner.artifact-naming.contract-file-mapping
773
+ strength: important
774
+ target_ref: planner.artifact-naming.logical-physical-mapping
775
+ type: runs_alongside
776
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
777
+ - confidence: 1
778
+ constraint: discretionary
779
+ control: internal
780
+ foundation: start_to_start
781
+ reason: depth limits qualify the colon/dot separators
782
+ source_ref: planner.artifact-naming.depth-guidelines
783
+ strength: minor
784
+ target_ref: planner.artifact-naming.separator-semantics
785
+ type: runs_alongside
786
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
787
+ - confidence: 1
788
+ constraint: mandatory
789
+ control: internal
790
+ foundation: finish_to_start
791
+ reason: dot usage is defined by the separator semantics
792
+ source_ref: planner.artifact-naming.dot-for-variant
793
+ strength: important
794
+ target_ref: planner.artifact-naming.separator-semantics
795
+ type: requires
796
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
797
+ - confidence: 1
798
+ constraint: discretionary
799
+ control: internal
800
+ foundation: finish_to_start
801
+ reason: physical-form resolution extends the base path algorithm
802
+ source_ref: planner.artifact-naming.logical-physical-mapping
803
+ strength: minor
804
+ target_ref: planner.artifact-naming.contract-file-mapping
805
+ type: follows
806
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
807
+ - confidence: 1
808
+ constraint: mandatory
809
+ control: internal
810
+ foundation: finish_to_start
811
+ reason: the three physical forms are chosen by aspect cardinality
812
+ source_ref: planner.artifact-naming.logical-physical-mapping
813
+ strength: important
814
+ target_ref: planner.artifact-naming.cardinality-from-aspect
815
+ type: requires
816
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
817
+ - confidence: 1
818
+ constraint: mandatory
819
+ control: internal
820
+ foundation: finish_to_start
821
+ reason: the mapping splits the name produced by the pattern
822
+ source_ref: planner.artifact-naming.logical-physical-mapping
823
+ strength: important
824
+ target_ref: planner.artifact-naming.naming-pattern
825
+ type: requires
826
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
827
+ - confidence: 1
828
+ constraint: discretionary
829
+ control: internal
830
+ foundation: finish_to_start
831
+ reason: migration retargets legacy names onto the current pattern
832
+ source_ref: planner.artifact-naming.migration-guide
833
+ strength: minor
834
+ target_ref: planner.artifact-naming.naming-pattern
835
+ type: follows
836
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
837
+ - confidence: 1
838
+ constraint: mandatory
839
+ control: internal
840
+ foundation: finish_to_start
841
+ reason: the pattern composes hierarchy (colon) and variant (dot) separators
842
+ source_ref: planner.artifact-naming.naming-pattern
843
+ strength: critical
844
+ target_ref: planner.artifact-naming.separator-semantics
845
+ type: requires
846
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
847
+ - confidence: 1
848
+ constraint: mandatory
849
+ control: internal
850
+ foundation: finish_to_start
851
+ reason: the required theme component is drawn from the theme taxonomy
852
+ source_ref: planner.artifact-naming.naming-pattern
853
+ strength: important
854
+ target_ref: planner.artifact-naming.theme-taxonomy
855
+ type: requires
856
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
857
+ - confidence: 1
858
+ constraint: mandatory
859
+ control: internal
860
+ foundation: finish_to_start
861
+ reason: a contract path can only mirror an identity that is a valid theme-first identity
862
+ source_ref: planner.artifact-naming.path-mirrors-identity
863
+ strength: important
864
+ target_ref: planner.artifact-naming.theme-first-identity
865
+ type: requires
866
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
867
+ - confidence: 1
868
+ constraint: mandatory
869
+ control: internal
870
+ foundation: finish_to_start
871
+ reason: stable URN-based names follow the naming pattern grammar
872
+ source_ref: planner.artifact-naming.planner-artifacts-use-stable
873
+ strength: important
874
+ target_ref: planner.artifact-naming.naming-pattern
875
+ type: requires
876
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
877
+ - confidence: 1
878
+ constraint: mandatory
879
+ control: internal
880
+ foundation: finish_to_start
881
+ reason: correct plurals make the plural-aspect signal reliable
882
+ source_ref: planner.artifact-naming.pluralization
883
+ strength: important
884
+ target_ref: planner.artifact-naming.cardinality-from-aspect
885
+ type: enables
886
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
887
+ - confidence: 1
888
+ constraint: discretionary
889
+ control: internal
890
+ foundation: start_to_start
891
+ reason: pluralization of the aspect is how cardinality is expressed
892
+ source_ref: planner.artifact-naming.pluralization
893
+ strength: important
894
+ target_ref: planner.artifact-naming.cardinality-from-aspect
895
+ type: runs_alongside
896
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
897
+ - confidence: 1
898
+ constraint: mandatory
899
+ control: internal
900
+ foundation: finish_to_start
901
+ reason: $id is the bare grammar-conformant name
902
+ source_ref: planner.artifact-naming.schema-identifier
903
+ strength: important
904
+ target_ref: planner.artifact-naming.naming-pattern
905
+ type: requires
906
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
907
+ - confidence: 1
908
+ constraint: mandatory
909
+ control: internal
910
+ foundation: start_to_start
911
+ reason: the $id and the URN reference share the artifact identity
912
+ source_ref: planner.artifact-naming.schema-identifier
913
+ strength: important
914
+ target_ref: planner.artifact-naming.urn-structure
915
+ type: runs_alongside
916
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
917
+ - confidence: 1
918
+ constraint: mandatory
919
+ control: internal
920
+ foundation: start_to_start
921
+ reason: the theme-first identity rule resolves its allowed themes from the same canonical theme map
922
+ source_ref: planner.artifact-naming.theme-first-identity
923
+ strength: important
924
+ target_ref: planner.theme.must-be-canonical
925
+ type: requires
926
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
927
+ - confidence: 1
928
+ constraint: mandatory
929
+ control: internal
930
+ foundation: finish_to_start
931
+ reason: the URN exactly mirrors the artifact name
932
+ source_ref: planner.artifact-naming.urn-structure
933
+ strength: important
934
+ target_ref: planner.artifact-naming.naming-pattern
935
+ type: requires
936
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
937
+ - confidence: 1
938
+ constraint: mandatory
939
+ control: internal
940
+ foundation: finish_to_start
941
+ reason: validation enforces the naming pattern
942
+ source_ref: planner.artifact-naming.validation-rules
943
+ strength: important
944
+ target_ref: planner.artifact-naming.naming-pattern
945
+ type: requires
946
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
947
+ - confidence: 1
948
+ constraint: mandatory
949
+ control: internal
950
+ foundation: start_to_start
951
+ reason: "the corpus drift report judges names against the same leading-verb lexicon the authoring gates use, so the two halves cannot disagree about what a verb is"
952
+ source_ref: planner.artifact-naming.verb-object-corpus-drift
953
+ strength: important
954
+ target_ref: planner.feature.verb-selection-by-artifact-type
955
+ type: requires
956
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
957
+ - confidence: 1
958
+ constraint: mandatory
959
+ control: internal
960
+ foundation: finish_to_finish
961
+ reason: identity mirrors physical contract file
962
+ source_ref: planner.artifact.definition
963
+ strength: important
964
+ target_ref: planner.artifact-naming.contract-file-mapping
965
+ type: requires
966
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
967
+ - confidence: 1
968
+ constraint: mandatory
969
+ control: internal
970
+ foundation: finish_to_finish
971
+ reason: identity follows theme hierarchy aspect variant
972
+ source_ref: planner.artifact.definition
973
+ strength: critical
974
+ target_ref: planner.artifact-naming.naming-pattern
975
+ type: requires
976
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
977
+ - confidence: 1
978
+ constraint: mandatory
979
+ control: internal
980
+ foundation: finish_to_finish
981
+ reason: schema-backed artifacts carry a schema identifier
982
+ source_ref: planner.artifact.definition
983
+ strength: important
984
+ target_ref: planner.artifact-naming.schema-identifier
985
+ type: requires
986
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
987
+ - confidence: 1
988
+ constraint: mandatory
989
+ control: internal
990
+ foundation: finish_to_finish
991
+ reason: colon is hierarchy dot is variant
992
+ source_ref: planner.artifact.definition
993
+ strength: important
994
+ target_ref: planner.artifact-naming.separator-semantics
995
+ type: requires
996
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
997
+ - confidence: 1
998
+ constraint: mandatory
999
+ control: internal
1000
+ foundation: finish_to_finish
1001
+ reason: top segment is a canonical theme
1002
+ source_ref: planner.artifact.definition
1003
+ strength: important
1004
+ target_ref: planner.artifact-naming.theme-taxonomy
1005
+ type: requires
1006
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1007
+ - confidence: 1
1008
+ constraint: mandatory
1009
+ control: internal
1010
+ foundation: finish_to_finish
1011
+ reason: an artifact has a structured URN
1012
+ source_ref: planner.artifact.definition
1013
+ strength: critical
1014
+ target_ref: planner.artifact-naming.urn-structure
1015
+ type: requires
1016
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1017
+ - confidence: 1
1018
+ constraint: mandatory
1019
+ control: internal
1020
+ foundation: finish_to_finish
1021
+ reason: names must pass the naming validation rules
1022
+ source_ref: planner.artifact.definition
1023
+ strength: important
1024
+ target_ref: planner.artifact-naming.validation-rules
1025
+ type: requires
1026
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1027
+ - confidence: 1
1028
+ constraint: mandatory
1029
+ control: internal
1030
+ foundation: finish_to_start
1031
+ reason: "component names are derived from artifact resource names, so the artifact naming pattern is the input to component derivation"
1032
+ source_ref: planner.component.artifact-derivation
1033
+ strength: important
1034
+ target_ref: planner.artifact-naming.naming-pattern
1035
+ type: requires
1036
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1037
+ - confidence: 1
1038
+ constraint: discretionary
1039
+ control: internal
1040
+ foundation: start_to_start
1041
+ reason: a single business capability and the at-most-5-methods ceiling are two facets of keeping a component small and focused
1042
+ source_ref: planner.component.business-focus
1043
+ strength: minor
1044
+ target_ref: planner.component.method-limit
1045
+ type: runs_alongside
1046
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1047
+ - confidence: 1
1048
+ constraint: discretionary
1049
+ control: internal
1050
+ foundation: finish_to_start
1051
+ reason: exceeding 8 components signals the feature should be split
1052
+ source_ref: planner.component.count-limit
1053
+ strength: minor
1054
+ target_ref: planner.feature.shape
1055
+ type: follows
1056
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1057
+ - confidence: 1
1058
+ constraint: mandatory
1059
+ control: internal
1060
+ foundation: finish_to_start
1061
+ reason: "components are derived from the feature's ioSeeds and WMBTs"
1062
+ source_ref: planner.component.derivation
1063
+ strength: important
1064
+ target_ref: planner.feature.shape
1065
+ type: requires
1066
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1067
+ - confidence: 1
1068
+ constraint: mandatory
1069
+ control: internal
1070
+ foundation: finish_to_start
1071
+ reason: "component events must be a subset of the feature's ioSeeds"
1072
+ source_ref: planner.component.io-alignment
1073
+ strength: important
1074
+ target_ref: planner.feature.shape
1075
+ type: requires
1076
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1077
+ - confidence: 1
1078
+ constraint: mandatory
1079
+ control: internal
1080
+ foundation: finish_to_start
1081
+ reason: exactly-one-layer can only be checked once a layer has been assigned from the artifact type
1082
+ source_ref: planner.component.layer-consistency
1083
+ strength: important
1084
+ target_ref: planner.component.layer-assignment
1085
+ type: requires
1086
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1087
+ - confidence: 1
1088
+ constraint: mandatory
1089
+ control: internal
1090
+ foundation: finish_to_start
1091
+ reason: "a generated component's structure is keyed by its component URN"
1092
+ source_ref: planner.component.structure
1093
+ strength: important
1094
+ target_ref: planner.component.urn
1095
+ type: requires
1096
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1097
+ - confidence: 1
1098
+ constraint: mandatory
1099
+ control: internal
1100
+ foundation: finish_to_start
1101
+ reason: "the {feature} URN segment must resolve to an owning feature"
1102
+ source_ref: planner.component.urn
1103
+ strength: critical
1104
+ target_ref: planner.feature.shape
1105
+ type: requires
1106
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1107
+ - confidence: 1
1108
+ constraint: mandatory
1109
+ control: internal
1110
+ foundation: finish_to_start
1111
+ reason: "the {wagon} URN segment must resolve to a real wagon"
1112
+ source_ref: planner.component.urn
1113
+ strength: critical
1114
+ target_ref: planner.wagon.urn
1115
+ type: requires
1116
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1117
+ - confidence: 1
1118
+ constraint: mandatory
1119
+ control: internal
1120
+ foundation: finish_to_start
1121
+ reason: "contract coherence is checked over the produce/consume artifact shape it constrains (#1332)"
1122
+ source_ref: planner.contract.registry-coherence
1123
+ strength: important
1124
+ target_ref: planner.wagon.produce-consume-artifacts
1125
+ type: requires
1126
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1127
+ - confidence: 1
1128
+ constraint: mandatory
1129
+ control: internal
1130
+ foundation: start_to_start
1131
+ reason: "two halves of convention-node integrity: the orphan rule holds every node reachable from the relationship graph, and this one holds the prose inside those nodes followable — a node can be perfectly connected and still send its reader to a file that is not there"
1132
+ source_ref: planner.convention.remedy-must-be-followable
1133
+ strength: important
1134
+ target_ref: planner.relationship.no-orphan-nodes
1135
+ type: runs_alongside
1136
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1137
+ - confidence: 1
1138
+ constraint: discretionary
1139
+ control: internal
1140
+ foundation: start_to_start
1141
+ reason: the same bidirectional-coverage invariant at the train-wagon and wagon-feature levels
1142
+ source_ref: planner.coverage.bidirectional-coverage-between-trains
1143
+ strength: minor
1144
+ target_ref: planner.coverage.bidirectional-coverage-between-wagons
1145
+ type: runs_alongside
1146
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1147
+ - confidence: 1
1148
+ constraint: mandatory
1149
+ control: internal
1150
+ foundation: finish_to_start
1151
+ reason: wagon-feature coverage sits one level below train-wagon coverage
1152
+ source_ref: planner.coverage.bidirectional-coverage-between-wagons
1153
+ strength: important
1154
+ target_ref: planner.coverage.bidirectional-coverage-between-trains
1155
+ type: follows
1156
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1157
+ - confidence: 1
1158
+ constraint: mandatory
1159
+ control: external
1160
+ foundation: finish_to_start
1161
+ reason: wagon-feature coverage presupposes well-formed features
1162
+ source_ref: planner.coverage.bidirectional-coverage-between-wagons
1163
+ strength: important
1164
+ target_ref: planner.feature.shape
1165
+ type: requires
1166
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1167
+ - confidence: 1
1168
+ constraint: mandatory
1169
+ control: external
1170
+ foundation: finish_to_start
1171
+ reason: wagon-feature coverage reads the wagon features manifest
1172
+ source_ref: planner.coverage.bidirectional-coverage-between-wagons
1173
+ strength: important
1174
+ target_ref: planner.wagon.features
1175
+ type: requires
1176
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1177
+ - confidence: 1
1178
+ constraint: mandatory
1179
+ control: internal
1180
+ foundation: start_to_start
1181
+ reason: the graph aggregates the train-wagon coverage validator
1182
+ source_ref: planner.coverage.coverage-graph
1183
+ strength: minor
1184
+ target_ref: planner.coverage.bidirectional-coverage-between-trains
1185
+ type: runs_alongside
1186
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1187
+ - confidence: 1
1188
+ constraint: mandatory
1189
+ control: internal
1190
+ foundation: start_to_start
1191
+ reason: the graph aggregates the wagon-feature coverage validators
1192
+ source_ref: planner.coverage.coverage-graph
1193
+ strength: minor
1194
+ target_ref: planner.coverage.bidirectional-coverage-between-wagons
1195
+ type: runs_alongside
1196
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1197
+ - confidence: 1
1198
+ constraint: mandatory
1199
+ control: internal
1200
+ foundation: start_to_start
1201
+ reason: the graph aggregates the wmbt-feature coverage validator
1202
+ source_ref: planner.coverage.coverage-graph
1203
+ strength: minor
1204
+ target_ref: planner.coverage.every-wmbt-must-be
1205
+ type: runs_alongside
1206
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1207
+ - confidence: 1
1208
+ constraint: mandatory
1209
+ control: internal
1210
+ foundation: start_to_start
1211
+ reason: the graph aggregates the wmbt-acceptance coverage validator
1212
+ source_ref: planner.coverage.coverage-graph
1213
+ strength: minor
1214
+ target_ref: planner.coverage.every-wmbt-must-have
1215
+ type: runs_alongside
1216
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1217
+ - confidence: 1
1218
+ constraint: mandatory
1219
+ control: internal
1220
+ foundation: finish_to_start
1221
+ reason: wmbt-feature coverage sits below wagon-feature coverage
1222
+ source_ref: planner.coverage.every-wmbt-must-be
1223
+ strength: important
1224
+ target_ref: planner.coverage.bidirectional-coverage-between-wagons
1225
+ type: follows
1226
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1227
+ - confidence: 1
1228
+ constraint: mandatory
1229
+ control: internal
1230
+ foundation: finish_to_start
1231
+ reason: the every-WMBT-referenced-by-a-feature check presupposes well-formed features
1232
+ source_ref: planner.coverage.every-wmbt-must-be
1233
+ strength: important
1234
+ target_ref: planner.feature.shape
1235
+ type: requires
1236
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1237
+ - confidence: 1
1238
+ constraint: mandatory
1239
+ control: internal
1240
+ foundation: finish_to_start
1241
+ reason: wmbt-acceptance coverage sits below wmbt-feature coverage
1242
+ source_ref: planner.coverage.every-wmbt-must-have
1243
+ strength: important
1244
+ target_ref: planner.coverage.every-wmbt-must-be
1245
+ type: follows
1246
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1247
+ - confidence: 1
1248
+ constraint: mandatory
1249
+ control: internal
1250
+ foundation: finish_to_start
1251
+ reason: "a WMBT's required acceptance only counts if acceptances are complete (G/W/T + verifiable outcome)"
1252
+ source_ref: planner.coverage.every-wmbt-must-have
1253
+ strength: important
1254
+ target_ref: planner.acceptance.complete
1255
+ type: requires
1256
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1257
+ - confidence: 1
1258
+ constraint: mandatory
1259
+ control: internal
1260
+ foundation: finish_to_start
1261
+ reason: "a WMBT's required acceptance only counts if acceptances are well-formed (G/W/T + verifiable outcome)"
1262
+ source_ref: planner.coverage.every-wmbt-must-have
1263
+ strength: important
1264
+ target_ref: planner.acceptance.well-formed
1265
+ type: requires
1266
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1267
+ - confidence: 1
1268
+ constraint: mandatory
1269
+ control: internal
1270
+ foundation: finish_to_start
1271
+ reason: "the per-WMBT acceptance check presupposes a well-shaped WMBT (id, statement, proving artifacts)"
1272
+ source_ref: planner.coverage.every-wmbt-must-have
1273
+ strength: important
1274
+ target_ref: planner.wmbt.shape
1275
+ type: requires
1276
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1277
+ - confidence: 1
1278
+ constraint: discretionary
1279
+ control: internal
1280
+ foundation: finish_to_start
1281
+ reason: allow-lists and status:draft exempt artifacts from the strict acceptance rule
1282
+ source_ref: planner.coverage.exception-handling
1283
+ strength: important
1284
+ target_ref: planner.coverage.every-wmbt-must-have
1285
+ type: relieves
1286
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1287
+ - confidence: 1
1288
+ constraint: discretionary
1289
+ control: internal
1290
+ foundation: start_to_start
1291
+ reason: "the given defaults seed each harness template's given block"
1292
+ source_ref: planner.criteria.defaults
1293
+ strength: minor
1294
+ target_ref: planner.criteria.harness-templates
1295
+ type: runs_alongside
1296
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1297
+ - confidence: 1
1298
+ constraint: discretionary
1299
+ control: internal
1300
+ foundation: finish_to_start
1301
+ reason: a harness template given specializes the default given
1302
+ source_ref: planner.criteria.harness-templates
1303
+ strength: minor
1304
+ target_ref: planner.criteria.defaults
1305
+ type: follows
1306
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1307
+ - confidence: 1
1308
+ constraint: discretionary
1309
+ control: internal
1310
+ foundation: start_to_start
1311
+ reason: lowercase harness keys align with the authoritative harness-code map
1312
+ source_ref: planner.criteria.harness-templates
1313
+ strength: minor
1314
+ target_ref: planner.acceptance.harness
1315
+ type: runs_alongside
1316
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1317
+ - confidence: 1
1318
+ constraint: mandatory
1319
+ control: external
1320
+ foundation: start_to_start
1321
+ reason: criteria templates and the acceptance harness vocabulary share the harness set
1322
+ source_ref: planner.criteria.harness-templates
1323
+ strength: important
1324
+ target_ref: planner.acceptance.harness-vocabulary
1325
+ type: runs_alongside
1326
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1327
+ - confidence: 1
1328
+ constraint: discretionary
1329
+ control: internal
1330
+ foundation: start_to_start
1331
+ reason: each harness template declares the layers it sequences
1332
+ source_ref: planner.criteria.harness-templates
1333
+ strength: minor
1334
+ target_ref: planner.criteria.sequence-routing
1335
+ type: runs_alongside
1336
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1337
+ - confidence: 1
1338
+ constraint: mandatory
1339
+ control: internal
1340
+ foundation: finish_to_start
1341
+ reason: measurable expected_outcome resolves via the dimension->metric map
1342
+ source_ref: planner.criteria.metric-mapping
1343
+ strength: important
1344
+ target_ref: planner.criteria.shape
1345
+ type: enables
1346
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1347
+ - confidence: 1
1348
+ constraint: mandatory
1349
+ control: external
1350
+ foundation: finish_to_start
1351
+ reason: the metric is selected from the WMBT dimension + direction
1352
+ source_ref: planner.criteria.metric-mapping
1353
+ strength: important
1354
+ target_ref: planner.wmbt.dimension-selection
1355
+ type: requires
1356
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1357
+ - confidence: 1
1358
+ constraint: mandatory
1359
+ control: internal
1360
+ foundation: finish_to_start
1361
+ reason: plane assignment from keywords feeds plane->sequence routing
1362
+ source_ref: planner.criteria.plane-keywords
1363
+ strength: important
1364
+ target_ref: planner.criteria.sequence-routing
1365
+ type: enables
1366
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1367
+ - confidence: 1
1368
+ constraint: discretionary
1369
+ control: external
1370
+ foundation: start_to_start
1371
+ reason: both route acceptances to a plane via keyword cues
1372
+ source_ref: planner.criteria.plane-keywords
1373
+ strength: minor
1374
+ target_ref: planner.acceptance.plane-keywords
1375
+ type: runs_alongside
1376
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1377
+ - confidence: 1
1378
+ constraint: mandatory
1379
+ control: internal
1380
+ foundation: finish_to_start
1381
+ reason: the layer sequence is selected via the plane keywords
1382
+ source_ref: planner.criteria.sequence-routing
1383
+ strength: important
1384
+ target_ref: planner.criteria.plane-keywords
1385
+ type: requires
1386
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1387
+ - confidence: 1
1388
+ constraint: discretionary
1389
+ control: internal
1390
+ foundation: start_to_start
1391
+ reason: the routed sequence lands the harness when at the right layer
1392
+ source_ref: planner.criteria.sequence-routing
1393
+ strength: minor
1394
+ target_ref: planner.criteria.harness-templates
1395
+ type: runs_alongside
1396
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1397
+ - confidence: 1
1398
+ constraint: mandatory
1399
+ control: internal
1400
+ foundation: finish_to_start
1401
+ reason: every criteria entry inherits the default given scaffold
1402
+ source_ref: planner.criteria.shape
1403
+ strength: important
1404
+ target_ref: planner.criteria.defaults
1405
+ type: requires
1406
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1407
+ - confidence: 1
1408
+ constraint: mandatory
1409
+ control: internal
1410
+ foundation: finish_to_start
1411
+ reason: the harness field selects a catalog template
1412
+ source_ref: planner.criteria.shape
1413
+ strength: important
1414
+ target_ref: planner.criteria.harness-templates
1415
+ type: requires
1416
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1417
+ - confidence: 1
1418
+ constraint: discretionary
1419
+ control: external
1420
+ foundation: start_to_start
1421
+ reason: criteria are the structured form of an acceptance
1422
+ source_ref: planner.criteria.shape
1423
+ strength: minor
1424
+ target_ref: planner.acceptance.complete
1425
+ type: runs_alongside
1426
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1427
+ - confidence: 1
1428
+ constraint: discretionary
1429
+ control: external
1430
+ foundation: start_to_start
1431
+ reason: criteria are the structured form of an acceptance
1432
+ source_ref: planner.criteria.shape
1433
+ strength: minor
1434
+ target_ref: planner.acceptance.well-formed
1435
+ type: runs_alongside
1436
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1437
+ - confidence: 1
1438
+ constraint: discretionary
1439
+ control: internal
1440
+ foundation: start_to_start
1441
+ reason: the criteria shape references the chosen harness
1442
+ source_ref: planner.criteria.shape
1443
+ strength: minor
1444
+ target_ref: planner.criteria.harness-templates
1445
+ type: runs_alongside
1446
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1447
+ - confidence: 1
1448
+ reason: the canonical steps are decoded into the journey
1449
+ source_ref: planner.decomposition.canonical-steps
1450
+ target_ref: planner.decomposition.train-journey
1451
+ type: enables
1452
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1453
+ - confidence: 1
1454
+ reason: unresolved document-trouble must block deciding from a partial reading
1455
+ source_ref: planner.decomposition.document-trouble-obligation
1456
+ target_ref: planner.decomposition.keep-pivot-kill
1457
+ type: blocks
1458
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1459
+ - confidence: 1
1460
+ reason: reframe sources to user-facing jobs before writing the job statement
1461
+ source_ref: planner.decomposition.domain-vs-technology
1462
+ target_ref: planner.decomposition.jtbd-vs-odi-grammar
1463
+ type: enables
1464
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1465
+ - confidence: 1
1466
+ reason: "with both grammars in hand, candidates can be decided"
1467
+ source_ref: planner.decomposition.jtbd-vs-odi-grammar
1468
+ target_ref: planner.decomposition.keep-pivot-kill
1469
+ type: enables
1470
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1471
+ - confidence: 1
1472
+ reason: "Ratify names the granularity rungs a decomposition never descended, so the keep/pivot/kill ladder is reported rather than silently left dangling"
1473
+ source_ref: planner.decomposition.keep-pivot-kill
1474
+ target_ref: planner.plan.granularity-completeness
1475
+ type: enables
1476
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1477
+ - confidence: 1
1478
+ reason: keep/pivot/kill is applied across the canonical job steps
1479
+ source_ref: planner.decomposition.keep-pivot-kill
1480
+ target_ref: planner.decomposition.canonical-steps
1481
+ type: requires
1482
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1483
+ - confidence: 1
1484
+ reason: scope the slice per invocation before framing the main job
1485
+ source_ref: planner.decomposition.local-scope
1486
+ target_ref: planner.decomposition.jtbd-vs-odi-grammar
1487
+ type: enables
1488
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1489
+ - confidence: 1
1490
+ reason: operator prose is normalized into a keep/pivot/kill decision
1491
+ source_ref: planner.decomposition.natural-language-normalization
1492
+ target_ref: planner.decomposition.keep-pivot-kill
1493
+ type: enables
1494
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1495
+ - confidence: 1
1496
+ reason: sibling/nominal trains are decoded after wagons and WMBTs are kept
1497
+ source_ref: planner.decomposition.train-journey
1498
+ target_ref: planner.decomposition.keep-pivot-kill
1499
+ type: follows
1500
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1501
+ - confidence: 1
1502
+ reason: "a wagon's rationale is recorded once the wagon is kept"
1503
+ source_ref: planner.decomposition.wagon-rationale
1504
+ target_ref: planner.decomposition.keep-pivot-kill
1505
+ type: follows
1506
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1507
+ - confidence: 1
1508
+ constraint: mandatory
1509
+ control: internal
1510
+ foundation: finish_to_finish
1511
+ reason: the anchor convention requires the artifact definition anchor to exist
1512
+ source_ref: planner.definition.anchor-required
1513
+ strength: critical
1514
+ target_ref: planner.artifact.definition
1515
+ type: requires
1516
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1517
+ - confidence: 1
1518
+ constraint: mandatory
1519
+ control: internal
1520
+ foundation: finish_to_finish
1521
+ reason: the anchor convention requires the feature definition anchor to exist
1522
+ source_ref: planner.definition.anchor-required
1523
+ strength: critical
1524
+ target_ref: planner.feature.definition
1525
+ type: requires
1526
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1527
+ - confidence: 1
1528
+ constraint: mandatory
1529
+ control: internal
1530
+ foundation: finish_to_finish
1531
+ reason: the anchor convention requires the interlocking definition anchor to exist
1532
+ source_ref: planner.definition.anchor-required
1533
+ strength: critical
1534
+ target_ref: planner.interlocking.definition
1535
+ type: requires
1536
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1537
+ - confidence: 1
1538
+ constraint: mandatory
1539
+ control: internal
1540
+ foundation: finish_to_finish
1541
+ reason: the anchor convention requires the theme definition anchor to exist
1542
+ source_ref: planner.definition.anchor-required
1543
+ strength: critical
1544
+ target_ref: planner.theme.definition
1545
+ type: requires
1546
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1547
+ - confidence: 1
1548
+ constraint: mandatory
1549
+ control: internal
1550
+ foundation: finish_to_finish
1551
+ reason: the anchor convention requires the train definition anchor to exist
1552
+ source_ref: planner.definition.anchor-required
1553
+ strength: critical
1554
+ target_ref: planner.train.definition
1555
+ type: requires
1556
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1557
+ - confidence: 1
1558
+ constraint: mandatory
1559
+ control: internal
1560
+ foundation: finish_to_finish
1561
+ reason: the anchor convention requires the wagon definition anchor to exist
1562
+ source_ref: planner.definition.anchor-required
1563
+ strength: critical
1564
+ target_ref: planner.wagon.definition
1565
+ type: requires
1566
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1567
+ - confidence: 1
1568
+ constraint: mandatory
1569
+ control: internal
1570
+ foundation: finish_to_finish
1571
+ reason: the anchor convention requires the wmbt definition anchor to exist
1572
+ source_ref: planner.definition.anchor-required
1573
+ strength: critical
1574
+ target_ref: planner.wmbt.definition
1575
+ type: requires
1576
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1577
+ - confidence: 1
1578
+ constraint: mandatory
1579
+ control: internal
1580
+ foundation: finish_to_start
1581
+ reason: seeds come from wagon produce/consume artifact names
1582
+ source_ref: planner.feature.artifact-seeded-naming
1583
+ strength: important
1584
+ target_ref: planner.artifact-naming.planner-artifacts-use-stable
1585
+ type: requires
1586
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1587
+ - confidence: 1
1588
+ constraint: mandatory
1589
+ control: internal
1590
+ foundation: finish_to_start
1591
+ reason: seeding a name needs the type-specific verb list
1592
+ source_ref: planner.feature.artifact-seeded-naming
1593
+ strength: important
1594
+ target_ref: planner.feature.verb-selection-by-artifact-type
1595
+ type: requires
1596
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1597
+ - confidence: 1
1598
+ constraint: mandatory
1599
+ control: internal
1600
+ foundation: finish_to_finish
1601
+ reason: a feature closes a feedback loop
1602
+ source_ref: planner.feature.definition
1603
+ strength: important
1604
+ target_ref: planner.feature.feedback-loop-close-the-loop
1605
+ type: requires
1606
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1607
+ - confidence: 1
1608
+ constraint: mandatory
1609
+ control: internal
1610
+ foundation: finish_to_finish
1611
+ reason: a feature stays within size hard-limits
1612
+ source_ref: planner.feature.definition
1613
+ strength: important
1614
+ target_ref: planner.feature.hard-limits
1615
+ type: requires
1616
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1617
+ - confidence: 1
1618
+ constraint: mandatory
1619
+ control: internal
1620
+ foundation: finish_to_finish
1621
+ reason: a feature declares urn status acceptance
1622
+ source_ref: planner.feature.definition
1623
+ strength: critical
1624
+ target_ref: planner.feature.shape
1625
+ type: requires
1626
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1627
+ - confidence: 1
1628
+ constraint: mandatory
1629
+ control: internal
1630
+ foundation: finish_to_finish
1631
+ reason: a feature stays within the size-max rule
1632
+ source_ref: planner.feature.definition
1633
+ strength: important
1634
+ target_ref: planner.feature.size-max-rule
1635
+ type: requires
1636
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1637
+ - confidence: 1
1638
+ constraint: mandatory
1639
+ control: internal
1640
+ foundation: finish_to_finish
1641
+ reason: a feature belongs to exactly one wagon
1642
+ source_ref: planner.feature.definition
1643
+ strength: critical
1644
+ target_ref: planner.feature.wagon-link
1645
+ type: requires
1646
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1647
+ - confidence: 1
1648
+ constraint: conditional
1649
+ control: internal
1650
+ foundation: finish_to_start
1651
+ reason: the close-the-loop rule fires only when kind is feedback-loop
1652
+ source_ref: planner.feature.feedback-loop-close-the-loop
1653
+ strength: important
1654
+ target_ref: planner.feature.feedback-loop-kind
1655
+ type: requires
1656
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1657
+ - confidence: 1
1658
+ constraint: mandatory
1659
+ control: internal
1660
+ foundation: finish_to_start
1661
+ reason: close-the-loop lives in a SMOKE acceptance on the feature WMBTs
1662
+ source_ref: planner.feature.feedback-loop-kind
1663
+ strength: important
1664
+ target_ref: planner.wmbt.must-have-smoke-acceptance
1665
+ type: requires
1666
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1667
+ - confidence: 1
1668
+ constraint: discretionary
1669
+ control: internal
1670
+ foundation: finish_to_start
1671
+ reason: the inline marker suppresses the close-the-loop rule for docs-only features
1672
+ source_ref: planner.feature.feedback-loop-suppression
1673
+ strength: minor
1674
+ target_ref: planner.feature.feedback-loop-close-the-loop
1675
+ type: relieves
1676
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1677
+ - confidence: 1
1678
+ constraint: discretionary
1679
+ control: internal
1680
+ foundation: start_to_start
1681
+ reason: the dated inline suppression marker is the sanctioned hatch that relieves the close-the-loop obligation until its UNTIL date
1682
+ source_ref: planner.feature.feedback-loop-suppression
1683
+ strength: important
1684
+ target_ref: planner.smoke.feedback-loop-close-the-loop
1685
+ type: relieves
1686
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1687
+ - confidence: 1
1688
+ constraint: mandatory
1689
+ control: internal
1690
+ foundation: finish_to_start
1691
+ reason: weights are keyed by the component types in the catalog
1692
+ source_ref: planner.feature.footprint-scoring
1693
+ strength: important
1694
+ target_ref: planner.component.type-catalog
1695
+ type: requires
1696
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1697
+ - confidence: 1
1698
+ constraint: discretionary
1699
+ control: internal
1700
+ foundation: start_to_start
1701
+ reason: estimation cues feed footprint scoring
1702
+ source_ref: planner.feature.footprint-scoring
1703
+ strength: minor
1704
+ target_ref: planner.feature.estimation
1705
+ type: runs_alongside
1706
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1707
+ - confidence: 1
1708
+ constraint: discretionary
1709
+ control: internal
1710
+ foundation: finish_to_start
1711
+ reason: grouping operates over enumerated WMBTs
1712
+ source_ref: planner.feature.grouping-strategy
1713
+ strength: minor
1714
+ target_ref: planner.wmbt.shape
1715
+ type: follows
1716
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1717
+ - confidence: 1
1718
+ constraint: discretionary
1719
+ control: internal
1720
+ foundation: start_to_start
1721
+ reason: grouping keeps a feature within its size budget
1722
+ source_ref: planner.feature.grouping-strategy
1723
+ strength: minor
1724
+ target_ref: planner.feature.size-max-rule
1725
+ type: runs_alongside
1726
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1727
+ - confidence: 1
1728
+ constraint: mandatory
1729
+ control: internal
1730
+ foundation: start_to_start
1731
+ reason: the feature name rule draws its leading-verb lexicon from the verb-selection table
1732
+ source_ref: planner.feature.name-is-verb-object
1733
+ strength: important
1734
+ target_ref: planner.feature.verb-selection-by-artifact-type
1735
+ type: requires
1736
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1737
+ - confidence: 1
1738
+ constraint: mandatory
1739
+ control: internal
1740
+ foundation: finish_to_start
1741
+ reason: shape aggregates the feedback-loop kind
1742
+ source_ref: planner.feature.shape
1743
+ strength: important
1744
+ target_ref: planner.feature.feedback-loop-kind
1745
+ type: requires
1746
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1747
+ - confidence: 1
1748
+ constraint: mandatory
1749
+ control: internal
1750
+ foundation: finish_to_start
1751
+ reason: shape aggregates the hard limits
1752
+ source_ref: planner.feature.shape
1753
+ strength: important
1754
+ target_ref: planner.feature.hard-limits
1755
+ type: requires
1756
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1757
+ - confidence: 1
1758
+ constraint: mandatory
1759
+ control: internal
1760
+ foundation: finish_to_start
1761
+ reason: shape aggregates the sizing rule
1762
+ source_ref: planner.feature.shape
1763
+ strength: important
1764
+ target_ref: planner.feature.size-max-rule
1765
+ type: requires
1766
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1767
+ - confidence: 1
1768
+ constraint: mandatory
1769
+ control: internal
1770
+ foundation: finish_to_start
1771
+ reason: a well-shaped feature declares its urn
1772
+ source_ref: planner.feature.shape
1773
+ strength: important
1774
+ target_ref: planner.feature.urn-naming
1775
+ type: requires
1776
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1777
+ - confidence: 1
1778
+ constraint: mandatory
1779
+ control: internal
1780
+ foundation: finish_to_start
1781
+ reason: the footprint size is one input to the max rule
1782
+ source_ref: planner.feature.size-max-rule
1783
+ strength: critical
1784
+ target_ref: planner.feature.footprint-scoring
1785
+ type: requires
1786
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1787
+ - confidence: 1
1788
+ constraint: mandatory
1789
+ control: internal
1790
+ foundation: finish_to_start
1791
+ reason: WMBT groups produce the WMBT-count size input
1792
+ source_ref: planner.feature.size-max-rule
1793
+ strength: important
1794
+ target_ref: planner.feature.grouping-strategy
1795
+ type: requires
1796
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1797
+ - confidence: 1
1798
+ constraint: mandatory
1799
+ control: internal
1800
+ foundation: start_to_start
1801
+ reason: sizing and hard limits both gate feature scope
1802
+ source_ref: planner.feature.size-max-rule
1803
+ strength: important
1804
+ target_ref: planner.feature.hard-limits
1805
+ type: runs_alongside
1806
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1807
+ - confidence: 1
1808
+ constraint: discretionary
1809
+ control: internal
1810
+ foundation: finish_to_start
1811
+ reason: the feature URN segment comes from artifact-seeded naming
1812
+ source_ref: planner.feature.urn-naming
1813
+ strength: minor
1814
+ target_ref: planner.feature.artifact-seeded-naming
1815
+ type: follows
1816
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1817
+ - confidence: 1
1818
+ constraint: mandatory
1819
+ control: external
1820
+ foundation: finish_to_start
1821
+ reason: a feature URN embeds its parent wagon slug
1822
+ source_ref: planner.feature.urn-naming
1823
+ strength: important
1824
+ target_ref: planner.wagon.urn-naming
1825
+ type: requires
1826
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1827
+ - confidence: 1
1828
+ constraint: discretionary
1829
+ control: internal
1830
+ foundation: start_to_start
1831
+ reason: the URN feature segment is the artifact-seeded verb-object name
1832
+ source_ref: planner.feature.urn-naming
1833
+ strength: minor
1834
+ target_ref: planner.feature.artifact-seeded-naming
1835
+ type: runs_alongside
1836
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1837
+ - confidence: 1
1838
+ constraint: mandatory
1839
+ control: internal
1840
+ foundation: finish_to_start
1841
+ reason: validation enforces the hard limits
1842
+ source_ref: planner.feature.validation-rules
1843
+ strength: important
1844
+ target_ref: planner.feature.hard-limits
1845
+ type: requires
1846
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1847
+ - confidence: 1
1848
+ constraint: mandatory
1849
+ control: internal
1850
+ foundation: finish_to_start
1851
+ reason: validation enforces the max size rule
1852
+ source_ref: planner.feature.validation-rules
1853
+ strength: important
1854
+ target_ref: planner.feature.size-max-rule
1855
+ type: requires
1856
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1857
+ - confidence: 1
1858
+ constraint: mandatory
1859
+ control: external
1860
+ foundation: finish_to_start
1861
+ reason: a feature is registered in its wagon _features.yaml
1862
+ source_ref: planner.feature.wagon-link
1863
+ strength: important
1864
+ target_ref: planner.wagon.features
1865
+ type: requires
1866
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1867
+ - confidence: 1
1868
+ constraint: mandatory
1869
+ control: internal
1870
+ foundation: finish_to_start
1871
+ reason: "REST endpoint shapes are built from the interface naming patterns, so the mapping presupposes them"
1872
+ source_ref: planner.interface.api-mapping
1873
+ strength: important
1874
+ target_ref: planner.interface.naming-patterns
1875
+ type: requires
1876
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1877
+ - confidence: 1
1878
+ constraint: mandatory
1879
+ control: internal
1880
+ foundation: finish_to_start
1881
+ reason: verb selection keys off the event/state/data/config naming classification
1882
+ source_ref: planner.interface.artifact-transformation
1883
+ strength: important
1884
+ target_ref: planner.interface.naming-patterns
1885
+ type: requires
1886
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1887
+ - confidence: 1
1888
+ constraint: mandatory
1889
+ control: internal
1890
+ foundation: finish_to_start
1891
+ reason: the contract URN scheme is the interface-side application of the stable-naming grammar
1892
+ source_ref: planner.interface.contract-urn
1893
+ strength: important
1894
+ target_ref: planner.artifact-naming.planner-artifacts-use-stable
1895
+ type: follows
1896
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1897
+ - confidence: 1
1898
+ constraint: mandatory
1899
+ control: internal
1900
+ foundation: finish_to_start
1901
+ reason: orphan detection is defined via bidirectional-linkage resolution of the contract URN
1902
+ source_ref: planner.interface.orphan-detection
1903
+ strength: important
1904
+ target_ref: planner.interface.contract-urn
1905
+ type: requires
1906
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1907
+ - confidence: 1
1908
+ constraint: mandatory
1909
+ control: internal
1910
+ foundation: finish_to_start
1911
+ reason: "the producing wagon generates the artifact contract, which must carry a well-formed contract URN"
1912
+ source_ref: planner.interface.ownership-rules
1913
+ strength: important
1914
+ target_ref: planner.interface.contract-urn
1915
+ type: requires
1916
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1917
+ - confidence: 1
1918
+ constraint: discretionary
1919
+ control: internal
1920
+ foundation: finish_to_start
1921
+ reason: FLAT/FACETED/COLLECTION layouts realise the colon/dot-to-path mapping
1922
+ source_ref: planner.interface.structure-rules
1923
+ strength: minor
1924
+ target_ref: planner.artifact-naming.planner-artifacts-use-stable
1925
+ type: follows
1926
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1927
+ - confidence: 1
1928
+ constraint: discretionary
1929
+ control: internal
1930
+ foundation: finish_to_start
1931
+ reason: the tests/ rule targets the leaf directories produced by the layouts
1932
+ source_ref: planner.interface.tests-subdirectory
1933
+ strength: minor
1934
+ target_ref: planner.interface.structure-rules
1935
+ type: follows
1936
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1937
+ - confidence: 1
1938
+ constraint: mandatory
1939
+ control: internal
1940
+ foundation: finish_to_finish
1941
+ reason: composite dispatch keys are exceptional
1942
+ source_ref: planner.interlocking.definition
1943
+ strength: important
1944
+ target_ref: planner.train.dispatch-composite-key-exceptional
1945
+ type: requires
1946
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1947
+ - confidence: 1
1948
+ constraint: mandatory
1949
+ control: internal
1950
+ foundation: finish_to_finish
1951
+ reason: the dispatch map is a declared routing registry
1952
+ source_ref: planner.interlocking.definition
1953
+ strength: critical
1954
+ target_ref: planner.train.dispatch-map-is-registry
1955
+ type: requires
1956
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1957
+ - confidence: 1
1958
+ constraint: mandatory
1959
+ control: internal
1960
+ foundation: finish_to_start
1961
+ reason: "the registry mirrors entrypoint.surfaces, so the mirror is meaningful only where the entrypoint shape is enforced"
1962
+ source_ref: planner.interlocking.registry-mirrors-document
1963
+ strength: important
1964
+ target_ref: planner.train.interlocking-entrypoint-shape
1965
+ type: requires
1966
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1967
+ - confidence: 1
1968
+ constraint: mandatory
1969
+ control: internal
1970
+ foundation: finish_to_start
1971
+ reason: the registry can only be checked against its documents once both live at the declared interlocking home
1972
+ source_ref: planner.interlocking.registry-mirrors-document
1973
+ strength: important
1974
+ target_ref: planner.train.interlocking-home
1975
+ type: requires
1976
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1977
+ - confidence: 0.9
1978
+ constraint: discretionary
1979
+ control: internal
1980
+ foundation: start_to_start
1981
+ reason: "both are required, populated issue-body section rules enforced together"
1982
+ source_ref: planner.issue-body.graph-context-required
1983
+ strength: minor
1984
+ target_ref: planner.issue-body.dependency-entries-must-be-classified
1985
+ type: runs_alongside
1986
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1987
+ - confidence: 1
1988
+ reason: the Confirm boundary both gates authoring and binds the plan to its tracking issue
1989
+ source_ref: planner.plan.confirm-before-author
1990
+ target_ref: planner.plan.confirm-binds-an-issue
1991
+ type: enables
1992
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
1993
+ - confidence: 1
1994
+ constraint: mandatory
1995
+ control: internal
1996
+ foundation: finish_to_start
1997
+ reason: Confirm gates a train-bearing plan on interlocking sanity
1998
+ source_ref: planner.plan.confirm-requires-interlocking-sanity
1999
+ strength: important
2000
+ target_ref: planner.train.interlocking-home
2001
+ type: requires
2002
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2003
+ - confidence: 1
2004
+ reason: "the session lifecycle's Ratify gate enforces confirm-before-author"
2005
+ source_ref: planner.plan.session-lifecycle
2006
+ target_ref: planner.plan.confirm-before-author
2007
+ type: requires
2008
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2009
+ - confidence: 1
2010
+ constraint: mandatory
2011
+ control: internal
2012
+ foundation: finish_to_start
2013
+ reason: "Compose's exit condition is a convention-shaped decomposition, which is what holding each hand-authored spec to its artifact schema actually checks"
2014
+ source_ref: planner.plan.session-lifecycle
2015
+ strength: critical
2016
+ target_ref: planner.plan.spec-is-schema-valid
2017
+ type: requires
2018
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2019
+ - confidence: 1
2020
+ constraint: mandatory
2021
+ control: internal
2022
+ foundation: finish_to_start
2023
+ reason: "a spec is validated against the schema of the artifact its kind authors, so the plan layer keeps the by-construction promise the author layer already makes"
2024
+ source_ref: planner.plan.spec-is-schema-valid
2025
+ strength: critical
2026
+ target_ref: planner.wagon.urn-naming
2027
+ type: requires
2028
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2029
+ - confidence: 1
2030
+ reason: the ladder report is advisory and rides on the same Ratify lock the spec schema gate fails closed on
2031
+ source_ref: planner.plan.spec-is-schema-valid
2032
+ target_ref: planner.plan.granularity-completeness
2033
+ type: runs_alongside
2034
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2035
+ - confidence: 0.9
2036
+ constraint: discretionary
2037
+ control: internal
2038
+ foundation: start_to_start
2039
+ reason: no-orphan-node graph completeness is a planning-artifact integrity rule alongside acceptance completeness
2040
+ source_ref: planner.relationship.no-orphan-nodes
2041
+ strength: minor
2042
+ target_ref: planner.acceptance.complete
2043
+ type: runs_alongside
2044
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2045
+ - confidence: 0.9
2046
+ constraint: discretionary
2047
+ control: internal
2048
+ foundation: start_to_start
2049
+ reason: no-orphan-node graph completeness is a planning-artifact integrity rule alongside acceptance well-formedness
2050
+ source_ref: planner.relationship.no-orphan-nodes
2051
+ strength: minor
2052
+ target_ref: planner.acceptance.well-formed
2053
+ type: runs_alongside
2054
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2055
+ - confidence: 1
2056
+ constraint: mandatory
2057
+ control: internal
2058
+ foundation: start_to_start
2059
+ reason: "the SMOKE close-the-loop obligation only applies to a feature that declares kind: feedback-loop, so the kind rule is its precondition"
2060
+ source_ref: planner.smoke.feedback-loop-close-the-loop
2061
+ strength: important
2062
+ target_ref: planner.feature.feedback-loop-kind
2063
+ type: requires
2064
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2065
+ - confidence: 1
2066
+ constraint: mandatory
2067
+ control: internal
2068
+ foundation: start_to_start
2069
+ reason: "both police SMOKE-phase authenticity: one forbids synthetic wiring, the other requires the consumer end be exercised, and together they stop a SMOKE suite that is green without proving anything"
2070
+ source_ref: planner.smoke.synthetic-fixture-bypass
2071
+ strength: important
2072
+ target_ref: planner.smoke.feedback-loop-close-the-loop
2073
+ type: runs_alongside
2074
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2075
+ - confidence: 1
2076
+ constraint: mandatory
2077
+ control: internal
2078
+ foundation: finish_to_start
2079
+ reason: layer/sequence mapping is keyed by the nine step names
2080
+ source_ref: planner.steps.architecture-routing
2081
+ strength: important
2082
+ target_ref: planner.steps.jtbd-taxonomy
2083
+ type: requires
2084
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2085
+ - confidence: 1
2086
+ constraint: discretionary
2087
+ control: internal
2088
+ foundation: start_to_start
2089
+ reason: both decorate the same nine steps from complementary axes
2090
+ source_ref: planner.steps.architecture-routing
2091
+ strength: minor
2092
+ target_ref: planner.steps.linguistic-patterns
2093
+ type: runs_alongside
2094
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2095
+ - confidence: 1
2096
+ constraint: mandatory
2097
+ control: internal
2098
+ foundation: finish_to_start
2099
+ reason: the ordered 9-step taxonomy supplies the ordering the sequence rule asserts
2100
+ source_ref: planner.steps.jtbd-taxonomy
2101
+ strength: important
2102
+ target_ref: planner.steps.sequence
2103
+ type: enables
2104
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2105
+ - confidence: 1
2106
+ constraint: mandatory
2107
+ control: internal
2108
+ foundation: finish_to_start
2109
+ reason: patterns are defined per step name
2110
+ source_ref: planner.steps.linguistic-patterns
2111
+ strength: important
2112
+ target_ref: planner.steps.jtbd-taxonomy
2113
+ type: requires
2114
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2115
+ - confidence: 0.9
2116
+ constraint: discretionary
2117
+ control: internal
2118
+ foundation: start_to_start
2119
+ reason: ordered step pre-conditions/outputs and the train artifact flow both sequence the plan
2120
+ source_ref: planner.steps.sequence
2121
+ strength: minor
2122
+ target_ref: planner.train.artifact-flow
2123
+ type: runs_alongside
2124
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2125
+ - confidence: 1
2126
+ constraint: discretionary
2127
+ control: internal
2128
+ foundation: finish_to_start
2129
+ reason: plan/test/code archetype alignment presupposes a canonical theme
2130
+ source_ref: planner.theme.archetype-alignment
2131
+ strength: minor
2132
+ target_ref: planner.theme.must-be-canonical
2133
+ type: follows
2134
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2135
+ - confidence: 1
2136
+ constraint: mandatory
2137
+ control: internal
2138
+ foundation: finish_to_start
2139
+ reason: the commons/coach import boundary is only checkable once a theme resolves to canonical
2140
+ source_ref: planner.theme.commons-coach-boundary
2141
+ strength: important
2142
+ target_ref: planner.theme.must-be-canonical
2143
+ type: follows
2144
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2145
+ - confidence: 1
2146
+ constraint: mandatory
2147
+ control: internal
2148
+ foundation: finish_to_finish
2149
+ reason: each theme aligns to one archetype
2150
+ source_ref: planner.theme.definition
2151
+ strength: important
2152
+ target_ref: planner.theme.archetype-alignment
2153
+ type: requires
2154
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2155
+ - confidence: 1
2156
+ constraint: mandatory
2157
+ control: internal
2158
+ foundation: finish_to_finish
2159
+ reason: a theme is one of the five canonical digits
2160
+ source_ref: planner.theme.definition
2161
+ strength: critical
2162
+ target_ref: planner.theme.canonical-taxonomy
2163
+ type: requires
2164
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2165
+ - confidence: 1
2166
+ constraint: mandatory
2167
+ control: internal
2168
+ foundation: finish_to_finish
2169
+ reason: commons is consumable without importing coach
2170
+ source_ref: planner.theme.definition
2171
+ strength: important
2172
+ target_ref: planner.theme.commons-coach-boundary
2173
+ type: requires
2174
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2175
+ - confidence: 1
2176
+ constraint: mandatory
2177
+ control: internal
2178
+ foundation: finish_to_finish
2179
+ reason: non-canonical themes are rejected
2180
+ source_ref: planner.theme.definition
2181
+ strength: critical
2182
+ target_ref: planner.theme.must-be-canonical
2183
+ type: requires
2184
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2185
+ - confidence: 1
2186
+ constraint: mandatory
2187
+ control: internal
2188
+ foundation: finish_to_finish
2189
+ reason: digit 0 commons is the mandatory locked floor
2190
+ source_ref: planner.theme.definition
2191
+ strength: critical
2192
+ target_ref: planner.theme.theme-zero-mandatory
2193
+ type: requires
2194
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2195
+ - confidence: 1
2196
+ constraint: mandatory
2197
+ control: internal
2198
+ foundation: finish_to_finish
2199
+ reason: the theme token namespaces the artifact URN
2200
+ source_ref: planner.theme.definition
2201
+ strength: important
2202
+ target_ref: planner.theme.urn-namespace-matches
2203
+ type: requires
2204
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2205
+ - confidence: 1
2206
+ constraint: mandatory
2207
+ control: internal
2208
+ foundation: finish_to_start
2209
+ reason: the canonical set is defined by the taxonomy
2210
+ source_ref: planner.theme.must-be-canonical
2211
+ strength: critical
2212
+ target_ref: planner.theme.canonical-taxonomy
2213
+ type: requires
2214
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2215
+ - confidence: 1
2216
+ constraint: mandatory
2217
+ control: internal
2218
+ foundation: finish_to_start
2219
+ reason: a canonical theme set must include the non-removable commons@0 floor
2220
+ source_ref: planner.theme.must-be-canonical
2221
+ strength: critical
2222
+ target_ref: planner.theme.theme-zero-mandatory
2223
+ type: requires
2224
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2225
+ - confidence: 1
2226
+ constraint: mandatory
2227
+ control: internal
2228
+ foundation: finish_to_start
2229
+ reason: "digit 0 = commons is fixed by the taxonomy's theme_zero token"
2230
+ source_ref: planner.theme.theme-zero-mandatory
2231
+ strength: critical
2232
+ target_ref: planner.theme.canonical-taxonomy
2233
+ type: requires
2234
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2235
+ - confidence: 1
2236
+ constraint: mandatory
2237
+ control: internal
2238
+ foundation: finish_to_start
2239
+ reason: matching a produced-URN theme-prefix to the wagon theme presupposes a canonical theme
2240
+ source_ref: planner.theme.urn-namespace-matches
2241
+ strength: important
2242
+ target_ref: planner.theme.must-be-canonical
2243
+ type: follows
2244
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2245
+ - confidence: 1
2246
+ constraint: mandatory
2247
+ control: internal
2248
+ foundation: finish_to_start
2249
+ reason: the theme-prefix must be a canonical theme
2250
+ source_ref: planner.theme.urn-namespace-matches
2251
+ strength: important
2252
+ target_ref: planner.theme.canonical-taxonomy
2253
+ type: requires
2254
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2255
+ - confidence: 1
2256
+ constraint: mandatory
2257
+ control: internal
2258
+ foundation: start_to_start
2259
+ reason: extends coverage to the Acceptance Authority boundary
2260
+ source_ref: planner.train.acceptance-commit-failures-covered
2261
+ strength: important
2262
+ target_ref: planner.coverage.bidirectional-coverage-between-trains
2263
+ type: runs_alongside
2264
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2265
+ - confidence: 1
2266
+ constraint: discretionary
2267
+ control: internal
2268
+ foundation: start_to_start
2269
+ reason: train acceptances live in the spec file
2270
+ source_ref: planner.train.acceptances
2271
+ strength: minor
2272
+ target_ref: planner.train.registry
2273
+ type: runs_alongside
2274
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2275
+ - confidence: 1
2276
+ constraint: mandatory
2277
+ control: internal
2278
+ foundation: finish_to_finish
2279
+ reason: a train moves artifacts across wagons
2280
+ source_ref: planner.train.definition
2281
+ strength: important
2282
+ target_ref: planner.train.artifact-flow
2283
+ type: requires
2284
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2285
+ - confidence: 1
2286
+ constraint: mandatory
2287
+ control: internal
2288
+ foundation: finish_to_finish
2289
+ reason: family behavior-or-delivery is part of train identity
2290
+ source_ref: planner.train.definition
2291
+ strength: important
2292
+ target_ref: planner.train.family
2293
+ type: requires
2294
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2295
+ - confidence: 1
2296
+ constraint: mandatory
2297
+ control: internal
2298
+ foundation: finish_to_finish
2299
+ reason: family is fixed by the terminal contract
2300
+ source_ref: planner.train.definition
2301
+ strength: critical
2302
+ target_ref: planner.train.family-matches-terminal-contract
2303
+ type: requires
2304
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2305
+ - confidence: 1
2306
+ constraint: mandatory
2307
+ control: internal
2308
+ foundation: finish_to_finish
2309
+ reason: the journey starts from a declared initial input
2310
+ source_ref: planner.train.definition
2311
+ strength: important
2312
+ target_ref: planner.train.initial-cargo-inputs-declared
2313
+ type: requires
2314
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2315
+ - confidence: 1
2316
+ constraint: mandatory
2317
+ control: internal
2318
+ foundation: finish_to_finish
2319
+ reason: a train is strictly linear
2320
+ source_ref: planner.train.definition
2321
+ strength: critical
2322
+ target_ref: planner.train.linearity
2323
+ type: requires
2324
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2325
+ - confidence: 1
2326
+ constraint: mandatory
2327
+ control: internal
2328
+ foundation: finish_to_finish
2329
+ reason: steps move artifacts between declared participants
2330
+ source_ref: planner.train.definition
2331
+ strength: important
2332
+ target_ref: planner.train.participants
2333
+ type: requires
2334
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2335
+ - confidence: 1
2336
+ constraint: mandatory
2337
+ control: internal
2338
+ foundation: finish_to_finish
2339
+ reason: a train tells ONE coherent journey
2340
+ source_ref: planner.train.definition
2341
+ strength: critical
2342
+ target_ref: planner.train.scope
2343
+ type: requires
2344
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2345
+ - confidence: 1
2346
+ constraint: mandatory
2347
+ control: internal
2348
+ foundation: finish_to_finish
2349
+ reason: a train is an ordered step sequence
2350
+ source_ref: planner.train.definition
2351
+ strength: important
2352
+ target_ref: planner.train.sequence
2353
+ type: requires
2354
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2355
+ - confidence: 1
2356
+ constraint: mandatory
2357
+ control: internal
2358
+ foundation: finish_to_finish
2359
+ reason: the journey ends in exactly one terminal contract
2360
+ source_ref: planner.train.definition
2361
+ strength: critical
2362
+ target_ref: planner.train.terminal-contract
2363
+ type: requires
2364
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2365
+ - confidence: 1
2366
+ constraint: discretionary
2367
+ control: external
2368
+ foundation: finish_to_start
2369
+ reason: train data-flow dependencies follow wagon produce/consume artifacts
2370
+ source_ref: planner.train.dependencies
2371
+ strength: minor
2372
+ target_ref: planner.wagon.produce-consume-artifacts
2373
+ type: requires
2374
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2375
+ - confidence: 1
2376
+ constraint: discretionary
2377
+ control: internal
2378
+ foundation: start_to_start
2379
+ reason: dependencies are declared in the spec
2380
+ source_ref: planner.train.dependencies
2381
+ strength: minor
2382
+ target_ref: planner.train.registry
2383
+ type: runs_alongside
2384
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2385
+ - confidence: 1
2386
+ constraint: mandatory
2387
+ control: internal
2388
+ foundation: finish_to_start
2389
+ reason: The composite-key exception is a constraint on entries within the dispatch registry.
2390
+ source_ref: planner.train.dispatch-composite-key-exceptional
2391
+ strength: important
2392
+ target_ref: planner.train.dispatch-map-is-registry
2393
+ type: requires
2394
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2395
+ - confidence: 1
2396
+ constraint: mandatory
2397
+ control: internal
2398
+ foundation: start_to_start
2399
+ reason: Dispatch routes the produced-artifact divergence alongside the normal train artifact flow.
2400
+ source_ref: planner.train.dispatch-map-is-registry
2401
+ strength: important
2402
+ target_ref: planner.train.artifact-flow
2403
+ type: runs_alongside
2404
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2405
+ - confidence: 1
2406
+ constraint: mandatory
2407
+ control: internal
2408
+ foundation: finish_to_start
2409
+ reason: family is derived from the declared terminal contract
2410
+ source_ref: planner.train.family
2411
+ strength: important
2412
+ target_ref: planner.train.terminal-contract
2413
+ type: requires
2414
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2415
+ - confidence: 1
2416
+ constraint: mandatory
2417
+ control: internal
2418
+ foundation: start_to_start
2419
+ reason: family is a train classification axis orthogonal to the variant category
2420
+ source_ref: planner.train.family
2421
+ strength: important
2422
+ target_ref: planner.train.categories
2423
+ type: runs_alongside
2424
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2425
+ - confidence: 1
2426
+ constraint: mandatory
2427
+ control: internal
2428
+ foundation: finish_to_start
2429
+ reason: the consistency rule checks the family against the terminal contract
2430
+ source_ref: planner.train.family-matches-terminal-contract
2431
+ strength: important
2432
+ target_ref: planner.train.terminal-contract
2433
+ type: requires
2434
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2435
+ - confidence: 1
2436
+ constraint: discretionary
2437
+ control: internal
2438
+ foundation: start_to_start
2439
+ reason: declared initial inputs seed Cargo before the wagon sequence
2440
+ source_ref: planner.train.initial-cargo-inputs-declared
2441
+ strength: important
2442
+ target_ref: planner.train.sequence
2443
+ type: enables
2444
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2445
+ - confidence: 1
2446
+ constraint: mandatory
2447
+ control: internal
2448
+ foundation: finish_to_start
2449
+ reason: the no-cargo boundary applies to homed interlockings
2450
+ source_ref: planner.train.interlocking-does-not-carry-cargo
2451
+ strength: important
2452
+ target_ref: planner.train.interlocking-home
2453
+ type: requires
2454
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2455
+ - confidence: 1
2456
+ constraint: mandatory
2457
+ control: internal
2458
+ foundation: finish_to_start
2459
+ reason: entrypoint shape is declared on an interlocking in the canonical home
2460
+ source_ref: planner.train.interlocking-entrypoint-shape
2461
+ strength: important
2462
+ target_ref: planner.train.interlocking-home
2463
+ type: requires
2464
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2465
+ - confidence: 1
2466
+ constraint: mandatory
2467
+ control: internal
2468
+ foundation: finish_to_start
2469
+ reason: fragment and acceptance binding presupposes the homed interlocking
2470
+ source_ref: planner.train.interlocking-fragment-acceptance-binding
2471
+ strength: important
2472
+ target_ref: planner.train.interlocking-home
2473
+ type: requires
2474
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2475
+ - confidence: 1
2476
+ constraint: mandatory
2477
+ control: internal
2478
+ foundation: finish_to_start
2479
+ reason: guard coverage is proven against the route to train projection
2480
+ source_ref: planner.train.interlocking-guard-coverage
2481
+ strength: important
2482
+ target_ref: planner.train.interlocking-projection-equivalence
2483
+ type: requires
2484
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2485
+ - confidence: 1
2486
+ constraint: mandatory
2487
+ control: internal
2488
+ foundation: finish_to_start
2489
+ reason: guard grammar is declared on a homed interlocking
2490
+ source_ref: planner.train.interlocking-guard-grammar
2491
+ strength: important
2492
+ target_ref: planner.train.interlocking-home
2493
+ type: requires
2494
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2495
+ - confidence: 1
2496
+ constraint: mandatory
2497
+ control: internal
2498
+ foundation: finish_to_start
2499
+ reason: message payload typing is declared on a homed interlocking
2500
+ source_ref: planner.train.interlocking-message-payload-typed
2501
+ strength: important
2502
+ target_ref: planner.train.interlocking-home
2503
+ type: requires
2504
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2505
+ - confidence: 1
2506
+ constraint: mandatory
2507
+ control: internal
2508
+ foundation: finish_to_start
2509
+ reason: a typed payload contract must resolve to a schema body
2510
+ source_ref: planner.train.interlocking-payload-contract-body-required
2511
+ strength: important
2512
+ target_ref: planner.train.interlocking-message-payload-typed
2513
+ type: requires
2514
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2515
+ - confidence: 1
2516
+ constraint: mandatory
2517
+ control: internal
2518
+ foundation: finish_to_start
2519
+ reason: "binding an interlocking payload.contract to an authored/registered contract (#1314 item E) ties the route/interlocking model to the contract layer — the declared identity must be a registered contract, resolved via the contract identity->file mapping the contract layer maintains"
2520
+ source_ref: planner.train.interlocking-payload-contract-registered
2521
+ strength: important
2522
+ target_ref: planner.artifact-naming.contract-file-mapping
2523
+ type: requires
2524
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2525
+ - confidence: 1
2526
+ constraint: mandatory
2527
+ control: internal
2528
+ foundation: finish_to_start
2529
+ reason: registry membership of a payload contract presupposes a typed payload
2530
+ source_ref: planner.train.interlocking-payload-contract-registered
2531
+ strength: important
2532
+ target_ref: planner.train.interlocking-message-payload-typed
2533
+ type: requires
2534
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2535
+ - confidence: 1
2536
+ constraint: mandatory
2537
+ control: internal
2538
+ foundation: finish_to_start
2539
+ reason: projection equivalence presupposes the homed interlocking
2540
+ source_ref: planner.train.interlocking-projection-equivalence
2541
+ strength: important
2542
+ target_ref: planner.train.interlocking-home
2543
+ type: requires
2544
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2545
+ - confidence: 1
2546
+ constraint: mandatory
2547
+ control: internal
2548
+ foundation: finish_to_start
2549
+ reason: route category agreement presupposes the homed interlocking
2550
+ source_ref: planner.train.interlocking-route-category-matches-train-id
2551
+ strength: important
2552
+ target_ref: planner.train.interlocking-home
2553
+ type: requires
2554
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2555
+ - confidence: 1
2556
+ constraint: mandatory
2557
+ control: internal
2558
+ foundation: finish_to_start
2559
+ reason: deterministic resolution presupposes the homed interlocking
2560
+ source_ref: planner.train.interlocking-route-resolution-deterministic
2561
+ strength: important
2562
+ target_ref: planner.train.interlocking-home
2563
+ type: requires
2564
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2565
+ - confidence: 1
2566
+ constraint: mandatory
2567
+ control: internal
2568
+ foundation: finish_to_start
2569
+ reason: a structural residual is the explicit escape hatch for WMBT surfacing
2570
+ source_ref: planner.train.interlocking-structural-residual-explicit
2571
+ strength: important
2572
+ target_ref: planner.train.interlocking-wmbt-surface-or-residual
2573
+ type: requires
2574
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2575
+ - confidence: 1
2576
+ constraint: mandatory
2577
+ control: internal
2578
+ foundation: finish_to_start
2579
+ reason: WMBT surfacing presupposes the homed interlocking
2580
+ source_ref: planner.train.interlocking-wmbt-surface-or-residual
2581
+ strength: important
2582
+ target_ref: planner.train.interlocking-home
2583
+ type: requires
2584
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2585
+ - confidence: 1
2586
+ constraint: mandatory
2587
+ control: internal
2588
+ foundation: start_to_start
2589
+ reason: linearity forbids loop/route elements in the sequence
2590
+ source_ref: planner.train.linearity
2591
+ strength: critical
2592
+ target_ref: planner.train.sequence
2593
+ type: runs_alongside
2594
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2595
+ - confidence: 0.9
2596
+ constraint: discretionary
2597
+ control: internal
2598
+ foundation: start_to_start
2599
+ reason: "production train execution carries the train's artifact flow"
2600
+ source_ref: planner.train.production-implementation
2601
+ strength: minor
2602
+ target_ref: planner.train.artifact-flow
2603
+ type: runs_alongside
2604
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2605
+ - confidence: 1
2606
+ constraint: mandatory
2607
+ control: internal
2608
+ foundation: finish_to_start
2609
+ reason: the subject-bucketed train registry can only key a typed train:<subject>:<slug> entry on a subject already registered in plan/_subjects.yaml
2610
+ source_ref: planner.train.registry
2611
+ strength: important
2612
+ target_ref: planner.subject.invariants
2613
+ type: requires
2614
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2615
+ - confidence: 1
2616
+ constraint: mandatory
2617
+ control: internal
2618
+ foundation: finish_to_start
2619
+ reason: registry + spec paths derive from the train_id
2620
+ source_ref: planner.train.registry
2621
+ strength: important
2622
+ target_ref: planner.train.naming
2623
+ type: requires
2624
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2625
+ - confidence: 1
2626
+ constraint: mandatory
2627
+ control: external
2628
+ foundation: start_to_start
2629
+ reason: the train registry is what train-wagon coverage validates against
2630
+ source_ref: planner.train.registry
2631
+ strength: important
2632
+ target_ref: planner.coverage.bidirectional-coverage-between-trains
2633
+ type: runs_alongside
2634
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2635
+ - confidence: 1
2636
+ constraint: mandatory
2637
+ control: internal
2638
+ foundation: finish_to_start
2639
+ reason: "the row path and the document path it is compared against both derive from the train_id, so a naming disagreement would read as an incoherence"
2640
+ source_ref: planner.train.registry-coherence
2641
+ strength: important
2642
+ target_ref: planner.train.naming
2643
+ type: requires
2644
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2645
+ - confidence: 1
2646
+ constraint: mandatory
2647
+ control: internal
2648
+ foundation: finish_to_start
2649
+ reason: "existence coherence is checked over the two-file registry+spec pattern that node defines (#1942)"
2650
+ source_ref: planner.train.registry-coherence
2651
+ strength: critical
2652
+ target_ref: planner.train.registry
2653
+ type: requires
2654
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2655
+ - confidence: 1
2656
+ constraint: mandatory
2657
+ control: internal
2658
+ foundation: finish_to_start
2659
+ reason: "assessing the category space presupposes each route's declared category already agrees with its target train"
2660
+ source_ref: planner.train.route-category-assessment
2661
+ strength: important
2662
+ target_ref: planner.train.interlocking-route-category-matches-train-id
2663
+ type: requires
2664
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2665
+ - confidence: 1
2666
+ constraint: mandatory
2667
+ control: internal
2668
+ foundation: start_to_start
2669
+ reason: admission proves every train is classified; category assessment proves the route space that classifies them is itself complete
2670
+ source_ref: planner.train.route-category-assessment
2671
+ strength: important
2672
+ target_ref: planner.train.route-space-admission
2673
+ type: runs_alongside
2674
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2675
+ - confidence: 1
2676
+ constraint: mandatory
2677
+ control: internal
2678
+ foundation: finish_to_start
2679
+ reason: "admission counts routes across the registered interlockings, so it presupposes the homed+registered interlocking set"
2680
+ source_ref: planner.train.route-space-admission
2681
+ strength: important
2682
+ target_ref: planner.train.interlocking-home
2683
+ type: requires
2684
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2685
+ - confidence: 1
2686
+ constraint: mandatory
2687
+ control: internal
2688
+ foundation: finish_to_start
2689
+ reason: a train sequences 3-7 wagons referenced by wagon URN
2690
+ source_ref: planner.train.scope
2691
+ strength: important
2692
+ target_ref: planner.wagon.urn
2693
+ type: requires
2694
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2695
+ - confidence: 1
2696
+ constraint: mandatory
2697
+ control: external
2698
+ foundation: finish_to_start
2699
+ reason: "a train's participants are wagons"
2700
+ source_ref: planner.train.scope
2701
+ strength: important
2702
+ target_ref: planner.wagon.urn-naming
2703
+ type: requires
2704
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2705
+ - confidence: 1
2706
+ constraint: discretionary
2707
+ control: internal
2708
+ foundation: start_to_start
2709
+ reason: the one-journey scope is realized by the sequence
2710
+ source_ref: planner.train.scope
2711
+ strength: minor
2712
+ target_ref: planner.train.sequence
2713
+ type: runs_alongside
2714
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2715
+ - confidence: 1
2716
+ constraint: mandatory
2717
+ control: internal
2718
+ foundation: finish_to_start
2719
+ reason: each step carries a domain:resource artifact
2720
+ source_ref: planner.train.sequence
2721
+ strength: important
2722
+ target_ref: planner.train.artifact-flow
2723
+ type: requires
2724
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2725
+ - confidence: 1
2726
+ constraint: mandatory
2727
+ control: internal
2728
+ foundation: finish_to_start
2729
+ reason: each step transfers an artifact between participants
2730
+ source_ref: planner.train.sequence
2731
+ strength: important
2732
+ target_ref: planner.train.participants
2733
+ type: requires
2734
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2735
+ - confidence: 1
2736
+ constraint: mandatory
2737
+ control: external
2738
+ foundation: finish_to_start
2739
+ reason: a train theme-digit must resolve to one of the five canonical themes
2740
+ source_ref: planner.train.theme-alignment
2741
+ strength: important
2742
+ target_ref: planner.theme.must-be-canonical
2743
+ type: requires
2744
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2745
+ - confidence: 1
2746
+ constraint: mandatory
2747
+ control: internal
2748
+ foundation: finish_to_start
2749
+ reason: the primary theme is read from the first train-id digit
2750
+ source_ref: planner.train.theme-alignment
2751
+ strength: important
2752
+ target_ref: planner.train.theme-ranges
2753
+ type: requires
2754
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2755
+ - confidence: 1
2756
+ constraint: mandatory
2757
+ control: internal
2758
+ foundation: finish_to_start
2759
+ reason: the train URN carried on a theme orchestrator must reference a train registered in the train registry (registry entry + spec file)
2760
+ source_ref: planner.train.theme-orchestrator-urn
2761
+ strength: important
2762
+ target_ref: planner.train.registry
2763
+ type: requires
2764
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2765
+ - confidence: 1
2766
+ constraint: mandatory
2767
+ control: internal
2768
+ foundation: finish_to_start
2769
+ reason: each theme range spans the four categories
2770
+ source_ref: planner.train.theme-ranges
2771
+ strength: minor
2772
+ target_ref: planner.train.categories
2773
+ type: requires
2774
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2775
+ - confidence: 1
2776
+ constraint: mandatory
2777
+ control: internal
2778
+ foundation: finish_to_start
2779
+ reason: validation enforces spec-file existence
2780
+ source_ref: planner.train.validation-rules
2781
+ strength: important
2782
+ target_ref: planner.train.registry
2783
+ type: requires
2784
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2785
+ - confidence: 1
2786
+ constraint: discretionary
2787
+ control: internal
2788
+ foundation: start_to_start
2789
+ reason: "variations populate a theme's category/variation slots"
2790
+ source_ref: planner.train.variation-strategies
2791
+ strength: minor
2792
+ target_ref: planner.train.theme-ranges
2793
+ type: runs_alongside
2794
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2795
+ - confidence: 1
2796
+ constraint: mandatory
2797
+ control: internal
2798
+ foundation: finish_to_start
2799
+ reason: the telemetry URN grammar is what the filesystem mapping resolves
2800
+ source_ref: planner.wagon.artifact-contracts
2801
+ strength: important
2802
+ target_ref: planner.wagon.telemetry-filesystem
2803
+ type: enables
2804
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2805
+ - confidence: 1
2806
+ constraint: mandatory
2807
+ control: external
2808
+ foundation: finish_to_start
2809
+ reason: contract URNs map to files via the artifact-naming mapping
2810
+ source_ref: planner.wagon.artifact-contracts
2811
+ strength: important
2812
+ target_ref: planner.artifact-naming.contract-file-mapping
2813
+ type: requires
2814
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2815
+ - confidence: 1
2816
+ constraint: discretionary
2817
+ control: internal
2818
+ foundation: start_to_start
2819
+ reason: footprint measures intrinsic volume; complexity adds interconnection shape (orthogonal sizing axes)
2820
+ source_ref: planner.wagon.complexity-model
2821
+ strength: minor
2822
+ target_ref: planner.feature.footprint-scoring
2823
+ type: runs_alongside
2824
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2825
+ - confidence: 1
2826
+ constraint: mandatory
2827
+ control: internal
2828
+ foundation: finish_to_start
2829
+ reason: "the advisory coupling-complexity reporter executes the complexity model's fan_in x fan_out metric"
2830
+ source_ref: planner.wagon.coupling-complexity
2831
+ strength: important
2832
+ target_ref: planner.wagon.complexity-model
2833
+ type: requires
2834
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2835
+ - confidence: 1
2836
+ constraint: mandatory
2837
+ control: internal
2838
+ foundation: finish_to_finish
2839
+ reason: artifacts cross declared contract boundaries
2840
+ source_ref: planner.wagon.definition
2841
+ strength: important
2842
+ target_ref: planner.wagon.artifact-contracts
2843
+ type: requires
2844
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2845
+ - confidence: 1
2846
+ constraint: mandatory
2847
+ control: internal
2848
+ foundation: finish_to_finish
2849
+ reason: separability is judged by cross-wagon coupling
2850
+ source_ref: planner.wagon.definition
2851
+ strength: important
2852
+ target_ref: planner.wagon.coupling-complexity
2853
+ type: requires
2854
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2855
+ - confidence: 1
2856
+ constraint: mandatory
2857
+ control: internal
2858
+ foundation: finish_to_finish
2859
+ reason: a wagon groups the features that decompose it
2860
+ source_ref: planner.wagon.definition
2861
+ strength: minor
2862
+ target_ref: planner.wagon.features
2863
+ type: requires
2864
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2865
+ - confidence: 1
2866
+ constraint: mandatory
2867
+ control: internal
2868
+ foundation: finish_to_finish
2869
+ reason: wagons must not form a produce-consume cycle
2870
+ source_ref: planner.wagon.definition
2871
+ strength: critical
2872
+ target_ref: planner.wagon.no-consume-cycle
2873
+ type: requires
2874
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2875
+ - confidence: 1
2876
+ constraint: mandatory
2877
+ control: internal
2878
+ foundation: finish_to_finish
2879
+ reason: a wagon consumes and produces declared artifacts
2880
+ source_ref: planner.wagon.definition
2881
+ strength: important
2882
+ target_ref: planner.wagon.produce-consume-artifacts
2883
+ type: requires
2884
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2885
+ - confidence: 1
2886
+ constraint: mandatory
2887
+ control: internal
2888
+ foundation: finish_to_finish
2889
+ reason: a wagon has one coherent subject action goal
2890
+ source_ref: planner.wagon.definition
2891
+ strength: critical
2892
+ target_ref: planner.wagon.semantic-coherence
2893
+ type: requires
2894
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2895
+ - confidence: 1
2896
+ constraint: mandatory
2897
+ control: internal
2898
+ foundation: finish_to_finish
2899
+ reason: a wagon is a separable unit of work
2900
+ source_ref: planner.wagon.definition
2901
+ strength: critical
2902
+ target_ref: planner.wagon.separability
2903
+ type: requires
2904
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2905
+ - confidence: 1
2906
+ constraint: mandatory
2907
+ control: internal
2908
+ foundation: start_to_start
2909
+ reason: the features-manifest rule uses the urn-array features format
2910
+ source_ref: planner.wagon.features-format
2911
+ strength: important
2912
+ target_ref: planner.wagon.features
2913
+ type: runs_alongside
2914
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2915
+ - confidence: 1
2916
+ constraint: mandatory
2917
+ control: internal
2918
+ foundation: finish_to_start
2919
+ reason: kebab/snake conversion underpins the wagon URN + plan/<slug>/ layout
2920
+ source_ref: planner.wagon.logical-vs-filesystem-naming
2921
+ strength: important
2922
+ target_ref: planner.wagon.urn
2923
+ type: enables
2924
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2925
+ - confidence: 1
2926
+ constraint: mandatory
2927
+ control: internal
2928
+ foundation: start_to_start
2929
+ reason: the conversion functions implement the kebab/snake split
2930
+ source_ref: planner.wagon.logical-vs-filesystem-naming
2931
+ strength: important
2932
+ target_ref: planner.wagon.slug-dirname-conversion
2933
+ type: runs_alongside
2934
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2935
+ - confidence: 1
2936
+ constraint: mandatory
2937
+ control: internal
2938
+ foundation: start_to_start
2939
+ reason: the wagon name rule draws its leading-verb lexicon from the verb-selection table
2940
+ source_ref: planner.wagon.name-is-verb-object
2941
+ strength: important
2942
+ target_ref: planner.feature.verb-selection-by-artifact-type
2943
+ type: requires
2944
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2945
+ - confidence: 1
2946
+ reason: the name rules gate the authoring path while the drift report covers the corpus already on disk; neither sees what the other sees
2947
+ source_ref: planner.wagon.name-is-verb-object
2948
+ target_ref: planner.artifact-naming.verb-object-corpus-drift
2949
+ type: runs_alongside
2950
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2951
+ - confidence: 1
2952
+ constraint: mandatory
2953
+ control: internal
2954
+ foundation: finish_to_start
2955
+ reason: the strict no-consume-cycle invariant is the exact (acyclicity) case of the complexity model
2956
+ source_ref: planner.wagon.no-consume-cycle
2957
+ strength: important
2958
+ target_ref: planner.wagon.complexity-model
2959
+ type: requires
2960
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2961
+ - confidence: 1
2962
+ constraint: mandatory
2963
+ control: external
2964
+ foundation: finish_to_start
2965
+ reason: produce/consume artifact names follow the naming pattern
2966
+ source_ref: planner.wagon.produce-consume-artifacts
2967
+ strength: important
2968
+ target_ref: planner.artifact-naming.naming-pattern
2969
+ type: requires
2970
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2971
+ - confidence: 1
2972
+ constraint: mandatory
2973
+ control: internal
2974
+ foundation: finish_to_start
2975
+ reason: produce/consume entries carry contract + telemetry URNs
2976
+ source_ref: planner.wagon.produce-consume-artifacts
2977
+ strength: important
2978
+ target_ref: planner.wagon.artifact-contracts
2979
+ type: requires
2980
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2981
+ - confidence: 1
2982
+ constraint: discretionary
2983
+ control: internal
2984
+ foundation: start_to_start
2985
+ reason: "produced artifacts' telemetry URNs materialize on the filesystem"
2986
+ source_ref: planner.wagon.produce-consume-artifacts
2987
+ strength: minor
2988
+ target_ref: planner.wagon.telemetry-filesystem
2989
+ type: runs_alongside
2990
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
2991
+ - confidence: 1
2992
+ constraint: mandatory
2993
+ control: internal
2994
+ foundation: finish_to_start
2995
+ reason: extraction produces the fields coherence checks validate
2996
+ source_ref: planner.wagon.refinement-extraction
2997
+ strength: important
2998
+ target_ref: planner.wagon.semantic-coherence
2999
+ type: enables
3000
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3001
+ - confidence: 1
3002
+ constraint: mandatory
3003
+ control: external
3004
+ foundation: finish_to_start
3005
+ reason: the wagon theme is selected from the canonical taxonomy
3006
+ source_ref: planner.wagon.refinement-extraction
3007
+ strength: important
3008
+ target_ref: planner.theme.canonical-taxonomy
3009
+ type: requires
3010
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3011
+ - confidence: 1
3012
+ constraint: mandatory
3013
+ control: internal
3014
+ foundation: finish_to_start
3015
+ reason: produce/consume extraction delegates to the artifact URN conventions
3016
+ source_ref: planner.wagon.refinement-extraction
3017
+ strength: important
3018
+ target_ref: planner.wagon.artifact-contracts
3019
+ type: requires
3020
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3021
+ - confidence: 1
3022
+ constraint: mandatory
3023
+ control: internal
3024
+ foundation: finish_to_start
3025
+ reason: coherence validates the extracted refinement fields
3026
+ source_ref: planner.wagon.semantic-coherence
3027
+ strength: important
3028
+ target_ref: planner.wagon.refinement-extraction
3029
+ type: follows
3030
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3031
+ - confidence: 1
3032
+ constraint: mandatory
3033
+ control: internal
3034
+ foundation: finish_to_start
3035
+ reason: coherence checks produce-owned / consume-foreign / external-scope rules
3036
+ source_ref: planner.wagon.semantic-coherence
3037
+ strength: important
3038
+ target_ref: planner.wagon.produce-consume-artifacts
3039
+ type: requires
3040
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3041
+ - confidence: 1
3042
+ constraint: discretionary
3043
+ control: external
3044
+ foundation: start_to_start
3045
+ reason: a wagon produced-URN theme must match its theme
3046
+ source_ref: planner.wagon.semantic-coherence
3047
+ strength: minor
3048
+ target_ref: planner.theme.urn-namespace-matches
3049
+ type: runs_alongside
3050
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3051
+ - confidence: 1
3052
+ constraint: mandatory
3053
+ control: internal
3054
+ foundation: finish_to_start
3055
+ reason: "separability operationalizes the complexity model's cohesion-vs-coupling comparison on the WMBT graph"
3056
+ source_ref: planner.wagon.separability
3057
+ strength: important
3058
+ target_ref: planner.wagon.complexity-model
3059
+ type: requires
3060
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3061
+ - confidence: 1
3062
+ constraint: discretionary
3063
+ control: internal
3064
+ foundation: start_to_start
3065
+ reason: semantic coherence and graph separability are two views of whether a wagon is one job
3066
+ source_ref: planner.wagon.separability
3067
+ strength: minor
3068
+ target_ref: planner.wagon.semantic-coherence
3069
+ type: runs_alongside
3070
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3071
+ - confidence: 1
3072
+ constraint: mandatory
3073
+ control: external
3074
+ foundation: finish_to_start
3075
+ reason: telemetry URNs follow the artifact-naming grammar
3076
+ source_ref: planner.wagon.telemetry-filesystem
3077
+ strength: important
3078
+ target_ref: planner.artifact-naming.naming-pattern
3079
+ type: requires
3080
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3081
+ - confidence: 1
3082
+ constraint: mandatory
3083
+ control: internal
3084
+ foundation: finish_to_start
3085
+ reason: the telemetry filesystem maps the telemetry URN form
3086
+ source_ref: planner.wagon.telemetry-filesystem
3087
+ strength: important
3088
+ target_ref: planner.wagon.artifact-contracts
3089
+ type: requires
3090
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3091
+ - confidence: 1
3092
+ constraint: mandatory
3093
+ control: internal
3094
+ foundation: finish_to_start
3095
+ reason: the plan/<slug>/ layout follows the logical-vs-filesystem split
3096
+ source_ref: planner.wagon.urn
3097
+ strength: important
3098
+ target_ref: planner.wagon.logical-vs-filesystem-naming
3099
+ type: requires
3100
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3101
+ - confidence: 1
3102
+ constraint: mandatory
3103
+ control: internal
3104
+ foundation: finish_to_start
3105
+ reason: the wagon urn rule presupposes the urn naming grammar
3106
+ source_ref: planner.wagon.urn
3107
+ strength: important
3108
+ target_ref: planner.wagon.urn-naming
3109
+ type: requires
3110
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3111
+ - confidence: 1
3112
+ constraint: discretionary
3113
+ control: internal
3114
+ foundation: start_to_start
3115
+ reason: "a wagon's stable URN is an instance of the stable-naming rule for planner artifacts"
3116
+ source_ref: planner.wagon.urn
3117
+ strength: minor
3118
+ target_ref: planner.artifact-naming.planner-artifacts-use-stable
3119
+ type: runs_alongside
3120
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3121
+ - confidence: 1
3122
+ constraint: discretionary
3123
+ control: external
3124
+ foundation: start_to_start
3125
+ reason: wagon and artifact names share the kebab grammar
3126
+ source_ref: planner.wagon.urn-naming
3127
+ strength: minor
3128
+ target_ref: planner.artifact-naming.naming-pattern
3129
+ type: runs_alongside
3130
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3131
+ - confidence: 1
3132
+ constraint: discretionary
3133
+ control: internal
3134
+ foundation: start_to_start
3135
+ reason: the slug derives from the wagon name
3136
+ source_ref: planner.wagon.urn-naming
3137
+ strength: minor
3138
+ target_ref: planner.wagon.slug-dirname-conversion
3139
+ type: runs_alongside
3140
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3141
+ - confidence: 1
3142
+ constraint: mandatory
3143
+ control: internal
3144
+ foundation: finish_to_finish
3145
+ reason: a WMBT picks one dimension
3146
+ source_ref: planner.wmbt.definition
3147
+ strength: important
3148
+ target_ref: planner.wmbt.dimension-selection
3149
+ type: requires
3150
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3151
+ - confidence: 1
3152
+ constraint: mandatory
3153
+ control: internal
3154
+ foundation: finish_to_finish
3155
+ reason: a WMBT picks one direction
3156
+ source_ref: planner.wmbt.definition
3157
+ strength: important
3158
+ target_ref: planner.wmbt.direction-selection
3159
+ type: requires
3160
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3161
+ - confidence: 1
3162
+ constraint: mandatory
3163
+ control: internal
3164
+ foundation: finish_to_finish
3165
+ reason: a WMBT picks one lens
3166
+ source_ref: planner.wmbt.definition
3167
+ strength: important
3168
+ target_ref: planner.wmbt.lens-selection
3169
+ type: requires
3170
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3171
+ - confidence: 1
3172
+ constraint: mandatory
3173
+ control: internal
3174
+ foundation: finish_to_finish
3175
+ reason: a WMBT must carry a smoke acceptance
3176
+ source_ref: planner.wmbt.definition
3177
+ strength: critical
3178
+ target_ref: planner.wmbt.must-have-smoke-acceptance
3179
+ type: requires
3180
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3181
+ - confidence: 1
3182
+ constraint: mandatory
3183
+ control: internal
3184
+ foundation: finish_to_finish
3185
+ reason: a WMBT is scoped to one object of control
3186
+ source_ref: planner.wmbt.definition
3187
+ strength: critical
3188
+ target_ref: planner.wmbt.object-of-control
3189
+ type: requires
3190
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3191
+ - confidence: 1
3192
+ constraint: mandatory
3193
+ control: internal
3194
+ foundation: finish_to_finish
3195
+ reason: a WMBT declares id statement proving-artifacts
3196
+ source_ref: planner.wmbt.definition
3197
+ strength: critical
3198
+ target_ref: planner.wmbt.shape
3199
+ type: requires
3200
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3201
+ - confidence: 1
3202
+ constraint: mandatory
3203
+ control: internal
3204
+ foundation: finish_to_finish
3205
+ reason: multi-axis WMBTs must split
3206
+ source_ref: planner.wmbt.definition
3207
+ strength: minor
3208
+ target_ref: planner.wmbt.splitting-rules
3209
+ type: requires
3210
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3211
+ - confidence: 1
3212
+ constraint: mandatory
3213
+ control: internal
3214
+ foundation: finish_to_finish
3215
+ reason: a WMBT follows the statement template
3216
+ source_ref: planner.wmbt.definition
3217
+ strength: important
3218
+ target_ref: planner.wmbt.statement-template
3219
+ type: requires
3220
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3221
+ - confidence: 1
3222
+ constraint: discretionary
3223
+ control: internal
3224
+ foundation: finish_to_start
3225
+ reason: "filename is the URN's step-coded sequence segment"
3226
+ source_ref: planner.wmbt.filename-pattern
3227
+ strength: minor
3228
+ target_ref: planner.wmbt.urn-naming
3229
+ type: follows
3230
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3231
+ - confidence: 1
3232
+ constraint: mandatory
3233
+ control: internal
3234
+ foundation: finish_to_start
3235
+ reason: the WMBT filename is step-coded
3236
+ source_ref: planner.wmbt.filename-pattern
3237
+ strength: important
3238
+ target_ref: planner.wmbt.step-code-vocabulary
3239
+ type: requires
3240
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3241
+ - confidence: 1
3242
+ constraint: mandatory
3243
+ control: internal
3244
+ foundation: start_to_start
3245
+ reason: one dimension and one lens are chosen together per WMBT
3246
+ source_ref: planner.wmbt.lens-selection
3247
+ strength: important
3248
+ target_ref: planner.wmbt.dimension-selection
3249
+ type: runs_alongside
3250
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3251
+ - confidence: 1
3252
+ constraint: mandatory
3253
+ control: internal
3254
+ foundation: finish_to_start
3255
+ reason: the smoke-acceptance rule applies once a WMBT is shaped
3256
+ source_ref: planner.wmbt.must-have-smoke-acceptance
3257
+ strength: important
3258
+ target_ref: planner.wmbt.shape
3259
+ type: follows
3260
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3261
+ - confidence: 1
3262
+ constraint: mandatory
3263
+ control: internal
3264
+ foundation: finish_to_start
3265
+ reason: "a SMOKE acceptance is defined by carrying the SMOKE harness token, so it depends on the harness-type rule"
3266
+ source_ref: planner.wmbt.must-have-smoke-acceptance
3267
+ strength: critical
3268
+ target_ref: "planner.acceptance.harness#harness_type"
3269
+ type: requires
3270
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3271
+ - confidence: 1
3272
+ constraint: mandatory
3273
+ control: external
3274
+ foundation: finish_to_start
3275
+ reason: the SMOKE token is a harness code from the acceptance harness vocabulary
3276
+ source_ref: planner.wmbt.must-have-smoke-acceptance
3277
+ strength: critical
3278
+ target_ref: "planner.acceptance.harness-vocabulary#harness_code"
3279
+ type: requires
3280
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3281
+ - confidence: 1
3282
+ constraint: mandatory
3283
+ control: internal
3284
+ foundation: finish_to_start
3285
+ reason: each WMBT carries one lens_ref from the catalog
3286
+ source_ref: planner.wmbt.shape
3287
+ strength: important
3288
+ target_ref: planner.wmbt.lens-selection
3289
+ type: requires
3290
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3291
+ - confidence: 1
3292
+ constraint: mandatory
3293
+ control: internal
3294
+ foundation: finish_to_start
3295
+ reason: a well-shaped WMBT declares a composed statement
3296
+ source_ref: planner.wmbt.shape
3297
+ strength: important
3298
+ target_ref: planner.wmbt.statement-template
3299
+ type: requires
3300
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3301
+ - confidence: 1
3302
+ constraint: mandatory
3303
+ control: internal
3304
+ foundation: finish_to_start
3305
+ reason: the WMBT id is the step-coded URN
3306
+ source_ref: planner.wmbt.shape
3307
+ strength: important
3308
+ target_ref: planner.wmbt.urn-naming
3309
+ type: requires
3310
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3311
+ - confidence: 1
3312
+ constraint: mandatory
3313
+ control: internal
3314
+ foundation: finish_to_start
3315
+ reason: a statement mixing dimensions must be split
3316
+ source_ref: planner.wmbt.splitting-rules
3317
+ strength: important
3318
+ target_ref: planner.wmbt.dimension-selection
3319
+ type: blocks
3320
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3321
+ - confidence: 1
3322
+ constraint: discretionary
3323
+ control: internal
3324
+ foundation: start_to_start
3325
+ reason: the <=5 acceptance cap aligns across conventions
3326
+ source_ref: planner.wmbt.splitting-rules
3327
+ strength: minor
3328
+ target_ref: planner.acceptance.max-per-wmbt
3329
+ type: runs_alongside
3330
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3331
+ - confidence: 1
3332
+ constraint: discretionary
3333
+ control: internal
3334
+ foundation: start_to_start
3335
+ reason: a WMBT splits when its statement mixes dimensions
3336
+ source_ref: planner.wmbt.splitting-rules
3337
+ strength: minor
3338
+ target_ref: planner.wmbt.dimension-selection
3339
+ type: runs_alongside
3340
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3341
+ - confidence: 1
3342
+ constraint: mandatory
3343
+ control: internal
3344
+ foundation: finish_to_start
3345
+ reason: the statement template appends the context clarifier
3346
+ source_ref: planner.wmbt.statement-template
3347
+ strength: minor
3348
+ target_ref: planner.wmbt.context-clarifier
3349
+ type: requires
3350
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3351
+ - confidence: 1
3352
+ constraint: mandatory
3353
+ control: internal
3354
+ foundation: finish_to_start
3355
+ reason: the statement template consumes the dimension
3356
+ source_ref: planner.wmbt.statement-template
3357
+ strength: important
3358
+ target_ref: planner.wmbt.dimension-selection
3359
+ type: requires
3360
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3361
+ - confidence: 1
3362
+ constraint: mandatory
3363
+ control: internal
3364
+ foundation: finish_to_start
3365
+ reason: the statement template consumes the direction
3366
+ source_ref: planner.wmbt.statement-template
3367
+ strength: important
3368
+ target_ref: planner.wmbt.direction-selection
3369
+ type: requires
3370
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3371
+ - confidence: 1
3372
+ constraint: mandatory
3373
+ control: internal
3374
+ foundation: finish_to_start
3375
+ reason: the statement template consumes the object of control
3376
+ source_ref: planner.wmbt.statement-template
3377
+ strength: important
3378
+ target_ref: planner.wmbt.object-of-control
3379
+ type: requires
3380
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3381
+ - confidence: 1
3382
+ constraint: mandatory
3383
+ control: internal
3384
+ foundation: finish_to_start
3385
+ reason: the WMBT URN embeds a step code
3386
+ source_ref: planner.wmbt.urn-naming
3387
+ strength: important
3388
+ target_ref: planner.wmbt.step-code-vocabulary
3389
+ type: requires
3390
+ origin: atdd@36ce055a:src/atdd/coach/graph/relationships.yaml
3391
+ - source_ref: coder.bun.wagon-honours-its-contract
3392
+ target_ref: coder.bun.interlocking-does-not-carry-cargo
3393
+ type: runs_alongside
3394
+ foundation: start_to_start
3395
+ constraint: discretionary
3396
+ control: internal
3397
+ strength: important
3398
+ confidence: 1
3399
+ reason: "The two halves of the artifact data plane. One keeps Cargo inside TrainRunner execution, the other requires the wagon at the end of that execution to move the artifacts its plan document declares. Neither implies the other, and a stack satisfying only one still lets the declared contract and the carried data disagree."
3400
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3401
+ - source_ref: coder.bun.green-urn-pattern
3402
+ target_ref: coder.bun.green-urn-marker
3403
+ type: requires
3404
+ foundation: finish_to_start
3405
+ constraint: mandatory
3406
+ control: internal
3407
+ strength: critical
3408
+ confidence: 1
3409
+ reason: "The six-segment shape can only be checked once a marker is present; absence is the marker rule's finding."
3410
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3411
+ - source_ref: coder.bun.green-urn-wagon-feature
3412
+ target_ref: coder.bun.green-urn-pattern
3413
+ type: requires
3414
+ foundation: finish_to_start
3415
+ constraint: mandatory
3416
+ control: internal
3417
+ strength: important
3418
+ confidence: 1
3419
+ reason: Segment grammar applies only after the segment count is known good.
3420
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3421
+ - source_ref: coder.bun.green-urn-name-matches
3422
+ target_ref: coder.bun.green-urn-pattern
3423
+ type: requires
3424
+ foundation: finish_to_start
3425
+ constraint: mandatory
3426
+ control: internal
3427
+ strength: important
3428
+ confidence: 1
3429
+ reason: "Reads segment 3, which exists only once the shape validates."
3430
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3431
+ - source_ref: coder.bun.green-urn-side
3432
+ target_ref: coder.bun.green-urn-pattern
3433
+ type: requires
3434
+ foundation: finish_to_start
3435
+ constraint: mandatory
3436
+ control: internal
3437
+ strength: important
3438
+ confidence: 1
3439
+ reason: "Reads segment 4, which exists only once the shape validates."
3440
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3441
+ - source_ref: coder.bun.green-urn-layer
3442
+ target_ref: coder.bun.green-urn-pattern
3443
+ type: requires
3444
+ foundation: finish_to_start
3445
+ constraint: mandatory
3446
+ control: internal
3447
+ strength: important
3448
+ confidence: 1
3449
+ reason: "Reads segment 5, which exists only once the shape validates."
3450
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3451
+ - source_ref: coder.bun.green-header-tested-by
3452
+ target_ref: coder.bun.green-urn-marker
3453
+ type: runs_alongside
3454
+ foundation: start_to_start
3455
+ constraint: mandatory
3456
+ control: internal
3457
+ strength: critical
3458
+ confidence: 1
3459
+ reason: "Two halves of the traceability loop: the URN says what the file IS, Tested-By what PROVES it."
3460
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3461
+ - source_ref: coder.bun.green-header-runtime
3462
+ target_ref: coder.bun.green-header-purpose
3463
+ type: runs_alongside
3464
+ foundation: start_to_start
3465
+ constraint: mandatory
3466
+ control: internal
3467
+ strength: minor
3468
+ confidence: 1
3469
+ reason: Both single-line header fields recovered from one parse of the same comment block.
3470
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3471
+ - source_ref: coder.bun.green-header-order
3472
+ target_ref: coder.bun.green-header-tested-by
3473
+ type: runs_alongside
3474
+ foundation: start_to_start
3475
+ constraint: mandatory
3476
+ control: internal
3477
+ strength: important
3478
+ confidence: 1
3479
+ reason: Order governs the arrangement of the very fields the other header rules require.
3480
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3481
+ - source_ref: coder.bun.green-urn-layer
3482
+ target_ref: coder.bun.design-hierarchy-import
3483
+ type: enables
3484
+ foundation: finish_to_start
3485
+ constraint: mandatory
3486
+ control: internal
3487
+ strength: important
3488
+ confidence: 1
3489
+ reason: The layer segment this rule validates is what the layering rules read to judge an import.
3490
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3491
+ - source_ref: coder.bun.complexity-nesting
3492
+ target_ref: coder.bun.complexity-cyclomatic
3493
+ type: runs_alongside
3494
+ foundation: start_to_start
3495
+ constraint: mandatory
3496
+ control: internal
3497
+ strength: important
3498
+ confidence: 1
3499
+ reason: Co-emitted per function from one extraction pass over the same brace-matched body.
3500
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3501
+ - source_ref: coder.bun.complexity-length
3502
+ target_ref: coder.bun.complexity-cyclomatic
3503
+ type: runs_alongside
3504
+ foundation: start_to_start
3505
+ constraint: mandatory
3506
+ control: internal
3507
+ strength: important
3508
+ confidence: 1
3509
+ reason: Co-emitted per function from one extraction pass over the same brace-matched body.
3510
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3511
+ - source_ref: coder.bun.quality-comments
3512
+ target_ref: coder.bun.quality-mi
3513
+ type: runs_alongside
3514
+ foundation: start_to_start
3515
+ constraint: mandatory
3516
+ control: internal
3517
+ strength: important
3518
+ confidence: 1
3519
+ reason: "The comment ratio is literally a term in the maintainability-index formula: one computation, two reported facts."
3520
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3521
+ - source_ref: coder.bun.quality-mi
3522
+ target_ref: coder.bun.complexity-cyclomatic
3523
+ type: runs_alongside
3524
+ foundation: start_to_start
3525
+ constraint: discretionary
3526
+ control: internal
3527
+ strength: minor
3528
+ confidence: 1
3529
+ reason: "MI judges the FILE, complexity its functions; a file can pass every function threshold and still be unmaintainable by size."
3530
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3531
+ - source_ref: coder.bun.duplication-intra-layer
3532
+ target_ref: coder.bun.dead-code-reachability
3533
+ type: runs_alongside
3534
+ foundation: start_to_start
3535
+ constraint: discretionary
3536
+ control: internal
3537
+ strength: minor
3538
+ confidence: 1
3539
+ reason: "Both read structure ACROSS files rather than within one, and both need the whole scan tree at once."
3540
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3541
+ - source_ref: coder.bun.dead-code-reachability
3542
+ target_ref: coder.bun.composition-root
3543
+ type: requires
3544
+ foundation: finish_to_start
3545
+ constraint: mandatory
3546
+ control: internal
3547
+ strength: important
3548
+ confidence: 1
3549
+ reason: Reachability is measured FROM the structural roots that composition-root confines wiring to.
3550
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3551
+ - source_ref: coder.bun.security-sql-injection
3552
+ target_ref: coder.bun.security-missing-auth
3553
+ type: runs_alongside
3554
+ foundation: start_to_start
3555
+ constraint: mandatory
3556
+ control: internal
3557
+ strength: critical
3558
+ confidence: 1
3559
+ reason: "Authorisation decides WHO may act, parameterisation what their input can DO; a boundary needs both."
3560
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3561
+ - source_ref: coder.bun.security-hardcoded-secret
3562
+ target_ref: coder.bun.security-missing-auth
3563
+ type: runs_alongside
3564
+ foundation: start_to_start
3565
+ constraint: mandatory
3566
+ control: internal
3567
+ strength: important
3568
+ confidence: 1
3569
+ reason: A leaked credential defeats the authorisation check the sibling rule requires.
3570
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3571
+ - source_ref: coder.bun.logging-structured
3572
+ target_ref: coder.bun.logging-console
3573
+ type: runs_alongside
3574
+ foundation: start_to_start
3575
+ constraint: mandatory
3576
+ control: internal
3577
+ strength: important
3578
+ confidence: 1
3579
+ reason: "One bans the wrong channel, the other requires context on the right one; either alone leaves logs unusable."
3580
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3581
+ - source_ref: coder.bun.error-response-code-format
3582
+ target_ref: coder.bun.error-response-bare-string
3583
+ type: requires
3584
+ foundation: finish_to_start
3585
+ constraint: mandatory
3586
+ control: internal
3587
+ strength: important
3588
+ confidence: 1
3589
+ reason: A structured payload must exist before its error code can be constrained.
3590
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3591
+ - source_ref: coder.bun.logging-structured
3592
+ target_ref: coder.bun.error-response-bare-string
3593
+ type: runs_alongside
3594
+ foundation: start_to_start
3595
+ constraint: discretionary
3596
+ control: internal
3597
+ strength: minor
3598
+ confidence: 1
3599
+ reason: "Both govern what a failure leaves behind: one for the operator, one for the caller."
3600
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3601
+ - source_ref: coder.bun.commons-domain-no-outbound
3602
+ target_ref: coder.bun.design-hierarchy-import
3603
+ type: requires
3604
+ foundation: start_to_start
3605
+ constraint: mandatory
3606
+ control: internal
3607
+ strength: important
3608
+ confidence: 1
3609
+ reason: "A specialization: the general inward-only rule, narrowed to the commons domain tree."
3610
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3611
+ - source_ref: coder.bun.commons-application-no-integration
3612
+ target_ref: coder.bun.design-hierarchy-import
3613
+ type: requires
3614
+ foundation: start_to_start
3615
+ constraint: mandatory
3616
+ control: internal
3617
+ strength: important
3618
+ confidence: 1
3619
+ reason: "A specialization: the general inward-only rule, narrowed to the commons application tree."
3620
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3621
+ - source_ref: coder.bun.commons-domain-no-framework-import
3622
+ target_ref: coder.bun.commons-domain-no-outbound
3623
+ type: requires
3624
+ foundation: finish_to_start
3625
+ constraint: mandatory
3626
+ control: internal
3627
+ strength: important
3628
+ confidence: 1
3629
+ reason: "Outbound bans project LAYERS; this additionally bans runtime machinery, so the domain runs with no server started."
3630
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3631
+ - source_ref: coder.bun.commons-cross-feature-imports-in
3632
+ target_ref: coder.bun.design-hierarchy-import
3633
+ type: runs_alongside
3634
+ foundation: start_to_start
3635
+ constraint: mandatory
3636
+ control: internal
3637
+ strength: important
3638
+ confidence: 1
3639
+ reason: The hierarchy governs VERTICAL edges between layers; this governs HORIZONTAL ones between sibling features.
3640
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3641
+ - source_ref: coder.bun.composition-consumer
3642
+ target_ref: coder.bun.composition-root
3643
+ type: runs_alongside
3644
+ foundation: start_to_start
3645
+ constraint: mandatory
3646
+ control: internal
3647
+ strength: critical
3648
+ confidence: 1
3649
+ reason: "Two halves of one discipline: where wiring MAY happen, and that consumers must ACCEPT what they are given."
3650
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3651
+ - source_ref: coder.bun.dto-placement
3652
+ target_ref: coder.bun.dto-purity
3653
+ type: runs_alongside
3654
+ foundation: start_to_start
3655
+ constraint: mandatory
3656
+ control: internal
3657
+ strength: important
3658
+ confidence: 1
3659
+ reason: "Purity governs a DTO's shape, placement its home; a pure DTO in the wrong layer still couples the boundary."
3660
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3661
+ - source_ref: coder.bun.dto-mapper
3662
+ target_ref: coder.bun.dto-placement
3663
+ type: runs_alongside
3664
+ foundation: start_to_start
3665
+ constraint: discretionary
3666
+ control: internal
3667
+ strength: minor
3668
+ confidence: 1
3669
+ reason: The mapper translates the type whose home this rule fixes; both keep the boundary in one place.
3670
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3671
+ - source_ref: coder.bun.layer-naming
3672
+ target_ref: coder.bun.design-hierarchy-import
3673
+ type: enables
3674
+ foundation: finish_to_start
3675
+ constraint: mandatory
3676
+ control: internal
3677
+ strength: critical
3678
+ confidence: 1
3679
+ reason: The layering rules can only read a layer that the naming rule guarantees is declared.
3680
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3681
+ - source_ref: coder.bun.boundaries-http-client
3682
+ target_ref: coder.bun.design-hierarchy-import
3683
+ type: runs_alongside
3684
+ foundation: start_to_start
3685
+ constraint: discretionary
3686
+ control: internal
3687
+ strength: minor
3688
+ confidence: 1
3689
+ reason: "Confines outbound transport to integration, which is the hierarchy's own home for it."
3690
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3691
+ - source_ref: coder.bun.runtime-single-lockfile
3692
+ target_ref: coder.bun.runtime-server-is-bun-serve
3693
+ type: runs_alongside
3694
+ foundation: start_to_start
3695
+ constraint: mandatory
3696
+ control: internal
3697
+ strength: important
3698
+ confidence: 1
3699
+ reason: "Both hold the stack decision itself: Bun's server, Bun's resolver."
3700
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3701
+ - source_ref: coder.bun.runtime-server-is-bun-serve
3702
+ target_ref: coder.bun.composition-root
3703
+ type: enables
3704
+ foundation: finish_to_start
3705
+ constraint: mandatory
3706
+ control: internal
3707
+ strength: important
3708
+ confidence: 1
3709
+ reason: server.ts is a composition root precisely BECAUSE Bun.serve is the assembly point of a full-stack Bun app.
3710
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3711
+ - source_ref: coder.bun.runtime-server-is-bun-serve
3712
+ target_ref: coder.bun.boundaries-http-client
3713
+ type: runs_alongside
3714
+ foundation: start_to_start
3715
+ constraint: discretionary
3716
+ control: internal
3717
+ strength: minor
3718
+ confidence: 1
3719
+ reason: "One governs the server you run, the other the client you call out with."
3720
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3721
+ - source_ref: coder.bun.green-header-order
3722
+ target_ref: coder.bun.green-header-runtime
3723
+ type: runs_alongside
3724
+ foundation: start_to_start
3725
+ constraint: mandatory
3726
+ control: internal
3727
+ strength: important
3728
+ confidence: 1
3729
+ reason: "The canonical order this rule enforces is URN -> Tested-By -> Runtime -> Purpose; Runtime and Purpose are the second half of the very sequence it governs, so they were never a separate concern."
3730
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3731
+ - source_ref: coder.bun.interlocking-resolution-model-exists
3732
+ target_ref: coder.bun.interlocking-runner-exists
3733
+ type: requires
3734
+ foundation: finish_to_start
3735
+ constraint: mandatory
3736
+ control: internal
3737
+ strength: critical
3738
+ confidence: 1
3739
+ reason: "A structured resolution is what resolveTrain RETURNS, so there is nothing to structure until the route-control layer exists. Runner first, then the shape of its verdict."
3740
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3741
+ - source_ref: coder.bun.interlocking-delegates-to-trainrunner
3742
+ target_ref: coder.bun.interlocking-runner-exists
3743
+ type: requires
3744
+ foundation: finish_to_start
3745
+ constraint: mandatory
3746
+ control: internal
3747
+ strength: critical
3748
+ confidence: 1
3749
+ reason: Delegation is a property OF the runner; a tree with no InterlockingRunner has nothing that could fail to delegate.
3750
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3751
+ - source_ref: coder.bun.interlocking-does-not-carry-cargo
3752
+ target_ref: coder.bun.interlocking-delegates-to-trainrunner
3753
+ type: runs_alongside
3754
+ foundation: start_to_start
3755
+ constraint: mandatory
3756
+ control: internal
3757
+ strength: critical
3758
+ confidence: 1
3759
+ reason: "The two halves of one idea: route control must not become execution. One forbids running the wagons, the other forbids touching the data plane they carry."
3760
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3761
+ - source_ref: coder.bun.station-master-interlocking-routing
3762
+ target_ref: coder.bun.interlocking-runner-exists
3763
+ type: requires
3764
+ foundation: finish_to_start
3765
+ constraint: mandatory
3766
+ control: internal
3767
+ strength: important
3768
+ confidence: 1
3769
+ reason: server.ts can only route THROUGH an InterlockingRunner that exists; the Station Master obligation presupposes the runtime one.
3770
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3771
+ - source_ref: coder.bun.interlocking-bilateral-binding
3772
+ target_ref: coder.bun.station-master-interlocking-routing
3773
+ type: requires
3774
+ foundation: finish_to_start
3775
+ constraint: mandatory
3776
+ control: internal
3777
+ strength: critical
3778
+ confidence: 1
3779
+ reason: "Bilateral binding closes declaration, runtime, station and trace against each other. Two of its five directions are Station Master directions, so the station wiring must hold before closure can be asserted."
3780
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3781
+ - source_ref: coder.bun.interlocking-bilateral-binding
3782
+ target_ref: coder.bun.composition-root
3783
+ type: runs_alongside
3784
+ foundation: start_to_start
3785
+ constraint: discretionary
3786
+ control: internal
3787
+ strength: minor
3788
+ confidence: 1
3789
+ reason: "Both govern server.ts as the composition root: one that collaborators are only instantiated there, the other that the JOURNEY_MAP it holds agrees with the declared route space."
3790
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3791
+ - source_ref: coder.bun.runtime-typecheck-enforced
3792
+ target_ref: coder.bun.interlocking-resolution-model-exists
3793
+ type: runs_alongside
3794
+ foundation: start_to_start
3795
+ constraint: mandatory
3796
+ control: internal
3797
+ strength: important
3798
+ confidence: 1
3799
+ reason: "Complementary halves of one guarantee about the resolution model. The shape rule proves an InterlockingResolution declaring the eight fields EXISTS; only a typechecker proves what resolveTrain actually returns conforms to it, and Bun runs .ts without checking."
3800
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3801
+ - source_ref: coder.bun.runtime-typecheck-enforced
3802
+ target_ref: coder.bun.runtime-single-lockfile
3803
+ type: runs_alongside
3804
+ foundation: start_to_start
3805
+ constraint: discretionary
3806
+ control: internal
3807
+ strength: minor
3808
+ confidence: 1
3809
+ reason: "Both are Bun runtime decisions read from package.json and its neighbours: one that a single resolver owns the dependency graph, the other that the types in it are actually checked."
3810
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3811
+ - source_ref: coder.bun.runtime-executes-the-declaration
3812
+ target_ref: coder.bun.interlocking-bilateral-binding
3813
+ type: requires
3814
+ foundation: finish_to_start
3815
+ constraint: mandatory
3816
+ control: internal
3817
+ strength: critical
3818
+ confidence: 1
3819
+ reason: "Bilateral binding closes a TEXT-level correspondence — literals in the runtime also appear in the plan. This asks the harder question underneath it: whether the runtime ever READS the plan, or merely restates it."
3820
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml
3821
+ - source_ref: coder.htmx.verb-endpoint-is-routed
3822
+ target_ref: coder.htmx.verb-mutation-signals-progress
3823
+ type: runs_alongside
3824
+ foundation: start_to_start
3825
+ constraint: discretionary
3826
+ control: internal
3827
+ strength: important
3828
+ confidence: 1
3829
+ reason: Two obligations on the same state-changing affordance. One requires it to tell the operator something is happening; this one requires it to reach a route the Station Master admits. A mutation can satisfy either alone and still be a button that signals progress while posting into nothing.
3830
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.htmx/relationships.yaml
3831
+ - source_ref: coder.htmx.verb-destructive-confirms
3832
+ target_ref: coder.htmx.verb-mutation-signals-progress
3833
+ type: runs_alongside
3834
+ foundation: start_to_start
3835
+ constraint: mandatory
3836
+ control: internal
3837
+ strength: important
3838
+ confidence: 1
3839
+ reason: "Both govern a mutating control: one guards INTENT before the request, the other FEEDBACK during it."
3840
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.htmx/relationships.yaml
3841
+ - source_ref: coder.htmx.swap-oob-carries-id
3842
+ target_ref: coder.htmx.swap-no-inline-handler
3843
+ type: runs_alongside
3844
+ foundation: start_to_start
3845
+ constraint: discretionary
3846
+ control: internal
3847
+ strength: minor
3848
+ confidence: 1
3849
+ reason: "Both concern what survives a swap: an oob element needs an id to land, an inline handler dies when its node is replaced."
3850
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.htmx/relationships.yaml
3851
+ - source_ref: coder.htmx.fragment-escapes-interpolation
3852
+ target_ref: coder.htmx.verb-endpoint-same-origin
3853
+ type: runs_alongside
3854
+ foundation: start_to_start
3855
+ constraint: mandatory
3856
+ control: internal
3857
+ strength: critical
3858
+ confidence: 1
3859
+ reason: "Both govern what reaches the live DOM: one the ORIGIN the markup came from, the other the DATA inside it."
3860
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.htmx/relationships.yaml
3861
+ - source_ref: coder.htmx.swap-no-inline-handler
3862
+ target_ref: coder.htmx.verb-destructive-confirms
3863
+ type: runs_alongside
3864
+ foundation: start_to_start
3865
+ constraint: discretionary
3866
+ control: internal
3867
+ strength: minor
3868
+ confidence: 1
3869
+ reason: Both replace imperative JavaScript with a declarative hx- attribute the swap lifecycle can see.
3870
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.htmx/relationships.yaml
3871
+ - source_ref: coder.htmx.verb-endpoint-same-origin
3872
+ target_ref: coder.htmx.verb-mutation-signals-progress
3873
+ type: runs_alongside
3874
+ foundation: start_to_start
3875
+ constraint: mandatory
3876
+ control: internal
3877
+ strength: important
3878
+ confidence: 1
3879
+ reason: "Both read the same hx- verb attributes: one judges WHERE the request goes, the other what the user sees while it is in flight."
3880
+ origin: atdd-extensions@3aa141e:official/atdd.extension.coder.htmx/relationships.yaml
3881
+ - source_ref: planner.docs.identity-required
3882
+ target_ref: planner.docs.asciidoc-only
3883
+ type: requires
3884
+ foundation: finish_to_start
3885
+ constraint: mandatory
3886
+ control: internal
3887
+ strength: critical
3888
+ confidence: 1
3889
+ reason: "A doc-id lives in an AsciiDoc attribute. A markdown document has nowhere to declare one, so format uniformity is the precondition for identity."
3890
+ origin: atdd-extensions@3aa141e:official/atdd.extension.planner.docs/relationships.yaml
3891
+ - source_ref: planner.docs.doc-id-unique
3892
+ target_ref: planner.docs.identity-required
3893
+ type: requires
3894
+ foundation: finish_to_start
3895
+ constraint: mandatory
3896
+ control: internal
3897
+ strength: critical
3898
+ confidence: 1
3899
+ reason: Uniqueness compares ids that were actually declared; a document with no doc-id is reported by identity-required and never counted as a collision here.
3900
+ origin: atdd-extensions@3aa141e:official/atdd.extension.planner.docs/relationships.yaml
3901
+ - source_ref: planner.docs.graph-target-resolves
3902
+ target_ref: planner.docs.doc-id-unique
3903
+ type: requires
3904
+ foundation: finish_to_start
3905
+ constraint: mandatory
3906
+ control: internal
3907
+ strength: critical
3908
+ confidence: 1
3909
+ reason: "Resolution needs exactly one target per id. Under a duplicate, :supersedes: cannot say which document it means, so uniqueness must hold before an edge can be said to resolve."
3910
+ origin: atdd-extensions@3aa141e:official/atdd.extension.planner.docs/relationships.yaml
3911
+ - source_ref: planner.docs.graph-target-resolves
3912
+ target_ref: planner.docs.identity-required
3913
+ type: requires
3914
+ foundation: finish_to_start
3915
+ constraint: mandatory
3916
+ control: internal
3917
+ strength: critical
3918
+ confidence: 1
3919
+ reason: "The declared-id set is built from :doc-id: attributes BEFORE any edge is resolved. This edge is the no-fabrication discipline expressed as an ordering: without the set first, the resolver would have to invent what it resolves against."
3920
+ origin: atdd-extensions@3aa141e:official/atdd.extension.planner.docs/relationships.yaml
3921
+ - source_ref: planner.docs.adr-registry-derived
3922
+ target_ref: planner.docs.graph-target-resolves
3923
+ type: requires
3924
+ foundation: finish_to_start
3925
+ constraint: mandatory
3926
+ control: internal
3927
+ strength: important
3928
+ confidence: 1
3929
+ reason: "The registry is a projection of :decides: edges, so it is only as trustworthy as edge resolution. An ADR deciding an undeclared node is reported by the resolver, never listed in the registry."
3930
+ origin: atdd-extensions@3aa141e:official/atdd.extension.planner.docs/relationships.yaml
3931
+ - source_ref: planner.docs.reference-integrity
3932
+ target_ref: planner.docs.asciidoc-only
3933
+ type: requires
3934
+ foundation: finish_to_start
3935
+ constraint: mandatory
3936
+ control: internal
3937
+ strength: important
3938
+ confidence: 1
3939
+ reason: "asciidoctor renders the authored corpus. A markdown file under docs/ is not an input the renderer can resolve references through, so the format rule bounds what reference-integrity can even see."
3940
+ origin: atdd-extensions@3aa141e:official/atdd.extension.planner.docs/relationships.yaml
3941
+ - source_ref: planner.docs.undeclared-change
3942
+ target_ref: planner.docs.artifact-path-shape
3943
+ type: runs_alongside
3944
+ foundation: start_to_start
3945
+ constraint: mandatory
3946
+ control: internal
3947
+ strength: critical
3948
+ confidence: 1
3949
+ reason: "The two halves of the declaration check: one asks whether a declared path is SHAPED like documentation, the other whether a documentation change was declared at all. Together they close the loop core opens; neither alone does."
3950
+ origin: atdd-extensions@3aa141e:official/atdd.extension.planner.docs/relationships.yaml
3951
+ - source_ref: planner.docs.area-index-required
3952
+ target_ref: planner.docs.asciidoc-only
3953
+ type: runs_alongside
3954
+ foundation: start_to_start
3955
+ constraint: discretionary
3956
+ control: internal
3957
+ strength: minor
3958
+ confidence: 1
3959
+ reason: "Both are canonical-tree shape rules read from the same scan of docs/: one governs what an area contains, the other what format its files are in."
3960
+ origin: atdd-extensions@3aa141e:official/atdd.extension.planner.docs/relationships.yaml
3961
+ - source_ref: tester.bun.acceptance-resolves-to-declared
3962
+ target_ref: tester.bun.acceptance-binding-declared
3963
+ type: requires
3964
+ foundation: finish_to_start
3965
+ constraint: mandatory
3966
+ control: internal
3967
+ strength: critical
3968
+ confidence: 1
3969
+ reason: "One requires the binding to EXIST, the other requires it to be TRUE. There is nothing to resolve until a header is present, so presence is settled first; together they close the gap where a test named an acceptance that was never declared and every rule stayed silent."
3970
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
3971
+ - source_ref: tester.bun.acceptance-binding-declared
3972
+ target_ref: tester.bun.test-carries-urn-identity
3973
+ type: requires
3974
+ foundation: finish_to_start
3975
+ constraint: mandatory
3976
+ control: internal
3977
+ strength: critical
3978
+ confidence: 1
3979
+ reason: "Identity first, then what it proves; a binding with no URN has nothing to bind."
3980
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
3981
+ - source_ref: tester.bun.test-phase-declared
3982
+ target_ref: tester.bun.test-carries-urn-identity
3983
+ type: requires
3984
+ foundation: finish_to_start
3985
+ constraint: mandatory
3986
+ control: internal
3987
+ strength: critical
3988
+ confidence: 1
3989
+ reason: The phase is read from the same header block and is meaningless without the URN.
3990
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
3991
+ - source_ref: tester.bun.routing-runtime-family
3992
+ target_ref: tester.bun.test-carries-urn-identity
3993
+ type: requires
3994
+ foundation: finish_to_start
3995
+ constraint: mandatory
3996
+ control: internal
3997
+ strength: minor
3998
+ confidence: 1
3999
+ reason: Another optional header field validated from the same parse.
4000
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4001
+ - source_ref: tester.bun.acceptance-covers-tag-well-formed
4002
+ target_ref: tester.bun.acceptance-binding-declared
4003
+ type: runs_alongside
4004
+ foundation: start_to_start
4005
+ constraint: mandatory
4006
+ control: internal
4007
+ strength: important
4008
+ confidence: 1
4009
+ reason: "The two-level binding model: the header binds the FILE, a @covers tag binds one CASE."
4010
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4011
+ - source_ref: tester.bun.red-fails-first
4012
+ target_ref: tester.bun.red-behavioral-assertion
4013
+ type: runs_alongside
4014
+ foundation: start_to_start
4015
+ constraint: mandatory
4016
+ control: internal
4017
+ strength: critical
4018
+ confidence: 1
4019
+ reason: "One requires a guaranteed-fail marker, the other that the assertions are behavioural; a RED test needs both."
4020
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4021
+ - source_ref: tester.bun.red-behavioral-assertion
4022
+ target_ref: tester.bun.test-phase-declared
4023
+ type: requires
4024
+ foundation: finish_to_start
4025
+ constraint: mandatory
4026
+ control: internal
4027
+ strength: important
4028
+ confidence: 1
4029
+ reason: Only evaluable once a phase is declared; an undeclared test is exempt from the whole phase surface.
4030
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4031
+ - source_ref: tester.bun.smoke-no-collaborator-substitution
4032
+ target_ref: tester.bun.smoke-observable-assertion
4033
+ type: runs_alongside
4034
+ foundation: start_to_start
4035
+ constraint: mandatory
4036
+ control: internal
4037
+ strength: critical
4038
+ confidence: 1
4039
+ reason: "Both keep SMOKE honest: real collaborators, and an assertion on what an operator could witness."
4040
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4041
+ - source_ref: tester.bun.security-input
4042
+ target_ref: tester.bun.security-auth
4043
+ type: runs_alongside
4044
+ foundation: start_to_start
4045
+ constraint: mandatory
4046
+ control: internal
4047
+ strength: critical
4048
+ confidence: 1
4049
+ reason: Authorisation and input validation are the two halves of one boundary; a happy-path test of either is a silent green gap.
4050
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4051
+ - source_ref: tester.bun.telemetry-emit
4052
+ target_ref: tester.bun.smoke-observable-assertion
4053
+ type: runs_alongside
4054
+ foundation: start_to_start
4055
+ constraint: discretionary
4056
+ control: internal
4057
+ strength: minor
4058
+ confidence: 1
4059
+ reason: Both demand an assertion on an external EFFECT rather than on a returned value.
4060
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4061
+ - source_ref: tester.bun.test-no-self-skip
4062
+ target_ref: tester.bun.red-fails-first
4063
+ type: runs_alongside
4064
+ foundation: start_to_start
4065
+ constraint: mandatory
4066
+ control: internal
4067
+ strength: important
4068
+ confidence: 1
4069
+ reason: "They share a vocabulary and must not contradict: `.fails`/`.failing` is an accepted RED marker, so it is deliberately not treated as a self-skip."
4070
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4071
+ - source_ref: tester.bun.test-isolation-no-live-state
4072
+ target_ref: tester.bun.smoke-no-collaborator-substitution
4073
+ type: runs_alongside
4074
+ foundation: start_to_start
4075
+ constraint: discretionary
4076
+ control: internal
4077
+ strength: minor
4078
+ confidence: 1
4079
+ reason: Both govern what a test is allowed to touch outside itself.
4080
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4081
+ - source_ref: tester.bun.test-imports-bun-test
4082
+ target_ref: tester.bun.routing-runtime-family
4083
+ type: runs_alongside
4084
+ foundation: start_to_start
4085
+ constraint: mandatory
4086
+ control: internal
4087
+ strength: important
4088
+ confidence: 1
4089
+ reason: "One checks the DECLARED runner, the other the IMPORTED harness; they must agree or the gate credits a runner that never ran the test."
4090
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4091
+ - source_ref: tester.bun.smoke-observable-assertion
4092
+ target_ref: tester.bun.test-phase-declared
4093
+ type: requires
4094
+ foundation: finish_to_start
4095
+ constraint: mandatory
4096
+ control: internal
4097
+ strength: important
4098
+ confidence: 1
4099
+ reason: "Only evaluable once a phase is declared, exactly as red-behavioral-assertion is; an undeclared test escapes the SMOKE surface entirely."
4100
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4101
+ - source_ref: tester.bun.security-auth
4102
+ target_ref: tester.bun.telemetry-emit
4103
+ type: runs_alongside
4104
+ foundation: start_to_start
4105
+ constraint: discretionary
4106
+ control: internal
4107
+ strength: minor
4108
+ confidence: 1
4109
+ reason: "One shape, three kinds: a test whose URN declares its kind must carry the assertion that kind implies, or it is a silent green gap."
4110
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4111
+ - source_ref: tester.bun.interlocking-production-runner-used
4112
+ target_ref: tester.bun.interlocking-route-coverage
4113
+ type: requires
4114
+ foundation: finish_to_start
4115
+ constraint: mandatory
4116
+ control: internal
4117
+ strength: critical
4118
+ confidence: 1
4119
+ reason: "Coverage counts a route as proven only if the covering test drove the real runners. A route covered by a test that mocks the route-control path is a DESCRIPTIVE green, so production-runner-used is what makes route-coverage mean anything."
4120
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4121
+ - source_ref: tester.bun.interlocking-smoke-coverage-for-station-master
4122
+ target_ref: tester.bun.interlocking-route-coverage
4123
+ type: runs_alongside
4124
+ foundation: start_to_start
4125
+ constraint: mandatory
4126
+ control: internal
4127
+ strength: important
4128
+ confidence: 1
4129
+ reason: "Two coverage obligations over the same declaration: one per admissible ROUTE, one per exposed Station Master ACTION. The criticality signal for the second is the core entrypoint.exposed field, never a heuristic."
4130
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4131
+ - source_ref: tester.bun.interlocking-trace-binds-declared-route
4132
+ target_ref: tester.bun.interlocking-route-coverage
4133
+ type: requires
4134
+ foundation: finish_to_start
4135
+ constraint: mandatory
4136
+ control: internal
4137
+ strength: critical
4138
+ confidence: 1
4139
+ reason: "A covering test proves a route ran; only the bound trace proves WHICH route ran. Without the binding fields the run could resolve the wrong route, category or guard and the coverage test would still pass."
4140
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4141
+ - source_ref: tester.bun.interlocking-route-coverage
4142
+ target_ref: tester.bun.acceptance-binding-declared
4143
+ type: runs_alongside
4144
+ foundation: start_to_start
4145
+ constraint: discretionary
4146
+ control: internal
4147
+ strength: minor
4148
+ confidence: 1
4149
+ reason: "Both bind the suite back to a planner declaration: one to the acceptance criterion a test covers, the other to the guarded route it exercises."
4150
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4151
+ - source_ref: tester.bun.interlocking-train-sequence-is-exercised
4152
+ target_ref: tester.bun.interlocking-route-coverage
4153
+ type: requires
4154
+ foundation: finish_to_start
4155
+ constraint: mandatory
4156
+ control: internal
4157
+ strength: critical
4158
+ confidence: 1
4159
+ reason: "Route coverage proves WHICH train a route selects; this proves WHAT it ran. A train whose wagon sequence is wrong is selected correctly and executes the wrong thing, so selection coverage must hold before execution coverage means anything."
4160
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml
4161
+ - source_ref: tester.htmx.swap-oob-asserts-destination-id
4162
+ target_ref: tester.htmx.fragment-asserts-returned-markup
4163
+ type: requires
4164
+ foundation: finish_to_start
4165
+ constraint: mandatory
4166
+ control: internal
4167
+ strength: important
4168
+ confidence: 1
4169
+ reason: "Asserting the destination id is a specific case of asserting the fragment at all: a test that never reaches the body cannot reach the id inside it."
4170
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.htmx/relationships.yaml
4171
+ - source_ref: tester.htmx.verb-endpoint-coverage
4172
+ target_ref: tester.htmx.fragment-asserts-returned-markup
4173
+ type: runs_alongside
4174
+ foundation: start_to_start
4175
+ constraint: mandatory
4176
+ control: internal
4177
+ strength: important
4178
+ confidence: 1
4179
+ reason: "Two halves of one guarantee: coverage says every declared endpoint HAS a test, fragment-asserts-markup says that test looks at what the endpoint actually returns."
4180
+ origin: atdd-extensions@3aa141e:official/atdd.extension.tester.htmx/relationships.yaml
4181
+ - confidence: 1
4182
+ constraint: mandatory
4183
+ control: internal
4184
+ foundation: finish_to_start
4185
+ reason: decoding the nominal and sibling trains supplies what a journey composes across interlockings
4186
+ source_ref: planner.decomposition.train-journey
4187
+ strength: important
4188
+ target_ref: planner.journey.definition
4189
+ type: enables
4190
+ origin: "@afokapu/atdd-bun"
4191
+ - confidence: 1
4192
+ constraint: mandatory
4193
+ control: internal
4194
+ foundation: finish_to_start
4195
+ reason: continuation closure validates the journey topology the definition describes
4196
+ source_ref: planner.journey.continuation-closure
4197
+ strength: critical
4198
+ target_ref: planner.journey.definition
4199
+ type: requires
4200
+ origin: "@afokapu/atdd-bun"
4201
+ - confidence: 1
4202
+ constraint: mandatory
4203
+ control: internal
4204
+ foundation: finish_to_start
4205
+ reason: "an interlocking is judged composed against what a journey is: its entrypoint and its continuations"
4206
+ source_ref: planner.journey.interlocking-composed
4207
+ strength: critical
4208
+ target_ref: planner.journey.definition
4209
+ type: requires
4210
+ origin: "@afokapu/atdd-bun"
4211
+ - confidence: 1
4212
+ constraint: mandatory
4213
+ control: internal
4214
+ foundation: start_to_start
4215
+ reason: "two halves of journey closure: continuation closure checks the journeys a plan declares, composition checks that no interlocking is left outside every journey, which closure alone passes vacuously"
4216
+ source_ref: planner.journey.interlocking-composed
4217
+ strength: critical
4218
+ target_ref: planner.journey.continuation-closure
4219
+ type: runs_alongside
4220
+ origin: "@afokapu/atdd-bun"
4221
+ - confidence: 1
4222
+ constraint: mandatory
4223
+ control: internal
4224
+ foundation: finish_to_start
4225
+ reason: JourneyRunner executes the continuation topology the plan declares; without a declared journey there is nothing for it to compose
4226
+ source_ref: coder.bun.journey-runner-boundary
4227
+ strength: critical
4228
+ target_ref: planner.journey.definition
4229
+ type: requires
4230
+ origin: "@afokapu/atdd-bun"
4231
+ - confidence: 1
4232
+ constraint: mandatory
4233
+ control: internal
4234
+ foundation: finish_to_start
4235
+ reason: JourneyRunner is the continuation layer above InterlockingRunner and delegates each routing decision to it
4236
+ source_ref: coder.bun.journey-runner-boundary
4237
+ strength: critical
4238
+ target_ref: coder.bun.interlocking-runner-exists
4239
+ type: requires
4240
+ origin: "@afokapu/atdd-bun"
4241
+ - confidence: 1
4242
+ constraint: mandatory
4243
+ control: internal
4244
+ foundation: finish_to_start
4245
+ reason: "an exposed journey is reached through JourneyRunner, so the runner boundary must hold before routing to it"
4246
+ source_ref: coder.bun.station-master-journey-routing
4247
+ strength: critical
4248
+ target_ref: coder.bun.journey-runner-boundary
4249
+ type: requires
4250
+ origin: "@afokapu/atdd-bun"
4251
+ - confidence: 1
4252
+ constraint: mandatory
4253
+ control: internal
4254
+ foundation: start_to_start
4255
+ reason: "the two Station Master routing obligations: exposed journeys through JOURNEY_MAP, exposed interlockings through their own mapping"
4256
+ source_ref: coder.bun.station-master-journey-routing
4257
+ strength: important
4258
+ target_ref: coder.bun.station-master-interlocking-routing
4259
+ type: runs_alongside
4260
+ origin: "@afokapu/atdd-bun"
4261
+ - confidence: 1
4262
+ constraint: mandatory
4263
+ control: internal
4264
+ foundation: finish_to_start
4265
+ reason: the journey view is rendered from the journey topology the plan declares
4266
+ source_ref: planner.docs.journey-view-current
4267
+ strength: critical
4268
+ target_ref: planner.journey.definition
4269
+ type: requires
4270
+ origin: "@afokapu/atdd-bun"
4271
+ - confidence: 1
4272
+ constraint: mandatory
4273
+ control: internal
4274
+ foundation: finish_to_start
4275
+ reason: the generated page is a document like any other and must carry its doc-id and status
4276
+ source_ref: planner.docs.journey-view-current
4277
+ strength: important
4278
+ target_ref: planner.docs.identity-required
4279
+ type: requires
4280
+ origin: "@afokapu/atdd-bun"
4281
+ - confidence: 1
4282
+ constraint: mandatory
4283
+ control: internal
4284
+ foundation: start_to_start
4285
+ reason: "both keep the rendered documentation truthful: one that references resolve, the other that the drawn journeys are the planned ones"
4286
+ source_ref: planner.docs.journey-view-current
4287
+ strength: important
4288
+ target_ref: planner.docs.reference-integrity
4289
+ type: runs_alongside
4290
+ origin: "@afokapu/atdd-bun"
4291
+ - confidence: 1
4292
+ constraint: mandatory
4293
+ control: internal
4294
+ foundation: finish_to_start
4295
+ reason: a testing witness can only resolve once one is declared
4296
+ source_ref: traceability.source.tested-by-resolves
4297
+ strength: critical
4298
+ target_ref: traceability.source.tested-by-present
4299
+ type: requires
4300
+ origin: "@afokapu/atdd-bun"
4301
+ - confidence: 1
4302
+ constraint: mandatory
4303
+ control: internal
4304
+ foundation: start_to_start
4305
+ reason: "the same Tested-By header, read by the closure check and by the coder header rule"
4306
+ source_ref: traceability.source.tested-by-present
4307
+ strength: important
4308
+ target_ref: coder.bun.green-header-tested-by
4309
+ type: runs_alongside
4310
+ origin: "@afokapu/atdd-bun"
4311
+ - confidence: 1
4312
+ constraint: mandatory
4313
+ control: internal
4314
+ foundation: finish_to_start
4315
+ reason: "a test's binding must be declared before it can be resolved against the plan"
4316
+ source_ref: traceability.test.binding-resolves
4317
+ strength: critical
4318
+ target_ref: tester.bun.acceptance-binding-declared
4319
+ type: requires
4320
+ origin: "@afokapu/atdd-bun"
4321
+ - confidence: 1
4322
+ constraint: mandatory
4323
+ control: internal
4324
+ foundation: start_to_start
4325
+ reason: "the two directions of plan-test closure: every acceptance has a test, and every test names an acceptance that exists"
4326
+ source_ref: traceability.plan.executable-acceptance-has-test
4327
+ strength: critical
4328
+ target_ref: traceability.test.binding-resolves
4329
+ type: runs_alongside
4330
+ origin: "@afokapu/atdd-bun"
4331
+ - confidence: 1
4332
+ constraint: mandatory
4333
+ control: internal
4334
+ foundation: start_to_start
4335
+ reason: source-to-test and test-to-plan links chain into plan to test to implementation closure
4336
+ source_ref: traceability.source.tested-by-resolves
4337
+ strength: important
4338
+ target_ref: traceability.test.binding-resolves
4339
+ type: runs_alongside
4340
+ origin: "@afokapu/atdd-bun"
4341
+ - confidence: 1
4342
+ constraint: mandatory
4343
+ control: internal
4344
+ foundation: finish_to_start
4345
+ reason: "Bun realization of the core obligation coder.design.hierarchy-import, checked over .tsx, .jsx, .html and .css"
4346
+ source_ref: coder.bun.design-dependency-flow
4347
+ strength: important
4348
+ target_ref: coder.design.hierarchy-import
4349
+ type: requires
4350
+ origin: "@afokapu/atdd-bun"
4351
+ - confidence: 1
4352
+ constraint: mandatory
4353
+ control: internal
4354
+ foundation: finish_to_start
4355
+ reason: "Bun realization of the core obligation coder.design.hierarchy-import, checked over .tsx, .jsx, .html and .css"
4356
+ source_ref: coder.bun.design-wagons-import
4357
+ strength: important
4358
+ target_ref: coder.design.hierarchy-import
4359
+ type: requires
4360
+ origin: "@afokapu/atdd-bun"
4361
+ - confidence: 1
4362
+ constraint: mandatory
4363
+ control: internal
4364
+ foundation: finish_to_start
4365
+ reason: "Bun realization of the core obligation coder.design.foundations, checked over .tsx, .jsx, .html and .css"
4366
+ source_ref: coder.bun.design-tokens-pure
4367
+ strength: important
4368
+ target_ref: coder.design.foundations
4369
+ type: requires
4370
+ origin: "@afokapu/atdd-bun"
4371
+ - confidence: 1
4372
+ constraint: mandatory
4373
+ control: internal
4374
+ foundation: finish_to_start
4375
+ reason: "Bun realization of the core obligation coder.design.token-color, checked over .tsx, .jsx, .html and .css"
4376
+ source_ref: coder.bun.design-token-color
4377
+ strength: important
4378
+ target_ref: coder.design.token-color
4379
+ type: requires
4380
+ origin: "@afokapu/atdd-bun"
4381
+ - confidence: 1
4382
+ constraint: mandatory
4383
+ control: internal
4384
+ foundation: finish_to_start
4385
+ reason: "Bun realization of the core obligation coder.design.token-hardcoded, checked over .tsx, .jsx, .html and .css"
4386
+ source_ref: coder.bun.design-token-hardcoded
4387
+ strength: important
4388
+ target_ref: coder.design.token-hardcoded
4389
+ type: requires
4390
+ origin: "@afokapu/atdd-bun"
4391
+ - confidence: 1
4392
+ constraint: mandatory
4393
+ control: internal
4394
+ foundation: finish_to_start
4395
+ reason: "Bun realization of the core obligation coder.design.primitives, checked over .tsx, .jsx, .html and .css"
4396
+ source_ref: coder.bun.design-primitives
4397
+ strength: important
4398
+ target_ref: coder.design.primitives
4399
+ type: requires
4400
+ origin: "@afokapu/atdd-bun"
4401
+ - confidence: 1
4402
+ constraint: mandatory
4403
+ control: internal
4404
+ foundation: finish_to_start
4405
+ reason: "Bun realization of the core obligation coder.design.orphan-ui, checked over .tsx, .jsx, .html and .css"
4406
+ source_ref: coder.bun.design-connected
4407
+ strength: important
4408
+ target_ref: coder.design.orphan-ui
4409
+ type: requires
4410
+ origin: "@afokapu/atdd-bun"
4411
+ - confidence: 1
4412
+ constraint: mandatory
4413
+ control: internal
4414
+ foundation: finish_to_start
4415
+ reason: "Bun realization of the core obligation coder.design.orphan-export, checked over .tsx, .jsx, .html and .css"
4416
+ source_ref: coder.bun.design-orphan-export
4417
+ strength: important
4418
+ target_ref: coder.design.orphan-export
4419
+ type: requires
4420
+ origin: "@afokapu/atdd-bun"
4421
+ - confidence: 1
4422
+ constraint: mandatory
4423
+ control: internal
4424
+ foundation: start_to_start
4425
+ reason: "two halves of coder.design.hierarchy-import: imports flow down the layers, and never out into app code"
4426
+ source_ref: coder.bun.design-dependency-flow
4427
+ strength: critical
4428
+ target_ref: coder.bun.design-wagons-import
4429
+ type: runs_alongside
4430
+ origin: "@afokapu/atdd-bun"
4431
+ - confidence: 1
4432
+ constraint: mandatory
4433
+ control: internal
4434
+ foundation: finish_to_start
4435
+ reason: colors can only be referenced from tokens once the tokens layer holds pure values
4436
+ source_ref: coder.bun.design-token-color
4437
+ strength: important
4438
+ target_ref: coder.bun.design-tokens-pure
4439
+ type: requires
4440
+ origin: "@afokapu/atdd-bun"
4441
+ - confidence: 1
4442
+ constraint: mandatory
4443
+ control: internal
4444
+ foundation: start_to_start
4445
+ reason: "colors, and spacing, radii and durations: together, every visual value outside the tokens layer comes from tokens"
4446
+ source_ref: coder.bun.design-token-color
4447
+ strength: important
4448
+ target_ref: coder.bun.design-token-hardcoded
4449
+ type: runs_alongside
4450
+ origin: "@afokapu/atdd-bun"
4451
+ - confidence: 1
4452
+ constraint: mandatory
4453
+ control: internal
4454
+ foundation: start_to_start
4455
+ reason: "a rendering component must use the design system, and render its controls through primitives"
4456
+ source_ref: coder.bun.design-connected
4457
+ strength: important
4458
+ target_ref: coder.bun.design-primitives
4459
+ type: runs_alongside
4460
+ origin: "@afokapu/atdd-bun"
4461
+ - confidence: 1
4462
+ constraint: mandatory
4463
+ control: internal
4464
+ foundation: start_to_start
4465
+ reason: "code layering and design-system layering: both require dependencies to point in one direction"
4466
+ source_ref: coder.bun.design-dependency-flow
4467
+ strength: important
4468
+ target_ref: coder.bun.design-hierarchy-import
4469
+ type: runs_alongside
4470
+ origin: "@afokapu/atdd-bun"
4471
+ - confidence: 1
4472
+ constraint: mandatory
4473
+ control: internal
4474
+ foundation: finish_to_start
4475
+ reason: "browser specs are recognised by their *.e2e.ts name, which is what brings them under the journey header rules"
4476
+ source_ref: tester.htmx.e2e-spec-naming
4477
+ strength: important
4478
+ target_ref: tester.htmx.journey-binding-header
4479
+ type: enables
4480
+ origin: "@afokapu/atdd-bun"
4481
+ - confidence: 1
4482
+ constraint: mandatory
4483
+ control: internal
4484
+ foundation: finish_to_start
4485
+ reason: a URN can only be checked against the subject once the binding names one
4486
+ source_ref: tester.htmx.journey-urn-format
4487
+ strength: critical
4488
+ target_ref: tester.htmx.journey-binding-header
4489
+ type: requires
4490
+ origin: "@afokapu/atdd-bun"
4491
+ - confidence: 1
4492
+ constraint: mandatory
4493
+ control: internal
4494
+ foundation: start_to_start
4495
+ reason: "the same journey header block: binding and layer are read together"
4496
+ source_ref: tester.htmx.journey-layer-assembly
4497
+ strength: important
4498
+ target_ref: tester.htmx.journey-binding-header
4499
+ type: runs_alongside
4500
+ origin: "@afokapu/atdd-bun"
4501
+ - confidence: 1
4502
+ constraint: mandatory
4503
+ control: internal
4504
+ foundation: start_to_start
4505
+ reason: "the two exclusive test identities: a journey spec binds to a train or journey, an acceptance test to its acceptance"
4506
+ source_ref: tester.htmx.journey-no-acceptance-marker
4507
+ strength: important
4508
+ target_ref: tester.bun.acceptance-binding-declared
4509
+ type: runs_alongside
4510
+ origin: "@afokapu/atdd-bun"
4511
+ - confidence: 1
4512
+ constraint: mandatory
4513
+ control: internal
4514
+ foundation: finish_to_start
4515
+ reason: a binding must be well-formed before it can be resolved against plan/
4516
+ source_ref: tester.htmx.e2e-binds-declared-subject
4517
+ strength: critical
4518
+ target_ref: tester.htmx.journey-binding-header
4519
+ type: requires
4520
+ origin: "@afokapu/atdd-bun"
4521
+ - confidence: 1
4522
+ constraint: mandatory
4523
+ control: internal
4524
+ foundation: finish_to_start
4525
+ reason: only a declared train can be checked for a route that selects it
4526
+ source_ref: tester.htmx.covered-train-is-routed
4527
+ strength: critical
4528
+ target_ref: tester.htmx.e2e-binds-declared-subject
4529
+ type: requires
4530
+ origin: "@afokapu/atdd-bun"
4531
+ - confidence: 1
4532
+ constraint: mandatory
4533
+ control: internal
4534
+ foundation: start_to_start
4535
+ reason: "the two directions between trains and browser specs: every train has a spec, and every covered train is reachable"
4536
+ source_ref: tester.htmx.train-e2e-coverage
4537
+ strength: important
4538
+ target_ref: tester.htmx.covered-train-is-routed
4539
+ type: runs_alongside
4540
+ origin: "@afokapu/atdd-bun"
4541
+ - confidence: 1
4542
+ constraint: mandatory
4543
+ control: internal
4544
+ foundation: start_to_start
4545
+ reason: browser coverage per train beside runner-level coverage per interlocking route
4546
+ source_ref: tester.htmx.train-e2e-coverage
4547
+ strength: important
4548
+ target_ref: tester.bun.interlocking-route-coverage
4549
+ type: runs_alongside
4550
+ origin: "@afokapu/atdd-bun"
4551
+ - confidence: 1
4552
+ constraint: mandatory
4553
+ control: internal
4554
+ foundation: finish_to_start
4555
+ reason: exposed journeys are the ones a journey declares with an exposed entrypoint
4556
+ source_ref: tester.htmx.exposed-journey-e2e-coverage
4557
+ strength: critical
4558
+ target_ref: planner.journey.definition
4559
+ type: requires
4560
+ origin: "@afokapu/atdd-bun"
4561
+ - confidence: 1
4562
+ constraint: mandatory
4563
+ control: internal
4564
+ foundation: start_to_start
4565
+ reason: a journey run end to end in a browser beside each exposed interlocking action smoke-tested through the Station Master
4566
+ source_ref: tester.htmx.exposed-journey-e2e-coverage
4567
+ strength: important
4568
+ target_ref: tester.bun.interlocking-smoke-coverage-for-station-master
4569
+ type: runs_alongside
4570
+ origin: "@afokapu/atdd-bun"
4571
+ - confidence: 1
4572
+ constraint: mandatory
4573
+ control: internal
4574
+ foundation: start_to_start
4575
+ reason: a presentation component is proven rendered by a smoke that asserts on what the user can observe
4576
+ source_ref: tester.htmx.presentation-smoke-coverage
4577
+ strength: important
4578
+ target_ref: tester.bun.smoke-observable-assertion
4579
+ type: runs_alongside
4580
+ origin: "@afokapu/atdd-bun"
4581
+ - confidence: 1
4582
+ constraint: mandatory
4583
+ control: internal
4584
+ foundation: finish_to_start
4585
+ reason: an accessibility spec is identified by its A11Y harness code
4586
+ source_ref: tester.htmx.a11y-harness
4587
+ strength: important
4588
+ target_ref: tester.htmx.journey-urn-format
4589
+ type: requires
4590
+ origin: "@afokapu/atdd-bun"
4591
+ - confidence: 1
4592
+ constraint: mandatory
4593
+ control: internal
4594
+ foundation: finish_to_start
4595
+ reason: a visual spec is identified by its VIS harness code
4596
+ source_ref: tester.htmx.visual-harness
4597
+ strength: important
4598
+ target_ref: tester.htmx.journey-urn-format
4599
+ type: requires
4600
+ origin: "@afokapu/atdd-bun"
4601
+ - confidence: 1
4602
+ constraint: mandatory
4603
+ control: internal
4604
+ foundation: finish_to_start
4605
+ reason: a responsive spec is identified by its RESP harness code
4606
+ source_ref: tester.htmx.responsive-harness
4607
+ strength: important
4608
+ target_ref: tester.htmx.journey-urn-format
4609
+ type: requires
4610
+ origin: "@afokapu/atdd-bun"
4611
+ - confidence: 1
4612
+ constraint: mandatory
4613
+ control: internal
4614
+ foundation: finish_to_start
4615
+ reason: a journey counts as covered only by a RESP spec that meets the responsive harness
4616
+ source_ref: tester.htmx.responsive-journey-coverage
4617
+ strength: critical
4618
+ target_ref: tester.htmx.responsive-harness
4619
+ type: requires
4620
+ origin: "@afokapu/atdd-bun"
4621
+ - confidence: 1
4622
+ constraint: mandatory
4623
+ control: internal
4624
+ foundation: start_to_start
4625
+ reason: "the same exposed journeys, proven to run and proven to fit every viewport"
4626
+ source_ref: tester.htmx.responsive-journey-coverage
4627
+ strength: important
4628
+ target_ref: tester.htmx.exposed-journey-e2e-coverage
4629
+ type: runs_alongside
4630
+ origin: "@afokapu/atdd-bun"
4631
+ - confidence: 1
4632
+ constraint: mandatory
4633
+ control: internal
4634
+ foundation: finish_to_start
4635
+ reason: Bun/htmx realization of the Vite journey header obligation
4636
+ source_ref: tester.htmx.journey-binding-header
4637
+ strength: important
4638
+ target_ref: tester.vite.journey-train-header
4639
+ type: requires
4640
+ origin: "@afokapu/atdd-bun"
4641
+ - confidence: 1
4642
+ constraint: mandatory
4643
+ control: internal
4644
+ foundation: finish_to_start
4645
+ reason: Bun/htmx realization of the Vite journey URN grammar
4646
+ source_ref: tester.htmx.journey-urn-format
4647
+ strength: important
4648
+ target_ref: tester.vite.journey-urn-format
4649
+ type: requires
4650
+ origin: "@afokapu/atdd-bun"
4651
+ - confidence: 1
4652
+ constraint: mandatory
4653
+ control: internal
4654
+ foundation: finish_to_start
4655
+ reason: Bun/htmx realization of the Vite layer rule
4656
+ source_ref: tester.htmx.journey-layer-assembly
4657
+ strength: important
4658
+ target_ref: tester.vite.journey-layer-assembly
4659
+ type: requires
4660
+ origin: "@afokapu/atdd-bun"
4661
+ - confidence: 1
4662
+ constraint: mandatory
4663
+ control: internal
4664
+ foundation: finish_to_start
4665
+ reason: Bun/htmx realization of the Vite exclusive-identity rule
4666
+ source_ref: tester.htmx.journey-no-acceptance-marker
4667
+ strength: important
4668
+ target_ref: tester.vite.journey-no-acceptance-marker
4669
+ type: requires
4670
+ origin: "@afokapu/atdd-bun"
4671
+ - confidence: 1
4672
+ constraint: mandatory
4673
+ control: internal
4674
+ foundation: finish_to_start
4675
+ reason: "Bun/htmx realization of the Vite orphaned-spec rule, extended to journeys"
4676
+ source_ref: tester.htmx.e2e-binds-declared-subject
4677
+ strength: important
4678
+ target_ref: tester.vite.e2e-names-valid-train
4679
+ type: requires
4680
+ origin: "@afokapu/atdd-bun"
4681
+ - confidence: 1
4682
+ constraint: mandatory
4683
+ control: internal
4684
+ foundation: finish_to_start
4685
+ reason: "Bun/htmx realization, judged against interlocking routes in plan/"
4686
+ source_ref: tester.htmx.covered-train-is-routed
4687
+ strength: important
4688
+ target_ref: tester.vite.covered-train-is-routed
4689
+ type: requires
4690
+ origin: "@afokapu/atdd-bun"
4691
+ - confidence: 1
4692
+ constraint: mandatory
4693
+ control: internal
4694
+ foundation: finish_to_start
4695
+ reason: Bun/htmx realization of the Vite train coverage rule
4696
+ source_ref: tester.htmx.train-e2e-coverage
4697
+ strength: important
4698
+ target_ref: tester.vite.train-e2e-coverage
4699
+ type: requires
4700
+ origin: "@afokapu/atdd-bun"
4701
+ - confidence: 1
4702
+ constraint: mandatory
4703
+ control: internal
4704
+ foundation: finish_to_start
4705
+ reason: Bun/htmx realization of the Vite presentation smoke rule
4706
+ source_ref: tester.htmx.presentation-smoke-coverage
4707
+ strength: important
4708
+ target_ref: tester.vite.presentation-smoke-coverage
4709
+ type: requires
4710
+ origin: "@afokapu/atdd-bun"
4711
+ - confidence: 1
4712
+ constraint: mandatory
4713
+ control: internal
4714
+ foundation: finish_to_start
4715
+ reason: Bun/htmx realization of the Vite accessibility harness
4716
+ source_ref: tester.htmx.a11y-harness
4717
+ strength: important
4718
+ target_ref: tester.vite.a11y-harness
4719
+ type: requires
4720
+ origin: "@afokapu/atdd-bun"
4721
+ - confidence: 1
4722
+ constraint: mandatory
4723
+ control: internal
4724
+ foundation: finish_to_start
4725
+ reason: Bun/htmx realization of the Vite visual harness
4726
+ source_ref: tester.htmx.visual-harness
4727
+ strength: important
4728
+ target_ref: tester.vite.visual-harness
4729
+ type: requires
4730
+ origin: "@afokapu/atdd-bun"
4731
+ - confidence: 1
4732
+ constraint: mandatory
4733
+ control: internal
4734
+ foundation: finish_to_start
4735
+ reason: widths only mean device widths once the document declares a device-width viewport
4736
+ source_ref: coder.bun.responsive-viewport-meta
4737
+ strength: critical
4738
+ target_ref: coder.bun.responsive-no-fixed-width
4739
+ type: enables
4740
+ origin: "@afokapu/atdd-bun"
4741
+ - confidence: 1
4742
+ constraint: mandatory
4743
+ control: internal
4744
+ foundation: start_to_start
4745
+ reason: "what a layout may be wide, and where it may switch: together, a layout that adapts at the declared widths"
4746
+ source_ref: coder.bun.responsive-no-fixed-width
4747
+ strength: important
4748
+ target_ref: coder.bun.responsive-breakpoints-declared
4749
+ type: runs_alongside
4750
+ origin: "@afokapu/atdd-bun"
4751
+ - confidence: 1
4752
+ constraint: mandatory
4753
+ control: internal
4754
+ foundation: start_to_start
4755
+ reason: "breakpoints are declared once like tokens, because media queries cannot read custom properties"
4756
+ source_ref: coder.bun.responsive-breakpoints-declared
4757
+ strength: important
4758
+ target_ref: coder.bun.design-token-hardcoded
4759
+ type: runs_alongside
4760
+ origin: "@afokapu/atdd-bun"
4761
+ - confidence: 1
4762
+ constraint: mandatory
4763
+ control: internal
4764
+ foundation: finish_to_start
4765
+ reason: a browser can only prove a page fits a phone once the page declares a device-width viewport
4766
+ source_ref: tester.htmx.responsive-harness
4767
+ strength: critical
4768
+ target_ref: coder.bun.responsive-viewport-meta
4769
+ type: requires
4770
+ origin: "@afokapu/atdd-bun"
4771
+ - confidence: 1
4772
+ constraint: mandatory
4773
+ control: internal
4774
+ foundation: start_to_start
4775
+ reason: the static cause and the rendered proof of horizontal overflow
4776
+ source_ref: tester.htmx.responsive-harness
4777
+ strength: important
4778
+ target_ref: coder.bun.responsive-no-fixed-width
4779
+ type: runs_alongside
4780
+ origin: "@afokapu/atdd-bun"
4781
+ - confidence: 1
4782
+ constraint: mandatory
4783
+ control: internal
4784
+ foundation: start_to_start
4785
+ reason: a viewport that blocks zoom is an accessibility failure as well as a responsive one
4786
+ source_ref: coder.bun.responsive-viewport-meta
4787
+ strength: important
4788
+ target_ref: tester.htmx.a11y-harness
4789
+ type: runs_alongside
4790
+ origin: "@afokapu/atdd-bun"