@afokapu/atdd-bun 0.3.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/PLANNER_PORT.md +1 -1
  2. package/README.md +111 -4
  3. package/conventions/coder.bun/coder.bun.complexity-cyclomatic.convention.yaml +1 -3
  4. package/conventions/coder.bun/coder.bun.complexity-length.convention.yaml +1 -2
  5. package/conventions/coder.bun/coder.bun.complexity-nesting.convention.yaml +1 -2
  6. package/conventions/coder.bun/coder.bun.dead-code-reachability.convention.yaml +1 -2
  7. package/conventions/coder.bun/coder.bun.design-token-color.convention.yaml +1 -1
  8. package/conventions/coder.bun/coder.bun.design-token-hardcoded.convention.yaml +1 -1
  9. package/conventions/coder.bun/coder.bun.dto-mapper.convention.yaml +2 -1
  10. package/conventions/coder.bun/coder.bun.dto-placement.convention.yaml +2 -1
  11. package/conventions/coder.bun/coder.bun.dto-purity.convention.yaml +2 -1
  12. package/conventions/coder.bun/coder.bun.duplication-intra-layer.convention.yaml +1 -2
  13. package/conventions/coder.bun/coder.bun.green-header-order.convention.yaml +2 -11
  14. package/conventions/coder.bun/coder.bun.green-header-purpose.convention.yaml +2 -11
  15. package/conventions/coder.bun/coder.bun.green-header-runtime.convention.yaml +2 -11
  16. package/conventions/coder.bun/coder.bun.green-header-tested-by.convention.yaml +2 -11
  17. package/conventions/coder.bun/coder.bun.green-urn-layer.convention.yaml +2 -11
  18. package/conventions/coder.bun/coder.bun.green-urn-marker.convention.yaml +2 -12
  19. package/conventions/coder.bun/coder.bun.green-urn-name-matches.convention.yaml +3 -12
  20. package/conventions/coder.bun/coder.bun.green-urn-pattern.convention.yaml +2 -11
  21. package/conventions/coder.bun/coder.bun.green-urn-side.convention.yaml +2 -11
  22. package/conventions/coder.bun/coder.bun.green-urn-wagon-feature.convention.yaml +2 -11
  23. package/conventions/coder.bun/coder.bun.layer-naming.convention.yaml +2 -1
  24. package/conventions/coder.bun/coder.bun.logging-structured.convention.yaml +2 -4
  25. package/conventions/coder.bun/coder.bun.quality-comments.convention.yaml +1 -2
  26. package/conventions/coder.bun/coder.bun.quality-mi.convention.yaml +1 -2
  27. package/conventions/coder.bun/coder.bun.responsive-breakpoints-declared.convention.yaml +31 -0
  28. package/conventions/coder.bun/coder.bun.responsive-no-fixed-width.convention.yaml +30 -0
  29. package/conventions/coder.bun/coder.bun.responsive-viewport-meta.convention.yaml +31 -0
  30. package/conventions/coder.bun/coder.bun.runtime-executes-the-declaration.convention.yaml +2 -18
  31. package/conventions/coder.bun/coder.bun.runtime-typecheck-enforced.convention.yaml +2 -15
  32. package/conventions/coder.htmx/coder.htmx.swap-no-inline-handler.convention.yaml +3 -3
  33. package/conventions/coder.htmx/coder.htmx.verb-endpoint-is-routed.convention.yaml +2 -2
  34. package/conventions/coder.htmx/coder.htmx.verb-mutation-signals-progress.convention.yaml +3 -2
  35. package/conventions/planner.docs/planner.docs.adr-registry-derived.convention.yaml +2 -12
  36. package/conventions/planner.docs/planner.docs.area-index-required.convention.yaml +2 -12
  37. package/conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml +2 -12
  38. package/conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml +2 -13
  39. package/conventions/planner.docs/planner.docs.doc-id-unique.convention.yaml +2 -12
  40. package/conventions/planner.docs/planner.docs.graph-target-resolves.convention.yaml +2 -12
  41. package/conventions/planner.docs/planner.docs.identity-required.convention.yaml +2 -12
  42. package/conventions/planner.docs/planner.docs.journey-view-current.convention.yaml +53 -0
  43. package/conventions/planner.docs/planner.docs.reference-integrity.convention.yaml +2 -12
  44. package/conventions/planner.docs/planner.docs.undeclared-change.convention.yaml +2 -12
  45. package/conventions/tester.bun/tester.bun.acceptance-binding-declared.convention.yaml +2 -6
  46. package/conventions/tester.bun/tester.bun.acceptance-covers-tag-well-formed.convention.yaml +1 -5
  47. package/conventions/tester.bun/tester.bun.interlocking-train-sequence-is-exercised.convention.yaml +2 -14
  48. package/conventions/tester.bun/tester.bun.red-behavioral-assertion.convention.yaml +1 -5
  49. package/conventions/tester.bun/tester.bun.routing-runtime-family.convention.yaml +2 -1
  50. package/conventions/tester.bun/tester.bun.smoke-no-collaborator-substitution.convention.yaml +2 -7
  51. package/conventions/tester.bun/tester.bun.smoke-observable-assertion.convention.yaml +2 -7
  52. package/conventions/tester.bun/tester.bun.telemetry-emit.convention.yaml +2 -1
  53. package/conventions/tester.bun/tester.bun.test-carries-urn-identity.convention.yaml +2 -6
  54. package/conventions/tester.bun/tester.bun.test-isolation-no-live-state.convention.yaml +1 -5
  55. package/conventions/tester.bun/tester.bun.test-no-self-skip.convention.yaml +1 -5
  56. package/conventions/tester.bun/tester.bun.test-phase-declared.convention.yaml +2 -6
  57. package/conventions/tester.htmx/tester.htmx.a11y-harness.convention.yaml +32 -0
  58. package/conventions/tester.htmx/tester.htmx.covered-train-is-routed.convention.yaml +30 -0
  59. package/conventions/tester.htmx/tester.htmx.e2e-binds-declared-subject.convention.yaml +31 -0
  60. package/conventions/tester.htmx/tester.htmx.e2e-spec-naming.convention.yaml +32 -0
  61. package/conventions/tester.htmx/tester.htmx.exposed-journey-e2e-coverage.convention.yaml +31 -0
  62. package/conventions/tester.htmx/tester.htmx.fragment-asserts-returned-markup.convention.yaml +2 -6
  63. package/conventions/tester.htmx/tester.htmx.journey-binding-header.convention.yaml +32 -0
  64. package/conventions/tester.htmx/tester.htmx.journey-layer-assembly.convention.yaml +29 -0
  65. package/conventions/tester.htmx/tester.htmx.journey-no-acceptance-marker.convention.yaml +29 -0
  66. package/conventions/tester.htmx/tester.htmx.journey-urn-format.convention.yaml +32 -0
  67. package/conventions/tester.htmx/tester.htmx.presentation-smoke-coverage.convention.yaml +31 -0
  68. package/conventions/tester.htmx/tester.htmx.responsive-harness.convention.yaml +33 -0
  69. package/conventions/tester.htmx/tester.htmx.responsive-journey-coverage.convention.yaml +30 -0
  70. package/conventions/tester.htmx/tester.htmx.swap-oob-asserts-destination-id.convention.yaml +2 -1
  71. package/conventions/tester.htmx/tester.htmx.train-e2e-coverage.convention.yaml +32 -0
  72. package/conventions/tester.htmx/tester.htmx.verb-endpoint-coverage.convention.yaml +2 -1
  73. package/conventions/tester.htmx/tester.htmx.visual-harness.convention.yaml +28 -0
  74. package/conventions/traceability/traceability.plan.executable-acceptance-has-test.convention.yaml +5 -0
  75. package/conventions/traceability/traceability.source.tested-by-present.convention.yaml +5 -0
  76. package/conventions/traceability/traceability.source.tested-by-resolves.convention.yaml +5 -0
  77. package/conventions/traceability/traceability.test.binding-resolves.convention.yaml +5 -0
  78. package/detectors/bun_green_traceability_detector/urn_header.mjs +2 -1
  79. package/detectors/bun_responsive_detector/atdd.implementation.yaml +18 -0
  80. package/detectors/bun_responsive_detector/checks/_map.json +5 -0
  81. package/detectors/bun_responsive_detector/checks/_responsive.mjs +20 -0
  82. package/detectors/bun_responsive_detector/checks/responsive_breakpoints_declared.mjs +21 -0
  83. package/detectors/bun_responsive_detector/checks/responsive_no_fixed_width.mjs +13 -0
  84. package/detectors/bun_responsive_detector/checks/responsive_viewport_meta.mjs +20 -0
  85. package/detectors/bun_responsive_detector/detect.mjs +46 -0
  86. package/detectors/bun_responsive_detector/fixtures/clean/public/index.html +9 -0
  87. package/detectors/bun_responsive_detector/fixtures/clean/src/app.css +13 -0
  88. package/detectors/bun_responsive_detector/fixtures/clean/src/document.ts +7 -0
  89. package/detectors/bun_responsive_detector/fixtures/clean/src/fragment.html +1 -0
  90. package/detectors/bun_responsive_detector/fixtures/clean/src/head.ts +1 -0
  91. package/detectors/bun_responsive_detector/fixtures/clean/src/layout.tsx +8 -0
  92. package/detectors/bun_responsive_detector/fixtures/clean/src/range.css +3 -0
  93. package/detectors/bun_responsive_detector/fixtures/clean/src/viewport-expression.tsx +5 -0
  94. package/detectors/bun_responsive_detector/fixtures/dirty/public/fixed-viewport.html +5 -0
  95. package/detectors/bun_responsive_detector/fixtures/dirty/public/no-meta.html +5 -0
  96. package/detectors/bun_responsive_detector/fixtures/dirty/public/no-zoom.html +5 -0
  97. package/detectors/bun_responsive_detector/fixtures/dirty/public/scale.html +5 -0
  98. package/detectors/bun_responsive_detector/fixtures/dirty/src/app.css +4 -0
  99. package/detectors/bun_responsive_detector/fixtures/dirty/src/render.ts +2 -0
  100. package/detectors/bun_responsive_detector/fixtures/dirty/src/units.css +3 -0
  101. package/detectors/bun_responsive_detector/fixtures/dirty/src/wide.tsx +3 -0
  102. package/detectors/htmx_e2e_detector/atdd.implementation.yaml +40 -0
  103. package/detectors/htmx_e2e_detector/checks/_e2e.mjs +98 -0
  104. package/detectors/htmx_e2e_detector/checks/_map.json +16 -0
  105. package/detectors/htmx_e2e_detector/checks/a11y_harness.mjs +21 -0
  106. package/detectors/htmx_e2e_detector/checks/covered_train_is_routed.mjs +6 -0
  107. package/detectors/htmx_e2e_detector/checks/e2e_binds_declared_subject.mjs +11 -0
  108. package/detectors/htmx_e2e_detector/checks/e2e_spec_naming.mjs +6 -0
  109. package/detectors/htmx_e2e_detector/checks/exposed_journey_e2e_coverage.mjs +7 -0
  110. package/detectors/htmx_e2e_detector/checks/journey_binding_header.mjs +13 -0
  111. package/detectors/htmx_e2e_detector/checks/journey_layer_assembly.mjs +11 -0
  112. package/detectors/htmx_e2e_detector/checks/journey_no_acceptance_marker.mjs +6 -0
  113. package/detectors/htmx_e2e_detector/checks/journey_urn_format.mjs +18 -0
  114. package/detectors/htmx_e2e_detector/checks/presentation_smoke_coverage.mjs +15 -0
  115. package/detectors/htmx_e2e_detector/checks/responsive_harness.mjs +30 -0
  116. package/detectors/htmx_e2e_detector/checks/responsive_journey_coverage.mjs +7 -0
  117. package/detectors/htmx_e2e_detector/checks/train_e2e_coverage.mjs +7 -0
  118. package/detectors/htmx_e2e_detector/checks/visual_harness.mjs +7 -0
  119. package/detectors/htmx_e2e_detector/detect.mjs +46 -0
  120. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy-alias.a11y.e2e.ts +12 -0
  121. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy-inline.responsive.e2e.ts +11 -0
  122. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.a11y.e2e.ts +12 -0
  123. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.responsive.e2e.ts +14 -0
  124. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.visual.e2e.ts +10 -0
  125. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/checkout-buy.smoke.e2e.ts +10 -0
  126. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/crlf.e2e.ts +10 -0
  127. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/place-order.e2e.ts +10 -0
  128. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/reject-empty-cart.e2e.ts +10 -0
  129. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/support/fixtures.ts +3 -0
  130. package/detectors/htmx_e2e_detector/fixtures/clean/e2e/take-payment.e2e.ts +10 -0
  131. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_journeys/buy.yaml +19 -0
  132. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_journeys/settle.yaml +14 -0
  133. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/checkout.yaml +21 -0
  134. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/payment.yaml +16 -0
  135. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/settlement.yaml +16 -0
  136. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/place-order.yaml +11 -0
  137. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/reject-empty-cart.yaml +11 -0
  138. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/settle-ledger.yaml +11 -0
  139. package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/take-payment.yaml +11 -0
  140. package/detectors/htmx_e2e_detector/fixtures/clean/playwright.config.ts +3 -0
  141. package/detectors/htmx_e2e_detector/fixtures/clean/src/wagons/checkout/presentation/cart.tsx +3 -0
  142. package/detectors/htmx_e2e_detector/fixtures/clean/tests/urn-parser.test.ts +7 -0
  143. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/acceptance.e2e.ts +6 -0
  144. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/bad-id.e2e.ts +10 -0
  145. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/bad-urn.e2e.ts +10 -0
  146. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/both.e2e.ts +6 -0
  147. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.a11y.e2e.ts +10 -0
  148. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.responsive.e2e.ts +11 -0
  149. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.visual.e2e.ts +10 -0
  150. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/covered.e2e.ts +10 -0
  151. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/first-only.responsive.e2e.ts +13 -0
  152. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/ghost.e2e.ts +10 -0
  153. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/misnamed.spec.ts +10 -0
  154. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-binding.e2e.ts +4 -0
  155. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-layer.e2e.ts +4 -0
  156. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-urn.e2e.ts +4 -0
  157. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/tautology.a11y.e2e.ts +11 -0
  158. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/two-trains.e2e.ts +6 -0
  159. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/unrouted.e2e.ts +10 -0
  160. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/wrong-layer.e2e.ts +5 -0
  161. package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/wrong-urn.e2e.ts +10 -0
  162. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_journeys/browse.yaml +16 -0
  163. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_journeys/buy.yaml +16 -0
  164. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/_interlockings/checkout.yaml +21 -0
  165. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/covered.yaml +11 -0
  166. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/uncovered.yaml +11 -0
  167. package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/unrouted.yaml +11 -0
  168. package/detectors/htmx_e2e_detector/fixtures/dirty/src/wagons/billing/presentation/invoice.tsx +3 -0
  169. package/detectors/planner_docs_capability/atdd.implementation.yaml +2 -0
  170. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/index.adoc +170 -0
  171. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/journey-buy.svg +61 -0
  172. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/path-buy-nominal.svg +81 -0
  173. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-archive-order.svg +13 -0
  174. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-place-order.svg +31 -0
  175. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-reject-empty-cart.svg +22 -0
  176. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-retry-payment.svg +22 -0
  177. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-ship-order.svg +35 -0
  178. package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-take-payment.svg +27 -0
  179. package/detectors/planner_docs_capability/fixtures/clean/plan/_journeys/buy.yaml +24 -0
  180. package/detectors/planner_docs_capability/fixtures/clean/plan/_themes.yaml +3 -0
  181. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/checkout.yaml +43 -0
  182. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/fulfilment.yaml +33 -0
  183. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/payment.yaml +43 -0
  184. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/returns.yaml +33 -0
  185. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/archive-order.yaml +11 -0
  186. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/place-order.yaml +21 -0
  187. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/reject-empty-cart.yaml +16 -0
  188. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/retry-payment.yaml +16 -0
  189. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/ship-order.yaml +21 -0
  190. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/take-payment.yaml +21 -0
  191. package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/unrouted-refund.yaml +11 -0
  192. package/detectors/planner_docs_capability/fixtures/dirty_journey_view/docs/index.adoc +3 -0
  193. package/detectors/planner_docs_capability/fixtures/dirty_journey_view/plan/_trains/_interlockings/fulfilment.yaml +33 -0
  194. package/detectors/planner_static_validators/atdd.implementation.yaml +2 -0
  195. package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/_interlockings/uncomposed.yaml +4 -0
  196. package/integrity.json +207 -70
  197. package/lib/frontend.mjs +17 -0
  198. package/lib/scan.mjs +6 -2
  199. package/package.json +7 -2
  200. package/planner-nodes/ENFORCEMENT_SCOPE.yaml +25 -2
  201. package/planner-nodes/nodes/planner.journey.interlocking-composed.convention.yaml +43 -0
  202. package/relationships.yaml +4790 -0
  203. package/src/cli.ts +9 -0
  204. package/src/docs-capability.ts +10 -1
  205. package/src/enforce.ts +4 -4
  206. package/src/index.ts +2 -0
  207. package/src/journey-docs.ts +355 -0
  208. package/src/planner-validators.ts +29 -0
