@afokapu/atdd-bun 0.1.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/HOOK_AUDIT.md +22 -0
- package/PLANNER_PORT.md +55 -0
- package/README.md +256 -0
- package/bunfig.toml +2 -0
- package/conventions/coder.bun/coder.bun.boundaries-http-client.convention.yaml +43 -0
- package/conventions/coder.bun/coder.bun.commons-application-no-integration.convention.yaml +40 -0
- package/conventions/coder.bun/coder.bun.commons-cross-feature-imports-in.convention.yaml +39 -0
- package/conventions/coder.bun/coder.bun.commons-domain-no-framework-import.convention.yaml +40 -0
- package/conventions/coder.bun/coder.bun.commons-domain-no-outbound.convention.yaml +41 -0
- package/conventions/coder.bun/coder.bun.complexity-cyclomatic.convention.yaml +51 -0
- package/conventions/coder.bun/coder.bun.complexity-length.convention.yaml +43 -0
- package/conventions/coder.bun/coder.bun.complexity-nesting.convention.yaml +49 -0
- package/conventions/coder.bun/coder.bun.composition-consumer.convention.yaml +40 -0
- package/conventions/coder.bun/coder.bun.composition-root.convention.yaml +42 -0
- package/conventions/coder.bun/coder.bun.dead-code-reachability.convention.yaml +49 -0
- package/conventions/coder.bun/coder.bun.design-hierarchy-import.convention.yaml +42 -0
- package/conventions/coder.bun/coder.bun.dto-mapper.convention.yaml +38 -0
- package/conventions/coder.bun/coder.bun.dto-placement.convention.yaml +39 -0
- package/conventions/coder.bun/coder.bun.dto-purity.convention.yaml +40 -0
- package/conventions/coder.bun/coder.bun.duplication-intra-layer.convention.yaml +47 -0
- package/conventions/coder.bun/coder.bun.error-response-bare-string.convention.yaml +47 -0
- package/conventions/coder.bun/coder.bun.error-response-code-format.convention.yaml +46 -0
- package/conventions/coder.bun/coder.bun.green-header-order.convention.yaml +61 -0
- package/conventions/coder.bun/coder.bun.green-header-purpose.convention.yaml +55 -0
- package/conventions/coder.bun/coder.bun.green-header-runtime.convention.yaml +56 -0
- package/conventions/coder.bun/coder.bun.green-header-tested-by.convention.yaml +63 -0
- package/conventions/coder.bun/coder.bun.green-urn-layer.convention.yaml +53 -0
- package/conventions/coder.bun/coder.bun.green-urn-marker.convention.yaml +67 -0
- package/conventions/coder.bun/coder.bun.green-urn-name-matches.convention.yaml +57 -0
- package/conventions/coder.bun/coder.bun.green-urn-pattern.convention.yaml +56 -0
- package/conventions/coder.bun/coder.bun.green-urn-side.convention.yaml +54 -0
- package/conventions/coder.bun/coder.bun.green-urn-wagon-feature.convention.yaml +56 -0
- package/conventions/coder.bun/coder.bun.interlocking-bilateral-binding.convention.yaml +132 -0
- package/conventions/coder.bun/coder.bun.interlocking-delegates-to-trainrunner.convention.yaml +56 -0
- package/conventions/coder.bun/coder.bun.interlocking-does-not-carry-cargo.convention.yaml +53 -0
- package/conventions/coder.bun/coder.bun.interlocking-resolution-model-exists.convention.yaml +61 -0
- package/conventions/coder.bun/coder.bun.interlocking-runner-exists.convention.yaml +64 -0
- package/conventions/coder.bun/coder.bun.journey-runner-boundary.convention.yaml +55 -0
- package/conventions/coder.bun/coder.bun.layer-naming.convention.yaml +41 -0
- package/conventions/coder.bun/coder.bun.logging-console.convention.yaml +47 -0
- package/conventions/coder.bun/coder.bun.logging-structured.convention.yaml +49 -0
- package/conventions/coder.bun/coder.bun.quality-comments.convention.yaml +44 -0
- package/conventions/coder.bun/coder.bun.quality-mi.convention.yaml +47 -0
- package/conventions/coder.bun/coder.bun.runtime-executes-the-declaration.convention.yaml +104 -0
- package/conventions/coder.bun/coder.bun.runtime-server-is-bun-serve.convention.yaml +64 -0
- package/conventions/coder.bun/coder.bun.runtime-single-lockfile.convention.yaml +56 -0
- package/conventions/coder.bun/coder.bun.runtime-typecheck-enforced.convention.yaml +91 -0
- package/conventions/coder.bun/coder.bun.security-hardcoded-secret.convention.yaml +50 -0
- package/conventions/coder.bun/coder.bun.security-missing-auth.convention.yaml +53 -0
- package/conventions/coder.bun/coder.bun.security-sql-injection.convention.yaml +54 -0
- package/conventions/coder.bun/coder.bun.station-master-interlocking-routing.convention.yaml +62 -0
- package/conventions/coder.bun/coder.bun.station-master-journey-routing.convention.yaml +49 -0
- package/conventions/coder.bun/coder.bun.wagon-honours-its-contract.convention.yaml +64 -0
- package/conventions/coder.htmx/coder.htmx.fragment-escapes-interpolation.convention.yaml +72 -0
- package/conventions/coder.htmx/coder.htmx.swap-no-inline-handler.convention.yaml +59 -0
- package/conventions/coder.htmx/coder.htmx.swap-oob-carries-id.convention.yaml +56 -0
- package/conventions/coder.htmx/coder.htmx.verb-destructive-confirms.convention.yaml +56 -0
- package/conventions/coder.htmx/coder.htmx.verb-endpoint-is-routed.convention.yaml +73 -0
- package/conventions/coder.htmx/coder.htmx.verb-endpoint-same-origin.convention.yaml +58 -0
- package/conventions/coder.htmx/coder.htmx.verb-mutation-signals-progress.convention.yaml +59 -0
- package/conventions/planner.docs/planner.docs.adr-registry-derived.convention.yaml +83 -0
- package/conventions/planner.docs/planner.docs.area-index-required.convention.yaml +67 -0
- package/conventions/planner.docs/planner.docs.artifact-path-shape.convention.yaml +82 -0
- package/conventions/planner.docs/planner.docs.asciidoc-only.convention.yaml +71 -0
- package/conventions/planner.docs/planner.docs.doc-id-unique.convention.yaml +65 -0
- package/conventions/planner.docs/planner.docs.graph-target-resolves.convention.yaml +87 -0
- package/conventions/planner.docs/planner.docs.identity-required.convention.yaml +68 -0
- package/conventions/planner.docs/planner.docs.reference-integrity.convention.yaml +74 -0
- package/conventions/planner.docs/planner.docs.undeclared-change.convention.yaml +80 -0
- package/conventions/tester.bun/tester.bun.acceptance-binding-declared.convention.yaml +49 -0
- package/conventions/tester.bun/tester.bun.acceptance-covers-tag-well-formed.convention.yaml +50 -0
- package/conventions/tester.bun/tester.bun.acceptance-resolves-to-declared.convention.yaml +61 -0
- package/conventions/tester.bun/tester.bun.interlocking-production-runner-used.convention.yaml +76 -0
- package/conventions/tester.bun/tester.bun.interlocking-route-coverage.convention.yaml +66 -0
- package/conventions/tester.bun/tester.bun.interlocking-smoke-coverage-for-station-master.convention.yaml +76 -0
- package/conventions/tester.bun/tester.bun.interlocking-trace-binds-declared-route.convention.yaml +74 -0
- package/conventions/tester.bun/tester.bun.interlocking-train-sequence-is-exercised.convention.yaml +77 -0
- package/conventions/tester.bun/tester.bun.red-behavioral-assertion.convention.yaml +51 -0
- package/conventions/tester.bun/tester.bun.red-fails-first.convention.yaml +52 -0
- package/conventions/tester.bun/tester.bun.routing-runtime-family.convention.yaml +41 -0
- package/conventions/tester.bun/tester.bun.security-auth.convention.yaml +46 -0
- package/conventions/tester.bun/tester.bun.security-input.convention.yaml +45 -0
- package/conventions/tester.bun/tester.bun.smoke-no-collaborator-substitution.convention.yaml +45 -0
- package/conventions/tester.bun/tester.bun.smoke-observable-assertion.convention.yaml +54 -0
- package/conventions/tester.bun/tester.bun.telemetry-emit.convention.yaml +46 -0
- package/conventions/tester.bun/tester.bun.test-carries-urn-identity.convention.yaml +51 -0
- package/conventions/tester.bun/tester.bun.test-imports-bun-test.convention.yaml +55 -0
- package/conventions/tester.bun/tester.bun.test-isolation-no-live-state.convention.yaml +50 -0
- package/conventions/tester.bun/tester.bun.test-no-self-skip.convention.yaml +46 -0
- package/conventions/tester.bun/tester.bun.test-phase-declared.convention.yaml +45 -0
- package/conventions/tester.htmx/tester.htmx.fragment-asserts-returned-markup.convention.yaml +52 -0
- package/conventions/tester.htmx/tester.htmx.swap-oob-asserts-destination-id.convention.yaml +48 -0
- package/conventions/tester.htmx/tester.htmx.verb-endpoint-coverage.convention.yaml +54 -0
- package/conventions/traceability/traceability.plan.executable-acceptance-has-test.convention.yaml +2 -0
- package/conventions/traceability/traceability.source.tested-by-present.convention.yaml +2 -0
- package/conventions/traceability/traceability.source.tested-by-resolves.convention.yaml +2 -0
- package/conventions/traceability/traceability.test.binding-resolves.convention.yaml +2 -0
- package/detectors/atdd_traceability_closure/atdd.implementation.yaml +8 -0
- package/detectors/atdd_traceability_closure/detect.mjs +84 -0
- package/detectors/atdd_traceability_closure/fixtures/clean/plan/orders/E001.yaml +4 -0
- package/detectors/atdd_traceability_closure/fixtures/clean/src/order.ts +4 -0
- package/detectors/atdd_traceability_closure/fixtures/clean/test/order.test.ts +4 -0
- package/detectors/atdd_traceability_closure/fixtures/dirty/plan/orders/E001.yaml +6 -0
- package/detectors/atdd_traceability_closure/fixtures/dirty/src/missing-test.ts +2 -0
- package/detectors/atdd_traceability_closure/fixtures/dirty/src/unknown-test.ts +4 -0
- package/detectors/atdd_traceability_closure/fixtures/dirty/test/bad-binding.test.ts +4 -0
- package/detectors/atdd_traceability_closure/fixtures/dirty/test/no-binding.test.ts +3 -0
- package/detectors/bun_clean_architecture_detector/atdd.implementation.yaml +42 -0
- package/detectors/bun_clean_architecture_detector/checks/_map.json +14 -0
- package/detectors/bun_clean_architecture_detector/checks/a_boundaries_http_client.mjs +36 -0
- package/detectors/bun_clean_architecture_detector/checks/a_commons_application_no_integration.mjs +37 -0
- package/detectors/bun_clean_architecture_detector/checks/a_commons_cross_feature.mjs +41 -0
- package/detectors/bun_clean_architecture_detector/checks/a_commons_domain_no_outbound.mjs +40 -0
- package/detectors/bun_clean_architecture_detector/checks/a_composition_consumer.mjs +33 -0
- package/detectors/bun_clean_architecture_detector/checks/a_composition_root.mjs +35 -0
- package/detectors/bun_clean_architecture_detector/checks/a_domain_no_framework.mjs +47 -0
- package/detectors/bun_clean_architecture_detector/checks/a_dto_mapper.mjs +31 -0
- package/detectors/bun_clean_architecture_detector/checks/a_dto_placement.mjs +30 -0
- package/detectors/bun_clean_architecture_detector/checks/a_dto_purity.mjs +59 -0
- package/detectors/bun_clean_architecture_detector/checks/a_hierarchy_import.mjs +48 -0
- package/detectors/bun_clean_architecture_detector/checks/a_layer_naming.mjs +41 -0
- package/detectors/bun_clean_architecture_detector/detect.mjs +46 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/contracts/order.ts +5 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/application/place.ts +3 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/composition.ts +4 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/domain/total.ts +2 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/integration/order-mapper.ts +3 -0
- package/detectors/bun_clean_architecture_detector/fixtures/clean/features/orders/presentation/api.ts +3 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/application/flow.ts +2 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/domain/billing/rules.ts +1 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/domain/orders/rules.ts +5 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/commons/integration/http.ts +1 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/application/pay.ts +2 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/domain/rules.ts +2 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/helper.ts +1 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/integration/client.ts +1 -0
- package/detectors/bun_clean_architecture_detector/fixtures/dirty/features/billing/presentation/api.ts +2 -0
- package/detectors/bun_fullstack_detector/atdd.implementation.yaml +23 -0
- package/detectors/bun_fullstack_detector/checks/_map.json +5 -0
- package/detectors/bun_fullstack_detector/checks/bun_runtime_server_is_bun_serve.mjs +39 -0
- package/detectors/bun_fullstack_detector/checks/bun_runtime_single_lockfile.mjs +40 -0
- package/detectors/bun_fullstack_detector/checks/bun_runtime_typecheck_enforced.mjs +133 -0
- package/detectors/bun_fullstack_detector/detect.mjs +46 -0
- package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_server_is_bun_serve/server.ts +7 -0
- package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_single_lockfile/bun.lock +1 -0
- package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_typecheck_enforced/package.json +5 -0
- package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_typecheck_enforced/server.ts +3 -0
- package/detectors/bun_fullstack_detector/fixtures/clean/bun_runtime_typecheck_enforced/tsconfig.json +1 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_server_is_bun_serve/server.ts +5 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_single_lockfile/bun.lock +1 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_single_lockfile/package-lock.json +1 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/package.json +4 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/packages/second/index.ts +8 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/packages/second/package.json +1 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/server.ts +3 -0
- package/detectors/bun_fullstack_detector/fixtures/dirty/bun_runtime_typecheck_enforced/tsconfig.json +1 -0
- package/detectors/bun_green_traceability_detector/atdd.implementation.yaml +35 -0
- package/detectors/bun_green_traceability_detector/checks/_map.json +12 -0
- package/detectors/bun_green_traceability_detector/checks/green_header_order.mjs +24 -0
- package/detectors/bun_green_traceability_detector/checks/green_header_purpose.mjs +18 -0
- package/detectors/bun_green_traceability_detector/checks/green_header_runtime.mjs +25 -0
- package/detectors/bun_green_traceability_detector/checks/green_header_tested_by.mjs +15 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_layer.mjs +17 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_marker.mjs +18 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_name_matches.mjs +26 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_pattern.mjs +17 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_side.mjs +20 -0
- package/detectors/bun_green_traceability_detector/checks/green_urn_wagon_feature.mjs +20 -0
- package/detectors/bun_green_traceability_detector/detect.mjs +46 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_order/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_order/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_purpose/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_purpose/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_runtime/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_runtime/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_tested_by/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_header_tested_by/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_layer/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_layer/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_marker/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_marker/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_name_matches/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_name_matches/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_pattern/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_pattern/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_side/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_side/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_wagon_feature/OrderPanel.html +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/clean/green_urn_wagon_feature/OrderRow.ts +7 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_order/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_purpose/OrderRow.ts +5 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_runtime/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_header_tested_by/OrderPanel.html +5 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_layer/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_marker/OrderRow.ts +3 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_name_matches/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_pattern/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_side/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/fixtures/dirty/green_urn_wagon_feature/OrderRow.ts +6 -0
- package/detectors/bun_green_traceability_detector/urn_header.mjs +191 -0
- package/detectors/bun_interlocking_binding/atdd.implementation.yaml +31 -0
- package/detectors/bun_interlocking_binding/checks/interlocking_runtime_executes.mjs +168 -0
- package/detectors/bun_interlocking_binding/detect.mjs +608 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/src/trains/interlocking.ts +66 -0
- package/detectors/bun_interlocking_binding/fixtures/clean/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/plan/_trains/_interlockings/match-resolution.yaml +57 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/src/trains/interlocking.ts +28 -0
- package/detectors/bun_interlocking_binding/fixtures/clean_flow_style_actions/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/src/trains/interlocking.ts +28 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/plan/_trains/_interlockings/match-resolution.yaml +54 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/src/trains/interlocking.ts +28 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_parallel_field/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/src/trains/interlocking.ts +28 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_station_missing/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/e2e/interlockings/match-resolution/trace.test.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/src/trains/interlocking.ts +28 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_trace_unbound/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/e2e/interlockings/match-resolution/trace.test.ts +10 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/plan/_trains/train:match:match-resolution-standard.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/plan/_trains/train:match:match-resolution-timeout.yaml +4 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/server.ts +19 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/src/trains/interlocking.ts +30 -0
- package/detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/src/trains/runner.ts +7 -0
- package/detectors/bun_interlocking_coverage/_shared/interlocking.mjs +389 -0
- package/detectors/bun_interlocking_coverage/atdd.implementation.yaml +27 -0
- package/detectors/bun_interlocking_coverage/checks/_map.json +7 -0
- package/detectors/bun_interlocking_coverage/checks/interlocking_production_runner.mjs +82 -0
- package/detectors/bun_interlocking_coverage/checks/interlocking_route_coverage.mjs +58 -0
- package/detectors/bun_interlocking_coverage/checks/interlocking_smoke_coverage.mjs +68 -0
- package/detectors/bun_interlocking_coverage/checks/interlocking_trace_binds.mjs +64 -0
- package/detectors/bun_interlocking_coverage/checks/interlocking_train_sequence.mjs +110 -0
- package/detectors/bun_interlocking_coverage/detect.mjs +46 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/smoke/resolve-match.smoke.test.ts +19 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/interlockings/match-resolution/routes.test.ts +23 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/e2e/interlockings/match-resolution/routes.test.ts +12 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_route_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_smoke_coverage/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_smoke_coverage/e2e/interlockings/match-resolution/trace.test.ts +17 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_smoke_coverage/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/e2e/interlockings/match-resolution/routes.test.ts +21 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/e2e/interlockings/match-resolution/trace.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/e2e/smoke/resolve-match.smoke.test.ts +13 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_trace_binds/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/e2e/interlockings/match-resolution/routes.test.ts +16 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/plan/_trains/_interlockings/match-resolution.yaml +51 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/plan/_trains/train:match:match-resolution-standard.yaml +8 -0
- package/detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_train_sequence/plan/_trains/train:match:match-resolution-timeout.yaml +5 -0
- package/detectors/bun_interlocking_infrastructure/_shared/interlocking.mjs +477 -0
- package/detectors/bun_interlocking_infrastructure/atdd.implementation.yaml +32 -0
- package/detectors/bun_interlocking_infrastructure/checks/_map.json +10 -0
- package/detectors/bun_interlocking_infrastructure/checks/interlocking_delegates.mjs +70 -0
- package/detectors/bun_interlocking_infrastructure/checks/interlocking_no_cargo.mjs +62 -0
- package/detectors/bun_interlocking_infrastructure/checks/interlocking_resolution_model.mjs +64 -0
- package/detectors/bun_interlocking_infrastructure/checks/interlocking_runner_exists.mjs +73 -0
- package/detectors/bun_interlocking_infrastructure/checks/interlocking_station_routing.mjs +62 -0
- package/detectors/bun_interlocking_infrastructure/checks/journey_runner_boundary.mjs +153 -0
- package/detectors/bun_interlocking_infrastructure/checks/journey_station_routing.mjs +119 -0
- package/detectors/bun_interlocking_infrastructure/checks/wagon_contract_honoured.mjs +149 -0
- package/detectors/bun_interlocking_infrastructure/detect.mjs +46 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_delegates/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_no_cargo/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_resolution_model/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_runner_exists/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/interlocking_station_routing/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_runner_boundary/plan/_journeys/example.yaml +16 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_runner_boundary/src/trains/journey.ts +15 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_station_routing/plan/_journeys/public.yaml +16 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_station_routing/server.ts +13 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/journey_station_routing/src/trains/journey.ts +14 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/wagon_contract_honoured/plan/orders/_orders.yaml +17 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/clean/wagon_contract_honoured/src/orders/wagon.ts +15 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/src/trains/interlocking.ts +49 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_delegates/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/src/match/wagon.ts +11 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/src/trains/interlocking.ts +42 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_no_cargo/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/src/trains/interlocking.ts +21 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_resolution_model/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/server.ts +22 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/src/trains/interlocking.ts +16 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_runner_exists/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/server.ts +19 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/src/match/wagon.ts +6 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/src/trains/interlocking.ts +41 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/interlocking_station_routing/src/trains/runner.ts +28 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_runner_boundary/plan/_journeys/example.yaml +16 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_runner_boundary/src/trains/journey.ts +14 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_station_routing/plan/_journeys/public.yaml +16 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_station_routing/server.ts +10 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/journey_station_routing/src/trains/journey.ts +14 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/wagon_contract_honoured/plan/orders/_orders.yaml +17 -0
- package/detectors/bun_interlocking_infrastructure/fixtures/dirty/wagon_contract_honoured/src/orders/wagon.ts +13 -0
- package/detectors/bun_security_hygiene_detector/atdd.implementation.yaml +33 -0
- package/detectors/bun_security_hygiene_detector/checks/_map.json +9 -0
- package/detectors/bun_security_hygiene_detector/checks/err_bare_string.mjs +38 -0
- package/detectors/bun_security_hygiene_detector/checks/err_code_format.mjs +36 -0
- package/detectors/bun_security_hygiene_detector/checks/log_console.mjs +33 -0
- package/detectors/bun_security_hygiene_detector/checks/log_structured.mjs +36 -0
- package/detectors/bun_security_hygiene_detector/checks/sec_hardcoded_secret.mjs +43 -0
- package/detectors/bun_security_hygiene_detector/checks/sec_missing_auth.mjs +63 -0
- package/detectors/bun_security_hygiene_detector/checks/sec_sql_injection.mjs +56 -0
- package/detectors/bun_security_hygiene_detector/detect.mjs +46 -0
- package/detectors/bun_security_hygiene_detector/fixtures/clean/server.ts +24 -0
- package/detectors/bun_security_hygiene_detector/fixtures/dirty/db.ts +6 -0
- package/detectors/bun_security_hygiene_detector/fixtures/dirty/errors.ts +6 -0
- package/detectors/bun_security_hygiene_detector/fixtures/dirty/logging.ts +4 -0
- package/detectors/bun_security_hygiene_detector/fixtures/dirty/routes.ts +10 -0
- package/detectors/bun_security_hygiene_detector/fixtures/dirty/secrets.ts +3 -0
- package/detectors/bun_tester_discipline_detector/atdd.implementation.yaml +46 -0
- package/detectors/bun_tester_discipline_detector/checks/_map.json +18 -0
- package/detectors/bun_tester_discipline_detector/checks/t_acceptance_binding.mjs +19 -0
- package/detectors/bun_tester_discipline_detector/checks/t_acceptance_covers_tag.mjs +25 -0
- package/detectors/bun_tester_discipline_detector/checks/t_acceptance_resolves.mjs +106 -0
- package/detectors/bun_tester_discipline_detector/checks/t_isolation_no_live_state.mjs +40 -0
- package/detectors/bun_tester_discipline_detector/checks/t_red_behavioral.mjs +35 -0
- package/detectors/bun_tester_discipline_detector/checks/t_red_fails_first.mjs +30 -0
- package/detectors/bun_tester_discipline_detector/checks/t_routing_runtime.mjs +22 -0
- package/detectors/bun_tester_discipline_detector/checks/t_security_auth.mjs +26 -0
- package/detectors/bun_tester_discipline_detector/checks/t_security_input.mjs +25 -0
- package/detectors/bun_tester_discipline_detector/checks/t_smoke_no_substitution.mjs +25 -0
- package/detectors/bun_tester_discipline_detector/checks/t_smoke_observable.mjs +28 -0
- package/detectors/bun_tester_discipline_detector/checks/t_telemetry_emit.mjs +27 -0
- package/detectors/bun_tester_discipline_detector/checks/t_test_imports_bun_test.mjs +31 -0
- package/detectors/bun_tester_discipline_detector/checks/t_test_no_self_skip.mjs +34 -0
- package/detectors/bun_tester_discipline_detector/checks/t_test_phase_declared.mjs +21 -0
- package/detectors/bun_tester_discipline_detector/checks/t_urn_identity.mjs +18 -0
- package/detectors/bun_tester_discipline_detector/detect.mjs +46 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/audit.sec.test.ts +15 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/checkout.red.test.ts +16 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/emit.telemetry.test.ts +15 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/marked.red.test.ts +14 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/orders.smoke.test.ts +16 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/payload.input.test.ts +13 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E001.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E002.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E020.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E021.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E022.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/clean/plan/orders/E023.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/badcovers.test.ts +7 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/badphase.test.ts +6 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/foreign_harness.test.ts +6 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/happy.auth.test.ts +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/happy.input.test.ts +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/internal.smoke.test.ts +10 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/no_header.test.ts +2 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E004.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E005.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E006.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E007.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E008.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E009.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E010.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E024.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E025.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E026.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E027.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E028.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/plan/orders/E030.yaml +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/polluting.test.ts +11 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/quiet.telemetry.test.ts +9 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/skipped.test.ts +6 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/substituted.smoke.test.ts +13 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/unbound.test.ts +5 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/unmarked.red.test.ts +7 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/unresolvable_binding.test.ts +17 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/vacuous.red.test.ts +7 -0
- package/detectors/bun_tester_discipline_detector/fixtures/dirty/wrongruntime.test.ts +7 -0
- package/detectors/bun_tester_discipline_detector/test_header.mjs +160 -0
- package/detectors/bun_ts_metrics_detector/atdd.implementation.yaml +34 -0
- package/detectors/bun_ts_metrics_detector/checks/_map.json +9 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_complexity_cyclomatic.mjs +36 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_complexity_length.mjs +36 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_complexity_nesting.mjs +36 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_dead_code.mjs +58 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_duplication.mjs +70 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_quality_comments.mjs +30 -0
- package/detectors/bun_ts_metrics_detector/checks/ts_quality_mi.mjs +30 -0
- package/detectors/bun_ts_metrics_detector/detect.mjs +46 -0
- package/detectors/bun_ts_metrics_detector/fixtures/clean/domain/label.ts +6 -0
- package/detectors/bun_ts_metrics_detector/fixtures/clean/domain/total.ts +8 -0
- package/detectors/bun_ts_metrics_detector/fixtures/clean/index.ts +7 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/bare.ts +2 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/big.ts +600 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/consumer.ts +2 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/domain/a.ts +9 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/domain/b.ts +9 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/gnarly.ts +22 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/index.ts +8 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/long.ts +64 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/orphan.ts +1 -0
- package/detectors/bun_ts_metrics_detector/fixtures/dirty/typed.ts +1 -0
- package/detectors/bun_ts_metrics_detector/ts_metrics.mjs +310 -0
- package/detectors/htmx_hypermedia_detector/atdd.implementation.yaml +28 -0
- package/detectors/htmx_hypermedia_detector/checks/_map.json +9 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_fragment_escapes_interpolation.mjs +66 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_swap_no_inline_handler.mjs +40 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_swap_oob_carries_id.mjs +37 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_verb_destructive_confirms.mjs +36 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_verb_endpoint_is_routed.mjs +133 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_verb_endpoint_same_origin.mjs +33 -0
- package/detectors/htmx_hypermedia_detector/checks/htmx_verb_mutation_signals_progress.mjs +43 -0
- package/detectors/htmx_hypermedia_detector/detect.mjs +46 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_fragment_escapes_interpolation/render.ts +6 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_swap_no_inline_handler/row.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_swap_oob_carries_id/fragment.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_destructive_confirms/delete.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_endpoint_is_routed/server.ts +10 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_endpoint_is_routed/src/OrderRow.ts +7 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_endpoint_same_origin/panel.html +3 -0
- package/detectors/htmx_hypermedia_detector/fixtures/clean/htmx_verb_mutation_signals_progress/form.html +4 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_fragment_escapes_interpolation/render.ts +3 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_swap_no_inline_handler/row.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_swap_oob_carries_id/fragment.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_destructive_confirms/delete.html +1 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_endpoint_is_routed/server.ts +10 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_endpoint_is_routed/src/OrderRow.ts +9 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_endpoint_same_origin/panel.html +3 -0
- package/detectors/htmx_hypermedia_detector/fixtures/dirty/htmx_verb_mutation_signals_progress/form.html +3 -0
- package/detectors/htmx_tester_detector/atdd.implementation.yaml +21 -0
- package/detectors/htmx_tester_detector/checks/_map.json +5 -0
- package/detectors/htmx_tester_detector/checks/t_fragment_asserts_returned_markup.mjs +40 -0
- package/detectors/htmx_tester_detector/checks/t_swap_oob_asserts_destination_id.mjs +38 -0
- package/detectors/htmx_tester_detector/checks/t_verb_endpoint_coverage.mjs +59 -0
- package/detectors/htmx_tester_detector/detect.mjs +46 -0
- package/detectors/htmx_tester_detector/fixtures/clean/orders.test.ts +23 -0
- package/detectors/htmx_tester_detector/fixtures/clean/panel.html +7 -0
- package/detectors/htmx_tester_detector/fixtures/dirty/orders.test.ts +20 -0
- package/detectors/htmx_tester_detector/fixtures/dirty/panel.html +7 -0
- package/detectors/htmx_tester_detector/fixtures/dirty/statusonly.test.ts +9 -0
- package/detectors/htmx_tester_detector/test_header.mjs +4 -0
- package/detectors/planner_docs_capability/README.md +34 -0
- package/detectors/planner_docs_capability/atdd.implementation.yaml +57 -0
- package/detectors/planner_docs_capability/detect.mjs +10 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/clean/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/notes.md +3 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/decisions/adr-20260906-002-documentation-system.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_adr_registry/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/delivery/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_duplicate_id/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/delivery/release.adoc +3 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_identity/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/notes.md +3 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_markdown/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/delivery/release.adoc +10 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_missing_index/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/decisions/adr-20260906-001-shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/decisions/index.adoc +7 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/shared-control-root.adoc +8 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/architecture/state-store.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/archive/2025-control-root.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/archive/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/delivery/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/dist/index.md +1 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/purpose/index.adoc +5 -0
- package/detectors/planner_docs_capability/fixtures/dirty_unresolved_edge/docs/purpose/worktrees.adoc +5 -0
- package/detectors/planner_plan_integrity/atdd.implementation.yaml +18 -0
- package/detectors/planner_plan_integrity/detect.mjs +23 -0
- package/detectors/planner_plan_integrity/fixtures/clean/README.md +1 -0
- package/detectors/planner_plan_integrity/fixtures/dirty/plan/broken.yaml +1 -0
- package/detectors/planner_schema_validation/atdd.implementation.yaml +20 -0
- package/detectors/planner_schema_validation/detect.mjs +9 -0
- package/detectors/planner_schema_validation/fixtures/clean/contracts/_contracts.yaml +6 -0
- package/detectors/planner_schema_validation/fixtures/clean/contracts/orders/placed.schema.json +4 -0
- package/detectors/planner_schema_validation/fixtures/clean/plan/_themes.yaml +3 -0
- package/detectors/planner_schema_validation/fixtures/clean/plan/_trains/orders.yaml +11 -0
- package/detectors/planner_schema_validation/fixtures/clean/plan/orders/_orders.yaml +16 -0
- package/detectors/planner_schema_validation/fixtures/dirty/contracts/_contracts.yaml +3 -0
- package/detectors/planner_schema_validation/fixtures/dirty/plan/_themes.yaml +2 -0
- package/detectors/planner_schema_validation/fixtures/dirty/plan/_trains/orders.yaml +11 -0
- package/detectors/planner_static_validators/atdd.implementation.yaml +36 -0
- package/detectors/planner_static_validators/detect.mjs +9 -0
- package/detectors/planner_static_validators/fixtures/clean/contracts/_contracts.yaml +6 -0
- package/detectors/planner_static_validators/fixtures/clean/contracts/orders/placed.schema.json +4 -0
- package/detectors/planner_static_validators/fixtures/clean/plan/_themes.yaml +3 -0
- package/detectors/planner_static_validators/fixtures/clean/plan/orders/E001.yaml +10 -0
- package/detectors/planner_static_validators/fixtures/clean/plan/orders/_orders.yaml +19 -0
- package/detectors/planner_static_validators/fixtures/clean/plan/orders/features/place-order.yaml +4 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_journeys/broken.yaml +22 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_themes.yaml +3 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/_interlockings/journey-a.yaml +4 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/journey-a.yaml +7 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/probe/legacy.yaml +3 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains/probe/orphan.yaml +3 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/_trains.yaml +5 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/also_dup/_also_dup.yaml +15 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/dup/E001.yaml +3 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/dup/_dup.yaml +27 -0
- package/detectors/planner_static_validators/fixtures/dirty/plan/dup/features/bad.yaml +2 -0
- package/lib/imports.mjs +83 -0
- package/lib/scan.mjs +246 -0
- package/package.json +35 -0
- package/planner-nodes/ENFORCEMENT_SCOPE.yaml +117 -0
- package/planner-nodes/nodes/planner.acceptance.abstract-fields-required.convention.yaml +44 -0
- package/planner-nodes/nodes/planner.acceptance.authoring-guidelines.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.acceptance.boundary-kind-vocabulary.convention.yaml +38 -0
- package/planner-nodes/nodes/planner.acceptance.execution-kind.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.acceptance.extraction-no-inference.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.acceptance.generator-prompts.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.acceptance.given-when-then-structure.convention.yaml +53 -0
- package/planner-nodes/nodes/planner.acceptance.harness-vocabulary.convention.yaml +99 -0
- package/planner-nodes/nodes/planner.acceptance.harness.convention.yaml +36 -0
- package/planner-nodes/nodes/planner.acceptance.hermetic-fake-contract.convention.yaml +35 -0
- package/planner-nodes/nodes/planner.acceptance.id-pattern.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.acceptance.max-per-wmbt.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.acceptance.plane-keywords.convention.yaml +87 -0
- package/planner-nodes/nodes/planner.acceptance.route-construction.convention.yaml +55 -0
- package/planner-nodes/nodes/planner.acceptance.signal-telemetry-naming.convention.yaml +61 -0
- package/planner-nodes/nodes/planner.acceptance.urn-generation.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.acceptance.well-formed.convention.yaml +57 -0
- package/planner-nodes/nodes/planner.appendix.llm-guidelines.convention.yaml +81 -0
- package/planner-nodes/nodes/planner.appendix.naming-pattern.convention.yaml +45 -0
- package/planner-nodes/nodes/planner.appendix.storage.convention.yaml +44 -0
- package/planner-nodes/nodes/planner.appendix.structure.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.appendix.types.convention.yaml +123 -0
- package/planner-nodes/nodes/planner.artifact-naming.anti-patterns.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.artifact-naming.cardinality-from-aspect.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.artifact-naming.colon-for-hierarchy.convention.yaml +25 -0
- package/planner-nodes/nodes/planner.artifact-naming.contract-file-mapping.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.artifact-naming.depth-guidelines.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.artifact-naming.dot-for-variant.convention.yaml +25 -0
- package/planner-nodes/nodes/planner.artifact-naming.logical-physical-mapping.convention.yaml +36 -0
- package/planner-nodes/nodes/planner.artifact-naming.migration-guide.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.artifact-naming.naming-pattern.convention.yaml +44 -0
- package/planner-nodes/nodes/planner.artifact-naming.path-mirrors-identity.convention.yaml +40 -0
- package/planner-nodes/nodes/planner.artifact-naming.planner-artifacts-use-stable.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.artifact-naming.pluralization.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.artifact-naming.schema-identifier.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.artifact-naming.separator-semantics.convention.yaml +42 -0
- package/planner-nodes/nodes/planner.artifact-naming.theme-first-identity.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.artifact-naming.urn-structure.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.artifact-naming.validation-rules.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.artifact-naming.verb-object-corpus-drift.convention.yaml +49 -0
- package/planner-nodes/nodes/planner.artifact.definition.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.component.artifact-derivation.convention.yaml +139 -0
- package/planner-nodes/nodes/planner.component.business-focus.convention.yaml +65 -0
- package/planner-nodes/nodes/planner.component.count-limit.convention.yaml +64 -0
- package/planner-nodes/nodes/planner.component.derivation.convention.yaml +117 -0
- package/planner-nodes/nodes/planner.component.io-alignment.convention.yaml +65 -0
- package/planner-nodes/nodes/planner.component.layer-assignment.convention.yaml +83 -0
- package/planner-nodes/nodes/planner.component.layer-consistency.convention.yaml +91 -0
- package/planner-nodes/nodes/planner.component.method-limit.convention.yaml +35 -0
- package/planner-nodes/nodes/planner.component.structure.convention.yaml +77 -0
- package/planner-nodes/nodes/planner.component.type-catalog.convention.yaml +436 -0
- package/planner-nodes/nodes/planner.component.urn.convention.yaml +86 -0
- package/planner-nodes/nodes/planner.contract.registry-coherence.convention.yaml +36 -0
- package/planner-nodes/nodes/planner.convention.remedy-must-be-followable.convention.yaml +92 -0
- package/planner-nodes/nodes/planner.coverage.bidirectional-coverage-between-trains.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.coverage.bidirectional-coverage-between-wagons.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.coverage.coverage-graph.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.coverage.every-wmbt-must-be.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.coverage.every-wmbt-must-have.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.coverage.exception-handling.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.criteria.defaults.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.criteria.harness-templates.convention.yaml +159 -0
- package/planner-nodes/nodes/planner.criteria.metric-mapping.convention.yaml +136 -0
- package/planner-nodes/nodes/planner.criteria.plane-keywords.convention.yaml +53 -0
- package/planner-nodes/nodes/planner.criteria.sequence-routing.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.criteria.shape.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.decomposition.canonical-steps.convention.yaml +14 -0
- package/planner-nodes/nodes/planner.decomposition.document-trouble-obligation.convention.yaml +12 -0
- package/planner-nodes/nodes/planner.decomposition.domain-vs-technology.convention.yaml +13 -0
- package/planner-nodes/nodes/planner.decomposition.jtbd-vs-odi-grammar.convention.yaml +18 -0
- package/planner-nodes/nodes/planner.decomposition.keep-pivot-kill.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.decomposition.local-scope.convention.yaml +15 -0
- package/planner-nodes/nodes/planner.decomposition.natural-language-normalization.convention.yaml +12 -0
- package/planner-nodes/nodes/planner.decomposition.train-journey.convention.yaml +13 -0
- package/planner-nodes/nodes/planner.decomposition.wagon-rationale.convention.yaml +12 -0
- package/planner-nodes/nodes/planner.definition.anchor-required.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.feature.artifact-seeded-naming.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.feature.definition.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.feature.estimation.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.feature.feedback-loop-close-the-loop.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.feature.feedback-loop-kind.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.feature.feedback-loop-suppression.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.feature.footprint-scoring.convention.yaml +119 -0
- package/planner-nodes/nodes/planner.feature.grouping-strategy.convention.yaml +37 -0
- package/planner-nodes/nodes/planner.feature.hard-limits.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.feature.name-is-verb-object.convention.yaml +40 -0
- package/planner-nodes/nodes/planner.feature.shape.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.feature.size-max-rule.convention.yaml +41 -0
- package/planner-nodes/nodes/planner.feature.urn-naming.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.feature.validation-rules.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.feature.verb-selection-by-artifact-type.convention.yaml +264 -0
- package/planner-nodes/nodes/planner.feature.wagon-link.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.interface.api-mapping.convention.yaml +70 -0
- package/planner-nodes/nodes/planner.interface.artifact-transformation.convention.yaml +103 -0
- package/planner-nodes/nodes/planner.interface.contract-urn.convention.yaml +119 -0
- package/planner-nodes/nodes/planner.interface.naming-patterns.convention.yaml +73 -0
- package/planner-nodes/nodes/planner.interface.orphan-detection.convention.yaml +46 -0
- package/planner-nodes/nodes/planner.interface.ownership-rules.convention.yaml +54 -0
- package/planner-nodes/nodes/planner.interface.structure-rules.convention.yaml +112 -0
- package/planner-nodes/nodes/planner.interface.tests-subdirectory.convention.yaml +61 -0
- package/planner-nodes/nodes/planner.interlocking.definition.convention.yaml +36 -0
- package/planner-nodes/nodes/planner.interlocking.registry-mirrors-document.convention.yaml +38 -0
- package/planner-nodes/nodes/planner.issue-body.dependency-entries-must-be-classified.convention.yaml +21 -0
- package/planner-nodes/nodes/planner.issue-body.graph-context-required.convention.yaml +21 -0
- package/planner-nodes/nodes/planner.journey.continuation-closure.convention.yaml +51 -0
- package/planner-nodes/nodes/planner.journey.definition.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.plan.confirm-before-author.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.plan.confirm-binds-an-issue.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.plan.confirm-requires-interlocking-sanity.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.plan.granularity-completeness.convention.yaml +38 -0
- package/planner-nodes/nodes/planner.plan.session-lifecycle.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.plan.spec-is-schema-valid.convention.yaml +61 -0
- package/planner-nodes/nodes/planner.relationship.no-orphan-nodes.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.smoke.feedback-loop-close-the-loop.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.smoke.synthetic-fixture-bypass.convention.yaml +44 -0
- package/planner-nodes/nodes/planner.steps.architecture-routing.convention.yaml +109 -0
- package/planner-nodes/nodes/planner.steps.jtbd-taxonomy.convention.yaml +227 -0
- package/planner-nodes/nodes/planner.steps.linguistic-patterns.convention.yaml +81 -0
- package/planner-nodes/nodes/planner.steps.sequence.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.subject.invariants.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.theme.definition.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.theme.must-be-canonical.convention.yaml +38 -0
- package/planner-nodes/nodes/planner.theme.theme-zero-mandatory.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.theme.urn-namespace-matches.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.train.acceptance-commit-failures-covered.convention.yaml +10 -0
- package/planner-nodes/nodes/planner.train.acceptances.convention.yaml +85 -0
- package/planner-nodes/nodes/planner.train.artifact-flow.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.train.categories.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.train.definition.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.train.dependencies.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.dispatch-composite-key-exceptional.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.train.dispatch-map-is-registry.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.train.family-matches-terminal-contract.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.train.family.convention.yaml +17 -0
- package/planner-nodes/nodes/planner.train.initial-cargo-inputs-declared.convention.yaml +10 -0
- package/planner-nodes/nodes/planner.train.interlocking-does-not-carry-cargo.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.interlocking-entrypoint-shape.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.train.interlocking-fragment-acceptance-binding.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.train.interlocking-guard-coverage.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.train.interlocking-guard-grammar.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.train.interlocking-home.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.train.interlocking-message-payload-typed.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.interlocking-payload-contract-body-required.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.interlocking-payload-contract-registered.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.train.interlocking-projection-equivalence.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.train.interlocking-route-category-matches-train-id.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.train.interlocking-route-resolution-deterministic.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.train.interlocking-structural-residual-explicit.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.train.interlocking-wmbt-surface-or-residual.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.train.linearity.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.naming.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.train.participants.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.train.production-implementation.convention.yaml +24 -0
- package/planner-nodes/nodes/planner.train.registry-coherence.convention.yaml +69 -0
- package/planner-nodes/nodes/planner.train.registry.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.train.route-category-assessment.convention.yaml +43 -0
- package/planner-nodes/nodes/planner.train.route-space-admission.convention.yaml +41 -0
- package/planner-nodes/nodes/planner.train.scope.convention.yaml +38 -0
- package/planner-nodes/nodes/planner.train.sequence.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.train.terminal-contract.convention.yaml +10 -0
- package/planner-nodes/nodes/planner.train.theme-alignment.convention.yaml +25 -0
- package/planner-nodes/nodes/planner.train.theme-orchestrator-urn.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.train.theme-ranges.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.train.validation-rules.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.train.variation-strategies.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.wagon.artifact-contracts.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.wagon.complexity-model.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.wagon.coupling-complexity.convention.yaml +32 -0
- package/planner-nodes/nodes/planner.wagon.definition.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.wagon.features-format.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.wagon.features.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.wagon.logical-vs-filesystem-naming.convention.yaml +34 -0
- package/planner-nodes/nodes/planner.wagon.name-is-verb-object.convention.yaml +39 -0
- package/planner-nodes/nodes/planner.wagon.no-consume-cycle.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.wagon.produce-consume-artifacts.convention.yaml +46 -0
- package/planner-nodes/nodes/planner.wagon.refinement-extraction.convention.yaml +49 -0
- package/planner-nodes/nodes/planner.wagon.semantic-coherence.convention.yaml +30 -0
- package/planner-nodes/nodes/planner.wagon.separability.convention.yaml +33 -0
- package/planner-nodes/nodes/planner.wagon.slug-dirname-conversion.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.wagon.telemetry-filesystem.convention.yaml +52 -0
- package/planner-nodes/nodes/planner.wagon.urn-naming.convention.yaml +28 -0
- package/planner-nodes/nodes/planner.wagon.urn.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.wmbt.context-clarifier.convention.yaml +24 -0
- package/planner-nodes/nodes/planner.wmbt.definition.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.wmbt.dimension-selection.convention.yaml +37 -0
- package/planner-nodes/nodes/planner.wmbt.direction-selection.convention.yaml +41 -0
- package/planner-nodes/nodes/planner.wmbt.filename-pattern.convention.yaml +27 -0
- package/planner-nodes/nodes/planner.wmbt.lens-selection.convention.yaml +44 -0
- package/planner-nodes/nodes/planner.wmbt.must-have-smoke-acceptance.convention.yaml +55 -0
- package/planner-nodes/nodes/planner.wmbt.object-of-control.convention.yaml +26 -0
- package/planner-nodes/nodes/planner.wmbt.shape.convention.yaml +29 -0
- package/planner-nodes/nodes/planner.wmbt.splitting-rules.convention.yaml +37 -0
- package/planner-nodes/nodes/planner.wmbt.statement-template.convention.yaml +23 -0
- package/planner-nodes/nodes/planner.wmbt.step-code-vocabulary.convention.yaml +31 -0
- package/planner-nodes/nodes/planner.wmbt.urn-naming.convention.yaml +31 -0
- package/planner-schemas/acceptance.schema.json +396 -0
- package/planner-schemas/appendix.schema.json +78 -0
- package/planner-schemas/author/convention-node.schema.json +134 -0
- package/planner-schemas/author/gate.schema.json +36 -0
- package/planner-schemas/author/issue.schema.json +72 -0
- package/planner-schemas/author/relationship.schema.json +19 -0
- package/planner-schemas/author/scope.schema.json +28 -0
- package/planner-schemas/binding-lock.schema.json +38 -0
- package/planner-schemas/component.schema.json +114 -0
- package/planner-schemas/contract-registry.schema.json +47 -0
- package/planner-schemas/feature.schema.json +208 -0
- package/planner-schemas/journey.schema.json +225 -0
- package/planner-schemas/registry-index.schema.json +54 -0
- package/planner-schemas/substrate-lock.schema.json +41 -0
- package/planner-schemas/substrate.schema.json +38 -0
- package/planner-schemas/theme-registry.schema.json +28 -0
- package/planner-schemas/train-interlocking-registry.schema.json +49 -0
- package/planner-schemas/train-interlocking.schema.json +459 -0
- package/planner-schemas/train.schema.json +361 -0
- package/planner-schemas/wagon.schema.json +283 -0
- package/planner-schemas/wmbt.schema.json +68 -0
- package/src/ci.ts +9 -0
- package/src/cli.ts +91 -0
- package/src/docs-capability.ts +156 -0
- package/src/enforce.ts +103 -0
- package/src/hooks.ts +48 -0
- package/src/index.ts +13 -0
- package/src/planner-kernel.ts +112 -0
- package/src/planner-schema-validator.ts +101 -0
- package/src/planner-validators.ts +288 -0
- package/src/register.ts +8 -0
- package/src/release.ts +9 -0
- package/src/setup.ts +15 -0
- package/templates/github/atdd-bun-release.yml +16 -0
- package/templates/github/atdd-bun.yml +26 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.interlocking-route-coverage
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Every admissible interlocking route has an e2e test that exercises it (Bun)
|
|
6
|
+
statement: >-
|
|
7
|
+
Every admissible route declared in an interlocking's guarded route space (the `routes:` list of
|
|
8
|
+
`plan/_trains/_interlockings/**/*.yaml`, the authoritative route space locked by core
|
|
9
|
+
afokapu/atdd#1248) MUST have at least one end-to-end test that exercises it — an `e2e/**/*.ts` test
|
|
10
|
+
that names the route by its `routeId` or its resolved `trainId` so its resolution is proven through
|
|
11
|
+
the production InterlockingRunner -> TrainRunner path (core afokapu/atdd#1251), not asserted
|
|
12
|
+
descriptively. This is the Bun-stack realization of the agnostic core obligation
|
|
13
|
+
`tester.interlocking.route-coverage`; its JS detector (a member of the `bun_interlocking_coverage`
|
|
14
|
+
FAMILY) scans the interlocking route space against the consumer's `e2e/**/*.ts` tests and flags any
|
|
15
|
+
declared route with no covering test. An admissible route with no e2e test is a SILENT-GREEN GAP.
|
|
16
|
+
implementation:
|
|
17
|
+
type: validator
|
|
18
|
+
ref: tester.bun.interlocking-route-coverage
|
|
19
|
+
content:
|
|
20
|
+
summary: >-
|
|
21
|
+
A "every declared interlocking route is exercised by an e2e test" obligation, rendered for the
|
|
22
|
+
Bun application. The JS realization parses each interlocking artifact, extracts its declared routes
|
|
23
|
+
(routeId/trainId/category), then scans `e2e/**/*.ts` for tests that reference the route
|
|
24
|
+
by its `routeId` or its resolved `trainId` (comments masked so a name only in a comment does not
|
|
25
|
+
count). Any declared route with no covering e2e test is a RAW violation anchored at the route's
|
|
26
|
+
declaration line in the source interlocking YAML.
|
|
27
|
+
normative_text: |
|
|
28
|
+
The interlocking YAML is authoritative for the guarded route space (afokapu/atdd#1248): every entry
|
|
29
|
+
under `routes:` is an admissible route the InterlockingRunner can resolve to exactly one `trainId`
|
|
30
|
+
(afokapu/atdd#1251). Coverage of that route space is a tester obligation — an unexercised route is a
|
|
31
|
+
branch of production route control that no test ever drives. A route is COVERED when at least one
|
|
32
|
+
`e2e/**/*.ts` test references it by its `routeId` or by the `trainId` it resolves to. WHICH per-stack
|
|
33
|
+
discovery applies (here: Bun `e2e/**/*.ts` scanned for the route/train tokens) is delegated to
|
|
34
|
+
this realization; other stacks render the same obligation in their own e2e layout.
|
|
35
|
+
fix_hint: |
|
|
36
|
+
Add an end-to-end test that exercises the flagged route through the production runners. Place it
|
|
37
|
+
under `e2e/interlockings/<interlocking_slug>/<slug>.routes.test.ts` and drive
|
|
38
|
+
`new InterlockingRunner(...).resolveTrain(...)` so the route's guard-true case resolves to its
|
|
39
|
+
expected `trainId`, then have `TrainRunner` execute it. Reference the route by its `routeId` or
|
|
40
|
+
`trainId` so coverage is machine-discoverable. Do NOT satisfy this with a mock resolver or a
|
|
41
|
+
descriptive assertion. This rule is `strict`: an admissible route with no covering e2e test blocks.
|
|
42
|
+
exceptions:
|
|
43
|
+
- YAML under the interlocking scope that declares no `routes:` (the `_interlockings.yaml` registry
|
|
44
|
+
index and generated projections) carries no admissible route space and is out of scope.
|
|
45
|
+
- A route already referenced by its `routeId` or resolved `trainId` in any `e2e/**/*.ts` test is
|
|
46
|
+
covered and is not flagged.
|
|
47
|
+
- Per-stack e2e renderings other than Bun are owned by their own workspace packages.
|
|
48
|
+
metadata:
|
|
49
|
+
aliases:
|
|
50
|
+
- BUN-TESTER-INTERLOCKING-ROUTE-COVERAGE-001
|
|
51
|
+
severity: 1
|
|
52
|
+
disposition: strict
|
|
53
|
+
introduced_in: 0.1.0
|
|
54
|
+
core_design_refs:
|
|
55
|
+
- afokapu/atdd#1246
|
|
56
|
+
- afokapu/atdd#1248
|
|
57
|
+
- afokapu/atdd#1251
|
|
58
|
+
terms:
|
|
59
|
+
- term_id: admissible_route
|
|
60
|
+
text: >-
|
|
61
|
+
a single entry under the `routes:` list of an interlocking artifact (afokapu/atdd#1248); it carries
|
|
62
|
+
a `routeId`, the `trainId` it resolves to, a `category`, and a `guard_ref`.
|
|
63
|
+
- term_id: silent_green_route_gap
|
|
64
|
+
text: >-
|
|
65
|
+
an admissible route with no covering e2e test; the interlocking branch it represents is never
|
|
66
|
+
executed, so CI passes while a guarded route-control path is entirely unproven.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.interlocking-smoke-coverage-for-station-master
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Exposed interlocking Station Master actions have smoke coverage through real entrypoints (Bun)
|
|
6
|
+
statement: >-
|
|
7
|
+
Every exposed Station Master action of an interlocking (`entrypoint.exposed: true` with an `actions:`
|
|
8
|
+
entry, core afokapu/atdd#1248) MUST have a smoke test that drives the action through the real
|
|
9
|
+
entrypoint -> Station Master -> InterlockingRunner -> TrainRunner path (core afokapu/atdd#1251). This
|
|
10
|
+
is the Bun-stack realization of the agnostic core obligation
|
|
11
|
+
`tester.interlocking.smoke-coverage-for-station-master`; its JS detector (a member of the
|
|
12
|
+
`bun_interlocking_coverage` FAMILY) scans the interlocking entrypoints and the consumer's
|
|
13
|
+
`e2e/**/*.ts` tests and flags any exposed action with no smoke test that reaches the Station Master and
|
|
14
|
+
exercises the production runners. EXPLICIT POLICY: an exposed action is a critical, user-facing route
|
|
15
|
+
and its smoke coverage is enforced STRICT; an interlocking with `entrypoint.exposed: false` has no
|
|
16
|
+
Station Master action and is OUT OF SCOPE — the criticality signal is the core `entrypoint.exposed`
|
|
17
|
+
field, not a heuristic.
|
|
18
|
+
implementation:
|
|
19
|
+
type: validator
|
|
20
|
+
ref: tester.bun.interlocking-smoke-coverage-for-station-master
|
|
21
|
+
content:
|
|
22
|
+
summary: >-
|
|
23
|
+
A "exposed Station Master interlocking actions have real-entrypoint smoke coverage" obligation,
|
|
24
|
+
rendered for the Bun application. The JS realization parses each interlocking's `entrypoint`; for each
|
|
25
|
+
`exposed: true` action it requires a smoke test under `e2e/**/*.ts` that references the action name,
|
|
26
|
+
a Station Master reference (`StationMaster`/`stationMaster`), AND both production runners. Internal
|
|
27
|
+
(`exposed: false`) interlockings carry no action and are not flagged.
|
|
28
|
+
normative_text: |
|
|
29
|
+
`entrypoint.exposed: true` requires at least one action (afokapu/atdd#1248), and those actions are
|
|
30
|
+
Station Master action names — the user-facing surface. The smoke test for such an action should prove
|
|
31
|
+
the whole interlocking-enabled path end to end: a real endpoint reaches the Station Master, the
|
|
32
|
+
Station Master chooses the interlocking path (not a direct train), InterlockingRunner resolves the
|
|
33
|
+
route, TrainRunner executes the selected train, and the trace records interlockingId/routeId/
|
|
34
|
+
selectedTrainId. The detector's enforced minimum signature for an action's smoke test is an
|
|
35
|
+
`e2e/**/*.ts` file that references the action name AND a Station Master reference AND both production
|
|
36
|
+
runners (`InterlockingRunner`, `TrainRunner`).
|
|
37
|
+
|
|
38
|
+
SEVERITY POLICY (explicit): exposed actions are critical user-facing routes -> strict;
|
|
39
|
+
`exposed: false` interlockings are internal / noncritical -> out of scope. The policy is derived
|
|
40
|
+
from the core `entrypoint.exposed` field, so it is mechanical, not a judgement call.
|
|
41
|
+
fix_hint: |
|
|
42
|
+
Add a smoke test for the flagged Station Master action that hits the real entrypoint and asserts the
|
|
43
|
+
interlocking path is taken: call the real action endpoint so it reaches the Station Master, assert the
|
|
44
|
+
Station Master chose the interlocking (InterlockingRunner) path, that InterlockingRunner resolved a
|
|
45
|
+
route, that TrainRunner executed the selected train, and that the captured trace records the
|
|
46
|
+
interlockingId / routeId / selectedTrainId. This rule is `strict` for exposed (user-facing) actions;
|
|
47
|
+
if the interlocking is genuinely internal, set `entrypoint.exposed: false` with a reason and it leaves
|
|
48
|
+
scope.
|
|
49
|
+
exceptions:
|
|
50
|
+
- Interlockings with `entrypoint.exposed` false (internal-transition-only / library-only /
|
|
51
|
+
planned-not-exposed) carry no Station Master action and are out of scope.
|
|
52
|
+
- An exposed action that already has a covering smoke test (a file referencing the action, the Station
|
|
53
|
+
Master, and both runners) is satisfied and not flagged.
|
|
54
|
+
- Per-stack renderings other than Bun are owned by their own workspace packages.
|
|
55
|
+
metadata:
|
|
56
|
+
aliases:
|
|
57
|
+
- BUN-TESTER-INTERLOCKING-SMOKE-STATION-MASTER-001
|
|
58
|
+
severity: 1
|
|
59
|
+
disposition: strict
|
|
60
|
+
introduced_in: 0.1.0
|
|
61
|
+
core_design_refs:
|
|
62
|
+
- afokapu/atdd#1246
|
|
63
|
+
- afokapu/atdd#1248
|
|
64
|
+
- afokapu/atdd#1251
|
|
65
|
+
terms:
|
|
66
|
+
- term_id: exposed_action
|
|
67
|
+
text: >-
|
|
68
|
+
a Station Master action name listed under an interlocking's `entrypoint.actions` when
|
|
69
|
+
`entrypoint.exposed: true` (afokapu/atdd#1248). It is the user-facing route surface and requires
|
|
70
|
+
smoke coverage; `exposed: false` interlockings have no such action.
|
|
71
|
+
- term_id: station_master_smoke_test
|
|
72
|
+
text: >-
|
|
73
|
+
an `e2e/**/*.ts` smoke test that drives an exposed action through the real entrypoint to the Station
|
|
74
|
+
Master, proving the Station Master chose the interlocking path, InterlockingRunner resolved a route,
|
|
75
|
+
TrainRunner executed the selected train, and the trace recorded the interlockingId/routeId/
|
|
76
|
+
selectedTrainId.
|
package/conventions/tester.bun/tester.bun.interlocking-trace-binds-declared-route.convention.yaml
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.interlocking-trace-binds-declared-route
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Interlocking execution trace binds back to the declared route (Bun)
|
|
6
|
+
statement: >-
|
|
7
|
+
A test that asserts on the runtime trace emitted by interlocking execution MUST bind that trace back to
|
|
8
|
+
the source interlocking declaration — it must assert every required trace field so the executed route is
|
|
9
|
+
traceable to the interlocking YAML it came from (core afokapu/atdd#1248 route space, #1251 runtime
|
|
10
|
+
trace). This is the Bun-stack realization of the agnostic core obligation
|
|
11
|
+
`tester.interlocking.trace-binds-declared-route`; its JS detector (a member of the
|
|
12
|
+
`bun_interlocking_coverage` FAMILY) scans the consumer's `e2e/**/*.ts` interlocking trace tests and
|
|
13
|
+
flags any that reference the runtime `trace` but omit one or more required binding fields. A trace
|
|
14
|
+
assertion that does not bind the declared route lets execution drift from declaration silently.
|
|
15
|
+
implementation:
|
|
16
|
+
type: validator
|
|
17
|
+
ref: tester.bun.interlocking-trace-binds-declared-route
|
|
18
|
+
content:
|
|
19
|
+
summary: >-
|
|
20
|
+
A "interlocking trace assertions bind the declared route" obligation, rendered for the Bun
|
|
21
|
+
backend. The JS realization scans each interlocking-related `e2e/**/*.ts` test that references the
|
|
22
|
+
runtime `trace` and requires it to assert every required trace field (comments masked); any missing
|
|
23
|
+
field is a RAW violation listing the gap.
|
|
24
|
+
normative_text: |
|
|
25
|
+
The TrainResult trace (core afokapu/atdd#1251) is what proves which declared route (core
|
|
26
|
+
afokapu/atdd#1248) actually executed. A trace test that inspects the trace but only checks, say, the
|
|
27
|
+
selectedTrainId does not bind the route back to its declaration — the run could have taken a different
|
|
28
|
+
route/category/guard and still match.
|
|
29
|
+
|
|
30
|
+
REQUIRED trace fields a trace-binding test must assert (TS camelCase):
|
|
31
|
+
- interlockingId
|
|
32
|
+
- routeId
|
|
33
|
+
- selectedTrainId
|
|
34
|
+
- routeCategory
|
|
35
|
+
- guardId
|
|
36
|
+
- resolutionStrategy
|
|
37
|
+
- resolutionReason
|
|
38
|
+
|
|
39
|
+
A file is a trace-binding test when it references a bare `trace` identifier in an interlocking
|
|
40
|
+
context; for such a file every required field above must appear. WHICH per-stack discovery applies
|
|
41
|
+
(here: Bun `e2e/**/*.ts` scanned for the trace object and the required field tokens) is delegated
|
|
42
|
+
to this realization.
|
|
43
|
+
fix_hint: |
|
|
44
|
+
Extend the flagged trace assertion to bind the full declared route. Assert the captured trace records
|
|
45
|
+
all of: interlockingId, routeId, selectedTrainId, routeCategory, guardId,
|
|
46
|
+
resolutionStrategy, resolutionReason — the fields that tie the executed route back to its interlocking
|
|
47
|
+
YAML declaration (afokapu/atdd#1248) and resolution outcome (afokapu/atdd#1251). This rule is `strict`:
|
|
48
|
+
a trace test that does not bind the declared route lets execution drift from declaration undetected.
|
|
49
|
+
exceptions:
|
|
50
|
+
- e2e tests that do not reference the runtime `trace` object are not trace-binding tests and are out
|
|
51
|
+
of scope.
|
|
52
|
+
- Non-interlocking e2e tests (no reference to any interlocking route/train/interlocking token or
|
|
53
|
+
runner symbol) are out of scope.
|
|
54
|
+
- Per-stack renderings other than Bun are owned by their own workspace packages.
|
|
55
|
+
metadata:
|
|
56
|
+
aliases:
|
|
57
|
+
- BUN-TESTER-INTERLOCKING-TRACE-BINDS-ROUTE-001
|
|
58
|
+
severity: 1
|
|
59
|
+
disposition: strict
|
|
60
|
+
introduced_in: 0.1.0
|
|
61
|
+
core_design_refs:
|
|
62
|
+
- afokapu/atdd#1246
|
|
63
|
+
- afokapu/atdd#1248
|
|
64
|
+
- afokapu/atdd#1251
|
|
65
|
+
terms:
|
|
66
|
+
- term_id: runtime_trace
|
|
67
|
+
text: >-
|
|
68
|
+
the trace recorded on the TrainResult of an interlocking execution (core afokapu/atdd#1251); the
|
|
69
|
+
evidence that ties an executed run to the declared route it came from.
|
|
70
|
+
- term_id: required_trace_field
|
|
71
|
+
text: >-
|
|
72
|
+
one of interlockingId, routeId, selectedTrainId, routeCategory, guardId,
|
|
73
|
+
resolutionStrategy, resolutionReason — the fields a trace-binding test must assert so the executed
|
|
74
|
+
route is bound back to its interlocking YAML declaration and resolution outcome.
|
package/conventions/tester.bun/tester.bun.interlocking-train-sequence-is-exercised.convention.yaml
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.interlocking-train-sequence-is-exercised
|
|
3
|
+
kind: rule
|
|
4
|
+
# DRAFT, and the word is load-bearing. The obligation is authored and its validator
|
|
5
|
+
# exists and is tested, but it is realized by `scan_execution()` which the gated
|
|
6
|
+
# `scan_root()` deliberately does not call. Shipping it `active` would claim an
|
|
7
|
+
# enforcement that never runs — a rule that says it checks and does not. It becomes
|
|
8
|
+
# `active` in the same change that wires the check into the gate.
|
|
9
|
+
status: active
|
|
10
|
+
name: Some test exercises the wagon sequence each declared train actually runs
|
|
11
|
+
statement: >-
|
|
12
|
+
Every train reachable from a declared interlocking route MUST have a test that asserts the wagon
|
|
13
|
+
SEQUENCE it executes — the ordered steps, not merely which train was selected. Route resolution
|
|
14
|
+
and trace binding both prove WHICH train was chosen; neither proves WHAT it ran. Without this a
|
|
15
|
+
train definition can be reordered, shortened or emptied and the suite stays green.
|
|
16
|
+
terms:
|
|
17
|
+
- term_id: wagon_sequence
|
|
18
|
+
text: >-
|
|
19
|
+
the ordered `sequence:` of a train definition, and the ordered steps a TrainRunner reports
|
|
20
|
+
having executed. The obligation is that a test compares the two, in order.
|
|
21
|
+
- term_id: selection_is_not_execution
|
|
22
|
+
text: >-
|
|
23
|
+
`route-coverage` proves an admissible route is exercised; `trace-binds-declared-route` proves
|
|
24
|
+
the run is attributable to its declared route. Both are statements about SELECTION. A train
|
|
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
|
+
content:
|
|
40
|
+
summary: >-
|
|
41
|
+
The tester half of `coder.train.runtime-executes-the-declaration (python; the Bun coder half is not yet authored)`. That rule makes the runtime
|
|
42
|
+
READ the plan. This one makes the suite prove it OBEYS it — the two are worth nothing apart.
|
|
43
|
+
normative_text: |
|
|
44
|
+
THE PAIRING IS THE POINT. A runtime that reads the plan but is never tested against it can
|
|
45
|
+
still drift: the plan is edited, the runtime dutifully executes the new sequence, and no test
|
|
46
|
+
notices because none ever asserted what ran. A suite that asserts a sequence against a runtime
|
|
47
|
+
that hardcodes it proves only that the hardcoding is self-consistent. Both halves are needed
|
|
48
|
+
before "the train YAML is the source of truth" is a checkable claim rather than a slogan.
|
|
49
|
+
|
|
50
|
+
Demonstrated rather than argued: on a consumer whose TrainRunner genuinely loads the train
|
|
51
|
+
definition, replacing a train's whole `sequence:` in the plan left its suite green. The
|
|
52
|
+
runtime had changed behaviour completely; the tests were looking somewhere else.
|
|
53
|
+
fix_hint: |
|
|
54
|
+
Assert the executed order against the declaration, in order:
|
|
55
|
+
|
|
56
|
+
def test_standard_train_runs_its_declared_sequence():
|
|
57
|
+
trace = new TrainRunner(res.trainPath).execute(res.trainId, {})
|
|
58
|
+
declared = [s["wagon"] for s in yaml.safe_load(Path(path).read_text())["sequence"]]
|
|
59
|
+
assert trace["steps"] == declared
|
|
60
|
+
|
|
61
|
+
Reading the expected order FROM the plan rather than restating it as literals is what makes
|
|
62
|
+
the test track the declaration instead of a copy of it.
|
|
63
|
+
exceptions:
|
|
64
|
+
- A consumer that declares no interlocking route space carries no obligation.
|
|
65
|
+
- A train reachable by no declared route is out of scope; this rule follows the route space.
|
|
66
|
+
metadata:
|
|
67
|
+
aliases:
|
|
68
|
+
- BUN-TESTER-TRAIN-SEQUENCE-001
|
|
69
|
+
severity: 2
|
|
70
|
+
disposition: advisory
|
|
71
|
+
introduced_in: 0.1.0
|
|
72
|
+
core_design_refs:
|
|
73
|
+
- afokapu/atdd#1248
|
|
74
|
+
- afokapu/atdd#1251
|
|
75
|
+
implementation:
|
|
76
|
+
type: validator
|
|
77
|
+
ref: tester.bun.interlocking-train-sequence-is-exercised
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.red-behavioral-assertion
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: RED tests assert behaviour, not existence
|
|
6
|
+
statement: >-
|
|
7
|
+
A test whose Phase is RED MUST assert behaviour; a case whose assertions are all existence checks
|
|
8
|
+
(`toBeDefined` / `toBeTruthy` / `toBeFalsy` / `toBeNull` / `toBeUndefined`), or which asserts nothing at
|
|
9
|
+
all, is refused. Stack-neutral obligation, Bun-specific detector over `bun:test` matchers. Realized by
|
|
10
|
+
`bun_tester_discipline_detector`.
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: vacuous_assertion
|
|
13
|
+
text: >-
|
|
14
|
+
an existence check — toBeDefined, toBeTruthy, toBeFalsy, toBeNull, toBeUndefined. Passes the
|
|
15
|
+
moment a stub is exported.
|
|
16
|
+
- term_id: behavioural_assertion
|
|
17
|
+
text: >-
|
|
18
|
+
an assertion on what the code DOES, which is the one that must fail before the
|
|
19
|
+
implementation exists.
|
|
20
|
+
content:
|
|
21
|
+
summary: >-
|
|
22
|
+
For each `it()` in a RED-phase file, brace-matches the case body and reports it when it contains no
|
|
23
|
+
`expect(` at all, or when every `expect(` is an existence matcher.
|
|
24
|
+
normative_text: |
|
|
25
|
+
RED's entire job is to fail before the implementation exists. `expect(checkout).toBeDefined()` passes the moment an empty function is exported, so it goes green against a stub — the test was never RED in any meaningful sense, and the acceptance it claims to prove is unproven from that point forward.
|
|
26
|
+
The rule is deliberately narrow: it fires only when EVERY assertion in the case is vacuous. A case that checks existence and then checks behaviour is fine, because the behavioural assertion is the one that must fail.
|
|
27
|
+
fix_hint: |
|
|
28
|
+
Assert the behaviour that does not yet exist:
|
|
29
|
+
|
|
30
|
+
expect(checkout).toBeDefined(); // passes against a stub
|
|
31
|
+
expect(() => checkout({ items: [] })).toThrow("CART_EMPTY"); // must fail first
|
|
32
|
+
exceptions:
|
|
33
|
+
- Only RED-phase files are scanned.
|
|
34
|
+
- A case mixing existence and behavioural assertions is not flagged.
|
|
35
|
+
- Files with no declared phase are skipped — that is `phase-declared`'s finding.
|
|
36
|
+
metadata:
|
|
37
|
+
aliases:
|
|
38
|
+
# Bun realization of the core obligation `tester.red.behavioral-assertion-required`. Core carries no
|
|
39
|
+
# shared alias for it, so the lineage is stated here and in the statement.
|
|
40
|
+
- BUN-RED-BEHAVIORAL-ASSERTION-001
|
|
41
|
+
severity: 3
|
|
42
|
+
# Core's tester nodes are largely `documentation-only`, which core's
|
|
43
|
+
# coverage_report treats as never-fails-the-build. That is right for retrofitting
|
|
44
|
+
# and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
|
|
45
|
+
# that will not be adopted. Gating dispositions here; a repo adopting on an
|
|
46
|
+
# existing suite records a ratchet baseline instead.
|
|
47
|
+
disposition: strict
|
|
48
|
+
introduced_in: 0.1.0
|
|
49
|
+
implementation:
|
|
50
|
+
type: validator
|
|
51
|
+
ref: bun_tester_discipline_detector
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.red-fails-first
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: RED tests carry a guaranteed-fail marker
|
|
6
|
+
statement: >-
|
|
7
|
+
A test whose Phase is RED MUST contain at least one guaranteed-fail marker. Accepted markers,
|
|
8
|
+
transcribed from CORE `red.convention.yaml` -> `red_patterns.typescript`: `throw new Error('Not
|
|
9
|
+
implemented …')`, `throw new UnimplementedError(…)`, `expect(false).toBe(true)`,
|
|
10
|
+
`expect(true).toBe(false)`, `expect.fail(…)`, `return Promise.reject(…)`, and `it.fails(` /
|
|
11
|
+
`test.failing(`. Bun realization of core `tester.red.test-must-fail-first`, mirroring
|
|
12
|
+
`tester.convex.red-fails-first` rule for rule.
|
|
13
|
+
terms:
|
|
14
|
+
- term_id: red_marker
|
|
15
|
+
text: >-
|
|
16
|
+
a guaranteed-fail construct: throw new Error('Not implemented…'), expect.fail(…),
|
|
17
|
+
expect(false).toBe(true), return Promise.reject(…), it.fails( / test.failing(.
|
|
18
|
+
- term_id: structural_proxy
|
|
19
|
+
text: >-
|
|
20
|
+
what this rule checks. Whether a test ACTUALLY fails first is a runtime property; core
|
|
21
|
+
supplies the decidable stand-in.
|
|
22
|
+
content:
|
|
23
|
+
summary: >-
|
|
24
|
+
Flags any `Phase: RED` file containing none of the core TypeScript RED markers. `test.failing(` is
|
|
25
|
+
bun:test's spelling of vitest's `it.fails(` and is accepted identically.
|
|
26
|
+
normative_text: |
|
|
27
|
+
Whether a test ACTUALLY fails first is a RUNTIME property no static detector can observe. Core supplies the decidable STRUCTURAL proxy — a guaranteed-fail marker must be present — and that proxy is exactly what a per-stack detector can check. The obligation is agnostic; only the marker syntax is stack-specific.
|
|
28
|
+
This rule and `red-behavioral-assertion` are complementary, not redundant. That one asks whether the assertions are about behaviour; this one asks whether anything guarantees the test is red at all.
|
|
29
|
+
fix_hint: |
|
|
30
|
+
Add a marker that cannot pass until the implementation exists:
|
|
31
|
+
|
|
32
|
+
expect.fail("checkout rejection not implemented yet");
|
|
33
|
+
// or
|
|
34
|
+
throw new Error("Not implemented: checkout rejection");
|
|
35
|
+
|
|
36
|
+
Remove it in GREEN, when the behavioural assertion carries the test on its own.
|
|
37
|
+
exceptions:
|
|
38
|
+
- Only RED-phase files are scanned.
|
|
39
|
+
- "`it.fails` / `test.failing` are markers, NOT self-skips — `no-self-skip` deliberately does not flag them."
|
|
40
|
+
- Files with no declared phase are skipped; that is `phase-declared`'s finding.
|
|
41
|
+
metadata:
|
|
42
|
+
aliases:
|
|
43
|
+
# Mirrored rule-for-rule from convex.extension.tester.base :: tester.convex.red-fails-first
|
|
44
|
+
# Core obligation: tester.red.test-must-fail-first
|
|
45
|
+
- TESTER-RED-FAILS-FIRST-001
|
|
46
|
+
- BUN-RED-FAILS-FIRST-001
|
|
47
|
+
severity: 3
|
|
48
|
+
disposition: strict
|
|
49
|
+
introduced_in: 0.1.0
|
|
50
|
+
implementation:
|
|
51
|
+
type: validator
|
|
52
|
+
ref: bun_tester_discipline_detector
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.routing-runtime-family
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: A test's declared runtime is in the JS/TS family
|
|
6
|
+
statement: >-
|
|
7
|
+
A test file that declares a `// Runtime:` MUST name a runtime in the JS/TS family (`bun`, `browser`,
|
|
8
|
+
`isomorphic`, `typescript`, `ts`, `node`, `js`, `javascript`, `deno`, `vite`, `astro`, `preact`). Bun
|
|
9
|
+
realization mirroring `tester.convex.routing-path`, which makes the same argument for Vitest.
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: declared_runtime
|
|
12
|
+
text: >-
|
|
13
|
+
the optional `// Runtime:` field on a test.
|
|
14
|
+
- term_id: js_family
|
|
15
|
+
text: >-
|
|
16
|
+
bun, browser, isomorphic, typescript, ts, node, js, javascript, deno, vite, astro, preact —
|
|
17
|
+
the runtimes `bun test` actually executes under.
|
|
18
|
+
content:
|
|
19
|
+
summary: >-
|
|
20
|
+
Flags a declared `Runtime:` outside the JS/TS family. Declaring a runtime is optional.
|
|
21
|
+
normative_text: |
|
|
22
|
+
A test file in this stack is collected and executed by `bun test` — a JS/TS runtime — whatever its header claims. A test declaring `python` is either mislabelled or filed in the wrong suite, and either way the gate attributes it to a runner that never executed it.
|
|
23
|
+
The rule judges only files that DECLARE a runtime, because for a test the field is optional: the suite's runner is already known from the provider.
|
|
24
|
+
fix_hint: |
|
|
25
|
+
Declare the runtime the suite actually executes under, or drop the field:
|
|
26
|
+
|
|
27
|
+
// Runtime: bun
|
|
28
|
+
exceptions:
|
|
29
|
+
- A test with no `Runtime:` field is not flagged — the field is optional for tests.
|
|
30
|
+
- The vocabulary is the JS/TS family, deliberately wider than the source-side `bun|browser|isomorphic`.
|
|
31
|
+
metadata:
|
|
32
|
+
aliases:
|
|
33
|
+
# Mirrored rule-for-rule from convex.extension.tester.base :: tester.convex.routing-path
|
|
34
|
+
# Core obligation: tester.routing.layer-keyword-taxonomy
|
|
35
|
+
- BUN-ROUTING-RUNTIME-FAMILY-001
|
|
36
|
+
severity: 2
|
|
37
|
+
disposition: suppress-and-clean
|
|
38
|
+
introduced_in: 0.1.0
|
|
39
|
+
implementation:
|
|
40
|
+
type: validator
|
|
41
|
+
ref: bun_tester_discipline_detector
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.security-auth
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Security tests assert on denial
|
|
6
|
+
statement: >-
|
|
7
|
+
A test identified as a security test by its URN kind segment (`-SEC-`, `-RLS-`, `-AUTH-`) MUST contain
|
|
8
|
+
an authentication/authorisation assertion — an expectation tied to 401, 403, unauthorised, forbidden,
|
|
9
|
+
denied, permission, `.rejects` or `toThrow`. Bun realization of core `tester.security.auth`, mirroring
|
|
10
|
+
`tester.convex.security-auth`.
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: security_test
|
|
13
|
+
text: >-
|
|
14
|
+
a test whose URN carries a SEC, RLS or AUTH kind segment.
|
|
15
|
+
- term_id: denial_assertion
|
|
16
|
+
text: >-
|
|
17
|
+
an expectation tied to 401, 403, unauthorised, forbidden, denied, permission, .rejects or
|
|
18
|
+
toThrow. Its absence makes the test a silent green gap.
|
|
19
|
+
content:
|
|
20
|
+
summary: >-
|
|
21
|
+
Identifies security tests from the URN and flags those whose body contains no denial assertion.
|
|
22
|
+
normative_text: |
|
|
23
|
+
A security test that only walks the happy path is a SILENT GREEN GAP — the worst shape a test can have. It passes CI, the gate counts it as covering the security acceptance, and it proves nothing about the denial path, which is the only path the acceptance is actually about.
|
|
24
|
+
Identification is by URN kind segment rather than filename, consistent with the rest of this package: the header is authoritative.
|
|
25
|
+
fix_hint: |
|
|
26
|
+
Assert the refusal, not the permission:
|
|
27
|
+
|
|
28
|
+
const res = await fetch("/orders", { method: "POST" }); // anonymous
|
|
29
|
+
expect(res.status).toBe(403);
|
|
30
|
+
|
|
31
|
+
A happy-path case is welcome too — but it cannot be the only one.
|
|
32
|
+
exceptions:
|
|
33
|
+
- Only tests whose URN carries a SEC / RLS / AUTH kind segment are scanned.
|
|
34
|
+
- Any of the listed denial signals satisfies the rule.
|
|
35
|
+
metadata:
|
|
36
|
+
aliases:
|
|
37
|
+
# Mirrored rule-for-rule from convex.extension.tester.base :: tester.convex.security-auth
|
|
38
|
+
# Core obligation: tester.security.auth
|
|
39
|
+
- TESTER-SECURITY-AUTH-001
|
|
40
|
+
- BUN-SECURITY-AUTH-001
|
|
41
|
+
severity: 4
|
|
42
|
+
disposition: strict
|
|
43
|
+
introduced_in: 0.1.0
|
|
44
|
+
implementation:
|
|
45
|
+
type: validator
|
|
46
|
+
ref: bun_tester_discipline_detector
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.security-input
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Input-validation tests assert on rejection
|
|
6
|
+
statement: >-
|
|
7
|
+
A test identified as an input-validation test by its URN kind segment (`-INPUT-`, `-VALIDATION-`,
|
|
8
|
+
`-VALIDATE-`) MUST contain a rejection assertion — `.rejects`, `toThrow`, 400, 422, invalid, reject, or
|
|
9
|
+
an error expectation. Bun realization of core `tester.security.input`, mirroring
|
|
10
|
+
`tester.convex.security-input`.
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: input_validation_test
|
|
13
|
+
text: >-
|
|
14
|
+
a test whose URN carries an INPUT, VALIDATION or VALIDATE kind segment.
|
|
15
|
+
- term_id: rejection_assertion
|
|
16
|
+
text: >-
|
|
17
|
+
an expectation on refusal — .rejects, toThrow, 400, 422, invalid. A well-formed payload
|
|
18
|
+
proves nothing about adversarial input.
|
|
19
|
+
content:
|
|
20
|
+
summary: >-
|
|
21
|
+
Identifies input-validation tests from the URN and flags those with no rejection assertion.
|
|
22
|
+
normative_text: |
|
|
23
|
+
A test that submits a well-formed payload and checks it succeeds proves the parser works on good input. The obligation an input-validation acceptance carries is about BAD input — malformed, missing, adversarial — and that is precisely what a happy-path test does not touch.
|
|
24
|
+
Same silent-green-gap shape as `security-auth`, and it is grouped with the security family for the same reason: unvalidated input is the entry point for most of what the security rules defend against.
|
|
25
|
+
fix_hint: |
|
|
26
|
+
Assert the rejection:
|
|
27
|
+
|
|
28
|
+
expect(() => parseOrder({ sku: null })).toThrow("INVALID_SKU");
|
|
29
|
+
// or over HTTP
|
|
30
|
+
expect(res.status).toBe(422);
|
|
31
|
+
exceptions:
|
|
32
|
+
- Only tests whose URN carries an INPUT / VALIDATION / VALIDATE kind segment are scanned.
|
|
33
|
+
- Any of the listed rejection signals satisfies the rule.
|
|
34
|
+
metadata:
|
|
35
|
+
aliases:
|
|
36
|
+
# Mirrored rule-for-rule from convex.extension.tester.base :: tester.convex.security-input
|
|
37
|
+
# Core obligation: tester.security.input
|
|
38
|
+
- TESTER-SECURITY-INPUT-001
|
|
39
|
+
- BUN-SECURITY-INPUT-001
|
|
40
|
+
severity: 4
|
|
41
|
+
disposition: strict
|
|
42
|
+
introduced_in: 0.1.0
|
|
43
|
+
implementation:
|
|
44
|
+
type: validator
|
|
45
|
+
ref: bun_tester_discipline_detector
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.smoke-no-collaborator-substitution
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: SMOKE tests do not substitute production collaborators
|
|
6
|
+
statement: >-
|
|
7
|
+
A test whose Phase is SMOKE MUST NOT substitute a production collaborator — `mock.module`, `spyOn`,
|
|
8
|
+
`jest.mock`/`spyOn`, `vi.mock`/`spyOn`. Stack-neutral obligation, Bun-specific substitution vocabulary
|
|
9
|
+
(`bun:test` exposes `mock` and `spyOn` where pytest uses `monkeypatch`). Realized by
|
|
10
|
+
`bun_tester_discipline_detector`.
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: substitution
|
|
13
|
+
text: >-
|
|
14
|
+
mock.module, spyOn, jest.mock/spyOn, vi.mock/spyOn — replacing a production collaborator.
|
|
15
|
+
- term_id: false_evidence
|
|
16
|
+
text: >-
|
|
17
|
+
what a substituted SMOKE test gives the gate: credit that the real path works, when the real
|
|
18
|
+
path is precisely what was replaced.
|
|
19
|
+
content:
|
|
20
|
+
summary: >-
|
|
21
|
+
Flags any substitution call in a SMOKE-phase file, reporting the exact line.
|
|
22
|
+
normative_text: |
|
|
23
|
+
Substituting a collaborator turns a SMOKE test into a unit test wearing a SMOKE label. The damage is not that the test is bad — it may be an excellent unit test — but that the gate counts it as evidence the real path works, when the real path is precisely the part that was replaced.
|
|
24
|
+
This is the failure that makes a green suite compatible with a broken deployment, which is the specific outcome ATDD's phase separation exists to prevent.
|
|
25
|
+
fix_hint: |
|
|
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
|
+
exceptions:
|
|
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
|
+
metadata:
|
|
31
|
+
aliases:
|
|
32
|
+
# Bun realization of the core obligation `tester.smoke.no-collaborator-substitution`. Core carries no
|
|
33
|
+
# shared alias for it, so the lineage is stated here and in the statement.
|
|
34
|
+
- BUN-SMOKE-NO-COLLABORATOR-SUBSTITUTION-001
|
|
35
|
+
severity: 4
|
|
36
|
+
# Core's tester nodes are largely `documentation-only`, which core's
|
|
37
|
+
# coverage_report treats as never-fails-the-build. That is right for retrofitting
|
|
38
|
+
# and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
|
|
39
|
+
# that will not be adopted. Gating dispositions here; a repo adopting on an
|
|
40
|
+
# existing suite records a ratchet baseline instead.
|
|
41
|
+
disposition: suppress-and-clean
|
|
42
|
+
introduced_in: 0.1.0
|
|
43
|
+
implementation:
|
|
44
|
+
type: validator
|
|
45
|
+
ref: bun_tester_discipline_detector
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.smoke-observable-assertion
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: SMOKE tests assert on operator-observable output
|
|
6
|
+
statement: >-
|
|
7
|
+
A test whose Phase is SMOKE MUST assert on an operator-observable channel — HTTP response status or
|
|
8
|
+
body, rendered markup, stdout/stderr, exit code — and not only on objects the test constructed itself.
|
|
9
|
+
Stack-neutral obligation, Bun/htmx-specific channel vocabulary. Realized by
|
|
10
|
+
`bun_tester_discipline_detector`.
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: observable_channel
|
|
13
|
+
text: >-
|
|
14
|
+
an HTTP response status or body, rendered markup, stdout/stderr, an exit code, or persisted
|
|
15
|
+
state.
|
|
16
|
+
- term_id: self_constructed_object
|
|
17
|
+
text: >-
|
|
18
|
+
a value the test built itself. Asserting on it proves the constructor works, which is a unit
|
|
19
|
+
test's job under a SMOKE label.
|
|
20
|
+
content:
|
|
21
|
+
summary: >-
|
|
22
|
+
Reports a SMOKE case that makes assertions but touches none of the observable channels.
|
|
23
|
+
normative_text: |
|
|
24
|
+
A SMOKE test exists to prove the system does something a person could witness. A case that builds an object and asserts on its fields has proven that the constructor works — which is a unit test's job — while carrying the label that tells the gate real behaviour was exercised.
|
|
25
|
+
The observable vocabulary is stack-specific and that is the whole reason this rule is re-realized rather than shared: for this stack the canonical observation is an HTTP response and the markup inside it, because that markup is what htmx puts in front of the user.
|
|
26
|
+
fix_hint: |
|
|
27
|
+
Assert what an operator would see:
|
|
28
|
+
|
|
29
|
+
const order = buildOrder({ sku: "x" });
|
|
30
|
+
expect(order.sku).toBe("x"); // internal
|
|
31
|
+
|
|
32
|
+
const res = await fetch("/orders");
|
|
33
|
+
expect(res.status).toBe(200);
|
|
34
|
+
expect(await res.text()).toContain("order-1"); // observable
|
|
35
|
+
exceptions:
|
|
36
|
+
- Only SMOKE-phase files are scanned.
|
|
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
|
+
metadata:
|
|
40
|
+
aliases:
|
|
41
|
+
# Bun realization of the core obligation `tester.smoke.operator-observable-assertion`. Core carries no
|
|
42
|
+
# shared alias for it, so the lineage is stated here and in the statement.
|
|
43
|
+
- BUN-SMOKE-OBSERVABLE-ASSERTION-001
|
|
44
|
+
severity: 3
|
|
45
|
+
# Core's tester nodes are largely `documentation-only`, which core's
|
|
46
|
+
# coverage_report treats as never-fails-the-build. That is right for retrofitting
|
|
47
|
+
# and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
|
|
48
|
+
# that will not be adopted. Gating dispositions here; a repo adopting on an
|
|
49
|
+
# existing suite records a ratchet baseline instead.
|
|
50
|
+
disposition: suppress-and-clean
|
|
51
|
+
introduced_in: 0.1.0
|
|
52
|
+
implementation:
|
|
53
|
+
type: validator
|
|
54
|
+
ref: bun_tester_discipline_detector
|