@afokapu/atdd-bun 0.4.0 → 0.6.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 (209) hide show
  1. package/README.md +85 -3
  2. package/conventions/coder.bun/coder.bun.complexity-cyclomatic.convention.yaml +1 -3
  3. package/conventions/coder.bun/coder.bun.complexity-length.convention.yaml +1 -2
  4. package/conventions/coder.bun/coder.bun.complexity-nesting.convention.yaml +1 -2
  5. package/conventions/coder.bun/coder.bun.dead-code-reachability.convention.yaml +1 -2
  6. package/conventions/coder.bun/coder.bun.design-token-color.convention.yaml +1 -1
  7. package/conventions/coder.bun/coder.bun.design-token-hardcoded.convention.yaml +1 -1
  8. package/conventions/coder.bun/coder.bun.dto-mapper.convention.yaml +2 -1
  9. package/conventions/coder.bun/coder.bun.dto-placement.convention.yaml +2 -1
  10. package/conventions/coder.bun/coder.bun.dto-purity.convention.yaml +2 -1
  11. package/conventions/coder.bun/coder.bun.duplication-intra-layer.convention.yaml +1 -2
  12. package/conventions/coder.bun/coder.bun.green-header-order.convention.yaml +2 -11
  13. package/conventions/coder.bun/coder.bun.green-header-purpose.convention.yaml +2 -11
  14. package/conventions/coder.bun/coder.bun.green-header-runtime.convention.yaml +2 -11
  15. package/conventions/coder.bun/coder.bun.green-header-tested-by.convention.yaml +2 -11
  16. package/conventions/coder.bun/coder.bun.green-urn-layer.convention.yaml +2 -11
  17. package/conventions/coder.bun/coder.bun.green-urn-marker.convention.yaml +2 -12
  18. package/conventions/coder.bun/coder.bun.green-urn-name-matches.convention.yaml +3 -12
  19. package/conventions/coder.bun/coder.bun.green-urn-pattern.convention.yaml +2 -11
  20. package/conventions/coder.bun/coder.bun.green-urn-side.convention.yaml +2 -11
  21. package/conventions/coder.bun/coder.bun.green-urn-wagon-feature.convention.yaml +2 -11
  22. package/conventions/coder.bun/coder.bun.layer-naming.convention.yaml +2 -1
  23. package/conventions/coder.bun/coder.bun.logging-structured.convention.yaml +2 -4
  24. package/conventions/coder.bun/coder.bun.quality-comments.convention.yaml +1 -2
  25. package/conventions/coder.bun/coder.bun.quality-mi.convention.yaml +1 -2
  26. package/conventions/coder.bun/coder.bun.responsive-breakpoints-declared.convention.yaml +31 -0
  27. package/conventions/coder.bun/coder.bun.responsive-no-fixed-width.convention.yaml +30 -0
  28. package/conventions/coder.bun/coder.bun.responsive-viewport-meta.convention.yaml +31 -0
  29. package/conventions/coder.bun/coder.bun.runtime-executes-the-declaration.convention.yaml +2 -18
  30. package/conventions/coder.bun/coder.bun.runtime-typecheck-enforced.convention.yaml +2 -15
  31. package/conventions/coder.htmx/coder.htmx.swap-no-inline-handler.convention.yaml +3 -3
  32. package/conventions/coder.htmx/coder.htmx.verb-endpoint-is-routed.convention.yaml +2 -2
  33. package/conventions/coder.htmx/coder.htmx.verb-mutation-signals-progress.convention.yaml +3 -2
  34. package/conventions/planner.docs/planner.docs.adr-registry-derived.convention.yaml +2 -12
  35. package/conventions/planner.docs/planner.docs.area-index-required.convention.yaml +2 -12
  36. package/conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml +2 -12
  37. package/conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml +2 -13
  38. package/conventions/planner.docs/planner.docs.doc-id-unique.convention.yaml +2 -12
  39. package/conventions/planner.docs/planner.docs.graph-target-resolves.convention.yaml +2 -12
  40. package/conventions/planner.docs/planner.docs.identity-required.convention.yaml +2 -12
  41. package/conventions/planner.docs/planner.docs.reference-integrity.convention.yaml +2 -12
  42. package/conventions/planner.docs/planner.docs.undeclared-change.convention.yaml +2 -12
  43. package/conventions/tester.bun/tester.bun.acceptance-binding-declared.convention.yaml +2 -6
  44. package/conventions/tester.bun/tester.bun.acceptance-covers-tag-well-formed.convention.yaml +1 -5
  45. package/conventions/tester.bun/tester.bun.interlocking-train-sequence-is-exercised.convention.yaml +2 -14
  46. package/conventions/tester.bun/tester.bun.red-behavioral-assertion.convention.yaml +1 -5
  47. package/conventions/tester.bun/tester.bun.routing-runtime-family.convention.yaml +2 -1
  48. package/conventions/tester.bun/tester.bun.smoke-no-collaborator-substitution.convention.yaml +2 -7
  49. package/conventions/tester.bun/tester.bun.smoke-observable-assertion.convention.yaml +2 -7
  50. package/conventions/tester.bun/tester.bun.telemetry-emit.convention.yaml +2 -1
  51. package/conventions/tester.bun/tester.bun.test-carries-urn-identity.convention.yaml +2 -6
  52. package/conventions/tester.bun/tester.bun.test-isolation-no-live-state.convention.yaml +1 -5
  53. package/conventions/tester.bun/tester.bun.test-no-self-skip.convention.yaml +1 -5
  54. package/conventions/tester.bun/tester.bun.test-phase-declared.convention.yaml +2 -6
  55. package/conventions/tester.htmx/tester.htmx.a11y-harness.convention.yaml +32 -0
  56. package/conventions/tester.htmx/tester.htmx.covered-train-is-routed.convention.yaml +30 -0
  57. package/conventions/tester.htmx/tester.htmx.e2e-binds-declared-subject.convention.yaml +31 -0
  58. package/conventions/tester.htmx/tester.htmx.e2e-spec-naming.convention.yaml +32 -0
  59. package/conventions/tester.htmx/tester.htmx.exposed-journey-e2e-coverage.convention.yaml +31 -0
  60. package/conventions/tester.htmx/tester.htmx.fragment-asserts-returned-markup.convention.yaml +2 -6
  61. package/conventions/tester.htmx/tester.htmx.journey-binding-header.convention.yaml +32 -0
  62. package/conventions/tester.htmx/tester.htmx.journey-layer-assembly.convention.yaml +29 -0
  63. package/conventions/tester.htmx/tester.htmx.journey-no-acceptance-marker.convention.yaml +29 -0
  64. package/conventions/tester.htmx/tester.htmx.journey-urn-format.convention.yaml +32 -0
  65. package/conventions/tester.htmx/tester.htmx.presentation-smoke-coverage.convention.yaml +31 -0
  66. package/conventions/tester.htmx/tester.htmx.responsive-harness.convention.yaml +33 -0
  67. package/conventions/tester.htmx/tester.htmx.responsive-journey-coverage.convention.yaml +30 -0
  68. package/conventions/tester.htmx/tester.htmx.swap-oob-asserts-destination-id.convention.yaml +2 -1
  69. package/conventions/tester.htmx/tester.htmx.train-e2e-coverage.convention.yaml +32 -0
  70. package/conventions/tester.htmx/tester.htmx.verb-endpoint-coverage.convention.yaml +2 -1
  71. package/conventions/tester.htmx/tester.htmx.visual-harness.convention.yaml +28 -0
  72. package/conventions/traceability/traceability.plan.executable-acceptance-has-test.convention.yaml +5 -0
  73. package/conventions/traceability/traceability.source.tested-by-present.convention.yaml +5 -0
  74. package/conventions/traceability/traceability.source.tested-by-resolves.convention.yaml +5 -0
  75. package/conventions/traceability/traceability.test.binding-resolves.convention.yaml +5 -0
  76. package/detectors/atdd_topology/atdd.implementation.yaml +13 -0
  77. package/detectors/atdd_topology/detect.mjs +171 -0
  78. package/detectors/atdd_topology/fixtures/clean/atdd-bun.yaml +2 -0
  79. package/detectors/atdd_topology/fixtures/clean/e2e/interlockings/checkout/nominal.routes.test.ts +4 -0
  80. package/detectors/atdd_topology/fixtures/clean/e2e/journeys/checkout.journey.test.ts +4 -0
  81. package/detectors/atdd_topology/fixtures/clean/implementation/orders/features/place-order/domain/order.ts +4 -0
  82. package/detectors/atdd_topology/fixtures/clean/plan/_journeys/checkout.yaml +4 -0
  83. package/detectors/atdd_topology/fixtures/clean/plan/_trains/_interlockings/checkout.yaml +4 -0
  84. package/detectors/atdd_topology/fixtures/clean/plan/_trains/checkout.yaml +1 -0
  85. package/detectors/atdd_topology/fixtures/clean/plan/orders/E001.yaml +6 -0
  86. package/detectors/atdd_topology/fixtures/clean/plan/orders/_orders.yaml +5 -0
  87. package/detectors/atdd_topology/fixtures/clean/plan/orders/place-order.yaml +3 -0
  88. package/detectors/atdd_topology/fixtures/clean/tests/wagons/orders/features/place-order/unit/order.test.ts +4 -0
  89. package/detectors/atdd_topology/fixtures/dirty/plan/_journeys/checkout.yaml +3 -0
  90. package/detectors/atdd_topology/fixtures/dirty/plan/orders/E001.yaml +4 -0
  91. package/detectors/atdd_topology/fixtures/dirty/plan/orders/_orders.yaml +4 -0
  92. package/detectors/atdd_topology/fixtures/dirty/plan/orders/features/place-order.yaml +3 -0
  93. package/detectors/atdd_topology/fixtures/dirty/src/wagons/orders/features/place-order/domain/forged.ts +2 -0
  94. package/detectors/atdd_topology/fixtures/dirty/src/wagons/orders/features/place-order/domain/order.ts +2 -0
  95. package/detectors/atdd_topology/fixtures/dirty/tests/wagons/orders/features/place-order/unit/order.test.ts +4 -0
  96. package/detectors/atdd_traceability_closure/detect.mjs +5 -2
  97. package/detectors/bun_green_traceability_detector/urn_header.mjs +2 -1
  98. package/detectors/bun_interlocking_binding/checks/interlocking_runtime_executes.mjs +3 -2
  99. package/detectors/bun_interlocking_binding/detect.mjs +6 -5
  100. package/detectors/bun_interlocking_coverage/_shared/interlocking.mjs +4 -3
  101. package/detectors/bun_interlocking_coverage/checks/interlocking_train_sequence.mjs +2 -2
  102. package/detectors/bun_interlocking_infrastructure/_shared/interlocking.mjs +2 -1
  103. package/detectors/bun_interlocking_infrastructure/checks/journey_runner_boundary.mjs +3 -2
  104. package/detectors/bun_interlocking_infrastructure/checks/journey_station_routing.mjs +2 -1
  105. package/detectors/bun_interlocking_infrastructure/checks/wagon_contract_honoured.mjs +3 -2
  106. package/detectors/bun_responsive_detector/atdd.implementation.yaml +18 -0
  107. package/detectors/bun_responsive_detector/checks/_map.json +5 -0
  108. package/detectors/bun_responsive_detector/checks/_responsive.mjs +20 -0
  109. package/detectors/bun_responsive_detector/checks/responsive_breakpoints_declared.mjs +21 -0
  110. package/detectors/bun_responsive_detector/checks/responsive_no_fixed_width.mjs +13 -0
  111. package/detectors/bun_responsive_detector/checks/responsive_viewport_meta.mjs +20 -0
  112. package/detectors/bun_responsive_detector/detect.mjs +46 -0
  113. package/detectors/bun_responsive_detector/fixtures/clean/public/index.html +9 -0
  114. package/detectors/bun_responsive_detector/fixtures/clean/src/app.css +13 -0
  115. package/detectors/bun_responsive_detector/fixtures/clean/src/document.ts +7 -0
  116. package/detectors/bun_responsive_detector/fixtures/clean/src/fragment.html +1 -0
  117. package/detectors/bun_responsive_detector/fixtures/clean/src/head.ts +1 -0
  118. package/detectors/bun_responsive_detector/fixtures/clean/src/layout.tsx +8 -0
  119. package/detectors/bun_responsive_detector/fixtures/clean/src/range.css +3 -0
  120. package/detectors/bun_responsive_detector/fixtures/clean/src/viewport-expression.tsx +5 -0
  121. package/detectors/bun_responsive_detector/fixtures/dirty/public/fixed-viewport.html +5 -0
  122. package/detectors/bun_responsive_detector/fixtures/dirty/public/no-meta.html +5 -0
  123. package/detectors/bun_responsive_detector/fixtures/dirty/public/no-zoom.html +5 -0
  124. package/detectors/bun_responsive_detector/fixtures/dirty/public/scale.html +5 -0
  125. package/detectors/bun_responsive_detector/fixtures/dirty/src/app.css +4 -0
  126. package/detectors/bun_responsive_detector/fixtures/dirty/src/render.ts +2 -0
  127. package/detectors/bun_responsive_detector/fixtures/dirty/src/units.css +3 -0
  128. package/detectors/bun_responsive_detector/fixtures/dirty/src/wide.tsx +3 -0
  129. package/detectors/bun_tester_discipline_detector/checks/t_acceptance_resolves.mjs +7 -6
  130. package/detectors/htmx_e2e_detector/atdd.implementation.yaml +40 -0
  131. package/detectors/htmx_e2e_detector/checks/_e2e.mjs +98 -0
  132. package/detectors/htmx_e2e_detector/checks/_map.json +16 -0
  133. package/detectors/htmx_e2e_detector/checks/a11y_harness.mjs +21 -0
  134. package/detectors/htmx_e2e_detector/checks/covered_train_is_routed.mjs +6 -0
  135. package/detectors/htmx_e2e_detector/checks/e2e_binds_declared_subject.mjs +11 -0
  136. package/detectors/htmx_e2e_detector/checks/e2e_spec_naming.mjs +6 -0
  137. package/detectors/htmx_e2e_detector/checks/exposed_journey_e2e_coverage.mjs +7 -0
  138. package/detectors/htmx_e2e_detector/checks/journey_binding_header.mjs +13 -0
  139. package/detectors/htmx_e2e_detector/checks/journey_layer_assembly.mjs +11 -0
  140. package/detectors/htmx_e2e_detector/checks/journey_no_acceptance_marker.mjs +6 -0
  141. package/detectors/htmx_e2e_detector/checks/journey_urn_format.mjs +18 -0
  142. package/detectors/htmx_e2e_detector/checks/presentation_smoke_coverage.mjs +15 -0
  143. package/detectors/htmx_e2e_detector/checks/responsive_harness.mjs +30 -0
  144. package/detectors/htmx_e2e_detector/checks/responsive_journey_coverage.mjs +7 -0
  145. package/detectors/htmx_e2e_detector/checks/train_e2e_coverage.mjs +7 -0
  146. package/detectors/htmx_e2e_detector/checks/visual_harness.mjs +7 -0
  147. package/detectors/htmx_e2e_detector/detect.mjs +46 -0
  148. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy-alias.a11y.e2e.ts +12 -0
  149. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy-inline.responsive.e2e.ts +11 -0
  150. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.a11y.e2e.ts +12 -0
  151. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.responsive.e2e.ts +14 -0
  152. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.visual.e2e.ts +10 -0
  153. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/checkout-buy.smoke.e2e.ts +10 -0
  154. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/crlf.e2e.ts +10 -0
  155. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/place-order.e2e.ts +10 -0
  156. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/reject-empty-cart.e2e.ts +10 -0
  157. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/support/fixtures.ts +3 -0
  158. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/take-payment.e2e.ts +10 -0
  159. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_journeys/buy.yaml +19 -0
  160. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_journeys/settle.yaml +14 -0
  161. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/checkout.yaml +21 -0
  162. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/payment.yaml +16 -0
  163. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/settlement.yaml +16 -0
  164. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/place-order.yaml +11 -0
  165. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/reject-empty-cart.yaml +11 -0
  166. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/settle-ledger.yaml +11 -0
  167. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/take-payment.yaml +11 -0
  168. package/detectors/htmx_e2e_detector/fixtures/clean/playwright.config.ts +3 -0
  169. package/detectors/htmx_e2e_detector/fixtures/clean/src/wagons/checkout/presentation/cart.tsx +3 -0
  170. package/detectors/htmx_e2e_detector/fixtures/clean/tests/urn-parser.test.ts +7 -0
  171. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/acceptance.e2e.ts +6 -0
  172. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/bad-id.e2e.ts +10 -0
  173. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/bad-urn.e2e.ts +10 -0
  174. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/both.e2e.ts +6 -0
  175. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.a11y.e2e.ts +10 -0
  176. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.responsive.e2e.ts +11 -0
  177. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.visual.e2e.ts +10 -0
  178. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/covered.e2e.ts +10 -0
  179. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/first-only.responsive.e2e.ts +13 -0
  180. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/ghost.e2e.ts +10 -0
  181. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/misnamed.spec.ts +10 -0
  182. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-binding.e2e.ts +4 -0
  183. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-layer.e2e.ts +4 -0
  184. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-urn.e2e.ts +4 -0
  185. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/tautology.a11y.e2e.ts +11 -0
  186. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/two-trains.e2e.ts +6 -0
  187. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/unrouted.e2e.ts +10 -0
  188. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/wrong-layer.e2e.ts +5 -0
  189. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/wrong-urn.e2e.ts +10 -0
  190. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_journeys/browse.yaml +16 -0
  191. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_journeys/buy.yaml +16 -0
  192. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/_interlockings/checkout.yaml +21 -0
  193. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/covered.yaml +11 -0
  194. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/uncovered.yaml +11 -0
  195. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/unrouted.yaml +11 -0
  196. package/detectors/htmx_e2e_detector/fixtures/dirty/src/wagons/billing/presentation/invoice.tsx +3 -0
  197. package/integrity.json +208 -79
  198. package/lib/frontend.mjs +17 -0
  199. package/lib/scan.mjs +6 -2
  200. package/package.json +5 -1
  201. package/planner-nodes/ENFORCEMENT_SCOPE.yaml +18 -1
  202. package/relationships.yaml +4782 -4506
  203. package/src/enforce.ts +10 -7
  204. package/src/hooks.ts +2 -1
  205. package/src/index.ts +2 -0
  206. package/src/planner-kernel.ts +2 -1
  207. package/src/planner-schema-validator.ts +12 -10
  208. package/src/planner-validators.ts +16 -15
  209. package/src/topology.ts +40 -0
