codd-dev 3.7.1__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.1 → codd_dev-3.7.2}/PKG-INFO +1 -1
  2. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/__init__.py +1 -1
  3. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/cli.py +31 -1
  4. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/builder.py +16 -3
  5. codd_dev-3.7.2/codd/dag/checks/transitive_closure.py +211 -0
  6. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/extract_ai.py +72 -4
  7. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/regex_strategies.py +11 -1
  8. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/treesitter.py +81 -17
  9. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/codd.yaml.tmpl +25 -25
  10. {codd_dev-3.7.1 → codd_dev-3.7.2}/pyproject.toml +1 -1
  11. codd_dev-3.7.1/codd/dag/checks/transitive_closure.py +0 -116
  12. {codd_dev-3.7.1 → codd_dev-3.7.2}/.gitignore +0 -0
  13. {codd_dev-3.7.1 → codd_dev-3.7.2}/LICENSE +0 -0
  14. {codd_dev-3.7.1 → codd_dev-3.7.2}/README.md +0 -0
  15. {codd_dev-3.7.1 → codd_dev-3.7.2}/bench_fixture/README.md +0 -0
  16. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/__main__.py +0 -0
  17. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/_git_helper.py +0 -0
  18. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/action_outcome.py +0 -0
  19. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/ai_invoke.py +0 -0
  20. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/ai_patch.py +0 -0
  21. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/artifact_contract.py +0 -0
  22. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/artifact_ids.py +0 -0
  23. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/artifacts/catalog.yaml +0 -0
  24. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/ask_user_question_adapter.py +0 -0
  25. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/assembler.py +0 -0
  26. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/bridge.py +0 -0
  27. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/brownfield/__init__.py +0 -0
  28. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/brownfield/pipeline.py +0 -0
  29. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/capability_completeness.py +0 -0
  30. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/claude_cli.py +0 -0
  31. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/clustering.py +0 -0
  32. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/coherence_adapters.py +0 -0
  33. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/coherence_engine.py +0 -0
  34. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/confidence.py +0 -0
  35. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/config.py +0 -0
  36. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/config_schema.py +0 -0
  37. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts.py +0 -0
  38. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts_registry/__init__.py +0 -0
  39. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts_registry/__main__.py +0 -0
  40. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts_registry/certify.py +0 -0
  41. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts_registry/generate_matrix.py +0 -0
  42. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/contracts_registry/registry.py +0 -0
  43. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/coverage_auditor.py +0 -0
  44. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/coverage_execution_coherence.py +0 -0
  45. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/coverage_metrics.py +0 -0
  46. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/__init__.py +0 -0
  47. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/auto_repair.py +0 -0
  48. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/__init__.py +0 -0
  49. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/_one_to_many_detection.py +0 -0
  50. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/artifact_contract_check.py +0 -0
  51. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/cardinality_coverage.py +0 -0
  52. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/ci_health.py +0 -0
  53. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/dependency_freshness.py +0 -0
  54. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/depends_on_consistency.py +0 -0
  55. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/deployment_completeness.py +0 -0
  56. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/edge_validity.py +0 -0
  57. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/environment_coverage.py +0 -0
  58. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/extraction_diagnostics.py +0 -0
  59. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/implementation_coverage.py +0 -0
  60. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/negative_space.py +0 -0
  61. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/node_completeness.py +0 -0
  62. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/opt_out.py +0 -0
  63. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/resource_flow_coherence.py +0 -0
  64. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/semantic_contract_conflict.py +0 -0
  65. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/stale_evidence.py +0 -0
  66. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/task_completion.py +0 -0
  67. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/ui_coherence.py +0 -0
  68. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/checks/user_journey_coherence.py +0 -0
  69. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/coverage_axes.py +0 -0
  70. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/cli.yaml +0 -0
  71. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  72. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/csharp.yaml +0 -0
  73. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/elixir.yaml +0 -0
  74. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/generic.yaml +0 -0
  75. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/iot.yaml +0 -0
  76. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/java.yaml +0 -0
  77. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/kotlin.yaml +0 -0
  78. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/mobile.yaml +0 -0
  79. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/ruby.yaml +0 -0
  80. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/rust.yaml +0 -0
  81. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/scala.yaml +0 -0
  82. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/swift.yaml +0 -0
  83. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/test_frameworks.yaml +0 -0
  84. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/defaults/web.yaml +0 -0
  85. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/extractor.py +0 -0
  86. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/impact.py +0 -0
  87. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/materiality.py +0 -0
  88. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/metadata_access.py +0 -0
  89. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/result_status.py +0 -0
  90. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dag/runner.py +0 -0
  91. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/defaults.py +0 -0
  92. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/defaults.yaml +0 -0
  93. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/dependency_lock_coherence.py +0 -0
  94. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deploy_targets/__init__.py +0 -0
  95. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deploy_targets/app_service.py +0 -0
  96. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deploy_targets/base.py +0 -0
  97. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deploy_targets/docker_compose.py +0 -0
  98. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployer.py +0 -0
  99. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/__init__.py +0 -0
  100. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/checks/__init__.py +0 -0
  101. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  102. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  103. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/defaults/schema_providers.yaml +0 -0
  104. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/defaults/verification_templates.yaml +0 -0
  105. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/extractor.py +0 -0
  106. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/__init__.py +0 -0
  107. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/ai_command.py +0 -0
  108. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/ai_command_factory.py +0 -0
  109. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/codex_app_server.py +0 -0
  110. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/llm_consideration.py +0 -0
  111. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/schema/__init__.py +0 -0
  112. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/schema/prisma.py +0 -0
  113. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/target/__init__.py +0 -0
  114. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/target/docker_compose.py +0 -0
  115. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/__init__.py +0 -0
  116. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  117. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  118. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  119. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  120. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  121. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/curl.py +0 -0
  122. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/form_strategies.py +0 -0
  123. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/means_catalog.py +0 -0
  124. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/playwright.py +0 -0
  125. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/pytest_http.py +0 -0
  126. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/deployment/providers/verification/vitest.py +0 -0
  127. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/design_md.py +0 -0
  128. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/diff/__init__.py +0 -0
  129. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/diff/apply.py +0 -0
  130. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/diff/engine.py +0 -0
  131. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/diff/persistence.py +0 -0
  132. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/diff/templates/diff_prompt.md +0 -0
  133. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/discovery.py +0 -0
  134. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/drift.py +0 -0
  135. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/e2e_contract_coherence.py +0 -0
  136. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/e2e_extractor.py +0 -0
  137. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/e2e_generator.py +0 -0
  138. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/e2e_harness.py +0 -0
  139. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/e2e_runner.py +0 -0
  140. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/__init__.py +0 -0
  141. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/apply.py +0 -0
  142. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/engine.py +0 -0
  143. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/finding.py +0 -0
  144. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/formatters/__init__.py +0 -0
  145. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/formatters/base.py +0 -0
  146. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/formatters/interactive.py +0 -0
  147. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/formatters/json_fmt.py +0 -0
  148. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/formatters/md.py +0 -0
  149. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/gap_to_ask.py +0 -0
  150. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/lexicon_loader.py +0 -0
  151. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/persistence.py +0 -0
  152. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/promote.py +0 -0
  153. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/routing.py +0 -0
  154. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  155. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/env_refs.py +0 -0
  156. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/extract_paths.py +0 -0
  157. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/extractor.py +0 -0
  158. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/__init__.py +0 -0
  159. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/candidate_selector.py +0 -0
  160. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/design_updater.py +0 -0
  161. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/impact_planner.py +0 -0
  162. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/impl_propagation.py +0 -0
  163. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/interactive_prompt.py +0 -0
  164. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/phenomenon_fixer.py +0 -0
  165. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/phenomenon_parser.py +0 -0
  166. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/risk_classifier.py +0 -0
  167. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates/clarification_question.txt +0 -0
  168. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates/design_update.txt +0 -0
  169. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates/impl_update.txt +0 -0
  170. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates/phenomenon_parse.txt +0 -0
  171. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates/risk_assessment.txt +0 -0
  172. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fix/templates_loader.py +0 -0
  173. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixer.py +0 -0
  174. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixup_drift.py +0 -0
  175. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixup_drift_strategies/__init__.py +0 -0
  176. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  177. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  178. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/fixup_drift_strategies/url_drift.py +0 -0
  179. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/frontmatter.py +0 -0
  180. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/generator.py +0 -0
  181. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/git_evidence.py +0 -0
  182. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/graph.py +0 -0
  183. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/greenfield/__init__.py +0 -0
  184. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/greenfield/pipeline.py +0 -0
  185. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hitl_session.py +0 -0
  186. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/__init__.py +0 -0
  187. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/pre-commit +0 -0
  188. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  189. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/recipes/claude_settings_example.json +0 -0
  190. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/recipes/codex_hook.sh +0 -0
  191. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/recipes/git_post_commit.sh +0 -0
  192. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  193. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/iac_nfr.py +0 -0
  194. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implement_oracle.py +0 -0
  195. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implement_oracle_scope.py +0 -0
  196. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implement_oracle_types.py +0 -0
  197. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implementer/__init__.py +0 -0
  198. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implementer/chunked_runner.py +0 -0
  199. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implementer/typecheck_loop.py +0 -0
  200. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/implementer.py +0 -0
  201. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/import_coherence.py +0 -0
  202. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/inheritance.py +0 -0
  203. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/init/__init__.py +0 -0
  204. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/init/lexicon_suggest.py +0 -0
  205. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/init/llm_lexicon_suggester.py +0 -0
  206. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/init/stack_detector.py +0 -0
  207. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/knowledge_fetcher.py +0 -0
  208. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/__init__.py +0 -0
  209. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/__init__.py +0 -0
  210. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/implement_oracle.py +0 -0
  211. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/oracle_go.py +0 -0
  212. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/oracle_python.py +0 -0
  213. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/oracle_typescript.py +0 -0
  214. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/adapters/runner_report.py +0 -0
  215. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/builtin_adapters.py +0 -0
  216. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/compat.py +0 -0
  217. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/contract.py +0 -0
  218. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/loader.py +0 -0
  219. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/oracle_executor.py +0 -0
  220. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/path_planner.py +0 -0
  221. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/profile.py +0 -0
  222. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/profiles/go.yaml +0 -0
  223. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/profiles/python.yaml +0 -0
  224. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/profiles/typescript.yaml +0 -0
  225. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/registry.py +0 -0
  226. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/verify_executor.py +0 -0
  227. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/languages/verify_plan.py +0 -0
  228. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon.py +0 -0
  229. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/__init__.py +0 -0
  230. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/__init__.py +0 -0
  231. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/html.py +0 -0
  232. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  233. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/formatters/md.py +0 -0
  234. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/inspector.py +0 -0
  235. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/manager.py +0 -0
  236. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/reporter.py +0 -0
  237. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/lexicon_cli/threshold.py +0 -0
  238. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/__init__.py +0 -0
  239. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/approval.py +0 -0
  240. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/best_practice_augmenter.py +0 -0
  241. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/criteria_expander.py +0 -0
  242. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/design_doc_extractor.py +0 -0
  243. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/impl_step_deriver.py +0 -0
  244. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/means_catalog_loader.py +0 -0
  245. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/parser.py +0 -0
  246. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/plan_deriver.py +0 -0
  247. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/prompt_builder.py +0 -0
  248. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/strategy_validator.py +0 -0
  249. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  250. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/criteria_expand_meta.md +0 -0
  251. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  252. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  253. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  254. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/meta_instruction.md +0 -0
  255. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/plan_derive_meta.md +0 -0
  256. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  257. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/mcp_server.py +0 -0
  258. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/measure.py +0 -0
  259. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/operational_e2e_audit.py +0 -0
  260. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/operations_derive.py +0 -0
  261. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/__init__.py +0 -0
  262. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/_shared.py +0 -0
  263. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/api_specs.py +0 -0
  264. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/extractor_registry.py +0 -0
  265. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/filesystem_routes.py +0 -0
  266. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/iac.py +0 -0
  267. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/python_ast.py +0 -0
  268. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/schemas.py +0 -0
  269. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/parsing/tests_builddeps.py +0 -0
  270. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/path_safety.py +0 -0
  271. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/planner.py +0 -0
  272. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/policy.py +0 -0
  273. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/__init__.py +0 -0
  274. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/defaults/cli.yaml +0 -0
  275. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/defaults/generic.yaml +0 -0
  276. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/defaults/iot.yaml +0 -0
  277. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/defaults/mobile.yaml +0 -0
  278. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/preflight/defaults/web.yaml +0 -0
  279. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/project_types.py +0 -0
  280. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/propagate.py +0 -0
  281. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/propagation_common.py +0 -0
  282. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/propagator.py +0 -0
  283. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/reconciliation_ledger.py +0 -0
  284. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/reference_resolution.py +0 -0
  285. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/registry.py +0 -0
  286. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/__init__.py +0 -0
  287. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/approval_repair.py +0 -0
  288. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/auto_scope_guard.py +0 -0
  289. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/engine.py +0 -0
  290. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/git_patcher.py +0 -0
  291. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/history.py +0 -0
  292. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/llm_repair_engine.py +0 -0
  293. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/loop.py +0 -0
  294. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/primary_picker.py +0 -0
  295. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/proof_breaks.py +0 -0
  296. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/repair_result.py +0 -0
  297. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/repairability_classifier.py +0 -0
  298. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/schema.py +0 -0
  299. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/templates/analyze_meta.md +0 -0
  300. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/templates/propose_meta.md +0 -0
  301. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/templates/repair_strategy_meta.md +0 -0
  302. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/templates/repairability_meta.md +0 -0
  303. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/test_failure_attribution.py +0 -0
  304. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair/verify_runner.py +0 -0
  305. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/repair_slice.py +0 -0
  306. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/require.py +0 -0
  307. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/require_plugins.py +0 -0
  308. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/require_propagate.py +0 -0
  309. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts/defaults/cli.yaml +0 -0
  310. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts/defaults/generic.yaml +0 -0
  311. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts/defaults/iot.yaml +0 -0
  312. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  313. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts/defaults/web.yaml +0 -0
  314. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/required_artifacts_deriver.py +0 -0
  315. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  316. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  317. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  318. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  319. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness/defaults/web.yaml +0 -0
  320. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_completeness_auditor.py +0 -0
  321. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirement_reconciliation.py +0 -0
  322. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/requirements_meta.py +0 -0
  323. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/restoration_report.py +0 -0
  324. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/restore.py +0 -0
  325. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/routes_extractor.py +0 -0
  326. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/runtime_smoke/__init__.py +0 -0
  327. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/runtime_smoke/checks.py +0 -0
  328. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/runtime_smoke/config.py +0 -0
  329. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/runtime_smoke/report.py +0 -0
  330. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/runtime_smoke/runner.py +0 -0
  331. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/scanner.py +0 -0
  332. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/schema_refs.py +0 -0
  333. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/screen_flow_validator.py +0 -0
  334. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/screen_transition_extractor.py +0 -0
  335. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/screen_transitions/defaults.yaml +0 -0
  336. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/skills_cli/__init__.py +0 -0
  337. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/skills_cli/discovery.py +0 -0
  338. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/skills_cli/manager.py +0 -0
  339. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/skills_cli/paths.py +0 -0
  340. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/__init__.py +0 -0
  341. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/adapters/__init__.py +0 -0
  342. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/adapters/_base.py +0 -0
  343. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/adapters/nextjs.py +0 -0
  344. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/adapters/playwright.py +0 -0
  345. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/adapters/prisma.py +0 -0
  346. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/command_authenticity.py +0 -0
  347. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/command_override.py +0 -0
  348. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/command_plan.py +0 -0
  349. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/compose.py +0 -0
  350. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/loader.py +0 -0
  351. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/lock.py +0 -0
  352. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/obligations.py +0 -0
  353. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/profile.py +0 -0
  354. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/profiles/addons/playwright.yaml +0 -0
  355. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/profiles/addons/prisma.yaml +0 -0
  356. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
  357. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/project.py +0 -0
  358. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/registry.py +0 -0
  359. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/replacement_proof.py +0 -0
  360. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/stack/resolve.py +0 -0
  361. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/surface_reconciliation.py +0 -0
  362. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/synth.py +0 -0
  363. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/conventions.yaml.tmpl +0 -0
  364. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  365. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/doc_links.yaml.tmpl +0 -0
  366. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  367. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extracted/api-contract.md.j2 +0 -0
  368. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  369. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extracted/module-detail.md.j2 +0 -0
  370. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extracted/schema-design.md.j2 +0 -0
  371. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/extracted/system-context.md.j2 +0 -0
  372. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/gitignore.tmpl +0 -0
  373. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/lexicon_questions.md +0 -0
  374. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/lexicon_schema.yaml +0 -0
  375. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/templates/overrides.yaml.tmpl +0 -0
  376. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/test_detection.py +0 -0
  377. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/test_import_coherence.py +0 -0
  378. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/traceability.py +0 -0
  379. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/validator.py +0 -0
  380. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/vb_marker_authenticity.py +0 -0
  381. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/vb_rerun_scope.py +0 -0
  382. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/verifiable_behavior_audit.py +0 -0
  383. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/__init__.py +0 -0
  384. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/events.py +0 -0
  385. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/propagation_log.py +0 -0
  386. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/propagation_pipeline.py +0 -0
  387. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/test_runner.py +0 -0
  388. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/watch/watcher.py +0 -0
  389. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd/wiring.py +0 -0
  390. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  391. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  392. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  393. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  394. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  395. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  396. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  397. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  398. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  399. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  400. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  401. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  402. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  403. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  404. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  405. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  406. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  407. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  408. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  409. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  410. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  411. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  412. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  413. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  414. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  415. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  416. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  417. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  418. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  419. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  420. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  421. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  422. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  423. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  424. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  425. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  426. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  427. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  428. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  429. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  430. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  431. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  432. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  433. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  434. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  435. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  436. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  437. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  438. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  439. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  440. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  441. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  442. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  443. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  444. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  445. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  446. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  447. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  448. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  449. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  450. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  451. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  452. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  453. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  454. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  455. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  456. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  457. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  458. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  459. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  460. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  461. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  462. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  463. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  464. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  465. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  466. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  467. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  468. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  469. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  470. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  471. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  472. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  473. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  474. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  475. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  476. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  477. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  478. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  479. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  480. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  481. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  482. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  483. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  484. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  485. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  486. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  487. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  488. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  489. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  490. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  491. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  492. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  493. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  494. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  495. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  496. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  497. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  498. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  499. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  500. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  501. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  502. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  503. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  504. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  505. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  506. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  507. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  508. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  509. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  510. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  511. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  512. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  513. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  514. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  515. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  516. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  517. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  518. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  519. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  520. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  521. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  522. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  523. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  524. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  525. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  526. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  527. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  528. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  529. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  530. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  531. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  532. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  533. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  534. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  535. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  536. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  537. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  538. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  539. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  540. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  541. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  542. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  543. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  544. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  545. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  546. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  547. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  548. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  549. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  550. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  551. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  552. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  553. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  554. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  555. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  556. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  557. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  558. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  559. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  560. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  561. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  562. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  563. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  564. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  565. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  566. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  567. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  568. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  569. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  570. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  571. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  572. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  573. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  574. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  575. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  576. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  577. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  578. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  579. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  580. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  581. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  582. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  583. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  584. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  585. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  586. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  587. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  588. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  589. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  590. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  591. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  592. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  593. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  594. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  595. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  596. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  597. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  598. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  599. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  600. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  601. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  602. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  603. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  604. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  605. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  606. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  607. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  608. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  609. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  610. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  611. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  612. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  613. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  614. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  615. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  616. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  617. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  618. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  619. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  620. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  621. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  622. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  623. {codd_dev-3.7.1 → codd_dev-3.7.2}/codd_plugins/stack_map.yaml +0 -0
  624. {codd_dev-3.7.1 → codd_dev-3.7.2}/docs/cookbook/cdp_browser/README.md +0 -0
  625. {codd_dev-3.7.1 → codd_dev-3.7.2}/docs/cookbook/presentation_aggregation/README.md +0 -0
  626. {codd_dev-3.7.1 → codd_dev-3.7.2}/docs/requirements/README.md +0 -0
  627. {codd_dev-3.7.1 → codd_dev-3.7.2}/examples/README.md +0 -0
  628. {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-assemble/SKILL.md +0 -0
  629. {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-evolve/SKILL.md +0 -0
  630. {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-generate/SKILL.md +0 -0
  631. {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-greenfield/SKILL.md +0 -0
  632. {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-impact/SKILL.md +0 -0
  633. {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-init/SKILL.md +0 -0
  634. {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-propagate/SKILL.md +0 -0
  635. {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-restore/SKILL.md +0 -0
  636. {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-scan/SKILL.md +0 -0
  637. {codd_dev-3.7.1 → codd_dev-3.7.2}/skills/codd-validate/SKILL.md +0 -0
  638. {codd_dev-3.7.1 → 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.1
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.1"
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", {})
@@ -1143,6 +1143,9 @@ def _convention_path_candidates(test_path: Path, project_root: Path, convention_
1143
1143
  return candidates
1144
1144
 
1145
1145
 
1146
+ _TEST_DIR_NAMES = {"tests", "test", "spec", "__tests__"}
1147
+
1148
+
1146
1149
  def _is_test_file(file_path: Path, project_root: Path) -> bool:
1147
1150
  relative_parts = _relative_id(file_path, project_root).split("/")
1148
1151
  name = file_path.name
@@ -1153,9 +1156,19 @@ def _is_test_file(file_path: Path, project_root: Path) -> bool:
1153
1156
  return True
1154
1157
  if file_path.suffix == ".bats":
1155
1158
  return True
1156
- if file_path.suffix == ".py" and any(part in {"tests", "test"} for part in relative_parts[:-1]):
1157
- return name.startswith("test_") or name.endswith("_test.py")
1158
- 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
1159
1172
 
1160
1173
 
1161
1174
  def _load_import_aliases(project_root: Path, settings: dict[str, Any]) -> dict[str, list[str]]:
@@ -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
@@ -57,6 +57,60 @@ CONFIG_FILES = [
57
57
  # IaC patterns
58
58
  IAC_EXTENSIONS = {".bicep", ".bicepparam", ".tf", ".tfvars", ".hcl"}
59
59
 
60
+
61
+ def ai_command_has_tools(ai_command: str) -> bool:
62
+ """Return whether ``ai_command`` grants the model file/shell tools.
63
+
64
+ The extract prompt's "Extraction Procedure" enumerates the codebase via bash
65
+ (``find``/``ls``/``rg``). That only works when the AI CLI can actually shell
66
+ out. The default ``ai_command`` disables tools (``--tools ""``), and agentic
67
+ CLIs are hardened to read-only from an empty workspace elsewhere — so the
68
+ procedural bash framing pushes the model into agentic mode and it stubs or
69
+ hangs. We therefore treat NO TOOLS as the safe default and require an
70
+ explicit grant to keep the tool-enabled path.
71
+
72
+ Tools are considered AVAILABLE only when a ``--tools``/``--allowedTools``
73
+ flag carries a non-empty value. ``--tools ""`` (or the flag absent) → no
74
+ tools. Unparseable commands fail closed to no-tools (context-only is always
75
+ correct because the full PROJECT CONTEXT is embedded in the prompt).
76
+ """
77
+ import shlex
78
+
79
+ try:
80
+ parts = shlex.split(ai_command)
81
+ except ValueError:
82
+ return False
83
+
84
+ tool_flags = {"--tools", "--allowedTools", "--allowed-tools"}
85
+ for i, part in enumerate(parts):
86
+ flag, sep, inline = part.partition("=")
87
+ if flag in tool_flags:
88
+ value = inline if sep else (parts[i + 1] if i + 1 < len(parts) else "")
89
+ if value.strip():
90
+ return True
91
+ return False
92
+
93
+
94
+ # Prepended to the prompt when the AI CLI has no tools: it overrides the
95
+ # template's bash "Extraction Procedure" so the model extracts from the embedded
96
+ # PROJECT CONTEXT instead of trying to shell out (which it cannot do).
97
+ _NO_TOOLS_DIRECTIVE = """# ═══ EXECUTION MODE: NO TOOLS (context-only) ═══
98
+
99
+ You are running WITHOUT shell or file-system tools. Do NOT call any tool, do NOT
100
+ run bash/`find`/`ls`/`rg`/`cat`, and do NOT attempt to read files from disk.
101
+
102
+ The COMPLETE pre-scanned codebase — the directory tree plus the full contents of
103
+ every relevant source, config, IaC, and test file — is embedded verbatim under
104
+ "PROJECT CONTEXT (pre-scanned)" further down this prompt. That embedded context
105
+ is your ONLY source of truth.
106
+
107
+ When the "Extraction Procedure" below shows ```bash``` enumeration commands,
108
+ treat them as a DESCRIPTION of what to look for, NOT as commands to execute.
109
+ Instead, derive the same information by reading the embedded file contents
110
+ directly. Produce the full output document set in one response from that context.
111
+
112
+ """
113
+
60
114
  # Schema file patterns
61
115
  SCHEMA_PATTERNS = [
62
116
  "prisma/schema.prisma", "db/schema.rb", "alembic/versions",
@@ -360,10 +414,20 @@ def pre_scan(project_root: Path) -> PreScanResult:
360
414
  # Phase 2: AI prompt building
361
415
  # ═══════════════════════════════════════════════════════════
362
416
 
363
- def _build_prompt(scan: PreScanResult) -> str:
364
- """Build the AI prompt from pre-scan results + extract template."""
417
+ def _build_prompt(scan: PreScanResult, *, tools_available: bool = False) -> str:
418
+ """Build the AI prompt from pre-scan results + extract template.
419
+
420
+ ``tools_available`` reflects whether the AI CLI can shell out (see
421
+ :func:`ai_command_has_tools`). When False (the default for ``--tools ""``),
422
+ a NO-TOOLS directive is prepended so the model extracts from the embedded
423
+ PROJECT CONTEXT instead of trying to run the template's bash procedure.
424
+ """
365
425
  sections: list[str] = []
366
426
 
427
+ # No-tools mode: override the template's bash procedure up front.
428
+ if not tools_available:
429
+ sections.append(_NO_TOOLS_DIRECTIVE)
430
+
367
431
  # Load prompt template
368
432
  if PROMPT_TEMPLATE_FILE.exists():
369
433
  template = PROMPT_TEMPLATE_FILE.read_text(encoding="utf-8")
@@ -810,6 +874,10 @@ def run_extract_ai(
810
874
  # Phase 1: Pre-scan
811
875
  scan = pre_scan(project_root)
812
876
 
877
+ # Whether the AI CLI can shell out. The default ``--tools ""`` disables
878
+ # tools, so the prompt must NOT lean on its bash enumeration procedure.
879
+ tools_available = ai_command_has_tools(ai_command)
880
+
813
881
  # Phase 2: Build prompt (custom or baseline)
814
882
  if prompt_file:
815
883
  custom_path = Path(prompt_file)
@@ -819,10 +887,10 @@ def run_extract_ai(
819
887
  # Temporarily swap template for custom prompt
820
888
  import codd.extract_ai as _self
821
889
  _self.PROMPT_TEMPLATE_FILE = custom_path
822
- prompt = _build_prompt(scan)
890
+ prompt = _build_prompt(scan, tools_available=tools_available)
823
891
  _self.PROMPT_TEMPLATE_FILE = original_template
824
892
  else:
825
- prompt = _build_prompt(scan)
893
+ prompt = _build_prompt(scan, tools_available=tools_available)
826
894
 
827
895
  # Phase 3: AI invocation
828
896
  raw_output = _invoke_ai_command(ai_command, prompt)
@@ -189,12 +189,22 @@ def _imports_python(content, project_root, src_dir, file_path):
189
189
  return internal, external
190
190
 
191
191
 
192
+ # Capture the module specifier from every JS/TS import form: ESM
193
+ # ``import .. from '..'`` / ``from '..'``, plus CommonJS ``require('..')`` and
194
+ # dynamic ``import('..')``. Mirrors codd.dag.extractor._IMPORT_SPECIFIER_RE so the
195
+ # scan-path parser and the DAG builder agree on a CommonJS codebase's internal
196
+ # dependency graph.
197
+ _TS_JS_IMPORT_SPECIFIER_RE = re.compile(
198
+ r'''(?:import|from|require\(\s*|import\(\s*)\s*['"]([^'"]+)['"]'''
199
+ )
200
+
201
+
192
202
  def _imports_ts_js(content, project_root, src_dir, file_path):
193
203
  internal: dict[str, list[str]] = {}
194
204
  external: set[str] = set()
195
205
 
196
206
  for line in content.splitlines():
197
- m = re.search(r'''(?:import|from)\s+['"]([^'"]+)['"]''', line)
207
+ m = _TS_JS_IMPORT_SPECIFIER_RE.search(line)
198
208
  if not m:
199
209
  continue
200
210
  import_path = m.group(1)
@@ -34,6 +34,20 @@ _JS_IMPORT_SUFFIXES = {
34
34
  "typescript": ("", ".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", "/index.ts", "/index.tsx"),
35
35
  }
36
36
 
37
+
38
+ def _strip_js_comments(src: str) -> str:
39
+ """Remove ``/* block */`` (including JSDoc) and ``// line`` comments.
40
+
41
+ Used to keep route-path extraction from reading example routes embedded in
42
+ documentation comments. String-literal edge cases are tolerated: route
43
+ specifiers of interest are app-relative paths (``/users``), never URLs that
44
+ would carry a ``//`` sequence inside a string literal.
45
+ """
46
+ src = re.sub(r"/\*.*?\*/", "", src, flags=re.S)
47
+ src = re.sub(r"//[^\n]*", "", src)
48
+ return src
49
+
50
+
37
51
  class TreeSitterExtractor:
38
52
  """Tree-sitter backend for Python and TypeScript/JavaScript source files."""
39
53
 
@@ -540,26 +554,71 @@ def _extract_typescript_imports_ast(
540
554
  external: set[str] = set()
541
555
 
542
556
  for node in _iter_named_nodes(root):
543
- if node.type not in {"export_statement", "import_statement"}:
544
- continue
545
- source_node = node.child_by_field_name("source")
546
- if source_node is None:
547
- continue
548
- import_path = _extract_string_literal(_node_text(content_bytes, source_node))
549
- if not import_path:
557
+ if node.type in {"export_statement", "import_statement"}:
558
+ source_node = node.child_by_field_name("source")
559
+ if source_node is None:
560
+ continue
561
+ import_path = _extract_string_literal(_node_text(content_bytes, source_node))
562
+ if not import_path:
563
+ continue
564
+ _record_js_import(
565
+ import_path,
566
+ _normalize_ws(_node_text(content_bytes, node)),
567
+ internal,
568
+ external,
569
+ file_path=file_path,
570
+ src_dir=src_dir,
571
+ language=language,
572
+ )
550
573
  continue
551
- _record_js_import(
552
- import_path,
553
- _normalize_ws(_node_text(content_bytes, node)),
554
- internal,
555
- external,
556
- file_path=file_path,
557
- src_dir=src_dir,
558
- language=language,
559
- )
574
+
575
+ # CommonJS ``require('..')`` and dynamic ``import('..')`` are
576
+ # call_expressions, not import_statements. A CommonJS codebase (e.g.
577
+ # Express) carries its entire internal dependency graph here, so the AST
578
+ # walk must capture it too — otherwise the scan reports no inter-module
579
+ # dependencies. Mirrors codd.dag.extractor._IMPORT_SPECIFIER_RE.
580
+ if node.type == "call_expression":
581
+ import_path = _call_expression_module_specifier(content_bytes, node)
582
+ if not import_path:
583
+ continue
584
+ _record_js_import(
585
+ import_path,
586
+ _normalize_ws(_node_text(content_bytes, node)),
587
+ internal,
588
+ external,
589
+ file_path=file_path,
590
+ src_dir=src_dir,
591
+ language=language,
592
+ )
560
593
 
561
594
  return internal, external
562
595
 
596
+
597
+ def _call_expression_module_specifier(content_bytes: bytes, node: Any) -> str | None:
598
+ """Return the module specifier of a ``require('..')`` / ``import('..')`` call.
599
+
600
+ Returns ``None`` for any other call expression (including ``require(var)``
601
+ with a non-literal argument — only statically resolvable specifiers count).
602
+ """
603
+ func_node = node.child_by_field_name("function")
604
+ if func_node is None:
605
+ return None
606
+ callee = _node_text(content_bytes, func_node).strip()
607
+ # ``import(...)`` parses with an ``import`` callee; ``require(...)`` with an
608
+ # identifier callee. Accept both; reject everything else.
609
+ if callee != "require" and func_node.type != "import":
610
+ return None
611
+ args_node = node.child_by_field_name("arguments")
612
+ if args_node is None:
613
+ return None
614
+ for child in getattr(args_node, "named_children", []):
615
+ if child.type in {"string", "template_string"}:
616
+ return _extract_string_literal(_node_text(content_bytes, child))
617
+ # A non-literal first argument (e.g. require(modName)) is not statically
618
+ # resolvable — stop at the first argument either way.
619
+ break
620
+ return None
621
+
563
622
  def _detect_python_code_patterns(mod: ModuleInfo, root: Any, content: str) -> None:
564
623
  content_bytes = content.encode("utf-8", errors="ignore")
565
624
  routes: list[str] = []
@@ -624,9 +683,14 @@ def _detect_typescript_code_patterns(mod: ModuleInfo, root: Any, content: str) -
624
683
  if orm_models:
625
684
  mod.patterns["db_models"] = f"ORM models: {', '.join(sorted(set(orm_models)))}"
626
685
 
686
+ # Strip /* block */ (incl. JSDoc) and // line comments BEFORE pulling route
687
+ # path strings: framework docs embed example routes such as
688
+ # ``app.get('/user/:uid/photos/:file', ...)`` inside @example JSDoc blocks
689
+ # (e.g. express/lib/response.js), which would otherwise register as real
690
+ # endpoints (false positives).
627
691
  route_matches = re.findall(
628
692
  r'(?:app|router)\.(?:get|post|put|delete|patch)\s*\(\s*["\']([^"\']+)["\']',
629
- content,
693
+ _strip_js_comments(content),
630
694
  )
631
695
  if route_matches:
632
696
  mod.patterns["api_routes"] = f"HTTP route handlers: {', '.join(sorted(set(route_matches)))}"
@@ -4,10 +4,10 @@ codd_required_version: null
4
4
  codd_required_version_strict: false
5
5
 
6
6
  project:
7
- name: "{{project_name}}"
8
- language: "{{language}}"
9
- frameworks: []
10
-
7
+ name: "{{project_name}}"
8
+ language: "{{language}}"
9
+ frameworks: []
10
+
11
11
  ai_command: "claude --print --permission-mode bypassPermissions --dangerously-skip-permissions --model claude-opus-4-8 --effort max --tools \"\""
12
12
 
13
13
  # codex_app_server:
@@ -46,27 +46,27 @@ coding_principles: null
46
46
  scan:
47
47
  source_dirs:
48
48
  {{source_dirs}}
49
- test_dirs:
50
- - "tests/"
51
- doc_dirs:
52
- - "docs/"
53
- config_files: []
54
- exclude:
55
- - "**/node_modules/**"
56
- - "**/__pycache__/**"
57
- - "**/dist/**"
58
-
59
- graph:
60
- store: "jsonl"
61
- path: "{{graph_path}}"
62
-
63
- bands:
64
- green:
65
- min_confidence: 0.90
66
- min_evidence_count: 2
67
- amber:
68
- min_confidence: 0.50
69
-
49
+ test_dirs:
50
+ {{test_dirs}}
51
+ doc_dirs:
52
+ {{doc_dirs}}
53
+ config_files: []
54
+ exclude:
55
+ - "**/node_modules/**"
56
+ - "**/__pycache__/**"
57
+ - "**/dist/**"
58
+
59
+ graph:
60
+ store: "jsonl"
61
+ path: "{{graph_path}}"
62
+
63
+ bands:
64
+ green:
65
+ min_confidence: 0.90
66
+ min_evidence_count: 2
67
+ amber:
68
+ min_confidence: 0.50
69
+
70
70
  propagation:
71
71
  max_depth: 10
72
72
  stop_at_contract_boundary: true
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "codd-dev"
7
- version = "3.7.1"
7
+ version = "3.7.2"
8
8
  description = "CoDD: Coherence-Driven Development — cross-artifact change impact analysis"
9
9
  readme = "README.md"
10
10
  license = "MIT"