@@ -0,0 +1,31 @@
1
+ schema_version: 1.1.0
2
+ rule_id: coder.bun.responsive-viewport-meta
3
+ kind: rule
4
+ status: active
5
+ name: Every HTML document declares a device-width viewport and allows zoom
6
+ statement: Every full HTML document (an `.html`/`.htm` file, a `.tsx`/`.jsx` layout that renders `<html>`, or a
7
+ `.ts`/`.js` template that builds one) MUST declare `<meta name="viewport">` whose content sets `width=device-width`,
8
+ and MUST NOT block zoom with `user-scalable=no` or a `maximum-scale` below 2. New in atdd-bun, strict.
9
+ terms:
10
+ - term_id: frontend_settings
11
+ text: '`atdd-bun.yaml` → `frontend.viewports` (the widths responsive specs render at; the smallest bounds fixed
12
+ widths) and `frontend.breakpoints` (the widths media queries may use).'
13
+ content:
14
+ summary: Every HTML document declares a device-width viewport and allows zoom.
15
+ normative_text: Without a device-width viewport a phone renders the page as a zoomed-out desktop layout, whatever
16
+ the CSS says. Blocking zoom fails users who need to enlarge text, which is also an accessibility failure.
17
+ fix_hint: '`<meta name="viewport" content="width=device-width, initial-scale=1">`'
18
+ exceptions:
19
+ - Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
20
+ - HTML fragments that are not full documents (no `<html>`) are out of scope.
21
+ - A viewport `content` given as a JSX expression (`content={VIEWPORT}`) cannot be read statically; the meta's
22
+ presence is required, its value is not judged.
23
+ metadata:
24
+ aliases:
25
+ - BUN-RESPONSIVE-RESPONSIVE-VIEWPORT-META-001
26
+ severity: 3
27
+ disposition: strict
28
+ introduced_in: 0.5.0
29
+ implementation:
30
+ type: validator
31
+ ref: bun_responsive_detector
@@ -30,23 +30,6 @@ terms:
30
30
  a declared `route_id` that appears nowhere in a runtime which does not load the declaration.
