@afokapu/atdd-bun 0.4.0 → 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/README.md +55 -3
- 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.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/integrity.json +172 -64
- package/lib/frontend.mjs +17 -0
- package/lib/scan.mjs +6 -2
- package/package.json +5 -1
- package/planner-nodes/ENFORCEMENT_SCOPE.yaml +18 -1
- package/relationships.yaml +4782 -4506
- package/src/enforce.ts +4 -4
|
@@ -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
|
|
@@ -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
|
|
@@ -38,11 +38,7 @@ metadata:
|
|
|
38
38
|
# shared alias for it, so the lineage is stated here and in the statement.
|
|
39
39
|
- BUN-TEST-ISOLATION-NO-LIVE-STATE-001
|
|
40
40
|
severity: 4
|
|
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:
|
|
@@ -34,11 +34,7 @@ metadata:
|
|
|
34
34
|
# shared alias for it, so the lineage is stated here and in the statement.
|
|
35
35
|
- BUN-NO-SELF-SKIP-001
|
|
36
36
|
severity: 3
|
|
37
|
-
#
|
|
38
|
-
# coverage_report treats as never-fails-the-build. That is right for retrofitting
|
|
39
|
-
# and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
|
|
40
|
-
# that will not be adopted. Gating dispositions here; a repo adopting on an
|
|
41
|
-
# existing suite records a ratchet baseline instead.
|
|
37
|
+
# strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
|
|
42
38
|
disposition: strict
|
|
43
39
|
introduced_in: 0.1.0
|
|
44
40
|
implementation:
|
|
@@ -33,12 +33,8 @@ metadata:
|
|
|
33
33
|
# shared alias for it, so the lineage is stated here and in the statement.
|
|
34
34
|
- BUN-PHASE-DECLARED-001
|
|
35
35
|
severity: 2
|
|
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
|
|
36
|
+
# strict: atdd-bun fails on every finding; it has no advisory mode and no ratchet baseline.
|
|
37
|
+
disposition: strict
|
|
42
38
|
introduced_in: 0.1.0
|
|
43
39
|
implementation:
|
|
44
40
|
type: validator
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.htmx.a11y-harness
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: An A11Y spec runs axe and asserts on its violations
|
|
6
|
+
statement: 'A spec identified as accessibility (an `A11Y` test URN, or an `a11y` token in its file name) MUST import
|
|
7
|
+
`AxeBuilder` from `@axe-core/playwright` (under any local name), call `new AxeBuilder(...).analyze()`, and assert
|
|
8
|
+
on the returned `violations` in a way that can fail: equal to none (`toEqual([])`, `toHaveLength(0)`, `toBe(0)`)
|
|
9
|
+
or bounded (`toBeLessThanOrEqual(n)`, `toBeLessThan(n)`). A tautology such as `toBeGreaterThanOrEqual(0)` is not
|
|
10
|
+
an assertion. Bun/htmx realization of `tester.vite.a11y-harness`, strict.'
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: browser_spec
|
|
13
|
+
text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
|
|
14
|
+
Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
|
|
15
|
+
A unit test that merely mentions a journey URN in a string is not one.'
|
|
16
|
+
content:
|
|
17
|
+
summary: An A11Y spec runs axe and asserts on its violations.
|
|
18
|
+
normative_text: An accessibility spec that navigates but never runs axe, or never asserts on the result, passes
|
|
19
|
+
whatever the page's real state.
|
|
20
|
+
fix_hint: '`const results = await new AxeBuilder({ page }).analyze(); expect(results.violations).toEqual([]);`'
|
|
21
|
+
exceptions:
|
|
22
|
+
- Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
|
|
23
|
+
metadata:
|
|
24
|
+
aliases:
|
|
25
|
+
- BUN-E2E-A11Y-HARNESS-001
|
|
26
|
+
severity: 3
|
|
27
|
+
disposition: strict
|
|
28
|
+
introduced_in: 0.5.0
|
|
29
|
+
mirrors: tester.vite.a11y-harness
|
|
30
|
+
implementation:
|
|
31
|
+
type: validator
|
|
32
|
+
ref: htmx_e2e_detector
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.htmx.covered-train-is-routed
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: A train a browser spec covers is selected by an interlocking route
|
|
6
|
+
statement: A declared train that a journey spec binds to MUST be selected by at least one interlocking route. Bun/htmx
|
|
7
|
+
realization of `tester.vite.covered-train-is-routed`, strict.
|
|
8
|
+
terms:
|
|
9
|
+
- term_id: browser_spec
|
|
10
|
+
text: 'a `*.e2e.ts` file run by Playwright, or any test file whose header comments carry a journey marker (`//
|
|
11
|
+
Train:`, `// Journey:`, `// URN: test:train:…`, `// URN: test:journey:…`), so a misnamed one is still judged.
|
|
12
|
+
A unit test that merely mentions a journey URN in a string is not one.'
|
|
13
|
+
content:
|
|
14
|
+
summary: A train a browser spec covers is selected by an interlocking route.
|
|
15
|
+
normative_text: A spec can stay green while exercising a train nothing in the application can reach. Covering
|
|
16
|
+
an unrouted train proves nothing about the product.
|
|
17
|
+
fix_hint: Route the train from an interlocking, or bind the spec to a routed train.
|
|
18
|
+
exceptions:
|
|
19
|
+
- Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
|
|
20
|
+
- Undeclared trains are reported by `tester.htmx.e2e-binds-declared-subject`.
|
|
21
|
+
metadata:
|
|
22
|
+
aliases:
|
|
23
|
+
- BUN-E2E-COVERED-TRAIN-IS-ROUTED-001
|
|
24
|
+
severity: 3
|
|
25
|
+
disposition: strict
|
|
26
|
+
introduced_in: 0.5.0
|
|
27
|
+
mirrors: tester.vite.covered-train-is-routed
|
|
28
|
+
implementation:
|
|
29
|
+
type: validator
|
|
30
|
+
ref: htmx_e2e_detector
|