@@ -0,0 +1,30 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.covered-train-is-routed
3
+ kind: rule
4
+ status: active
5
+ name: A train a browser spec covers is selected by an interlocking route
6
+ statement: A declared train that a journey spec binds to MUST be selected by at least one interlocking route. Bun/htmx
7
+ realization of `tester.vite.covered-train-is-routed`, strict.
8
+ terms:
9
+ - term_id: browser_spec
10
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
11
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
12
+ A unit test that merely mentions a journey URN in a string is not one.'
13
+ content:
14
+ summary: A train a browser spec covers is selected by an interlocking route.
15
+ normative_text: A spec can stay green while exercising a train nothing in the application can reach. Covering
16
+ an unrouted train proves nothing about the product.
17
+ fix_hint: Route the train from an interlocking, or bind the spec to a routed train.
18
+ exceptions:
19
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
20
+ - Undeclared trains are reported by `tester.htmx.e2e-binds-declared-subject`.
21
+ metadata:
22
+ aliases:
23
+ - BUN-E2E-COVERED-TRAIN-IS-ROUTED-001
24
+ severity: 3
25
+ disposition: strict
26
+ introduced_in: 0.5.0
27
+ mirrors: tester.vite.covered-train-is-routed
28
+ implementation:
29
+ type: validator
30
+ ref: htmx_e2e_detector
@@ -0,0 +1,31 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.e2e-binds-declared-subject
3
+ kind: rule
4
+ status: active
5
+ name: A journey spec binds to a train or journey plan/ declares
6
+ statement: When the repository declares a plan, the train or journey a journey spec binds to MUST be declared under
7
+ `plan/`. Bun/htmx realization of `tester.vite.e2e-names-valid-train`, strict.
8
+ terms:
9
+ - term_id: browser_spec
10
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
11
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
12
+ A unit test that merely mentions a journey URN in a string is not one.'
13
+ content:
14
+ summary: A journey spec binds to a train or journey plan/ declares.
15
+ normative_text: 'A spec bound to an undeclared subject is orphaned: it can pass forever while the plan it claims
16
+ to cover says nothing about it.'
17
+ fix_hint: Bind the spec to the declared id, or declare the train or journey.
18
+ exceptions:
19
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
20
+ - A repository with no plan (no trains, no journeys) is out of scope.
21
+ - A malformed binding is reported by `tester.htmx.journey-binding-header`, not here.
22
+ metadata:
23
+ aliases:
24
+ - BUN-E2E-E2E-BINDS-DECLARED-SUBJECT-001
25
+ severity: 3
26
+ disposition: strict
27
+ introduced_in: 0.5.0
28
+ mirrors: tester.vite.e2e-names-valid-train
29
+ implementation:
30
+ type: validator
31
+ ref: htmx_e2e_detector
@@ -0,0 +1,32 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.e2e-spec-naming
3
+ kind: rule
4
+ status: active
5
+ name: Playwright specs are named *.e2e.ts
6
+ statement: A file that imports `@playwright/test` and declares tests (`test(...)`, `test.describe(...)`) MUST be
7
+ named `*.e2e.ts` (`.js`, `.mjs`, `.tsx` variants allowed). `bun test` collects every `*.test.*` and `*.spec.*`
8
+ file, so a Playwright spec named that way is executed by the wrong runner and fails, or worse is skipped by a
9
+ filter nobody remembers. New in the Bun/htmx browser tester, strict.
10
+ terms:
11
+ - term_id: browser_spec
12
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
13
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
14
+ A unit test that merely mentions a journey URN in a string is not one.'
15
+ content:
16
+ summary: Playwright specs are named *.e2e.ts.
17
+ normative_text: 'One naming rule keeps the two runners apart: `bun test` runs unit, acceptance and smoke tests,
18
+ Playwright runs browser specs, and neither ever picks up the other''s files.'
19
+ fix_hint: Rename `login.spec.ts` to `login.e2e.ts` and point Playwright's `testMatch` at `**/*.e2e.ts`.
20
+ exceptions:
21
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
22
+ - Files that do not import `@playwright/test` are out of scope.
23
+ - '`playwright.config.*` and fixture modules that only extend `test` declare no tests and are out of scope.'
24
+ metadata:
25
+ aliases:
26
+ - BUN-E2E-E2E-SPEC-NAMING-001
27
+ severity: 3
28
+ disposition: strict
29
+ introduced_in: 0.5.0
30
+ implementation:
31
+ type: validator
32
+ ref: htmx_e2e_detector
@@ -0,0 +1,31 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.exposed-journey-e2e-coverage
3
+ kind: rule
4
+ status: active
5
+ name: Every exposed journey has an E2E or SMOKE browser spec
6
+ statement: Every journey whose entrypoint is exposed and whose `surfaces` include `frontend` (or declare none) MUST
7
+ have at least one journey spec bound to it by `// Journey:` with an E2E or SMOKE test URN. New in the Bun/htmx
8
+ browser tester, strict.
9
+ terms:
10
+ - term_id: browser_spec
11
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
12
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
13
+ A unit test that merely mentions a journey URN in a string is not one.'
14
+ content:
15
+ summary: Every exposed journey has an E2E or SMOKE browser spec.
16
+ normative_text: An exposed journey is what a user can start. The route-level rules prove each routing decision;
17
+ this proves the journey runs end to end in a browser.
18
+ fix_hint: 'Add `e2e/<journey>.smoke.e2e.ts` bound with `// Journey: <journey id>`.'
19
+ exceptions:
20
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
21
+ - Internal journeys, and exposed journeys whose entrypoint `surfaces` exclude `frontend` (for example `[backend]`),
22
+ have no browser surface and are out of scope.
23
+ metadata:
24
+ aliases:
25
+ - BUN-E2E-EXPOSED-JOURNEY-E2E-COVERAGE-001
26
+ severity: 3
27
+ disposition: strict
28
+ introduced_in: 0.5.0
29
+ implementation:
30
+ type: validator
31
+ ref: htmx_e2e_detector
@@ -40,12 +40,8 @@ metadata:
40
40
  # contract from the payload into the markup. Stack-native, not inherited.