31
31
  A data-driven runtime serves every declared route by construction and mentions none of them as
32
32
  literals, so this is only ever evaluated against a transcribing runtime.
33
- - term_id: disposition_rationale
34
- text: >-
35
- advisory because NO consumer satisfies it today, including this package's own fixtures until
36
- the commit that introduced this node. The measurement below was TAKEN, not recalled.
37
- values:
38
- measured_2026_09_07: >-
39
- A Bun consumer was built from scratch in this stack's idiom to establish the read
40
- vocabulary, because the python heuristic (yaml.safe_load / read_text) matches NOTHING a
41
- compliant Bun runtime does — porting it blind would have reported every Bun consumer as
42
- plan-blind. Verified: the compliant consumer is silent, a transcribing one fires naming the
43
- literals it restated, and a query-loading one that reads nothing and states nothing stays
44
- silent.
45
- measurement_target: a Bun consumer repo built for the experiment
46
- escalate_when: >-
47
- Consumer runtimes load their declarations and the check has been wired into
48
- gates/interlocking-binding.gate.yaml. Enabling it is a GATE change; the detector is staged
49
- (`scan_execution`) and deliberately not called from `scan_root`.
50
33
  content:
51
34
  summary: >-
52
35
  The obligation that makes "the train YAML is the source of truth" true of the RUNTIME and not
