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