41
41
  - BUN-FRAGMENT-ASSERTS-MARKUP-001
42
42
  severity: 3
43
- # Core's tester nodes are largely `documentation-only`, which core's
44
- # coverage_report treats as never-fails-the-build. That is right for retrofitting
45
- # and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
46
- # that will not be adopted. Gating dispositions here; a repo adopting on an
47
- # existing suite records a ratchet baseline instead.
48
- disposition: suppress-and-clean
43
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
44
+ disposition: strict
49
45
  introduced_in: 0.1.0
50
46
  implementation:
51
47
  type: validator
@@ -0,0 +1,32 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.journey-binding-header
3
+ kind: rule
4
+ status: active
5
+ name: A journey spec binds to exactly one train or journey
6
+ statement: 'A journey spec (a `*.e2e.ts` file, or any test file whose header comments carry a `// Train:`, `// Journey:`
7
+ or `// URN: test:train|journey:` marker) MUST carry exactly one binding header: `// Train: train:<subject>:<slug>`
8
+ or `// Journey: journey:<id>`, each matching the planner''s identity grammar. Bun/htmx realization of `tester.vite.journey-train-header`,
9
+ strict.'
10
+ terms:
11
+ - term_id: browser_spec
12
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
13
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
14
+ A unit test that merely mentions a journey URN in a string is not one.'
15
+ content:
16
+ summary: A journey spec binds to exactly one train or journey.
17
+ normative_text: The binding is how a browser test is traced to the plan it exercises. A spec with no binding,
18
+ two bindings, or an id the planner would reject cannot be traced.
19
+ fix_hint: 'Add `// Train: train:orders:place-order` (or `// Journey: journey:buy`) to the header block.'
20
+ exceptions:
21
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
22
+ - Unit and acceptance tests carrying none of the journey markers are out of scope.
23
+ metadata:
24
+ aliases:
25
+ - BUN-E2E-JOURNEY-BINDING-HEADER-001
26
+ severity: 3
27
+ disposition: strict
28
+ introduced_in: 0.5.0
29
+ mirrors: tester.vite.journey-train-header
30
+ implementation:
31
+ type: validator
32
+ ref: htmx_e2e_detector
@@ -0,0 +1,29 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.journey-layer-assembly
3
+ kind: rule
4
+ status: active
5
+ name: 'A journey spec declares Layer: assembly'
6
+ statement: 'A journey spec MUST carry `// Layer: assembly`. Bun/htmx realization of `tester.vite.journey-layer-assembly`,
7
+ strict.'
8
+ terms:
9
+ - term_id: browser_spec
10
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
11
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
12
+ A unit test that merely mentions a journey URN in a string is not one.'
13
+ content:
14
+ summary: 'A journey spec declares Layer: assembly.'
15
+ normative_text: A browser test exercises the assembled application, not a layer of it. A missing or wrong Layer
16
+ routes the result to the wrong layer bucket.
17
+ fix_hint: 'Add `// Layer: assembly` to the header block.'
18
+ exceptions:
19
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
20
+ metadata:
21
+ aliases:
22
+ - BUN-E2E-JOURNEY-LAYER-ASSEMBLY-001
23
+ severity: 3
24
+ disposition: strict
25
+ introduced_in: 0.5.0
26
+ mirrors: tester.vite.journey-layer-assembly
27
+ implementation:
28
+ type: validator
29
+ ref: htmx_e2e_detector
@@ -0,0 +1,29 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.journey-no-acceptance-marker
3
+ kind: rule
4
+ status: active
5
+ name: A journey spec carries no Acceptance or WMBT header
6
+ statement: A journey spec MUST NOT carry `// Acceptance:` or `// WMBT:` header lines. Bun/htmx realization of `tester.vite.journey-no-acceptance-marker`,
7
+ strict.
8
+ terms:
9
+ - term_id: browser_spec
10
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
11
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
12
+ A unit test that merely mentions a journey URN in a string is not one.'
13
+ content:
14
+ summary: A journey spec carries no Acceptance or WMBT header.
15
+ normative_text: 'Journey and acceptance identities are exclusive: a journey test binds to a train or journey,
16
+ an acceptance test to an Acceptance/WMBT pair. Carrying both makes the test ambiguous about what it proves.'
17
+ fix_hint: Move acceptance assertions to an acceptance test, or drop the Acceptance/WMBT lines.
18
+ exceptions:
19
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
20
+ metadata:
21
+ aliases:
22
+ - BUN-E2E-JOURNEY-NO-ACCEPTANCE-MARKER-001
23
+ severity: 3
24
+ disposition: strict
25
+ introduced_in: 0.5.0
26
+ mirrors: tester.vite.journey-no-acceptance-marker
27
+ implementation:
28
+ type: validator
29
+ ref: htmx_e2e_detector
@@ -0,0 +1,32 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.journey-urn-format
3
+ kind: rule
4
+ status: active
5
+ name: A journey spec carries well-formed test URNs for its own subject
6
+ statement: A journey spec MUST carry at least one test URN `test:{train|journey}:<id>:{E2E|SMOKE|A11Y|VIS|RESP}-NNN-<slug>`,
7
+ and every URN it carries MUST be well-formed and name the subject its binding header declares. Bun/htmx realization
8
+ of `tester.vite.journey-urn-format`, strict.
9
+ terms:
10
+ - term_id: browser_spec
11
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
12
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
13
+ A unit test that merely mentions a journey URN in a string is not one.'
14
+ content:
15
+ summary: A journey spec carries well-formed test URNs for its own subject.
16
+ normative_text: The URN identifies the test instance and its harness. A malformed URN, or one naming another subject,
17
+ silently traces the result to the wrong place.
18
+ fix_hint: Use `test:train:orders:place-order:E2E-001-places-an-order` in the header and the test title.
19
+ exceptions:
20
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
21
+ - A URN is compared with the binding only when the binding itself is valid; a malformed binding is reported by
22
+ `tester.htmx.journey-binding-header` alone.
23
+ metadata:
24
+ aliases:
25
+ - BUN-E2E-JOURNEY-URN-FORMAT-001
26
+ severity: 3
27
+ disposition: strict
28
+ introduced_in: 0.5.0
29
+ mirrors: tester.vite.journey-urn-format
30
+ implementation:
31
+ type: validator
32
+ ref: htmx_e2e_detector
@@ -0,0 +1,31 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.presentation-smoke-coverage
3
+ kind: rule
4
+ status: active
5
+ name: Every presentation component is covered by a SMOKE browser spec
6
+ statement: Every `.tsx`/`.jsx` component under a `presentation/` path segment MUST be covered by a SMOKE browser
7
+ spec whose path names the component's wagon (the segment before `presentation`). Bun/htmx realization of `tester.vite.presentation-smoke-coverage`,
8
+ strict.
9
+ terms:
10
+ - term_id: browser_spec
11
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
12
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
13
+ A unit test that merely mentions a journey URN in a string is not one.'
14
+ content:
15
+ summary: Every presentation component is covered by a SMOKE browser spec.
16
+ normative_text: Structural tests stay green while a rendered feature is blank; only rendering it in a browser
17
+ proves it appears.
18
+ fix_hint: Add a SMOKE spec whose file name contains the wagon, for example `e2e/checkout-cart.smoke.e2e.ts`.
19
+ exceptions:
20
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
21
+ - Components outside a `presentation/` segment are out of scope.
22
+ metadata:
23
+ aliases:
24
+ - BUN-E2E-PRESENTATION-SMOKE-COVERAGE-001
25
+ severity: 3
26
+ disposition: strict
27
+ introduced_in: 0.5.0
28
+ mirrors: tester.vite.presentation-smoke-coverage
29
+ implementation:
30
+ type: validator
31
+ ref: htmx_e2e_detector
@@ -0,0 +1,33 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.responsive-harness
3
+ kind: rule
4
+ status: active
5
+ name: A RESP spec renders at every declared viewport and asserts no horizontal overflow
6
+ statement: 'A spec identified as responsive (a `RESP` test URN, or a `responsive`/`resp` token in its file name)
7
+ MUST render the page at every viewport width declared in `atdd-bun.yaml` under `frontend.viewports` (default 375,
8
+ 768, 1280), through `page.setViewportSize({ width })`, a `viewport: { width }` option, or a list of widths it
9
+ iterates (`for (const w of [...])`, `LIST.forEach`, `LIST.map`); picking one element of a list renders one width.
10
+ It MUST pass `scrollWidth`, directly or through a variable measured from it, to an `expect(...)` so the test fails
11
+ when the page overflows horizontally. New in the Bun/htmx browser tester, strict.'
12
+ terms:
13
+ - term_id: browser_spec
14
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
15
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
16
+ A unit test that merely mentions a journey URN in a string is not one.'
17
+ content:
18
+ summary: A RESP spec renders at every declared viewport and asserts no horizontal overflow.
19
+ normative_text: A screen that works on a desktop can be unusable on a phone. Rendering at each declared width
20
+ and asserting the document never scrolls sideways is the least that proves it fits.
21
+ fix_hint: '`for (const width of [375, 768, 1280]) { await page.setViewportSize({ width, height: 900 }); ... expect(scrollWidth
22
+ - clientWidth).toBeLessThanOrEqual(0); }`'
23
+ exceptions:
24
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
25
+ metadata:
26
+ aliases:
27
+ - BUN-E2E-RESPONSIVE-HARNESS-001
28
+ severity: 3
29
+ disposition: strict
30
+ introduced_in: 0.5.0
31
+ implementation:
32
+ type: validator
33
+ ref: htmx_e2e_detector
@@ -0,0 +1,30 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.responsive-journey-coverage
3
+ kind: rule
4
+ status: active
5
+ name: Every exposed journey has a RESP browser spec
6
+ statement: Every journey whose entrypoint is exposed and whose `surfaces` include `frontend` (or declare none) MUST
7
+ have a journey spec bound to it by `// Journey:` with a RESP test URN. New in the Bun/htmx browser tester, strict.
8
+ terms:
9
+ - term_id: browser_spec
10
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
11
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
12
+ A unit test that merely mentions a journey URN in a string is not one.'
13
+ content:
14
+ summary: Every exposed journey has a RESP browser spec.
15
+ normative_text: Every screen a user can reach should be proven to fit from mobile to desktop; exposed journeys
16
+ are exactly those screens, and new ones appear here as soon as the plan declares them.
17
+ fix_hint: 'Add `e2e/<journey>.responsive.e2e.ts` bound with `// Journey: <journey id>`.'
18
+ exceptions:
19
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
20
+ - Internal journeys, and exposed journeys whose entrypoint `surfaces` exclude `frontend`, have no screen to fit
21
+ and are out of scope.
22
+ metadata:
23
+ aliases:
24
+ - BUN-E2E-RESPONSIVE-JOURNEY-COVERAGE-001
25
+ severity: 3
26
+ disposition: strict
27
+ introduced_in: 0.5.0
28
+ implementation:
29
+ type: validator
30
+ ref: htmx_e2e_detector
@@ -41,7 +41,8 @@ metadata:
41
41
  # ADDED for this stack: core has no node for out-of-band swap testing.