@@ -94,7 +77,8 @@ metadata:
94
77
  aliases:
95
78
  - BUN-RUNTIME-EXECUTES-001
96
79
  severity: 2
97
- disposition: advisory
80
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
81
+ disposition: strict
98
82
  introduced_in: 0.1.0
99
83
  core_design_refs:
100
84
  - afokapu/atdd#1248
@@ -25,20 +25,6 @@ terms:
25
25
  family AND extends no base config. A tsconfig that `extends` something is NOT judged: this
26
26
  rule's detector cannot resolve the base, and reporting what it cannot see would be a false
27
27
  positive.
28
- - term_id: disposition_rationale
29
- text: >-
30
- advisory because this states a stack norm rather than a defect, and because the consuming
31
- projects have not been surveyed. The measurement below was TAKEN on 2026-09-06, not recalled.
32
- values:
33
- measured_2026_09_06: >-
34
- 0 consumer Bun projects surveyed. This hub is a package repository and contains no Bun
35
- application to measure — its own .ts files are deliberately-wrong detector fixtures, which
36
- is exactly why this rule is authored for consumers and never run against the hub.
37
- measurement_target: afokapu/atdd-extensions @ main (the hub itself — deliberately not a consumer)
38
- measurement_command: "find official -name '*.ts' -not -path '*/fixtures/*' | wc -l"
39
- escalate_when: >-
40
- A consumer Bun project has been surveyed, typescript + a wired no-emit typecheck are present,
41
- and the team accepts blocking on it. Escalating to strict is a MAJOR change class.
42
28
  content:
43
29
  summary: >-
44
30
  Bun's own gap, stated as a convention. `bun test`, `bun install`, `bun build`, `Bun.serve` and a
@@ -84,7 +70,8 @@ metadata:
84
70
  aliases:
85
71
  - BUN-TYPECHECK-ENFORCED-001
86
72
  severity: 2
87
- disposition: advisory
73
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
74
+ disposition: strict
88
75
  introduced_in: 0.1.0
89
76
  implementation:
90
77
  type: validator
@@ -41,8 +41,7 @@ content:
41
41
  <button hx-get="/rows/1" hx-on::after-request="track('open')">Open</button> <!-- ✓ -->
42
42
 
43
43
  For behaviour that is genuinely presentational and not request-related, attach it in a delegated
44
- listener on a stable ancestor that is never swapped. Disposition is `suppress-and-clean`: existing
45
- handlers are held flat by a ratchet baseline while they are migrated.
44
+ listener on a stable ancestor that is never swapped.
46
45
  exceptions:
47
46
  - Files containing no `hx-` attribute are never scanned (self-scoping).
48
47
  - React/JSX camelCase props (`onClick={…}`, `onSubmit={…}`) are a different mechanism and are out of
@@ -52,7 +51,8 @@ metadata:
52
51
  aliases:
53
52
  - HTMX-NO-INLINE-HANDLER-001
54
53
  severity: 3
55
- disposition: suppress-and-clean
54
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
55
+ disposition: strict
56
56
  introduced_in: 0.1.0
57
57
  implementation:
58
58
  type: validator
@@ -35,7 +35,7 @@ content:
35
35
 
36
36
  STATIC PATHS ONLY. An endpoint built by interpolation (`/orders/${id}/void`) cannot be compared
37
37
  to a server route by text, and guessing would report on correct code. Those are skipped, exactly
38
- as the Vite family treats an unresolvable trainId as advisory rather than inventing a verdict.
38
+ as the Vite family leaves an unresolvable trainId unjudged rather than inventing a verdict.
39
39
 
40
40
  The Station Master is found by the JOURNEY_MAP it DECLARES, never by filename. Matching is on
41
41
  the whole path or its distinctive terminal segment: matching any segment was the first attempt
@@ -57,7 +57,7 @@ content:
57
57
  exceptions:
58
58
  - "`hx-get` endpoints are NOT reported; fetching a fragment is presentation, not a journey."
59
59
  - An endpoint written with interpolation is skipped rather than guessed at, preserving the
60
- advisory treatment this hub gives statically unresolvable bindings.
60
+ hub's decision to leave statically unresolvable bindings unjudged.
61
61
  metadata:
62
62
  aliases:
63
63
  - HTMX-VERB-ENDPOINT-ROUTED-001
@@ -42,7 +42,7 @@ content:
42
42
  <form hx-post="/orders" hx-disabled-elt="find button">…</form> <!-- ✓ prevents re-submit -->
43
43
 
44
44
  Prefer `hx-disabled-elt` where a duplicate would be expensive; the indicator alone tells the user
