@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,56 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.green-header-runtime
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: The header declares the runtime the file executes in
|
|
6
|
+
statement: >-
|
|
7
|
+
Every implementation file MUST carry a `Runtime:` declaration naming `bun`, `browser` or `isomorphic`.
|
|
8
|
+
Stack-neutral obligation, Bun-specific vocabulary; realized by `bun_green_traceability_detector` (core
|
|
9
|
+
alias GREEN-HEADER-001).
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: runtime_field
|
|
12
|
+
text: >-
|
|
13
|
+
the `Runtime:` header line naming where the file executes.
|
|
14
|
+
- term_id: isomorphic
|
|
15
|
+
text: >-
|
|
16
|
+
a module that genuinely runs both server-side and in the browser. Bun decides at run time
|
|
17
|
+
what a bundler decides at build time, so the value must exist.
|
|
18
|
+
content:
|
|
19
|
+
summary: >-
|
|
20
|
+
A "the file says where it runs" obligation. The vocabulary is this stack's: Vite reads
|
|
21
|
+
`vite|browser|node` and Python reads `python`.
|
|
22
|
+
normative_text: |
|
|
23
|
+
`isomorphic` has no Vite counterpart and is the substantive addition. A bundler stack decides at BUILD time which code reaches the browser, so a file is server or client by where the bundler puts it. Bun decides at RUN time, and a full-stack Bun app routinely runs one module in both places — a fragment renderer used server-side and again after a client-side swap. Without a value for that, authors would be forced to pick a wrong one, and every downstream reader would inherit the error.
|
|
24
|
+
fix_hint: |
|
|
25
|
+
Declare the runtime the file actually executes in:
|
|
26
|
+
|
|
27
|
+
// Runtime: deno // ✗ not this stack
|
|
28
|
+
// Runtime: bun // ✓ server-side
|
|
29
|
+
// Runtime: browser // ✓ ships to the client
|
|
30
|
+
// Runtime: isomorphic // ✓ genuinely runs in both
|
|
31
|
+
exceptions:
|
|
32
|
+
- A missing declaration is reported at the URN line (or the first meaningful line when there is no URN).
|
|
33
|
+
- Test files are excluded.
|
|
34
|
+
metadata:
|
|
35
|
+
aliases:
|
|
36
|
+
# GREEN-HEADER-001 is the SHARED core alias — the same one carried by the Python
|
|
37
|
+
# realization and by coder.vite.green-header-runtime. One obligation, three
|
|
38
|
+
# per-stack detectors, found through this alias.
|
|
39
|
+
- GREEN-HEADER-001
|
|
40
|
+
- BUN-GREEN-HEADER-RUNTIME-001
|
|
41
|
+
severity: 2
|
|
42
|
+
# DIVERGENCE FROM THE VITE/PYTHON REALIZATIONS, deliberate and reversible.
|
|
43
|
+
# Those two carry `documentation-only`, which core's coverage_report treats as
|
|
44
|
+
# never-fails-the-build — the right call when RETROFITTING a large existing
|
|
45
|
+
# codebase, where day-one enforcement would red every file at once.
|
|
46
|
+
# A new Bun + htmx repo has no such debt: headers can be present from the first
|
|
47
|
+
# file, and a traceability rule that cannot fail is a rule that will quietly not
|
|
48
|
+
# be adopted. `suppress-and-clean` fails on violation AND is ratchetable, so an
|
|
49
|
+
# existing repo adopting this can still `--record-ratchet` a baseline and be held
|
|
50
|
+
# flat rather than blocked. Change this one field back to `documentation-only`
|
|
51
|
+
# for exact Vite parity.
|
|
52
|
+
disposition: suppress-and-clean
|
|
53
|
+
introduced_in: 0.1.0
|
|
54
|
+
implementation:
|
|
55
|
+
type: validator
|
|
56
|
+
ref: bun_green_traceability_detector
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.green-header-tested-by
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: The header binds the file to at least one acceptance
|
|
6
|
+
statement: >-
|
|
7
|
+
Every implementation file MUST carry a `Tested-By:` block containing at least one `- test:…` acceptance
|
|
8
|
+
URN. Stack-neutral obligation, Bun-specific detector; realized by `bun_green_traceability_detector`
|
|
9
|
+
(core alias GREEN-HEADER-003).
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: tested_by_block
|
|
12
|
+
text: >-
|
|
13
|
+
the `Tested-By:` line followed by one or more `- test:` acceptance URNs.
|
|
14
|
+
- term_id: empty_block
|
|
15
|
+
text: >-
|
|
16
|
+
a `Tested-By:` line with no entries. Treated as absent, because it is the shape a half-
|
|
17
|
+
finished backfill leaves and would otherwise report full coverage with zero bindings.
|
|
18
|
+
content:
|
|
19
|
+
summary: >-
|
|
20
|
+
A "the file names the acceptances that cover it" obligation: the `Tested-By:` line must be present AND
|
|
21
|
+
followed by one or more `- test:` entries. A bare block with no entries fails.
|
|
22
|
+
normative_text: |
|
|
23
|
+
This is the rule that makes the whole header load-bearing rather than decorative. The URN says what the file IS; `Tested-By:` says what PROVES it. Together they close the loop from acceptance to implementation that ATDD exists to keep closed — which is exactly the loop that a stack migration breaks silently, because the new files are written without headers and nothing notices.
|
|
24
|
+
An empty block is treated as absent deliberately: it is the shape a half-finished backfill leaves behind, and accepting it would let a repo report full header coverage with zero acceptance bindings.
|
|
25
|
+
fix_hint: |
|
|
26
|
+
Name at least one acceptance:
|
|
27
|
+
|
|
28
|
+
// Tested-By:
|
|
29
|
+
// - test:orders:checkout:E001-SMOKE-001-renders-row
|
|
30
|
+
|
|
31
|
+
and in a template:
|
|
32
|
+
|
|
33
|
+
<!-- Tested-By: -->
|
|
34
|
+
<!-- - test:orders:checkout:E001-SMOKE-002-panel-loads -->
|
|
35
|
+
|
|
36
|
+
Whether the named acceptances EXIST is a plan-graph question this rule cannot answer; it enforces that the binding is declared.
|
|
37
|
+
exceptions:
|
|
38
|
+
- Test files are excluded — they are the other end of this binding.
|
|
39
|
+
- One entry satisfies the rule; more are encouraged.
|
|
40
|
+
- Entry resolution against `plan/` is out of scope for a per-file detector.
|
|
41
|
+
metadata:
|
|
42
|
+
aliases:
|
|
43
|
+
# GREEN-HEADER-003 is the SHARED core alias — the same one carried by the Python
|
|
44
|
+
# realization and by coder.vite.green-header-tested-by. One obligation, three
|
|
45
|
+
# per-stack detectors, found through this alias.
|
|
46
|
+
- GREEN-HEADER-003
|
|
47
|
+
- BUN-GREEN-HEADER-TESTED-BY-001
|
|
48
|
+
severity: 2
|
|
49
|
+
# DIVERGENCE FROM THE VITE/PYTHON REALIZATIONS, deliberate and reversible.
|
|
50
|
+
# Those two carry `documentation-only`, which core's coverage_report treats as
|
|
51
|
+
# never-fails-the-build — the right call when RETROFITTING a large existing
|
|
52
|
+
# codebase, where day-one enforcement would red every file at once.
|
|
53
|
+
# A new Bun + htmx repo has no such debt: headers can be present from the first
|
|
54
|
+
# file, and a traceability rule that cannot fail is a rule that will quietly not
|
|
55
|
+
# be adopted. `suppress-and-clean` fails on violation AND is ratchetable, so an
|
|
56
|
+
# existing repo adopting this can still `--record-ratchet` a baseline and be held
|
|
57
|
+
# flat rather than blocked. Change this one field back to `documentation-only`
|
|
58
|
+
# for exact Vite parity.
|
|
59
|
+
disposition: suppress-and-clean
|
|
60
|
+
introduced_in: 0.1.0
|
|
61
|
+
implementation:
|
|
62
|
+
type: validator
|
|
63
|
+
ref: bun_green_traceability_detector
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.green-urn-layer
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: The URN layer segment is one of the five architectural layers
|
|
6
|
+
statement: >-
|
|
7
|
+
The `{layer}` segment of a URN MUST be one of `domain`, `application`, `integration`, `presentation`,
|
|
8
|
+
`assembly`. Stack-neutral obligation, Bun-specific detector; realized by
|
|
9
|
+
`bun_green_traceability_detector` (core alias GREEN-URN-006).
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: layer_segment
|
|
12
|
+
text: >-
|
|
13
|
+
segment 5: domain, application, integration, presentation or assembly.
|
|
14
|
+
- term_id: layering_input
|
|
15
|
+
text: >-
|
|
16
|
+
the fact the boundary and dependency-flow rules read to judge an import. A layer outside the
|
|
17
|
+
vocabulary makes the file unreachable by every layering rule.
|
|
18
|
+
content:
|
|
19
|
+
summary: >-
|
|
20
|
+
A "layer is declared from the closed vocabulary" obligation, checked against segment 5.
|
|
21
|
+
normative_text: |
|
|
22
|
+
The layer segment is what the boundary and dependency-flow rules read to decide whether an import is legal. A file declaring a layer outside the vocabulary is not merely mislabelled — it is unreachable by every layering rule, so it becomes a hole through which any dependency may pass unchallenged.
|
|
23
|
+
fix_hint: |
|
|
24
|
+
Use a layer from the vocabulary:
|
|
25
|
+
|
|
26
|
+
// URN: component:orders:checkout:OrderRow:backend:widgets // ✗
|
|
27
|
+
// URN: component:orders:checkout:OrderRow:backend:presentation // ✓
|
|
28
|
+
exceptions:
|
|
29
|
+
- URNs that are not six segments are skipped.
|
|
30
|
+
- The vocabulary is fixed by core, not by this extension; a new layer is a core change.
|
|
31
|
+
metadata:
|
|
32
|
+
aliases:
|
|
33
|
+
# GREEN-URN-006 is the SHARED core alias — the same one carried by the Python
|
|
34
|
+
# realization and by coder.vite.green-urn-layer. One obligation, three
|
|
35
|
+
# per-stack detectors, found through this alias.
|
|
36
|
+
- GREEN-URN-006
|
|
37
|
+
- BUN-GREEN-URN-LAYER-001
|
|
38
|
+
severity: 3
|
|
39
|
+
# DIVERGENCE FROM THE VITE/PYTHON REALIZATIONS, deliberate and reversible.
|
|
40
|
+
# Those two carry `documentation-only`, which core's coverage_report treats as
|
|
41
|
+
# never-fails-the-build — the right call when RETROFITTING a large existing
|
|
42
|
+
# codebase, where day-one enforcement would red every file at once.
|
|
43
|
+
# A new Bun + htmx repo has no such debt: headers can be present from the first
|
|
44
|
+
# file, and a traceability rule that cannot fail is a rule that will quietly not
|
|
45
|
+
# be adopted. `suppress-and-clean` fails on violation AND is ratchetable, so an
|
|
46
|
+
# existing repo adopting this can still `--record-ratchet` a baseline and be held
|
|
47
|
+
# flat rather than blocked. Change this one field back to `documentation-only`
|
|
48
|
+
# for exact Vite parity.
|
|
49
|
+
disposition: suppress-and-clean
|
|
50
|
+
introduced_in: 0.1.0
|
|
51
|
+
implementation:
|
|
52
|
+
type: validator
|
|
53
|
+
ref: bun_green_traceability_detector
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.green-urn-marker
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Every implementation file opens with its URN component marker
|
|
6
|
+
statement: >-
|
|
7
|
+
A Bun/htmx implementation file — `.ts`, `.tsx`, `.js`, `.jsx`, `.mjs`, `.mts` AND `.html`/`.htm`
|
|
8
|
+
template — MUST carry a `URN: component:…` marker as its first meaningful line. Stack-neutral obligation
|
|
9
|
+
(required in every implementation file), Bun-specific dual-syntax detector: `// URN:` in source, `<!--
|
|
10
|
+
URN: … -->` in a template. The Python realization writes `# URN:` and the Vite one `// URN:`; this is
|
|
11
|
+
the same obligation with a third comment syntax. Realized by the family validator
|
|
12
|
+
`bun_green_traceability_detector` (core alias GREEN-URN-001).
|
|
13
|
+
terms:
|
|
14
|
+
- term_id: traceability_header
|
|
15
|
+
text: >-
|
|
16
|
+
the leading comment block binding a file to the plan graph: URN, Tested-By, Runtime,
|
|
17
|
+
Purpose. `//` in source, `<!-- … -->` in an .html template.
|
|
18
|
+
- term_id: first_meaningful_line
|
|
19
|
+
text: >-
|
|
20
|
+
the first line that is neither blank nor a preamble. A shebang or `<!doctype>` may precede
|
|
21
|
+
the marker without displacing it, because neither is content.
|
|
22
|
+
content:
|
|
23
|
+
summary: >-
|
|
24
|
+
A "every file declares its component URN" obligation. The detector treats the leading run of blank
|
|
25
|
+
lines, an optional shebang or doctype, and single-line comments as the header region; the first real
|
|
26
|
+
content line ends it. A marker below the imports therefore reads as MISSING, which is the point.
|
|
27
|
+
normative_text: |
|
|
28
|
+
The URN is the only edge between a source file and the plan graph. Without it a file is invisible to traceability: no acceptance can claim it, no wagon owns it, and coverage reporting cannot see it exists.
|
|
29
|
+
"First meaningful line" excludes a shebang (`#!/usr/bin/env bun`) and an HTML doctype, because neither is content and neither should be able to displace the marker. The Vite sibling counts a shebang as the first non-empty line and so reports a header it actually has as missing; this realization does not.
|
|
30
|
+
fix_hint: |
|
|
31
|
+
Put the marker on the first meaningful line:
|
|
32
|
+
|
|
33
|
+
// URN: component:orders:checkout:OrderRow:backend:presentation
|
|
34
|
+
|
|
35
|
+
and in a template:
|
|
36
|
+
|
|
37
|
+
<!doctype html>
|
|
38
|
+
<!-- URN: component:orders:checkout:OrderPanel:frontend:presentation -->
|
|
39
|
+
|
|
40
|
+
Disposition is `documentation-only`, matching the Python and Vite realizations: a ratchet holds an existing repo flat while headers are backfilled.
|
|
41
|
+
exceptions:
|
|
42
|
+
- Test files (`*.test.*`, `*.spec.*`) are excluded — they are bound by their acceptance URNs instead.
|
|
43
|
+
- Vendored and generated trees (`node_modules`, `dist`, `build`, `_generated`) are never scanned.
|
|
44
|
+
- A shebang or `<!doctype>` may precede the marker.
|
|
45
|
+
metadata:
|
|
46
|
+
aliases:
|
|
47
|
+
# GREEN-URN-001 is the SHARED core alias — the same one carried by the Python
|
|
48
|
+
# realization and by coder.vite.green-urn-marker. One obligation, three
|
|
49
|
+
# per-stack detectors, found through this alias.
|
|
50
|
+
- GREEN-URN-001
|
|
51
|
+
- BUN-GREEN-URN-MARKER-001
|
|
52
|
+
severity: 3
|
|
53
|
+
# DIVERGENCE FROM THE VITE/PYTHON REALIZATIONS, deliberate and reversible.
|
|
54
|
+
# Those two carry `documentation-only`, which core's coverage_report treats as
|
|
55
|
+
# never-fails-the-build — the right call when RETROFITTING a large existing
|
|
56
|
+
# codebase, where day-one enforcement would red every file at once.
|
|
57
|
+
# A new Bun + htmx repo has no such debt: headers can be present from the first
|
|
58
|
+
# file, and a traceability rule that cannot fail is a rule that will quietly not
|
|
59
|
+
# be adopted. `suppress-and-clean` fails on violation AND is ratchetable, so an
|
|
60
|
+
# existing repo adopting this can still `--record-ratchet` a baseline and be held
|
|
61
|
+
# flat rather than blocked. Change this one field back to `documentation-only`
|
|
62
|
+
# for exact Vite parity.
|
|
63
|
+
disposition: suppress-and-clean
|
|
64
|
+
introduced_in: 0.1.0
|
|
65
|
+
implementation:
|
|
66
|
+
type: validator
|
|
67
|
+
ref: bun_green_traceability_detector
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.green-urn-name-matches
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: The URN name segment matches the filename
|
|
6
|
+
statement: >-
|
|
7
|
+
The `{Name}` segment of a URN MUST match the file's basename, compared case- and separator-
|
|
8
|
+
insensitively, unless the name is a structural role. Stack-neutral obligation, Bun-specific detector;
|
|
9
|
+
realized by `bun_green_traceability_detector` (core alias GREEN-URN-004).
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: name_segment
|
|
12
|
+
text: >-
|
|
13
|
+
segment 3 of the URN, which identifies the component the file implements.
|
|
14
|
+
- term_id: structural_role_name
|
|
15
|
+
text: >-
|
|
16
|
+
a filename naming a ROLE rather than a component — index, server, routes, layout, partial,
|
|
17
|
+
composition, wagon. Exempt, because the file assembles rather than implements.
|
|
18
|
+
content:
|
|
19
|
+
summary: >-
|
|
20
|
+
A "the URN names this file" obligation. The detector normalises both sides to lowercase alphanumerics
|
|
21
|
+
before comparing, and exempts a set of structural filenames that name a ROLE rather than a component.
|
|
22
|
+
normative_text: |
|
|
23
|
+
A URN naming a different component than the file it sits in is worse than a missing one: it binds the file's evidence to somebody else's component, so both are wrong and neither is obviously wrong. This is the failure a copy-pasted header produces, which is how it usually arises.
|
|
24
|
+
The exempt set is the Vite set plus this stack's idioms — `server`, `routes`, `layout`, `partial`, `fragment`, `middleware` — because a full-stack Bun app's entrypoint is `server.ts` and its htmx fragments are named for their role, not for a component.
|
|
25
|
+
fix_hint: |
|
|
26
|
+
Make the name segment agree with the filename, or use a structural role name:
|
|
27
|
+
|
|
28
|
+
// in OrderRow.ts
|
|
29
|
+
// URN: component:orders:checkout:SomethingElse:backend:presentation // ✗
|
|
30
|
+
// URN: component:orders:checkout:OrderRow:backend:presentation // ✓
|
|
31
|
+
exceptions:
|
|
32
|
+
- Structural names are exempt: composition, wagon, entrypoint, http, index, schema, router, routes, server, layout, partial, fragment, middleware.
|
|
33
|
+
- Comparison ignores case and non-alphanumerics, so `order-row.ts` matches `OrderRow`.
|
|
34
|
+
- URNs that are not six segments are skipped.
|
|
35
|
+
metadata:
|
|
36
|
+
aliases:
|
|
37
|
+
# GREEN-URN-004 is the SHARED core alias — the same one carried by the Python
|
|
38
|
+
# realization and by coder.vite.green-urn-name-matches. One obligation, three
|
|
39
|
+
# per-stack detectors, found through this alias.
|
|
40
|
+
- GREEN-URN-004
|
|
41
|
+
- BUN-GREEN-URN-NAME-MATCHES-001
|
|
42
|
+
severity: 2
|
|
43
|
+
# DIVERGENCE FROM THE VITE/PYTHON REALIZATIONS, deliberate and reversible.
|
|
44
|
+
# Those two carry `documentation-only`, which core's coverage_report treats as
|
|
45
|
+
# never-fails-the-build — the right call when RETROFITTING a large existing
|
|
46
|
+
# codebase, where day-one enforcement would red every file at once.
|
|
47
|
+
# A new Bun + htmx repo has no such debt: headers can be present from the first
|
|
48
|
+
# file, and a traceability rule that cannot fail is a rule that will quietly not
|
|
49
|
+
# be adopted. `suppress-and-clean` fails on violation AND is ratchetable, so an
|
|
50
|
+
# existing repo adopting this can still `--record-ratchet` a baseline and be held
|
|
51
|
+
# flat rather than blocked. Change this one field back to `documentation-only`
|
|
52
|
+
# for exact Vite parity.
|
|
53
|
+
disposition: suppress-and-clean
|
|
54
|
+
introduced_in: 0.1.0
|
|
55
|
+
implementation:
|
|
56
|
+
type: validator
|
|
57
|
+
ref: bun_green_traceability_detector
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.green-urn-pattern
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: The URN has all six segments in the canonical order
|
|
6
|
+
statement: >-
|
|
7
|
+
A `URN:` marker MUST read `component:{wagon}:{feature}:{Name}:{side}:{layer}` — literal `component`
|
|
8
|
+
first, then exactly five non-empty segments. Stack-neutral obligation, Bun-specific detector; realized
|
|
9
|
+
by `bun_green_traceability_detector` (core alias GREEN-URN-002).
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: six_segment_urn
|
|
12
|
+
text: >-
|
|
13
|
+
`component:{wagon}:{feature}:{Name}:{side}:{layer}` — the literal `component` plus five non-
|
|
14
|
+
empty segments.
|
|
15
|
+
- term_id: join_key
|
|
16
|
+
text: >-
|
|
17
|
+
a URN segment used to resolve the file against plan/. A missing segment does not degrade: it
|
|
18
|
+
resolves to nothing while still looking traceable.
|
|
19
|
+
content:
|
|
20
|
+
summary: >-
|
|
21
|
+
A "the URN is well-formed" obligation. The detector splits the marker on `:` and requires six
|
|
22
|
+
segments, the first literally `component`, none empty. Files with no marker are skipped — their
|
|
23
|
+
finding belongs to `green-urn-marker`, and reporting both would double-count one fault.
|
|
24
|
+
normative_text: |
|
|
25
|
+
Each segment is a join key. Wagon and feature locate the work item, name identifies the component, side and layer place it in the architecture. A URN missing a segment does not degrade gracefully — it resolves to nothing, and the file is as unbound as one with no marker at all, while LOOKING traceable in review.
|
|
26
|
+
fix_hint: |
|
|
27
|
+
Supply every segment:
|
|
28
|
+
|
|
29
|
+
// URN: component:orders:checkout:OrderRow // ✗ four segments
|
|
30
|
+
// URN: component:orders:checkout:OrderRow:backend:presentation // ✓
|
|
31
|
+
exceptions:
|
|
32
|
+
- A file with no `URN:` marker is skipped (owned by `green-urn-marker`).
|
|
33
|
+
- Segment CONTENT is validated by the wagon-feature, name, side and layer rules; this rule checks shape only.
|
|
34
|
+
metadata:
|
|
35
|
+
aliases:
|
|
36
|
+
# GREEN-URN-002 is the SHARED core alias — the same one carried by the Python
|
|
37
|
+
# realization and by coder.vite.green-urn-pattern. One obligation, three
|
|
38
|
+
# per-stack detectors, found through this alias.
|
|
39
|
+
- GREEN-URN-002
|
|
40
|
+
- BUN-GREEN-URN-PATTERN-001
|
|
41
|
+
severity: 3
|
|
42
|
+
# DIVERGENCE FROM THE VITE/PYTHON REALIZATIONS, deliberate and reversible.
|
|
43
|
+
# Those two carry `documentation-only`, which core's coverage_report treats as
|
|
44
|
+
# never-fails-the-build — the right call when RETROFITTING a large existing
|
|
45
|
+
# codebase, where day-one enforcement would red every file at once.
|
|
46
|
+
# A new Bun + htmx repo has no such debt: headers can be present from the first
|
|
47
|
+
# file, and a traceability rule that cannot fail is a rule that will quietly not
|
|
48
|
+
# be adopted. `suppress-and-clean` fails on violation AND is ratchetable, so an
|
|
49
|
+
# existing repo adopting this can still `--record-ratchet` a baseline and be held
|
|
50
|
+
# flat rather than blocked. Change this one field back to `documentation-only`
|
|
51
|
+
# for exact Vite parity.
|
|
52
|
+
disposition: suppress-and-clean
|
|
53
|
+
introduced_in: 0.1.0
|
|
54
|
+
implementation:
|
|
55
|
+
type: validator
|
|
56
|
+
ref: bun_green_traceability_detector
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.green-urn-side
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: The URN side segment is frontend or backend
|
|
6
|
+
statement: >-
|
|
7
|
+
The `{side}` segment of a URN MUST be `frontend` or `backend`. Stack-neutral obligation, Bun-specific
|
|
8
|
+
detector; realized by `bun_green_traceability_detector` (core alias GREEN-URN-005).
|
|
9
|
+
terms:
|
|
10
|
+
- term_id: side_segment
|
|
11
|
+
text: >-
|
|
12
|
+
segment 4: `frontend` or `backend`. Which half of the application the file belongs to.
|
|
13
|
+
- term_id: stack_spanning_repo
|
|
14
|
+
text: >-
|
|
15
|
+
a repo where one language and one runtime serve both halves, so side cannot be inferred from
|
|
16
|
+
the stack and must be declared per file.
|
|
17
|
+
content:
|
|
18
|
+
summary: >-
|
|
19
|
+
A "side is declared from the closed vocabulary" obligation, checked against segment 4.
|
|
20
|
+
normative_text: |
|
|
21
|
+
The vocabulary is unchanged from the Python and Vite realizations, and it matters MORE in a full-stack Bun app than in either. A Vite repo is frontend by construction and a python-pytest service is backend by construction, so the segment is close to redundant there. Here one repo, one language and one runtime span both halves, and the only thing that says which side a module belongs to is this segment — so it must be declared per file and cannot be inferred from the stack.
|
|
22
|
+
fix_hint: |
|
|
23
|
+
Declare the side explicitly:
|
|
24
|
+
|
|
25
|
+
// URN: component:orders:checkout:OrderRow:server:presentation // ✗ not a side
|
|
26
|
+
// URN: component:orders:checkout:OrderRow:backend:presentation // ✓
|
|
27
|
+
|
|
28
|
+
Server-rendered htmx fragments are `backend` (they are produced by the server); markup and behaviour that live in the browser are `frontend`.
|
|
29
|
+
exceptions:
|
|
30
|
+
- URNs that are not six segments are skipped.
|
|
31
|
+
- "`Runtime:` is a different axis — a `backend` file may declare `Runtime: isomorphic`."
|
|
32
|
+
metadata:
|
|
33
|
+
aliases:
|
|
34
|
+
# GREEN-URN-005 is the SHARED core alias — the same one carried by the Python
|
|
35
|
+
# realization and by coder.vite.green-urn-side. One obligation, three
|
|
36
|
+
# per-stack detectors, found through this alias.
|
|
37
|
+
- GREEN-URN-005
|
|
38
|
+
- BUN-GREEN-URN-SIDE-001
|
|
39
|
+
severity: 3
|
|
40
|
+
# DIVERGENCE FROM THE VITE/PYTHON REALIZATIONS, deliberate and reversible.
|
|
41
|
+
# Those two carry `documentation-only`, which core's coverage_report treats as
|
|
42
|
+
# never-fails-the-build — the right call when RETROFITTING a large existing
|
|
43
|
+
# codebase, where day-one enforcement would red every file at once.
|
|
44
|
+
# A new Bun + htmx repo has no such debt: headers can be present from the first
|
|
45
|
+
# file, and a traceability rule that cannot fail is a rule that will quietly not
|
|
46
|
+
# be adopted. `suppress-and-clean` fails on violation AND is ratchetable, so an
|
|
47
|
+
# existing repo adopting this can still `--record-ratchet` a baseline and be held
|
|
48
|
+
# flat rather than blocked. Change this one field back to `documentation-only`
|
|
49
|
+
# for exact Vite parity.
|
|
50
|
+
disposition: suppress-and-clean
|
|
51
|
+
introduced_in: 0.1.0
|
|
52
|
+
implementation:
|
|
53
|
+
type: validator
|
|
54
|
+
ref: bun_green_traceability_detector
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.green-urn-wagon-feature
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: URN wagon and feature segments are kebab-case identifiers
|
|
6
|
+
statement: >-
|
|
7
|
+
The `{wagon}` and `{feature}` segments of a URN MUST match `^[a-z][a-z0-9-]*$`. Stack-neutral
|
|
8
|
+
obligation, Bun-specific detector; realized by `bun_green_traceability_detector` (core alias GREEN-
|
|
9
|
+
URN-003).
|
|
10
|
+
terms:
|
|
11
|
+
- term_id: kebab_identifier
|
|
12
|
+
text: >-
|
|
13
|
+
`^[a-z][a-z0-9-]*$` — the plan's own grammar for wagon and feature names.
|
|
14
|
+
- term_id: silent_join_failure
|
|
15
|
+
text: >-
|
|
16
|
+
the state where a header reads correctly to a human but binds to nothing, because a case- or
|
|
17
|
+
separator-sensitive key did not match.
|
|
18
|
+
content:
|
|
19
|
+
summary: >-
|
|
20
|
+
A "URN identifiers are kebab-case" obligation. The detector applies the pattern to segments 1 and 2 of
|
|
21
|
+
a well-formed six-segment URN, naming whichever fail.
|
|
22
|
+
normative_text: |
|
|
23
|
+
Wagon and feature are join keys into `plan/`, and a join key that is case- or separator-sensitive fails silently: `Orders` and `orders` are two different wagons to a string match, so a header with the wrong casing binds to nothing while reading correctly to a human. Kebab-case is the plan's own grammar, so the header must use it exactly.
|
|
24
|
+
fix_hint: |
|
|
25
|
+
Lower-case and hyphenate:
|
|
26
|
+
|
|
27
|
+
// URN: component:Orders:Check_Out:OrderRow:backend:presentation // ✗
|
|
28
|
+
// URN: component:orders:check-out:OrderRow:backend:presentation // ✓
|
|
29
|
+
|
|
30
|
+
The `{Name}` segment is deliberately NOT kebab — it mirrors the filename and keeps its own casing.
|
|
31
|
+
exceptions:
|
|
32
|
+
- URNs that are not six well-formed segments are skipped (owned by `green-urn-pattern`).
|
|
33
|
+
- The name, side and layer segments are governed by their own rules.
|
|
34
|
+
metadata:
|
|
35
|
+
aliases:
|
|
36
|
+
# GREEN-URN-003 is the SHARED core alias — the same one carried by the Python
|
|
37
|
+
# realization and by coder.vite.green-urn-wagon-feature. One obligation, three
|
|
38
|
+
# per-stack detectors, found through this alias.
|
|
39
|
+
- GREEN-URN-003
|
|
40
|
+
- BUN-GREEN-URN-WAGON-FEATURE-001
|
|
41
|
+
severity: 3
|
|
42
|
+
# DIVERGENCE FROM THE VITE/PYTHON REALIZATIONS, deliberate and reversible.
|
|
43
|
+
# Those two carry `documentation-only`, which core's coverage_report treats as
|
|
44
|
+
# never-fails-the-build — the right call when RETROFITTING a large existing
|
|
45
|
+
# codebase, where day-one enforcement would red every file at once.
|
|
46
|
+
# A new Bun + htmx repo has no such debt: headers can be present from the first
|
|
47
|
+
# file, and a traceability rule that cannot fail is a rule that will quietly not
|
|
48
|
+
# be adopted. `suppress-and-clean` fails on violation AND is ratchetable, so an
|
|
49
|
+
# existing repo adopting this can still `--record-ratchet` a baseline and be held
|
|
50
|
+
# flat rather than blocked. Change this one field back to `documentation-only`
|
|
51
|
+
# for exact Vite parity.
|
|
52
|
+
disposition: suppress-and-clean
|
|
53
|
+
introduced_in: 0.1.0
|
|
54
|
+
implementation:
|
|
55
|
+
type: validator
|
|
56
|
+
ref: bun_green_traceability_detector
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.interlocking-bilateral-binding
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Interlocking declarations and runtime route resolution are bilaterally bound (Bun)
|
|
6
|
+
statement: >-
|
|
7
|
+
An interlocking system is systemic, not descriptive: it requires CLOSURE across declaration (the
|
|
8
|
+
interlocking YAML route space, core afokapu/atdd#1248), runtime resolution (InterlockingRunner,
|
|
9
|
+
core afokapu/atdd#1251), Station Master reachability (the `server.ts` JOURNEY_MAP), TrainRunner
|
|
10
|
+
delegation, and the execution trace. This convention binds those surfaces in FIVE directions so a
|
|
11
|
+
declared route, a runtime resolution, a Station Master action, and a recorded trace can never drift
|
|
12
|
+
apart silently. This is the Bun-stack realization of the agnostic core obligation
|
|
13
|
+
`coder.train.interlocking-bilateral-binding`; the JS detector `bun_interlocking_binding` realizes
|
|
14
|
+
all five directions and emits this single rule_id with the failing `direction` named in the evidence.
|
|
15
|
+
|
|
16
|
+
# Machine-readable bilateral relationship (the five binding directions + the schema-drift signal).
|
|
17
|
+
# Each direction names the fixture the JS detector fails on and passes the clean tree.
|
|
18
|
+
bidirectional:
|
|
19
|
+
- direction: declaration_to_runtime
|
|
20
|
+
requirement: >-
|
|
21
|
+
Every declared route resolves through InterlockingRunner to the declared trainId — the route's
|
|
22
|
+
train artifact (train_path / plan/_trains/<train_id>.yaml) must exist so the runtime can load it.
|
|
23
|
+
fail_fixture: fixtures/dirty
|
|
24
|
+
- direction: runtime_to_declaration
|
|
25
|
+
requirement: >-
|
|
26
|
+
InterlockingRunner never resolves a routeId/trainId absent from the loaded YAML; a runtime that
|
|
27
|
+
returns a routeId/selectedTrainId literal not declared in any interlocking is a hidden route.
|
|
28
|
+
fail_fixture: fixtures/dirty_runtime_hidden
|
|
29
|
+
- direction: station_to_declaration
|
|
30
|
+
requirement: >-
|
|
31
|
+
Every Station Master interlocking mapping ({interlockingId, path}) points to an existing
|
|
32
|
+
interlocking YAML — a mapping whose path resolves to no file (or names an undeclared
|
|
33
|
+
interlockingId) is a dangling route.
|
|
34
|
+
fail_fixture: fixtures/dirty_station_missing
|
|
35
|
+
- direction: declaration_to_station
|
|
36
|
+
requirement: >-
|
|
37
|
+
Every interlocking with core entrypoint.exposed=true is Station-Master-reachable through one of
|
|
38
|
+
its core entrypoint.actions wired into the JOURNEY_MAP to that interlocking. CONSUMES core
|
|
39
|
+
afokapu/atdd#1248 entrypoint.exposed + entrypoint.actions; this extension defines NO parallel
|
|
40
|
+
reachability field (entrypoints, runtime_exposure, station_actions, exposed_actions, reachability).
|
|
41
|
+
fail_fixture: fixtures/dirty_unreachable
|
|
42
|
+
- direction: trace_to_declaration
|
|
43
|
+
requirement: >-
|
|
44
|
+
Every executed interlocking route emits trace metadata that resolves back to the source YAML — a
|
|
45
|
+
trace test asserting trace.routeId / trace.interlockingId values absent from the declared route
|
|
46
|
+
space does not bind the run to its declaration (core afokapu/atdd#1251 trace contract).
|
|
47
|
+
fail_fixture: fixtures/dirty_trace
|
|
48
|
+
|
|
49
|
+
implementation:
|
|
50
|
+
type: validator
|
|
51
|
+
ref: coder.bun.interlocking-bilateral-binding
|
|
52
|
+
|
|
53
|
+
content:
|
|
54
|
+
summary: >-
|
|
55
|
+
A bilateral-binding obligation that makes train interlocking SYSTEMIC, rendered for the Bun
|
|
56
|
+
backend. One JS detector (bun_interlocking_binding) walks a consumer tree's interlocking YAML
|
|
57
|
+
route space (plan/_trains/_interlockings/**), Station Master JOURNEY_MAP (server.ts),
|
|
58
|
+
InterlockingRunner runtime (src/trains/**), and e2e trace tests (e2e/**), and emits RAW v1.1
|
|
59
|
+
violations under this rule_id for any of the five binding directions that is broken — plus a
|
|
60
|
+
schema-drift signal when a parallel reachability field is used instead of core #1248's `entrypoint`.
|
|
61
|
+
normative_text: |
|
|
62
|
+
Core runtime spec afokapu/atdd#1251 — the additive call model whose closure this rule enforces:
|
|
63
|
+
|
|
64
|
+
plan/_trains/_interlockings/<id>.yaml (declaration, core #1248)
|
|
65
|
+
-> entrypoint.actions[] (core #1248 entrypoint field — CONSUMED here)
|
|
66
|
+
-> Station Master JOURNEY_MAP action (reachability, server.ts)
|
|
67
|
+
-> InterlockingRunner.resolveTrain(...) (runtime, core #1251)
|
|
68
|
+
-> InterlockingResolution(routeId, trainId, category, guardId, resolutionStrategy, ...)
|
|
69
|
+
-> TrainRunner.execute(selectedTrainId) (delegation)
|
|
70
|
+
-> trace(interlockingId, routeId, selectedTrainId, ...)
|
|
71
|
+
-> validator resolves the trace back to the YAML route
|
|
72
|
+
|
|
73
|
+
OWNERSHIP SPLIT (collision prevention): core afokapu/atdd#1248/#1249 own the interlocking YAML
|
|
74
|
+
schema and the SHAPE/allowed values of the `entrypoint` field. This extension only READS those
|
|
75
|
+
core fields to validate REACHABILITY against Station Master and runtime traces in a consumer repo.
|
|
76
|
+
It MUST NOT introduce `entrypoints`, `runtime_exposure`, `station_actions`, `exposed_actions`,
|
|
77
|
+
`reachability`, or any other parallel reachability field. If core #1248 changes the field name or
|
|
78
|
+
shape, this rule follows core and updates its detector/fixtures.
|
|
79
|
+
fix_hint: |
|
|
80
|
+
Close the broken binding direction named in the violation's evidence:
|
|
81
|
+
|
|
82
|
+
declaration_to_runtime — add the missing train artifact the declared route resolves to.
|
|
83
|
+
runtime_to_declaration — remove the hidden routeId/trainId literal, or declare it in the YAML.
|
|
84
|
+
station_to_declaration — fix the JOURNEY_MAP interlocking path to point at the real YAML.
|
|
85
|
+
declaration_to_station — wire the exposed interlocking's entrypoint.action into JOURNEY_MAP (or
|
|
86
|
+
set entrypoint.exposed:false with a reason if it is genuinely internal).
|
|
87
|
+
trace_to_declaration — assert the trace's interlockingId/routeId values that are declared.
|
|
88
|
+
schema drift — replace any parallel reachability field with core #1248's `entrypoint`.
|
|
89
|
+
|
|
90
|
+
This rule is `strict`: a broken binding direction lets declaration, runtime, Station Master, and
|
|
91
|
+
trace drift apart silently and therefore blocks CI.
|
|
92
|
+
exceptions:
|
|
93
|
+
- Interlockings with entrypoint.exposed:false (internal-transition-only / library-only /
|
|
94
|
+
planned-not-exposed) carry no Station-Master-reachability obligation (declaration_to_station).
|
|
95
|
+
- A consumer tree with no interlocking route space and no InterlockingRunner is not an interlocking
|
|
96
|
+
system; the rule does not bite.
|
|
97
|
+
- Per-stack renderings other than Bun are owned by their own workspace packages.
|
|
98
|
+
|
|
99
|
+
metadata:
|
|
100
|
+
aliases:
|
|
101
|
+
- BUN-INTERLOCKING-BILATERAL-BINDING-001
|
|
102
|
+
severity: 1
|
|
103
|
+
disposition: strict
|
|
104
|
+
introduced_in: 0.1.0
|
|
105
|
+
core_design_refs:
|
|
106
|
+
- afokapu/atdd#1246
|
|
107
|
+
- afokapu/atdd#1248
|
|
108
|
+
- afokapu/atdd#1249
|
|
109
|
+
- afokapu/atdd#1251
|
|
110
|
+
|
|
111
|
+
notes: >-
|
|
112
|
+
DISPOSITION JUSTIFICATION (strict, severity 1). Bilateral binding is what makes interlocking a
|
|
113
|
+
route-control SYSTEM rather than a description. A broken binding direction — an unresolvable declared
|
|
114
|
+
route, a hidden runtime route, a dangling Station Master mapping, an unreachable exposed interlocking,
|
|
115
|
+
or a trace that does not resolve to its declaration — is the exact silent-drift failure class the
|
|
116
|
+
train-interlocking design (afokapu/atdd#1246) exists to close. The detector emits RAW facts only; the
|
|
117
|
+
strict verdict is applied by a downstream gate. Per boundary spec §6.2 the core contracts are
|
|
118
|
+
referenced NARRATIVELY, and the core `entrypoint` field is CONSUMED, never forked.
|
|
119
|
+
|
|
120
|
+
terms:
|
|
121
|
+
- term_id: bilateral_binding
|
|
122
|
+
text: >-
|
|
123
|
+
the property that interlocking declaration, runtime resolution, Station Master reachability, and
|
|
124
|
+
execution trace are bound in both directions so none can drift from the others undetected.
|
|
125
|
+
- term_id: hidden_route
|
|
126
|
+
text: >-
|
|
127
|
+
a routeId/selectedTrainId the InterlockingRunner runtime resolves that is declared in no
|
|
128
|
+
interlocking YAML — a runtime-to-declaration binding break.
|
|
129
|
+
- term_id: parallel_reachability_field
|
|
130
|
+
text: >-
|
|
131
|
+
any non-core reachability field (entrypoints, runtime_exposure, station_actions, exposed_actions,
|
|
132
|
+
reachability) that forks core afokapu/atdd#1248's `entrypoint`; using one is schema drift.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.bun.interlocking-delegates-to-trainrunner
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: InterlockingRunner delegates execution to TrainRunner and never executes wagons itself (Bun)
|
|
6
|
+
statement: >-
|
|
7
|
+
An `InterlockingRunner` MUST NOT execute wagons directly or duplicate the TrainRunner step loop. The
|
|
8
|
+
InterlockingRunner-defining module MUST NOT import a `src/<wagon>/wagon.ts` module, call
|
|
9
|
+
`runTrain(...)`, loop over `<expr>.sequence` as an executor, or otherwise invoke wagon steps;
|
|
10
|
+
TrainRunner remains the only wagon-step executor. This is the Bun-stack realization of the agnostic
|
|
11
|
+
core obligation `coder.train.interlocking-delegates-to-trainrunner` (core afokapu/atdd#1251); the JS
|
|
12
|
+
detector that enforces it is the atdd.workspace.bun implementation referenced below.
|
|
13
|
+
implementation:
|
|
14
|
+
type: validator
|
|
15
|
+
ref: coder.bun.interlocking-delegates-to-trainrunner
|
|
16
|
+
content:
|
|
17
|
+
summary: >-
|
|
18
|
+
An agnostic "route-control, not execution" obligation, rendered for the Bun application. The JS
|
|
19
|
+
realization scans each InterlockingRunner-defining module under `src/trains/**` and flags a direct
|
|
20
|
+
wagon import, a `runTrain(...)` call, or a `for (... of <expr>.sequence)` executor loop. Member of the
|
|
21
|
+
`bun_interlocking_infrastructure` FAMILY detector (checks/interlocking_delegates.mjs).
|
|
22
|
+
normative_text: |
|
|
23
|
+
Core runtime spec afokapu/atdd#1251 — the InterlockingRunner "must not": execute wagon steps, choose
|
|
24
|
+
the next train step inside a train, bypass TrainRunner, or duplicate TrainRunner's execution loop. It
|
|
25
|
+
resolves one admissible train and DELEGATES to `TrainRunner.execute(selectedTrainId, ...)`. The
|
|
26
|
+
production TrainRunner is the single component that runs wagons and carries Cargo between them. WHICH
|
|
27
|
+
module is scanned (the InterlockingRunner-defining files) and HOW the forbidden patterns are
|
|
28
|
+
recognized is the per-stack detector's concern; the TrainRunner module's own step loop is legitimate
|
|
29
|
+
and not flagged.
|
|
30
|
+
fix_hint: |
|
|
31
|
+
Delegate instead of executing:
|
|
32
|
+
|
|
33
|
+
execute(action, inputs, state) {
|
|
34
|
+
const res = this.resolveTrain(action, inputs, state);
|
|
35
|
+
return new TrainRunner(res.trainPath).execute(res.trainId, inputs); // delegate, do not loop
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
Do NOT import a wagon module, call `runTrain(...)`, or loop over `train.sequence` in interlocking code.
|
|
39
|
+
This rule is `strict`: a newly introduced direct-execution pattern is not suppressible and fails CI.
|
|
40
|
+
exceptions:
|
|
41
|
+
- The production `TrainRunner` module is the legitimate wagon-step executor; only
|
|
42
|
+
InterlockingRunner-defining modules are scanned for direct execution.
|
|
43
|
+
metadata:
|
|
44
|
+
aliases:
|
|
45
|
+
- BUN-INTERLOCKING-DELEGATES-TRAINRUNNER-001
|
|
46
|
+
severity: 4
|
|
47
|
+
disposition: strict
|
|
48
|
+
introduced_in: 0.1.0
|
|
49
|
+
core_design_refs:
|
|
50
|
+
- afokapu/atdd#1246
|
|
51
|
+
- afokapu/atdd#1251
|
|
52
|
+
terms:
|
|
53
|
+
- term_id: direct_wagon_execution
|
|
54
|
+
text: >-
|
|
55
|
+
an InterlockingRunner module importing a wagon module, calling `runTrain(...)`, or looping over
|
|
56
|
+
`<expr>.sequence` as a step executor — competing with TrainRunner.
|