42
42
  - BUN-OOB-TARGET-ASSERTED-001
43
43
  severity: 3
44
- disposition: suppress-and-clean
44
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
45
+ disposition: strict
45
46
  introduced_in: 0.1.0
46
47
  implementation:
47
48
  type: validator
@@ -0,0 +1,32 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.train-e2e-coverage
3
+ kind: rule
4
+ status: active
5
+ name: Every declared train has a browser spec
6
+ statement: Every human-facing train declared under `plan/` (one in which a `user:` participant takes part) MUST
7
+ have at least one journey spec bound to it by `// Train:`. Bun/htmx realization of `tester.vite.train-e2e-coverage`,
8
+ strict.
9
+ terms:
10
+ - term_id: browser_spec
11
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
12
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
13
+ A unit test that merely mentions a journey URN in a string is not one.'
14
+ content:
15
+ summary: Every declared train has a browser spec.
16
+ normative_text: 'A train with no browser spec is a silent gap: the journey it declares can regress with nothing
17
+ turning red.'
18
+ fix_hint: 'Add `e2e/<train-slug>.e2e.ts` bound with `// Train: <train id>`.'
19
+ exceptions:
20
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
21
+ - The rule reports at the train's plan file, where the gap was declared.
22
+ - Trains in which no person takes part (only wagons and systems) have no screen to drive and are out of scope.
23
+ metadata:
24
+ aliases:
25
+ - BUN-E2E-TRAIN-E2E-COVERAGE-001
26
+ severity: 3
27
+ disposition: strict
28
+ introduced_in: 0.5.0
29
+ mirrors: tester.vite.train-e2e-coverage
30
+ implementation:
31
+ type: validator
32
+ ref: htmx_e2e_detector
@@ -47,7 +47,8 @@ metadata:
47
47
  # ADDED for this stack: core has no node for hypermedia endpoint coverage.