45
- to wait but does not stop them. `suppress-and-clean`: a ratchet holds existing cases flat.
45
+ to wait but does not stop them.
46
46
  exceptions:
47
47
  - "`hx-get` is not scoped by this rule (idempotent)."
48
48
  - An element declaring both signals is fine; only declaring neither is a violation.
@@ -52,7 +52,8 @@ metadata:
52
52
  aliases:
53
53
  - HTMX-MUTATION-PROGRESS-001
54
54
  severity: 3
55
- disposition: suppress-and-clean
55
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
56
+ disposition: strict
56
57
  introduced_in: 0.1.0
57
58
  implementation:
58
59
  type: validator
@@ -32,17 +32,6 @@ terms:
32
32
  text: >-
33
33
  `index.adoc` in the decisions directory, whose entries are computed from the set of ADR files and
34
34
  their `:decides:` targets. It contains references to the decisions, never the decisions themselves.
35
- - term_id: disposition_rationale
36
- text: >-
37
- advisory while the consuming corpus is brought into compatibility. The measurement below was
38
- TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
39
- already stale, so the date lives in the key and the command is recorded beside the result.
40
- Re-take it at the escalation checkpoint; never escalate on the number here.
41
- values:
42
- measured_2026_09_06: 'The decisions directory does not exist and there are 0 ADR files. Spec 2 §6 names the first two: ADR-20260906-001 (shared control root) and ADR-20260906-002 (the documentation system itself, authored as current documentation — the proof the system works).'
43
- measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
44
- measurement_command: 'ls -d docs/architecture/decisions 2>&1 ; find . -name ''adr-*.adoc'' | wc -l'
45
- escalate_when: '`docs/architecture/decisions/` exists and its index.adoc matches the derived projection exactly on a full scan.'
46
35
  content:
47
36
  summary: >-
48
37
  A hand-maintained list of decisions drifts from the decisions — precisely the failure class ATDD
@@ -76,7 +65,8 @@ metadata:
76
65
  aliases:
77
66
  - DOCS-ADR-001
78
67
  severity: 2
79
- disposition: advisory
68
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
69
+ disposition: strict
80
70
  introduced_in: 0.1.0
81
71
  implementation:
82
72
  type: validator
@@ -18,17 +18,6 @@ terms:
18
18
  `index.adoc` — the area's entry point and the node the rendered site navigates to. For
19
19
  `docs/architecture/decisions/` it is additionally a DERIVED registry, governed by
20
20
  `planner.docs.adr-registry-derived`.
21
- - term_id: disposition_rationale
22
- text: >-
23
- advisory while the consuming corpus is brought into compatibility. The measurement below was
24
- TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
25
- already stale, so the date lives in the key and the command is recorded beside the result.
26
- Re-take it at the escalation checkpoint; never escalate on the number here.
27
- values:
28
- measured_2026_09_06: '`docs/` exists and holds 71 markdown files; none of purpose/, architecture/, delivery/ or archive/ exists, and there is no index.adoc anywhere. 0 of 6 canonical areas are present, so the rule currently reports nothing and will begin reporting as the tree is created.'
29
- measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
30
- measurement_command: 'ls -d docs docs/purpose docs/architecture docs/delivery docs/archive 2>&1'
31
- escalate_when: 'The canonical tree exists in the consuming repository and every existing authored area carries an index.adoc.'
32
21
  content:
33
22
  summary: >-
34
23
  An area without an index is an area the rendered site cannot navigate into and a reader cannot
@@ -60,7 +49,8 @@ metadata:
60
49
  aliases:
61
50
  - DOCS-TREE-001
62
51
  severity: 3
63
- disposition: advisory
52
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
53
+ disposition: strict
64
54
  introduced_in: 0.1.0
65
55
  implementation:
66
56
  type: validator
@@ -17,17 +17,6 @@ terms:
17
17
  text: >-
18
18
  one entry of `artifacts:` — an `action` (`create`, `modify`, `archive`), a `path`, and for
19
19
  `archive` a `from` naming the document being retired.
20
- - term_id: disposition_rationale
21
- text: >-
22
- advisory while the consuming corpus is brought into compatibility. The measurement below was
23
- TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
24
- already stale, so the date lives in the key and the command is recorded beside the result.
25
- Re-take it at the escalation checkpoint; never escalate on the number here.
26
- values:
27
- measured_2026_09_06: '0 declarations exist to check. The `documentation:` block lands with the core unit (companion spec, work item B) and this rule has an empty input until it does. Advisory is the only honest disposition for a rule whose subject does not exist yet.'
28
- measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
29
- measurement_command: '(the declaration is core''s, companion §3, and is not yet implemented)'
30
- escalate_when: 'Documentation declarations are being recorded at RATIFY in the consuming repository and a full pass over recent plans reports zero malformed artifact paths.'
31
20
  content:
32
21
  summary: >-
33
22
  The declaration is a promise about paths. This rule checks the promise is well formed BEFORE the
@@ -75,7 +64,8 @@ metadata:
75
64
  aliases:
76
65
  - DOCS-DECLARATION-001
77
66
  severity: 2
78
- disposition: advisory
67
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
68
+ disposition: strict
79
69
  introduced_in: 0.1.0
80
70
  implementation:
81
71
  type: validator
@@ -17,18 +17,6 @@ terms:
17
17
  text: >-
18
18
  everything beneath `docs/dist/`. It is rendered by the build (spec 2 §7), normally excluded from
19
19
  git, and never subject to the authored-format rule.
20
- - term_id: disposition_rationale
21
- text: >-
22
- advisory while the consuming corpus is brought into compatibility. The measurement below was
23
- TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
24
- already stale, so the date lives in the key and the command is recorded beside the result.
25
- Re-take it at the escalation checkpoint; never escalate on the number here.
26
- values:
27
- measured_2026_09_06: '71 markdown beneath docs/, 18 non-dotfile markdown at the repository root (89 total; 90 counting .atdd-launch-prompt.md), 0 .adoc anywhere. The corpus is 0% compatible, which is why this rule ships advisory.'
28
- measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
29
- measurement_command: 'find docs -name ''*.md'' -type f | wc -l ; find . -maxdepth 1 -name ''*.md'' -type f | wc -l ; find . -name ''*.adoc'' -not -path ''./.git/*'' | wc -l'
30
- escalate_when: 'No authored `.md` remains beneath `docs/` outside `docs/dist/` in the consuming repository — i.e. the migration of spec 2 §1 has landed and the corpus is compatible with `strict`.'
31
- measurement_note: 'Spec 2 §1 records 71 + 18 = 89 as of the same date and this run reproduces it exactly for the non-dotfile corpus. Re-take this measurement at the escalation checkpoint; do not escalate on the number recorded here (spec 2 §8, and companion §7 on stale measurements).'
32
20
  content:
