@afokapu/atdd-bun 0.10.31 → 0.10.33

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 (66) hide show
  1. package/README.md +14 -120
  2. package/conventions/_profiles/architecture.yaml +190 -0
  3. package/conventions/_profiles/coder.yaml +804 -0
  4. package/conventions/_profiles/design.yaml +219 -0
  5. package/conventions/_profiles/docs.yaml +136 -0
  6. package/conventions/_profiles/htmx.yaml +436 -0
  7. package/conventions/_profiles/interlocking.yaml +248 -0
  8. package/conventions/_profiles/metrics.yaml +80 -0
  9. package/conventions/_profiles/planner.yaml +789 -0
  10. package/conventions/_profiles/runtime.yaml +62 -0
  11. package/conventions/_profiles/security.yaml +70 -0
  12. package/conventions/_profiles/telemetry.yaml +196 -0
  13. package/conventions/_profiles/tester.yaml +734 -0
  14. package/conventions/_profiles/topology.yaml +192 -0
  15. package/conventions/_profiles/traceability.yaml +94 -0
  16. package/conventions/atdd-bun.profiles/atdd-bun.profiles.presets.convention.yaml +21 -3
  17. package/conventions/planner.docs/planner.docs.area-index-required.convention.yaml +2 -2
  18. package/conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml +1 -1
  19. package/conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml +0 -1
  20. package/conventions/planner.docs/planner.docs.identity-required.convention.yaml +1 -1
  21. package/conventions/planner.docs/planner.docs.undeclared-change.convention.yaml +1 -2
  22. package/detectors/bun_interlocking_coverage/checks/interlocking_train_sequence.mjs +7 -5
  23. package/detectors/planner_docs_capability/README.md +1 -1
  24. package/integrity.json +36 -50
  25. package/package.json +1 -1
  26. package/relationships.yaml +0 -151
  27. package/src/agent.ts +15 -31
  28. package/src/cli.ts +7 -8
  29. package/src/docs-capability.ts +6 -24
  30. package/src/enforce.ts +8 -9
  31. package/src/hooks.ts +4 -8
  32. package/src/index.ts +1 -2
  33. package/src/integrity.ts +3 -11
  34. package/src/profile-registry.ts +74 -0
  35. package/src/setup.ts +3 -5
  36. package/templates/agents/AGENTS.block.md +4 -8
  37. package/templates/github/atdd-bun.yml +0 -5
  38. package/conventions/delivery/delivery.approved-sha-resolves.convention.yaml +0 -33
  39. package/conventions/delivery/delivery.board.convention.yaml +0 -60
  40. package/conventions/delivery/delivery.config-schema.convention.yaml +0 -49
  41. package/conventions/delivery/delivery.evidence-schema.convention.yaml +0 -34
  42. package/conventions/delivery/delivery.findings-resolved.convention.yaml +0 -42
  43. package/conventions/delivery/delivery.merge-gate.convention.yaml +0 -46
  44. package/conventions/delivery/delivery.model-allowed.convention.yaml +0 -29
  45. package/conventions/delivery/delivery.operating-model.convention.yaml +0 -97
  46. package/conventions/delivery/delivery.review.convention.yaml +0 -42
  47. package/conventions/delivery/delivery.reviewer-independent.convention.yaml +0 -34
  48. package/conventions/delivery/delivery.stages-complete.convention.yaml +0 -33
  49. package/detectors/delivery_evidence/atdd.implementation.yaml +0 -33
  50. package/detectors/delivery_evidence/detect.mjs +0 -9
  51. package/detectors/delivery_evidence/fixtures/clean/atdd-bun.yaml +0 -8
  52. package/detectors/delivery_evidence/fixtures/clean/docs/delivery/tranches/api/evidence.yaml +0 -54
  53. package/detectors/delivery_evidence/fixtures/dirty/atdd-bun.yaml +0 -3
  54. package/detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/api/evidence.yaml +0 -31
  55. package/detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/data/evidence.yaml +0 -8
  56. package/detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/orphan/README.md +0 -1
  57. package/detectors/delivery_evidence/fixtures/dirty/docs/delivery/tranches/ui/evidence.yaml +0 -5
  58. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/delivery/release.adoc +0 -10
  59. package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/purpose/index.adoc +0 -5
  60. package/planner-schemas/delivery-config.schema.json +0 -95
  61. package/planner-schemas/delivery-evidence.schema.json +0 -103
  62. package/src/board-ui.ts +0 -91
  63. package/src/board.ts +0 -222
  64. package/src/delivery.ts +0 -567
  65. package/templates/agents/atdd/SKILL.md +0 -20
  66. package/templates/agents/delivery/SKILL.md +0 -15
