@afokapu/atdd-bun 0.10.32 → 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.
@@ -0,0 +1,734 @@
1
+ schema_version: "1.0.0"
2
+ profile: "tester"
3
+ implementations:
4
+ - "atdd_topology"
5
+ - "bun_tester_discipline_detector"
6
+ - "htmx_e2e_detector"
7
+ conventions:
8
+ - rule_id: "atdd-bun.topology.e2e-location"
9
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.e2e-location.convention.yaml"
10
+ - rule_id: "atdd-bun.topology.feature-source-coverage"
11
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.feature-source-coverage.convention.yaml"
12
+ - rule_id: "atdd-bun.topology.feature-test-coverage"
13
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.feature-test-coverage.convention.yaml"
14
+ - rule_id: "atdd-bun.topology.plan-location"
15
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.plan-location.convention.yaml"
16
+ - rule_id: "atdd-bun.topology.source-location"
17
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.source-location.convention.yaml"
18
+ - rule_id: "atdd-bun.topology.test-location"
19
+ path: "conventions/atdd-bun.topology/atdd-bun.topology.test-location.convention.yaml"
20
+ - rule_id: "planner.feature.wagon-link"
21
+ path: "planner-nodes/nodes/planner.feature.wagon-link.convention.yaml"
22
+ - rule_id: "planner.wagon.features"
23
+ path: "planner-nodes/nodes/planner.wagon.features.convention.yaml"
24
+ - rule_id: "tester.bun.acceptance-binding-declared"
25
+ path: "conventions/tester.bun/tester.bun.acceptance-binding-declared.convention.yaml"
26
+ - rule_id: "tester.bun.acceptance-covers-tag-well-formed"
27
+ path: "conventions/tester.bun/tester.bun.acceptance-covers-tag-well-formed.convention.yaml"
28
+ - rule_id: "tester.bun.acceptance-resolves-to-declared"
29
+ path: "conventions/tester.bun/tester.bun.acceptance-resolves-to-declared.convention.yaml"
30
+ - rule_id: "tester.bun.red-behavioral-assertion"
31
+ path: "conventions/tester.bun/tester.bun.red-behavioral-assertion.convention.yaml"
32
+ - rule_id: "tester.bun.red-fails-first"
33
+ path: "conventions/tester.bun/tester.bun.red-fails-first.convention.yaml"
34
+ - rule_id: "tester.bun.routing-runtime-family"
35
+ path: "conventions/tester.bun/tester.bun.routing-runtime-family.convention.yaml"
36
+ - rule_id: "tester.bun.security-auth"
37
+ path: "conventions/tester.bun/tester.bun.security-auth.convention.yaml"
38
+ - rule_id: "tester.bun.security-input"
39
+ path: "conventions/tester.bun/tester.bun.security-input.convention.yaml"
40
+ - rule_id: "tester.bun.smoke-no-collaborator-substitution"
41
+ path: "conventions/tester.bun/tester.bun.smoke-no-collaborator-substitution.convention.yaml"
42
+ - rule_id: "tester.bun.smoke-observable-assertion"
43
+ path: "conventions/tester.bun/tester.bun.smoke-observable-assertion.convention.yaml"
44
+ - rule_id: "tester.bun.telemetry-emit"
45
+ path: "conventions/tester.bun/tester.bun.telemetry-emit.convention.yaml"
46
+ - rule_id: "tester.bun.test-carries-urn-identity"
47
+ path: "conventions/tester.bun/tester.bun.test-carries-urn-identity.convention.yaml"
48
+ - rule_id: "tester.bun.test-imports-bun-test"
49
+ path: "conventions/tester.bun/tester.bun.test-imports-bun-test.convention.yaml"
50
+ - rule_id: "tester.bun.test-isolation-no-live-state"
51
+ path: "conventions/tester.bun/tester.bun.test-isolation-no-live-state.convention.yaml"
52
+ - rule_id: "tester.bun.test-no-self-skip"
53
+ path: "conventions/tester.bun/tester.bun.test-no-self-skip.convention.yaml"
54
+ - rule_id: "tester.bun.test-phase-declared"
55
+ path: "conventions/tester.bun/tester.bun.test-phase-declared.convention.yaml"
56
+ - rule_id: "tester.htmx.a11y-harness"
57
+ path: "conventions/tester.htmx/tester.htmx.a11y-harness.convention.yaml"
58
+ - rule_id: "tester.htmx.covered-train-is-routed"
59
+ path: "conventions/tester.htmx/tester.htmx.covered-train-is-routed.convention.yaml"
60
+ - rule_id: "tester.htmx.e2e-binds-declared-subject"
61
+ path: "conventions/tester.htmx/tester.htmx.e2e-binds-declared-subject.convention.yaml"
62
+ - rule_id: "tester.htmx.e2e-spec-naming"
63
+ path: "conventions/tester.htmx/tester.htmx.e2e-spec-naming.convention.yaml"
64
+ - rule_id: "tester.htmx.exposed-journey-e2e-coverage"
65
+ path: "conventions/tester.htmx/tester.htmx.exposed-journey-e2e-coverage.convention.yaml"
66
+ - rule_id: "tester.htmx.journey-binding-header"
67
+ path: "conventions/tester.htmx/tester.htmx.journey-binding-header.convention.yaml"
68
+ - rule_id: "tester.htmx.journey-layer-assembly"
69
+ path: "conventions/tester.htmx/tester.htmx.journey-layer-assembly.convention.yaml"
70
+ - rule_id: "tester.htmx.journey-no-acceptance-marker"
71
+ path: "conventions/tester.htmx/tester.htmx.journey-no-acceptance-marker.convention.yaml"
72
+ - rule_id: "tester.htmx.journey-urn-format"
73
+ path: "conventions/tester.htmx/tester.htmx.journey-urn-format.convention.yaml"
74
+ - rule_id: "tester.htmx.presentation-smoke-coverage"
75
+ path: "conventions/tester.htmx/tester.htmx.presentation-smoke-coverage.convention.yaml"
76
+ - rule_id: "tester.htmx.responsive-harness"
77
+ path: "conventions/tester.htmx/tester.htmx.responsive-harness.convention.yaml"
78
+ - rule_id: "tester.htmx.responsive-journey-coverage"
79
+ path: "conventions/tester.htmx/tester.htmx.responsive-journey-coverage.convention.yaml"
80
+ - rule_id: "tester.htmx.train-e2e-coverage"
81
+ path: "conventions/tester.htmx/tester.htmx.train-e2e-coverage.convention.yaml"
82
+ - rule_id: "tester.htmx.visual-harness"
83
+ path: "conventions/tester.htmx/tester.htmx.visual-harness.convention.yaml"
84
+ relationships:
85
+ - confidence: 1
86
+ constraint: "mandatory"
87
+ control: "internal"
88
+ foundation: "finish_to_start"
89
+ origin: "@afokapu/atdd-bun"
90
+ reason: "journey E2E paths are derived from the journeys the plan declares"
91
+ source_ref: "atdd-bun.topology.e2e-location"
92
+ strength: "critical"
93
+ target_ref: "planner.journey.definition"
94
+ type: "requires"
95
+ - confidence: 1
96
+ constraint: "mandatory"
97
+ control: "internal"
98
+ foundation: "start_to_start"
99
+ origin: "@afokapu/atdd-bun"
100
+ reason: "every route has an end-to-end proof: at its canonical path, and exercising the production runner"
101
+ source_ref: "atdd-bun.topology.e2e-location"
102
+ strength: "important"
103
+ target_ref: "tester.bun.interlocking-route-coverage"
104
+ type: "runs_alongside"
105
+ - confidence: 1
106
+ constraint: "mandatory"
107
+ control: "internal"
108
+ foundation: "start_to_start"
109
+ origin: "@afokapu/atdd-bun"
110
+ reason: "on a frontend journey a browser spec is the route's end-to-end proof"
111
+ source_ref: "atdd-bun.topology.e2e-location"
112
+ strength: "important"
113
+ target_ref: "tester.htmx.train-e2e-coverage"
114
+ type: "runs_alongside"
115
+ - confidence: 1
116
+ constraint: "mandatory"
117
+ control: "internal"
118
+ foundation: "finish_to_start"
119
+ origin: "@afokapu/atdd-bun"
120
+ reason: "coverage counts only source placed beneath its feature"
121
+ source_ref: "atdd-bun.topology.feature-source-coverage"
122
+ strength: "critical"
123
+ target_ref: "atdd-bun.topology.source-location"
124
+ type: "requires"
125
+ - confidence: 1
126
+ constraint: "mandatory"
127
+ control: "internal"
128
+ foundation: "start_to_start"
129
+ origin: "@afokapu/atdd-bun"
130
+ reason: "a feature with WMBTs is implemented and tested"
131
+ source_ref: "atdd-bun.topology.feature-test-coverage"
132
+ strength: "important"
133
+ target_ref: "atdd-bun.topology.feature-source-coverage"
134
+ type: "runs_alongside"
135
+ - confidence: 1
136
+ constraint: "mandatory"
137
+ control: "internal"
138
+ foundation: "finish_to_start"
139
+ origin: "@afokapu/atdd-bun"
140
+ reason: "coverage counts only tests placed beneath their feature and bound to its acceptances"
141
+ source_ref: "atdd-bun.topology.feature-test-coverage"
142
+ strength: "critical"
143
+ target_ref: "atdd-bun.topology.test-location"
144
+ type: "requires"
145
+ - confidence: 1
146
+ constraint: "mandatory"
147
+ control: "internal"
148
+ foundation: "start_to_start"
149
+ origin: "@afokapu/atdd-bun"
150
+ reason: "where a feature lives and which wagon owns it: the same ownership, by path and by link"
151
+ source_ref: "atdd-bun.topology.plan-location"
152
+ strength: "important"
153
+ target_ref: "planner.feature.wagon-link"
154
+ type: "runs_alongside"
155
+ - confidence: 1
156
+ constraint: "mandatory"
157
+ control: "internal"
158
+ foundation: "finish_to_start"
159
+ origin: "@afokapu/atdd-bun"
160
+ reason: "features are placed by path once the wagon's feature decomposition is declared"
161
+ source_ref: "atdd-bun.topology.plan-location"
162
+ strength: "critical"
163
+ target_ref: "planner.wagon.features"
164
+ type: "requires"
165
+ - confidence: 1
166
+ constraint: "mandatory"
167
+ control: "internal"
168
+ foundation: "finish_to_start"
169
+ origin: "@afokapu/atdd-bun"
170
+ reason: "source is placed beneath a feature the plan declares at its canonical path"
171
+ source_ref: "atdd-bun.topology.source-location"
172
+ strength: "critical"
173
+ target_ref: "atdd-bun.topology.plan-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: "the same component URN, read for its grammar and for where the file must live"
181
+ source_ref: "atdd-bun.topology.source-location"
182
+ strength: "important"
183
+ target_ref: "coder.bun.green-urn-pattern"
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: "tests are placed beneath a feature the plan declares"
191
+ source_ref: "atdd-bun.topology.test-location"
192
+ strength: "critical"
193
+ target_ref: "atdd-bun.topology.plan-location"
194
+ type: "requires"
195
+ - confidence: 1
196
+ constraint: "mandatory"
197
+ control: "internal"
198
+ foundation: "start_to_start"
199
+ origin: "@afokapu/atdd-bun"
200
+ reason: "the acceptance a test binds, read for presence and for whether a WMBT declares it"
201
+ source_ref: "atdd-bun.topology.test-location"
202
+ strength: "important"
203
+ target_ref: "tester.bun.acceptance-binding-declared"
204
+ type: "runs_alongside"
205
+ - confidence: 1
206
+ constraint: "mandatory"
207
+ control: "internal"
208
+ foundation: "start_to_start"
209
+ origin: "@afokapu/atdd-bun"
210
+ reason: "a viewport that blocks zoom is an accessibility failure as well as a responsive one"
211
+ source_ref: "coder.bun.responsive-viewport-meta"
212
+ strength: "important"
213
+ target_ref: "tester.htmx.a11y-harness"
214
+ type: "runs_alongside"
215
+ - confidence: 1
216
+ constraint: "mandatory"
217
+ control: "external"
218
+ foundation: "finish_to_start"
219
+ origin: "atdd@36ce055a:src/atdd/coach/graph/relationships.yaml"
220
+ reason: "wagon-feature coverage reads the wagon features manifest"
221
+ source_ref: "planner.coverage.bidirectional-coverage-between-wagons"
222
+ strength: "important"
223
+ target_ref: "planner.wagon.features"
224
+ type: "requires"
225
+ - confidence: 1
226
+ constraint: "mandatory"
227
+ control: "internal"
228
+ foundation: "finish_to_finish"
229
+ origin: "atdd@36ce055a:src/atdd/coach/graph/relationships.yaml"
230
+ reason: "a feature belongs to exactly one wagon"
231
+ source_ref: "planner.feature.definition"
232
+ strength: "critical"
233
+ target_ref: "planner.feature.wagon-link"
234
+ type: "requires"
235
+ - confidence: 1
236
+ constraint: "mandatory"
237
+ control: "external"
238
+ foundation: "finish_to_start"
239
+ origin: "atdd@36ce055a:src/atdd/coach/graph/relationships.yaml"
240
+ reason: "a feature is registered in its wagon _features.yaml"
241
+ source_ref: "planner.feature.wagon-link"
242
+ strength: "important"
243
+ target_ref: "planner.wagon.features"
244
+ type: "requires"
245
+ - confidence: 1
246
+ constraint: "mandatory"
247
+ control: "internal"
248
+ foundation: "finish_to_finish"
249
+ origin: "atdd@36ce055a:src/atdd/coach/graph/relationships.yaml"
250
+ reason: "a wagon groups the features that decompose it"
251
+ source_ref: "planner.wagon.definition"
252
+ strength: "minor"
253
+ target_ref: "planner.wagon.features"
254
+ type: "requires"
255
+ - confidence: 1
256
+ constraint: "mandatory"
257
+ control: "internal"
258
+ foundation: "start_to_start"
259
+ origin: "atdd@36ce055a:src/atdd/coach/graph/relationships.yaml"
260
+ reason: "the features-manifest rule uses the urn-array features format"
261
+ source_ref: "planner.wagon.features-format"
262
+ strength: "important"
263
+ target_ref: "planner.wagon.features"
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.tester.bun/relationships.yaml"
270
+ reason: "Identity first, then what it proves; a binding with no URN has nothing to bind."
271
+ source_ref: "tester.bun.acceptance-binding-declared"
272
+ strength: "critical"
273
+ target_ref: "tester.bun.test-carries-urn-identity"
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.tester.bun/relationships.yaml"
280
+ reason: "The two-level binding model: the header binds the FILE, a @covers tag binds one CASE."
281
+ source_ref: "tester.bun.acceptance-covers-tag-well-formed"
282
+ strength: "important"
283
+ target_ref: "tester.bun.acceptance-binding-declared"
284
+ type: "runs_alongside"
285
+ - confidence: 1
286
+ constraint: "mandatory"
287
+ control: "internal"
288
+ foundation: "finish_to_start"
289
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
290
+ reason: "One requires the binding to EXIST, the other requires it to be TRUE. There is nothing to resolve until a header is present, so presence is settled first; together they close the gap where a test named an acceptance that was never declared and every rule stayed silent."
291
+ source_ref: "tester.bun.acceptance-resolves-to-declared"
292
+ strength: "critical"
293
+ target_ref: "tester.bun.acceptance-binding-declared"
294
+ type: "requires"
295
+ - confidence: 1
296
+ constraint: "discretionary"
297
+ control: "internal"
298
+ foundation: "start_to_start"
299
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
300
+ reason: "Both bind the suite back to a planner declaration: one to the acceptance criterion a test covers, the other to the guarded route it exercises."
301
+ source_ref: "tester.bun.interlocking-route-coverage"
302
+ strength: "minor"
303
+ target_ref: "tester.bun.acceptance-binding-declared"
304
+ type: "runs_alongside"
305
+ - confidence: 1
306
+ constraint: "mandatory"
307
+ control: "internal"
308
+ foundation: "finish_to_start"
309
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
310
+ reason: "Only evaluable once a phase is declared; an undeclared test is exempt from the whole phase surface."
311
+ source_ref: "tester.bun.red-behavioral-assertion"
312
+ strength: "important"
313
+ target_ref: "tester.bun.test-phase-declared"
314
+ type: "requires"
315
+ - confidence: 1
316
+ constraint: "mandatory"
317
+ control: "internal"
318
+ foundation: "start_to_start"
319
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
320
+ reason: "One requires a guaranteed-fail marker, the other that the assertions are behavioural; a RED test needs both."
321
+ source_ref: "tester.bun.red-fails-first"
322
+ strength: "critical"
323
+ target_ref: "tester.bun.red-behavioral-assertion"
324
+ type: "runs_alongside"
325
+ - confidence: 1
326
+ constraint: "mandatory"
327
+ control: "internal"
328
+ foundation: "finish_to_start"
329
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
330
+ reason: "Another optional header field validated from the same parse."
331
+ source_ref: "tester.bun.routing-runtime-family"
332
+ strength: "minor"
333
+ target_ref: "tester.bun.test-carries-urn-identity"
334
+ type: "requires"
335
+ - confidence: 1
336
+ constraint: "discretionary"
337
+ control: "internal"
338
+ foundation: "start_to_start"
339
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
340
+ reason: "One shape, three kinds: a test whose URN declares its kind must carry the assertion that kind implies, or it is a silent green gap."
341
+ source_ref: "tester.bun.security-auth"
342
+ strength: "minor"
343
+ target_ref: "tester.bun.telemetry-emit"
344
+ type: "runs_alongside"
345
+ - confidence: 1
346
+ constraint: "mandatory"
347
+ control: "internal"
348
+ foundation: "start_to_start"
349
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
350
+ reason: "Authorisation and input validation are the two halves of one boundary; a happy-path test of either is a silent green gap."
351
+ source_ref: "tester.bun.security-input"
352
+ strength: "critical"
353
+ target_ref: "tester.bun.security-auth"
354
+ type: "runs_alongside"
355
+ - confidence: 1
356
+ constraint: "mandatory"
357
+ control: "internal"
358
+ foundation: "start_to_start"
359
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
360
+ reason: "Both keep SMOKE honest: real collaborators, and an assertion on what an operator could witness."
361
+ source_ref: "tester.bun.smoke-no-collaborator-substitution"
362
+ strength: "critical"
363
+ target_ref: "tester.bun.smoke-observable-assertion"
364
+ type: "runs_alongside"
365
+ - confidence: 1
366
+ constraint: "mandatory"
367
+ control: "internal"
368
+ foundation: "finish_to_start"
369
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
370
+ reason: "Only evaluable once a phase is declared, exactly as red-behavioral-assertion is; an undeclared test escapes the SMOKE surface entirely."
371
+ source_ref: "tester.bun.smoke-observable-assertion"
372
+ strength: "important"
373
+ target_ref: "tester.bun.test-phase-declared"
374
+ type: "requires"
375
+ - confidence: 1
376
+ constraint: "mandatory"
377
+ control: "internal"
378
+ foundation: "finish_to_start"
379
+ origin: "@afokapu/atdd-bun"
380
+ reason: "the captured-sink obligation carries the emission assertion into the telemetry profile"
381
+ source_ref: "tester.bun.telemetry-captured-sink"
382
+ strength: "important"
383
+ target_ref: "tester.bun.telemetry-emit"
384
+ type: "requires"
385
+ - confidence: 1
386
+ constraint: "discretionary"
387
+ control: "internal"
388
+ foundation: "start_to_start"
389
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
390
+ reason: "Both demand an assertion on an external EFFECT rather than on a returned value."
391
+ source_ref: "tester.bun.telemetry-emit"
392
+ strength: "minor"
393
+ target_ref: "tester.bun.smoke-observable-assertion"
394
+ type: "runs_alongside"
395
+ - confidence: 1
396
+ constraint: "mandatory"
397
+ control: "internal"
398
+ foundation: "finish_to_start"
399
+ origin: "@afokapu/atdd-bun"
400
+ reason: "exact identity extends the emission assertion from any-call to the named item"
401
+ source_ref: "tester.bun.telemetry-identity-assertion"
402
+ strength: "important"
403
+ target_ref: "tester.bun.telemetry-emit"
404
+ type: "requires"
405
+ - confidence: 1
406
+ constraint: "mandatory"
407
+ control: "internal"
408
+ foundation: "start_to_start"
409
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
410
+ reason: "One checks the DECLARED runner, the other the IMPORTED harness; they must agree or the gate credits a runner that never ran the test."
411
+ source_ref: "tester.bun.test-imports-bun-test"
412
+ strength: "important"
413
+ target_ref: "tester.bun.routing-runtime-family"
414
+ type: "runs_alongside"
415
+ - confidence: 1
416
+ constraint: "discretionary"
417
+ control: "internal"
418
+ foundation: "start_to_start"
419
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
420
+ reason: "Both govern what a test is allowed to touch outside itself."
421
+ source_ref: "tester.bun.test-isolation-no-live-state"
422
+ strength: "minor"
423
+ target_ref: "tester.bun.smoke-no-collaborator-substitution"
424
+ type: "runs_alongside"
425
+ - confidence: 1
426
+ constraint: "mandatory"
427
+ control: "internal"
428
+ foundation: "start_to_start"
429
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
430
+ reason: "They share a vocabulary and must not contradict: `.fails`/`.failing` is an accepted RED marker, so it is deliberately not treated as a self-skip."
431
+ source_ref: "tester.bun.test-no-self-skip"
432
+ strength: "important"
433
+ target_ref: "tester.bun.red-fails-first"
434
+ type: "runs_alongside"
435
+ - confidence: 1
436
+ constraint: "mandatory"
437
+ control: "internal"
438
+ foundation: "finish_to_start"
439
+ origin: "atdd-extensions@3aa141e:official/atdd.extension.tester.bun/relationships.yaml"
440
+ reason: "The phase is read from the same header block and is meaningless without the URN."
441
+ source_ref: "tester.bun.test-phase-declared"
442
+ strength: "critical"
443
+ target_ref: "tester.bun.test-carries-urn-identity"
444
+ type: "requires"
445
+ - confidence: 1
446
+ constraint: "mandatory"
447
+ control: "internal"
448
+ foundation: "finish_to_start"
449
+ origin: "@afokapu/atdd-bun"
450
+ reason: "an accessibility spec is identified by its A11Y harness code"
451
+ source_ref: "tester.htmx.a11y-harness"
452
+ strength: "important"
453
+ target_ref: "tester.htmx.journey-urn-format"
454
+ type: "requires"
455
+ - confidence: 1
456
+ constraint: "mandatory"
457
+ control: "internal"
458
+ foundation: "finish_to_start"
459
+ origin: "@afokapu/atdd-bun"
460
+ reason: "Bun/htmx realization of the Vite accessibility harness"
461
+ source_ref: "tester.htmx.a11y-harness"
462
+ strength: "important"
463
+ target_ref: "tester.vite.a11y-harness"
464
+ type: "requires"
465
+ - confidence: 1
466
+ constraint: "mandatory"
467
+ control: "internal"
468
+ foundation: "finish_to_start"
469
+ origin: "@afokapu/atdd-bun"
470
+ reason: "only a declared train can be checked for a route that selects it"
471
+ source_ref: "tester.htmx.covered-train-is-routed"
472
+ strength: "critical"
473
+ target_ref: "tester.htmx.e2e-binds-declared-subject"
474
+ type: "requires"
475
+ - confidence: 1
476
+ constraint: "mandatory"
477
+ control: "internal"
478
+ foundation: "finish_to_start"
479
+ origin: "@afokapu/atdd-bun"
480
+ reason: "Bun/htmx realization, judged against interlocking routes in plan/"
481
+ source_ref: "tester.htmx.covered-train-is-routed"
482
+ strength: "important"
483
+ target_ref: "tester.vite.covered-train-is-routed"
484
+ type: "requires"
485
+ - confidence: 1
486
+ constraint: "mandatory"
487
+ control: "internal"
488
+ foundation: "finish_to_start"
489
+ origin: "@afokapu/atdd-bun"
490
+ reason: "a binding must be well-formed before it can be resolved against plan/"
491
+ source_ref: "tester.htmx.e2e-binds-declared-subject"
492
+ strength: "critical"
493
+ target_ref: "tester.htmx.journey-binding-header"
494
+ type: "requires"
495
+ - confidence: 1
496
+ constraint: "mandatory"
497
+ control: "internal"
498
+ foundation: "finish_to_start"
499
+ origin: "@afokapu/atdd-bun"
500
+ reason: "Bun/htmx realization of the Vite orphaned-spec rule, extended to journeys"
501
+ source_ref: "tester.htmx.e2e-binds-declared-subject"
502
+ strength: "important"
503
+ target_ref: "tester.vite.e2e-names-valid-train"
504
+ type: "requires"
505
+ - confidence: 1
506
+ constraint: "mandatory"
507
+ control: "internal"
508
+ foundation: "finish_to_start"
509
+ origin: "@afokapu/atdd-bun"
510
+ reason: "browser specs are recognised by their *.e2e.ts name, which is what brings them under the journey header rules"
511
+ source_ref: "tester.htmx.e2e-spec-naming"
512
+ strength: "important"
513
+ target_ref: "tester.htmx.journey-binding-header"
514
+ type: "enables"
515
+ - confidence: 1
516
+ constraint: "mandatory"
517
+ control: "internal"
518
+ foundation: "finish_to_start"
519
+ origin: "@afokapu/atdd-bun"
520
+ reason: "exposed journeys are the ones a journey declares with an exposed entrypoint"
521
+ source_ref: "tester.htmx.exposed-journey-e2e-coverage"
522
+ strength: "critical"
523
+ target_ref: "planner.journey.definition"
524
+ type: "requires"
525
+ - confidence: 1
526
+ constraint: "mandatory"
527
+ control: "internal"
528
+ foundation: "start_to_start"
529
+ origin: "@afokapu/atdd-bun"
530
+ reason: "a journey run end to end in a browser beside each exposed interlocking action smoke-tested through the Station Master"
531
+ source_ref: "tester.htmx.exposed-journey-e2e-coverage"
532
+ strength: "important"
533
+ target_ref: "tester.bun.interlocking-smoke-coverage-for-station-master"
534
+ type: "runs_alongside"
535
+ - confidence: 1
536
+ constraint: "mandatory"
537
+ control: "internal"
538
+ foundation: "finish_to_start"
539
+ origin: "@afokapu/atdd-bun"
540
+ reason: "Bun/htmx realization of the Vite journey header obligation"
541
+ source_ref: "tester.htmx.journey-binding-header"
542
+ strength: "important"
543
+ target_ref: "tester.vite.journey-train-header"
544
+ type: "requires"
545
+ - confidence: 1
546
+ constraint: "mandatory"
547
+ control: "internal"
548
+ foundation: "start_to_start"
549
+ origin: "@afokapu/atdd-bun"
550
+ reason: "the same journey header block: binding and layer are read together"
551
+ source_ref: "tester.htmx.journey-layer-assembly"
552
+ strength: "important"
553
+ target_ref: "tester.htmx.journey-binding-header"
554
+ type: "runs_alongside"
555
+ - confidence: 1
556
+ constraint: "mandatory"
557
+ control: "internal"
558
+ foundation: "finish_to_start"
559
+ origin: "@afokapu/atdd-bun"
560
+ reason: "Bun/htmx realization of the Vite layer rule"
561
+ source_ref: "tester.htmx.journey-layer-assembly"
562
+ strength: "important"
563
+ target_ref: "tester.vite.journey-layer-assembly"
564
+ type: "requires"
565
+ - confidence: 1
566
+ constraint: "mandatory"
567
+ control: "internal"
568
+ foundation: "start_to_start"
569
+ origin: "@afokapu/atdd-bun"
570
+ reason: "the two exclusive test identities: a journey spec binds to a train or journey, an acceptance test to its acceptance"
571
+ source_ref: "tester.htmx.journey-no-acceptance-marker"
572
+ strength: "important"
573
+ target_ref: "tester.bun.acceptance-binding-declared"
574
+ type: "runs_alongside"
575
+ - confidence: 1
576
+ constraint: "mandatory"
577
+ control: "internal"
578
+ foundation: "finish_to_start"
579
+ origin: "@afokapu/atdd-bun"
580
+ reason: "Bun/htmx realization of the Vite exclusive-identity rule"
581
+ source_ref: "tester.htmx.journey-no-acceptance-marker"
582
+ strength: "important"
583
+ target_ref: "tester.vite.journey-no-acceptance-marker"
584
+ type: "requires"
585
+ - confidence: 1
586
+ constraint: "mandatory"
587
+ control: "internal"
588
+ foundation: "finish_to_start"
589
+ origin: "@afokapu/atdd-bun"
590
+ reason: "a URN can only be checked against the subject once the binding names one"
591
+ source_ref: "tester.htmx.journey-urn-format"
592
+ strength: "critical"
593
+ target_ref: "tester.htmx.journey-binding-header"
594
+ type: "requires"
595
+ - confidence: 1
596
+ constraint: "mandatory"
597
+ control: "internal"
598
+ foundation: "finish_to_start"
599
+ origin: "@afokapu/atdd-bun"
600
+ reason: "Bun/htmx realization of the Vite journey URN grammar"
601
+ source_ref: "tester.htmx.journey-urn-format"
602
+ strength: "important"
603
+ target_ref: "tester.vite.journey-urn-format"
604
+ type: "requires"
605
+ - confidence: 1
606
+ constraint: "mandatory"
607
+ control: "internal"
608
+ foundation: "start_to_start"
609
+ origin: "@afokapu/atdd-bun"
610
+ reason: "a presentation component is proven rendered by a smoke that asserts on what the user can observe"
611
+ source_ref: "tester.htmx.presentation-smoke-coverage"
612
+ strength: "important"
613
+ target_ref: "tester.bun.smoke-observable-assertion"
614
+ type: "runs_alongside"
615
+ - confidence: 1
616
+ constraint: "mandatory"
617
+ control: "internal"
618
+ foundation: "finish_to_start"
619
+ origin: "@afokapu/atdd-bun"
620
+ reason: "Bun/htmx realization of the Vite presentation smoke rule"
621
+ source_ref: "tester.htmx.presentation-smoke-coverage"
622
+ strength: "important"
623
+ target_ref: "tester.vite.presentation-smoke-coverage"
624
+ type: "requires"
625
+ - confidence: 1
626
+ constraint: "mandatory"
627
+ control: "internal"
628
+ foundation: "start_to_start"
629
+ origin: "@afokapu/atdd-bun"
630
+ reason: "the static cause and the rendered proof of horizontal overflow"
631
+ source_ref: "tester.htmx.responsive-harness"
632
+ strength: "important"
633
+ target_ref: "coder.bun.responsive-no-fixed-width"
634
+ type: "runs_alongside"
635
+ - confidence: 1
636
+ constraint: "mandatory"
637
+ control: "internal"
638
+ foundation: "finish_to_start"
639
+ origin: "@afokapu/atdd-bun"
640
+ reason: "a browser can only prove a page fits a phone once the page declares a device-width viewport"
641
+ source_ref: "tester.htmx.responsive-harness"
642
+ strength: "critical"
643
+ target_ref: "coder.bun.responsive-viewport-meta"
644
+ type: "requires"
645
+ - confidence: 1
646
+ constraint: "mandatory"
647
+ control: "internal"
648
+ foundation: "finish_to_start"
649
+ origin: "@afokapu/atdd-bun"
650
+ reason: "a responsive spec is identified by its RESP harness code"
651
+ source_ref: "tester.htmx.responsive-harness"
652
+ strength: "important"
653
+ target_ref: "tester.htmx.journey-urn-format"
654
+ type: "requires"
655
+ - confidence: 1
656
+ constraint: "mandatory"
657
+ control: "internal"
658
+ foundation: "start_to_start"
659
+ origin: "@afokapu/atdd-bun"
660
+ reason: "the same exposed journeys, proven to run and proven to fit every viewport"
661
+ source_ref: "tester.htmx.responsive-journey-coverage"
662
+ strength: "important"
663
+ target_ref: "tester.htmx.exposed-journey-e2e-coverage"
664
+ type: "runs_alongside"
665
+ - confidence: 1
666
+ constraint: "mandatory"
667
+ control: "internal"
668
+ foundation: "finish_to_start"
669
+ origin: "@afokapu/atdd-bun"
670
+ reason: "a journey counts as covered only by a RESP spec that meets the responsive harness"
671
+ source_ref: "tester.htmx.responsive-journey-coverage"
672
+ strength: "critical"
673
+ target_ref: "tester.htmx.responsive-harness"
674
+ type: "requires"
675
+ - confidence: 1
676
+ constraint: "mandatory"
677
+ control: "internal"
678
+ foundation: "start_to_start"
679
+ origin: "@afokapu/atdd-bun"
680
+ reason: "browser coverage per train beside runner-level coverage per interlocking route"
681
+ source_ref: "tester.htmx.train-e2e-coverage"
682
+ strength: "important"
683
+ target_ref: "tester.bun.interlocking-route-coverage"
684
+ type: "runs_alongside"
685
+ - confidence: 1
686
+ constraint: "mandatory"
687
+ control: "internal"
688
+ foundation: "start_to_start"
689
+ origin: "@afokapu/atdd-bun"
690
+ reason: "the two directions between trains and browser specs: every train has a spec, and every covered train is reachable"
691
+ source_ref: "tester.htmx.train-e2e-coverage"
692
+ strength: "important"
693
+ target_ref: "tester.htmx.covered-train-is-routed"
694
+ type: "runs_alongside"
695
+ - confidence: 1
696
+ constraint: "mandatory"
697
+ control: "internal"
698
+ foundation: "finish_to_start"
699
+ origin: "@afokapu/atdd-bun"
700
+ reason: "Bun/htmx realization of the Vite train coverage rule"
701
+ source_ref: "tester.htmx.train-e2e-coverage"
702
+ strength: "important"
703
+ target_ref: "tester.vite.train-e2e-coverage"
704
+ type: "requires"
705
+ - confidence: 1
706
+ constraint: "mandatory"
707
+ control: "internal"
708
+ foundation: "finish_to_start"
709
+ origin: "@afokapu/atdd-bun"
710
+ reason: "a visual spec is identified by its VIS harness code"
711
+ source_ref: "tester.htmx.visual-harness"
712
+ strength: "important"
713
+ target_ref: "tester.htmx.journey-urn-format"
714
+ type: "requires"
715
+ - confidence: 1
716
+ constraint: "mandatory"
717
+ control: "internal"
718
+ foundation: "finish_to_start"
719
+ origin: "@afokapu/atdd-bun"
720
+ reason: "Bun/htmx realization of the Vite visual harness"
721
+ source_ref: "tester.htmx.visual-harness"
722
+ strength: "important"
723
+ target_ref: "tester.vite.visual-harness"
724
+ type: "requires"
725
+ - confidence: 1
726
+ constraint: "mandatory"
727
+ control: "internal"
728
+ foundation: "finish_to_start"
729
+ origin: "@afokapu/atdd-bun"
730
+ reason: "a test's binding must be declared before it can be resolved against the plan"
731
+ source_ref: "traceability.test.binding-resolves"
732
+ strength: "critical"
733
+ target_ref: "tester.bun.acceptance-binding-declared"
734
+ type: "requires"