33
21
  summary: >-
34
22
  One authored format, mechanically checked. The rule exists because a mixed corpus cannot carry a
@@ -64,7 +52,8 @@ metadata:
64
52
  aliases:
65
53
  - DOCS-FORMAT-001
66
54
  severity: 2
67
- disposition: advisory
55
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
56
+ disposition: strict
68
57
  introduced_in: 0.1.0
69
58
  implementation:
70
59
  type: validator
@@ -12,17 +12,6 @@ terms:
12
12
  text: >-
13
13
  every authored `.adoc` beneath `docs/`, across all areas, excluding `docs/dist/`. Uniqueness is
14
14
  global — `archive/` is part of the corpus, not a separate id space.
15
- - term_id: disposition_rationale
16
- text: >-
17
- advisory while the consuming corpus is brought into compatibility. The measurement below was
18
- TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
19
- already stale, so the date lives in the key and the command is recorded beside the result.
20
- Re-take it at the escalation checkpoint; never escalate on the number here.
21
- values:
22
- measured_2026_09_06: '0 .adoc files, therefore 0 declared ids and 0 collisions. Not evidence of health: the corpus does not exist yet. Re-measure after migration, which is exactly when collisions appear.'
23
- measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
24
- measurement_command: 'find . -name ''*.adoc'' -not -path ''./.git/*'' | wc -l'
25
- escalate_when: 'The corpus has been migrated and a full scan reports zero duplicate ids — the scale test spec 2 §1 names, since 89 documents is the first corpus large enough to collide.'
26
15
  content:
27
16
  summary: >-
28
17
  A duplicated id makes edge resolution ambiguous: `:supersedes: architecture.foo` cannot say which
@@ -58,7 +47,8 @@ metadata:
58
47
  aliases:
59
48
  - DOCS-IDENTITY-002
60
49
  severity: 2
61
- disposition: advisory
50
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
51
+ disposition: strict
62
52
  introduced_in: 0.1.0
63
53
  implementation:
64
54
  type: validator
@@ -22,17 +22,6 @@ terms:
22
22
  text: >-
23
23
  creating a graph node for a target no document declares, so that an edge appears to resolve. The
24
24
  defect this rule exists to make impossible.
25
- - term_id: disposition_rationale
26
- text: >-
27
- advisory while the consuming corpus is brought into compatibility. The measurement below was
28
- TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
29
- already stale, so the date lives in the key and the command is recorded beside the result.
30
- Re-take it at the escalation checkpoint; never escalate on the number here.
31
- values:
32
- measured_2026_09_06: '0 .adoc files, so 0 authored edges and 0 unresolved targets. The number that motivates this rule is the OTHER graph''s, quoted in full under normative_text and measured on the same date: 147 of 168 containment edges invented, 44 fabricated nodes out of 3208.'
33
- measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
34
- measurement_command: 'find . -name ''*.adoc'' -not -path ''./.git/*'' | wc -l'
35
- escalate_when: 'A full corpus scan reports zero unresolved relationship targets. The no-fabrication half is NOT subject to escalation — it is a property of the resolver, true from the first commit, and is asserted by the #1758 regression test rather than deferred to a disposition flip.'
36
25
  content:
37
26
  summary: >-
38
27
  Resolve or report — never invent. The graph is DERIVED from the `.adoc` attributes and rebuilt on
@@ -80,7 +69,8 @@ metadata:
80
69
  aliases:
81
70
  - DOCS-GRAPH-001
82
71
  severity: 1
83
- disposition: advisory
72
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
73
+ disposition: strict
84
74
  introduced_in: 0.1.0
85
75
  implementation:
86
76
  type: validator
@@ -17,17 +17,6 @@ terms:
17
17
  text: >-
18
18
  the value of the `:status:` attribute — `current`, `superseded`, or `historical`. It answers "is
19
19
  this accepted truth today?" and is the flag issue #1782 exists to introduce.
20
- - term_id: disposition_rationale
21
- text: >-
22
- advisory while the consuming corpus is brought into compatibility. The measurement below was
23
- TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
24
- already stale, so the date lives in the key and the command is recorded beside the result.
25
- Re-take it at the escalation checkpoint; never escalate on the number here.
26
- values:
27
- measured_2026_09_06: '0 .adoc files exist, so 0 documents declare a doc-id and the rule currently has an empty corpus to check. It ships advisory because it will fire on every file the moment conversion begins and before the attributes are backfilled.'
28
- measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
29
- measurement_command: 'find . -name ''*.adoc'' -not -path ''./.git/*'' | wc -l'
30
- escalate_when: 'Every authored `.adoc` beneath `docs/` declares both attributes — reachable only after the migration lands, since the attribute is authored during conversion.'
31
20
  content:
32
21
  summary: >-
33
22
  Identity and currency, declared in the document itself. Without `doc-id` there is no graph:
@@ -61,7 +50,8 @@ metadata:
61
50
  aliases:
62
51
  - DOCS-IDENTITY-001
63
52
  severity: 2
64
- disposition: advisory
53
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
54
+ disposition: strict
65
55
  introduced_in: 0.1.0
66
56
  implementation:
67
57
  type: validator