@@ -0,0 +1,804 @@
1
+ schema_version: "1.0.0"
2
+ profile: "coder"
3
+ implementations:
4
+ - "atdd_topology"
5
+ - "bun_clean_architecture_detector"
6
+ - "bun_design_system_detector"
7
+ - "bun_fullstack_detector"
8
+ - "bun_green_traceability_detector"
9
+ - "bun_responsive_detector"
10
+ - "bun_ts_metrics_detector"
11
+ conventions:
12
+ - rule_id: "atdd-bun.topology.e2e-location"
13
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.e2e-location.convention.yaml"
14
+ - rule_id: "atdd-bun.topology.feature-source-coverage"
15
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.feature-source-coverage.convention.yaml"
16
+ - rule_id: "atdd-bun.topology.feature-test-coverage"
17
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.feature-test-coverage.convention.yaml"
18
+ - rule_id: "atdd-bun.topology.plan-location"
19
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.plan-location.convention.yaml"
20
+ - rule_id: "atdd-bun.topology.source-location"
21
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.source-location.convention.yaml"
22
+ - rule_id: "atdd-bun.topology.test-location"
23
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.test-location.convention.yaml"
24
+ - rule_id: "coder.bun.boundaries-http-client"
25
+ path: "conventions/coder.bun/coder.bun.boundaries-http-client.convention.yaml"
26
+ - rule_id: "coder.bun.commons-application-no-integration"
27
+ path: "conventions/coder.bun/coder.bun.commons-application-no-integration.convention.yaml"
28
+ - rule_id: "coder.bun.commons-cross-feature-imports-in"
29
+ path: "conventions/coder.bun/coder.bun.commons-cross-feature-imports-in.convention.yaml"
30
+ - rule_id: "coder.bun.commons-domain-no-framework-import"
31
+ path: "conventions/coder.bun/coder.bun.commons-domain-no-framework-import.convention.yaml"
32
+ - rule_id: "coder.bun.commons-domain-no-outbound"
33
+ path: "conventions/coder.bun/coder.bun.commons-domain-no-outbound.convention.yaml"
34
+ - rule_id: "coder.bun.complexity-cyclomatic"
35
+ path: "conventions/coder.bun/coder.bun.complexity-cyclomatic.convention.yaml"
36
+ - rule_id: "coder.bun.complexity-length"
37
+ path: "conventions/coder.bun/coder.bun.complexity-length.convention.yaml"
38
+ - rule_id: "coder.bun.complexity-nesting"
39
+ path: "conventions/coder.bun/coder.bun.complexity-nesting.convention.yaml"
40
+ - rule_id: "coder.bun.composition-consumer"
41
+ path: "conventions/coder.bun/coder.bun.composition-consumer.convention.yaml"
42
+ - rule_id: "coder.bun.composition-root"
43
+ path: "conventions/coder.bun/coder.bun.composition-root.convention.yaml"
44
+ - rule_id: "coder.bun.dead-code-reachability"
45
+ path: "conventions/coder.bun/coder.bun.dead-code-reachability.convention.yaml"
46
+ - rule_id: "coder.bun.design-connected"
47
+ path: "conventions/coder.bun/coder.bun.design-connected.convention.yaml"
48
+ - rule_id: "coder.bun.design-dependency-flow"
49
+ path: "conventions/coder.bun/coder.bun.design-dependency-flow.convention.yaml"
50
+ - rule_id: "coder.bun.design-hierarchy-import"
51
+ path: "conventions/coder.bun/coder.bun.design-hierarchy-import.convention.yaml"
52
+ - rule_id: "coder.bun.design-orphan-export"
53
+ path: "conventions/coder.bun/coder.bun.design-orphan-export.convention.yaml"
54
+ - rule_id: "coder.bun.design-primitives"
55
+ path: "conventions/coder.bun/coder.bun.design-primitives.convention.yaml"
56
+ - rule_id: "coder.bun.design-token-color"
57
+ path: "conventions/coder.bun/coder.bun.design-token-color.convention.yaml"
58
+ - rule_id: "coder.bun.design-token-hardcoded"
59
+ path: "conventions/coder.bun/coder.bun.design-token-hardcoded.convention.yaml"
60
+ - rule_id: "coder.bun.design-tokens-pure"
61
+ path: "conventions/coder.bun/coder.bun.design-tokens-pure.convention.yaml"
62
+ - rule_id: "coder.bun.design-wagons-import"
63
+ path: "conventions/coder.bun/coder.bun.design-wagons-import.convention.yaml"
64
+ - rule_id: "coder.bun.dto-mapper"
65
+ path: "conventions/coder.bun/coder.bun.dto-mapper.convention.yaml"
66
+ - rule_id: "coder.bun.dto-placement"
67
+ path: "conventions/coder.bun/coder.bun.dto-placement.convention.yaml"
68
+ - rule_id: "coder.bun.dto-purity"
69
+ path: "conventions/coder.bun/coder.bun.dto-purity.convention.yaml"
70
+ - rule_id: "coder.bun.duplication-intra-layer"
71
+ path: "conventions/coder.bun/coder.bun.duplication-intra-layer.convention.yaml"
72
+ - rule_id: "coder.bun.green-header-order"
73
+ path: "conventions/coder.bun/coder.bun.green-header-order.convention.yaml"
74
+ - rule_id: "coder.bun.green-header-purpose"
75
+ path: "conventions/coder.bun/coder.bun.green-header-purpose.convention.yaml"
76
+ - rule_id: "coder.bun.green-header-runtime"
77
+ path: "conventions/coder.bun/coder.bun.green-header-runtime.convention.yaml"
78
+ - rule_id: "coder.bun.green-header-tested-by"
79
+ path: "conventions/coder.bun/coder.bun.green-header-tested-by.convention.yaml"
80
+ - rule_id: "coder.bun.green-urn-layer"
81
+ path: "conventions/coder.bun/coder.bun.green-urn-layer.convention.yaml"
82
+ - rule_id: "coder.bun.green-urn-marker"
83
+ path: "conventions/coder.bun/coder.bun.green-urn-marker.convention.yaml"
84
+ - rule_id: "coder.bun.green-urn-name-matches"
85
+ path: "conventions/coder.bun/coder.bun.green-urn-name-matches.convention.yaml"
86
+ - rule_id: "coder.bun.green-urn-pattern"
87
+ path: "conventions/coder.bun/coder.bun.green-urn-pattern.convention.yaml"
88
+ - rule_id: "coder.bun.green-urn-side"
89
+ path: "conventions/coder.bun/coder.bun.green-urn-side.convention.yaml"
90
+ - rule_id: "coder.bun.green-urn-wagon-feature"
91
+ path: "conventions/coder.bun/coder.bun.green-urn-wagon-feature.convention.yaml"
92
+ - rule_id: "coder.bun.layer-naming"
93
+ path: "conventions/coder.bun/coder.bun.layer-naming.convention.yaml"
94
+ - rule_id: "coder.bun.quality-comments"
95
+ path: "conventions/coder.bun/coder.bun.quality-comments.convention.yaml"
96
+ - rule_id: "coder.bun.quality-mi"
97
+ path: "conventions/coder.bun/coder.bun.quality-mi.convention.yaml"
98
+ - rule_id: "coder.bun.responsive-breakpoints-declared"
99
+ path: "conventions/coder.bun/coder.bun.responsive-breakpoints-declared.convention.yaml"
100
+ - rule_id: "coder.bun.responsive-no-fixed-width"
101
+ path: "conventions/coder.bun/coder.bun.responsive-no-fixed-width.convention.yaml"
102
+ - rule_id: "coder.bun.responsive-viewport-meta"
103
+ path: "conventions/coder.bun/coder.bun.responsive-viewport-meta.convention.yaml"
104
+ - rule_id: "coder.bun.runtime-server-is-bun-serve"
105
+ path: "conventions/coder.bun/coder.bun.runtime-server-is-bun-serve.convention.yaml"
106
+ - rule_id: "coder.bun.runtime-single-lockfile"
107
+ path: "conventions/coder.bun/coder.bun.runtime-single-lockfile.convention.yaml"
108
+ - rule_id: "coder.bun.runtime-typecheck-enforced"
109
+ path: "conventions/coder.bun/coder.bun.runtime-typecheck-enforced.convention.yaml"
110
+ - rule_id: "planner.feature.wagon-link"
111
+ path: "planner-nodes/nodes/planner.feature.wagon-link.convention.yaml"
112
+ - rule_id: "planner.wagon.features"
113
+ path: "planner-nodes/nodes/planner.wagon.features.convention.yaml"
114
+ relationships:
115
+ - confidence: 1
116
+ constraint: "mandatory"
117
+ control: "internal"
118
+ foundation: "finish_to_start"
119
+ origin: "@afokapu/atdd-bun"
120
+ reason: "journey E2E paths are derived from the journeys the plan declares"
121
+ source_ref: "atdd-bun.topology.e2e-location"
122
+ strength: "critical"
123
+ target_ref: "planner.journey.definition"
124
+ type: "requires"
125
+ - confidence: 1
126
+ constraint: "mandatory"
127
+ control: "internal"
128
+ foundation: "start_to_start"
129
+ origin: "@afokapu/atdd-bun"
130
+ reason: "every route has an end-to-end proof: at its canonical path, and exercising the production runner"
131
+ source_ref: "atdd-bun.topology.e2e-location"
132
+ strength: "important"
133
+ target_ref: "tester.bun.interlocking-route-coverage"
134
+ type: "runs_alongside"
135
+ - confidence: 1
136
+ constraint: "mandatory"
137
+ control: "internal"
138
+ foundation: "start_to_start"
139
+ origin: "@afokapu/atdd-bun"
140
+ reason: "on a frontend journey a browser spec is the route's end-to-end proof"
141
+ source_ref: "atdd-bun.topology.e2e-location"
142
+ strength: "important"
143
+ target_ref: "tester.htmx.train-e2e-coverage"
144
+ type: "runs_alongside"
145
+ - confidence: 1
146
+ constraint: "mandatory"
147
+ control: "internal"
148
+ foundation: "finish_to_start"
149
+ origin: "@afokapu/atdd-bun"
150
+ reason: "coverage counts only source placed beneath its feature"
151
+ source_ref: "atdd-bun.topology.feature-source-coverage"
152
+ strength: "critical"
153
+ target_ref: "atdd-bun.topology.source-location"
154
+ type: "requires"
155
+ - confidence: 1
156
+ constraint: "mandatory"
157
+ control: "internal"
158
+ foundation: "start_to_start"
159
+ origin: "@afokapu/atdd-bun"
160
+ reason: "a feature with WMBTs is implemented and tested"
161
+ source_ref: "atdd-bun.topology.feature-test-coverage"
162
+ strength: "important"
163
+ target_ref: "atdd-bun.topology.feature-source-coverage"
164
+ type: "runs_alongside"
165
+ - confidence: 1
166
+ constraint: "mandatory"
167
+ control: "internal"
168
+ foundation: "finish_to_start"
169
+ origin: "@afokapu/atdd-bun"
170
+ reason: "coverage counts only tests placed beneath their feature and bound to its acceptances"
171
+ source_ref: "atdd-bun.topology.feature-test-coverage"
172
+ strength: "critical"
173
+ target_ref: "atdd-bun.topology.test-location"
174
+ type: "requires"
175
+ - confidence: 1
176
+ constraint: "mandatory"
177
+ control: "internal"
178
+ foundation: "start_to_start"
179
+ origin: "@afokapu/atdd-bun"
180
+ reason: "where a feature lives and which wagon owns it: the same ownership, by path and by link"
181
+ source_ref: "atdd-bun.topology.plan-location"
182
+ strength: "important"
183
+ target_ref: "planner.feature.wagon-link"
184
+ type: "runs_alongside"
185
+ - confidence: 1
186
+ constraint: "mandatory"
187
+ control: "internal"
188
+ foundation: "finish_to_start"
189
+ origin: "@afokapu/atdd-bun"
190
+ reason: "features are placed by path once the wagon's feature decomposition is declared"
191
+ source_ref: "atdd-bun.topology.plan-location"
192
+ strength: "critical"
193
+ target_ref: "planner.wagon.features"
194
+ type: "requires"
195
+ - confidence: 1
196
+ constraint: "mandatory"
197
+ control: "internal"
198
+ foundation: "finish_to_start"
199
+ origin: "@afokapu/atdd-bun"
200
+ reason: "source is placed beneath a feature the plan declares at its canonical path"
201
+ source_ref: "atdd-bun.topology.source-location"
202
+ strength: "critical"
203
+ target_ref: "atdd-bun.topology.plan-location"
204
+ type: "requires"
205
+ - confidence: 1
206
+ constraint: "mandatory"
207
+ control: "internal"
208
+ foundation: "start_to_start"
209
+ origin: "@afokapu/atdd-bun"
210
+ reason: "the same component URN, read for its grammar and for where the file must live"
211
+ source_ref: "atdd-bun.topology.source-location"
212
+ strength: "important"
213
+ target_ref: "coder.bun.green-urn-pattern"
214
+ type: "runs_alongside"
215
+ - confidence: 1
216
+ constraint: "mandatory"
217
+ control: "internal"
218
+ foundation: "finish_to_start"
219
+ origin: "@afokapu/atdd-bun"
220
+ reason: "tests are placed beneath a feature the plan declares"
221
+ source_ref: "atdd-bun.topology.test-location"
222
+ strength: "critical"
223
+ target_ref: "atdd-bun.topology.plan-location"
224
+ type: "requires"
225
+ - confidence: 1
226
+ constraint: "mandatory"
227
+ control: "internal"
228
+ foundation: "start_to_start"
229
+ origin: "@afokapu/atdd-bun"
230
+ reason: "the acceptance a test binds, read for presence and for whether a WMBT declares it"
231
+ source_ref: "atdd-bun.topology.test-location"
232
+ strength: "important"
233
+ target_ref: "tester.bun.acceptance-binding-declared"
234
+ type: "runs_alongside"
235
+ - confidence: 1
236
+ constraint: "discretionary"
237
+ control: "internal"
238
+ foundation: "start_to_start"
239
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
240
+ reason: "Confines outbound transport to integration, which is the hierarchy's own home for it."
241
+ source_ref: "coder.bun.boundaries-http-client"
242
+ strength: "minor"
243
+ target_ref: "coder.bun.design-hierarchy-import"
244
+ type: "runs_alongside"
245
+ - confidence: 1
246
+ constraint: "mandatory"
247
+ control: "internal"
248
+ foundation: "start_to_start"
249
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
250
+ reason: "A specialization: the general inward-only rule, narrowed to the commons application tree."
251
+ source_ref: "coder.bun.commons-application-no-integration"
252
+ strength: "important"
253
+ target_ref: "coder.bun.design-hierarchy-import"
254
+ type: "requires"
255
+ - confidence: 1
256
+ constraint: "mandatory"
257
+ control: "internal"
258
+ foundation: "start_to_start"
259
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
260
+ reason: "The hierarchy governs VERTICAL edges between layers; this governs HORIZONTAL ones between sibling features."
261
+ source_ref: "coder.bun.commons-cross-feature-imports-in"
262
+ strength: "important"
263
+ target_ref: "coder.bun.design-hierarchy-import"
264
+ type: "runs_alongside"
265
+ - confidence: 1
266
+ constraint: "mandatory"
267
+ control: "internal"
268
+ foundation: "finish_to_start"
269
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
270
+ reason: "Outbound bans project LAYERS; this additionally bans runtime machinery, so the domain runs with no server started."
271
+ source_ref: "coder.bun.commons-domain-no-framework-import"
272
+ strength: "important"
273
+ target_ref: "coder.bun.commons-domain-no-outbound"
274
+ type: "requires"
275
+ - confidence: 1
276
+ constraint: "mandatory"
277
+ control: "internal"
278
+ foundation: "start_to_start"
279
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
280
+ reason: "A specialization: the general inward-only rule, narrowed to the commons domain tree."
281
+ source_ref: "coder.bun.commons-domain-no-outbound"
282
+ strength: "important"
283
+ target_ref: "coder.bun.design-hierarchy-import"
284
+ type: "requires"
285
+ - confidence: 1
286
+ constraint: "mandatory"
287
+ control: "internal"
288
+ foundation: "start_to_start"
289
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
290
+ reason: "Co-emitted per function from one extraction pass over the same brace-matched body."
291
+ source_ref: "coder.bun.complexity-length"
292
+ strength: "important"
293
+ target_ref: "coder.bun.complexity-cyclomatic"
294
+ type: "runs_alongside"
295
+ - confidence: 1
296
+ constraint: "mandatory"
297
+ control: "internal"
298
+ foundation: "start_to_start"
299
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
300
+ reason: "Co-emitted per function from one extraction pass over the same brace-matched body."
301
+ source_ref: "coder.bun.complexity-nesting"
302
+ strength: "important"
303
+ target_ref: "coder.bun.complexity-cyclomatic"
304
+ type: "runs_alongside"
305
+ - confidence: 1
306
+ constraint: "mandatory"
307
+ control: "internal"
308
+ foundation: "start_to_start"
309
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
310
+ reason: "Two halves of one discipline: where wiring MAY happen, and that consumers must ACCEPT what they are given."
311
+ source_ref: "coder.bun.composition-consumer"
312
+ strength: "critical"
313
+ target_ref: "coder.bun.composition-root"
314
+ type: "runs_alongside"
315
+ - confidence: 1
316
+ constraint: "mandatory"
317
+ control: "internal"
318
+ foundation: "finish_to_start"
319
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
320
+ reason: "Reachability is measured FROM the structural roots that composition-root confines wiring to."
321
+ source_ref: "coder.bun.dead-code-reachability"
322
+ strength: "important"
323
+ target_ref: "coder.bun.composition-root"
324
+ type: "requires"
325
+ - confidence: 1
326
+ constraint: "mandatory"
327
+ control: "internal"
328
+ foundation: "start_to_start"
329
+ origin: "@afokapu/atdd-bun"
330
+ reason: "a rendering component must use the design system, and render its controls through primitives"
331
+ source_ref: "coder.bun.design-connected"
332
+ strength: "important"
333
+ target_ref: "coder.bun.design-primitives"
334
+ type: "runs_alongside"
335
+ - confidence: 1
336
+ constraint: "mandatory"
337
+ control: "internal"
338
+ foundation: "finish_to_start"
339
+ origin: "@afokapu/atdd-bun"
340
+ reason: "Bun realization of the core obligation coder.design.orphan-ui, checked over .tsx, .jsx, .html and .css"
341
+ source_ref: "coder.bun.design-connected"
342
+ strength: "important"
343
+ target_ref: "coder.design.orphan-ui"
344
+ type: "requires"
345
+ - confidence: 1
346
+ constraint: "mandatory"
347
+ control: "internal"
348
+ foundation: "start_to_start"
349
+ origin: "@afokapu/atdd-bun"
350
+ reason: "code layering and design-system layering: both require dependencies to point in one direction"
351
+ source_ref: "coder.bun.design-dependency-flow"
352
+ strength: "important"
353
+ target_ref: "coder.bun.design-hierarchy-import"
354
+ type: "runs_alongside"
355
+ - confidence: 1
356
+ constraint: "mandatory"
357
+ control: "internal"
358
+ foundation: "start_to_start"
359
+ origin: "@afokapu/atdd-bun"
360
+ reason: "two halves of coder.design.hierarchy-import: imports flow down the layers, and never out into app code"
361
+ source_ref: "coder.bun.design-dependency-flow"
362
+ strength: "critical"
363
+ target_ref: "coder.bun.design-wagons-import"
364
+ type: "runs_alongside"
365
+ - confidence: 1
366
+ constraint: "mandatory"
367
+ control: "internal"
368
+ foundation: "finish_to_start"
369
+ origin: "@afokapu/atdd-bun"
370
+ reason: "Bun realization of the core obligation coder.design.hierarchy-import, checked over .tsx, .jsx, .html and .css"
371
+ source_ref: "coder.bun.design-dependency-flow"
372
+ strength: "important"
373
+ target_ref: "coder.design.hierarchy-import"
374
+ type: "requires"
375
+ - confidence: 1
376
+ constraint: "mandatory"
377
+ control: "internal"
378
+ foundation: "finish_to_start"
379
+ origin: "@afokapu/atdd-bun"
380
+ reason: "Bun realization of the core obligation coder.design.orphan-export, checked over .tsx, .jsx, .html and .css"
381
+ source_ref: "coder.bun.design-orphan-export"
382
+ strength: "important"
383
+ target_ref: "coder.design.orphan-export"
384
+ type: "requires"
385
+ - confidence: 1
386
+ constraint: "mandatory"
387
+ control: "internal"
388
+ foundation: "finish_to_start"
389
+ origin: "@afokapu/atdd-bun"
390
+ reason: "Bun realization of the core obligation coder.design.primitives, checked over .tsx, .jsx, .html and .css"
391
+ source_ref: "coder.bun.design-primitives"
392
+ strength: "important"
393
+ target_ref: "coder.design.primitives"
394
+ type: "requires"
395
+ - confidence: 1
396
+ constraint: "mandatory"
397
+ control: "internal"
398
+ foundation: "start_to_start"
399
+ origin: "@afokapu/atdd-bun"
400
+ reason: "colors, and spacing, radii and durations: together, every visual value outside the tokens layer comes from tokens"
401
+ source_ref: "coder.bun.design-token-color"
402
+ strength: "important"
403
+ target_ref: "coder.bun.design-token-hardcoded"
404
+ type: "runs_alongside"
405
+ - confidence: 1
406
+ constraint: "mandatory"
407
+ control: "internal"
408
+ foundation: "finish_to_start"
409
+ origin: "@afokapu/atdd-bun"
410
+ reason: "colors can only be referenced from tokens once the tokens layer holds pure values"
411
+ source_ref: "coder.bun.design-token-color"
412
+ strength: "important"
413
+ target_ref: "coder.bun.design-tokens-pure"
414
+ type: "requires"
415
+ - confidence: 1
416
+ constraint: "mandatory"
417
+ control: "internal"
418
+ foundation: "finish_to_start"
419
+ origin: "@afokapu/atdd-bun"
420
+ reason: "Bun realization of the core obligation coder.design.token-color, checked over .tsx, .jsx, .html and .css"
421
+ source_ref: "coder.bun.design-token-color"
422
+ strength: "important"
423
+ target_ref: "coder.design.token-color"
424
+ type: "requires"
425
+ - confidence: 1
426
+ constraint: "mandatory"
427
+ control: "internal"
428
+ foundation: "finish_to_start"
429
+ origin: "@afokapu/atdd-bun"
430
+ reason: "Bun realization of the core obligation coder.design.token-hardcoded, checked over .tsx, .jsx, .html and .css"
431
+ source_ref: "coder.bun.design-token-hardcoded"
432
+ strength: "important"
433
+ target_ref: "coder.design.token-hardcoded"
434
+ type: "requires"
435
+ - confidence: 1
436
+ constraint: "mandatory"
437
+ control: "internal"
438
+ foundation: "finish_to_start"
439
+ origin: "@afokapu/atdd-bun"
440
+ reason: "Bun realization of the core obligation coder.design.foundations, checked over .tsx, .jsx, .html and .css"
441
+ source_ref: "coder.bun.design-tokens-pure"
442
+ strength: "important"
443
+ target_ref: "coder.design.foundations"
444
+ type: "requires"
445
+ - confidence: 1
446
+ constraint: "mandatory"
447
+ control: "internal"
448
+ foundation: "finish_to_start"
449
+ origin: "@afokapu/atdd-bun"
450
+ reason: "Bun realization of the core obligation coder.design.hierarchy-import, checked over .tsx, .jsx, .html and .css"
451
+ source_ref: "coder.bun.design-wagons-import"
452
+ strength: "important"
453
+ target_ref: "coder.design.hierarchy-import"
454
+ type: "requires"
455
+ - confidence: 1
456
+ constraint: "discretionary"
457
+ control: "internal"
458
+ foundation: "start_to_start"
459
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
460
+ reason: "The mapper translates the type whose home this rule fixes; both keep the boundary in one place."
461
+ source_ref: "coder.bun.dto-mapper"
462
+ strength: "minor"
463
+ target_ref: "coder.bun.dto-placement"
464
+ type: "runs_alongside"
465
+ - confidence: 1
466
+ constraint: "mandatory"
467
+ control: "internal"
468
+ foundation: "start_to_start"
469
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
470
+ reason: "Purity governs a DTO's shape, placement its home; a pure DTO in the wrong layer still couples the boundary."
471
+ source_ref: "coder.bun.dto-placement"
472
+ strength: "important"
473
+ target_ref: "coder.bun.dto-purity"
474
+ type: "runs_alongside"
475
+ - confidence: 1
476
+ constraint: "discretionary"
477
+ control: "internal"
478
+ foundation: "start_to_start"
479
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
480
+ reason: "Both read structure ACROSS files rather than within one, and both need the whole scan tree at once."
481
+ source_ref: "coder.bun.duplication-intra-layer"
482
+ strength: "minor"
483
+ target_ref: "coder.bun.dead-code-reachability"
484
+ type: "runs_alongside"
485
+ - confidence: 1
486
+ constraint: "mandatory"
487
+ control: "internal"
488
+ foundation: "start_to_start"
489
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
490
+ reason: "The canonical order this rule enforces is URN -> Tested-By -> Runtime -> Purpose; Runtime and Purpose are the second half of the very sequence it governs, so they were never a separate concern."
491
+ source_ref: "coder.bun.green-header-order"
492
+ strength: "important"
493
+ target_ref: "coder.bun.green-header-runtime"
494
+ type: "runs_alongside"
495
+ - confidence: 1
496
+ constraint: "mandatory"
497
+ control: "internal"
498
+ foundation: "start_to_start"
499
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
500
+ reason: "Order governs the arrangement of the very fields the other header rules require."
501
+ source_ref: "coder.bun.green-header-order"
502
+ strength: "important"
503
+ target_ref: "coder.bun.green-header-tested-by"
504
+ type: "runs_alongside"
505
+ - confidence: 1
506
+ constraint: "mandatory"
507
+ control: "internal"
508
+ foundation: "start_to_start"
509
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
510
+ reason: "Both single-line header fields recovered from one parse of the same comment block."
511
+ source_ref: "coder.bun.green-header-runtime"
512
+ strength: "minor"
513
+ target_ref: "coder.bun.green-header-purpose"
514
+ type: "runs_alongside"
515
+ - confidence: 1
516
+ constraint: "mandatory"
517
+ control: "internal"
518
+ foundation: "start_to_start"
519
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
520
+ reason: "Two halves of the traceability loop: the URN says what the file IS, Tested-By what PROVES it."
521
+ source_ref: "coder.bun.green-header-tested-by"
522
+ strength: "critical"
523
+ target_ref: "coder.bun.green-urn-marker"
524
+ type: "runs_alongside"
525
+ - confidence: 1
526
+ constraint: "mandatory"
527
+ control: "internal"
528
+ foundation: "finish_to_start"
529
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
530
+ reason: "The layer segment this rule validates is what the layering rules read to judge an import."
531
+ source_ref: "coder.bun.green-urn-layer"
532
+ strength: "important"
533
+ target_ref: "coder.bun.design-hierarchy-import"
534
+ type: "enables"
535
+ - confidence: 1
536
+ constraint: "mandatory"
537
+ control: "internal"
538
+ foundation: "finish_to_start"
539
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
540
+ reason: "Reads segment 5, which exists only once the shape validates."
541
+ source_ref: "coder.bun.green-urn-layer"
542
+ strength: "important"
543
+ target_ref: "coder.bun.green-urn-pattern"
544
+ type: "requires"
545
+ - confidence: 1
546
+ constraint: "mandatory"
547
+ control: "internal"
548
+ foundation: "finish_to_start"
549
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
550
+ reason: "Reads segment 3, which exists only once the shape validates."
551
+ source_ref: "coder.bun.green-urn-name-matches"
552
+ strength: "important"
553
+ target_ref: "coder.bun.green-urn-pattern"
554
+ type: "requires"
555
+ - confidence: 1
556
+ constraint: "mandatory"
557
+ control: "internal"
558
+ foundation: "finish_to_start"
559
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
560
+ reason: "The six-segment shape can only be checked once a marker is present; absence is the marker rule's finding."
561
+ source_ref: "coder.bun.green-urn-pattern"
562
+ strength: "critical"
563
+ target_ref: "coder.bun.green-urn-marker"
564
+ type: "requires"
565
+ - confidence: 1
566
+ constraint: "mandatory"
567
+ control: "internal"
568
+ foundation: "finish_to_start"
569
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
570
+ reason: "Reads segment 4, which exists only once the shape validates."
571
+ source_ref: "coder.bun.green-urn-side"
572
+ strength: "important"
573
+ target_ref: "coder.bun.green-urn-pattern"
574
+ type: "requires"
575
+ - confidence: 1
576
+ constraint: "mandatory"
577
+ control: "internal"
578
+ foundation: "finish_to_start"
579
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
580
+ reason: "Segment grammar applies only after the segment count is known good."
581
+ source_ref: "coder.bun.green-urn-wagon-feature"
582
+ strength: "important"
583
+ target_ref: "coder.bun.green-urn-pattern"
584
+ type: "requires"
585
+ - confidence: 1
586
+ constraint: "discretionary"
587
+ control: "internal"
588
+ foundation: "start_to_start"
589
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
590
+ reason: "Both govern server.ts as the composition root: one that collaborators are only instantiated there, the other that the JOURNEY_MAP it holds agrees with the declared route space."
591
+ source_ref: "coder.bun.interlocking-bilateral-binding"
592
+ strength: "minor"
593
+ target_ref: "coder.bun.composition-root"
594
+ type: "runs_alongside"
595
+ - confidence: 1
596
+ constraint: "mandatory"
597
+ control: "internal"
598
+ foundation: "finish_to_start"
599
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
600
+ reason: "The layering rules can only read a layer that the naming rule guarantees is declared."
601
+ source_ref: "coder.bun.layer-naming"
602
+ strength: "critical"
603
+ target_ref: "coder.bun.design-hierarchy-import"
604
+ type: "enables"
605
+ - confidence: 1
606
+ constraint: "mandatory"
607
+ control: "internal"
608
+ foundation: "start_to_start"
609
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
610
+ reason: "The comment ratio is literally a term in the maintainability-index formula: one computation, two reported facts."
611
+ source_ref: "coder.bun.quality-comments"
612
+ strength: "important"
613
+ target_ref: "coder.bun.quality-mi"
614
+ type: "runs_alongside"
615
+ - confidence: 1
616
+ constraint: "discretionary"
617
+ control: "internal"
618
+ foundation: "start_to_start"
619
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
620
+ reason: "MI judges the FILE, complexity its functions; a file can pass every function threshold and still be unmaintainable by size."
621
+ source_ref: "coder.bun.quality-mi"
622
+ strength: "minor"
623
+ target_ref: "coder.bun.complexity-cyclomatic"
624
+ type: "runs_alongside"
625
+ - confidence: 1
626
+ constraint: "mandatory"
627
+ control: "internal"
628
+ foundation: "start_to_start"
629
+ origin: "@afokapu/atdd-bun"
630
+ reason: "breakpoints are declared once like tokens, because media queries cannot read custom properties"
631
+ source_ref: "coder.bun.responsive-breakpoints-declared"
632
+ strength: "important"
633
+ target_ref: "coder.bun.design-token-hardcoded"
634
+ type: "runs_alongside"
635
+ - confidence: 1
636
+ constraint: "mandatory"
637
+ control: "internal"
638
+ foundation: "start_to_start"
639
+ origin: "@afokapu/atdd-bun"
640
+ reason: "what a layout may be wide, and where it may switch: together, a layout that adapts at the declared widths"
641
+ source_ref: "coder.bun.responsive-no-fixed-width"
642
+ strength: "important"
643
+ target_ref: "coder.bun.responsive-breakpoints-declared"
644
+ type: "runs_alongside"
645
+ - confidence: 1
646
+ constraint: "mandatory"
647
+ control: "internal"
648
+ foundation: "finish_to_start"
649
+ origin: "@afokapu/atdd-bun"
650
+ reason: "widths only mean device widths once the document declares a device-width viewport"
651
+ source_ref: "coder.bun.responsive-viewport-meta"
652
+ strength: "critical"
653
+ target_ref: "coder.bun.responsive-no-fixed-width"
654
+ type: "enables"
655
+ - confidence: 1
656
+ constraint: "mandatory"
657
+ control: "internal"
658
+ foundation: "start_to_start"
659
+ origin: "@afokapu/atdd-bun"
660
+ reason: "a viewport that blocks zoom is an accessibility failure as well as a responsive one"
661
+ source_ref: "coder.bun.responsive-viewport-meta"
662
+ strength: "important"
663
+ target_ref: "tester.htmx.a11y-harness"
664
+ type: "runs_alongside"
665
+ - confidence: 1
666
+ constraint: "discretionary"
667
+ control: "internal"
668
+ foundation: "start_to_start"
669
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
670
+ reason: "One governs the server you run, the other the client you call out with."
671
+ source_ref: "coder.bun.runtime-server-is-bun-serve"
672
+ strength: "minor"
673
+ target_ref: "coder.bun.boundaries-http-client"
674
+ type: "runs_alongside"
675
+ - confidence: 1
676
+ constraint: "mandatory"
677
+ control: "internal"
678
+ foundation: "finish_to_start"
679
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
680
+ reason: "server.ts is a composition root precisely BECAUSE Bun.serve is the assembly point of a full-stack Bun app."
681
+ source_ref: "coder.bun.runtime-server-is-bun-serve"
682
+ strength: "important"
683
+ target_ref: "coder.bun.composition-root"
684
+ type: "enables"
685
+ - confidence: 1
686
+ constraint: "mandatory"
687
+ control: "internal"
688
+ foundation: "start_to_start"
689
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
690
+ reason: "Both hold the stack decision itself: Bun's server, Bun's resolver."
691
+ source_ref: "coder.bun.runtime-single-lockfile"
692
+ strength: "important"
693
+ target_ref: "coder.bun.runtime-server-is-bun-serve"
694
+ type: "runs_alongside"
695
+ - confidence: 1
696
+ constraint: "mandatory"
697
+ control: "internal"
698
+ foundation: "start_to_start"
699
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
700
+ reason: "Complementary halves of one guarantee about the resolution model. The shape rule proves an InterlockingResolution declaring the eight fields EXISTS; only a typechecker proves what resolveTrain actually returns conforms to it, and Bun runs .ts without checking."
701
+ source_ref: "coder.bun.runtime-typecheck-enforced"
702
+ strength: "important"
703
+ target_ref: "coder.bun.interlocking-resolution-model-exists"
704
+ type: "runs_alongside"
705
+ - confidence: 1
706
+ constraint: "discretionary"
707
+ control: "internal"
708
+ foundation: "start_to_start"
709
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.coder.bun/relationships.yaml"
710
+ reason: "Both are Bun runtime decisions read from package.json and its neighbours: one that a single resolver owns the dependency graph, the other that the types in it are actually checked."
711
+ source_ref: "coder.bun.runtime-typecheck-enforced"
712
+ strength: "minor"
713
+ target_ref: "coder.bun.runtime-single-lockfile"
714
+ type: "runs_alongside"
715
+ - confidence: 1
716
+ constraint: "mandatory"
717
+ control: "internal"
718
+ foundation: "start_to_start"
719
+ origin: "@afokapu/atdd-bun"
720
+ reason: "vendor SDKs stay in infrastructure adapters as framework imports stay out of domain"
721
+ source_ref: "coder.bun.telemetry-vendor-sdk"
722
+ strength: "important"
723
+ target_ref: "coder.bun.commons-domain-no-framework-import"
724
+ type: "runs_alongside"
725
+ - confidence: 1
726
+ constraint: "mandatory"
727
+ control: "external"
728
+ foundation: "finish_to_start"
729
+ origin: "atdd@36ce055a:src/atdd/coach/graph/relationships.yaml"
730
+ reason: "wagon-feature coverage reads the wagon features manifest"
731
+ source_ref: "planner.coverage.bidirectional-coverage-between-wagons"
732
+ strength: "important"
733
+ target_ref: "planner.wagon.features"
734
+ type: "requires"
735
+ - confidence: 1
736
+ constraint: "mandatory"
737
+ control: "internal"
738
+ foundation: "finish_to_finish"
739
+ origin: "atdd@36ce055a:src/atdd/coach/graph/relationships.yaml"
740
+ reason: "a feature belongs to exactly one wagon"
741
+ source_ref: "planner.feature.definition"
742
+ strength: "critical"
743
+ target_ref: "planner.feature.wagon-link"
744
+ type: "requires"
745
+ - confidence: 1
746
+ constraint: "mandatory"
747
+ control: "external"
748
+ foundation: "finish_to_start"
749
+ origin: "atdd@36ce055a:src/atdd/coach/graph/relationships.yaml"
750
+ reason: "a feature is registered in its wagon _features.yaml"
751
+ source_ref: "planner.feature.wagon-link"
752
+ strength: "important"
753
+ target_ref: "planner.wagon.features"
754
+ type: "requires"
755
+ - confidence: 1
756
+ constraint: "mandatory"
757
+ control: "internal"
758
+ foundation: "finish_to_finish"
759
+ origin: "atdd@36ce055a:src/atdd/coach/graph/relationships.yaml"
760
+ reason: "a wagon groups the features that decompose it"
761
+ source_ref: "planner.wagon.definition"
762
+ strength: "minor"
763
+ target_ref: "planner.wagon.features"
764
+ type: "requires"
765
+ - confidence: 1
766
+ constraint: "mandatory"
767
+ control: "internal"
768
+ foundation: "start_to_start"
769
+ origin: "atdd@36ce055a:src/atdd/coach/graph/relationships.yaml"
770
+ reason: "the features-manifest rule uses the urn-array features format"
771
+ source_ref: "planner.wagon.features-format"
772
+ strength: "important"
773
+ target_ref: "planner.wagon.features"
774
+ type: "runs_alongside"
775
+ - confidence: 1
776
+ constraint: "mandatory"
777
+ control: "internal"
778
+ foundation: "start_to_start"
779
+ origin: "@afokapu/atdd-bun"
780
+ reason: "the static cause and the rendered proof of horizontal overflow"
781
+ source_ref: "tester.htmx.responsive-harness"
782
+ strength: "important"
783
+ target_ref: "coder.bun.responsive-no-fixed-width"
784
+ type: "runs_alongside"
785
+ - confidence: 1
786
+ constraint: "mandatory"
787
+ control: "internal"
788
+ foundation: "finish_to_start"
789
+ origin: "@afokapu/atdd-bun"
790
+ reason: "a browser can only prove a page fits a phone once the page declares a device-width viewport"
791
+ source_ref: "tester.htmx.responsive-harness"
792
+ strength: "critical"
793
+ target_ref: "coder.bun.responsive-viewport-meta"
794
+ type: "requires"
795
+ - confidence: 1
796
+ constraint: "mandatory"
797
+ control: "internal"
798
+ foundation: "start_to_start"
799
+ origin: "@afokapu/atdd-bun"
800
+ reason: "the same Tested-By header, read by the closure check and by the coder header rule"
801
+ source_ref: "traceability.source.tested-by-present"
802
+ strength: "important"
803
+ target_ref: "coder.bun.green-header-tested-by"
804
+ type: "runs_alongside"