@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.htmx.swap-oob-carries-id
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Out-of-band swap elements declare the id they swap into
|
|
6
|
+
statement: >-
|
|
7
|
+
Every element carrying `hx-swap-oob` MUST also carry an `id`. htmx matches an out-of-band element to
|
|
8
|
+
its destination BY ID; an oob element with no id has no destination, so htmx discards it silently —
|
|
9
|
+
no error, no console warning, no swap. This is the Bun/htmx-stack realization of the agnostic
|
|
10
|
+
"a declarative binding must name its target" obligation, enforced by the `htmx_hypermedia_detector`
|
|
11
|
+
family implementation on `atdd.workspace.bun`.
|
|
12
|
+
terms:
|
|
13
|
+
- term_id: out_of_band_swap
|
|
14
|
+
text: >-
|
|
15
|
+
`hx-swap-oob` marks an element in a response for swapping somewhere OTHER than the requesting
|
|
16
|
+
element's target — the mechanism for updating a cart badge, a flash region or a sidebar count from
|
|
17
|
+
a response whose main target is elsewhere.
|
|
18
|
+
- term_id: silent_discard
|
|
19
|
+
text: >-
|
|
20
|
+
htmx's behaviour when no element in the document matches the oob element's id: it drops the
|
|
21
|
+
fragment and continues. The failure is invisible at every layer — the server logs a 200, the
|
|
22
|
+
network tab shows the markup arriving, and the page does not change.
|
|
23
|
+
content:
|
|
24
|
+
summary: >-
|
|
25
|
+
An "oob swaps name their destination" obligation. The realization is a zero-dependency Bun detector
|
|
26
|
+
that locates each `hx-swap-oob` occurrence, extracts the enclosing opening tag with a quote-aware
|
|
27
|
+
scan (so a `>` inside an attribute value does not end the tag early), and flags the element when
|
|
28
|
+
that tag carries no `id="…"` or JSX `id={…}`.
|
|
29
|
+
normative_text: |
|
|
30
|
+
This is the highest-frequency silent bug in an htmx codebase, and it presents to the developer as
|
|
31
|
+
"the server is definitely returning it but the page doesn't update" — which sends people to debug
|
|
32
|
+
the server, the route, and the response headers, none of which are wrong.
|
|
33
|
+
The obligation is that an out-of-band fragment names its destination. WHERE the id must appear is
|
|
34
|
+
part of the rule: on the oob element itself, not on a wrapper, because htmx reads the id from the
|
|
35
|
+
element carrying the attribute.
|
|
36
|
+
fix_hint: |
|
|
37
|
+
Give the oob element the id of the element it replaces:
|
|
38
|
+
|
|
39
|
+
<div class="cart-count" hx-swap-oob="true">3</div> <!-- ✗ no destination; dropped -->
|
|
40
|
+
<div id="cart-count" hx-swap-oob="true">3</div> <!-- ✓ swaps into #cart-count -->
|
|
41
|
+
|
|
42
|
+
The id must match an element that EXISTS in the current document; an id that matches nothing is
|
|
43
|
+
dropped just as silently, which this rule cannot see and a smoke test must. `strict`.
|
|
44
|
+
exceptions:
|
|
45
|
+
- An element whose id is supplied dynamically as a JSX expression (`id={rowId}`) satisfies the rule —
|
|
46
|
+
the binding is present; whether it resolves is a runtime concern.
|
|
47
|
+
- "`hx-swap` (in-band) is out of scope: it swaps into `hx-target`, a selector, not an id."
|
|
48
|
+
metadata:
|
|
49
|
+
aliases:
|
|
50
|
+
- HTMX-OOB-ID-001
|
|
51
|
+
severity: 2
|
|
52
|
+
disposition: strict
|
|
53
|
+
introduced_in: 0.1.0
|
|
54
|
+
implementation:
|
|
55
|
+
type: validator
|
|
56
|
+
ref: htmx_hypermedia_detector
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.htmx.verb-destructive-confirms
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Destructive htmx requests declare a confirmation
|
|
6
|
+
statement: >-
|
|
7
|
+
Every element carrying `hx-delete` MUST also carry `hx-confirm` (or `hx-prompt`). In a hypermedia
|
|
8
|
+
application a delete is one attribute on a clickable element: there is no form submit, no route
|
|
9
|
+
transition and no framework guard between the user's click and the destructive request.
|
|
10
|
+
`hx-confirm` IS that guard, and it is declarative precisely so it cannot be forgotten. This is the
|
|
11
|
+
Bun/htmx-stack realization of the agnostic "a destructive action requires explicit intent"
|
|
12
|
+
obligation, enforced by the `htmx_hypermedia_detector` family implementation on
|
|
13
|
+
`atdd.workspace.bun`.
|
|
14
|
+
terms:
|
|
15
|
+
- term_id: destructive_verb
|
|
16
|
+
text: >-
|
|
17
|
+
`hx-delete`. `hx-post`/`hx-put`/`hx-patch` are mutating but not inherently destructive — they are
|
|
18
|
+
governed by `coder.htmx.verb-mutation-signals-progress` instead.
|
|
19
|
+
- term_id: declared_confirmation
|
|
20
|
+
text: >-
|
|
21
|
+
`hx-confirm="…"` (a yes/no gate) or `hx-prompt="…"` (a gate requiring typed input). Either
|
|
22
|
+
satisfies the obligation; which one is a product decision about how much friction the action
|
|
23
|
+
deserves.
|
|
24
|
+
content:
|
|
25
|
+
summary: >-
|
|
26
|
+
A "deletes are confirmed" obligation. The realization is a zero-dependency Bun detector that finds
|
|
27
|
+
each `hx-delete`, extracts the enclosing opening tag with a quote-aware scan, and flags the element
|
|
28
|
+
when that tag carries neither `hx-confirm` nor `hx-prompt`.
|
|
29
|
+
normative_text: |
|
|
30
|
+
In a component framework a destructive action typically passes through a handler, and the
|
|
31
|
+
confirmation lives in that handler where a reviewer sees it. htmx removes the handler — which is
|
|
32
|
+
the point — and with it removes the place the confirmation used to live. The obligation therefore
|
|
33
|
+
has to be relocated onto the element and enforced there, or it is simply lost in the migration.
|
|
34
|
+
The rule checks CO-LOCATION on the same element, not mere presence in the file: a confirmation on
|
|
35
|
+
a neighbouring control protects nothing.
|
|
36
|
+
fix_hint: |
|
|
37
|
+
Put the confirmation on the element that issues the delete:
|
|
38
|
+
|
|
39
|
+
<button hx-delete="/orders/7">Delete</button> <!-- ✗ unguarded -->
|
|
40
|
+
<button hx-delete="/orders/7" hx-confirm="Delete order 7?">Delete</button> <!-- ✓ -->
|
|
41
|
+
|
|
42
|
+
For high-value deletions prefer `hx-prompt` so the user must type something meaningful rather than
|
|
43
|
+
reflexively clicking OK. `strict` — an unguarded delete is not suppressible.
|
|
44
|
+
exceptions:
|
|
45
|
+
- An element carrying `hx-prompt` instead of `hx-confirm` satisfies the rule.
|
|
46
|
+
- A delete implemented as a `hx-post` to an explicit `/…/delete` route is not detected by this rule;
|
|
47
|
+
that is a naming choice the rule cannot see, and it is why the verb should be `hx-delete`.
|
|
48
|
+
metadata:
|
|
49
|
+
aliases:
|
|
50
|
+
- HTMX-DELETE-CONFIRM-001
|
|
51
|
+
severity: 2
|
|
52
|
+
disposition: strict
|
|
53
|
+
introduced_in: 0.1.0
|
|
54
|
+
implementation:
|
|
55
|
+
type: validator
|
|
56
|
+
ref: htmx_hypermedia_detector
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.htmx.verb-endpoint-is-routed
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: A mutating htmx endpoint is served by the Station Master surface (Bun/htmx)
|
|
6
|
+
statement: >-
|
|
7
|
+
An endpoint declared by a STATE-CHANGING htmx verb (`hx-post`, `hx-put`, `hx-patch`, `hx-delete`)
|
|
8
|
+
MUST be served by the Station Master surface — the module declaring the `JOURNEY_MAP`. htmx
|
|
9
|
+
declares its route space in the MARKUP, which is what makes it hypermedia; without this, that
|
|
10
|
+
markup can mint a state-advancing route the journey space never admitted, and the affordance posts
|
|
11
|
+
into nothing.
|
|
12
|
+
implementation:
|
|
13
|
+
type: validator
|
|
14
|
+
ref: coder.htmx.verb-endpoint-is-routed
|
|
15
|
+
content:
|
|
16
|
+
summary: >-
|
|
17
|
+
Binds htmx's markup route space to the declared journey space. The JS realization finds the
|
|
18
|
+
module declaring a `JOURNEY_MAP`, collects every statically written mutating verb endpoint, and
|
|
19
|
+
flags one the Station Master names nowhere. Member of the `htmx_hypermedia_detector` FAMILY
|
|
20
|
+
detector (checks/htmx_verb_endpoint_is_routed.mjs).
|
|
21
|
+
normative_text: |
|
|
22
|
+
`tester.htmx.verb-endpoint-coverage` states this stack's premise plainly — "an htmx endpoint is
|
|
23
|
+
declared in the MARKUP, so the markup is this stack's route space". That is right, and it is
|
|
24
|
+
also the hole. Measured on a consumer: an `hx-post="/orders/void-all"` carrying a confirm, an
|
|
25
|
+
indicator and a passing test, bound to no wagon, train or interlocking, passed EVERY gated
|
|
26
|
+
bun+htmx rule.
|
|
27
|
+
|
|
28
|
+
This is the parallel-route-space shape the hub already rejects elsewhere. The interlocking
|
|
29
|
+
families fail a consumer that declares reachability in a second, private field instead of the
|
|
30
|
+
declared one; htmx had the same hole with none of the teeth.
|
|
31
|
+
|
|
32
|
+
MUTATIONS ONLY, DELIBERATELY. `hx-get` fetches a fragment — presentation — and requiring every
|
|
33
|
+
read to be routed by the Station Master would fail ordinary htmx. The mutating verbs advance
|
|
34
|
+
state, which is what a journey does, so those are the ones that owe a route.
|
|
35
|
+
|
|
36
|
+
STATIC PATHS ONLY. An endpoint built by interpolation (`/orders/${id}/void`) cannot be compared
|
|
37
|
+
to a server route by text, and guessing would report on correct code. Those are skipped, exactly
|
|
38
|
+
as the Vite family treats an unresolvable trainId as advisory rather than inventing a verdict.
|
|
39
|
+
|
|
40
|
+
The Station Master is found by the JOURNEY_MAP it DECLARES, never by filename. Matching is on
|
|
41
|
+
the whole path or its distinctive terminal segment: matching any segment was the first attempt
|
|
42
|
+
and made the rule vacuous, because a Station Master importing from `./src/orders/` made every
|
|
43
|
+
`/orders/*` endpoint look routed.
|
|
44
|
+
|
|
45
|
+
NOT_APPLICABLE when no Station Master surface resolves — a consumer with no JOURNEY_MAP has no
|
|
46
|
+
journey space to be outside of.
|
|
47
|
+
fix_hint: |
|
|
48
|
+
Route the endpoint from the Station Master, or drop the affordance:
|
|
49
|
+
|
|
50
|
+
if (req.method === "POST" && path === "/orders/confirm") {
|
|
51
|
+
if (!authorize(req)) return Response.json({ code: "unauthorized" }, { status: 401 });
|
|
52
|
+
return orderRowFragment("1");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
A button added to markup ahead of its handler is the common cause. This rule is `strict`: a
|
|
56
|
+
state-changing affordance the server never routes is not suppressible and fails CI.
|
|
57
|
+
exceptions:
|
|
58
|
+
- "`hx-get` endpoints are NOT reported; fetching a fragment is presentation, not a journey."
|
|
59
|
+
- An endpoint written with interpolation is skipped rather than guessed at, preserving the
|
|
60
|
+
advisory treatment this hub gives statically unresolvable bindings.
|
|
61
|
+
metadata:
|
|
62
|
+
aliases:
|
|
63
|
+
- HTMX-VERB-ENDPOINT-ROUTED-001
|
|
64
|
+
severity: 4
|
|
65
|
+
disposition: strict
|
|
66
|
+
introduced_in: 0.2.0
|
|
67
|
+
core_design_refs:
|
|
68
|
+
- afokapu/atdd#1246
|
|
69
|
+
terms:
|
|
70
|
+
- term_id: journey_space
|
|
71
|
+
text: >-
|
|
72
|
+
the routes the Station Master admits, declared by the module carrying `JOURNEY_MAP`, which a
|
|
73
|
+
state-changing htmx endpoint must be served by.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.htmx.verb-endpoint-same-origin
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: htmx verb attributes address same-origin paths, never absolute URLs
|
|
6
|
+
statement: >-
|
|
7
|
+
Every htmx verb attribute (`hx-get`, `hx-post`, `hx-put`, `hx-patch`, `hx-delete`) MUST address a
|
|
8
|
+
same-origin path (`/api/orders`) and MUST NOT carry a hardcoded absolute or protocol-relative URL
|
|
9
|
+
(`https://host/…`, `//host/…`). htmx swaps the response body directly into the live DOM, so the
|
|
10
|
+
endpoint's origin is a trust boundary, not a configuration detail. This is the Bun/htmx-stack
|
|
11
|
+
realization of the agnostic "a client must not hardcode a foreign origin" obligation; the detector
|
|
12
|
+
that enforces it is the `htmx_hypermedia_detector` family implementation on
|
|
13
|
+
`atdd.workspace.bun`.
|
|
14
|
+
terms:
|
|
15
|
+
- term_id: verb_attribute
|
|
16
|
+
text: >-
|
|
17
|
+
one of `hx-get` / `hx-post` / `hx-put` / `hx-patch` / `hx-delete` — the attributes that make an
|
|
18
|
+
element issue an HTTP request.
|
|
19
|
+
- term_id: same_origin_path
|
|
20
|
+
text: >-
|
|
21
|
+
a root-relative path beginning `/`, resolved by the browser against the origin that served the
|
|
22
|
+
document. The correct form for every hypermedia control in the app.
|
|
23
|
+
content:
|
|
24
|
+
summary: >-
|
|
25
|
+
An "htmx endpoints are same-origin paths" obligation. The realization is a zero-dependency Bun
|
|
26
|
+
detector that scans `.html`/`.htm` templates and `.ts`/`.tsx`/`.js`/`.jsx`/`.mjs` source for a verb
|
|
27
|
+
attribute whose value begins `http://`, `https://` or `//`.
|
|
28
|
+
normative_text: |
|
|
29
|
+
A hardcoded foreign origin in a verb attribute fails three ways at once. It is a CORS failure the
|
|
30
|
+
moment the other origin stops sending permissive headers. It is an untrusted-HTML injection point,
|
|
31
|
+
because htmx inserts whatever comes back straight into the DOM — the response is markup, not data,
|
|
32
|
+
and there is no parse step that would reject it. And it is the standard mechanism by which a staging
|
|
33
|
+
host reaches production, since a baked-in `https://staging.example.com` is invisible to every
|
|
34
|
+
environment variable and every config review.
|
|
35
|
+
Cross-origin calls that are genuinely required belong behind a same-origin proxy route on the Bun
|
|
36
|
+
server, where the origin decision is made in one auditable place rather than scattered across
|
|
37
|
+
templates.
|
|
38
|
+
fix_hint: |
|
|
39
|
+
Replace the absolute URL with the path, and proxy if the upstream really is remote:
|
|
40
|
+
|
|
41
|
+
<div hx-get="https://api.example.com/orders"> <!-- ✗ foreign origin in markup -->
|
|
42
|
+
<div hx-get="/api/orders"> <!-- ✓ same-origin path -->
|
|
43
|
+
|
|
44
|
+
On the Bun side, route `/api/orders` through `Bun.serve` and let THAT handler call upstream. The
|
|
45
|
+
rule is `strict`: an absolute-URL endpoint is not suppressible.
|
|
46
|
+
exceptions:
|
|
47
|
+
- A path-only value (`/orders`, `./orders`, `orders`) is same-origin and never flagged.
|
|
48
|
+
- Non-verb htmx attributes (`hx-target`, `hx-swap`, `hx-trigger`) are out of scope — they carry
|
|
49
|
+
selectors and modifiers, not endpoints.
|
|
50
|
+
metadata:
|
|
51
|
+
aliases:
|
|
52
|
+
- HTMX-ENDPOINT-ORIGIN-001
|
|
53
|
+
severity: 2
|
|
54
|
+
disposition: strict
|
|
55
|
+
introduced_in: 0.1.0
|
|
56
|
+
implementation:
|
|
57
|
+
type: validator
|
|
58
|
+
ref: htmx_hypermedia_detector
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: coder.htmx.verb-mutation-signals-progress
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Mutating htmx requests signal that they are in flight
|
|
6
|
+
statement: >-
|
|
7
|
+
Every element issuing a mutating htmx request (`hx-post`, `hx-put`, `hx-patch`, `hx-delete`) MUST
|
|
8
|
+
declare either `hx-indicator` or `hx-disabled-elt`. htmx swaps in place with no navigation, so
|
|
9
|
+
without one of these the page is visually identical while the request is in flight: the user
|
|
10
|
+
receives no feedback, clicks again, and a non-idempotent request runs twice. This is the
|
|
11
|
+
Bun/htmx-stack realization of the agnostic "an in-flight mutation is observable" obligation, enforced
|
|
12
|
+
by the `htmx_hypermedia_detector` family implementation on `atdd.workspace.bun`.
|
|
13
|
+
terms:
|
|
14
|
+
- term_id: mutating_request
|
|
15
|
+
text: >-
|
|
16
|
+
`hx-post` / `hx-put` / `hx-patch` / `hx-delete` — a request that changes server state, so a
|
|
17
|
+
duplicate is not harmless.
|
|
18
|
+
- term_id: progress_signal
|
|
19
|
+
text: >-
|
|
20
|
+
`hx-indicator="…"` (show a spinner region for the duration) or `hx-disabled-elt="…"` (disable the
|
|
21
|
+
control for the duration). The first tells the user something is happening; the second makes the
|
|
22
|
+
double-submit physically impossible. Either satisfies the obligation.
|
|
23
|
+
content:
|
|
24
|
+
summary: >-
|
|
25
|
+
An "in-flight mutations are visible" obligation. The realization is a zero-dependency Bun detector
|
|
26
|
+
that finds each mutating verb attribute, extracts the enclosing opening tag, and flags the element
|
|
27
|
+
when it declares neither `hx-indicator` nor `hx-disabled-elt`. Findings are deduplicated per
|
|
28
|
+
element, so an element carrying two mutating verbs reports once.
|
|
29
|
+
normative_text: |
|
|
30
|
+
A full page navigation gave the user a free progress signal: the browser's own spinner and the page
|
|
31
|
+
going blank. Swapping a fragment in place gives none. This is the single most common complaint
|
|
32
|
+
about htmx applications from users, and it is not a taste issue — it produces duplicate orders,
|
|
33
|
+
duplicate charges and duplicate rows, because the user's model ("nothing happened, click again") is
|
|
34
|
+
a correct reading of what the page showed them.
|
|
35
|
+
GET is deliberately out of scope: a read is idempotent, so a duplicate is harmless and an indicator
|
|
36
|
+
there is a UX preference rather than an obligation.
|
|
37
|
+
fix_hint: |
|
|
38
|
+
Declare a progress signal on the element issuing the mutation:
|
|
39
|
+
|
|
40
|
+
<form hx-post="/orders">…</form> <!-- ✗ invisible in flight -->
|
|
41
|
+
<form hx-post="/orders" hx-indicator="#spinner">…</form> <!-- ✓ shows progress -->
|
|
42
|
+
<form hx-post="/orders" hx-disabled-elt="find button">…</form> <!-- ✓ prevents re-submit -->
|
|
43
|
+
|
|
44
|
+
Prefer `hx-disabled-elt` where a duplicate would be expensive; the indicator alone tells the user
|
|
45
|
+
to wait but does not stop them. `suppress-and-clean`: a ratchet holds existing cases flat.
|
|
46
|
+
exceptions:
|
|
47
|
+
- "`hx-get` is not scoped by this rule (idempotent)."
|
|
48
|
+
- An element declaring both signals is fine; only declaring neither is a violation.
|
|
49
|
+
- Server-driven idempotency (an idempotency key on the endpoint) is a real mitigation but not one
|
|
50
|
+
this rule can see; it does not exempt the element from signalling progress to the user.
|
|
51
|
+
metadata:
|
|
52
|
+
aliases:
|
|
53
|
+
- HTMX-MUTATION-PROGRESS-001
|
|
54
|
+
severity: 3
|
|
55
|
+
disposition: suppress-and-clean
|
|
56
|
+
introduced_in: 0.1.0
|
|
57
|
+
implementation:
|
|
58
|
+
type: validator
|
|
59
|
+
ref: htmx_hypermedia_detector
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: planner.docs.adr-registry-derived
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: 'The ADR registry is derived from :decides: edges, never hand-maintained'
|
|
6
|
+
statement: >-
|
|
7
|
+
`docs/architecture/decisions/index.adoc` MUST list exactly the ADRs the corpus declares, derived
|
|
8
|
+
from their `:decides:` edges. An ADR present in the tree and absent from the registry — or listed
|
|
9
|
+
in the registry and absent from the tree — is a violation. The registry is a projection, never a
|
|
10
|
+
typed list (spec 2 §5.2, §6).
|
|
11
|
+
|
|
12
|
+
WHAT COUNTS AS A LISTING. Where the registry declares a machine-maintained region —
|
|
13
|
+
`// BEGIN GENERATED: adr-register` … `// END GENERATED: adr-register`, the markers a generator
|
|
14
|
+
writes around its own output — only that region is read. A corpus whose generator marks its
|
|
15
|
+
output has already said where its list begins and ends, and taking it at its word beats any
|
|
16
|
+
heuristic. Where no region is declared, the file is read minus its `----` listing blocks: an ADR
|
|
17
|
+
skeleton shown in fences illustrates the shape and lists nothing. A prose mention outside a
|
|
18
|
+
declared region is NOT excused — a sentence naming an id and a list entry naming one cannot be
|
|
19
|
+
told apart without guessing at a corpus's formatting, and a corpus that wants prose ignored says
|
|
20
|
+
so with the markers.
|
|
21
|
+
terms:
|
|
22
|
+
- term_id: adr
|
|
23
|
+
text: >-
|
|
24
|
+
a document at `docs/architecture/decisions/adr-YYYYMMDD-NNN-<slug>.adoc` declaring `:adr-id:`,
|
|
25
|
+
`:status:`, `:date:` and `:decides:`.
|
|
26
|
+
- term_id: generated_region
|
|
27
|
+
text: >-
|
|
28
|
+
a machine-maintained span delimited by `// BEGIN GENERATED: <name>` and
|
|
29
|
+
`// END GENERATED: <name>`, which a generator rewrites in place; where the registry declares
|
|
30
|
+
one named `adr-register`, that span is the listing the projection is compared against.
|
|
31
|
+
- term_id: derived_registry
|
|
32
|
+
text: >-
|
|
33
|
+
`index.adoc` in the decisions directory, whose entries are computed from the set of ADR files and
|
|
34
|
+
their `:decides:` targets. It contains references to the decisions, never the decisions themselves.
|
|
35
|
+
- term_id: disposition_rationale
|
|
36
|
+
text: >-
|
|
37
|
+
advisory while the consuming corpus is brought into compatibility. The measurement below was
|
|
38
|
+
TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
|
|
39
|
+
already stale, so the date lives in the key and the command is recorded beside the result.
|
|
40
|
+
Re-take it at the escalation checkpoint; never escalate on the number here.
|
|
41
|
+
values:
|
|
42
|
+
measured_2026_09_06: 'The decisions directory does not exist and there are 0 ADR files. Spec 2 §6 names the first two: ADR-20260906-001 (shared control root) and ADR-20260906-002 (the documentation system itself, authored as current documentation — the proof the system works).'
|
|
43
|
+
measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
|
|
44
|
+
measurement_command: 'ls -d docs/architecture/decisions 2>&1 ; find . -name ''adr-*.adoc'' | wc -l'
|
|
45
|
+
escalate_when: '`docs/architecture/decisions/` exists and its index.adoc matches the derived projection exactly on a full scan.'
|
|
46
|
+
content:
|
|
47
|
+
summary: >-
|
|
48
|
+
A hand-maintained list of decisions drifts from the decisions — precisely the failure class ATDD
|
|
49
|
+
exists to kill, reproduced inside the documentation system itself. Deriving the registry makes
|
|
50
|
+
drift impossible rather than detectable.
|
|
51
|
+
normative_text: |
|
|
52
|
+
One architectural decision lives in ONE ADR file (spec 2 §6). The registry's job is to make the
|
|
53
|
+
set of them navigable, and the moment a human types an entry into it the set has two sources of
|
|
54
|
+
truth.
|
|
55
|
+
|
|
56
|
+
The check is bidirectional on purpose. A missing entry is the obvious drift; a STALE entry — an
|
|
57
|
+
ADR listed after its file was renamed or removed — is the one that survives review, because a
|
|
58
|
+
list that names something is read as authoritative about it.
|
|
59
|
+
|
|
60
|
+
An ADR's `:decides:` target is resolved by `planner.docs.graph-target-resolves` like any other
|
|
61
|
+
edge. An ADR deciding an architecture node that no document declares is reported there, not here.
|
|
62
|
+
fix_hint: |
|
|
63
|
+
Regenerate the registry rather than editing it:
|
|
64
|
+
|
|
65
|
+
atdd docs build # once #1623 lands the operator verbs (spec 2 §7)
|
|
66
|
+
|
|
67
|
+
Until then the capability reports the delta and the registry is regenerated by the same code
|
|
68
|
+
path the check uses, so the two can never disagree. If you find yourself typing an entry into
|
|
69
|
+
`decisions/index.adoc`, the entry belongs in an ADR file with a `:decides:` attribute instead.
|
|
70
|
+
exceptions:
|
|
71
|
+
- Prose surrounding the derived entries in `index.adoc` (a title, an introductory paragraph) is not
|
|
72
|
+
compared. Only the set of ADR references is.
|
|
73
|
+
- A decisions directory holding no ADRs requires no entries; an empty registry is a correct
|
|
74
|
+
projection of an empty set.
|
|
75
|
+
metadata:
|
|
76
|
+
aliases:
|
|
77
|
+
- DOCS-ADR-001
|
|
78
|
+
severity: 2
|
|
79
|
+
disposition: advisory
|
|
80
|
+
introduced_in: 0.1.0
|
|
81
|
+
implementation:
|
|
82
|
+
type: validator
|
|
83
|
+
ref: docs_capability
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: planner.docs.area-index-required
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Each authored area carries an index.adoc
|
|
6
|
+
statement: >-
|
|
7
|
+
Each authored area of the canonical tree — `docs/`, `docs/purpose/`, `docs/architecture/`,
|
|
8
|
+
`docs/architecture/decisions/`, `docs/delivery/`, `docs/archive/` — MUST contain an `index.adoc`.
|
|
9
|
+
Other canonical filenames are defined when useful and are NOT instantiated merely to satisfy an
|
|
10
|
+
empty taxonomy (spec 2 §4).
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: authored_area
|
|
13
|
+
text: >-
|
|
14
|
+
a directory of the canonical tree that holds authored documents. `docs/dist/` is not one; it is
|
|
15
|
+
generated output.
|
|
16
|
+
- term_id: index
|
|
17
|
+
text: >-
|
|
18
|
+
`index.adoc` — the area's entry point and the node the rendered site navigates to. For
|
|
19
|
+
`docs/architecture/decisions/` it is additionally a DERIVED registry, governed by
|
|
20
|
+
`planner.docs.adr-registry-derived`.
|
|
21
|
+
- term_id: disposition_rationale
|
|
22
|
+
text: >-
|
|
23
|
+
advisory while the consuming corpus is brought into compatibility. The measurement below was
|
|
24
|
+
TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
|
|
25
|
+
already stale, so the date lives in the key and the command is recorded beside the result.
|
|
26
|
+
Re-take it at the escalation checkpoint; never escalate on the number here.
|
|
27
|
+
values:
|
|
28
|
+
measured_2026_09_06: '`docs/` exists and holds 71 markdown files; none of purpose/, architecture/, delivery/ or archive/ exists, and there is no index.adoc anywhere. 0 of 6 canonical areas are present, so the rule currently reports nothing and will begin reporting as the tree is created.'
|
|
29
|
+
measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
|
|
30
|
+
measurement_command: 'ls -d docs docs/purpose docs/architecture docs/delivery docs/archive 2>&1'
|
|
31
|
+
escalate_when: 'The canonical tree exists in the consuming repository and every existing authored area carries an index.adoc.'
|
|
32
|
+
content:
|
|
33
|
+
summary: >-
|
|
34
|
+
An area without an index is an area the rendered site cannot navigate into and a reader cannot
|
|
35
|
+
enter. The rule checks the six canonical areas only; it does not require an index in every
|
|
36
|
+
subdirectory an author happens to create.
|
|
37
|
+
normative_text: |
|
|
38
|
+
The rule is scoped to the canonical areas DELIBERATELY, and the restraint is the point. Spec 2 §4
|
|
39
|
+
warns against instantiating filenames to fill an empty taxonomy, and a rule demanding an index in
|
|
40
|
+
every directory would do exactly that — it would push authors to create ceremonial files for
|
|
41
|
+
directories that hold two related documents and need no landing page.
|
|
42
|
+
|
|
43
|
+
An area that does not exist is not a violation. The tree grows when a real requirement justifies
|
|
44
|
+
an area (spec 2 §2, *Out of scope*, on images / reference / operations domains). This rule fires
|
|
45
|
+
only when an area EXISTS and has no index.
|
|
46
|
+
fix_hint: |
|
|
47
|
+
Add the index and give it identity like any other document:
|
|
48
|
+
|
|
49
|
+
docs/architecture/index.adoc
|
|
50
|
+
= Architecture
|
|
51
|
+
:doc-id: architecture.index
|
|
52
|
+
:status: current
|
|
53
|
+
|
|
54
|
+
If the area has no content to introduce, the question is whether the area should exist yet, not
|
|
55
|
+
what to write in its index.
|
|
56
|
+
exceptions:
|
|
57
|
+
- '`docs/dist/` is generated output and is never required to carry an index.'
|
|
58
|
+
- An area that does not exist in the tree is not reported. Only an existing area missing its index is.
|
|
59
|
+
metadata:
|
|
60
|
+
aliases:
|
|
61
|
+
- DOCS-TREE-001
|
|
62
|
+
severity: 3
|
|
63
|
+
disposition: advisory
|
|
64
|
+
introduced_in: 0.1.0
|
|
65
|
+
implementation:
|
|
66
|
+
type: validator
|
|
67
|
+
ref: docs_capability
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: planner.docs.artifact-path-shape
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: Declared documentation artifacts name AsciiDoc paths inside the canonical tree
|
|
6
|
+
statement: >-
|
|
7
|
+
A documentation artifact declared at RATIFY MUST name a `path` that begins `docs/` and ends
|
|
8
|
+
`.adoc`; an artifact with `action: archive` MUST name a `path` beneath `docs/archive/`. Core stores
|
|
9
|
+
these paths as opaque strings and never interprets them (companion §3); interpreting them is this
|
|
10
|
+
extension's job, because only the extension knows the tree.
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: declaration
|
|
13
|
+
text: >-
|
|
14
|
+
the `documentation:` block recorded in the store at RATIFY (companion §3), in one of its two
|
|
15
|
+
total forms — `impact: change` with artifacts, or `impact: none` with a reason.
|
|
16
|
+
- term_id: artifact
|
|
17
|
+
text: >-
|
|
18
|
+
one entry of `artifacts:` — an `action` (`create`, `modify`, `archive`), a `path`, and for
|
|
19
|
+
`archive` a `from` naming the document being retired.
|
|
20
|
+
- term_id: disposition_rationale
|
|
21
|
+
text: >-
|
|
22
|
+
advisory while the consuming corpus is brought into compatibility. The measurement below was
|
|
23
|
+
TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
|
|
24
|
+
already stale, so the date lives in the key and the command is recorded beside the result.
|
|
25
|
+
Re-take it at the escalation checkpoint; never escalate on the number here.
|
|
26
|
+
values:
|
|
27
|
+
measured_2026_09_06: '0 declarations exist to check. The `documentation:` block lands with the core unit (companion spec, work item B) and this rule has an empty input until it does. Advisory is the only honest disposition for a rule whose subject does not exist yet.'
|
|
28
|
+
measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
|
|
29
|
+
measurement_command: '(the declaration is core''s, companion §3, and is not yet implemented)'
|
|
30
|
+
escalate_when: 'Documentation declarations are being recorded at RATIFY in the consuming repository and a full pass over recent plans reports zero malformed artifact paths.'
|
|
31
|
+
content:
|
|
32
|
+
summary: >-
|
|
33
|
+
The declaration is a promise about paths. This rule checks the promise is well formed BEFORE the
|
|
34
|
+
work is done, so a malformed declaration is caught at RATIFY rather than discovered at COMPLETE
|
|
35
|
+
when the paths do not match the change set.
|
|
36
|
+
normative_text: |
|
|
37
|
+
The division of labour with core is exact and worth stating, because getting it wrong is what
|
|
38
|
+
#1782 originally proposed. Core checks that every declared path APPEARS IN THE CHANGE SET
|
|
39
|
+
(companion §4, check 4) — path-agnostic, format-agnostic, and non-vacuous with no extension
|
|
40
|
+
installed. This rule checks that the path is SHAPED like documentation. Core cannot: it does not
|
|
41
|
+
know what `docs/` is, or what a `.adoc` is, and companion §8's anti-theatre test greps core for
|
|
42
|
+
exactly those tokens and requires zero hits.
|
|
43
|
+
|
|
44
|
+
The archive constraint is the load-bearing half. `action: archive` with a destination outside
|
|
45
|
+
`docs/archive/` is how history quietly gets promoted into current truth — the single outcome
|
|
46
|
+
spec 2 §2 names as most likely to happen under time pressure, and the one that recreates the
|
|
47
|
+
problem #1782 exists to solve.
|
|
48
|
+
fix_hint: |
|
|
49
|
+
Shape the declaration to the tree:
|
|
50
|
+
|
|
51
|
+
documentation:
|
|
52
|
+
impact: change
|
|
53
|
+
artifacts:
|
|
54
|
+
- action: create
|
|
55
|
+
path: docs/architecture/shared-control-root.adoc # ✓ under docs/, ends .adoc
|
|
56
|
+
- action: archive
|
|
57
|
+
from: docs/old-spec.md
|
|
58
|
+
path: docs/archive/old-spec.adoc # ✓ archive lands in archive/
|
|
59
|
+
|
|
60
|
+
An archived document keeps its content and gains `:status:`. It does not gain a place in
|
|
61
|
+
`purpose/`, `architecture/` or `delivery/` — those are for documents that are accepted truth today.
|
|
62
|
+
exceptions:
|
|
63
|
+
- >-
|
|
64
|
+
`impact: none` declares no artifacts and is not checked by this rule. Core enforces that a
|
|
65
|
+
reason is present; core does not judge the reason's quality, and neither does this extension.
|
|
66
|
+
- >-
|
|
67
|
+
An ABSENT declaration is not `impact: none`. `impact: none` is core considering the question
|
|
68
|
+
and declaring no documentation change — a positive statement, which permits. A missing
|
|
69
|
+
declaration is core having said nothing, so no declaration-dependent rule can be evaluated and
|
|
70
|
+
the capability returns COULD_NOT_CHECK, which BLOCKS. The corpus rules are still evaluated and
|
|
71
|
+
still reported: "genuinely nothing to check" is false whenever there is a corpus to read.
|
|
72
|
+
- The `from` path of an archive artifact is NOT required to end `.adoc` — it names the legacy
|
|
73
|
+
document being retired, which is exactly the markdown the migration is converting.
|
|
74
|
+
metadata:
|
|
75
|
+
aliases:
|
|
76
|
+
- DOCS-DECLARATION-001
|
|
77
|
+
severity: 2
|
|
78
|
+
disposition: advisory
|
|
79
|
+
introduced_in: 0.1.0
|
|
80
|
+
implementation:
|
|
81
|
+
type: validator
|
|
82
|
+
ref: docs_capability
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
schema_version: 1.1.0
|
|
2
|
+
rule_id: planner.docs.asciidoc-only
|
|
3
|
+
kind: rule
|
|
4
|
+
status: active
|
|
5
|
+
name: AsciiDoc is the only authored format beneath docs/
|
|
6
|
+
statement: >-
|
|
7
|
+
A file authored beneath `docs/` MUST be AsciiDoc (`.adoc`). An authored `.md` beneath `docs/`,
|
|
8
|
+
outside the generated `docs/dist/` tree, is a violation. This is the format half of the
|
|
9
|
+
documentation model handoff spec 2 §4 names; it is an EXTENSION obligation because core is
|
|
10
|
+
forbidden to know what a `.adoc` is (companion §4, *Deliberately excluded*).
|
|
11
|
+
terms:
|
|
12
|
+
- term_id: authored_file
|
|
13
|
+
text: >-
|
|
14
|
+
a file a human wrote and committed beneath `docs/`. The test is location, not content: anything
|
|
15
|
+
under `docs/` that is not under `docs/dist/` is authored.
|
|
16
|
+
- term_id: generated_output
|
|
17
|
+
text: >-
|
|
18
|
+
everything beneath `docs/dist/`. It is rendered by the build (spec 2 §7), normally excluded from
|
|
19
|
+
git, and never subject to the authored-format rule.
|
|
20
|
+
- term_id: disposition_rationale
|
|
21
|
+
text: >-
|
|
22
|
+
advisory while the consuming corpus is brought into compatibility. The measurement below was
|
|
23
|
+
TAKEN on 2026-09-06, not recalled — #1782 found this convention's own recorded measurement
|
|
24
|
+
already stale, so the date lives in the key and the command is recorded beside the result.
|
|
25
|
+
Re-take it at the escalation checkpoint; never escalate on the number here.
|
|
26
|
+
values:
|
|
27
|
+
measured_2026_09_06: '71 markdown beneath docs/, 18 non-dotfile markdown at the repository root (89 total; 90 counting .atdd-launch-prompt.md), 0 .adoc anywhere. The corpus is 0% compatible, which is why this rule ships advisory.'
|
|
28
|
+
measurement_target: 'afokapu/atdd @ main (/Users/alecfokapu/Github/atdd/main)'
|
|
29
|
+
measurement_command: 'find docs -name ''*.md'' -type f | wc -l ; find . -maxdepth 1 -name ''*.md'' -type f | wc -l ; find . -name ''*.adoc'' -not -path ''./.git/*'' | wc -l'
|
|
30
|
+
escalate_when: 'No authored `.md` remains beneath `docs/` outside `docs/dist/` in the consuming repository — i.e. the migration of spec 2 §1 has landed and the corpus is compatible with `strict`.'
|
|
31
|
+
measurement_note: 'Spec 2 §1 records 71 + 18 = 89 as of the same date and this run reproduces it exactly for the non-dotfile corpus. Re-take this measurement at the escalation checkpoint; do not escalate on the number recorded here (spec 2 §8, and companion §7 on stale measurements).'
|
|
32
|
+
content:
|
|
33
|
+
summary: >-
|
|
34
|
+
One authored format, mechanically checked. The rule exists because a mixed corpus cannot carry a
|
|
35
|
+
relationship graph: `doc-id` and the `:implements:` / `:supersedes:` edges of
|
|
36
|
+
`planner.docs.graph-target-resolves` are AsciiDoc attributes, and a markdown file has nowhere to
|
|
37
|
+
put them. Format uniformity is the precondition for every other rule in this extension.
|
|
38
|
+
normative_text: |
|
|
39
|
+
The rule is deliberately a LOCATION test rather than a content test. Asking "is this really
|
|
40
|
+
prose documentation?" is semantic and undecidable; asking "is this path under docs/ and not
|
|
41
|
+
under docs/dist/, and does it end .md?" is deterministic and cheap. Spec 2 §4 chose the
|
|
42
|
+
decidable form on purpose, and the same reasoning is why the undeclared-change rule
|
|
43
|
+
(planner.docs.undeclared-change) is stated as the enforceable inverse of "should this have been
|
|
44
|
+
declared?".
|
|
45
|
+
|
|
46
|
+
`docs/dist/**` is excluded because it is build output, not authorship. Excluding it by path —
|
|
47
|
+
rather than by gitignore status — keeps the check identical whether or not the tree has been
|
|
48
|
+
built, which is what makes it deterministic in CI.
|
|
49
|
+
fix_hint: |
|
|
50
|
+
Convert the file and keep its content:
|
|
51
|
+
|
|
52
|
+
docs/architecture/shared-control-root.md # ✗ authored markdown under docs/
|
|
53
|
+
docs/architecture/shared-control-root.adoc # ✓ authored AsciiDoc
|
|
54
|
+
|
|
55
|
+
A historical document does not become current by being converted. Convert it INTO
|
|
56
|
+
`docs/archive/` and give it `:status:` accordingly — spec 2 §2 *Out of scope* is explicit that
|
|
57
|
+
migration preserves history and never promotes it.
|
|
58
|
+
exceptions:
|
|
59
|
+
- Everything beneath `docs/dist/` is generated output and is never scanned.
|
|
60
|
+
- Markdown OUTSIDE `docs/` is untouched by this rule. `README.md`, `CONTRIBUTING.md` and the
|
|
61
|
+
repository-root corpus are out of its scope; they are migrated by the adoption step, not
|
|
62
|
+
rejected by this detector.
|
|
63
|
+
metadata:
|
|
64
|
+
aliases:
|
|
65
|
+
- DOCS-FORMAT-001
|
|
66
|
+
severity: 2
|
|
67
|
+
disposition: advisory
|
|
68
|
+
introduced_in: 0.1.0
|
|
69
|
+
implementation:
|
|
70
|
+
type: validator
|
|
71
|
+
ref: docs_capability
|