48
48
  - BUN-ENDPOINT-COVERAGE-001
49
49
  severity: 2
50
- disposition: suppress-and-clean
50
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
51
+ disposition: strict
51
52
  introduced_in: 0.1.0
52
53
  implementation:
53
54
  type: validator
@@ -0,0 +1,28 @@
1
+ schema_version: 1.1.0
2
+ rule_id: tester.htmx.visual-harness
3
+ kind: rule
4
+ status: active
5
+ name: A VIS spec compares a screenshot
6
+ statement: A spec identified as visual (a `VIS` test URN, or a `visual`/`vis` token in its file name) MUST call
7
+ `toHaveScreenshot()` or `toMatchSnapshot()`. Bun/htmx realization of `tester.vite.visual-harness`, strict.
8
+ terms:
9
+ - term_id: browser_spec
10
+ text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
11
+ Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
12
+ A unit test that merely mentions a journey URN in a string is not one.'
13
+ content:
14
+ summary: A VIS spec compares a screenshot.
15
+ normative_text: A visual spec that captures nothing performs no visual regression.
16
+ fix_hint: '`await expect(page).toHaveScreenshot("checkout.png");`'
17
+ exceptions:
18
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
19
+ metadata:
20
+ aliases:
21
+ - BUN-E2E-VISUAL-HARNESS-001
22
+ severity: 3
23
+ disposition: strict
24
+ introduced_in: 0.5.0
25
+ mirrors: tester.vite.visual-harness
26
+ implementation:
27
+ type: validator
28
+ ref: htmx_e2e_detector
@@ -1,2 +1,7 @@
1
1
  rule_id: traceability.plan.executable-acceptance-has-test
