@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.
- package/PLANNER_PORT.md +1 -1
- package/README.md +111 -4
- package/conventions/coder.bun/coder.bun.complexity-cyclomatic.convention.yaml +1 -3
- package/conventions/coder.bun/coder.bun.complexity-length.convention.yaml +1 -2
- package/conventions/coder.bun/coder.bun.complexity-nesting.convention.yaml +1 -2
- package/conventions/coder.bun/coder.bun.dead-code-reachability.convention.yaml +1 -2
- package/conventions/coder.bun/coder.bun.design-token-color.convention.yaml +1 -1
- package/conventions/coder.bun/coder.bun.design-token-hardcoded.convention.yaml +1 -1
- package/conventions/coder.bun/coder.bun.dto-mapper.convention.yaml +2 -1
- package/conventions/coder.bun/coder.bun.dto-placement.convention.yaml +2 -1
- package/conventions/coder.bun/coder.bun.dto-purity.convention.yaml +2 -1
- package/conventions/coder.bun/coder.bun.duplication-intra-layer.convention.yaml +1 -2
- package/conventions/coder.bun/coder.bun.green-header-order.convention.yaml +2 -11
- package/conventions/coder.bun/coder.bun.green-header-purpose.convention.yaml +2 -11
- package/conventions/coder.bun/coder.bun.green-header-runtime.convention.yaml +2 -11
- package/conventions/coder.bun/coder.bun.green-header-tested-by.convention.yaml +2 -11
- package/conventions/coder.bun/coder.bun.green-urn-layer.convention.yaml +2 -11
- package/conventions/coder.bun/coder.bun.green-urn-marker.convention.yaml +2 -12
- package/conventions/coder.bun/coder.bun.green-urn-name-matches.convention.yaml +3 -12
- package/conventions/coder.bun/coder.bun.green-urn-pattern.convention.yaml +2 -11
- package/conventions/coder.bun/coder.bun.green-urn-side.convention.yaml +2 -11
- package/conventions/coder.bun/coder.bun.green-urn-wagon-feature.convention.yaml +2 -11
- package/conventions/coder.bun/coder.bun.layer-naming.convention.yaml +2 -1
- package/conventions/coder.bun/coder.bun.logging-structured.convention.yaml +2 -4
- package/conventions/coder.bun/coder.bun.quality-comments.convention.yaml +1 -2
- package/conventions/coder.bun/coder.bun.quality-mi.convention.yaml +1 -2
- package/conventions/coder.bun/coder.bun.responsive-breakpoints-declared.convention.yaml +31 -0
- package/conventions/coder.bun/coder.bun.responsive-no-fixed-width.convention.yaml +30 -0
- package/conventions/coder.bun/coder.bun.responsive-viewport-meta.convention.yaml +31 -0
- package/conventions/coder.bun/coder.bun.runtime-executes-the-declaration.convention.yaml +2 -18
- package/conventions/coder.bun/coder.bun.runtime-typecheck-enforced.convention.yaml +2 -15
- package/conventions/coder.htmx/coder.htmx.swap-no-inline-handler.convention.yaml +3 -3
- package/conventions/coder.htmx/coder.htmx.verb-endpoint-is-routed.convention.yaml +2 -2
- package/conventions/coder.htmx/coder.htmx.verb-mutation-signals-progress.convention.yaml +3 -2
- package/conventions/planner.docs/planner.docs.adr-registry-derived.convention.yaml +2 -12
- package/conventions/planner.docs/planner.docs.area-index-required.convention.yaml +2 -12
- package/conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml +2 -12
- package/conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml +2 -13
- package/conventions/planner.docs/planner.docs.doc-id-unique.convention.yaml +2 -12
- package/conventions/planner.docs/planner.docs.graph-target-resolves.convention.yaml +2 -12
- package/conventions/planner.docs/planner.docs.identity-required.convention.yaml +2 -12
- package/conventions/planner.docs/planner.docs.journey-view-current.convention.yaml +53 -0
- package/conventions/planner.docs/planner.docs.reference-integrity.convention.yaml +2 -12
- package/conventions/planner.docs/planner.docs.undeclared-change.convention.yaml +2 -12
- package/conventions/tester.bun/tester.bun.acceptance-binding-declared.convention.yaml +2 -6
- package/conventions/tester.bun/tester.bun.acceptance-covers-tag-well-formed.convention.yaml +1 -5
- package/conventions/tester.bun/tester.bun.interlocking-train-sequence-is-exercised.convention.yaml +2 -14
- package/conventions/tester.bun/tester.bun.red-behavioral-assertion.convention.yaml +1 -5
- package/conventions/tester.bun/tester.bun.routing-runtime-family.convention.yaml +2 -1
- package/conventions/tester.bun/tester.bun.smoke-no-collaborator-substitution.convention.yaml +2 -7
- package/conventions/tester.bun/tester.bun.smoke-observable-assertion.convention.yaml +2 -7
- package/conventions/tester.bun/tester.bun.telemetry-emit.convention.yaml +2 -1
- package/conventions/tester.bun/tester.bun.test-carries-urn-identity.convention.yaml +2 -6
- package/conventions/tester.bun/tester.bun.test-isolation-no-live-state.convention.yaml +1 -5
- package/conventions/tester.bun/tester.bun.test-no-self-skip.convention.yaml +1 -5
- package/conventions/tester.bun/tester.bun.test-phase-declared.convention.yaml +2 -6
- package/conventions/tester.htmx/tester.htmx.a11y-harness.convention.yaml +32 -0
- package/conventions/tester.htmx/tester.htmx.covered-train-is-routed.convention.yaml +30 -0
- package/conventions/tester.htmx/tester.htmx.e2e-binds-declared-subject.convention.yaml +31 -0
- package/conventions/tester.htmx/tester.htmx.e2e-spec-naming.convention.yaml +32 -0
- package/conventions/tester.htmx/tester.htmx.exposed-journey-e2e-coverage.convention.yaml +31 -0
- package/conventions/tester.htmx/tester.htmx.fragment-asserts-returned-markup.convention.yaml +2 -6
- package/conventions/tester.htmx/tester.htmx.journey-binding-header.convention.yaml +32 -0
- package/conventions/tester.htmx/tester.htmx.journey-layer-assembly.convention.yaml +29 -0
- package/conventions/tester.htmx/tester.htmx.journey-no-acceptance-marker.convention.yaml +29 -0
- package/conventions/tester.htmx/tester.htmx.journey-urn-format.convention.yaml +32 -0
- package/conventions/tester.htmx/tester.htmx.presentation-smoke-coverage.convention.yaml +31 -0
- package/conventions/tester.htmx/tester.htmx.responsive-harness.convention.yaml +33 -0
- package/conventions/tester.htmx/tester.htmx.responsive-journey-coverage.convention.yaml +30 -0
- package/conventions/tester.htmx/tester.htmx.swap-oob-asserts-destination-id.convention.yaml +2 -1
- package/conventions/tester.htmx/tester.htmx.train-e2e-coverage.convention.yaml +32 -0
- package/conventions/tester.htmx/tester.htmx.verb-endpoint-coverage.convention.yaml +2 -1
- package/conventions/tester.htmx/tester.htmx.visual-harness.convention.yaml +28 -0
- package/conventions/traceability/traceability.plan.executable-acceptance-has-test.convention.yaml +5 -0
- package/conventions/traceability/traceability.source.tested-by-present.convention.yaml +5 -0
- package/conventions/traceability/traceability.source.tested-by-resolves.convention.yaml +5 -0
- package/conventions/traceability/traceability.test.binding-resolves.convention.yaml +5 -0
- package/detectors/bun_green_traceability_detector/urn_header.mjs +2 -1
- package/detectors/bun_responsive_detector/atdd.implementation.yaml +18 -0
- package/detectors/bun_responsive_detector/checks/_map.json +5 -0
- package/detectors/bun_responsive_detector/checks/_responsive.mjs +20 -0
- package/detectors/bun_responsive_detector/checks/responsive_breakpoints_declared.mjs +21 -0
- package/detectors/bun_responsive_detector/checks/responsive_no_fixed_width.mjs +13 -0
- package/detectors/bun_responsive_detector/checks/responsive_viewport_meta.mjs +20 -0
- package/detectors/bun_responsive_detector/detect.mjs +46 -0
- package/detectors/bun_responsive_detector/fixtures/clean/public/index.html +9 -0
- package/detectors/bun_responsive_detector/fixtures/clean/src/app.css +13 -0
- package/detectors/bun_responsive_detector/fixtures/clean/src/document.ts +7 -0
- package/detectors/bun_responsive_detector/fixtures/clean/src/fragment.html +1 -0
- package/detectors/bun_responsive_detector/fixtures/clean/src/head.ts +1 -0
- package/detectors/bun_responsive_detector/fixtures/clean/src/layout.tsx +8 -0
- package/detectors/bun_responsive_detector/fixtures/clean/src/range.css +3 -0
- package/detectors/bun_responsive_detector/fixtures/clean/src/viewport-expression.tsx +5 -0
- package/detectors/bun_responsive_detector/fixtures/dirty/public/fixed-viewport.html +5 -0
- package/detectors/bun_responsive_detector/fixtures/dirty/public/no-meta.html +5 -0
- package/detectors/bun_responsive_detector/fixtures/dirty/public/no-zoom.html +5 -0
- package/detectors/bun_responsive_detector/fixtures/dirty/public/scale.html +5 -0
- package/detectors/bun_responsive_detector/fixtures/dirty/src/app.css +4 -0
- package/detectors/bun_responsive_detector/fixtures/dirty/src/render.ts +2 -0
- package/detectors/bun_responsive_detector/fixtures/dirty/src/units.css +3 -0
- package/detectors/bun_responsive_detector/fixtures/dirty/src/wide.tsx +3 -0
- package/detectors/htmx_e2e_detector/atdd.implementation.yaml +40 -0
- package/detectors/htmx_e2e_detector/checks/_e2e.mjs +98 -0
- package/detectors/htmx_e2e_detector/checks/_map.json +16 -0
- package/detectors/htmx_e2e_detector/checks/a11y_harness.mjs +21 -0
- package/detectors/htmx_e2e_detector/checks/covered_train_is_routed.mjs +6 -0
- package/detectors/htmx_e2e_detector/checks/e2e_binds_declared_subject.mjs +11 -0
- package/detectors/htmx_e2e_detector/checks/e2e_spec_naming.mjs +6 -0
- package/detectors/htmx_e2e_detector/checks/exposed_journey_e2e_coverage.mjs +7 -0
- package/detectors/htmx_e2e_detector/checks/journey_binding_header.mjs +13 -0
- package/detectors/htmx_e2e_detector/checks/journey_layer_assembly.mjs +11 -0
- package/detectors/htmx_e2e_detector/checks/journey_no_acceptance_marker.mjs +6 -0
- package/detectors/htmx_e2e_detector/checks/journey_urn_format.mjs +18 -0
- package/detectors/htmx_e2e_detector/checks/presentation_smoke_coverage.mjs +15 -0
- package/detectors/htmx_e2e_detector/checks/responsive_harness.mjs +30 -0
- package/detectors/htmx_e2e_detector/checks/responsive_journey_coverage.mjs +7 -0
- package/detectors/htmx_e2e_detector/checks/train_e2e_coverage.mjs +7 -0
- package/detectors/htmx_e2e_detector/checks/visual_harness.mjs +7 -0
- package/detectors/htmx_e2e_detector/detect.mjs +46 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy-alias.a11y.e2e.ts +12 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy-inline.responsive.e2e.ts +11 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.a11y.e2e.ts +12 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.responsive.e2e.ts +14 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/buy.visual.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/checkout-buy.smoke.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/crlf.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/place-order.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/reject-empty-cart.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/support/fixtures.ts +3 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/e2e/take-payment.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/plan/_journeys/buy.yaml +19 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/plan/_journeys/settle.yaml +14 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/checkout.yaml +21 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/payment.yaml +16 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/_interlockings/settlement.yaml +16 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/place-order.yaml +11 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/reject-empty-cart.yaml +11 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/settle-ledger.yaml +11 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/plan/_trains/orders/take-payment.yaml +11 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/playwright.config.ts +3 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/src/wagons/checkout/presentation/cart.tsx +3 -0
- package/detectors/htmx_e2e_detector/fixtures/clean/tests/urn-parser.test.ts +7 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/acceptance.e2e.ts +6 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/bad-id.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/bad-urn.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/both.e2e.ts +6 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.a11y.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.responsive.e2e.ts +11 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/buy.visual.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/covered.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/first-only.responsive.e2e.ts +13 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/ghost.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/misnamed.spec.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-binding.e2e.ts +4 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-layer.e2e.ts +4 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/no-urn.e2e.ts +4 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/tautology.a11y.e2e.ts +11 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/two-trains.e2e.ts +6 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/unrouted.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/wrong-layer.e2e.ts +5 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/e2e/wrong-urn.e2e.ts +10 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_journeys/browse.yaml +16 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_journeys/buy.yaml +16 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/_interlockings/checkout.yaml +21 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/covered.yaml +11 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/uncovered.yaml +11 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/plan/_trains/orders/unrouted.yaml +11 -0
- package/detectors/htmx_e2e_detector/fixtures/dirty/src/wagons/billing/presentation/invoice.tsx +3 -0
- package/detectors/planner_docs_capability/atdd.implementation.yaml +2 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/index.adoc +170 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/journey-buy.svg +61 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/path-buy-nominal.svg +81 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-archive-order.svg +13 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-place-order.svg +31 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-reject-empty-cart.svg +22 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-retry-payment.svg +22 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-ship-order.svg +35 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/journeys/svg/train-orders-take-payment.svg +27 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_journeys/buy.yaml +24 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_themes.yaml +3 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/checkout.yaml +43 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/fulfilment.yaml +33 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/payment.yaml +43 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/_interlockings/returns.yaml +33 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/archive-order.yaml +11 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/place-order.yaml +21 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/reject-empty-cart.yaml +16 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/retry-payment.yaml +16 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/ship-order.yaml +21 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/take-payment.yaml +21 -0
- package/detectors/planner_docs_capability/fixtures/clean/plan/_trains/orders/unrouted-refund.yaml +11 -0
- package/detectors/planner_docs_capability/fixtures/dirty_journey_view/docs/index.adoc +3 -0
- package/detectors/planner_docs_capability/fixtures/dirty_journey_view/plan/_trains/_interlockings/fulfilment.yaml +33 -0
- package/detectors/planner_static_validators/atdd.implementation.yaml +2 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/_interlockings/uncomposed.yaml +4 -0
- package/integrity.json +207 -70
- package/lib/frontend.mjs +17 -0
- package/lib/scan.mjs +6 -2
- package/package.json +7 -2
- package/planner-nodes/ENFORCEMENT_SCOPE.yaml +25 -2
- package/planner-nodes/nodes/planner.journey.interlocking-composed.convention.yaml +43 -0
- package/relationships.yaml +4790 -0
- package/src/cli.ts +9 -0
- package/src/docs-capability.ts +10 -1
- package/src/enforce.ts +4 -4
- package/src/index.ts +2 -0
- package/src/journey-docs.ts +355 -0
- 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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
41
|
-
|
|
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
|
-
#
|
|
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:
|
package/conventions/tester.bun/tester.bun.interlocking-train-sequence-is-exercised.convention.yaml
CHANGED
|
@@ -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
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
package/conventions/tester.bun/tester.bun.smoke-no-collaborator-substitution.convention.yaml
CHANGED
|
@@ -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
|
-
#
|
|
37
|
-
|
|
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
|
-
#
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
43
|
-
|
|
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
|