codd-dev 3.7.5__tar.gz → 3.7.6__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 (637) hide show
  1. {codd_dev-3.7.5 → codd_dev-3.7.6}/PKG-INFO +1 -1
  2. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/__init__.py +1 -1
  3. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/cli.py +5 -3
  4. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/builder.py +340 -49
  5. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/extractor.py +30 -7
  6. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/extractor.py +103 -27
  7. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/_shared.py +77 -0
  8. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/regex_strategies.py +38 -31
  9. {codd_dev-3.7.5 → codd_dev-3.7.6}/pyproject.toml +1 -1
  10. {codd_dev-3.7.5 → codd_dev-3.7.6}/.gitignore +0 -0
  11. {codd_dev-3.7.5 → codd_dev-3.7.6}/LICENSE +0 -0
  12. {codd_dev-3.7.5 → codd_dev-3.7.6}/README.md +0 -0
  13. {codd_dev-3.7.5 → codd_dev-3.7.6}/bench_fixture/README.md +0 -0
  14. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/__main__.py +0 -0
  15. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/_git_helper.py +0 -0
  16. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/action_outcome.py +0 -0
  17. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/ai_invoke.py +0 -0
  18. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/ai_patch.py +0 -0
  19. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/artifact_contract.py +0 -0
  20. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/artifact_ids.py +0 -0
  21. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/artifacts/catalog.yaml +0 -0
  22. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/ask_user_question_adapter.py +0 -0
  23. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/assembler.py +0 -0
  24. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/bridge.py +0 -0
  25. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/brownfield/__init__.py +0 -0
  26. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/brownfield/pipeline.py +0 -0
  27. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/capability_completeness.py +0 -0
  28. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/claude_cli.py +0 -0
  29. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/clustering.py +0 -0
  30. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/coherence_adapters.py +0 -0
  31. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/coherence_engine.py +0 -0
  32. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/confidence.py +0 -0
  33. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/config.py +0 -0
  34. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/config_schema.py +0 -0
  35. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts.py +0 -0
  36. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts_registry/__init__.py +0 -0
  37. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts_registry/__main__.py +0 -0
  38. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts_registry/certify.py +0 -0
  39. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts_registry/generate_matrix.py +0 -0
  40. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts_registry/registry.py +0 -0
  41. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/coverage_auditor.py +0 -0
  42. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/coverage_execution_coherence.py +0 -0
  43. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/coverage_metrics.py +0 -0
  44. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/__init__.py +0 -0
  45. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/auto_repair.py +0 -0
  46. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/__init__.py +0 -0
  47. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/_one_to_many_detection.py +0 -0
  48. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/artifact_contract_check.py +0 -0
  49. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/cardinality_coverage.py +0 -0
  50. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/ci_health.py +0 -0
  51. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/dependency_freshness.py +0 -0
  52. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/depends_on_consistency.py +0 -0
  53. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/deployment_completeness.py +0 -0
  54. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/edge_validity.py +0 -0
  55. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/environment_coverage.py +0 -0
  56. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/extraction_diagnostics.py +0 -0
  57. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/implementation_coverage.py +0 -0
  58. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/negative_space.py +0 -0
  59. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/node_completeness.py +0 -0
  60. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/opt_out.py +0 -0
  61. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/resource_flow_coherence.py +0 -0
  62. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/semantic_contract_conflict.py +0 -0
  63. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/stale_evidence.py +0 -0
  64. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/task_completion.py +0 -0
  65. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/transitive_closure.py +0 -0
  66. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/ui_coherence.py +0 -0
  67. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/user_journey_coherence.py +0 -0
  68. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/coverage_axes.py +0 -0
  69. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/cli.yaml +0 -0
  70. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/cpp_embedded.yaml +0 -0
  71. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/csharp.yaml +0 -0
  72. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/elixir.yaml +0 -0
  73. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/generic.yaml +0 -0
  74. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/iot.yaml +0 -0
  75. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/java.yaml +0 -0
  76. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/kotlin.yaml +0 -0
  77. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/mobile.yaml +0 -0
  78. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/ruby.yaml +0 -0
  79. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/rust.yaml +0 -0
  80. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/scala.yaml +0 -0
  81. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/swift.yaml +0 -0
  82. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/test_frameworks.yaml +0 -0
  83. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/web.yaml +0 -0
  84. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/extractor.py +0 -0
  85. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/impact.py +0 -0
  86. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/materiality.py +0 -0
  87. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/metadata_access.py +0 -0
  88. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/result_status.py +0 -0
  89. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/runner.py +0 -0
  90. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/defaults.py +0 -0
  91. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/defaults.yaml +0 -0
  92. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dependency_lock_coherence.py +0 -0
  93. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deploy_targets/__init__.py +0 -0
  94. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deploy_targets/app_service.py +0 -0
  95. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deploy_targets/base.py +0 -0
  96. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deploy_targets/docker_compose.py +0 -0
  97. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployer.py +0 -0
  98. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/__init__.py +0 -0
  99. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/checks/__init__.py +0 -0
  100. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/defaults/deploy_targets.yaml +0 -0
  101. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
  102. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/defaults/schema_providers.yaml +0 -0
  103. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/defaults/verification_templates.yaml +0 -0
  104. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/__init__.py +0 -0
  105. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/ai_command.py +0 -0
  106. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/ai_command_factory.py +0 -0
  107. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/codex_app_server.py +0 -0
  108. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/llm_consideration.py +0 -0
  109. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/schema/__init__.py +0 -0
  110. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/schema/prisma.py +0 -0
  111. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/target/__init__.py +0 -0
  112. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/target/docker_compose.py +0 -0
  113. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/__init__.py +0 -0
  114. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
  115. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/cdp_browser.py +0 -0
  116. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/cdp_engines.py +0 -0
  117. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
  118. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/cdp_wire.py +0 -0
  119. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/curl.py +0 -0
  120. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/form_strategies.py +0 -0
  121. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/means_catalog.py +0 -0
  122. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/playwright.py +0 -0
  123. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/pytest_http.py +0 -0
  124. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/vitest.py +0 -0
  125. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/design_md.py +0 -0
  126. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/diff/__init__.py +0 -0
  127. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/diff/apply.py +0 -0
  128. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/diff/engine.py +0 -0
  129. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/diff/persistence.py +0 -0
  130. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/diff/templates/diff_prompt.md +0 -0
  131. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/discovery.py +0 -0
  132. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/drift.py +0 -0
  133. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/e2e_contract_coherence.py +0 -0
  134. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/e2e_extractor.py +0 -0
  135. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/e2e_generator.py +0 -0
  136. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/e2e_harness.py +0 -0
  137. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/e2e_runner.py +0 -0
  138. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/__init__.py +0 -0
  139. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/apply.py +0 -0
  140. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/engine.py +0 -0
  141. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/finding.py +0 -0
  142. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/formatters/__init__.py +0 -0
  143. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/formatters/base.py +0 -0
  144. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/formatters/interactive.py +0 -0
  145. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/formatters/json_fmt.py +0 -0
  146. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/formatters/md.py +0 -0
  147. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/gap_to_ask.py +0 -0
  148. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/lexicon_loader.py +0 -0
  149. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/persistence.py +0 -0
  150. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/promote.py +0 -0
  151. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/routing.py +0 -0
  152. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
  153. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/env_refs.py +0 -0
  154. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/extract_ai.py +0 -0
  155. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/extract_paths.py +0 -0
  156. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/__init__.py +0 -0
  157. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/candidate_selector.py +0 -0
  158. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/design_updater.py +0 -0
  159. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/impact_planner.py +0 -0
  160. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/impl_propagation.py +0 -0
  161. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/interactive_prompt.py +0 -0
  162. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/phenomenon_fixer.py +0 -0
  163. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/phenomenon_parser.py +0 -0
  164. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/risk_classifier.py +0 -0
  165. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates/clarification_question.txt +0 -0
  166. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates/design_update.txt +0 -0
  167. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates/impl_update.txt +0 -0
  168. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates/phenomenon_parse.txt +0 -0
  169. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates/risk_assessment.txt +0 -0
  170. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates_loader.py +0 -0
  171. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixer.py +0 -0
  172. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixup_drift.py +0 -0
  173. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixup_drift_strategies/__init__.py +0 -0
  174. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
  175. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
  176. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixup_drift_strategies/url_drift.py +0 -0
  177. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/frontmatter.py +0 -0
  178. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/generator.py +0 -0
  179. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/git_evidence.py +0 -0
  180. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/graph.py +0 -0
  181. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/greenfield/__init__.py +0 -0
  182. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/greenfield/pipeline.py +0 -0
  183. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hitl_session.py +0 -0
  184. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/__init__.py +0 -0
  185. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/pre-commit +0 -0
  186. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
  187. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/recipes/claude_settings_example.json +0 -0
  188. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/recipes/codex_hook.sh +0 -0
  189. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/recipes/git_post_commit.sh +0 -0
  190. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/recipes/git_pre_commit.sh +0 -0
  191. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/iac_nfr.py +0 -0
  192. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implement_oracle.py +0 -0
  193. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implement_oracle_scope.py +0 -0
  194. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implement_oracle_types.py +0 -0
  195. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implementer/__init__.py +0 -0
  196. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implementer/chunked_runner.py +0 -0
  197. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implementer/typecheck_loop.py +0 -0
  198. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implementer.py +0 -0
  199. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/import_coherence.py +0 -0
  200. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/inheritance.py +0 -0
  201. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/init/__init__.py +0 -0
  202. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/init/lexicon_suggest.py +0 -0
  203. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/init/llm_lexicon_suggester.py +0 -0
  204. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/init/stack_detector.py +0 -0
  205. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/knowledge_fetcher.py +0 -0
  206. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/__init__.py +0 -0
  207. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/__init__.py +0 -0
  208. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/implement_oracle.py +0 -0
  209. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/oracle_go.py +0 -0
  210. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/oracle_python.py +0 -0
  211. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/oracle_typescript.py +0 -0
  212. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/runner_report.py +0 -0
  213. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/builtin_adapters.py +0 -0
  214. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/compat.py +0 -0
  215. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/contract.py +0 -0
  216. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/loader.py +0 -0
  217. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/oracle_executor.py +0 -0
  218. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/path_planner.py +0 -0
  219. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/profile.py +0 -0
  220. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/profiles/go.yaml +0 -0
  221. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/profiles/python.yaml +0 -0
  222. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/profiles/typescript.yaml +0 -0
  223. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/registry.py +0 -0
  224. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/verify_executor.py +0 -0
  225. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/verify_plan.py +0 -0
  226. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon.py +0 -0
  227. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/__init__.py +0 -0
  228. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/formatters/__init__.py +0 -0
  229. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/formatters/html.py +0 -0
  230. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
  231. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/formatters/md.py +0 -0
  232. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/inspector.py +0 -0
  233. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/manager.py +0 -0
  234. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/reporter.py +0 -0
  235. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/threshold.py +0 -0
  236. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/__init__.py +0 -0
  237. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/approval.py +0 -0
  238. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/best_practice_augmenter.py +0 -0
  239. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/criteria_expander.py +0 -0
  240. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/design_doc_extractor.py +0 -0
  241. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/impl_step_deriver.py +0 -0
  242. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/means_catalog_loader.py +0 -0
  243. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/parser.py +0 -0
  244. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/plan_deriver.py +0 -0
  245. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/prompt_builder.py +0 -0
  246. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/strategy_validator.py +0 -0
  247. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/best_practice_augment_meta.md +0 -0
  248. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/criteria_expand_meta.md +0 -0
  249. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/design_doc_extract_meta.md +0 -0
  250. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/impl_step_derive_meta.md +0 -0
  251. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
  252. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/meta_instruction.md +0 -0
  253. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/plan_derive_meta.md +0 -0
  254. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/verification_means_catalog.yaml +0 -0
  255. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/mcp_server.py +0 -0
  256. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/measure.py +0 -0
  257. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/operational_e2e_audit.py +0 -0
  258. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/operations_derive.py +0 -0
  259. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/__init__.py +0 -0
  260. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/api_specs.py +0 -0
  261. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/extractor_registry.py +0 -0
  262. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/filesystem_routes.py +0 -0
  263. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/iac.py +0 -0
  264. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/python_ast.py +0 -0
  265. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/schemas.py +0 -0
  266. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/tests_builddeps.py +0 -0
  267. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/treesitter.py +0 -0
  268. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/path_safety.py +0 -0
  269. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/planner.py +0 -0
  270. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/policy.py +0 -0
  271. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/__init__.py +0 -0
  272. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/defaults/cli.yaml +0 -0
  273. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/defaults/generic.yaml +0 -0
  274. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/defaults/iot.yaml +0 -0
  275. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/defaults/mobile.yaml +0 -0
  276. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/defaults/web.yaml +0 -0
  277. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/project_types.py +0 -0
  278. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/propagate.py +0 -0
  279. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/propagation_common.py +0 -0
  280. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/propagator.py +0 -0
  281. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/reconciliation_ledger.py +0 -0
  282. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/reference_resolution.py +0 -0
  283. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/registry.py +0 -0
  284. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/__init__.py +0 -0
  285. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/approval_repair.py +0 -0
  286. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/auto_scope_guard.py +0 -0
  287. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/engine.py +0 -0
  288. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/git_patcher.py +0 -0
  289. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/history.py +0 -0
  290. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/llm_repair_engine.py +0 -0
  291. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/loop.py +0 -0
  292. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/primary_picker.py +0 -0
  293. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/proof_breaks.py +0 -0
  294. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/repair_result.py +0 -0
  295. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/repairability_classifier.py +0 -0
  296. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/schema.py +0 -0
  297. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/templates/analyze_meta.md +0 -0
  298. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/templates/propose_meta.md +0 -0
  299. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/templates/repair_strategy_meta.md +0 -0
  300. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/templates/repairability_meta.md +0 -0
  301. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/test_failure_attribution.py +0 -0
  302. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/verify_runner.py +0 -0
  303. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair_slice.py +0 -0
  304. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/require.py +0 -0
  305. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/require_plugins.py +0 -0
  306. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/require_propagate.py +0 -0
  307. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts/defaults/cli.yaml +0 -0
  308. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts/defaults/generic.yaml +0 -0
  309. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts/defaults/iot.yaml +0 -0
  310. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts/defaults/mobile.yaml +0 -0
  311. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts/defaults/web.yaml +0 -0
  312. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts_deriver.py +0 -0
  313. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness/defaults/cli.yaml +0 -0
  314. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness/defaults/generic.yaml +0 -0
  315. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness/defaults/iot.yaml +0 -0
  316. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
  317. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness/defaults/web.yaml +0 -0
  318. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness_auditor.py +0 -0
  319. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_reconciliation.py +0 -0
  320. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirements_meta.py +0 -0
  321. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/restoration_report.py +0 -0
  322. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/restore.py +0 -0
  323. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/routes_extractor.py +0 -0
  324. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/runtime_smoke/__init__.py +0 -0
  325. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/runtime_smoke/checks.py +0 -0
  326. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/runtime_smoke/config.py +0 -0
  327. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/runtime_smoke/report.py +0 -0
  328. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/runtime_smoke/runner.py +0 -0
  329. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/scanner.py +0 -0
  330. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/schema_refs.py +0 -0
  331. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/screen_flow_validator.py +0 -0
  332. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/screen_transition_extractor.py +0 -0
  333. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/screen_transitions/defaults.yaml +0 -0
  334. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/skills_cli/__init__.py +0 -0
  335. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/skills_cli/discovery.py +0 -0
  336. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/skills_cli/manager.py +0 -0
  337. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/skills_cli/paths.py +0 -0
  338. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/__init__.py +0 -0
  339. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/adapters/__init__.py +0 -0
  340. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/adapters/_base.py +0 -0
  341. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/adapters/nextjs.py +0 -0
  342. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/adapters/playwright.py +0 -0
  343. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/adapters/prisma.py +0 -0
  344. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/command_authenticity.py +0 -0
  345. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/command_override.py +0 -0
  346. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/command_plan.py +0 -0
  347. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/compose.py +0 -0
  348. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/loader.py +0 -0
  349. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/lock.py +0 -0
  350. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/obligations.py +0 -0
  351. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/profile.py +0 -0
  352. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/profiles/addons/playwright.yaml +0 -0
  353. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/profiles/addons/prisma.yaml +0 -0
  354. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
  355. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/project.py +0 -0
  356. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/registry.py +0 -0
  357. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/replacement_proof.py +0 -0
  358. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/resolve.py +0 -0
  359. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/surface_reconciliation.py +0 -0
  360. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/synth.py +0 -0
  361. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/codd.yaml.tmpl +0 -0
  362. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/conventions.yaml.tmpl +0 -0
  363. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/data_dependencies.yaml.tmpl +0 -0
  364. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/doc_links.yaml.tmpl +0 -0
  365. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extract_ai_prompt_baseline.md +0 -0
  366. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extracted/api-contract.md.j2 +0 -0
  367. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
  368. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extracted/module-detail.md.j2 +0 -0
  369. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extracted/schema-design.md.j2 +0 -0
  370. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extracted/system-context.md.j2 +0 -0
  371. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/gitignore.tmpl +0 -0
  372. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/lexicon_questions.md +0 -0
  373. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/lexicon_schema.yaml +0 -0
  374. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/overrides.yaml.tmpl +0 -0
  375. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/test_detection.py +0 -0
  376. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/test_import_coherence.py +0 -0
  377. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/traceability.py +0 -0
  378. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/validator.py +0 -0
  379. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/vb_marker_authenticity.py +0 -0
  380. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/vb_rerun_scope.py +0 -0
  381. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/verifiable_behavior_audit.py +0 -0
  382. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/__init__.py +0 -0
  383. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/events.py +0 -0
  384. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/propagation_log.py +0 -0
  385. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/propagation_pipeline.py +0 -0
  386. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/test_runner.py +0 -0
  387. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/watcher.py +0 -0
  388. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/wiring.py +0 -0
  389. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
  390. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
  391. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
  392. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
  393. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
  394. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
  395. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
  396. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
  397. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
  398. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
  399. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
  400. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
  401. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
  402. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
  403. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
  404. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
  405. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
  406. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
  407. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
  408. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
  409. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
  410. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
  411. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
  412. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
  413. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
  414. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
  415. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
  416. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
  417. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
  418. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
  419. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
  420. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
  421. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
  422. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
  423. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
  424. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
  425. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
  426. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
  427. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
  428. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
  429. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
  430. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
  431. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
  432. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
  433. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
  434. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
  435. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
  436. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
  437. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
  438. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
  439. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
  440. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
  441. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
  442. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
  443. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
  444. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
  445. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
  446. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
  447. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
  448. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
  449. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
  450. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
  451. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
  452. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
  453. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
  454. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
  455. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
  456. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
  457. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
  458. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
  459. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
  460. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
  461. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
  462. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
  463. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
  464. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
  465. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
  466. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
  467. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
  468. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
  469. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
  470. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
  471. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
  472. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
  473. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
  474. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
  475. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
  476. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
  477. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
  478. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
  479. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
  480. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
  481. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
  482. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
  483. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
  484. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
  485. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
  486. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
  487. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
  488. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
  489. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
  490. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
  491. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
  492. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
  493. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
  494. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
  495. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
  496. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
  497. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
  498. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
  499. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
  500. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
  501. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
  502. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
  503. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
  504. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
  505. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
  506. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
  507. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
  508. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
  509. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
  510. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
  511. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
  512. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
  513. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
  514. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
  515. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
  516. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
  517. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
  518. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
  519. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
  520. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
  521. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
  522. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
  523. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
  524. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
  525. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
  526. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
  527. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
  528. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
  529. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
  530. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
  531. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
  532. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
  533. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
  534. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
  535. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
  536. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
  537. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
  538. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
  539. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
  540. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
  541. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
  542. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
  543. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
  544. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
  545. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
  546. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
  547. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
  548. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
  549. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
  550. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
  551. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
  552. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
  553. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
  554. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
  555. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
  556. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
  557. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
  558. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
  559. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
  560. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
  561. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
  562. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
  563. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
  564. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
  565. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
  566. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
  567. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
  568. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
  569. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
  570. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
  571. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
  572. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
  573. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
  574. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
  575. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
  576. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
  577. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
  578. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
  579. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
  580. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
  581. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
  582. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
  583. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
  584. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
  585. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
  586. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
  587. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
  588. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
  589. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
  590. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
  591. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
  592. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
  593. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
  594. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
  595. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
  596. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
  597. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
  598. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
  599. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
  600. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
  601. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
  602. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
  603. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
  604. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
  605. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
  606. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
  607. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
  608. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
  609. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
  610. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
  611. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
  612. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
  613. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
  614. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
  615. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
  616. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
  617. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
  618. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
  619. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
  620. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
  621. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
  622. {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/stack_map.yaml +0 -0
  623. {codd_dev-3.7.5 → codd_dev-3.7.6}/docs/cookbook/cdp_browser/README.md +0 -0
  624. {codd_dev-3.7.5 → codd_dev-3.7.6}/docs/cookbook/presentation_aggregation/README.md +0 -0
  625. {codd_dev-3.7.5 → codd_dev-3.7.6}/docs/requirements/README.md +0 -0
  626. {codd_dev-3.7.5 → codd_dev-3.7.6}/examples/README.md +0 -0
  627. {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-assemble/SKILL.md +0 -0
  628. {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-evolve/SKILL.md +0 -0
  629. {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-generate/SKILL.md +0 -0
  630. {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-greenfield/SKILL.md +0 -0
  631. {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-impact/SKILL.md +0 -0
  632. {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-init/SKILL.md +0 -0
  633. {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-propagate/SKILL.md +0 -0
  634. {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-restore/SKILL.md +0 -0
  635. {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-scan/SKILL.md +0 -0
  636. {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-validate/SKILL.md +0 -0
  637. {codd_dev-3.7.5 → codd_dev-3.7.6}/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.5
3
+ Version: 3.7.6
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.5"
3
+ __version__ = "3.7.6"
@@ -816,12 +816,14 @@ def check_cmd(project_path: str, run_full: bool, apply_fixes: bool, output_forma
816
816
  else:
817
817
  _line(" PASS — no warnings")
818
818
 
819
- # --- vb declarations (gate) -------------------------------------------
819
+ # --- verifiable-behavior declarations (gate) --------------------------
820
820
  # Incoherent verifiable-behavior declarations (same id, different meaning in
821
821
  # two docs) make 100% coverage structurally impossible — fail loudly. The
822
822
  # WARNING-severity case (a non-canonical doc with first-column VB rows) is
823
- # already surfaced as a doctor advisory above with migration guidance.
824
- _section("vb declarations")
823
+ # already surfaced as a doctor advisory above with migration guidance. The
824
+ # label spells out "verifiable-behavior" (the ``vb`` abbreviation read like
825
+ # Visual Basic — it is the V-Model verification boundary, not a language).
826
+ _section("verifiable-behavior declarations")
825
827
  try:
826
828
  vb_errors = _vb_declaration_issue_messages(project_root, load_project_config(project_root), severity="error")
827
829
  except (FileNotFoundError, ValueError) as exc:
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import json
6
6
  import logging
7
7
  import fnmatch
8
+ import os
8
9
  import re
9
10
  import warnings
10
11
  from copy import deepcopy
@@ -16,6 +17,7 @@ import yaml
16
17
 
17
18
  from codd.config import load_project_config
18
19
  from codd.discovery import scan_exclude_patterns as shared_scan_exclude_patterns
20
+ from codd.parsing._shared import cpp_include_candidate_paths, strip_bom
19
21
  from codd.path_safety import iter_project_glob, resolve_project_path
20
22
  from codd.dag import DAG, Edge, Node
21
23
  from codd.dag.coverage_axes import CoverageAxis, extract_coverage_axes_from_design_doc, extract_coverage_axes_from_lexicon
@@ -92,6 +94,8 @@ def build_dag(project_root: Path, settings: dict[str, Any] | None = None) -> DAG
92
94
  _add_deployment_graph(dag, root, design_docs, impl_nodes)
93
95
  _attach_coverage_axes(dag, root, dag_settings)
94
96
 
97
+ _warn_source_completeness(root, dag_settings, impl_nodes, test_nodes)
98
+
95
99
  write_dag_json(dag, root, default_dag_json_path(root))
96
100
  return dag
97
101
 
@@ -369,14 +373,148 @@ def _add_import_edges(
369
373
  aliases = _load_import_aliases(project_root, settings)
370
374
  path_to_node = {path: node_id for node_id, path in impl_nodes.items()}
371
375
 
376
+ residue: list[str] = []
372
377
  for node_id, file_path in impl_nodes.items():
373
378
  imports = dag.nodes[node_id].attributes.get("imports", [])
379
+ seen_targets: set[str] = set()
374
380
  for import_ref in imports:
381
+ resolved_any = False
375
382
  for target_id in _resolve_import_targets(
376
383
  import_ref, file_path, project_root, path_to_node, aliases
377
384
  ):
378
- if target_id and target_id != node_id:
379
- dag.add_edge(Edge(from_id=node_id, to_id=target_id, kind="imports"))
385
+ if not target_id or target_id == node_id:
386
+ continue
387
+ resolved_any = True
388
+ if target_id in seen_targets:
389
+ continue
390
+ seen_targets.add(target_id)
391
+ dag.add_edge(Edge(from_id=node_id, to_id=target_id, kind="imports"))
392
+ # GENERIC FIX 1: an INTERNAL-looking specifier (a relative import, or a
393
+ # first-party alias-prefixed one) that resolved to NOTHING is explicit
394
+ # "unresolved residue" — a discovery gap made VISIBLE (surfacing only).
395
+ if not resolved_any and _is_internal_looking_specifier(import_ref, aliases):
396
+ residue.append(f"{node_id}: {import_ref}")
397
+
398
+ _warn_unresolved_residue(residue)
399
+
400
+
401
+ #: JS/TS relative specifier shapes — unambiguously first-party (you cannot write a
402
+ #: relative import to an external package), so an unresolved one is a real gap.
403
+ def _is_internal_looking_specifier(import_ref: str, aliases: dict[str, list[str]]) -> bool:
404
+ """True for a specifier that can ONLY refer to in-tree code (GENERIC FIX 1).
405
+
406
+ Conservative on purpose: only RELATIVE imports (Python ``.b`` / ``..pkg``; JS
407
+ ``./x`` / ``../x``), C++ quote-form local includes, and configured first-party
408
+ ALIAS prefixes count. Absolute dotted/FQN specifiers (``os`` / ``org.junit.*``
409
+ / ``java.util.List``) are NOT flagged — they are usually stdlib/third-party, so
410
+ flagging them would drown the signal in false residue.
411
+ """
412
+ spec = import_ref.strip()
413
+ if not spec:
414
+ return False
415
+ if spec.startswith(_CPP_QUOTE_SPECIFIER):
416
+ return True
417
+ if spec.startswith(_CPP_ANGLE_SPECIFIER):
418
+ return False # system/STL — external by construction
419
+ if spec in (".", ".."):
420
+ return True
421
+ if spec.startswith("./") or spec.startswith("../"):
422
+ return True
423
+ if spec.startswith("."): # Python relative (``.b`` / ``..pkg.x``)
424
+ return True
425
+ # Configured first-party alias prefix (e.g. ``@app/…`` → src). The alias map is
426
+ # the project's own DATA declaration that these are first-party.
427
+ for alias_prefix in aliases:
428
+ if alias_prefix and (spec == alias_prefix or spec.startswith(alias_prefix + "/")):
429
+ return True
430
+ return False
431
+
432
+
433
+ def _warn_unresolved_residue(residue: list[str]) -> None:
434
+ """WARN (advisory) when internal-looking specifiers did not resolve."""
435
+ if not residue:
436
+ return
437
+ examples = ", ".join(sorted(residue)[:5])
438
+ warnings.warn(
439
+ f"discovery: {len(residue)} internal-looking import specifier(s) did not "
440
+ f"resolve to any in-tree node (unresolved residue) — e.g. {examples}. "
441
+ f"These are likely missing source files or an under-scoped source set.",
442
+ UserWarning,
443
+ stacklevel=2,
444
+ )
445
+
446
+
447
+ def _warn_source_completeness(
448
+ project_root: Path,
449
+ settings: dict[str, Any],
450
+ impl_nodes: dict[str, Path],
451
+ test_nodes: dict[str, Path],
452
+ ) -> None:
453
+ """WARN (advisory) when on-disk source files outnumber source nodes.
454
+
455
+ GENERIC FIX 1 — the convergence safety-net. The DAG's source-bearing nodes are
456
+ materialized from the configured ``source_dirs``/glob patterns; if MORE files
457
+ of the SAME implementation/test suffixes exist on disk (outside that scope)
458
+ they are silently inert — a discovery gap and a false-green risk. We surface
459
+ the gap (count + a few example missing files) so it becomes visible and the
460
+ operator can widen the scope. Surfacing only: never a fail-gate (that would be
461
+ new gating = owner-gated).
462
+ """
463
+ impl_suffixes = set(_suffix_tuple(settings.get("implementation_suffixes")) or LEGACY_IMPLEMENTATION_SUFFIXES)
464
+ test_suffixes = set(_suffix_tuple(settings.get("test_suffixes")) or LEGACY_TEST_SUFFIXES)
465
+ source_suffixes = impl_suffixes | test_suffixes
466
+ if not source_suffixes:
467
+ return
468
+
469
+ node_paths = {path.resolve() for path in (*impl_nodes.values(), *test_nodes.values())}
470
+ exclude_patterns = settings.get("scan_exclude_patterns")
471
+ project_root_resolved = project_root.resolve()
472
+
473
+ missing: list[str] = []
474
+ on_disk = 0
475
+ for file_path in _iter_on_disk_source_files(project_root_resolved, source_suffixes, exclude_patterns):
476
+ on_disk += 1
477
+ if file_path.resolve() not in node_paths:
478
+ if len(missing) < 10:
479
+ missing.append(_relative_id(file_path, project_root_resolved))
480
+
481
+ if on_disk > len(node_paths) and missing:
482
+ examples = ", ".join(missing[:5])
483
+ warnings.warn(
484
+ f"discovery: {on_disk} source file(s) on disk but only {len(node_paths)} "
485
+ f"source node(s) in the DAG — {len(missing)} file(s) are outside the "
486
+ f"configured source scope and will be inert (e.g. {examples}). Consider "
487
+ f"widening source_dirs / impl_file_patterns.",
488
+ UserWarning,
489
+ stacklevel=2,
490
+ )
491
+
492
+
493
+ def _iter_on_disk_source_files(
494
+ project_root: Path,
495
+ source_suffixes: set[str],
496
+ exclude_patterns: Any,
497
+ ):
498
+ """Yield on-disk files whose suffix is a source suffix (ignored dirs pruned)."""
499
+ from codd.discovery import DEFAULT_IGNORED_DIRS
500
+
501
+ excludes = [
502
+ str(pattern)
503
+ for pattern in _as_list(exclude_patterns)
504
+ if isinstance(pattern, str) and pattern.strip()
505
+ ]
506
+ for root, dirs, files in os.walk(project_root):
507
+ dirs[:] = [
508
+ d for d in dirs
509
+ if d not in DEFAULT_IGNORED_DIRS and d != "codd" and not d.startswith(".")
510
+ ]
511
+ for fname in files:
512
+ if Path(fname).suffix not in source_suffixes:
513
+ continue
514
+ file_path = Path(root) / fname
515
+ if excludes and _path_matches_any_pattern(file_path, project_root, excludes):
516
+ continue
517
+ yield file_path
380
518
 
381
519
 
382
520
  def _add_tested_by_edges(
@@ -956,7 +1094,7 @@ def _resolve_import_target(
956
1094
  # relative-to-file first, then via include roots; an angle-form include is
957
1095
  # system/STL and produces no edge.
958
1096
  if file_path.suffix in _CPP_SOURCE_SUFFIXES:
959
- for candidate in _cpp_include_candidates(import_ref, file_path, path_to_node):
1097
+ for candidate in _cpp_include_candidates(import_ref, file_path, project_root, path_to_node):
960
1098
  resolved = _resolve_file_candidate(candidate, path_to_node)
961
1099
  if resolved:
962
1100
  return resolved
@@ -1064,6 +1202,68 @@ def _java_source_roots(project_root: Path, path_to_node: dict[Path, str]) -> lis
1064
1202
  return ordered
1065
1203
 
1066
1204
 
1205
+ #: Java ``package`` declaration (mirrors ``regex_strategies._JAVA_PACKAGE_RE``),
1206
+ #: used to derive (source-root, fqn-prefix) pairs from the node file-set so a tree
1207
+ #: SCOPED INSIDE a package (``com/google/common`` as the project root) resolves
1208
+ #: without a double package prefix.
1209
+ _JAVA_PACKAGE_DECL_RE = re.compile(r"^\s*package\s+([\w.]+)\s*;", re.MULTILINE)
1210
+
1211
+
1212
+ def _java_root_prefix_pairs(
1213
+ project_root: Path, path_to_node: dict[Path, str]
1214
+ ) -> list[tuple[Path, tuple[str, ...]]]:
1215
+ """Derive ``(source_root, fqn_prefix)`` pairs for Java FQN→path resolution.
1216
+
1217
+ GENERIC FIX 2c. The source root is the directory under which a type's FQN
1218
+ resolves to ``<root>/<fqn-as-path>.java``. We infer it from DATA by matching
1219
+ each ``.java`` node's DECLARED package against its on-disk directory:
1220
+
1221
+ * Conventional ``src/main/java/com/a/A.java`` (package ``com.a``) → the dir's
1222
+ trailing ``com/a`` matches the package fully, so root = ``…/src/main/java``
1223
+ and prefix = ``()`` (the FQN resolves whole). [no behaviour change]
1224
+ * Scoped-INSIDE ``<root>/base/Preconditions.java`` (package
1225
+ ``com.google.common.base``) → only the trailing ``base`` matches the dir, so
1226
+ root = ``<root>`` and prefix = ``("com","google","common")``. An import of
1227
+ ``com.google.common.base.X`` then has its prefix stripped → ``base/X.java``
1228
+ under ``<root>`` (no double ``com/google/common`` prefix → edges form).
1229
+
1230
+ A non-empty prefix is the novel case; ``prefix == ()`` reproduces the existing
1231
+ root behaviour. Pairs are de-duplicated and ordered deepest-root-first so a
1232
+ conventional root still wins when several could match.
1233
+ """
1234
+ pairs: dict[tuple[str, tuple[str, ...]], tuple[Path, tuple[str, ...]]] = {}
1235
+ for file_path in path_to_node:
1236
+ if file_path.suffix != ".java":
1237
+ continue
1238
+ try:
1239
+ content = _read_source_text(file_path)
1240
+ except OSError:
1241
+ continue
1242
+ match = _JAVA_PACKAGE_DECL_RE.search(content)
1243
+ if not match:
1244
+ continue
1245
+ package_parts = tuple(part for part in match.group(1).split(".") if part)
1246
+ if not package_parts:
1247
+ continue
1248
+ dir_parts = file_path.parent.parts
1249
+ # Longest common SUFFIX between the file's on-disk dir and the package.
1250
+ k = 0
1251
+ while (
1252
+ k < len(package_parts)
1253
+ and k < len(dir_parts)
1254
+ and dir_parts[len(dir_parts) - 1 - k] == package_parts[len(package_parts) - 1 - k]
1255
+ ):
1256
+ k += 1
1257
+ root = Path(*dir_parts[: len(dir_parts) - k]) if k else file_path.parent
1258
+ prefix = package_parts[: len(package_parts) - k]
1259
+ pairs[(str(root), prefix)] = (root.resolve(), prefix)
1260
+ return sorted(
1261
+ pairs.values(),
1262
+ key=lambda item: (len(item[0].parts), len(item[1])),
1263
+ reverse=True,
1264
+ )
1265
+
1266
+
1067
1267
  def _find_segment_chain(parts: tuple[str, ...], chain: tuple[str, ...]) -> int | None:
1068
1268
  """Return the start index where ``chain`` appears contiguously in ``parts``."""
1069
1269
  if not chain:
@@ -1074,6 +1274,47 @@ def _find_segment_chain(parts: tuple[str, ...], chain: tuple[str, ...]) -> int |
1074
1274
  return None
1075
1275
 
1076
1276
 
1277
+ #: Process-lifetime cache of the COMBINED Java ``(source_root, fqn_prefix)`` pairs,
1278
+ #: keyed by the IDENTITY + size of ``path_to_node`` (guarded by ``len`` against
1279
+ #: id-reuse after GC) + the project root. ``_add_import_edges`` /
1280
+ #: ``_add_tested_by_edges`` build a fresh ``path_to_node`` and reuse it across every
1281
+ #: import in their loop, so deriving the pairs ONCE per DAG-build phase — instead of
1282
+ #: re-reading every ``.java`` file's package for EVERY import — turns an
1283
+ #: O(files × imports) blow-up (which made Guava-scale builds crawl) back into O(files).
1284
+ _JAVA_RESOLUTION_PAIRS_CACHE: dict[
1285
+ tuple[int, int, str], list[tuple[Path, tuple[str, ...]]]
1286
+ ] = {}
1287
+
1288
+
1289
+ def _java_resolution_pairs(
1290
+ project_root: Path, path_to_node: dict[Path, str]
1291
+ ) -> list[tuple[Path, tuple[str, ...]]]:
1292
+ """Combined, de-duplicated Java resolution pairs (built once per build, cached).
1293
+
1294
+ Prefix-bearing pairs (the scoped-inside fix) first, then the bare
1295
+ ``_java_source_roots`` (prefix == (), conventional layouts / default-package
1296
+ files), de-duplicated. Cached so the per-file package scan is paid once.
1297
+ """
1298
+ key = (id(path_to_node), len(path_to_node), str(project_root))
1299
+ cached = _JAVA_RESOLUTION_PAIRS_CACHE.get(key)
1300
+ if cached is not None:
1301
+ return cached
1302
+
1303
+ root_prefixes = _java_root_prefix_pairs(project_root, path_to_node)
1304
+ bare_roots = [(root, ()) for root in _java_source_roots(project_root, path_to_node)]
1305
+ seen_pairs: set[tuple[str, tuple[str, ...]]] = set()
1306
+ pairs: list[tuple[Path, tuple[str, ...]]] = []
1307
+ for root, prefix in [*root_prefixes, *bare_roots]:
1308
+ pair_key = (str(root), prefix)
1309
+ if pair_key in seen_pairs:
1310
+ continue
1311
+ seen_pairs.add(pair_key)
1312
+ pairs.append((root, prefix))
1313
+
1314
+ _JAVA_RESOLUTION_PAIRS_CACHE[key] = pairs
1315
+ return pairs
1316
+
1317
+
1077
1318
  def _java_import_candidates(
1078
1319
  import_ref: str,
1079
1320
  file_path: Path,
@@ -1095,16 +1336,30 @@ def _java_import_candidates(
1095
1336
 
1096
1337
  ``_resolve_file_candidate`` appends the real ``.java`` suffix once a directory
1097
1338
  candidate is produced, so package/wildcard dirs resolve to a sibling file.
1339
+
1340
+ GENERIC FIX 2c: resolution is rooted at ``(source_root, fqn_prefix)`` pairs
1341
+ derived from the file-set's package declarations, so a tree SCOPED INSIDE a
1342
+ package (``com/google/common`` as the root) resolves with its package prefix
1343
+ stripped (no double-prefix). The bare ``_java_source_roots`` (prefix == ()) is
1344
+ folded in as the fallback, preserving conventional-layout behaviour.
1098
1345
  """
1099
- roots = _java_source_roots(project_root, path_to_node)
1346
+ pairs = _java_resolution_pairs(project_root, path_to_node)
1100
1347
 
1101
1348
  if import_ref.startswith("package "):
1102
- package = import_ref[len("package "):].strip()
1103
- return _java_package_dir_candidates(package, roots)
1349
+ # PRECISION: a ``package`` line is a DECLARATION, not a written import.
1350
+ # Synthesizing an edge to every same-package sibling is imprecise (Java
1351
+ # needs no import for siblings, but not every sibling is referenced) AND
1352
+ # explosive — O(package_size²) edges per package, which on Guava-scale
1353
+ # repos produced >400k spurious edges. We emit only REAL import edges, so
1354
+ # a ``package`` line contributes none. (Same-package files reached only by
1355
+ # an implicit reference rely on the reachability layer's roots, not a
1356
+ # fabricated import edge.) The package declaration is still READ — by
1357
+ # ``_java_root_prefix_pairs`` — to derive source roots.
1358
+ return []
1104
1359
 
1105
1360
  if import_ref.endswith(".*"):
1106
1361
  package = import_ref[:-2].strip()
1107
- return _java_package_dir_candidates(package, roots)
1362
+ return _java_package_dir_candidates(package, pairs)
1108
1363
 
1109
1364
  fqn = import_ref
1110
1365
  if fqn.startswith("static "):
@@ -1114,19 +1369,49 @@ def _java_import_candidates(
1114
1369
  if len(parts) >= 2:
1115
1370
  fqn = ".".join(parts[:-1])
1116
1371
 
1117
- parts = [part for part in fqn.split(".") if part]
1372
+ parts = tuple(part for part in fqn.split(".") if part)
1118
1373
  if not parts:
1119
1374
  return []
1120
- return [(root / Path(*parts)).resolve() for root in roots]
1375
+ candidates: list[Path] = []
1376
+ for root, prefix in pairs:
1377
+ remainder = _strip_fqn_prefix(parts, prefix)
1378
+ if remainder is None:
1379
+ continue
1380
+ candidates.append((root / Path(*remainder)).resolve())
1381
+ return candidates
1121
1382
 
1122
1383
 
1123
- def _java_package_dir_candidates(package: str, roots: list[Path]) -> list[Path]:
1124
- parts = [part for part in package.split(".") if part]
1384
+ def _strip_fqn_prefix(
1385
+ parts: tuple[str, ...], prefix: tuple[str, ...]
1386
+ ) -> tuple[str, ...] | None:
1387
+ """Strip ``prefix`` from the front of ``parts`` (the FQN), or ``None``.
1388
+
1389
+ ``prefix == ()`` returns ``parts`` unchanged (conventional root). A non-empty
1390
+ prefix returns the remainder only when ``parts`` actually starts with it (so a
1391
+ scoped-inside root contributes a candidate only for FQNs in its package);
1392
+ otherwise ``None`` (this pair does not apply → no spurious candidate).
1393
+ """
1394
+ if not prefix:
1395
+ return parts
1396
+ if parts[: len(prefix)] == prefix and len(parts) > len(prefix):
1397
+ return parts[len(prefix):]
1398
+ return None
1399
+
1400
+
1401
+ def _java_package_dir_candidates(
1402
+ package: str, pairs: list[tuple[Path, tuple[str, ...]]]
1403
+ ) -> list[Path]:
1404
+ parts = tuple(part for part in package.split(".") if part)
1125
1405
  if not parts:
1126
1406
  return []
1127
1407
  candidates: list[Path] = []
1128
- for root in roots:
1129
- package_dir = (root / Path(*parts)).resolve()
1408
+ for root, prefix in pairs:
1409
+ # Strip the root's package prefix (scoped-inside) before mapping the
1410
+ # package to a directory; ``prefix == ()`` is the conventional case.
1411
+ remainder = _strip_package_prefix(parts, prefix)
1412
+ if remainder is None:
1413
+ continue
1414
+ package_dir = (root / Path(*remainder)).resolve() if remainder else root.resolve()
1130
1415
  # List the package dir's in-tree files as candidates (same-package /
1131
1416
  # wildcard linkage). ``_resolve_file_candidate`` matches exact node paths,
1132
1417
  # so we hand it each existing ``.java`` file directly.
@@ -1135,6 +1420,22 @@ def _java_package_dir_candidates(package: str, roots: list[Path]) -> list[Path]:
1135
1420
  return candidates
1136
1421
 
1137
1422
 
1423
+ def _strip_package_prefix(
1424
+ parts: tuple[str, ...], prefix: tuple[str, ...]
1425
+ ) -> tuple[str, ...] | None:
1426
+ """Strip ``prefix`` from a PACKAGE path (like :func:`_strip_fqn_prefix`).
1427
+
1428
+ Differs only in allowing an EXACT match (package == prefix → ``()``), because
1429
+ a ``package com.google.common`` line under a root scoped at exactly that
1430
+ package legitimately refers to the root directory itself.
1431
+ """
1432
+ if not prefix:
1433
+ return parts
1434
+ if parts[: len(prefix)] == prefix:
1435
+ return parts[len(prefix):]
1436
+ return None
1437
+
1438
+
1138
1439
  def _sorted_java_dir_files(package_dir: Path) -> list[Path]:
1139
1440
  if not package_dir.is_dir():
1140
1441
  return []
@@ -1151,17 +1452,11 @@ def _sorted_java_dir_files(package_dir: Path) -> list[Path]:
1151
1452
  #: ``_SUFFIX_SPECIFIER_EXTRACTORS``.
1152
1453
  _CPP_SOURCE_SUFFIXES = frozenset({".h", ".hpp", ".hh", ".cc", ".cpp", ".cxx"})
1153
1454
 
1154
- #: Conventional C/C++ include-root directory names. A quote-form include such as
1155
- #: ``"fmt/core.h"`` that is not relative to the including file is probed under
1156
- #: these roots (``include`` covers fmt's ``include/fmt/*.h`` layout). Harvested
1157
- #: header-node parent dirs are added at resolution time so unconventional roots
1158
- #: still resolve from DATA.
1159
- _CPP_INCLUDE_ROOTS = ("include", "src", "inc")
1160
-
1161
1455
 
1162
1456
  def _cpp_include_candidates(
1163
1457
  import_ref: str,
1164
1458
  file_path: Path,
1459
+ project_root: Path,
1165
1460
  path_to_node: dict[Path, str],
1166
1461
  ) -> list[Path]:
1167
1462
  """Map a C++ ``#include`` specifier to filesystem candidates (PATH-based).
@@ -1194,30 +1489,14 @@ def _cpp_include_candidates(
1194
1489
  if not spec:
1195
1490
  return []
1196
1491
 
1197
- rel = Path(spec)
1198
- candidates: list[Path] = []
1199
- # 1. Relative to the including file's own directory (quote-form's primary
1200
- # rule ``#include "lib/b.h"`` next to ``a.cc``).
1201
- candidates.append((file_path.parent / rel).resolve())
1202
-
1203
- # 2. Conventional include roots discovered by walking up the including file's
1204
- # ancestors (so ``include/fmt/core.h`` resolves from ``src/format.cc``).
1205
- seen: set[Path] = set()
1206
- for ancestor in [file_path.parent, *file_path.parents]:
1207
- for root_name in _CPP_INCLUDE_ROOTS:
1208
- root = ancestor / root_name
1209
- key = root.resolve()
1210
- if key in seen:
1211
- continue
1212
- seen.add(key)
1213
- candidates.append((root / rel).resolve())
1214
-
1215
- # 3. Harvest header-node parent directories from the file-set (DATA), so an
1216
- # unconventional include root still resolves the trailing path segment(s).
1217
- for header_dir in _cpp_header_root_dirs(path_to_node):
1218
- candidates.append((header_dir / rel).resolve())
1219
-
1220
- return candidates
1492
+ # GENERIC FIX 3: ONE shared candidate generator (relative-to-file →
1493
+ # conventional roots → PROJECT ROOT → harvested header-node dirs). The
1494
+ # builder's data-source-specific augmentation (header-node parent dirs from
1495
+ # the node file-set, so an exotic include root still resolves) is passed as
1496
+ # ``extra_roots``. The scanner-CEG resolver calls the SAME generator, so the
1497
+ # two cannot drift (the LevelDB 59%-edge-loss class).
1498
+ extra_roots = tuple(_cpp_header_root_dirs(path_to_node))
1499
+ return cpp_include_candidate_paths(spec, file_path, project_root, extra_roots)
1221
1500
 
1222
1501
 
1223
1502
  def _cpp_header_root_dirs(path_to_node: dict[Path, str]) -> list[Path]:
@@ -1304,7 +1583,7 @@ def _csharp_namespace_index(path_to_node: dict[Path, str]) -> dict[str, list[str
1304
1583
  if file_path.suffix != ".cs":
1305
1584
  continue
1306
1585
  try:
1307
- content = file_path.read_text(encoding="utf-8", errors="ignore")
1586
+ content = _read_source_text(file_path)
1308
1587
  except OSError:
1309
1588
  continue
1310
1589
  for namespace in _CSHARP_NAMESPACE_DECL_RE.findall(content):
@@ -1397,6 +1676,18 @@ def _infer_test_targets(
1397
1676
  return targets
1398
1677
 
1399
1678
 
1679
+ def _read_source_text(file_path: Path) -> str:
1680
+ """Read a source file as text with a leading BOM stripped (GENERIC FIX 4).
1681
+
1682
+ Every builder-side parse of source TEXT (import-specifier extraction, the C#
1683
+ namespace reverse-index) goes through here so a UTF-8/UTF-16 BOM on line 1
1684
+ can never orphan a first-line declaration (``namespace``/``package``/a line-1
1685
+ ``import``). Generic — not a per-language branch.
1686
+ """
1687
+
1688
+ return strip_bom(file_path.read_text(encoding="utf-8", errors="ignore"))
1689
+
1690
+
1400
1691
  def _extract_python_import_specifiers(file_path: Path) -> list[str]:
1401
1692
  """Return raw Python import specifiers (relative dots preserved) via AST.
1402
1693
 
@@ -1411,7 +1702,7 @@ def _extract_python_import_specifiers(file_path: Path) -> list[str]:
1411
1702
 
1412
1703
  from codd.parsing import get_extractor
1413
1704
 
1414
- content = file_path.read_text(encoding="utf-8", errors="ignore")
1705
+ content = _read_source_text(file_path)
1415
1706
  return get_extractor("python", "source").extract_import_specifiers(content)
1416
1707
 
1417
1708
 
@@ -1441,7 +1732,7 @@ def _extract_java_import_specifiers(file_path: Path) -> list[str]:
1441
1732
 
1442
1733
  from codd.parsing import get_extractor
1443
1734
 
1444
- content = file_path.read_text(encoding="utf-8", errors="ignore")
1735
+ content = _read_source_text(file_path)
1445
1736
  specifiers = get_extractor("java", "source").extract_import_specifiers(content)
1446
1737
  if specifiers:
1447
1738
  return specifiers
@@ -1489,7 +1780,7 @@ def _extract_cpp_include_specifiers(file_path: Path) -> list[str]:
1489
1780
  no edge (analogous to Java ``java.*`` producing no edge).
1490
1781
  """
1491
1782
 
1492
- content = file_path.read_text(encoding="utf-8", errors="ignore")
1783
+ content = _read_source_text(file_path)
1493
1784
  specifiers: list[str] = []
1494
1785
  for quote_target, angle_target in _CPP_INCLUDE_RE.findall(content):
1495
1786
  if quote_target:
@@ -1531,7 +1822,7 @@ def _extract_csharp_import_specifiers(file_path: Path) -> list[str]:
1531
1822
  global / alias usings are surfaced as the bare imported namespace.
1532
1823
  """
1533
1824
 
1534
- content = file_path.read_text(encoding="utf-8", errors="ignore")
1825
+ content = _read_source_text(file_path)
1535
1826
  specifiers: list[str] = []
1536
1827
  for static_kw, namespace in _CSHARP_USING_RE.findall(content):
1537
1828
  if static_kw:
@@ -251,14 +251,31 @@ def extract_runtime_states(
251
251
  return [states[key] for key in sorted(states)]
252
252
 
253
253
 
254
+ #: Project types for which the criteria-driven ``runtime:db_seed:users`` WEB/DB
255
+ #: heuristic stays enabled WITHOUT an explicit declaration. ``web`` legitimately
256
+ #: has the users/login modality; ``generic`` carries no build markers (a script
257
+ #: app that might be web), so it keeps the legacy injection. Every OTHER detected
258
+ #: type is a typed non-web project by default (``cpp_embedded``/``java``/
259
+ #: ``csharp``/``rust``/… — Guava, Newtonsoft, LevelDB) and is gated OUT, so the web
260
+ #: heuristic is never synthesized into a non-web library. Generic — keyed on the
261
+ #: detected type (registry DATA), not a per-OSS special-case.
262
+ _DB_SEED_HEURISTIC_DEFAULT_TYPES = frozenset({"web", "generic"})
263
+
264
+
254
265
  def _db_seed_injection_allowed(project_root: Path, config: dict[str, Any]) -> bool:
255
266
  """Whether the criteria-driven ``runtime:db_seed:users`` node may be injected.
256
267
 
257
- Backward-compatible default: injection is ALLOWED unless the project
258
- EXPLICITLY declares a non-web/non-DB modality. Concretely, it is suppressed
259
- only when a ``project_type`` is configured AND its capabilities have no UI
260
- and ``network_surface == "none"`` (a pure CLI/library). A project with no
261
- declared type keeps the legacy injection. An explicit
268
+ The injection is a WEB/DB heuristic (assumes a users table + login). It is
269
+ ALLOWED when:
270
+
271
+ * a ``project_type`` is EXPLICITLY declared and is web-ish (has a UI or a
272
+ non-``none`` network surface); OR
273
+ * no type is declared but the DETECTED type is web-or-ambiguous (``web`` /
274
+ ``generic`` — see ``_DB_SEED_HEURISTIC_DEFAULT_TYPES``).
275
+
276
+ It is SUPPRESSED for any explicitly-declared non-web modality (pure CLI /
277
+ library) AND for any DETECTED typed non-web project (C++/Java/C#/Rust/… libs),
278
+ so the heuristic never pollutes a non-web codebase. An explicit
262
279
  ``deployment.infer_db_seed_from_criteria: true|false`` overrides either way.
263
280
  """
264
281
  deployment = config.get("deployment")
@@ -275,9 +292,15 @@ def _db_seed_injection_allowed(project_root: Path, config: dict[str, Any]) -> bo
275
292
  project = config.get("project")
276
293
  if isinstance(project, dict):
277
294
  configured = str(project.get("type") or "").strip().lower()
295
+
278
296
  if not configured:
279
- # No declared type → legacy behaviour (inject).
280
- return True
297
+ # No declared type → DETECT it from build markers and gate the WEB
298
+ # heuristic to web-or-ambiguous types (so a typed non-web lib is excluded
299
+ # even without an explicit declaration). This is the PRECISION fix.
300
+ from codd.dag.builder import _detect_project_type
301
+
302
+ detected = _detect_project_type(Path(project_root)).strip().lower()
303
+ return detected in _DB_SEED_HEURISTIC_DEFAULT_TYPES
281
304
 
282
305
  capabilities = _resolve_capabilities(project_root, config)
283
306
  web_ish = bool(