2
2
  statement: Every declared acceptance is bound by at least one Bun test.
3
+ metadata:
4
+ disposition: strict
5
+ implementation:
6
+ type: validator
7
+ ref: atdd_traceability_closure
@@ -1,2 +1,7 @@
1
1
  rule_id: traceability.source.tested-by-present
2
2
  statement: Each identified implementation component declares a testing witness.
3
+ metadata:
4
+ disposition: strict
5
+ implementation:
6
+ type: validator
7
+ ref: atdd_traceability_closure
@@ -1,2 +1,7 @@
1
1
  rule_id: traceability.source.tested-by-resolves
2
2
  statement: Each implementation testing witness resolves to an identified Bun test.
3
+ metadata:
4
+ disposition: strict
5
+ implementation:
6
+ type: validator
7
+ ref: atdd_traceability_closure
@@ -1,2 +1,7 @@
1
1
  rule_id: traceability.test.binding-resolves
2
2
  statement: Each identified Bun test names a plan acceptance, WMBT, or train that resolves.
3
+ metadata:
4
+ disposition: strict
5
+ implementation:
6
+ type: validator
7
+ ref: atdd_traceability_closure
@@ -0,0 +1,13 @@
1
+ kind: implementation
2
+ subtype: guard
3
+ implementation_id: atdd_topology
4
+ emits_rule_ids:
5
+ - planner.wagon.features
6
+ - planner.feature.wagon-link
7
+ - atdd-bun.topology.plan-location
8
+ - atdd-bun.topology.source-location
9
+ - atdd-bun.topology.test-location
10
+ - atdd-bun.topology.e2e-location
11
+ - atdd-bun.topology.feature-source-coverage
12
+ - atdd-bun.topology.feature-test-coverage
13
+ entrypoint: detect.mjs