@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,65 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: planner.docs.doc-id-unique
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: doc-id is unique across the corpus
|
|
6
|
+
statement: >-
|
|
7
|
+
No two authored documents beneath `docs/` may declare the same `:doc-id:`. Uniqueness is what makes
|
|
8
|
+
`doc-id` an identity rather than a label, and it is the precondition for resolving any relationship
|
|
9
|
+
edge to exactly one target (spec 2 §5.1).
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: corpus
|
|
12
|
+
text: >-
|
|
13
|
+
every authored `.adoc` beneath `docs/`, across all areas, excluding `docs/dist/`. Uniqueness is
|
|
14
|
+
global — `archive/` is part of the corpus, not a separate id space.
|
|
15
|
+
- term_id: disposition_rationale
|
|
16
|
+
text: >-
|
|
17
|
+
advisory while the consuming corpus is brought into compatibility. The measurement below was
|
|
18
|
+
TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
|
|
19
|
+
already stale, so the date lives in the key and the command is recorded beside the result.
|
|
20
|
+
Re-take it at the escalation checkpoint; never escalate on the number here.
|
|
21
|
+
values:
|
|
22
|
+
measured_2026_09_06: '0 .adoc files, therefore 0 declared ids and 0 collisions. Not evidence of health: the corpus does not exist yet. Re-measure after migration, which is exactly when collisions appear.'
|
|
23
|
+
measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
|
|
24
|
+
measurement_command: 'find . -name ''*.adoc'' -not -path ''./.git/*'' | wc -l'
|
|
25
|
+
escalate_when: 'The corpus has been migrated and a full scan reports zero duplicate ids — the scale test spec 2 §1 names, since 89 documents is the first corpus large enough to collide.'
|
|
26
|
+
content:
|
|
27
|
+
summary: >-
|
|
28
|
+
A duplicated id makes edge resolution ambiguous: `:supersedes: architecture.foo` cannot say which
|
|
29
|
+
`architecture.foo` it means. The detector reports EVERY file carrying a duplicated id, not just
|
|
30
|
+
the second one, because there is no principled basis for calling one of them the original.
|
|
31
|
+
normative_text: |
|
|
32
|
+
Archived documents share the id space with current ones ON PURPOSE. The tempting alternative —
|
|
33
|
+
letting `archive/` re-use an id held by a current document — would make `:supersedes:` unusable
|
|
34
|
+
in precisely the case it exists for, since the superseding and superseded documents would then
|
|
35
|
+
be indistinguishable to the resolver.
|
|
36
|
+
|
|
37
|
+
When a document is archived and a new one takes its place, the two need DIFFERENT ids and a
|
|
38
|
+
`:supersedes:` edge between them. That is the shape spec 2 §5.2 calls load-bearing for #1782.
|
|
39
|
+
fix_hint: |
|
|
40
|
+
Give the archived document a distinct id and link the succession explicitly:
|
|
41
|
+
|
|
42
|
+
docs/architecture/shared-control-root.adoc
|
|
43
|
+
:doc-id: architecture.shared-control-root
|
|
44
|
+
:status: current
|
|
45
|
+
:supersedes: archive.2025-control-root
|
|
46
|
+
|
|
47
|
+
docs/archive/2025-control-root.adoc
|
|
48
|
+
:doc-id: archive.2025-control-root
|
|
49
|
+
:status: superseded
|
|
50
|
+
|
|
51
|
+
Do not resolve a duplicate by deleting one of the documents. Preserving history is the point
|
|
52
|
+
(spec 2 §2, *Out of scope*).
|
|
53
|
+
exceptions:
|
|
54
|
+
- Generated output beneath `docs/dist/` is never scanned.
|
|
55
|
+
- A document with no `doc-id` is reported by `planner.docs.identity-required`, not here; this rule
|
|
56
|
+
only compares ids that were actually declared.
|
|
57
|
+
metadata:
|
|
58
|
+
aliases:
|
|
59
|
+
- DOCS-IDENTITY-002
|
|
60
|
+
severity: 2
|
|
61
|
+
disposition: advisory
|
|
62
|
+
introduced_in: 0.1.0
|
|
63
|
+
implementation:
|
|
64
|
+
type: validator
|
|
65
|
+
ref: docs_capability
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: planner.docs.graph-target-resolves
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Every relationship target resolves against a declared doc-id, and no node is ever fabricated
|
|
6
|
+
statement: >-
|
|
7
|
+
Every relationship attribute on an authored document (`:decides:`, `:supersedes:`, `:implements:`,
|
|
8
|
+
`:depends-on:`) MUST name a `doc-id` that some document in the corpus actually declares. A target
|
|
9
|
+
outside that set is a REPORTED finding. It is NEVER synthesized into a node, and never silently
|
|
10
|
+
dropped. This is the one hard requirement of spec 2 §5.4 and the flagship rule of this extension.
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: declared_id_set
|
|
13
|
+
text: >-
|
|
14
|
+
the set of `:doc-id:` values read from the authored corpus, built BEFORE any edge is resolved.
|
|
15
|
+
It is closed and enumerable — which is precisely why the documentation graph can hold a
|
|
16
|
+
discipline the traceability graph does not.
|
|
17
|
+
- term_id: relationship_attribute
|
|
18
|
+
text: >-
|
|
19
|
+
one of the four confirmed verbs of spec 2 §5.2 — `decides`, `supersedes`, `implements`,
|
|
20
|
+
`depends-on`. `refines` is deliberately NOT shipped (spec 2 §9 Decision 3).
|
|
21
|
+
- term_id: fabrication
|
|
22
|
+
text: >-
|
|
23
|
+
creating a graph node for a target no document declares, so that an edge appears to resolve. The
|
|
24
|
+
defect this rule exists to make impossible.
|
|
25
|
+
- term_id: disposition_rationale
|
|
26
|
+
text: >-
|
|
27
|
+
advisory while the consuming corpus is brought into compatibility. The measurement below was
|
|
28
|
+
TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
|
|
29
|
+
already stale, so the date lives in the key and the command is recorded beside the result.
|
|
30
|
+
Re-take it at the escalation checkpoint; never escalate on the number here.
|
|
31
|
+
values:
|
|
32
|
+
measured_2026_09_06: '0 .adoc files, so 0 authored edges and 0 unresolved targets. The number that motivates this rule is the OTHER graph''s, quoted in full under normative_text and measured on the same date: 147 of 168 containment edges invented, 44 fabricated nodes out of 3208.'
|
|
33
|
+
measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
|
|
34
|
+
measurement_command: 'find . -name ''*.adoc'' -not -path ''./.git/*'' | wc -l'
|
|
35
|
+
escalate_when: 'A full corpus scan reports zero unresolved relationship targets. The no-fabrication half is NOT subject to escalation — it is a property of the resolver, true from the first commit, and is asserted by the #1758 regression test rather than deferred to a disposition flip.'
|
|
36
|
+
content:
|
|
37
|
+
summary: >-
|
|
38
|
+
Resolve or report — never invent. The graph is DERIVED from the `.adoc` attributes and rebuilt on
|
|
39
|
+
demand (spec 2 §5.3); a persisted graph would be a second registry, and a second registry drifts.
|
|
40
|
+
The resolver builds the declared-id set first, then admits an edge only if its target is in that
|
|
41
|
+
set, and reports every edge that is not.
|
|
42
|
+
normative_text: |
|
|
43
|
+
This is not a stylistic preference. It is a defect that has ALREADY HAPPENED in this
|
|
44
|
+
repository's other graph, and the reason spec 2 §5.4 states it as non-negotiable.
|
|
45
|
+
|
|
46
|
+
Reproduced live on the ATDD working tree, 2026-09-06 (#1758):
|
|
47
|
+
|
|
48
|
+
total nodes : 3208
|
|
49
|
+
fabricated nodes : 44 (feature 28 · wagon 6 · train 6 · test 4)
|
|
50
|
+
feature -> component CONTAINS (urn-structure): 168
|
|
51
|
+
parent DECLARED : 21 ( 12.5% )
|
|
52
|
+
parent INVENTED : 147 ( 87.5% )
|
|
53
|
+
|
|
54
|
+
147 of 168 containment edges point at features no file declares, hanging off 28 invented nodes.
|
|
55
|
+
The mechanism is four lines in `src/atdd/coach/utils/graph/graph_builder.py:215` — `_ensure_node`
|
|
56
|
+
synthesizes a bare node for any URN the graph has not seen, `add_edge` calls it on BOTH endpoints
|
|
57
|
+
of every edge, and so any edge naming a non-existent target conjures the target into being.
|
|
58
|
+
|
|
59
|
+
WHY FABRICATION IS WORSE THAN ABSENCE. An absent parent leaves a node orphaned, and an orphan
|
|
60
|
+
check catches it. A fabricated parent makes the node look CONNECTED. Fabrication defeats the
|
|
61
|
+
check more thoroughly than absence does — which is why the test for this rule asserts the NODE
|
|
62
|
+
COUNT directly and not merely the finding.
|
|
63
|
+
|
|
64
|
+
Do NOT reuse `graph_builder.py`. It is the substrate that lacks this discipline. The resolver
|
|
65
|
+
lives in this extension, and there is exactly ONE of it (spec 2 §5.4, citing #1755 on the seven
|
|
66
|
+
reimplementations of lifecycle resolution).
|
|
67
|
+
fix_hint: |
|
|
68
|
+
Either declare the target, or fix the reference:
|
|
69
|
+
|
|
70
|
+
:implements: purpose.wortrees # ✗ typo; nothing declares this id — REPORTED
|
|
71
|
+
:implements: purpose.worktrees # ✓ resolves against a declared doc-id
|
|
72
|
+
|
|
73
|
+
When the target genuinely does not exist yet, the reference is premature. Author the target
|
|
74
|
+
document first. An edge to a document you intend to write is indistinguishable, to every reader
|
|
75
|
+
and every tool, from an edge to a document that was deleted.
|
|
76
|
+
exceptions:
|
|
77
|
+
- An attribute that is absent is not an unresolved edge. Only declared relationships are resolved.
|
|
78
|
+
- Nothing is exempt from the no-fabrication half. There is no configuration that permits synthesis.
|
|
79
|
+
metadata:
|
|
80
|
+
aliases:
|
|
81
|
+
- DOCS-GRAPH-001
|
|
82
|
+
severity: 1
|
|
83
|
+
disposition: advisory
|
|
84
|
+
introduced_in: 0.1.0
|
|
85
|
+
implementation:
|
|
86
|
+
type: validator
|
|
87
|
+
ref: docs_capability
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: planner.docs.identity-required
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Every authored document declares a doc-id and a status
|
|
6
|
+
statement: >-
|
|
7
|
+
An authored `.adoc` beneath `docs/` MUST declare both a `:doc-id:` and a `:status:` attribute with
|
|
8
|
+
non-empty values. `doc-id` is the document's node identity in the relationship graph (spec 2 §5.1);
|
|
9
|
+
`status` is what makes the current-versus-historical boundary readable at all.
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: doc_id
|
|
12
|
+
text: >-
|
|
13
|
+
the value of the `:doc-id:` AsciiDoc attribute — a dotted identifier such as
|
|
14
|
+
`architecture.shared-control-root`. It is the ONLY node identity the documentation graph uses;
|
|
15
|
+
paths are never node identities.
|
|
16
|
+
- term_id: status
|
|
17
|
+
text: >-
|
|
18
|
+
the value of the `:status:` attribute — `current`, `superseded`, or `historical`. It answers "is
|
|
19
|
+
this accepted truth today?" and is the flag issue #1782 exists to introduce.
|
|
20
|
+
- term_id: disposition_rationale
|
|
21
|
+
text: >-
|
|
22
|
+
advisory while the consuming corpus is brought into compatibility. The measurement below was
|
|
23
|
+
TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
|
|
24
|
+
already stale, so the date lives in the key and the command is recorded beside the result.
|
|
25
|
+
Re-take it at the escalation checkpoint; never escalate on the number here.
|
|
26
|
+
values:
|
|
27
|
+
measured_2026_09_06: '0 .adoc files exist, so 0 documents declare a doc-id and the rule currently has an empty corpus to check. It ships advisory because it will fire on every file the moment conversion begins and before the attributes are backfilled.'
|
|
28
|
+
measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
|
|
29
|
+
measurement_command: 'find . -name ''*.adoc'' -not -path ''./.git/*'' | wc -l'
|
|
30
|
+
escalate_when: 'Every authored `.adoc` beneath `docs/` declares both attributes — reachable only after the migration lands, since the attribute is authored during conversion.'
|
|
31
|
+
content:
|
|
32
|
+
summary: >-
|
|
33
|
+
Identity and currency, declared in the document itself. Without `doc-id` there is no graph:
|
|
34
|
+
`planner.docs.graph-target-resolves` resolves every edge against the set of DECLARED ids, and a
|
|
35
|
+
document that declares none can neither be pointed at nor be found missing.
|
|
36
|
+
normative_text: |
|
|
37
|
+
`status:` alone is deliberately NOT sufficient to make archive/ honest, and this node should not
|
|
38
|
+
be read as claiming otherwise. Spec 2 §5.2 is explicit: a status attribute says *this is
|
|
39
|
+
superseded*; it cannot say *by what*. The `supersedes` edge carries that, and it is validated by
|
|
40
|
+
planner.docs.graph-target-resolves. This rule establishes the identity that edge needs; it does
|
|
41
|
+
not by itself discharge #1782.
|
|
42
|
+
|
|
43
|
+
Both attributes are required TOGETHER because a document with an id and no status is a node
|
|
44
|
+
whose currency is unknown, and a document with a status and no id is a claim nothing can
|
|
45
|
+
reference. Each half is useless alone.
|
|
46
|
+
fix_hint: |
|
|
47
|
+
Declare both in the document header, above the first section:
|
|
48
|
+
|
|
49
|
+
= Shared Control Root
|
|
50
|
+
:doc-id: architecture.shared-control-root
|
|
51
|
+
:status: current
|
|
52
|
+
|
|
53
|
+
Choose the id from the area the document lives in (`architecture.`, `purpose.`, `delivery.`,
|
|
54
|
+
`archive.`) so that the id and the tree agree. Nothing enforces that agreement today; it is a
|
|
55
|
+
convention that keeps ids readable, not a checked rule.
|
|
56
|
+
exceptions:
|
|
57
|
+
- Generated output beneath `docs/dist/` is never scanned.
|
|
58
|
+
- A file with no AsciiDoc header at all is still a violation, not a skip. Silence about a document
|
|
59
|
+
that declares nothing is the failure mode this extension exists to refuse.
|
|
60
|
+
metadata:
|
|
61
|
+
aliases:
|
|
62
|
+
- DOCS-IDENTITY-001
|
|
63
|
+
severity: 2
|
|
64
|
+
disposition: advisory
|
|
65
|
+
introduced_in: 0.1.0
|
|
66
|
+
implementation:
|
|
67
|
+
type: validator
|
|
68
|
+
ref: docs_capability
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: planner.docs.reference-integrity
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: The site builds deterministically and every internal reference resolves
|
|
6
|
+
statement: >-
|
|
7
|
+
The corpus MUST render with asciidoctor, and every internal cross-reference MUST resolve. A build
|
|
8
|
+
failure or an unresolvable internal reference is a FAIL. An ABSENT toolchain, or a build failure
|
|
9
|
+
the capability cannot attribute to a specific document, is `COULD_NOT_CHECK` — never `PASS`, and
|
|
10
|
+
never `FAIL` (spec 2 §3, *What the capability owes core*, and §7).
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: internal_reference
|
|
13
|
+
text: >-
|
|
14
|
+
a cross-reference from one document in the corpus to another (`xref:`, `<<anchor>>`). External
|
|
15
|
+
links are out of scope; their liveness is a network property, not a corpus property.
|
|
16
|
+
- term_id: unattributable_failure
|
|
17
|
+
text: >-
|
|
18
|
+
a render failure the capability cannot pin to a document — a crashed renderer, an unreadable
|
|
19
|
+
tree, a toolchain that is not installed. It is reported as `COULD_NOT_CHECK`, which BLOCKS.
|
|
20
|
+
- term_id: disposition_rationale
|
|
21
|
+
text: >-
|
|
22
|
+
advisory while the consuming corpus is brought into compatibility. The measurement below was
|
|
23
|
+
TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
|
|
24
|
+
already stale, so the date lives in the key and the command is recorded beside the result.
|
|
25
|
+
Re-take it at the escalation checkpoint; never escalate on the number here.
|
|
26
|
+
values:
|
|
27
|
+
measured_2026_09_06: 'ABSENT — `command -v asciidoctor` exits 1 on this machine. The capability therefore returns COULD_NOT_CHECK here today, which BLOCKS, and that is the specified behaviour rather than a defect. Re-take this probe in the CI image before escalating; asciidoctor absence on a developer machine is expected and is not a reason to weaken the rule.'
|
|
28
|
+
measurement_target: 'this machine (the extension''s own toolchain probe)'
|
|
29
|
+
measurement_command: 'command -v asciidoctor'
|
|
30
|
+
escalate_when: 'asciidoctor is available in CI and a full render of the migrated corpus completes with zero unresolvable internal references. Note that the COULD_NOT_CHECK path already BLOCKS at the capability seam regardless of this disposition — advisory governs the reported findings, not the capability''s verdict contract.'
|
|
31
|
+
content:
|
|
32
|
+
summary: >-
|
|
33
|
+
Reference integrity is why asciidoctor (Ruby) is the reference implementation rather than a pure
|
|
34
|
+
Python renderer: unresolvable internal references must be VALIDATION FAILURES, and the Python
|
|
35
|
+
options detect them weakly. A Ruby runtime in CI is the cost, accepted deliberately (spec 2 §9
|
|
36
|
+
Decision 4).
|
|
37
|
+
normative_text: |
|
|
38
|
+
THE VERDICT DISTINCTION IS THE POINT OF THIS RULE, and it is the thing most likely to be got
|
|
39
|
+
wrong. *There is no obligation here* (`NOT_APPLICABLE`, permits) and *I could not see whether the
|
|
40
|
+
obligation was met* (`COULD_NOT_CHECK`, blocks) must never collapse into one another.
|
|
41
|
+
|
|
42
|
+
This repository has that bug in at least three places, which is why spec 2 §3 states it so
|
|
43
|
+
emphatically: #1745, where `coach.pr.merge-blocks-on-pre-smoke-close` degrades to advisory on a
|
|
44
|
+
lookup failure and REPORTS IT AS A PASS; #1774, where *no mirror found* is read as *nothing to
|
|
45
|
+
lose* and 15 nodes are invisible to the succession guard; #1716, where checks pass when they
|
|
46
|
+
cannot observe and C011 compares the store against itself.
|
|
47
|
+
|
|
48
|
+
An unresolvable lookup must remain DATA — a named, reportable state that reaches the report,
|
|
49
|
+
never an empty clean result. A missing asciidoctor is not a clean corpus. It is an unexamined one.
|
|
50
|
+
fix_hint: |
|
|
51
|
+
For a reported reference, fix the target or the reference:
|
|
52
|
+
|
|
53
|
+
xref:architecture/shared-control-rooot.adoc[] # ✗ unresolvable — FAIL
|
|
54
|
+
xref:architecture/shared-control-root.adoc[] # ✓ resolves
|
|
55
|
+
|
|
56
|
+
For `COULD_NOT_CHECK`, install the toolchain rather than suppressing the verdict:
|
|
57
|
+
|
|
58
|
+
gem install asciidoctor
|
|
59
|
+
|
|
60
|
+
Do not "fix" a COULD_NOT_CHECK by making the capability return PASS when the renderer is absent.
|
|
61
|
+
That is the #1745 defect, re-committed.
|
|
62
|
+
exceptions:
|
|
63
|
+
- External links are not resolved. Their liveness is a network property and checking it would make
|
|
64
|
+
the gate non-deterministic.
|
|
65
|
+
- '`docs/dist/**` is the render OUTPUT and is never an input to the render.'
|
|
66
|
+
metadata:
|
|
67
|
+
aliases:
|
|
68
|
+
- DOCS-RENDER-001
|
|
69
|
+
severity: 1
|
|
70
|
+
disposition: advisory
|
|
71
|
+
introduced_in: 0.1.0
|
|
72
|
+
implementation:
|
|
73
|
+
type: validator
|
|
74
|
+
ref: docs_capability
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: planner.docs.undeclared-change
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: A change touching docs/ is covered by a declared artifact
|
|
6
|
+
statement: >-
|
|
7
|
+
Any path in the change set beneath `docs/`, outside `docs/dist/`, MUST be covered by an artifact in
|
|
8
|
+
the documentation declaration. An undeclared documentation change is a violation. This rule lives in
|
|
9
|
+
the extension and NOT in core, because it requires knowing `docs/` (spec 2 §4; companion §4,
|
|
10
|
+
*Deliberately excluded*).
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: change_set
|
|
13
|
+
text: >-
|
|
14
|
+
the paths added, modified or deleted under evaluation, handed to the capability by core
|
|
15
|
+
(companion §5). The capability reads it; it does not compute it.
|
|
16
|
+
- term_id: covered
|
|
17
|
+
text: >-
|
|
18
|
+
a changed path equals the `path` of some declared artifact, or the `from` of an `archive`
|
|
19
|
+
artifact. Coverage is exact-path, not prefix or glob.
|
|
20
|
+
- term_id: disposition_rationale
|
|
21
|
+
text: >-
|
|
22
|
+
advisory while the consuming corpus is brought into compatibility. The measurement below was
|
|
23
|
+
TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
|
|
24
|
+
already stale, so the date lives in the key and the command is recorded beside the result.
|
|
25
|
+
Re-take it at the escalation checkpoint; never escalate on the number here.
|
|
26
|
+
values:
|
|
27
|
+
measured_2026_09_06: '0 declarations exist, so every `docs/**` change in the repository today is undeclared and this rule would fire on all of them. That is the reason it ships advisory rather than strict: escalating before the declaration exists would block every commit touching documentation.'
|
|
28
|
+
measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
|
|
29
|
+
measurement_command: '(requires the core declaration, companion §3, which is not yet implemented)'
|
|
30
|
+
escalate_when: 'Declarations are being recorded at RATIFY and a full pass over recent merges reports zero undeclared `docs/**` changes.'
|
|
31
|
+
content:
|
|
32
|
+
summary: >-
|
|
33
|
+
The enforceable inverse. Detecting that a change SHOULD HAVE BEEN declared is semantic and not
|
|
34
|
+
deterministically decidable; detecting that a declared-documentation repository touched `docs/`
|
|
35
|
+
without declaring it is deterministic, and it catches the same class of drift from the other side.
|
|
36
|
+
normative_text: |
|
|
37
|
+
#1782 reasoned this correctly and spec 2 §4 keeps the reasoning: the deterministic inverse is
|
|
38
|
+
enforceable, and it requires knowing the tree. Core's half — every declared path appears in the
|
|
39
|
+
change set — asks *you said you would touch these paths, did you?*. This half asks *you touched
|
|
40
|
+
these paths, did you say you would?*. Together they close the loop; neither alone does.
|
|
41
|
+
|
|
42
|
+
`docs/dist/**` is excluded because it is build output. A rendered site changing is a consequence
|
|
43
|
+
of an authored change, not an authored change, and requiring it to be declared would make every
|
|
44
|
+
declaration carry generated paths.
|
|
45
|
+
|
|
46
|
+
A DELETED path under `docs/` is in scope. Removing a document is a documentation change, and the
|
|
47
|
+
declaration form for it is an `archive` artifact — which is how spec 2 §2's *migration preserves
|
|
48
|
+
history* survives contact with a repository where deleting a file is one keystroke.
|
|
49
|
+
fix_hint: |
|
|
50
|
+
Declare the artifact at RATIFY, before the work:
|
|
51
|
+
|
|
52
|
+
documentation:
|
|
53
|
+
impact: change
|
|
54
|
+
artifacts:
|
|
55
|
+
- action: modify
|
|
56
|
+
path: docs/delivery/release.adoc
|
|
57
|
+
|
|
58
|
+
If the change is genuinely not a documentation change — a typo fix in a rendered artefact, a
|
|
59
|
+
path you did not mean to touch — the fix is to not touch `docs/`, not to widen the declaration.
|
|
60
|
+
If it IS one and you did not plan it, the declaration was wrong at RATIFY and re-ratifying is
|
|
61
|
+
the honest correction.
|
|
62
|
+
exceptions:
|
|
63
|
+
- '`docs/dist/**` is generated output and is never required to be declared.'
|
|
64
|
+
- A repository with no documentation declaration recorded at all is core's concern (companion §4,
|
|
65
|
+
check 1), not this rule's. This rule fires when a declaration exists and does not cover the diff.
|
|
66
|
+
- >-
|
|
67
|
+
An ABSENT change set is not an empty one. If core supplies no change set at all, this rule
|
|
68
|
+
cannot be evaluated and the capability returns COULD_NOT_CHECK, which BLOCKS — it does not
|
|
69
|
+
report "nothing undeclared", because that is a claim it is in no position to make. An empty
|
|
70
|
+
change set is core saying nothing changed, which IS actionable and permits. The two must stay
|
|
71
|
+
distinct for the same reason NOT_APPLICABLE and COULD_NOT_CHECK must (spec 2 §3).
|
|
72
|
+
metadata:
|
|
73
|
+
aliases:
|
|
74
|
+
- DOCS-DECLARATION-002
|
|
75
|
+
severity: 2
|
|
76
|
+
disposition: advisory
|
|
77
|
+
introduced_in: 0.1.0
|
|
78
|
+
implementation:
|
|
79
|
+
type: validator
|
|
80
|
+
ref: docs_capability
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.acceptance-binding-declared
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Every test declares what it proves
|
|
6
|
+
statement: >-
|
|
7
|
+
A test file carrying a URN MUST also declare `// Acceptance: acc:…` or, for a journey/E2E test, `//
|
|
8
|
+
Train: …`. Stack-neutral obligation, Bun-specific detector. Realized by
|
|
9
|
+
`bun_tester_discipline_detector`.
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: acceptance_binding
|
|
12
|
+
text: >-
|
|
13
|
+
`// Acceptance: acc:…`, naming the obligation this test discharges.
|
|
14
|
+
- term_id: train_binding
|
|
15
|
+
text: >-
|
|
16
|
+
`// Train: …` — the alternative for a journey test, which proves a train rather than a
|
|
17
|
+
single acceptance.
|
|
18
|
+
content:
|
|
19
|
+
summary: >-
|
|
20
|
+
Requires an `Acceptance:` or `Train:` field beside the URN. Files with no URN are skipped — that
|
|
21
|
+
finding belongs to `test-carries-urn-identity`.
|
|
22
|
+
normative_text: |
|
|
23
|
+
A URN says which test this is; the acceptance binding says which OBLIGATION it discharges. Only the second one closes the loop the gate reads.
|
|
24
|
+
Two binding kinds are accepted because a journey test legitimately proves a train rather than a single acceptance. Forcing every test to name an acceptance would push authors to invent one, which pollutes the plan graph with acceptances that exist only to satisfy a linter.
|
|
25
|
+
fix_hint: |
|
|
26
|
+
Name the acceptance the test discharges, or the train it walks:
|
|
27
|
+
|
|
28
|
+
// Acceptance: acc:orders:E001-SMOKE-001-renders-row
|
|
29
|
+
// Train: train:orders:checkout-journey
|
|
30
|
+
exceptions:
|
|
31
|
+
- A `Train:` binding satisfies the rule for journey and E2E tests.
|
|
32
|
+
- Files with no URN are owned by `test-carries-urn-identity`.
|
|
33
|
+
- Whether the named acceptance EXISTS is a plan-graph question this per-file detector cannot answer.
|
|
34
|
+
metadata:
|
|
35
|
+
aliases:
|
|
36
|
+
# Bun realization of the core obligation `tester.coverage.every-acceptance-criterion-must`. Core carries no
|
|
37
|
+
# shared alias for it, so the lineage is stated here and in the statement.
|
|
38
|
+
- BUN-ACCEPTANCE-BINDING-DECLARED-001
|
|
39
|
+
severity: 2
|
|
40
|
+
# Core's tester nodes are largely `documentation-only`, which core's
|
|
41
|
+
# coverage_report treats as never-fails-the-build. That is right for retrofitting
|
|
42
|
+
# and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
|
|
43
|
+
# that will not be adopted. Gating dispositions here; a repo adopting on an
|
|
44
|
+
# existing suite records a ratchet baseline instead.
|
|
45
|
+
disposition: suppress-and-clean
|
|
46
|
+
introduced_in: 0.1.0
|
|
47
|
+
implementation:
|
|
48
|
+
type: validator
|
|
49
|
+
ref: bun_tester_discipline_detector
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.acceptance-covers-tag-well-formed
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Per-case @covers tags are well-formed acceptance URNs
|
|
6
|
+
statement: >-
|
|
7
|
+
A `// @covers` tag above an `it()` MUST name a well-formed `acc:{wagon}:{ACCEPTANCE-ID}` URN. Stack-
|
|
8
|
+
neutral obligation, Bun-specific detector implementing the two-level binding model. Realized by
|
|
9
|
+
`bun_tester_discipline_detector`.
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: covers_tag
|
|
12
|
+
text: >-
|
|
13
|
+
`// @covers acc:…` above an `it()`, binding one CASE rather than the file.
|
|
14
|
+
- term_id: two_level_binding
|
|
15
|
+
text: >-
|
|
16
|
+
file header plus per-case tags. Gives many-cases-to-one-acceptance precision without forcing
|
|
17
|
+
one acceptance per file.
|
|
18
|
+
content:
|
|
19
|
+
summary: >-
|
|
20
|
+
Collects the `// @covers` comment block immediately above each `it()` / `test()` and validates every
|
|
21
|
+
tag against `acc:{wagon}:{ACCEPTANCE-ID}`.
|
|
22
|
+
normative_text: |
|
|
23
|
+
The two-level model is the point. The file header binds the FILE to its acceptances; a `@covers` tag binds ONE test case. That gives many-cases-to-one-acceptance precision without forcing one acceptance per file — the design issue #1783 argued for, and the reason a real 65-spec suite can adopt ATDD without a rename.
|
|
24
|
+
A malformed tag is `strict` because it is the worst of both worlds: it binds nothing, while looking to a reviewer exactly like a binding that works.
|
|
25
|
+
fix_hint: |
|
|
26
|
+
Use the full acceptance URN, not a bare id:
|
|
27
|
+
|
|
28
|
+
// @covers E005-UNIT-001 // wrong — no scheme, no wagon
|
|
29
|
+
// @covers acc:orders:E005-UNIT-001 // right
|
|
30
|
+
|
|
31
|
+
Several tags on one line are allowed; a case may cover more than one acceptance.
|
|
32
|
+
exceptions:
|
|
33
|
+
- Cases with no `@covers` tag are not required to have one — the file header binding still applies.
|
|
34
|
+
- Only the tag's SHAPE is validated; resolution against `plan/` is a graph-level concern.
|
|
35
|
+
metadata:
|
|
36
|
+
aliases:
|
|
37
|
+
# Bun realization of the core obligation `tester.coverage.every-acceptance-criterion-must`. Core carries no
|
|
38
|
+
# shared alias for it, so the lineage is stated here and in the statement.
|
|
39
|
+
- BUN-COVERS-TAG-WELL-FORMED-001
|
|
40
|
+
severity: 3
|
|
41
|
+
# Core's tester nodes are largely `documentation-only`, which core's
|
|
42
|
+
# coverage_report treats as never-fails-the-build. That is right for retrofitting
|
|
43
|
+
# and wrong for a new stack: a coverage-binding rule that cannot fail is a rule
|
|
44
|
+
# that will not be adopted. Gating dispositions here; a repo adopting on an
|
|
45
|
+
# existing suite records a ratchet baseline instead.
|
|
46
|
+
disposition: strict
|
|
47
|
+
introduced_in: 0.1.0
|
|
48
|
+
implementation:
|
|
49
|
+
type: validator
|
|
50
|
+
ref: bun_tester_discipline_detector
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.acceptance-resolves-to-declared
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: A test's Acceptance / WMBT binding names an artifact the plan declares (Bun)
|
|
6
|
+
statement: >-
|
|
7
|
+
A test's `// Acceptance:` and `// WMBT:` headers MUST name artifacts the plan actually declares.
|
|
8
|
+
Declaring a binding is not the same as having one: a suite bound to an acceptance that exists
|
|
9
|
+
nowhere is attributed to nothing, and every coverage figure computed from it is fiction. Core owns
|
|
10
|
+
the shape of these artifacts; only a per-stack detector can see whether a Bun test resolves into
|
|
11
|
+
them.
|
|
12
|
+
implementation:
|
|
13
|
+
type: validator
|
|
14
|
+
ref: tester.bun.acceptance-resolves-to-declared
|
|
15
|
+
content:
|
|
16
|
+
summary: >-
|
|
17
|
+
Resolves each Bun test's declared binding against the plan. The JS realization collects every
|
|
18
|
+
`acc:` / `wmbt:` URN stated anywhere under `plan/**`, then flags a test whose `// Acceptance:` or
|
|
19
|
+
`// WMBT:` header names one the plan never mentions. Member of the `bun_tester_discipline_detector`
|
|
20
|
+
FAMILY detector (checks/t_acceptance_resolves.mjs).
|
|
21
|
+
normative_text: |
|
|
22
|
+
Its sibling `tester.bun.acceptance-binding-declared` asks only whether a header is PRESENT, which
|
|
23
|
+
a test satisfies by naming anything at all. Measured on a consumer, a test bound to
|
|
24
|
+
`acc:does-not-exist:E999-NEVER-DECLARED` passed every gated rule in this workspace. That is the
|
|
25
|
+
recurring defect this hub keeps finding: a NAME accepted where a CLAIM is required. The two rules
|
|
26
|
+
are complementary — one requires the binding to exist, this one requires it to be true.
|
|
27
|
+
|
|
28
|
+
Declared URNs are read as TOKENS rather than parsed structurally, on purpose: acceptances are
|
|
29
|
+
stated under several keys across wagon, feature and WMBT documents, and a reference resolves if
|
|
30
|
+
the plan states that URN anywhere. Over-accepting is the safe direction — the failure this rule
|
|
31
|
+
exists to catch is a reference to something the plan never mentions.
|
|
32
|
+
|
|
33
|
+
NOT_APPLICABLE when the consumer declares no acceptances at all: a repository with no plan has
|
|
34
|
+
nothing to resolve against, and reporting there would fire on every unplanned project rather than
|
|
35
|
+
on a broken reference.
|
|
36
|
+
fix_hint: |
|
|
37
|
+
Point the header at an acceptance the plan declares, or declare the acceptance:
|
|
38
|
+
|
|
39
|
+
// URN: test:orders:checkout:E001-SMOKE-001-renders-row
|
|
40
|
+
// Acceptance: acc:orders:E001-SMOKE-001-renders-row # stated in plan/orders/E001.yaml
|
|
41
|
+
// WMBT: wmbt:orders:E001
|
|
42
|
+
|
|
43
|
+
A renamed acceptance is the common cause — the plan moved and the header did not. This rule is
|
|
44
|
+
`strict`: a test bound to an artifact that does not exist is not suppressible and fails CI.
|
|
45
|
+
exceptions:
|
|
46
|
+
- A test carrying no binding header at all is NOT reported here; that is
|
|
47
|
+
`tester.bun.acceptance-binding-declared`'s obligation, and reporting both would double-count
|
|
48
|
+
one defect.
|
|
49
|
+
metadata:
|
|
50
|
+
aliases:
|
|
51
|
+
- BUN-ACCEPTANCE-RESOLVES-001
|
|
52
|
+
severity: 4
|
|
53
|
+
disposition: strict
|
|
54
|
+
introduced_in: 0.2.0
|
|
55
|
+
core_design_refs:
|
|
56
|
+
- afokapu/atdd#1246
|
|
57
|
+
terms:
|
|
58
|
+
- term_id: resolvable_binding
|
|
59
|
+
text: >-
|
|
60
|
+
an `// Acceptance:` or `// WMBT:` header whose URN is stated somewhere in the consumer's plan,
|
|
61
|
+
so the test is attributable to a declared obligation rather than to a name.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: tester.bun.interlocking-production-runner-used
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Interlocking tests exercise the production runners, not mocks (Bun)
|
|
6
|
+
statement: >-
|
|
7
|
+
A test that exercises an interlocking MUST drive the production runtime objects — `InterlockingRunner`
|
|
8
|
+
(route resolution) and `TrainRunner` (linear train execution), the core afokapu/atdd#1251 call model —
|
|
9
|
+
and MUST NOT substitute a mock, a substituted runner, or a
|
|
10
|
+
hand-built route resolver for them. This is the Bun-stack realization of the agnostic core
|
|
11
|
+
obligation `tester.interlocking.production-runner-used`; its JS detector (a member of the
|
|
12
|
+
`bun_interlocking_coverage` FAMILY) scans the consumer's `e2e/**/*.ts` interlocking tests and flags
|
|
13
|
+
any that fail to reference both production runner symbols or that carry a forbidden substitution
|
|
14
|
+
pattern. An interlocking test that mocks the route-control path is a DESCRIPTIVE green.
|
|
15
|
+
implementation:
|
|
16
|
+
type: validator
|
|
17
|
+
ref: tester.bun.interlocking-production-runner-used
|
|
18
|
+
content:
|
|
19
|
+
summary: >-
|
|
20
|
+
A "interlocking tests use the production runners, not mocks" obligation, rendered for the Bun
|
|
21
|
+
backend. The JS realization scans each interlocking-related `e2e/**/*.ts` test and enforces two
|
|
22
|
+
checks: it references both `InterlockingRunner` and `TrainRunner`, and it carries none of the
|
|
23
|
+
forbidden substitution patterns (comments masked).
|
|
24
|
+
normative_text: |
|
|
25
|
+
The core runtime call model (afokapu/atdd#1251) is `Station Master -> InterlockingRunner.resolveTrain
|
|
26
|
+
-> TrainRunner.execute`. A test that claims to exercise an interlocking route but replaces either
|
|
27
|
+
runner with a test double exercises the double, not production route control.
|
|
28
|
+
|
|
29
|
+
REQUIRED production symbols an interlocking test must reference:
|
|
30
|
+
- InterlockingRunner
|
|
31
|
+
- TrainRunner
|
|
32
|
+
|
|
33
|
+
FORBIDDEN substitution patterns (any one is a violation):
|
|
34
|
+
- MockInterlockingRunner / MockTrainRunner
|
|
35
|
+
- mock.module(...) replacing a runner module — bun:test's own idiom, and the one that
|
|
36
|
+
matters most here: it swaps the ENTIRE route-control module
|
|
37
|
+
- spyOn(...) / mock(...) / mock.restore(...) aimed at a runner (bun:test)
|
|
38
|
+
- vi.mock(...) / jest.mock(...) around a runner module, for a suite migrating in
|
|
39
|
+
- vi.spyOn(...) / jest.spyOn(...) replacing runner behavior (resolveTrain / execute)
|
|
40
|
+
- a hand-built route resolver replacing InterlockingRunner (a locally defined `resolveTrain`
|
|
41
|
+
function or a `*Resolver` class standing in for the production runner)
|
|
42
|
+
|
|
43
|
+
WHICH per-stack discovery applies (here: Bun `e2e/**/*.ts` scanned for the production symbols and
|
|
44
|
+
the forbidden patterns) is delegated to this realization.
|
|
45
|
+
fix_hint: |
|
|
46
|
+
Rewrite the flagged interlocking test to drive the real runners: import and call
|
|
47
|
+
`new InterlockingRunner(interlockingYamlPath).resolveTrain(action, inputs)` to get the selected
|
|
48
|
+
trainId, then `new TrainRunner(selectedTrainId).execute(...)`. Delete any `MockInterlockingRunner` /
|
|
49
|
+
`MockTrainRunner`, any `mock.module` / `spyOn` / `mock` / `mock.restore` (bun:test) or
|
|
50
|
+
`vi.mock` / `vi.spyOn` / jest equivalent aimed at the runners or their `resolveTrain` / `execute`
|
|
51
|
+
methods, and any locally hand-built route resolver. This rule is `strict`: an interlocking test that
|
|
52
|
+
mocks the route-control path is a descriptive green proving nothing about production and blocks.
|
|
53
|
+
exceptions:
|
|
54
|
+
- Non-interlocking e2e tests (no reference to any interlocking route/train/interlocking token and no
|
|
55
|
+
runner symbol) are out of scope — they are not interlocking tests.
|
|
56
|
+
- Per-stack renderings other than Bun are owned by their own workspace packages.
|
|
57
|
+
metadata:
|
|
58
|
+
aliases:
|
|
59
|
+
- BUN-TESTER-INTERLOCKING-PRODUCTION-RUNNER-USED-001
|
|
60
|
+
severity: 1
|
|
61
|
+
disposition: strict
|
|
62
|
+
introduced_in: 0.1.0
|
|
63
|
+
core_design_refs:
|
|
64
|
+
- afokapu/atdd#1246
|
|
65
|
+
- afokapu/atdd#1251
|
|
66
|
+
terms:
|
|
67
|
+
- term_id: production_runner
|
|
68
|
+
text: >-
|
|
69
|
+
one of the two runtime objects in the core afokapu/atdd#1251 call model — `InterlockingRunner`
|
|
70
|
+
(resolves a guarded route to exactly one trainId) and `TrainRunner` (executes the selected train).
|
|
71
|
+
- term_id: forbidden_substitution
|
|
72
|
+
text: >-
|
|
73
|
+
a test double that replaces a production runner: `MockInterlockingRunner`/`MockTrainRunner`, a
|
|
74
|
+
`mock.module`/`spyOn`/`mock` (bun:test) or `vi.mock`/`vi.spyOn` (or jest) aimed at a runner
|
|
75
|
+
or its `resolveTrain`/`execute`, or a hand-built
|
|
76
|
+
route resolver standing in for InterlockingRunner.
|