@@ -0,0 +1,53 @@
1
+ schema_version: 1.1.0
2
+ rule_id: planner.docs.journey-view-current
3
+ kind: rule
4
+ status: active
5
+ name: The journey documentation is generated from plan/ and matches it
6
+ statement: >-
7
+ When a repository documents itself (`docs/` exists) and its plan declares journeys or interlockings,
8
+ `docs/purpose/journeys/` MUST contain exactly what `atdd-bun docs journeys` generates from `plan/`:
9
+ `index.adoc` and one SVG per journey map, per journey's nominal path, and per routed train. A missing,
10
+ stale, hand-edited, or extra file is a violation.
11
+ terms:
12
+ - term_id: journey_view
13
+ text: >-
14
+ the generated page, top down: each journey as a map (entry action, interlockings, the routes they
15
+ choose, the trains they run, continuations and terminal outcomes); the journey's nominal path walked
16
+ end to end as one sequence across its interlockings; every path as a table; each interlocking's
17
+ routes with their guards; each train as a sequence diagram; and a table of what the plan leaves
18
+ unconnected.
19
+ - term_id: generated
20
+ text: >-
21
+ byte-for-byte what the installed package renders from the current `plan/`. The output carries no
22
+ timestamp and no package version, so it changes only when the plan (or the renderer) does.
23
+ content:
24
+ summary: >-
25
+ A journey page drawn by hand drifts from the plan it describes the moment either changes. Generating
26
+ it, and failing when the committed copy differs, keeps the documented journeys the planned journeys,
27
+ and keeps the plan's gaps (unreached interlockings, open routes, unrouted trains) visible.
28
+ normative_text: |
29
+ The view renders planned behaviour, not acceptance evidence. It is generated so that reviewing a
30
+ decomposition does not require reading interlocking YAML: who hands what to whom, which guard
31
+ selects which route, and where each path ends.
32
+
33
+ The gaps table is part of the contract. A plan with interlockings but no journey still gets a page;
34
+ it shows every interlocking as unreached, which is the truthful state of the decomposition.
35
+ fix_hint: |
36
+ Regenerate and commit:
37
+
38
+ bun run atdd-bun docs journeys
39
+
40
+ If `docs/purpose/journeys/index.adoc` is a hand-written page, move its content elsewhere (the
41
+ generator refuses to overwrite it without --force). Change the plan, never the generated files.
42
+ exceptions:
43
+ - A repository with no `docs/` directory is not in scope.
44
+ - A plan with no journey and no interlocking is not in scope.
45
+ metadata:
46
+ aliases:
47
+ - DOCS-JOURNEY-VIEW-001
48
+ severity: 3
49
+ disposition: strict
50
+ introduced_in: 0.4.0
51
+ implementation:
52
+ type: validator
53
+ ref: docs_capability
@@ -17,17 +17,6 @@ terms:
17
17
  text: >-
18
18
  a render failure the capability cannot pin to a document — a crashed renderer, an unreadable
19
19
  tree, a toolchain that is not installed. It is reported as `COULD_NOT_CHECK`, which BLOCKS.
20
- - term_id: disposition_rationale
21
- text: >-
22
- advisory while the consuming corpus is brought into compatibility. The measurement below was
23
- TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
24
- already stale, so the date lives in the key and the command is recorded beside the result.
25
- Re-take it at the escalation checkpoint; never escalate on the number here.
26
- values:
27
- measured_2026_09_06: 'ABSENT — `command -v asciidoctor` exits 1 on this machine. The capability therefore returns COULD_NOT_CHECK here today, which BLOCKS, and that is the specified behaviour rather than a defect. Re-take this probe in the CI image before escalating; asciidoctor absence on a developer machine is expected and is not a reason to weaken the rule.'
28
- measurement_target: 'this machine (the extension''s own toolchain probe)'
29
- measurement_command: 'command -v asciidoctor'
30
- escalate_when: 'asciidoctor is available in CI and a full render of the migrated corpus completes with zero unresolvable internal references. Note that the COULD_NOT_CHECK path already BLOCKS at the capability seam regardless of this disposition — advisory governs the reported findings, not the capability''s verdict contract.'
31
20
  content:
32
21
  summary: >-
33
22
  Reference integrity is why asciidoctor (Ruby) is the reference implementation rather than a pure
@@ -67,7 +56,8 @@ metadata:
67
56
  aliases:
68
57
  - DOCS-RENDER-001
69
58
  severity: 1
70
- disposition: advisory
59
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
60
+ disposition: strict
71
61
  introduced_in: 0.1.0
72
62
  implementation:
73
63
  type: validator
@@ -17,17 +17,6 @@ terms:
17
17
  text: >-
18
18
  a changed path equals the `path` of some declared artifact, or the `from` of an `archive`
19
19
  artifact. Coverage is exact-path, not prefix or glob.
20
- - term_id: disposition_rationale
21
- text: >-
22
- advisory while the consuming corpus is brought into compatibility. The measurement below was
23
- TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
24
- already stale, so the date lives in the key and the command is recorded beside the result.
25
- Re-take it at the escalation checkpoint; never escalate on the number here.
26
- values:
27
- measured_2026_09_06: '0 declarations exist, so every `docs/**` change in the repository today is undeclared and this rule would fire on all of them. That is the reason it ships advisory rather than strict: escalating before the declaration exists would block every commit touching documentation.'
28
- measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
29
- measurement_command: '(requires the core declaration, companion §3, which is not yet implemented)'
30
- escalate_when: 'Declarations are being recorded at RATIFY and a full pass over recent merges reports zero undeclared `docs/**` changes.'
31
20
  content:
32
21
  summary: >-
33
22
  The enforceable inverse. Detecting that a change SHOULD HAVE BEEN declared is semantic and not
@@ -73,7 +62,8 @@ metadata:
73
62
  aliases:
74
63
  - DOCS-DECLARATION-002
75
64
  severity: 2
76
- disposition: advisory
65
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
66
+ disposition: strict
77
67
  introduced_in: 0.1.0
78
68
  implementation:
79
69
  type: validator
@@ -37,12 +37,8 @@ metadata:
37
37
  # shared alias for it, so the lineage is stated here and in the statement.
38
38
  - BUN-ACCEPTANCE-BINDING-DECLARED-001
39
39
  severity: 2
40
- # Core's tester nodes are largely `documentation-only`, which core's
41
- # coverage_report treats as never-fails-the-build. That is right for retrofitting
42
- # and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
43
- # that will not be adopted. Gating dispositions here; a repo adopting on an
44
- # existing suite records a ratchet baseline instead.
45
- disposition: suppress-and-clean
40
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
41
+ disposition: strict
46
42
  introduced_in: 0.1.0
47
43
  implementation:
48
44
  type: validator
@@ -38,11 +38,7 @@ metadata:
38
38
  # shared alias for it, so the lineage is stated here and in the statement.
39
39
  - BUN-COVERS-TAG-WELL-FORMED-001
40
40
  severity: 3
