codd-dev 3.7.0__tar.gz → 3.7.2__tar.gz

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.
Files changed (638) hide show
  1. {codd_dev-3.7.0 → codd_dev-3.7.2}/PKG-INFO +1 -1
  2. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/__init__.py +1 -1
  3. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/cli.py +33 -1
  4. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/builder.py +109 -9
  5. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/ci_health.py +47 -2
  6. codd_dev-3.7.2/codd/dag/checks/transitive_closure.py +211 -0
  7. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/extract_ai.py +303 -31
  8. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/__init__.py +1 -0
  9. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/_shared.py +19 -0
  10. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/python_ast.py +71 -0
  11. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/regex_strategies.py +11 -1
  12. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/treesitter.py +81 -17
  13. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/codd.yaml.tmpl +28 -43
  14. {codd_dev-3.7.0 → codd_dev-3.7.2}/pyproject.toml +1 -1
  15. codd_dev-3.7.0/codd/dag/checks/transitive_closure.py +0 -116
  16. {codd_dev-3.7.0 → codd_dev-3.7.2}/.gitignore +0 -0
  17. {codd_dev-3.7.0 → codd_dev-3.7.2}/LICENSE +0 -0
  18. {codd_dev-3.7.0 → codd_dev-3.7.2}/README.md +0 -0
  19. {codd_dev-3.7.0 → codd_dev-3.7.2}/bench_fixture/README.md +0 -0
  20. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/__main__.py +0 -0
  21. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/_git_helper.py +0 -0
  22. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/action_outcome.py +0 -0
  23. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/ai_invoke.py +0 -0
  24. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/ai_patch.py +0 -0
  25. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/artifact_contract.py +0 -0
  26. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/artifact_ids.py +0 -0
  27. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/artifacts/catalog.yaml +0 -0
  28. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/ask_user_question_adapter.py +0 -0
  29. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/assembler.py +0 -0
  30. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/bridge.py +0 -0
  31. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/brownfield/__init__.py +0 -0
  32. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/brownfield/pipeline.py +0 -0
  33. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/capability_completeness.py +0 -0
  34. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/claude_cli.py +0 -0
  35. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/clustering.py +0 -0
  36. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/coherence_adapters.py +0 -0
  37. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/coherence_engine.py +0 -0
  38. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/confidence.py +0 -0
  39. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/config.py +0 -0
  40. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/config_schema.py +0 -0
  41. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts.py +0 -0
  42. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts_registry/__init__.py +0 -0
  43. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts_registry/__main__.py +0 -0
  44. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts_registry/certify.py +0 -0
  45. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts_registry/generate_matrix.py +0 -0
  46. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/contracts_registry/registry.py +0 -0
  47. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/coverage_auditor.py +0 -0
  48. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/coverage_execution_coherence.py +0 -0
  49. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/coverage_metrics.py +0 -0
  50. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/__init__.py +0 -0
  51. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/auto_repair.py +0 -0
  52. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/__init__.py +0 -0
  53. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/_one_to_many_detection.py +0 -0
  54. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/artifact_contract_check.py +0 -0
  55. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/cardinality_coverage.py +0 -0
  56. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/dependency_freshness.py +0 -0
  57. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/depends_on_consistency.py +0 -0
  58. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/deployment_completeness.py +0 -0
  59. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/edge_validity.py +0 -0
  60. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/environment_coverage.py +0 -0
  61. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/extraction_diagnostics.py +0 -0
  62. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/implementation_coverage.py +0 -0
  63. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/negative_space.py +0 -0
  64. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/node_completeness.py +0 -0
  65. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/opt_out.py +0 -0
  66. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/resource_flow_coherence.py +0 -0
  67. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/semantic_contract_conflict.py +0 -0
  68. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/stale_evidence.py +0 -0
  69. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/task_completion.py +0 -0
  70. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/ui_coherence.py +0 -0
  71. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/checks/user_journey_coherence.py +0 -0
  72. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/coverage_axes.py +0 -0
  73. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/cli.yaml +0 -0
  74. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  75. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/csharp.yaml +0 -0
  76. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/elixir.yaml +0 -0
  77. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/generic.yaml +0 -0
  78. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/iot.yaml +0 -0
  79. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/java.yaml +0 -0
  80. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/kotlin.yaml +0 -0
  81. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/mobile.yaml +0 -0
  82. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/ruby.yaml +0 -0
  83. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/rust.yaml +0 -0
  84. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/scala.yaml +0 -0
  85. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/swift.yaml +0 -0
  86. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/test_frameworks.yaml +0 -0
  87. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/defaults/web.yaml +0 -0
  88. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/extractor.py +0 -0
  89. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/impact.py +0 -0
  90. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/materiality.py +0 -0
  91. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/metadata_access.py +0 -0
  92. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/result_status.py +0 -0
  93. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dag/runner.py +0 -0
  94. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/defaults.py +0 -0
  95. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/defaults.yaml +0 -0
  96. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/dependency_lock_coherence.py +0 -0
  97. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deploy_targets/__init__.py +0 -0
  98. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deploy_targets/app_service.py +0 -0
  99. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deploy_targets/base.py +0 -0
  100. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deploy_targets/docker_compose.py +0 -0
  101. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployer.py +0 -0
  102. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/__init__.py +0 -0
  103. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/checks/__init__.py +0 -0
  104. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  105. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  106. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/defaults/schema_providers.yaml +0 -0
  107. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/defaults/verification_templates.yaml +0 -0
  108. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/extractor.py +0 -0
  109. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/__init__.py +0 -0
  110. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/ai_command.py +0 -0
  111. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/ai_command_factory.py +0 -0
  112. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/codex_app_server.py +0 -0
  113. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/llm_consideration.py +0 -0
  114. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/schema/__init__.py +0 -0
  115. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/schema/prisma.py +0 -0
  116. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/target/__init__.py +0 -0
  117. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/target/docker_compose.py +0 -0
  118. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/__init__.py +0 -0
  119. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  120. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  121. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  122. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  123. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  124. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/curl.py +0 -0
  125. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/form_strategies.py +0 -0
  126. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/means_catalog.py +0 -0
  127. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/playwright.py +0 -0
  128. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/pytest_http.py +0 -0
  129. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/deployment/providers/verification/vitest.py +0 -0
  130. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/design_md.py +0 -0
  131. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/diff/__init__.py +0 -0
  132. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/diff/apply.py +0 -0
  133. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/diff/engine.py +0 -0
  134. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/diff/persistence.py +0 -0
  135. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/diff/templates/diff_prompt.md +0 -0
  136. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/discovery.py +0 -0
  137. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/drift.py +0 -0
  138. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/e2e_contract_coherence.py +0 -0
  139. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/e2e_extractor.py +0 -0
  140. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/e2e_generator.py +0 -0
  141. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/e2e_harness.py +0 -0
  142. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/e2e_runner.py +0 -0
  143. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/__init__.py +0 -0
  144. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/apply.py +0 -0
  145. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/engine.py +0 -0
  146. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/finding.py +0 -0
  147. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/formatters/__init__.py +0 -0
  148. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/formatters/base.py +0 -0
  149. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/formatters/interactive.py +0 -0
  150. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/formatters/json_fmt.py +0 -0
  151. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/formatters/md.py +0 -0
  152. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/gap_to_ask.py +0 -0
  153. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/lexicon_loader.py +0 -0
  154. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/persistence.py +0 -0
  155. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/promote.py +0 -0
  156. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/routing.py +0 -0
  157. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  158. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/env_refs.py +0 -0
  159. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/extract_paths.py +0 -0
  160. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/extractor.py +0 -0
  161. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/__init__.py +0 -0
  162. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/candidate_selector.py +0 -0
  163. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/design_updater.py +0 -0
  164. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/impact_planner.py +0 -0
  165. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/impl_propagation.py +0 -0
  166. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/interactive_prompt.py +0 -0
  167. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/phenomenon_fixer.py +0 -0
  168. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/phenomenon_parser.py +0 -0
  169. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/risk_classifier.py +0 -0
  170. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates/clarification_question.txt +0 -0
  171. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates/design_update.txt +0 -0
  172. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates/impl_update.txt +0 -0
  173. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates/phenomenon_parse.txt +0 -0
  174. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates/risk_assessment.txt +0 -0
  175. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fix/templates_loader.py +0 -0
  176. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixer.py +0 -0
  177. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixup_drift.py +0 -0
  178. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixup_drift_strategies/__init__.py +0 -0
  179. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  180. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  181. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/fixup_drift_strategies/url_drift.py +0 -0
  182. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/frontmatter.py +0 -0
  183. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/generator.py +0 -0
  184. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/git_evidence.py +0 -0
  185. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/graph.py +0 -0
  186. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/greenfield/__init__.py +0 -0
  187. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/greenfield/pipeline.py +0 -0
  188. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hitl_session.py +0 -0
  189. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/__init__.py +0 -0
  190. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/pre-commit +0 -0
  191. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  192. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/recipes/claude_settings_example.json +0 -0
  193. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/recipes/codex_hook.sh +0 -0
  194. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/recipes/git_post_commit.sh +0 -0
  195. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  196. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/iac_nfr.py +0 -0
  197. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implement_oracle.py +0 -0
  198. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implement_oracle_scope.py +0 -0
  199. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implement_oracle_types.py +0 -0
  200. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implementer/__init__.py +0 -0
  201. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implementer/chunked_runner.py +0 -0
  202. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implementer/typecheck_loop.py +0 -0
  203. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/implementer.py +0 -0
  204. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/import_coherence.py +0 -0
  205. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/inheritance.py +0 -0
  206. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/init/__init__.py +0 -0
  207. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/init/lexicon_suggest.py +0 -0
  208. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/init/llm_lexicon_suggester.py +0 -0
  209. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/init/stack_detector.py +0 -0
  210. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/knowledge_fetcher.py +0 -0
  211. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/__init__.py +0 -0
  212. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/__init__.py +0 -0
  213. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/implement_oracle.py +0 -0
  214. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/oracle_go.py +0 -0
  215. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/oracle_python.py +0 -0
  216. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/oracle_typescript.py +0 -0
  217. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/adapters/runner_report.py +0 -0
  218. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/builtin_adapters.py +0 -0
  219. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/compat.py +0 -0
  220. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/contract.py +0 -0
  221. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/loader.py +0 -0
  222. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/oracle_executor.py +0 -0
  223. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/path_planner.py +0 -0
  224. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/profile.py +0 -0
  225. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/profiles/go.yaml +0 -0
  226. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/profiles/python.yaml +0 -0
  227. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/profiles/typescript.yaml +0 -0
  228. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/registry.py +0 -0
  229. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/verify_executor.py +0 -0
  230. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/languages/verify_plan.py +0 -0
  231. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon.py +0 -0
  232. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/__init__.py +0 -0
  233. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/__init__.py +0 -0
  234. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/html.py +0 -0
  235. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  236. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/md.py +0 -0
  237. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/inspector.py +0 -0
  238. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/manager.py +0 -0
  239. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/reporter.py +0 -0
  240. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/lexicon_cli/threshold.py +0 -0
  241. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/__init__.py +0 -0
  242. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/approval.py +0 -0
  243. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/best_practice_augmenter.py +0 -0
  244. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/criteria_expander.py +0 -0
  245. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/design_doc_extractor.py +0 -0
  246. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/impl_step_deriver.py +0 -0
  247. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/means_catalog_loader.py +0 -0
  248. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/parser.py +0 -0
  249. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/plan_deriver.py +0 -0
  250. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/prompt_builder.py +0 -0
  251. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/strategy_validator.py +0 -0
  252. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  253. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/criteria_expand_meta.md +0 -0
  254. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  255. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  256. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  257. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/meta_instruction.md +0 -0
  258. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/plan_derive_meta.md +0 -0
  259. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  260. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/mcp_server.py +0 -0
  261. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/measure.py +0 -0
  262. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/operational_e2e_audit.py +0 -0
  263. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/operations_derive.py +0 -0
  264. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/api_specs.py +0 -0
  265. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/extractor_registry.py +0 -0
  266. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/filesystem_routes.py +0 -0
  267. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/iac.py +0 -0
  268. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/schemas.py +0 -0
  269. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/parsing/tests_builddeps.py +0 -0
  270. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/path_safety.py +0 -0
  271. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/planner.py +0 -0
  272. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/policy.py +0 -0
  273. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/__init__.py +0 -0
  274. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/defaults/cli.yaml +0 -0
  275. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/defaults/generic.yaml +0 -0
  276. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/defaults/iot.yaml +0 -0
  277. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/defaults/mobile.yaml +0 -0
  278. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/preflight/defaults/web.yaml +0 -0
  279. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/project_types.py +0 -0
  280. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/propagate.py +0 -0
  281. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/propagation_common.py +0 -0
  282. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/propagator.py +0 -0
  283. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/reconciliation_ledger.py +0 -0
  284. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/reference_resolution.py +0 -0
  285. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/registry.py +0 -0
  286. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/__init__.py +0 -0
  287. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/approval_repair.py +0 -0
  288. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/auto_scope_guard.py +0 -0
  289. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/engine.py +0 -0
  290. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/git_patcher.py +0 -0
  291. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/history.py +0 -0
  292. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/llm_repair_engine.py +0 -0
  293. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/loop.py +0 -0
  294. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/primary_picker.py +0 -0
  295. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/proof_breaks.py +0 -0
  296. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/repair_result.py +0 -0
  297. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/repairability_classifier.py +0 -0
  298. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/schema.py +0 -0
  299. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/templates/analyze_meta.md +0 -0
  300. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/templates/propose_meta.md +0 -0
  301. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/templates/repair_strategy_meta.md +0 -0
  302. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/templates/repairability_meta.md +0 -0
  303. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/test_failure_attribution.py +0 -0
  304. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair/verify_runner.py +0 -0
  305. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/repair_slice.py +0 -0
  306. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/require.py +0 -0
  307. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/require_plugins.py +0 -0
  308. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/require_propagate.py +0 -0
  309. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts/defaults/cli.yaml +0 -0
  310. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts/defaults/generic.yaml +0 -0
  311. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts/defaults/iot.yaml +0 -0
  312. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  313. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts/defaults/web.yaml +0 -0
  314. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/required_artifacts_deriver.py +0 -0
  315. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  316. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  317. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  318. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  319. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/web.yaml +0 -0
  320. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_completeness_auditor.py +0 -0
  321. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirement_reconciliation.py +0 -0
  322. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/requirements_meta.py +0 -0
  323. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/restoration_report.py +0 -0
  324. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/restore.py +0 -0
  325. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/routes_extractor.py +0 -0
  326. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/runtime_smoke/__init__.py +0 -0
  327. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/runtime_smoke/checks.py +0 -0
  328. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/runtime_smoke/config.py +0 -0
  329. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/runtime_smoke/report.py +0 -0
  330. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/runtime_smoke/runner.py +0 -0
  331. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/scanner.py +0 -0
  332. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/schema_refs.py +0 -0
  333. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/screen_flow_validator.py +0 -0
  334. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/screen_transition_extractor.py +0 -0
  335. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/screen_transitions/defaults.yaml +0 -0
  336. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/skills_cli/__init__.py +0 -0
  337. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/skills_cli/discovery.py +0 -0
  338. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/skills_cli/manager.py +0 -0
  339. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/skills_cli/paths.py +0 -0
  340. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/__init__.py +0 -0
  341. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/adapters/__init__.py +0 -0
  342. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/adapters/_base.py +0 -0
  343. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/adapters/nextjs.py +0 -0
  344. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/adapters/playwright.py +0 -0
  345. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/adapters/prisma.py +0 -0
  346. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/command_authenticity.py +0 -0
  347. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/command_override.py +0 -0
  348. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/command_plan.py +0 -0
  349. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/compose.py +0 -0
  350. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/loader.py +0 -0
  351. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/lock.py +0 -0
  352. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/obligations.py +0 -0
  353. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/profile.py +0 -0
  354. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/profiles/addons/playwright.yaml +0 -0
  355. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/profiles/addons/prisma.yaml +0 -0
  356. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
  357. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/project.py +0 -0
  358. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/registry.py +0 -0
  359. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/replacement_proof.py +0 -0
  360. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/stack/resolve.py +0 -0
  361. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/surface_reconciliation.py +0 -0
  362. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/synth.py +0 -0
  363. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/conventions.yaml.tmpl +0 -0
  364. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  365. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/doc_links.yaml.tmpl +0 -0
  366. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  367. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extracted/api-contract.md.j2 +0 -0
  368. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  369. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extracted/module-detail.md.j2 +0 -0
  370. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extracted/schema-design.md.j2 +0 -0
  371. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/extracted/system-context.md.j2 +0 -0
  372. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/gitignore.tmpl +0 -0
  373. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/lexicon_questions.md +0 -0
  374. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/lexicon_schema.yaml +0 -0
  375. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/templates/overrides.yaml.tmpl +0 -0
  376. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/test_detection.py +0 -0
  377. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/test_import_coherence.py +0 -0
  378. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/traceability.py +0 -0
  379. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/validator.py +0 -0
  380. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/vb_marker_authenticity.py +0 -0
  381. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/vb_rerun_scope.py +0 -0
  382. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/verifiable_behavior_audit.py +0 -0
  383. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/__init__.py +0 -0
  384. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/events.py +0 -0
  385. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/propagation_log.py +0 -0
  386. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/propagation_pipeline.py +0 -0
  387. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/test_runner.py +0 -0
  388. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/watch/watcher.py +0 -0
  389. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd/wiring.py +0 -0
  390. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  391. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  392. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  393. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  394. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  395. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  396. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  397. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  398. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  399. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  400. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  401. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  402. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  403. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  404. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  405. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  406. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  407. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  408. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  409. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  410. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  411. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  412. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  413. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  414. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  415. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  416. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  417. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  418. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  419. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  420. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  421. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  422. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  423. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  424. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  425. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  426. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  427. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  428. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  429. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  430. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  431. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  432. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  433. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  434. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  435. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  436. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  437. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  438. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  439. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  440. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  441. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  442. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  443. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  444. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  445. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  446. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  447. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  448. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  449. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  450. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  451. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  452. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  453. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  454. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  455. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  456. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  457. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  458. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  459. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  460. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  461. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  462. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  463. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  464. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  465. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  466. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  467. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  468. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  469. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  470. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  471. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  472. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  473. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  474. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  475. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  476. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  477. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  478. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  479. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  480. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  481. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  482. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  483. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  484. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  485. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  486. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  487. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  488. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  489. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  490. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  491. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  492. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  493. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  494. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  495. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  496. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  497. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  498. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  499. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  500. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  501. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  502. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  503. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  504. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  505. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  506. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  507. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  508. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  509. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  510. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  511. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  512. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  513. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  514. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  515. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  516. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  517. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  518. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  519. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  520. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  521. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  522. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  523. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  524. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  525. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  526. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  527. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  528. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  529. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  530. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  531. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  532. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  533. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  534. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  535. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  536. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  537. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  538. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  539. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  540. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  541. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  542. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  543. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  544. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  545. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  546. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  547. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  548. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  549. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  550. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  551. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  552. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  553. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  554. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  555. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  556. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  557. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  558. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  559. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  560. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  561. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  562. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  563. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  564. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  565. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  566. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  567. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  568. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  569. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  570. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  571. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  572. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  573. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  574. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  575. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  576. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  577. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  578. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  579. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  580. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  581. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  582. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  583. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  584. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  585. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  586. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  587. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  588. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  589. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  590. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  591. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  592. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  593. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  594. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  595. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  596. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  597. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  598. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  599. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  600. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  601. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  602. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  603. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  604. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  605. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  606. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  607. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  608. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  609. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  610. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  611. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  612. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  613. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  614. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  615. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  616. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  617. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  618. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  619. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  620. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  621. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  622. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  623. {codd_dev-3.7.0 → codd_dev-3.7.2}/codd_plugins/stack_map.yaml +0 -0
  624. {codd_dev-3.7.0 → codd_dev-3.7.2}/docs/cookbook/cdp_browser/README.md +0 -0
  625. {codd_dev-3.7.0 → codd_dev-3.7.2}/docs/cookbook/presentation_aggregation/README.md +0 -0
  626. {codd_dev-3.7.0 → codd_dev-3.7.2}/docs/requirements/README.md +0 -0
  627. {codd_dev-3.7.0 → codd_dev-3.7.2}/examples/README.md +0 -0
  628. {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-assemble/SKILL.md +0 -0
  629. {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-evolve/SKILL.md +0 -0
  630. {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-generate/SKILL.md +0 -0
  631. {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-greenfield/SKILL.md +0 -0
  632. {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-impact/SKILL.md +0 -0
  633. {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-init/SKILL.md +0 -0
  634. {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-propagate/SKILL.md +0 -0
  635. {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-restore/SKILL.md +0 -0
  636. {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-scan/SKILL.md +0 -0
  637. {codd_dev-3.7.0 → codd_dev-3.7.2}/skills/codd-validate/SKILL.md +0 -0
  638. {codd_dev-3.7.0 → codd_dev-3.7.2}/tests/integration/standalone_repair_skeleton/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codd-dev
3
- Version: 3.7.0
3
+ Version: 3.7.2
4
4
  Summary: CoDD: Coherence-Driven Development — cross-artifact change impact analysis
5
5
  Project-URL: Homepage, https://github.com/yohey-w/codd-dev
6
6
  Project-URL: Repository, https://github.com/yohey-w/codd-dev
@@ -1,3 +1,3 @@
1
1
  """CoDD — Coherence-Driven Development."""
2
2
 
3
- __version__ = "3.7.0"
3
+ __version__ = "3.7.2"
@@ -434,6 +434,30 @@ def _display_path(path: Path, project_root: Path) -> str:
434
434
  return path.as_posix()
435
435
 
436
436
 
437
+ def _detect_bootstrap_test_dirs(project_root: Path) -> list[str]:
438
+ """Detect the project's test directories for the bootstrap codd.yaml.
439
+
440
+ Reuses the extractor's inventory (``test``/``tests``/``spec``/``__tests__``)
441
+ so a project that uses ``test/`` is not silently excluded by a hardcoded
442
+ ``tests/`` default (which yields a vacuous task_completion). Falls back to the
443
+ conventional ``tests/`` when none exist so the config stays valid + editable.
444
+ """
445
+ from codd.extractor import _detect_test_dirs
446
+
447
+ found = _detect_test_dirs(project_root)
448
+ return [f"{d}/" for d in found] if found else ["tests/"]
449
+
450
+
451
+ def _detect_bootstrap_doc_dirs(project_root: Path) -> list[str]:
452
+ """Detect the project's documentation directories for the bootstrap codd.yaml.
453
+
454
+ Mirrors :func:`_detect_bootstrap_test_dirs`: prefer what exists (``docs``
455
+ vs ``doc``), fall back to the conventional ``docs/`` when none exist.
456
+ """
457
+ found = [d for d in ("docs", "doc", "documentation") if (project_root / d).is_dir()]
458
+ return [f"{d}/" for d in found] if found else ["docs/"]
459
+
460
+
437
461
  def _ensure_bootstrap_codd_yaml(
438
462
  project_root: Path,
439
463
  *,
@@ -456,6 +480,8 @@ def _ensure_bootstrap_codd_yaml(
456
480
  "project_name": project_root.name,
457
481
  "language": language,
458
482
  "source_dirs": _format_yaml_list(source_dirs),
483
+ "test_dirs": _format_yaml_list(_detect_bootstrap_test_dirs(project_root)),
484
+ "doc_dirs": _format_yaml_list(_detect_bootstrap_doc_dirs(project_root)),
459
485
  "graph_path": f"{codd_dir_name}/scan",
460
486
  },
461
487
  )
@@ -2323,11 +2349,15 @@ def init(
2323
2349
  (codd_dir / "reports").mkdir(parents=True)
2324
2350
  (codd_dir / "scan").mkdir(exist_ok=True)
2325
2351
 
2326
- # Copy templates
2352
+ # Copy templates. Greenfield init uses the conventional test/doc layout
2353
+ # (brownfield extract detects the project's real dirs instead — see
2354
+ # _ensure_bootstrap_codd_yaml).
2327
2355
  _render_template("codd.yaml.tmpl", codd_dir / "codd.yaml", {
2328
2356
  "project_name": project_name,
2329
2357
  "language": language,
2330
2358
  "source_dirs": _format_yaml_list(["src/"]),
2359
+ "test_dirs": _format_yaml_list(["tests/"]),
2360
+ "doc_dirs": _format_yaml_list(["docs/"]),
2331
2361
  "graph_path": f"{config_dir}/scan",
2332
2362
  })
2333
2363
  _render_template("gitignore.tmpl", codd_dir / ".gitignore", {})
@@ -5862,6 +5892,8 @@ def extract(
5862
5892
  click.echo(f"Output: {output_display}/")
5863
5893
  for f in result.generated_files:
5864
5894
  click.echo(f" {f.name}")
5895
+ for warning in getattr(result, "parse_warnings", []):
5896
+ click.echo(f" WARNING: {warning}")
5865
5897
  if generated_config:
5866
5898
  click.echo(f"Generated: {config_display} (minimal brownfield config)")
5867
5899
 
@@ -44,7 +44,6 @@ LEGACY_IMPLEMENTATION_SUFFIXES = (".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".
44
44
  LEGACY_TEST_SUFFIXES = (".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".bats")
45
45
  PLAN_HEADER_RE = re.compile(r"^#{2,6}\s+([A-Za-z0-9]+(?:[-_.][A-Za-z0-9]+)*)(?:\s+(.+))?$", re.MULTILINE)
46
46
  OUTPUTS_RE = re.compile(r"(?im)^outputs?[ \t]*:[ \t]*(.*)$")
47
- PY_IMPORT_RE = re.compile(r"(?m)^\s*(?:from\s+([A-Za-z_][\w.]*)(?:\s+import\s+)|import\s+([A-Za-z_][\w.]*))")
48
47
  LEXICON_OUTPUT_PREFIX = "lexicon:"
49
48
  EXPECTED_ARTIFACT_ATTRIBUTE_KEYS = (
50
49
  "id",
@@ -298,7 +297,7 @@ def _add_impl_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
298
297
  path=node_id,
299
298
  attributes={
300
299
  "language": _language_for_path(file_path),
301
- "imports": extract_imports(file_path),
300
+ "imports": _extract_impl_imports(file_path),
302
301
  "runtime_evidence": _runtime_evidence_for_file(file_path, node_id, capability_patterns),
303
302
  },
304
303
  ),
@@ -913,13 +912,28 @@ def _resolve_import_target(
913
912
  aliases: dict[str, list[str]],
914
913
  ) -> str | None:
915
914
  candidates: list[Path] = []
916
- if import_ref.startswith("."):
915
+ if _is_js_relative_specifier(import_ref):
916
+ # JS/TS relative: ``./foo`` / ``../foo`` — resolve against the file dir
917
+ # exactly as before (a path with a separator after the dots).
917
918
  candidates.append((file_path.parent / import_ref).resolve())
919
+ elif import_ref.startswith("."):
920
+ # Python relative: ``.b`` / ``..pkg.x`` / ``.`` — leading dots select a
921
+ # package directory (1 dot = current package, 2 = parent, …) and the
922
+ # dotted remainder maps to a sub-path. Distinct from JS ``./`` because
923
+ # Python uses ``.`` as the component separator, so ``pkg/.b`` (the old
924
+ # JS-style join) never matched ``pkg/b.py``.
925
+ candidates.extend(_python_relative_candidates(import_ref, file_path))
918
926
  elif import_ref.startswith("/"):
919
927
  candidates.append((project_root / import_ref.lstrip("/")).resolve())
920
928
  else:
921
929
  candidates.extend(_alias_candidates(import_ref, project_root, aliases))
922
930
  candidates.append((project_root / import_ref).resolve())
931
+ # Absolute dotted module specifier (``pkg.c`` / ``a.b.c``): also try the
932
+ # dotted→path mapping rooted at the project, so a Python absolute import
933
+ # resolves to ``pkg/c.py`` (``__init__.py`` handled downstream). The
934
+ # plain join above keeps ``pkg/sub`` directory-style specifiers working.
935
+ if "." in import_ref:
936
+ candidates.append((project_root / Path(*import_ref.split("."))).resolve())
923
937
 
924
938
  for candidate in candidates:
925
939
  resolved = _resolve_file_candidate(candidate, path_to_node)
@@ -928,6 +942,45 @@ def _resolve_import_target(
928
942
  return None
929
943
 
930
944
 
945
+ def _is_js_relative_specifier(import_ref: str) -> bool:
946
+ """True for JS/TS relative specifiers (``./x`` / ``../x`` / ``.`` / ``..``).
947
+
948
+ The discriminator is purely the SHAPE of the specifier (data), not a
949
+ language flag: JS relative imports put a path separator after the leading
950
+ dots (or are the bare ``.`` / ``..`` directory refs), whereas Python
951
+ relative imports use ``.`` as the module-component separator (``.b``,
952
+ ``..pkg.mod``). Keeping the JS branch byte-identical preserves the existing
953
+ TS/JS edge behavior.
954
+ """
955
+
956
+ if import_ref in (".", ".."):
957
+ return True
958
+ return import_ref.startswith("./") or import_ref.startswith("../")
959
+
960
+
961
+ def _python_relative_candidates(import_ref: str, file_path: Path) -> list[Path]:
962
+ """Resolve a Python relative import specifier to filesystem candidates.
963
+
964
+ Mirrors Python's own relative-import semantics: ``leading_dots`` counts the
965
+ package levels (1 = the importing file's package == its directory, 2 = the
966
+ parent package, …); the remaining dotted name becomes sub-directories.
967
+ ``_resolve_file_candidate`` then appends the real suffix / ``__init__.py``.
968
+ """
969
+
970
+ leading_dots = len(import_ref) - len(import_ref.lstrip("."))
971
+ remainder = import_ref[leading_dots:]
972
+
973
+ # 1 dot → current package dir (the file's own directory); each extra dot
974
+ # walks one package up.
975
+ base = file_path.parent
976
+ for _ in range(leading_dots - 1):
977
+ base = base.parent
978
+
979
+ if not remainder:
980
+ return [base.resolve()]
981
+ return [(base / Path(*remainder.split("."))).resolve()]
982
+
983
+
931
984
  def _infer_test_targets(
932
985
  test_path: Path,
933
986
  project_root: Path,
@@ -954,14 +1007,48 @@ def _infer_test_targets(
954
1007
  return targets
955
1008
 
956
1009
 
1010
+ def _extract_python_import_specifiers(file_path: Path) -> list[str]:
1011
+ """Return raw Python import specifiers (relative dots preserved) via AST.
1012
+
1013
+ Dispatches to the registry's Python ``source`` backend
1014
+ (:class:`codd.parsing.PythonAstExtractor`) so the SAME stdlib-``ast``
1015
+ extraction that the scanner uses produces the DAG's specifiers — including
1016
+ relative imports (``.b`` / ``from . import d`` / ``..pkg.x``) that the old
1017
+ line-anchored regex (a ``from ([A-Za-z_]…)`` pattern that could not match a
1018
+ leading-dot module) silently dropped. Selection is registry-DATA-driven
1019
+ (``get_extractor``), not a ``language ==`` branch.
1020
+ """
1021
+
1022
+ from codd.parsing import get_extractor
1023
+
1024
+ content = file_path.read_text(encoding="utf-8", errors="ignore")
1025
+ return get_extractor("python", "source").extract_import_specifiers(content)
1026
+
1027
+
1028
+ def _extract_impl_imports(file_path: Path) -> list[str]:
1029
+ """Return raw import specifiers for an implementation file.
1030
+
1031
+ Python impl files go through AST-based specifier extraction (the same path
1032
+ test files use) so impl→impl import edges form for Python — the core of the
1033
+ fix. Every other language keeps the existing quoted-specifier extractor
1034
+ (``extract_imports``: JS/TS ``from '…'`` / ``require('…')``), unchanged.
1035
+ Dispatch is by file suffix (DATA), mirroring ``_extract_test_imports``.
1036
+ """
1037
+
1038
+ if file_path.suffix == ".py":
1039
+ return _extract_python_import_specifiers(file_path)
1040
+ return extract_imports(file_path)
1041
+
1042
+
957
1043
  def _extract_test_imports(file_path: Path) -> list[str]:
958
1044
  imports = extract_imports(file_path)
959
1045
  if file_path.suffix != ".py":
960
1046
  return imports
961
1047
 
962
- content = file_path.read_text(encoding="utf-8", errors="ignore")
963
- python_imports = [match.group(1) or match.group(2) for match in PY_IMPORT_RE.finditer(content)]
964
- return [*imports, *python_imports]
1048
+ # AST-based Python specifiers (relative imports included). Combined with the
1049
+ # quoted-specifier pass above so a polyglot test file (e.g. a ``.py`` test
1050
+ # that also embeds a JS ``require('…')`` literal in a string) keeps both.
1051
+ return [*imports, *_extract_python_import_specifiers(file_path)]
965
1052
 
966
1053
 
967
1054
  def _resolve_python_import_target(import_ref: str, project_root: Path, path_to_node: dict[Path, str]) -> str | None:
@@ -1056,6 +1143,9 @@ def _convention_path_candidates(test_path: Path, project_root: Path, convention_
1056
1143
  return candidates
1057
1144
 
1058
1145
 
1146
+ _TEST_DIR_NAMES = {"tests", "test", "spec", "__tests__"}
1147
+
1148
+
1059
1149
  def _is_test_file(file_path: Path, project_root: Path) -> bool:
1060
1150
  relative_parts = _relative_id(file_path, project_root).split("/")
1061
1151
  name = file_path.name
@@ -1066,9 +1156,19 @@ def _is_test_file(file_path: Path, project_root: Path) -> bool:
1066
1156
  return True
1067
1157
  if file_path.suffix == ".bats":
1068
1158
  return True
1069
- if file_path.suffix == ".py" and any(part in {"tests", "test"} for part in relative_parts[:-1]):
1070
- return name.startswith("test_") or name.endswith("_test.py")
1071
- return False
1159
+ in_test_dir = any(part in _TEST_DIR_NAMES for part in relative_parts[:-1])
1160
+ if file_path.suffix == ".py":
1161
+ # Python keeps the stricter pytest/unittest convention even under a test
1162
+ # directory (``test_*.py`` / ``*_test.py``) to avoid pulling fixtures.
1163
+ if in_test_dir:
1164
+ return name.startswith("test_") or name.endswith("_test.py")
1165
+ return False
1166
+ # Other languages: a source file living under a conventional test directory
1167
+ # is a test even without a ``.test.`` infix — e.g. Mocha/Tape ``test/app.js``
1168
+ # (Express) or ``spec/foo.js``. The caller already gates on ``test_suffixes``
1169
+ # and the configured ``test_file_patterns`` (scoped to the project's test
1170
+ # dirs), so this never sweeps in arbitrary source files.
1171
+ return in_test_dir
1072
1172
 
1073
1173
 
1074
1174
  def _load_import_aliases(project_root: Path, settings: dict[str, Any]) -> dict[str, list[str]]:
@@ -24,10 +24,19 @@ _DEFAULT_PROVIDER = "github" + "_actions"
24
24
  _OPT_OUT_PROVIDER = "none"
25
25
 
26
26
 
27
+ # GitHub Actions officially loads workflow files with EITHER ``.yml`` or
28
+ # ``.yaml``. The default glob therefore matches both extensions (comma-separated
29
+ # union — see ``_locate_workflows``). A user who narrows ``workflow_glob`` to a
30
+ # single pattern keeps exact control (an explicit ``*.yaml`` pulls in only
31
+ # ``.yaml``); only the DEFAULT spans both so the common ``.yaml``-only project
32
+ # (e.g. Flask) is not mis-RED-flagged ``ci_workflow_missing``.
33
+ _DEFAULT_WORKFLOW_GLOB = ".github/workflows/*.yml,.github/workflows/*.yaml"
34
+
35
+
27
36
  @dataclass
28
37
  class CiConfig:
29
38
  provider: str = _DEFAULT_PROVIDER
30
- workflow_glob: str = ".github/workflows/*.yml"
39
+ workflow_glob: str = _DEFAULT_WORKFLOW_GLOB
31
40
  required_triggers: list[str] = field(default_factory=lambda: ["push", "pull_request"])
32
41
  runtime_check: bool = False
33
42
  staleness_days: int = 14
@@ -241,7 +250,43 @@ class CiHealthCheck(DagCheck):
241
250
  project_root: Path,
242
251
  workflow_glob: str,
243
252
  ) -> tuple[list[Path], list[str]]:
244
- """Resolve in-root workflow files via the shared path_safety jail.
253
+ """Resolve in-root workflow files for one OR MORE comma-separated globs.
254
+
255
+ ``workflow_glob`` may carry several patterns separated by commas (the
256
+ default spans both ``*.yml`` and ``*.yaml`` because GitHub Actions loads
257
+ either extension). Each sub-glob is resolved independently through the
258
+ shared path_safety jail (see :meth:`_locate_one_glob`); the in-root
259
+ matches are unioned + de-duplicated, and any out-of-root markers are
260
+ accumulated so a single escaping sub-glob still surfaces a structured red
261
+ finding. A single (comma-free) pattern behaves exactly as before, so a
262
+ user who narrows ``workflow_glob`` to one pattern keeps exact control.
263
+ """
264
+
265
+ sub_globs = [part.strip() for part in workflow_glob.split(",") if part.strip()]
266
+ if not sub_globs:
267
+ return [], []
268
+
269
+ seen: set[Path] = set()
270
+ in_root: list[Path] = []
271
+ out_of_root: list[str] = []
272
+ for sub in sub_globs:
273
+ files, escaped = self._locate_one_glob(project_root, sub)
274
+ for path in files:
275
+ if path not in seen:
276
+ seen.add(path)
277
+ in_root.append(path)
278
+ for marker in escaped:
279
+ if marker not in out_of_root:
280
+ out_of_root.append(marker)
281
+ in_root.sort()
282
+ return in_root, out_of_root
283
+
284
+ def _locate_one_glob(
285
+ self,
286
+ project_root: Path,
287
+ workflow_glob: str,
288
+ ) -> tuple[list[Path], list[str]]:
289
+ """Resolve in-root workflow files for ONE glob via the path_safety jail.
245
290
 
246
291
  The glob root is validated *before* enumeration. An absolute
247
292
  ``workflow_glob`` whose static (non-magic) base escapes the project root
@@ -0,0 +1,211 @@
1
+ """Transitive closure DAG completeness check."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections import deque
6
+ from dataclasses import dataclass, field
7
+ from pathlib import Path
8
+ from typing import Any
9
+
10
+ from codd.dag.checks import register_dag_check
11
+
12
+
13
+ @dataclass
14
+ class TransitiveClosureResult:
15
+ check_name: str = "transitive_closure"
16
+ severity: str = "amber"
17
+ unreachable_nodes: list[str] = field(default_factory=list)
18
+ common_node_count: int = 0
19
+ passed: bool = True
20
+ # ``status``/``skipped``/``checked_count`` close a vacuous-pass hole: an empty
21
+ # DAG (or one whose every node is ``common`` and therefore exempt from
22
+ # reachability) used to return a green PASS having examined zero nodes.
23
+ # ``checked_count`` is the number of non-common nodes whose reachability was
24
+ # actually evaluated; when it is 0 the run is a SKIP, not a clean pass.
25
+ status: str = "pass"
26
+ skipped: bool = False
27
+ checked_count: int = 0
28
+
29
+
30
+ # Edge kinds that represent an in-project source-import dependency
31
+ # (importer -> imported). Used to identify *code-entry roots*: source nodes that
32
+ # nothing in the project imports. This is a structural classification of edges,
33
+ # not a language/framework branch.
34
+ _IMPORT_EDGE_KINDS = frozenset({"imports"})
35
+
36
+ # Node kinds that are NOT first-class source nodes for entry-root detection:
37
+ # design docs are handled by their own root rule, and ``common`` nodes are shared
38
+ # infrastructure exempt from reachability. Anything else (``impl_file`` and any
39
+ # future source kind) is treated as a source node — no per-language literal.
40
+ _NON_SOURCE_KINDS = frozenset({"design_doc", "common"})
41
+
42
+
43
+ @register_dag_check("transitive_closure")
44
+ class TransitiveClosureCheck:
45
+ """Report unreachable nodes without blocking deploy.
46
+
47
+ A node is *reachable* if it can be reached from **any entry root**:
48
+
49
+ - **design_doc roots** — ``design_doc`` nodes with no incoming edge (the
50
+ classic "every artifact descends from a design document" model); and
51
+ - **code-entry roots** — source nodes (everything that is neither a
52
+ ``design_doc`` nor a ``common`` node) with no incoming in-project *import*
53
+ edge, i.e. the package's public entry points (e.g. a package
54
+ ``__init__`` or a CLI ``__main__`` that nothing else imports).
55
+
56
+ Seeding from the *union* of these makes reachability meaningful on doc-less
57
+ BROWNFIELD projects (raw external code with zero design docs but a fully
58
+ connected import graph) while leaving doc-rooted projects unchanged:
59
+ code-entry roots are purely additive. Only nodes unreachable from ALL entries
60
+ are flagged — genuine orphans.
61
+
62
+ Entry-root detection is structural (incoming-edge analysis on import-kind
63
+ edges), never a ``language ==`` branch.
64
+
65
+ Cycle / no-entry fallback: if a project has source nodes but none qualify as
66
+ a code-entry root (every source node has an in-project importer — a pure
67
+ cycle), reachability falls back to seeding from *all* source nodes for that
68
+ project, so connectivity is still measured rather than reported as a false
69
+ "everything unreachable". Cycles are traversed safely (visited-set guard).
70
+
71
+ Nodes with ``kind == "common"`` (shared infrastructure declared via
72
+ ``common_node_patterns`` or frontmatter ``node_type: common``) remain exempt
73
+ from unreachable detection. They participate in the DAG so change-impact
74
+ analysis still sees them, but they do not need to be the descendant of a
75
+ single design document.
76
+ """
77
+
78
+ def __init__(self, dag=None, project_root: Path | None = None, settings: dict[str, Any] | None = None):
79
+ self.dag = dag
80
+ self.project_root = project_root
81
+ self.settings = settings or {}
82
+
83
+ def run(
84
+ self,
85
+ dag=None,
86
+ project_root: Path | None = None,
87
+ settings: dict[str, Any] | None = None,
88
+ ) -> TransitiveClosureResult:
89
+ dag = dag or self.dag
90
+ if dag is None or not dag.nodes:
91
+ # No nodes at all → reachability examined nothing → SKIP (not a
92
+ # vacuous green PASS).
93
+ return TransitiveClosureResult(
94
+ status="skip",
95
+ skipped=True,
96
+ checked_count=0,
97
+ )
98
+
99
+ to_ids = {edge.to_id for edge in dag.edges}
100
+ design_roots = [
101
+ node.id
102
+ for node in dag.nodes.values()
103
+ if node.kind == "design_doc" and node.id not in to_ids
104
+ ]
105
+ code_roots = self._code_entry_roots(dag)
106
+
107
+ # Reachable from ANY entry: design-doc roots OR code-entry roots. The
108
+ # union keeps doc-rooted projects unchanged (design roots still seed) and
109
+ # makes doc-less brownfield projects measurable (code roots seed the
110
+ # connected impl graph).
111
+ roots = list(dict.fromkeys([*design_roots, *code_roots]))
112
+
113
+ visited = self._reachable_from(dag, roots)
114
+ common_count = sum(
115
+ 1 for node in dag.nodes.values() if node.kind == "common"
116
+ )
117
+ # Common nodes are exempt from unreachable detection, so the number of
118
+ # nodes whose reachability is actually evaluated is the non-common set.
119
+ checked = sum(1 for node in dag.nodes.values() if node.kind != "common")
120
+ unreachable = [
121
+ node_id
122
+ for node_id, node in dag.nodes.items()
123
+ if node_id not in visited and node.kind != "common"
124
+ ]
125
+
126
+ if checked == 0:
127
+ # Every node is exempt (all ``common``): reachability examined nothing.
128
+ # A clean PASS here is a vacuous false-green → SKIP instead.
129
+ return TransitiveClosureResult(
130
+ unreachable_nodes=[],
131
+ common_node_count=common_count,
132
+ passed=True,
133
+ status="skip",
134
+ skipped=True,
135
+ checked_count=0,
136
+ )
137
+
138
+ return TransitiveClosureResult(
139
+ unreachable_nodes=unreachable,
140
+ common_node_count=common_count,
141
+ passed=True,
142
+ status="pass",
143
+ skipped=False,
144
+ checked_count=checked,
145
+ )
146
+
147
+ def _code_entry_roots(self, dag) -> list[str]:
148
+ """Public entry points of the import graph (heads nothing imports).
149
+
150
+ A *source node* is any node that is neither a ``design_doc`` (handled by
151
+ its own root rule) nor a ``common`` node (exempt infrastructure). A source
152
+ node is a *code-entry root* when it **participates in the import graph as a
153
+ head**: it has at least one outgoing in-project import edge (it imports
154
+ something) AND no incoming import edge (nothing imports it). These are the
155
+ package's public entry points (e.g. ``__init__`` / ``__main__``).
156
+
157
+ Requiring an *outgoing* import edge is what preserves no-false-green: a
158
+ node with zero import edges (isolated -- imported by nothing and importing
159
+ nothing) is a genuine orphan, NOT an entry root, and therefore stays
160
+ flagged. Only nodes that actually anchor an import chain seed reachability.
161
+
162
+ Fallback (pure cycle / no head): if no source node qualifies as a head but
163
+ some source nodes still *participate* in the import graph (a cycle where
164
+ every node has an importer), seed from all participating source nodes so
165
+ connectivity is still measured instead of a false "everything
166
+ unreachable". Isolated orphans (no import edges) are never seeded and stay
167
+ flagged even in the fallback.
168
+ """
169
+ source_ids = {
170
+ node.id
171
+ for node in dag.nodes.values()
172
+ if node.kind not in _NON_SOURCE_KINDS
173
+ }
174
+ if not source_ids:
175
+ return []
176
+
177
+ import_to: set[str] = set()
178
+ import_from: set[str] = set()
179
+ for edge in dag.edges:
180
+ if edge.kind in _IMPORT_EDGE_KINDS:
181
+ import_to.add(edge.to_id)
182
+ import_from.add(edge.from_id)
183
+
184
+ # Heads: import something in-project, imported by nothing in-project.
185
+ entry_roots = [
186
+ nid
187
+ for nid in source_ids
188
+ if nid in import_from and nid not in import_to
189
+ ]
190
+ if entry_roots:
191
+ return entry_roots
192
+
193
+ # No clean head (pure cycle): seed from source nodes that participate in
194
+ # the import graph at all, so connectivity is still measured. Nodes with
195
+ # no import edges remain genuine orphans (never seeded here).
196
+ return [nid for nid in source_ids if nid in import_to or nid in import_from]
197
+
198
+ def _reachable_from(self, dag, roots: list[str]) -> set[str]:
199
+ visited: set[str] = set()
200
+ queue = deque(roots)
201
+
202
+ while queue:
203
+ current = queue.popleft()
204
+ if current in visited:
205
+ continue
206
+ visited.add(current)
207
+ for edge in dag.edges:
208
+ if edge.from_id == current and edge.to_id not in visited:
209
+ queue.append(edge.to_id)
210
+
211
+ return visited