41
- # Core's tester nodes are largely `documentation-only`, which core's
42
- # coverage_report treats as never-fails-the-build. That is right for retrofitting
43
- # and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
44
- # that will not be adopted. Gating dispositions here; a repo adopting on an
45
- # existing suite records a ratchet baseline instead.
41
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
46
42
  disposition: strict
47
43
  introduced_in: 0.1.0
48
44
  implementation:
@@ -23,19 +23,6 @@ terms:
23
23
  `route-coverage` proves an admissible route is exercised; `trace-binds-declared-route` proves
24
24
  the run is attributable to its declared route. Both are statements about SELECTION. A train
25
25
  whose sequence is wrong is selected correctly and runs the wrong thing.
26
- - term_id: disposition_rationale
27
- text: >-
28
- advisory because no consumer or fixture satisfies it yet, and because the check is staged
29
- rather than gated. The measurement below was TAKEN, not recalled.
30
- values:
31
- measured_2026_09_07: >-
32
- On a data-driven consumer whose TrainRunner genuinely reads the train definition, replacing
33
- a train's entire wagon sequence in the plan left the consumer's own e2e suite at 4 passed.
34
- The runtime obeyed the new plan; no test looked.
35
- measurement_target: the python consumer built for the end-to-end experiment; no Bun consumer surveyed yet
36
- escalate_when: >-
37
- Consumer suites assert executed sequences and the check has been wired into
38
- the bun_interlocking_coverage family gate. Enabling it is a GATE change; the detector is staged.
39
26
  content:
40
27
  summary: >-
41
28
  The tester half of `coder.train.runtime-executes-the-declaration (python; the Bun coder half is not yet authored)`. That rule makes the runtime
@@ -67,7 +54,8 @@ metadata:
67
54
  aliases:
68
55
  - BUN-TESTER-TRAIN-SEQUENCE-001
69
56
  severity: 2
70
- disposition: advisory
57
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
58
+ disposition: strict
71
59
  introduced_in: 0.1.0
72
60
  core_design_refs:
73
61
  - afokapu/atdd#1248
@@ -39,11 +39,7 @@ metadata:
39
39
  # shared alias for it, so the lineage is stated here and in the statement.
40
40
  - BUN-RED-BEHAVIORAL-ASSERTION-001
41
41
  severity: 3
42
- # Core's tester nodes are largely `documentation-only`, which core's
43
- # coverage_report treats as never-fails-the-build. That is right for retrofitting
44
- # and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
45
- # that will not be adopted. Gating dispositions here; a repo adopting on an
46
- # existing suite records a ratchet baseline instead.
42
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
47
43
  disposition: strict
48
44
  introduced_in: 0.1.0
49
45
  implementation:
@@ -34,7 +34,8 @@ metadata:
34
34
  # Core obligation: tester.routing.layer-keyword-taxonomy
35
35
  - BUN-ROUTING-RUNTIME-FAMILY-001
36
36
  severity: 2
37
- disposition: suppress-and-clean
37
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
38
+ disposition: strict
38
39
  introduced_in: 0.1.0
39
40
  implementation:
40
41
  type: validator
@@ -26,19 +26,14 @@ content:
26
26
  Let the SMOKE test exercise the real collaborator against real infrastructure, and move the substituted version into a UNIT-phase test where the substitution is honest and expected.
27
27
  exceptions:
28
28
  - Only SMOKE-phase files are scanned; UNIT tests may substitute freely.
29
- - Disposition matches core's `suppress-and-clean`: a ratchet holds existing cases flat.
30
29
  metadata:
31
30
  aliases:
32
31
  # Bun realization of the core obligation `tester.smoke.no-collaborator-substitution`. Core carries no
33
32
  # shared alias for it, so the lineage is stated here and in the statement.
34
33
  - BUN-SMOKE-NO-COLLABORATOR-SUBSTITUTION-001
35
34
  severity: 4
36
- # Core's tester nodes are largely `documentation-only`, which core's
37
- # coverage_report treats as never-fails-the-build. That is right for retrofitting
38
- # and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
39
- # that will not be adopted. Gating dispositions here; a repo adopting on an
40
- # existing suite records a ratchet baseline instead.
41
- disposition: suppress-and-clean
35
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
36
+ disposition: strict
42
37
  introduced_in: 0.1.0
43
38
  implementation:
44
39
  type: validator
@@ -35,19 +35,14 @@ content:
35
35
  exceptions:
36
36
  - Only SMOKE-phase files are scanned.
37
37
  - Cases with no assertions are skipped — other rules own that.
38
- - Disposition is `suppress-and-clean`: a ratchet holds an existing suite flat while it is migrated.
39
38
  metadata:
40
39
  aliases:
41
40
  # Bun realization of the core obligation `tester.smoke.operator-observable-assertion`. Core carries no
42
41
  # shared alias for it, so the lineage is stated here and in the statement.
43
42
  - BUN-SMOKE-OBSERVABLE-ASSERTION-001
44
43
  severity: 3
45
- # Core's tester nodes are largely `documentation-only`, which core's
46
- # coverage_report treats as never-fails-the-build. That is right for retrofitting
47
- # and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
48
- # that will not be adopted. Gating dispositions here; a repo adopting on an
49
- # existing suite records a ratchet baseline instead.
50
- disposition: suppress-and-clean
44
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
45
+ disposition: strict
51
46
  introduced_in: 0.1.0
52
47
  implementation:
53
48
  type: validator
@@ -39,7 +39,8 @@ metadata:
39
39
  - TESTER-TELEMETRY-EMIT-001
40
40
  - BUN-TELEMETRY-EMIT-001
41
41
  severity: 3
42
- disposition: suppress-and-clean
42
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
43
+ disposition: strict
43
44
  introduced_in: 0.1.0
44
45
  implementation:
45
46
  type: validator
@@ -39,12 +39,8 @@ metadata:
39
39
  # shared alias for it, so the lineage is stated here and in the statement.
40
40
  - BUN-TEST-CARRIES-URN-IDENTITY-001
41
41
  severity: 2
42
- # Core's tester nodes are largely `documentation-only`, which core's
43
- # coverage_report treats as never-fails-the-build. That is right for retrofitting
44
- # and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
45
- # that will not be adopted. Gating dispositions here; a repo adopting on an
46
- # existing suite records a ratchet baseline instead.
47
- disposition: suppress-and-clean
42
+ # strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
43
+ disposition: strict
48
44
  introduced_in: 0.1.0
49
45
  implementation:
50
46
  type: validator